好湿?好紧?好多水好爽自慰,久久久噜久噜久久综合,成人做爰A片免费看黄冈,机机对机机30分钟无遮挡

主頁 > 知識庫 > 從零開始學習SQL查詢語句執行順序

從零開始學習SQL查詢語句執行順序

熱門標簽:福建外呼電銷機器人加盟 400電話申請廠家現貨 中國地圖標注公司 昌德訊外呼系統 百度地圖標注要什么軟件 電話機器人的價格多少錢一個月 自己做地圖標注需要些什么 徐涇鎮騰訊地圖標注 天津公司外呼系統軟件

SQL查詢語句執行順序如下:

(7) SELECT 
(8) DISTINCT select_list>
(1) FROM left_table>
(3) join_type> JOIN right_table>
(2) ON join_condition>
(4) WHERE where_condition>
(5) GROUP BY group_by_list>
(6) HAVING having_condition>
(9) ORDER BY order_by_condition>
(10) LIMIT limit_number>

前期準備工作

1、新建一個測試數據庫

create database testData;

2、創建測試表,并插入數據如下:

用戶表


訂單表


準備SQL邏輯查詢測試語句

SELECT a.user_id,COUNT(b.order_id) as total_orders
FROM user as a
LEFT JOIN orders as b
ON a.user_id = b.user_id
WHERE a.city = 'beijing'
GROUP BY a.user_id
HAVING COUNT(b.order_id)  2
ORDER BY total_orders desc

使用上述SQL查詢語句來獲得來自北京,并且訂單數少于2的客戶;

在這些SQL語句的執行過程中,都會產生一個虛擬表,用來保存SQL語句的執行結果

一、執行FROM語句

第一步,執行FROM語句。我們首先需要知道最開始從哪個表開始的,這就是FROM告訴我們的。現在有了left_table>right_table>兩個表,我們到底從哪個表開始,還是從兩個表進行某種聯系以后再開始呢?它們之間如何產生聯系呢?——笛卡爾積

經過FROM語句對兩個表執行笛卡爾積,會得到一個虛擬表,VT1(vitual table 1),內容如下:


總共有28(user的記錄條數 * orders的記錄條數)條記錄。這就是VT1的結果,接下來的操作就在VT1的基礎上進行

二、執行ON過濾

執行完笛卡爾積以后,接著就進行ON a.user_id = b.user_id條件過濾,根據ON中指定的條件,去掉那些不符合條件的數據,得到VT2如下:

select * from user as a inner JOIN orders as b ON a.user_id = b.user_id;


三、添加外部行

這一步只有在連接類型為OUTER JOIN時才發生,如LEFT OUTER JOINRIGHT OUTER JOINFULL OUTER JOIN。在大多數的時候,我們都是會省略掉OUTER關鍵字的,但OUTER表示的就是外部行的概念。

LEFT OUTER JOIN把左表記為保留表:即左表的數據會被全部查詢出來,若右表中無對應數據,會用NULL來填充:


RIGHT OUTER JOIN把右表記為保留表:即右表的數據會被全部查詢出來,若左表中無對應數據,則用NULL補充;


FULL OUTER JOIN把左右表都作為保留表,但在Mysql中不支持全連接,可以通過以下方式實現全連接:

由于我在準備的測試SQL查詢邏輯語句中使用的是LEFT JOIN,得到的VT3表如下:


四、執行where條件過濾

對添加了外部行的數據進行where條件過濾,只有符合where_condition>條件的記錄會被篩選出來,執行WHERE a.city = 'beijing' 得到VT4如下:


但是在使用WHERE子句時,需要注意以下兩點:

1、由于數據還沒有分組,因此現在還不能在where過濾條件中使用where_condition=MIN(col)這類對分組統計的過濾;

2、由于還沒有進行列的選取操作,因此在select中使用列的別名也是不被允許的,如:select  city as c from table1 wherec='beijing' 是不允許的

五、執行group by分組語句

GROU BY子句主要是對使用WHERE子句得到的虛擬表進行分組操作,執行GROUP BY a.user_id得到VT5如下:


六、執行having

HAVING子句主要和GROUP BY子句配合使用,對分組得到VT5的數據進行條件過濾,執行 HAVING COUNT(b.order_id) 2,得到VT6如下:


七、select列表

現在才會執行到SELECT子句,不要以為SELECT子句被寫在第一行,就是第一個被執行的。

我們執行測試語句中的SELECT a.user_id,user_name,COUNT(b.order_id) as total_orders,從VT6中選擇出我們需要的內容,得到VT7如下:


八、執行distinct去重復數據

如果在查詢中指定了DISTINCT子句,則會創建一張內存臨時表(如果內存放不下,就需要存放在硬盤了)。這張臨時表的表結構和上一步產生的虛擬表是一樣的,不同的是對進行DISTINCT操作的列增加了一個唯一索引,以此來除重復數據。測試SQL中沒有DISTINCT字句,所以不會執行

九、執行order by字句

對虛擬表VT7中的內容按照指定的列進行排序,然后返回一個新的虛擬表,我們執行測試SQL語句中的ORDER BY total_orders DESC ,得到結果如下:

DESC倒序排序,ASC升序排序


十、執行limit字句

LIMIT子句從上一步得到的虛擬表中選出從指定位置開始的指定行數據,常用來做分頁;

MySQL數據庫的LIMIT支持如下形式的選擇:limit n,m

表示從第n條記錄開始選擇m條記錄。對于小數據,使用LIMIT子句沒有任何問題,當數據量非常大的時候,使用LIMIT n, m是非常低效的。因為LIMIT的機制是每次都是從頭開始掃描,如果需要從第60萬行開始,讀取3條數據,就需要先掃描定位到60萬行,然后再進行讀取,而掃描的過程是一個非常低效的過程。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

您可能感興趣的文章:
  • SQL語句執行順序圖文介紹
  • SQL語句執行順序詳解
  • SQL語句執行深入講解(MySQL架構總覽->查詢執行流程->SQL解析順序)
  • 關于SQL語句中的AND和OR執行順序遇到的問題
  • 一文告訴你Sql的執行順序是怎樣的

標簽:梅河口 駐馬店 黔西 昌都 北京 鄂爾多斯 陜西 荊門

巨人網絡通訊聲明:本文標題《從零開始學習SQL查詢語句執行順序》,本文關鍵詞  從,零,開始,學習,SQL,查詢,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《從零開始學習SQL查詢語句執行順序》相關的同類信息!
  • 本頁收集關于從零開始學習SQL查詢語句執行順序的相關信息資訊供網民參考!
  • 推薦文章
    主站蜘蛛池模板: 亚洲欧美日韩一区超高清| 毛片免费看到爽| 嫩草影院久久国产精品| 美女图片扒开腿三点式| 啊用力斯嘉丽快点翘臀| 国产私拍福利精品视频推出| 老妇毛片| 操肥妇| 欧美国产一区二区三区| 2021精品国夜夜天天拍拍| 我的老公是她的恋人| 男人的??伸到??屁股外网| 女被c黄扒衣服作文| 立川理惠vs黑人巨大| 国产精品???国产男男| 欧美欧洲性色老头老妇| 中文字幕在线观看一区| 中文字幕在线久热精品| 二十八岁未成年在线播放免费| 粗一硬一长一进一爽一A片| 欧美高清360| 污软件网站| 亚洲人成无码A片色哟呦红楼| 97精品福利一区二区三区在线| 苏桃情事(高H)全文| 欧美在线免费播放| 宝宝你好大我握不住| 亚洲乱码一级婬乱A片3A片小说 | 男男年下H高肉爽文| 一级做a爰片性色毛片武则天| 久久久久久精品国产三级秦老师| 女同啪啪免费网站www| www.免费视频.com| 在高铁上被要了好多次| 国产国产精品人在线视| 久久中文字幕不卡一二区| 电影色戒在线| 欧美成人高清性色生活| 美女穿着白丝袜让我桶| 欧美另类护士videos| 今天你睡了吗红烧肉|