邏輯查詢5步走~

来源:http://www.cnblogs.com/Gin-23333/archive/2016/02/23/5210465.html
-Advertisement-
Play Games

今天繼續發整理學習篇~查詢5步走,一步一回頭~ 通常來說查詢的順序呢~從 From -> Where -> Group By -> Select -> Order By 一般來說我們一個語句從查詢開始,藉助了 AdventureWorks2014 來舉例 SELECT TOP 50 a.Person


今天繼續發整理學習篇~查詢5步走,一步一回頭~

通常來說查詢的順序呢~從 From -> Where -> Group By -> Select -> Order By  

一般來說我們一個語句從查詢開始,藉助了 AdventureWorks2014 來舉例

SELECT TOP 50 a.PersonType,a.LastName,a.FirstName,c.CardNumber,c.CardType
    FROM Person.Person a
        INNER JOIN Sales.PersonCreditCard b ON a.BusinessEntityID = b.BusinessEntityID
        INNER JOIN Sales.CreditCard c ON b.CreditCardID = c.CreditCardID
    ORDER BY a.BusinessEntityID

 

1、首先,執行這個查詢,第一步首先會找到 From 

     在From 裡面,決定標識那些需要查詢和返回的表。如果說From 裡面還有表運算符 (比如join) ,那還需要從左到右去執行處理這些運算符。每次運算,都是將1個或者2個表進行運算輸入,返回一個輸出表。返回的輸出表作為再右邊的表的左輸入。以此類推。

最終的操作將為下一個操作作為輸入表。

     而每次的運算操作,都分為3個步驟

    1、1 第一步會將左右2個表做個連接  ~比方說 a (m 行) 和 b(n行) 做了連接,那首先就會先做出一個 m*n 的虛擬表出來,標識著這2個表參與了連接操作

    1、2 第二步會使用 on 來進行根據連接條件進行行篩選 ~ 這個就好理解羅~就是把連接條件是符合的挑選出來嘛~ 不過這裡註意null 值的判斷就可以

    1、3 第三步是添加外部行,這個步驟是將保留表中被過濾的行重新添加進去虛擬表。

       (*保留表 :我簡單理解就是 a left join b  則 a 為保留表, a right join b 則b 為保留表 a full join b 則 ab 同為保留表)

 

2、 從from 裡面標識了哪些行需要被檢索出來之後,到了第二步 where 篩選。

    (where的作用大家都知道了~我就不說了)

  從where 進行篩選,和通過第一步的篩選有什麼不一樣呢? 不一樣的地方在於。被 on 刷走的數據,有可能會通過添加外部行的時候從新添加到中間結果裡面,但是如果被where 刷走的行,則是沒有機會翻身了。這個是它們之間最大的區別

     還有就是,通過where 的篩選器的時候在select 之前,所以在where 的篩選裡面,不能使用列別名進行篩選。就是因為這是執行順序所決定的

3、  group by 和 having

      group by 也容易,就是將跟在 group by 之後的相同的 expression 值相同的,匯聚成一行進行顯示。

   having 嘛~就是對group by 之後聚合的結果可以使用having 進行一個篩選。

      因為 group by 和 having 也都是在 select 之前,所以並不能使用列別名,只能用表達式

 

4、select 

     通過select 來查出返回到用戶界面的實際數據到底是哪些列,哪些值

     4、1 首先是需要計算表達式,在select 裡面,是不允許有這種  select a+1 as b ,b+1 as c 即不允許應用列別名。 

    (*根據解釋,因為sql server 的運算是並行的,所以在查詢表達式的時候 a+1 和 b+1 是同時進行的,b+1 在運算的時候是不會知道別名b 是什麼值,而是直接拋錯)

  4、2 根據步驟4.1 計算出來的表達式,然後就取用 distinct 關鍵字去重~ distinct 是在這一步才發揮作用哦~

     4、3  最後是根據top 關鍵字決定是否全部返回結果集

 

5、Order by  

  Order By 是走到最後一步了~last shot 

  最後一步是通過 order by 決定返回的順序。這個時候因為order by 在select 之後,所以order by 就可以引用列別名,但是也再不能使用 別名之前的表達式了(除非表達式是一個欄位並且存在在表裡面)

     **關鍵點是通過order by 返回的數據,不是集合,是游標,是游標,是游標!!!這就是為什麼在子查詢,CTE等語句裡面,不允許在不使用top 的情況下使用 order by ,就是因為order by 改變了集合而成為了游標!

 

好~說完了,說得不好的地方請用力拍

 

參考:<SQL Server 技術內幕:T-Sql 查詢>

 


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

-Advertisement-
Play Games
更多相關文章
  • 最近一直都在搞新員工的培訓材料,MySQL的培訓PPT我居然寫了100多頁,我都佩服我自己的毅力了。不如現在把這些總結一下,慢慢寫到博客里,供入門者參考。 一 關係型資料庫 關係型資料庫的理論提出於上世紀七十年代,由IBM的研究員E.F.Codd的論文提出。 關係型資料庫的理論基礎可以參考王珊和薩師
  • 回到目錄 一些概念 分區表在oracle和sqlserver中都上存在的,當數據表的數據量過大時,上千萬,上億的數據,在進行數據查詢時需要顯得比較慢,性能很差,這時是時候引入分區表了,分區表顧名思義,就是把物理表用一些文件NDF進行分塊存儲,以緩減IO的壓力,因為當你的SQL文件過大的,這其實對系統
  • 一個小時內學習SQLite資料庫 2012-05-11 10:24 紅薯 OSCHINA 字型大小:T | T SQLite 是一個開源的嵌入式關係資料庫,實現自包容、零配置、支持事務的SQL資料庫引擎。 其特點是高度便攜、使用方便、結構緊湊、高效、可靠。 與其他資料庫管理系統不同,SQLite 的安裝
  • 這裡僅僅用到了一種方式而已,把資料庫文件備份到磁碟然後在恢復. /* 2: 通過SQL 語句備份資料庫 3: */ 4: BACKUP DATABASE mydb 5: TO DISK ='C:\DBBACK\mydb.BAK' 6: --這裡指定需要備份資料庫的路徑和文件名,註意:路徑的文件夾是必
  • Oracle 中對中文欄位進行排序通常有三種方式 1)按筆畫排序 select * from Table order by nlssort(columnName,'NLS_SORT=SCHINESE_STROKE_M') 2)按部首排序 select * from Table order by nl
  • 出處:http://www.cnblogs.com/cmsdn/archive/2012/04/25/2469568.html 以下SQL以防以後還需用到,特此備份 刪除一條留言信息會級聯刪除回覆信息,這時我們需要用到事務,如下SQL 1 ALTER PROCEDURE [dbo].[proc_tb
  • SQL Server代理是所有實時資料庫的核心。代理有很多不明顯的用法,因此系統的知識,對於開發人員還是DBA都是有用的。這系列文章會通俗介紹它的很多用法。 在這一系列的上一篇,我們看了使用代理帳戶模仿Windows安全上下文完成作業步驟的工作。大多數子系統支持代理賬戶,同時子系統限制代理賬戶, 要
  • 因為這篇文章寫的比較長一些,我就將總結先列出來 總結 1. 除了WHERE條件外,JOIN欄位除了記得建立索引,也要註意到選擇性的高低,如果真的找不到可用的欄位,可以考慮在兩邊關聯的表上加入super eky,再做JOIN如果單純想測試這個欄位的選擇性,可以透過這個語法SELECT 1 / CAST
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...