MySQL高級查詢函數(多行函數/多表查詢)


常用的分組函數:

  分組函數在計算時省略列中的空值  
  不能在where語句中使用分組函數

①:AVG/SUM:在數字類型數據使用AVG and SUM 函數
  AVG:計算平均值
  SUM:計算總和

②:COUNT(*)返回表中所有符合條件的記錄數.

  COUNT(字段) 返回所有符合條件並且字段值非空的記錄

③:MAX/MIN:MIN and MAX適用於任何數據類型
  MIN: 計算最小值
  MAX:計算最大值
分組語句:

原表內容:

①:group by語法

SELECT  column, group_function FROM   table [WHERE  condition] [GROUP BY    group_by_expression] [ORDER BY  column];

  使用GROUP BY子句將表分成小組
  組函數忽略空值,可以使用ifnull
  結果集隱式按升序排列,如果需要改變排序方式可以使用Order by 子句

②:group by使用

  #把工資小於300的過濾掉再分組
  #把工資大於等於300的分組

SELECT e_name,e_id, e_salary FROM employee WHERE e_salary>=300 GROUP BY e_deptid 

結果:

#把工資大於等於300的分組 並按照組平均工資的降序排序

SELECT *,AVG(e_salary) FROM employee WHERE e_salary>=300 GROUP BY e_deptid ORDER BY AVG(e_salary) DESC;

結果:

③:使用HAVING:

  1,不能在 WHERE 子句中限制組.
  2,限制組必須使用 HAVING 子句.
  3,不能在 WHERE 子句中使用組函數.

#列出部門的平均工資大於250的部門

 

SELECT e_deptid,AVG(e_salary) FROM employee GROUP BY e_deptid HAVING AVG(e_salary)>250

 

結果:

分組函數執行流程:

在整個語句執行的過程中,最先執行的是From,然后是Where子句,在對表數據進行過濾后,符合條件的數據通過Group by進行分組,分組數據通過Having子句進行組函數過濾,最終的結果通過order by子句進行排序,排序的結果被返回給用戶。

多表查詢:(分為隱式連接和顯式連接)

 

原表:      employee                                                                            部門表  dept                                                       

                                             

隱式查詢

  目的:進行多張表的聯合查詢
  缺點:
    1)會把表中的null的記錄直接過濾,所以:隱式連接只能做內連接

#列舉出所有的員工還有所在部門的名稱

SELECT  employee.e_id,employee.e_name,employee.e_salary,employee.e_deptid,dept.d_name FROM employee,dept WHERE employee.e_deptid=dept.deptid

結果:

顯式連接:可以理解為把隱式連接的條件從where挪到on里
     分為內連接,外連接,自連接

     如果想把一張表的信息包括null都查詢出來則使用外連接,如果想把null信息忽略則使用內連接

     隱式連接的問題在於:
      1,需要在where條件中寫連接條件,如果忘記寫,代碼不會出錯,產生笛卡爾乘積;
      2,隱式連接只能做內連接;

      優化:
      1)如果on后面有多個條件,並且這些條件中有連接條件和顧慮條件, 那么先寫過濾條件后寫連接條件,性能會有大的提升→有了JOIN就可以不寫where了
      2)盡量使用記錄少的表連接記錄相對較多的表

SELECT [表名1.列名1,表名1.列名2,表名1.列名3,表名2.列名1,表名2.列名2] FROM 表名1 , 表名2 WHERE 表名1.列=表名2.列
                                          
SELECT [表名1.列名1,表名1.列名2,表名1.列名3,表名2.列名1,表名2.列名2] FROM 表名1 JOIN 表名2 ON 表名1.列=表名2.列

      ,---> JOIN     WHERE--->ON

#左連接:在連接生成的新表中,把JOIN關鍵字左邊的表的記錄全部顯示出來

 

SELECT emp.e_id,emp.e_name,emp.e_salary,dept.d_name FROM employee AS emp LEFT JOIN  dept  ON emp.e_deptid=dept.deptid

 

結果:

自連接:

  場景1:
  同一張表中的記錄中, 存在多種身份的記錄
  如:班長和學生的關系, 部門經理和部門員工的關系
  查詢,某個班長管理哪些學生。
  場景2:
  同一個對象中包含兩個同類型的對象,在同一張表中查詢出三個表中的信息。
  在查詢語句中,一張表可以重復使用多次,完成多次連接的需要;
  查詢員工和其經理

原表:      e_monitor相當於部門經理  由表得1,2為部門經理

查詢有經理管理的員工和其經理

SELECT emp.e_id '員工編號',emp.e_name '員工姓名',monitor.e_id'經理編號',monitor.e_name '經理姓名' FROM 
employee emp JOIN employee monitor ON emp.e_monitor=monitor.e_id

結果:

子查詢:

 在一個查詢A的結果集中再次查詢B, 那么A就叫做B的子查詢
 在使用select語句查詢數據時,有時候會遇到這樣的情況,在where查詢條件中的限制條件不是一個確定的值,而是一個來自於另一個查詢的結果。
  SELECT    select_list   FROM table  WHERE    expr  operator   (SELECT    select_list   FROM    table);
  1、子查詢在主查詢前執行一次
  2、主查詢使用子查詢的結果
##找出所有小於平均工資的員工

SELECT e_name , e_salary FROM employee WHERE e_salary<(SELECT AVG(e_salary) FROM  employee)

 

結果:

UNION/UNION ALL:(比如查詢全校的學生信息)

  JOIN是用於把表橫向連接,UNION/UNION ALL是用於把表縱向連接
  UNION 操作符用於合並兩個或多個 SELECT 語句的結果集。
  注意:
    1,UNION 操作的表列數必須相同;
    2,列也必須擁有相兼容的數據類型。
    3,每條 SELECT 語句中的列的順序必須對應。
    4,UNION 結果集中的列名總是使用 UNION 中第一個 SELECT 語句中的列名
    5,UNION 操作的表會把結果中重復的記錄刪除
          UNION ALL則允許重復的值出現

 

# UNION:有去重功能
(SELECT * FROM t_employee)
UNION
(SELECT * FROM t_employee_bak);

# UNION ALL簡單的堆疊
(SELECT * FROM t_employee)
UNION ALL
(SELECT * FROM t_employee_bak);

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM