db2分页查询sql语句_SQL语句mysql高级查询语句

5ca75c14f007462ead80d34c09369207.png

[关联查询|多表查询](连接查询、子查询、联合查询、图解说明几种常见的连接[联合]查询)

一、常用的高级查询语句

· 连接查询:(如果条件和结果分布于多张表,使用多表连接)

· 子查询:(如果最终结果在一张表中,优先选择子查询,再考虑连接查询)嵌套查询,将一个查询结果作为另一个查询条件或组成部分的查询

· 联合查询:全连接[联合查询]、并集去交集等,将两个结果集联合到一起的查询

· 应用:连接查询和子查询配合使用。数据量较大时连接查询较慢(先过滤再连接);子查询嵌套层次较大也影响性能。

#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为从表 -- 自连接  #> 以本身为镜像进行连接(自身连接自身)  # 查询员工及其领导的名称  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、左连接

c7631ef579938f37bf757acb5969c075.png

select * from emp t1 LEFT JOIN dept t2 ON t1.deptno = t2.deptno; #emp为主表,dept为从表

2.2、右连接

a5cc1fc704065a7e9f3edb84c4b2a64d.png

select * from emp right join dept on emp.deptno = dept.deptno; #dept为主表,emp为从表

2.3、内连接

两表关联,保留两表中交集的记录。

b2f094f22f9da522a2f34d2d9cecf26d.png

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; #也叫自然连接、等值连接,两表中有相同字段时的等值连接-->特例

2.4、左表独有

两表关联,查询左表独有的数据。

27586787f666beadbc53b299fa8c017f.png

select * from emp t1 LEFT JOIN dept t2 ON t1.deptno = t2.deptno where t2.deptno is null; 

2.5、右表独有

两表关联,查询右表独有的数据。

c3bcc0f56729d24cdb3a4df2ccad5be9.png

select * from emp t1 right join dept t2 on t1.deptno = t2.deptno where t1.deptno is null;

2.6、全连接[联合查询]

两表关联,查询它们的所有记录。

704afcf5a016fea33fe112c5e825b01a.png

oracle里面有full join,但是在mysql中没有full join。我们可以使用union (左连接+右连接,去除重复)。

select * from emp LEFT JOIN dept on emp.deptno = dept.deptno
union
select * from emp right JOIN dept on emp.deptno = dept.deptno;

2.7、并集去交集

两表关联,取并集然后去交集。

9b2a2fcc3f193de98246e6b72df9b4e8.png

select * from emp t1 LEFT JOIN dept t2 ON t1.deptno = t2.deptno where t2.deptno is nullunionselect* from emp t1 right join dept t2 on t1.deptno = t2.deptno where t1.deptno is null;

f8095e00ae63e1eabf7f4673f0503f26.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值