第三天MYSQL

来源:https://www.cnblogs.com/jane315/archive/2020/05/06/12839543.html
-Advertisement-
Play Games

第三天MySQL學習 :分組函數、分組查詢、連接查詢(等值連接、非等值連接、自連接) ...


2020/5/6

分組函數:(分組函數用作統計使用,又稱聚合函數、統計函數或組函數)

 #sum(求和)、avg(平均值)、max(最大值)、min(最小值)、count(計數)

 特點:

1. 以上分組函數中都是可以忽略null值 (其中count本身就是計算非null值得個數)

2. sum和avg函數的參數一般只能處理數值型,而max、min以及count可針對任意類型的參數

SELECT  SUM(salary)  FROM  employees;-> 691400.00

SELECT  AVG(salary)  FROM  employees;-> 6461.682243

SELECT  MAX(salary)  FROM  employees;-> 24000.00

SELECT  MIN(salary)  FROM  employees;-> 2100.00

SELECT  COUNT(salary)  FROM  employees;-> 107

 

#組合使用:

SELECT

       SUM(salary) 和,

       ROUND(AVG(salary),2) 平均, #嵌套使用round()函數,將值保留至小數點後面2位

       MAX(salary) 最大值,

       MIN(salary) 最小值,

       COUNT(salary) 總數

FROM

       employees;

 

關於分組函數忽略nul值,舉例:

SELECT

       AVG(commission_pct),

       SUM(commission_pct) / COUNT(commission_pct),

       SUM(commission_pct) / COUNT(*)

FROM

       employees;

 

這裡可以看出avg(commissom_pct)的值等於sum(commission_pct)/ count(commission_pct)(非空的總數),而不是總體的個數(count(*))

 

#與DISTINCT(去重)關鍵字搭配使用

SELECT  SUM(DISTINCT salary), SUM(salary)  FROM  employees;

去重之後,在統計工資之和

 

 

 

SELECT  SUM(DISTINCT  salary), SUM(salary)  FROM  employees;

統計工資的種類

 

#count函數詳細介紹

select count(*)  from 表名;  ->統計表的總行數

select count(1)  from  表名; ->相當於在表中多了一列,這一列中根據表內的行數加了相應個數的1,統計1的個數,並返回

效率比較:

MYISAM存儲引擎下,count(*)的效率高

INNODB存儲引擎下,count(*)和count(1)的效率差不多,比count(欄位)(有個判斷欄位是否為null的過程)要高

註意:和分組函數一同查詢的欄位要求是group by 後的欄位

 

十六、分組查詢

語法:(group by 子句語法)

註意:查詢列表必須特殊,要求是分組函數或group by後出現的欄位

       SELECT

              分組函數,列(要求要出現在group by 之後)

       FROM

              表名

       [WHERE

              篩選條件]

       GROUP BY

    分組的列表

       [ORDER BY

    子句]

特點:

  1. 分組查詢中的篩選條件分為兩類

                      數據源                    位置                     關鍵字

分組前篩選   原始表                  group by子句前               where

分組後篩選   分組後的結果       group by子句後                having

1.若分組函數做篩選條件則肯定放在having子句中

2.能用分組前篩選的,就優先考慮使用分組前篩選(考慮效率問題)

2. group by 子句中支持單個欄位分組,多個欄位分組(多個欄位用逗號隔開,沒有順序要求,還支持表達式和函數分組(用的較少))

3. 也可以添加排序(排序放在整個分組查詢語句的最後)

----------------------------------簡單分組查詢------------------------

#案例一:查詢每個部門的平均工資

SELECT

       AVG(salary) 平均工資,

       department_id

FROM

       employees

GROUP BY

       department_id;

 

#案例二:查詢每個工種的最高工資

SELECT

       MAX(salary),

       job_id

FROM

       employees

GROUP BY

       job_id;

 

 #案例三:查詢每個位置上的部門個數

SELECT

       COUNT(*),

       location_id FROM

       departments

GROUP BY

       location_id;

 

-----------------------------添加篩選條件的分組查詢-------------------

1.分組前篩選

#案例1:查詢郵箱中包含a字元的,每個部門的平均工資

SELECT

  AVG(salary)  平均工資,

  department_id  部門編號

FROM

  employees

WHERE

  email LIKE '%a%'

GROUP BY

  department_id;

 

#案例2:查詢有獎金的每個領導手下員工的最高工資

SELECT

  MAX(salary) 最高工資,

  manager_id 領導編號

FROM

  employees

WHERE

  commission_pct IS NOT NULL

GROUP BY

       manager_id;

2.分組後篩選

#案例1:查詢哪個部門的員工個數>2

 

SELECT

  count(*) 員工個數,

  department_id 部門編號

FROM

  employees

GROUP BY

  department_id

HAVING    #根據GROUP by 執行後的結果再篩選

  count(*) > 2;

 

SELECT

  count(*) 員工個數,

  department_id 部門編號

FROM

  employees

GROUP BY

  department_id

HAVING

  員工個數 > 2;#可使用別名

 

#案例2:查詢每個工種有獎金的員工的最高工資>12000

SELECT

  MAX(salary) 最高工資,

  job_id 工種編號

FROM

  employees

WHERE

  commission_pct IS NOT NULL

GROUP BY

  job_id

HAVING

  MAX(salary) > 12000;

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

SELECT

  MAX(salary) 最高工資,

  job_id 工種編號

FROM

  employees

WHERE

  commission_pct IS NOT NULL

GROUP BY

  工種編號

HAVING

  MAX(salary) > 12000;

 註意:ORDER BY以及GROUP BY子句後都可以使用別名,註意!!!WHERE子句後不可以!!!

 

#案例3:查詢領導編號>102的每個領導手下的最低工資>5000的領導編號是哪個,以及其最低工資

SELECT

  MIN(salary) 最低工資,

  manager_id 領導編號

FROM

  employees

WHERE

  manager_id > 102

GROUP BY

  manager_id

HAVING

  MIN(salary) > 5000;

 

對比分組前篩選與分組後篩選:

                     數據源                   位置                   關鍵字

分組前篩選  原始表                 group by子句前          where

分組後篩選  分組後的結果       group by子句後          having

註意:

  1. 若分組函數做篩選條件則肯定放在having子句中
  2. 能用分組前篩選的,就優先考慮使用分組前篩選(考慮效率問題)

 

 

---------------------按表達式或函數分組查詢(用的較少)--------------------

#案例:按員工姓名的長度分組,查詢每一組的員工個數,篩選員工個數>5的有哪些

 

SELECT

       COUNT(*) 員工個數,

       LENGTH(last_name) len_name

FROM

       employees

GROUP BY

       LENGTH(last_name)

HAVING

       COUNT(*) > 5;

 

-----------------------------多個欄位的分組查詢----------------------------

#案例:每個部門每個工種的平均工資

 

SELECT

       AVG(salary) 平均工資,

       department_id,

       job_id

FROM

       employees

GROUP BY       #department_id與job_id一致的分為一個小組(與順序無關)

       department_id,

       job_id;

 

----------------------------添加排序條件的分組查詢-------------------------

#案例:每個部門每個工種的獎金存在的並且平均工資大於1000的平均工資,並且按平均工資的高低顯示

SELECT

       AVG(salary) 平均工資,

       department_id,

       job_id

FROM

       employees

WHERE

       department_id IS NOT NULL

GROUP BY  #department_id與job_id一致的分為一個小組(與順序無關)

       department_id,

       job_id

HAVING

       AVG(salary)>10000

ORDER BY

       AVG(salary) DESC;

 

十七、連接查詢

含義:又稱多表查詢,當查詢的欄位來自於多個表時,就會用到

笛卡爾乘積現象:表1 有m行,表2 有n行,結果=m*n行

發生原因:沒有有效的連接條件

如何避免:添加上有效的連接條件

連接查詢分類:

  按年代分類:

       sq92標準:僅僅支持內連接(對MySQL而言)

       sq99標準(推薦):支持內連接+外連接(左外、右外)+交叉連接

 

按功能分類:

       內連接:

              等值連接

              非等值連接

              自連接

       外連接:

              左外連接

              右外連接

              全外連接

       交叉連接

 

(sq92標準)

#等值連接                     

特點:

  1. 多表連接的結果為多表的交集部門
  2. n表連接,至少需要n-1個連接條件
  3. 多表的順序沒有要求
  4. 一般需要為表取別名
  5. 可以搭配前面介紹的所有子句

#案例1:查詢女神名和對應的男神名

SELECT

       NAME,

       boyname

FROM

       beauty,

       boys

WHERE

       beauty.boyfriend_id = boys.id;    #在兩個表之間添加了一個連接的條件

 

#案例2:查詢員工名和對應的部門名

SELECT

       last_name,

       department_name

FROM

       employees,

       departments

WHERE

       employees.department_id = departments.department_id;

 

#案例3:查詢員工名、工種號、工種名

SELECT

       last_name,

       employees.job_id,  #要用表名去限定,否則識別不出來是哪個表中的job_id

       job_title

FROM

       employees,

       jobs           #兩個表的順序可調換

WHERE

       employees.job_id = jobs.job_id;

 

------------為表取別名----------------

  1. 提高語句的簡潔度
  2. 區分多個重名的欄位(限定欄位)
  3. 若為表取了別名,則查詢的欄位就不能使用原來的表名取限定

SELECT

       e.last_name,

       e.job_id,#用表名去限定

       j.job_title

FROM

       employees e,

       jobs j

WHERE

       e.job_id = j.job_id;

 

#案例4:查詢有獎金的員工名、部門名、獎金率【增加篩選條件】

 

SELECT

       last_name,

       department_name,

       commission_pct

FROM

       employees e,

       departments d

WHERE

       e.department_id = d.department_id

AND e.commission_pct IS NOT NULL;

 

#案例5:查詢城市名中第二個字元為'o'的部門名和城市名【增加篩選條件】

SELECT

       department_name,

       city

FROM

       departments d,

       locations l

WHERE

       d.location_id = l.location_id

AND city LIKE '_o%';

 

#案例6:查詢每個城市的部門個數【與group by子句搭配使用】

 

SELECT

       count(*) 個數,

       city

FROM

       departments d,

       locations l

WHERE

       d.location_id = l.location_id

GROUP BY

       city;

#案例7:查詢有獎金的每個部門的部門名和部門的領導編號和該部門的最低工資

 

【與group by子句搭配使用】

SELECT

       department_name,

       e.manager_id,

       MIN(salary)

FROM

       departments d,

       employees e

WHERE

       e.department_id = d.department_id

AND e.commission_pct IS NOT NULL

GROUP BY

       department_name,manager_id;

 

#案例8:查詢每個工種的工種名,和員工個數,並按員工個數降序【與order by 子句搭配使用】

 

SELECT

       job_title,

       COUNT(*)

FROM

       jobs j,

       employees e

WHERE

       j.job_id = e.job_id

GROUP BY

       job_title

ORDER BY

       COUNT(*) DESC;

 

#案例9:查詢員工名、部門名和所在的城市【多表聯合查詢】

 

SELECT

       last_name,

       department_name,

       city

FROM

       employees e,

       departments d,

       locations l

WHERE

       e.department_id = d.department_id

AND d.location_id = l.location_id;

 

 

#非等值連接

#案例1:查詢員工的工資和工資級別

SELECT

       salary,

       grade_level

FROM

       employees e,

       job_grades j

WHERE

       salary BETWEEN lowest_sal    #salary在這個範圍內就顯示出來(不是等值的形式,而是一個範圍的判斷)

AND highest_sal;

 

#自連接(當前表要要連接當前表,為了不模糊,則需各取別名進行限定!)

#案例:查詢員工名和上級的名稱

SELECT

       e.last_name 員工名,

       m.last_name 上級名稱

FROM

       employees e,

       employees m

WHERE

       e.manager_id = m.employee_id;


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在本文中將介紹如何通過thrift 組件集成到surging 微服務引擎中,然後可以選擇dotnetty 或thrift作為服務遠程調用RPC,也可以通過其它語言的thrift 調用surging 服務,下麵將簡單介紹如何使用thrift 準備工作 首先需要到官網下載Thrift compiler ...
  • 0. 前言 為什麼我們需要異常處理?什麼是異常? 在漢語中,異常指非正常的;不同於平常的。翻譯到程式中,就是指會導致程式無法按照既定邏輯運行的意外,或者說是錯誤。可能會有小伙伴好奇了,我們的程式不是正常的嗎,為什麼還會出錯呢? 我來舉幾個例子: 1. 程式需要訪問一個文件,但這個文件不存在,當程式嘗 ...
  • 前兩天跟大家分享了一篇關於如何利用FastDFS組件來自建分散式文件系統的文章,有興趣的朋友可以閱讀下《 "用asp.net core結合fastdfs打造分散式文件存儲系統" 》。通過留言發現大家雖然感興趣,但是都覺得部署比較麻煩。的確,fastdfs的部署很繁瑣,而且也沒有官方提供的針對.net ...
  • 當你在自己平臺進行測試的時候,需要告訴討論的對方自己的型號,配置;這樣maintainer 才能分析你測試的合理性: macos 獲取自身的cpu型號,可以使用sysctl 命令: ➜ ~ sysctl -a | grep brand_string linux 平臺,可以直接在 /proc/cpui ...
  • 最近 CentOS 系統,內部裝了許多軟體,導致磁碟空間大小不足,因此需要對系統的磁碟空間進行擴充。 1.虛擬機擴展磁碟容量 這裡填寫最終的磁碟大小,點擊擴展。 這裡的擴展只是增加了操作系統的磁碟空間,並沒有與系統內部的文件目錄掛載,所以,磁碟占有量還是不會變化,下一步就是要把擴展的容量掛載到文件目 ...
  • ngx_http_ssl_module簡介 為https提供支持 ngx_http_ssl_module參數解釋 1. ssl on|off; 2. ssl_certificate file; 當前虛擬主機使用PEM格式的證書文件 3. ssl_certificate_key file; 當前虛擬主 ...
  • 前言:在網上找了很多的博客教程,最後終於成功,記錄一下,方便日後的查找。 https://blog.csdn.net/M_Kerry/article/details/81664548大部分根據這個鏈接操作就好。 註意MySQL這裡會遇到很多問題。 完全卸載MySQL、mariadb https:// ...
  • 最近發現了一個比較好用的代理客戶端,比較智能;名字叫clash: https://github.com/Dreamacro/clash https://github.com/yichengchen/clashX https://github.com/Fndroid/clash_for_windows ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...