SQLBolt - Learn SQL - Introduction to SQL

多表查询

笛卡尔积

在数学中,两个集合 X 和 Y 的笛卡尓积 Cartesian product 又称直积,表示为 X × Y。假设集合 A={a, b},集合 B={0, 1, 2},则两个集合的笛卡尔积为 {(a, 0), (a, 1), (a, 2), (b, 0), (b, 1), (b, 2)}

在数据库中,如果直接查询俩张表,那么其查询结果就会产生笛卡尔积,例如

SELECT * FROM s_emp, s_dept;

笛卡尔连接 又称「交叉连接」CROSS JOIN

连接查询 JOIN

为了在多表查询中避免产生笛卡尔积,可以使用连接查询解决,连接查询分为:

等值连接,不等值连接,外、左外、右外、全连接,自连接

等值:利用一张表中某列的值和另一张表中某列的值相等的关系,把俩张表连接起来

SELECT last_name,dept_id,name
FROM s_emp,s_dept
WHERE s_emp.dept_id=s_dept.id;
// 别名
SELECT se.last_name,se.dept_id,sd.id,sd.name 
FROM s_emp se,s_dept sd
WHERE se.dept_id=sd.id;

不等值

工资等级表 salgrade: gradeName 列表示等级名称,losal 列表示这个级别的最低工资数,hisal 列表示这个级别的最高工资数

id  salgrade    losal hisal
1   初级职员      2000  4000
2   中级职员      4000  6000

SELECT e.last_name, e.title, e.salray, s.gradeName
FROM s_emp e, salgrade s
WHERE e.salray BETWEEN s.losal AND s.hisal;

外连接

假设先分别在 s_emp s_dept 表中插入新数据,此时再用等值连接,查询出来的数据就会缺失,因为新增的员工 tom 和部门表中的数据连接不上,当然新增的部门 st 也和员工表中的数据连接不上,那么这俩条数据都是在等值连接中查询不出来

INSERT INTO s_emp(id, last_name) values(26, 'alice');
INSERT INTO s_dept(id, name) values(60, 'st');