1. 程式人生 > >MySQL進階之高階查詢,真的高階啊!

MySQL進階之高階查詢,真的高階啊!

高階查詢

1.多表查詢(關聯查詢,連線查詢)

  • 內連線
    • 沒有主從表之分。
    • 與連線順序無關
      • 內連接出現在結果集中的資料必須出現在每一個關聯表中。

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);  

不通用,必須通用列欄位名稱一樣,會去除重複列。

  • 外連線(左外連線 右外連線)
    • 有主從表之分,與連線順序有關。
    • 以主表為基準,依次在從表中查詢與主表記錄相關聯記錄,如果找到則關聯並顯示,否則以null填充。

select * from emp

left/right join dept

on emp.deptno = dept.deptno;

 

2.子查詢(巢狀查詢)

  • 一次查詢的結果作為另一查詢的條件或者結果集,稱為子查詢。
  • 單行子查詢

子查詢返回結果一條記錄

select * from dept where deptno = (select deptno from emp where empno=7369);

  • 多行子查詢

子查詢返回結果多條記錄

select * from dept where deptno in (

   select deptno from emp where sal > 2000);

any/all

=any: 相當於in      >any:大於最小值    <any:小於最大值

<>all: 相當於not in   >all:大於最大值   <all:小於最小值

 

 

# 查詢超過所在部門的平均工資的員工資訊。

  #關聯

  select * from emp,

           (select deptno,avg(sal) avg from emp group by deptno) e

           where e.deptno = emp.deptno and sal > e.avg;

#子查詢

  #1.主查詢將deptno傳給子查詢

           #2.子查詢根據主查詢傳的部門編號查詢該部門的平均工資

           #3.子查詢將結果返回給主查詢,主查詢執行。

 select * from emp e1 where sal >(

   select avg(sal) avg from emp e2 where e2.deptno = e1.deptno);

 

#查詢工資>2000的員工所在部門的名稱

  select dname from dept where deptno in

  (select deptno from emp where sal > 2000);

 

#exists

select dname from dept where exists(

select * from emp where sal > 2000 and dept.deptno = emp.deptno);

 

#exits和in對比

  #in:先執行子查詢,將子查詢結果返回給主查詢,主查詢根據返回的結果後續處理。

#exits:先執行主查詢,子查詢根據主查詢傳輸的資料,依次在子查詢中匹配,如果能夠找到與主查詢相匹配的記錄,則返回true,顯示主查詢的結果;如果不能匹配,則返回false,則主查詢該記錄不會顯示在結果集中。

 

3.聯合查詢 union 去重、union all 不去重

select * from emp where deptno =20

union all

select * from emp where sal >2000;