sql基礎語法複習(二)-- 分組,連接的使用

来源:http://www.cnblogs.com/qq765065332/archive/2017/11/15/7830937.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
更多相關文章
  • 什麼是變數:存放物體的一個容器,以便後續利用該容器存放的物體。 變數的聲明及賦值: 聲明變數關鍵字var; 變數名的規範:變數名由英文字母、數字、下劃線、美元符號組成,但是首字母只能是英文字母、下劃線、美元符號; 聲明變數使用單一var模式(多個變數只用一個var,因為每出現一個var就需要向系統請 ...
  • 閉包是javascript中一個十分常見但又很難掌握的概念,無論是自己寫代碼還是閱讀別人的代碼都會接觸到大量閉包。之前也沒有系統學習過,最近系統地總結了一些閉包的使用方法和使用場景,這裡做個記錄,希望大家指正補充。 一、定義 《JavaScript忍者秘籍》中對於閉包的定義是這樣的: 閉包是一個函數 ...
  • CSS中關於P標簽中的樣式: 1、font-family:瀏覽器在顯示字體的時候,依次判斷是否支持當前的字體,直到最後的字體系列。 font-family:"宋體","仿宋",sans-serif; 瀏覽器若不支持宋體,則用仿宋;若不支持仿宋,則在sans-serif中找。 2、font-weigh ...
  • koa模塊 koa-route 路由 route.get("路徑",路由函數) koa-static 靜態資源載入 const serve(路徑) koa-compose 中間件合成模塊 koa-body 提取表單post請求鍵值對,處理上傳文件 上下文context的response和reques ...
  • 一、概要 這份彙總整理,很程度上參考了GitHub最全前端資源彙總;雲集前端教程、開發資源、免費書籍、手冊規範、求職面試等等,旨在為前端學習 & 技能提升提供方便。當然,並不期望這成為一個前端武學收藏夾;畢竟,只有自己掌握,才是真正擁有;況且前端發展如火如荼,日新月異。這裡會儘量保持探索 & 學習 ...
  • 註:入坑內容來源於易百教程,這隻是自己學習路上的經驗總結...(附上易百教程網址:http://www.yiibai.com/mysql/) MySQL導入示例資料庫(http://www.yiibai.com/mysql/how-to-load-sample-database-into-mysql ...
  • http://blog.csdn.net/mr_green1024/article/details/53222526 ...
  • 簡單總結下Oracle/MySql/SQL Sqlserver這三個資料庫的分頁查詢語句 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...