按年代分类:
1、sql92标准:仅仅支持内连接
内连接
等值连接
非等值连接
自连接
2、sql99标准【推荐】:支持内连接+外连接(左外和右外)+交叉连接
按功能分类:
内连接
等值连接
非等值连接
自连接
外连接:
左外连接
右外连接
全外连接
交叉连接**

SQL92语法

等值连接

image.png
① 多表等值连接的结果为多表的交集部分
②n表连接,至少需要n-1个连接条件
③ 多表的顺序没有要求
④一般需要为表起别名
⑤可以搭配前面介绍的所有子句使用,比如排序、分组、筛选
为表起别名
/
①提高语句的简洁度
②区分多个重名的字段
注意:如果为表起了别名,则按照执行顺序,别名后查询的字段就不能使用原来的表 名 , 只能使用别名.
/
#案例1:查询员工名、工种号、工种名
SELECT e.last_name,j.job_id,j.job_title
FROM employees e,jobs j
WHERE e.job_id= j.job_id;
image.png
image.png
虽然没有要按照manager_id分组,但是还是前面select了manager_id,在group by 后也加上manager_id.
image.png
#案例:查询员工名、部门名和所在的城市,且城市是以s开头,按照部门名降序.
SELECT last_name,department_name,city
FROM employees e,departments d,locations l
WHERE e.department_id=d.department_id
AND d.location_id=l.location_id
AND city LIKE ‘s%’
ORDER BY department_name DESC;
https://www.bilibili.com/video/BV12b411K7Zu?p=281

非等值连接(不是等于关系):

案例1:查询员工的工资和工资级别
SELECT salary,grade
FROM employees e,sal_grade s
WHERE e.salary BETWEEN s.min_salary AND s.max_salary;
工资等级表中有最大工资和最小工资,在这二者之间分别对应等级,员工表里的工资与工资等级表中最大和最小工资比较,连接出工资对应的等级.也可以加上其他条件.
https://www.bilibili.com/video/BV12b411K7Zu?p=73

自连接

案例:查询 员工名和上级的名称
SELECT e.employee_id,e.last_name,m.employee_id,m.last_name
FROM employees e,employees m
WHERE e.manager_id=m.employee_id;
自己作为表连接自己,因为自己在查找的过程中发现找的内容存在于自己表中,就好像自己在找自己一样,为了好理解并且预防语义冲突,给自己的两张表起别名.
https://www.bilibili.com/video/BV12b411K7Zu?p=74

SQL99语法

#一、内连接

语法:
SELECT 查询列表
FROM 表名1 别名
【INNER】 JOIN 表名2 别名
ON 连接条件
WHERE 筛选条件
GROUP BY 分组列表
HAVING 分组后筛选
ORDER BY 排序列表;
SQL99就是将连接条件分离出来了!
SQL92和SQL99的区别:
SQL99,使用JOIN关键字代替了之前的逗号,并且将连接条件和筛选条件进行了分离,提高阅读性!!!

等值连接

image.png
image.png
image.png
image.png
一个员工id对应一个name,所以select department_name也可以,select department_id更好.

非等值连接

image.png

自连接

image.png
https://www.bilibili.com/video/BV12b411K7Zu?p=283

习题:
image.png
image.png
image.png
https://www.bilibili.com/video/BV12b411K7Zu?p=284
https://www.bilibili.com/video/BV12b411K7Zu?p=285

#二、外连接

image.png
image.png
image.png
image.png

image.png
image.png
外连接中,当去筛选没有匹配项的主表中的列,一般判断从表的主键列是否为null
image.png
部门表和员工表在进行连接后形成的虚表中,主表字段一定全部存在,而从表会有与之对应不上的部分,主表会用null来完善这个部分,这样形成的虚表不在乎从表的主键,照样会杀死从表的主键为null,判断形成的虚表中从表的主键字段为空(从表主键在虚表中变成了null)时就一定说明这一行从表没有对应上主表字段.
https://www.bilibili.com/video/BV12b411K7Zu?p=286

image.png
内连接中的等值连接

image.png
左外连接

image.png
右外连接

image.png
A有B没有,where后B 主键为null

image.png
B有A没有,where后A 主键为null

image.png
全外连接(并集)

image.png

https://www.bilibili.com/video/BV12b411K7Zu?p=287

习题:
image.png
image.png
image.png
也可以用左外连接
image.png
先查的哪个哪个就是主表,部门为SAL 或者IT 可能对应员工信息为null,部门为主表.
https://www.bilibili.com/video/BV12b411K7Zu?p=288