SELECT  sex,  MAX(salary),  MIN(salary),  AVG(salary)

  FROM  emp

  GROUP  BY  sex;

5.MySQL複雜查詢 —— 跨表/多表查詢 —— 瞭解

查詢結果集中的資料來自於多個不同的表。

示例:查詢每個員工的姓名及其所在部門的名稱

  SELECT  ename,  dname

  FROM  emp,  dept ;   #笛卡爾積!錯誤!

-----------------------------------------------------------

  SELECT  ename, deptId, did, dname

  FROM  emp,  dept

  WHERE   deptId = did ;   #跨表查詢必須有連線條件

注意:上述寫法是SQL-92版本中的寫法。存在一定的缺陷:

(1)無法顯示沒有部門的員工 —— KING

(2)無法顯示沒有員工的部門 —— 測試部

SQL-99標準對此進行了改變,但是SQL變得很複雜,有四種寫法:

(1)內連線查詢:inner join ... on ...

  SELECT  ename, dname

  FROM  emp  INNER  JOIN  dept

  ON  deptId=did ;  

  #內連線的效果與SQL-92標準完全一樣

(2)左外連線查詢: left  outer  join ... on ...

  SELECT  ename, dname

  FROM  emp  LEFT  OUTER  JOIN  dept

  ON  deptId=did ;    #13+1

  #可以顯示出“左側表”中所有的記錄!即使右側表中沒有對應的記錄

(3)右外連線查詢:right  outer  join ... on ...            

  SELECT  ename, dname

  FROM  emp  RIGHT  OUTER  JOIN  dept

  ON  deptId=did ;    #13+1

  #可以顯示出“右側表”中所有的記錄!即使左側表中沒有對應的記錄

(4)全外連線查詢:full  join ... on ...           

  SELECT  ename, dname

  FROM  emp  FULL  JOIN  dept

  ON  deptId=did ;    #13+1+1

  #可以顯示出“右側表”和“右側表”中所有的記錄!—— MySQL不支援

課外小知識:如何解決MySQL不支援全連線的問題 —— 使用結果集的合併

select  ename, salary  from  emp_us ;

select  ename, salary  from  emp_cn ;

結果集的合併:UNION,把兩條查詢語句的結果合併為一個大結果

(select  ename, salary  from  emp_us)

UNION

(select  ename, salary  from  emp_cn) ;

  兩個結果集中的相同資料只顯示一次

(select  ename, salary  from  emp_us)

UNION   ALL

(select  ename, salary  from  emp_cn) ;

兩個結果集中的相同資料各自顯示

練習:查詢出員工姓名及其所在部門的名字,要求必須顯示出所有的員工和所有的部門:左外連接合並上右外連線

(

  SELECT  ename, dname 

  FROM  emp  LEFT OUTER JOIN dept

  ON deptId=did

)

UNION

(

  SELECT  ename, dname 

  FROM  emp  RIGHT OUTER JOIN dept

  ON deptId=did

) ;

練習:查詢出員工姓名及其所在部門的名字,要求必須顯示出所有的員工和所有的部門:左外連接合並上右外連線

(

  SELECT  ename, dname 

  FROM  emp  LEFT OUTER JOIN dept

  ON deptId=did

)

UNION

(

  SELECT  ename, dname 

  FROM  emp  RIGHT OUTER JOIN dept

  ON deptId=did

) ;