INNER / LEFT / RIGHT / CROSS / FULL JOIN
INNER / LEFT / RIGHT / CROSS / FULL JOIN
通用测试表
-- 学生表
CREATE TABLE student (
SNO INT,
SNAME VARCHAR(10),
ICNO INT
);
-- 食堂IC卡表
CREATE TABLE IC (
ICNO INT,
ICNAME VARCHAR(10),
ICMoney INT
);
INSERT INTO student
SELECT 1, '张三', 1 UNION ALL
SELECT 2, '李四', 2 UNION ALL
SELECT 3, '王五', NULL;
INSERT INTO IC
SELECT 1, '张三', 500 UNION ALL
SELECT 2, '李四', 250 UNION ALL
SELECT 3, '赵老师', 600;
INNER JOIN
Oracle 、SQL Server、MySQL 基本上无差别,仅仅演示一种数据库结果:
(INNER 可省略)
mysql> SELECT
-> student.SNO,
-> student.SNAME,
-> IC.ICNAME,
-> IC.ICMoney
-> FROM
-> student
-> JOIN IC
-> ON (student.ICNO = IC.ICNO);
+------+-------+--------+---------+
| SNO | SNAME | ICNAME | ICMoney |
+------+-------+--------+---------+
| 1 | 张三 | 张三 | 500 |
| 2 | 李四 | 李四 | 250 |
+------+-------+--------+---------+
2 rows in set (0.00 sec)
LEFT OUTER JOIN
Oracle 、SQL Server、MySQL 基本上无差别,仅仅演示一种数据库结果:
(OUTER 可省略)
mysql> SELECT
-> student.SNO,
-> student.SNAME,
-> IC.ICNAME,
-> IC.ICMoney
-> FROM
-> student
-> LEFT JOIN IC
-> ON (student.ICNO = IC.ICNO);
+------+-------+--------+---------+
| SNO | SNAME | ICNAME | ICMoney |
+------+-------+--------+---------+
| 1 | 张三 | 张三 | 500 |
| 2 | 李四 | 李四 | 250 |
| 3 | 王五 | NULL | NULL |
+------+-------+--------+---------+
3 rows in set (0.00 sec)
RIGHT OUTER JOIN
Oracle 、SQL Server、MySQL 基本上无差别,仅仅演示一种数据库结果:
(OUTER 可省略)
mysql> SELECT
-> student.SNO,
-> student.SNAME,
-> IC.ICNAME,
-> IC.ICMoney
-> FROM
-> student
-> RIGHT JOIN IC
-> ON (student.ICNO = IC.ICNO);
+------+-------+--------+---------+
| SNO | SNAME | ICNAME | ICMoney |
+------+-------+--------+---------+
| 1 | 张三 | 张三 | 500 |
| 2 | 李四 | 李四 | 250 |
| NULL | NULL | 赵老师 | 600 |
+------+-------+--------+---------+
3 rows in set (0.00 sec)
CROSS JOIN
Oracle 、SQL Server、MySQL 基本上无差别,仅仅演示一种数据库结果:
mysql> SELECT
-> student.SNO,
-> student.SNAME,
-> IC.ICNAME,
-> IC.ICMoney
-> FROM
-> student
-> CROSS JOIN IC;
+------+-------+--------+---------+
| SNO | SNAME | ICNAME | ICMoney |
+------+-------+--------+---------+
| 1 | 张三 | 张三 | 500 |
| 2 | 李四 | 张三 | 500 |
| 3 | 王五 | 张三 | 500 |
| 1 | 张三 | 李四 | 250 |
| 2 | 李四 | 李四 | 250 |
| 3 | 王五 | 李四 | 250 |
| 1 | 张三 | 赵老师 | 600 |
| 2 | 李四 | 赵老师 | 600 |
| 3 | 王五 | 赵老师 | 600 |
+------+-------+--------+---------+
9 rows in set (0.08 sec)
FULL JOIN
Oracle / SQL Server 支持 Full JOIN
(OUTER 可省略)
1> SELECT
2> student.SNO,
3> student.SNAME,
4> IC.ICNAME,
5> IC.ICMoney
6> FROM
7> student
8> FULL JOIN IC
9> ON (student.ICNO = IC.ICNO);
10> go
SNO SNAME ICNAME ICMoney
----------- ---------- ---------- -----------
1 张三 张三 500
2 李四 李四 250
3 王五 NULL NULL
NULL NULL 赵老师 600
(4 行受影响)
MySQL 好像是不支持
mysql> SELECT
-> student.SNO,
-> student.SNAME,
-> IC.ICNAME,
-> IC.ICMoney
-> FROM
-> student
-> FULL JOIN IC
-> ON (student.ICNO = IC.ICNO);
ERROR 1054 (42S22): Unknown column 'student.SNO' in 'field list'
变通着,修改为
LEFT JOIN + UNION + RIGHT JOIN 的方式。
mysql> SELECT
-> student.SNO,
-> student.SNAME,
-> IC.ICNAME,
-> IC.ICMoney
-> FROM
-> student
-> LEFT JOIN IC
-> ON (student.ICNO = IC.ICNO)
-> UNION
-> SELECT
-> student.SNO,
-> student.SNAME,
-> IC.ICNAME,
-> IC.ICMoney
-> FROM
-> student
-> RIGHT JOIN IC
-> ON (student.ICNO = IC.ICNO);
+------+-------+--------+---------+
| SNO | SNAME | ICNAME | ICMoney |
+------+-------+--------+---------+
| 1 | 张三 | 张三 | 500 |
| 2 | 李四 | 李四 | 250 |
| 3 | 王五 | NULL | NULL |
| NULL | NULL | 赵老师 | 600 |
+------+-------+--------+---------+
4 rows in set (0.01 sec)
INNER JOIN LEFT JOIN RIGHT JOIN Sql
inner join on, left join on, right join on
1.inner join on 语法
FROM table1 INNER JOIN table2 ON table1 . field1 compopr table2 . field2
INNER JOIN 操作包含以下部分: 部分 说明 说明 可以在任何 FROM 子句中使用 INNER JOIN 操作。这是最常用的联接类型。只要两个表的公共字段上存在相匹配的值,Inner 联接就会组合这些表中的记录。 可以将 INNER JOIN 用于 Departments 及 Employees 表,以选择出每个部门的所有雇员。而要选择所有部分(即使某些部门中并没有被分配雇员)或者所有雇员(即使某些雇员没有分配到任何部门),则可以通过 LEFT JOIN 或者 RIGHT JOIN 操作来创建外部联接。 如果试图联接包含备注或 OLE 对象数据的字段,将发生错误。 可以联接任何两个相似类型的数字字段。例如,可以联接自动编号和长整型字段,因为它们均是相似类型。然而,不能联接单精度型和双精度型类型字段。 下例展示了如何通过 CategoryID 字段联接 Categories 和 Products 表:
SELECT CategoryName, ProductName
FROM Categories INNER JOIN Products ON Categories.CategoryID = Products.CategoryID;
在前面的示例中,CategoryID 是被联接字段,但是它不包含在查询输出中,因为它不包含在 SELECT 语句中。若要包含被联接字段,请在 SELECT 语句中包含该字段名,在本例中是指 Categories.CategoryID。 也可以在 JOIN 语句中链接多个 ON 子句,请使用如下语法:
SELECT fields
FROM table1 INNER JOIN table2 ON table1.field1 compopr table2.field1 AND ON table1.field2 compopr table2.field2) OR ON table1.field3 compopr table2.field3)];
也可以通过如下语法嵌套 JOIN 语句:
![]() SELECT fields
FROM table1 INNER JOIN (table2 INNER JOIN [( ]table3 [INNER JOIN [( ]tablex [INNER JOIN ...)] ON table3.field3 compopr tablex.fieldx)] ON table2.field2 compopr table3.field3) ON table1.field1 compopr table2.field2;
LEFT JOIN 或 RIGHT JOIN 可以嵌套在 INNER JOIN 之中,但是 INNER JOIN 不能嵌套于 LEFT JOIN 或 RIGHT JOIN 之中。
表A记录如下: 表B记录如下:
sql语句如下:
select * from A
left join B on A.aID = B.bID
结果如下: 结果说明: 2.right join select * from A
right join B on A.aID = B.bID
结果如下:
select * from A
innerjoin B on A.aID = B.bID
结果如下: 结果说明: |