MySQL连接查询(内连接,外连接,全连接)

首先建三个数据表

sql文件下载 密码: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)

经验分享 程序员 微信小程序 职场和发展