接数据库MySQL学习(02)下面涉及到的表前面有提供
连表查询
连表查询的语法
select *
from 表1
join 表2
on 表1.字段 = 表2.字段 如果on的条件没有声明,那么结果一定是一个笛卡尔积
连表查询包括如下:
1:内连接,求两张表的交集
-- INNER JOIN可以简写为join
SELECT * FROM employees emp
INNER JOIN departments dept
ON emp.deptid = dept.deptid
2:左外连接,求左表的全部数据,用右表去匹配,如果按照连表条件能够匹配上就显示数据,如果匹配不上,就用null来代替
-- left outer join 可以简写为LEFT JOIN
SELECT * FROM employees emp
LEFT JOIN departments dept
ON emp.deptid = dept.deptid
3:右外连接,右边的表全部显示,然后左边的表按照连表条件去匹配,匹配上显示数据,匹配不上用null代替
SELECT * FROM employees emp
RIGHT JOIN departments dept
ON emp.deptid = dept.deptid
4:左边表的独有部分
SELECT * FROM employees emp
LEFT JOIN departments dept
ON emp.deptid = dept.deptid
WHERE dept.deptid IS NULL
5:右边表的独有部分
SELECT * FROM employees emp
RIGHT JOIN departments dept
ON emp.deptid = dept.deptid
WHERE emp.deptid IS NULL
6:公共部分(去重)+左表独有+右表独有
SELECT * FROM employees emp
LEFT JOIN departments dept
ON emp.deptid = dept.deptid
UNION
SELECT * FROM employees emp
RIGHT JOIN departments dept
ON emp.deptid = dept.deptid
注意:union 可以去重,重复的数据只留一份
union all 不能去重
多个结果集进行union或者union all操作时必须保证两个结果集列的个数相等
7:左边独有+右边独有
SELECT * FROM employees emp
LEFT JOIN departments dept
ON emp.deptid = dept.deptid
WHERE dept.deptid IS NULL
UNION
SELECT * FROM employees emp
RIGHT JOIN departments dept
ON emp.deptid = dept.deptid
WHERE emp.deptid IS NULL
多表连表查询
-- 查询每个员工的姓名 邮箱 工资
-- 部门的名称 工种的名称 [要求所有员工全部出现]
-- 以及员工所工作的城市
SELECT
CONCAT(first_name,last_name) AS 'fullname',
email,
salary,
dept.department_name,
jobs.job_title,
locations.city
FROM employees emp
LEFT JOIN departments dept ON emp.department_id = dept.department_id
LEFT JOIN jobs ON emp.job_id = jobs.job_id
LEFT JOIN locations ON dept.location_id = locations.location_id
单表自连接查询
-- 查询每个员工的姓名以及他直接上一级领导的姓名
SELECT emp1.first_name,emp2.first_name
FROM employees emp1
LEFT JOIN employees emp2
ON emp1.manager_id = emp2.employee_id
非相关子查询
一个查询语句里面又包含了另外一个完整的查询语句(嵌套查询)
子查询不依赖与外部的查询,可以独立运行
相关子查询
子查询依赖于外部的查询,不能独立运行