文章目录
一、多表查询
多表查询分类:
- 等值连接 vs 非等值连接
- 自连接 vs 非自连接
- 内连接 vs 外连接
1.1 笛卡儿积(交叉连接)
在数据库原理里学过笛卡尔积,就是把两个表的所有记录做一个全排 ,例如:

会造成笛卡儿积的情况如下:
#查询员工姓名和所在部门名称
SELECT last_name,department_name FROM employees,departments;
SELECT last_name,department_name FROM employees CROSS JOIN departments;
SELECT last_name,department_name FROM employees INNER JOIN departments;
SELECT last_name,department_name FROM employees JOIN departments;
即:在不使用on语法时,join
、inner join
、逗号
、cross join
结果相同,都是取2个表的笛卡尔积。
解决方法:
使用JOIN...ON
子句创建连接限定条件,或者使用WHERE
过滤数据
1.2 等值连接 vs 非等值连接
-
等值连接就是
WHERE
语句最后是判断两个值是否相等 -
非等值连接就是
WHERE
语句不是严格的判断是否相等,可以是大于小于,或者IN
一个范围等等
例如:
SELECT e.employee_id, e.last_name, e.department_id,
d.department_id, d.location_id
FROM employees e , departments d
WHERE e.department_id = d.department_id; #等值连接
SELECT salary,grade_level
FROM employees e,job_grades j
WHERE salary BETWEEN j.`lowest_sal` AND j.`highest_sal` #非等值连接
1.3 自连接 vs 非自连接
-
非自连接就是连接两个不同的表
-
自连接就是把一张表看作两张表连接
题目:查询employees表,返回“Xxx works for Xxx”
SELECT CONCAT(worker.last_name ,' works for '
, manager.last_name)
FROM employees worker, employees manager
WHERE worker.manager_id = manager.employee_id ;
1.4 内连接 vs 外连接
1.4.1 内连接(INNER JOIN)
内连接就是求两个表严格相交的部分,只要有一方为NULL就把这条记录丢掉
关键字JOIN
、INNER JOIN
、CROSS JOIN
的含义是一样的,都是内连接
SELECT 字段列表
FROM A表 INNER JOIN B表
ON 关联条件
WHERE 等其他子句;
1.4.2 外连接(OUTTER JOIN)
外连接分为:左外连接,右外连接,全外连接
1.4.2.1 左外连接(LEFT OUTTER JOIN)
左外连接就是保证左表记录数量不减少,求相交的部分,如果没有相交的部分,就在左表对应右表的字段上置NULL
结果 = 左右表匹配的数据 + 左表没有匹配到的数据
SELECT 字段列表
FROM A表 LEFT JOIN B表
ON 关联条件
WH