[MySQL笔记]08.多表查询

文章目录


多表查询

1表连接查询

1.1笛卡尔积

笛卡尔积, 两表数据相乘

直接查看可以发现许多错误拼接的数据(脏数据)

 select * from emp, dept; 

– 乘积筛选后的结果, 两边能匹配上的数据

select * from emp, dept where emp.deptno = dept.deptno;
select * from emp e, dept d where e.deptno = d.deptno;

1.2内连接

1.2.1隐式内连接

隐式内连接:看不到 JOIN 关键字,条件使⽤ WHERE 指定

SELECT 字段名 FROM 左表, 右表 WHERE 条件;

1.2.2显示内连接

显示内连接:使⽤ INNER JOIN … ON 语句,可以省略 INNER

SELECT 字段名 FROM 左表 [INNER] JOIN 右表 ON 条件;

1.3外连接

1.3.1左外连接

左外连接:使⽤ LEFT OUTER JOIN … ON, OUTER 可以省略

SELECT 字段名 FROM 左表 LEFT [OUTER] JOIN 右表 ON 条件

在内连接的基础上,保证左边的表的数据全部展示

1.3.2右外连接

右外连接:使⽤ RIGHT OUTER JOIN … ON, OUTER 可以省略

SELECT 字段名 FROM 左表 RIGHT [OUTER] JOIN 右表 ON 条件

在内连接的基础上,保证右边的表的数据全部展示


子查询

子查询,查询中嵌套查询,使用另一个查询的结果

1.子查询的结果是单行单列的结果,值可以直接比较

-- 查询公司中最高薪资的员工姓名和所在的部门编号、
select max(sal) from emp;
select ename,deptno from emp where sal =5000;
-- 组合
select ename,deptno from emp where sal=(select max(sal) from emp);

2.子查询结果是单列多行的,集合 in\not in>any<all

-- 查询部门 平均薪资高于1800的部门 中所有员工的信息
select deptno from emp group by deptno having avg(sal)>1800;
select * from emp where deptno in 
(select deptno from emp group by deptno having avg(sal)>1800);

3.子查询是多行多列的,作为一张临时表来使用

-- 查询薪资大于所在部门平均薪资的所有员工信息
select * from emp;
-- 子查询作为临时表使用
select avg(sal) s_avg,deptno from emp group by deptno;
-- 组合
select * from emp e 
join (select avg(sal) s_avg,deptno from emp group by deptno) d 
on e.deptno=d.deptno
where e.sal>d.s_avg;

4.子查询用于的语句

⼦查询结果只要是单列,则在 WHERE 后⾯作为条件
⼦查询结果只要是多列,则在 FROM 后⾯作为表进⾏⼆次查询
上一篇:MySQL数据库之一


下一篇:SQL练习题01