首先建三个数据表
sql文件下载
https://wwr.lanzous.com/i16UCob7sbg
密码:f2z5
(蓝奏云不能上传sql文件,下载后先改成sql后缀)
employees
jobs
levels
内连接
关键字 inner join…on…
inner 可以省略
等值连接
查询员工工资信息
SELECT *
FROM employees
INNER JOIN jobs
ON jobs.job_id=employees.job_id;
根据连接条件,将两表连接起来,
注意:
employees表中的 高九,以及
jobs表中的 老板,没有满足连接条件的信息,因此查询出的表中没有
注意:接下来会与外连接做对比
非等值连接
查询员工的工资及对应等级
SELECT salary,level
FROM jobs
INNER JOIN levels
ON jobs.salary >= levels.min_sal AND jobs.salary< levels.max_sal;
注意:
jobs表中的老板,levels表中的E5,都没有满足相应的连接条件,查询结果中也没有他们的信息。
自连接
查询各个员工的上级
SELECT DISTINCT e.employee_name 员工名, m.employee_name 上级
FROM employees e
INNER JOIN employees m
ON e.boss_id=m.employee_id;
自连接就是一个表和它自身进行连接,是多表连接的特殊情况。
在自连接查询中,要先在FROM字句中为表分别定义两个不同的别名
然后使用这两个别名写出一个连接条件
外连接
左外连接
主表在关键字左边
关键字:LEFT JOIN
与等值连接比对,
select *
from employees
left JOIN jobs
on jobs.job_id=employees.job_id;
这里出现了高九,因为左外连接查询,是以left左边的表为主表,右边的为从表,也就是会查询出这个表中所有的记录
如果某条记录没有满足连接条件,就让从表的字段补null填充。
与非等值连接的对比可以自己试一下
右外连接
主表在关键字右边
关键字:RIGHT JOIN
与非等值连接对比
SELECT salary,level
FROM jobs
Right JOIN levels
on jobs.salary >= levels.min_sal AND jobs.salary< levels.max_sal;
右外连接,不过是主表变为了 join 右边的表,
其他和左外连接一样
可以自行对比一下等值连接,以及左外连接
全外连接
MySQL不支持全外连接的语法,但可以使用**关键字UNION**得到相同的结果
即求左外连接和右外连接的并集
SELECT salary,level
FROM jobs
LEFT JOIN levels
on jobs.salary >= levels.min_sal AND jobs.salary< levels.max_sal
UNION
SELECT salary,level
FROM jobs
RIGHT JOIN levels
on jobs.salary >= levels.min_sal AND jobs.salary< levels.max_sal;
交叉连接
关键字:CROSS JOIN
就是做笛卡尔积,第一个表的每一行分别对应另一个表的每一行
select *
FROM levels
CROSS JOIN jobs;
一共48条记录(两表记录相乘6*8)