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
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...