【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;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章