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)
