MYSQL高级查询,多表查询,子查询

MYSQL高级查询

一、常用的高级查询语句
连接查询:如果条件和结果分布于多张表,使用多表连接
子查询:(如果最终结果在一张表中,优先选择子查询,再考虑连接查询)嵌套查询,将一个查询结果作为另一个查询条件或组成部分的查询
联合查询:全连接[联合查询]、并集去交集等,将两个结果集联合到一起的查询
应用:连接查询和子查询配合使用。数据量较大时连接查询较慢(先过滤再连接);子查询嵌套层次较大也影响性能。

#sql_高级查询

##-- 2.1 连接查询

– 笛卡尔积(没有加筛选条件的内连接)
#> 多张表中记录组合所有可能有序对集合(如:A表有n行,B表m行,结果为n*m行)

– 内连接
#> 多张表均匹配的记录连接并展示在结果集
#> 无主从表之分,与连接顺序无关

查询所有雇员及其部门信息

select * from emp,dept where emp.deptno = dept.deptno;
select * from emp inner join dept on emp.deptno = dept.deptno;
select * from emp inner join dept using(deptno); #字段名称必须一致,会自动去除重复列

– 自然连接
#> 自然连接都是等值连接
#> 表中字段名称相等的字段进行连接,会自动去重重复列
select * from emp natural join dept;

– 外连接
#> 以驱动表为依据,依次在匹配表中进行记录匹配,如果匹配则连接并展示在结果集中,否则以null填充
#> 有主从表之分,与连接顺序有关。

left/right [outer] join … on…
select * from emp LEFT JOIN dept on emp.deptno = dept.deptno;#emp为
#>主表,dept为从表
select * from emp right JOIN dept on emp.deptno = dept.deptno;#dept为主表,emp为从表

– 自连接
#> 以本身为镜像进行连接(自身连接自身)MYSQL高级查询,多表查询,子查询_第1张图片
#查询所有商品类别的子类

select s.type_id,s.type_name,s.parent_id from tdb_goods_types AS s LEFT JOIN
tdb_goods_types AS p where s.parent_id =p.type_id oder by s.type_id;

查询员工及其领导的名称

select e1.ename ‘名称’,e2.ename ‘领导’ from emp e1,emp e2 where e1.mgr = e2.empno

##-- 2.2 子查询
#> 嵌套查询,将一个查询结果作为另一个查询条件或组成部分的查询

– 单行子查询
#查询工资大于7788号员工的所有员工信息
select * from emp where sal >(select sal from emp where empno =7788);

– 多行子查询
#返回多值可以使用any或all来修饰。
#=any相当于in,any大于最小值;
#<>all相当于not in,>all大于最大值,

#查询超过所在部门平均工资的员工信息
select * from emp e1 where sal > 
(select avg(sal) from emp e2 where e1.deptno = e2.deptno);

#查询薪水大于2000的部门名称
select dname from dept d where deptno in
(select deptno from emp e where sal > 2000);
#或
select dname from dept d where EXISTS 
(select * from emp e where sal > 2000 and d.deptno=e.deptno);
#in和exists的区别
 # in先执行子查询,在执行主查询,返回的值作为主查询的查询条件。
 # exists子查询不返回具体结果,返回true值出现在结果集,否则不出现;exists先执行主查询,再交给子查询进行匹配。

##-- 2.3 联合查询
#> union: 并集,所有的内容都查询,重复的显示一次
#> union all: 并集,所有的内容都显示,包括重复的
select * from emp where deptno = 20
union
select * from emp where sal <=2000

二、图解说明几种常见的连接[联合]查询
2.1、左连接
两表关联,查询左表独有的数据。
MYSQL高级查询,多表查询,子查询_第2张图片
select * from emp t1 LEFT JOIN dept t2 ON t1.deptno = t2.deptno; #emp为主表,dept为从表

2.2、右连接

MYSQL高级查询,多表查询,子查询_第3张图片
select * from emp right join dept on emp.deptno = dept.deptno; #dept为主表,emp为从表

2.3、内连接
两表关联,保留两表中交集的记录。
MYSQL高级查询,多表查询,子查询_第4张图片

select * from emp inner join dept on emp.deptno = dept.deptno;
select * from emp,dept where emp.deptno = dept.deptno;
select * from emp inner join dept using(deptno); #字段名称必须一致,会自动去除重复列–>特例
select * from emp natural join dept; #也叫自然连接、等值连接,两表中有相同字段时的等值连接–>特例

————————————————
转载于:https://blog.csdn.net/weixin_41685388/article/details/103188974

你可能感兴趣的:(MYSQL高级查询,多表查询,子查询)