【MySQL基础】04数据查询语言DQL(下)

目录

一、多表查询

二、联合查询

三、子查询


一、多表查询

1、定义:通过不同表中具有相同意义的关键字段,将多个表进行连接,查询不同表中的字段信息。

2、连接方式:

  • 内连接([inner] join):A表和B表重合(相交)部分

     

select 字段1[,…] from 表1[ inner] join 表2 on 表1.key=表2.key;

  • 左连接(left join):写在join前面的是左表,除了返回满足连接条件的行,还会返回左表所有行。

     

select 字段1[,…] from 表1 left join 表2 on 表1.key=表2.key;

  • 右连接(right join):写在join后面的是右表,除了返回满足连接条件的行,还会返回右表所有行。

    

select 字段1[,…] from 表1 right join 表2 on 表1.key=表2.key;

  • 全连接(full join):A表和B表连接,返回所有行,就会产生笛卡尔积

Select 字段[……] from表1 full join 表2on 表1.key=表2.key;

Select 字段[……] from表1,表2;

【注意】

  • 不等值连接(类似excel的vlookup函数模糊匹配):

Select * from表1 

left join表2 

on表1.key between表2.列1 and表2.列2;

【例】用表1员工工资详细表匹配表2的工资等级表

Select a.*,b.工资等级 from员工工资详细a 

Left join工资等级b 

on a.工资between b.最低工资and b.最高工资;

二、联合查询

  1. 定义:把多条select语句的查询结果合并为一个结果集。被合并的结果集的列数、顺序和数据类型必须完全一致。
  2. union去重:select 字段1[,字段2,…] from 表名 union select 字段1[,字段2,…] from 表名; 
  3. union all不去重: select 字段1[,字段2,…] from 表名 union all select 字段1[,字段2,…] from 表名;

【注意】

  • 是两个表重合部分union all 不会去重,直接整合到一个表中。

三、子查询

1、定义:在查询语句中包含另一个或多个完整的查询语句。通常可出现在select、where、having、from关键词后。

2、子查询分类:

  • 标量子查询:返回一个数据(单行单列)
  • 行子查询:返回一行数据(单行多列) 
  • 列子查询:返回一列数据(多行单列) 
  • 表子查询:返回一张表(多行多列)

3、子查询出现的位置:

  • select子句中:子查询只能是标量子查询、列子查询(只能单列);
  • where/having子句中:可以是标量子查询、行子查询、列子查询、表子查询;
  • from子句中:可以是标量子查询、行子查询、列子查询、表子查询。

【列】

1、select deptno, count(1)/(select count(1) from emp) 
from emp
group by deptno;
  • 标量子查询:(单行单列,括号里的返回的是一个数据)
Select * from emp 

Where sal > (select avg(sal) from emp); 
  • 行子查询:(单行多列,括号里的返回的是一行数据) 
Select empno, ename, job, deptno 
from emp 
Where (deptno,job)= (select deptno, job from emp where ename='smith') and ename !='smith'; 
  • 列子查询(多行单列)表子查询(多行多列): 必须用到in、any、all操作符,可将其看作矩阵。单行多列行子查询也可用到in、any、all,只是用比较运算符更简便。 
Select empno, ename, job, deptno from emp
Where (deptno,job) in (select deptno, job from emp where ename='smith') and ename!='smith';

4、子查询操作符

  • [not]in:等于或不等于其中一个 
  • any:比数据集中任意(其中)一组数据要大或小
  • all:比数据集中所有一组数据要大或小

【理解】

  1. in是等于或不等于 
  2. any和all是可对比大小的 
  3. any是任意其中一个,all是所有

【例子】

  • 查询基本工资高于30号部门任意员工的员工信息(即比30部门最低工资员工工资高) 
Select * from emp
Where sal > any(select sal from emp where deptno=30)
and deptno!=30 order by deptno, saldesc; 
  • 查询基本工资高于30号部门所有员工的员工信息(即比30部门最高工资员工工资高) 
Select * from emp
Where sal > all (select sal from emp where deptno=30)
and deptno!=30 order by deptno,saldesc;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章