MySQL分組、鏈接的使用

来源:http://www.cnblogs.com/fengdejiyixx/archive/2017/12/05/7988963.html
-Advertisement-
Play Games

一、深入學習 group by group by ,分組,顧名思義,把數據按什麼來分組,每一組都有什麼特點。 1、我們先從最簡單的開始: select count(*) from tb1 group by tb1.sex; 查詢所有數據的條數,按性別來分組。這樣查詢到的結果集只有一列count(*) ...


一、深入學習  group by

  group by ,分組,顧名思義,把數據按什麼來分組,每一組都有什麼特點。

  1、我們先從最簡單的開始:

    select count(*) from tb1 group by tb1.sex;

    查詢所有數據的條數,按性別來分組。這樣查詢到的結果集只有一列count(*)。

  2、然後我們來分析一下,這個分組,我們能在select 和 from 之間放一些什麼呢?

    當數據分組之後,數據的大部分欄位都將失去它存在的意義,大家想想,多條數據的同一列,只顯示一個值,那到底顯示誰的,這個值有用嗎?

    通過思考,不難發現,只有by的那些列可以放進去,然後就是sql的函數操作了,比如count(),sum()……(包含在by後面作為分組的依據,包含在聚合函數中作為結果)

    例:查詢每個學院的學生有多少人:(學院的值是學院的id)

      SELECT a.COLLEGE AS 學院,COUNT(*)  AS 學生人數  FROM base_alumni a GROUP BY a.COLLEGE;

       

  3、where,having,和group by聯合使用

    在最初學習group by的時候,我就陷入了一個誤區,那就是group by不能和where一起使用,只能用having……

    看書不認真啊,其實它們都是可以一起使用的,只不過是where只能在group by 的前面,having只能在group by 的後面。

    where,過濾條件的關鍵字,但是它只能對group by之前的數據進行過濾篩選;

    having,也是過濾條件的關鍵字作用和where是一樣的,但是它過濾的是分組後的數據,就是對分組後得到的結果集進行過濾篩選。

    出現having其實我覺得就是為瞭解決一條語句出現兩個where的問題,把它們區分開來

    例:

      查詢 30100學院的每個專業的學生有多少人。

      SELECT a.MAJOR AS 專業, COUNT(*) AS 學生人數 FROM base_alumni a WHERE a.COLLEGE = 30100 GROUP BY a.MAJOR;

      

      查詢每個學院的學生有多少人,並且只要學生人數大於3的。

      SELECT a.COLLEGE AS 學院,COUNT(*)  AS 學生人數  FROM base_alumni a GROUP BY a.COLLEGE HAVING COUNT(*)>3;

       

     濾清執行順序:①先對*進行篩選,②對篩選的結果進行分組,③對分組的結果進行篩選

  4、Group By All 的使用,哈哈哈哈,經常網上的查閱,我決定淘汰這個語法~

    其實就是前面where之後,想要分組的結果顯示不符合where的數據,當然,不做運算,運算結果用0或null表示,感覺這語法沒啥用,想不出應用場景~

二、深入學習  連接

  連接分4種,內連接,全連接,左外連接,右外連接

  https://www.cnblogs.com/afirefly/archive/2010/10/08/1845906.html

  1、連接出現的地方

    ①from和where之間,做表和表的連接

    ②where和having之間,having是對group by的結果集進行篩選,就是把group by的結果集作為一張表,然後可以再和別的表做連接,再進一步篩選

  2、連接類型解讀

    把表看成是一個集合,連接看成是映射,那麼它們的結果

    內連接:一一映射;全連接:笛卡爾乘積;左外連接:一一映射+左表對應右表的null;右外連接:一一映射+右表對應左表的null。

    關鍵字:

    內連接:inner join;全連接:cross join;左外連接:left join;右外連接:right join   。

    語法:

    表a   left join  表b  on  a.列1 = b.列2

  3、連接的使用

    之前學習group by的例子中,結果集是存在bug的。

    例:查詢每個學院的學生有多少人:(學院的值是學院的id),在沒有連接的時候,學院人數為0的是顯示不出來的,因為當前表中就沒有這個學院的信息

      那麼我們在這裡做一下左連接(左外連接):

      SELECT c.ID, a.COLLEGE, COUNT(a.COLLEGE) FROM (SELECT ID FROM dic_college) c LEFT JOIN ( SELECT COLLEGE FROM base_alumni ) a ON c.ID = a.COLLEGE GROUP BY c.ID

      我這裡是一個完整的語句了。我在寫出這條語句之前遇到了許多的磕磕碰碰。

    解讀它:

      我們先把學院表和校友信息表(學生表)做左連接

      因為我們要的是學院,所以學院作為主表,放left join的前面      c LEFT JOIN a ON ...

      然後我們發現有很多欄位,於是我們去掉多餘的欄位,這樣既方便我們觀察,也提高了sql的執行效率

        ①把學院表變成只有一個欄位(SELECT ID FROM dic_college) c

        ②把學生表變成只有一個欄位( SELECT COLLEGE FROM base_alumni ) a

      這時,查詢結果是這樣的

        SELECT * FROM (SELECT ID FROM dic_college) c LEFT JOIN ( SELECT COLLEGE FROM base_alumni ) a ON c.ID = a.COLLEGE

        

      這時候,對這個結果集進行分組:GROUP BY c.ID,並且查詢欄位要做更改

      在上邊那個結果集中,c.ID和a.COLLEGE是一一對應的,此時,count(*)的數據是總行數,因為我們的主表是學院表,所以這個數據和count(c.ID)的數據是一樣的。

      但是a.COLLEGE為空的行的數據中值都是1,這不是我們想要的,所以我們把count(*)改成count(a.COLLEGE),這樣數據就出來了。

        

    這才是查詢所有學院中每個學院的學生人數的正確答案!當然,上邊的截圖只是數據的前幾行,後面還有數據的

      

  4、經過我測試了一下……

    左連接和右連接……

      SELECT * FROM a LEFT JOIN  b ON b.ID = a.FK_ID;

      SELECT * FROM b RIGHT JOIN  a ON b.ID = a.FK_ID;

      這兩個語句的結果相同,它兩並沒有發現別的區別。

    全連接就是交叉連接,和不使用連接……

      SELECT * FROM c,a WHERE c.ID = a.FK_ID;

      SELECT * FROM c CROSS JOIN a ON c.ID = a.FK_ID;

      這兩個語句也沒有區別。

 


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

-Advertisement-
Play Games
更多相關文章
  • 演示產品下載地址:http://www.jinhusns.com ...
  • public class Person { public string FirstName{set;get;} public string LastName{set;get;} public Person(){} public Person(string firstName, string last... ...
  • 上拉電阻: 就是將不確定的信號通過一個電阻拉到高電平,同時此電阻起到一個限流的作用。 下拉電阻,就是下拉到低電平。 1、 OC 門要輸出高電平, 必須外部加上拉電阻才能正常使用, 其實 OC 門就相當於單片機 IO 的開漏輸出。2、 加大普通 IO 口的驅動能力。 標準 51 單片機的內部 IO 口 ...
  • 1、介紹 MySQL資料庫設置讀寫分離,可以使對資料庫的寫操作和讀操作在不同伺服器上執行,提高併發量和響應速度。現在的網站一般大點的,都採用有資料庫主從分離、讀寫分離,既起到備份作用也可以減輕資料庫的讀寫的壓力,一直聽說過這些,但是從來沒有親自動手實踐過,今天有時間實踐一下,記錄下過程。 2、環境準 ...
  • red hat 官方給出的team和bond特性對比 A Comparison of Features in Bonding and Team FeatureBondingTeam broadcast Tx policy Yes Yes round-robin Tx policy Yes Yes a ...
  • 前言 自己負責項目,簡單的搭建一個版本控制庫,選用linux 搭建SVN版本控制器作為公司的項目版本控制庫。廢話不多少,直接進入主題: 工具 yum yum命令是在Fedora和RedHat以及SUSE中基於rpm的軟體包管理器,它可以使系統管理人員交互和自動化地更細與管理RPM軟體包,能夠從指定的 ...
  • [20171205]uniq命令的輸入輸出.txt--//前幾天遇到XXD與通配符問題,鏈接http://blog.itpub.net/267265/viewspace-2147702/--//今天再次遇到uniq命令的輸入輸出問題.$ man uniqUNIQ(1) User Commands U ...
  • 1、關係數據操作 假設我們有兩張表。Table A 是左邊的表。Table B 是右邊的表。其各有四條記錄,其中有兩條記錄name是相同的,如下所示:讓我們看看不同JOIN的不同。 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...