一、多表连接查询
多表连接查询是通过各个表之间共同列的关联性(例如:外键)来查询的。 多表连接查询的分类
- 内连接(INNER JOIN) ,可简写为 JOIN;
- 左外连接(LEFT OUTER JOIN),可简写为LEFT JOIN;
- 右外连接(RIGHT OUTER JOIN),可简写为RIGHT JOIN;
- 自连接查询;
- 交叉连接(CROSS JOIN)也称为 笛卡儿乘积连接,基本上用不到。
二、内连接
1、内连接
内连接使用比较运算符根据每个表的通用列中的值匹配两个表中的行。
SELECT 字段列表 FROM 表1 INNER JOIN 表2 ON 表1.通用字段名=表2.通用字段名
SELECT 字段列表 FROM 表1 ,表2 WHERE 表1.通用字段名=表2.通用字段名
2、内连接注意事项
如果两个表中有相同的字段名,必须在列名前加表名。否则将出现 错误代码:1052 Column ‘studentno’ in field list is ambiguous
查询学生的学号、姓名和成绩,并按照成绩降序排列
SELECT s.studentno,s.studentname,r.studentresult FROM
student AS s INNER JOIN result AS r
ON s.studentno=r.studentno ORDER BY r.studentresult DESC
SELECT s.studentno,s.studentname,r.studentresult FROM
student AS s,result AS r
WHERE s.studentno=r.studentno
ORDER BY r.studentresult DESC
3、多表内连接
SELECT 字段列表 FROM 表1 join 表2 on 表1.通用字段名=表2.通用字段名
join 表3 on 表1.通用字段名=表3.通用字段名
join 表4 on 表4.通用字段名=表3.通用字段名
;
三、自连接
自连接查询其实等同于连接查询,需要两张表,只不过它的左表(父表)和右表(子表)都是自己。做自连接查询的时候,是自己和自己连接,分别给父表和子表取两个不同的别名,然后附上连接条件。
SELECT c1.cname AS "父名称",c2.cname AS "子名称"
FROM tbl_category AS c1, tbl_category AS c2
WHERE c1.cid = c2.pid;
四、左外连接
左表(表1)的记录将会全部表示出来,而右表(表2)只会显示符合匹配条件的记录。
- 匹配,返回到结果集
- 无匹配,NULL值返回到结果集
SELECT 字段列表 FROM 表1 LEFT JOIN 表2 ON 表1.通用字段名=表2.通用字段名
五、右外连接
SELECT 字段列表 FROM 表1 RIGHT JOIN 表2
ON 表1.通用字段名=表2.通用字段名
右外连接:右表(表2)的记录将会全部表示出来,而左表(表1)只会显示符合匹配条件的记录。
- 匹配,返回到结果集
- 无匹配,NULL值返回到结果集
六、不同的SQL JOIN对比
操作符名称 | 描述 |
---|
INNER | JOIN 如果表中有至少一个匹配,则返回行 | LEFT JOIN | 不论右表是否有匹配,都会返回左表的所有行 | RIGHT JOIN | 不论左表是否有匹配,都会返回右表的所有行 |
|