婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > 有關mysql中sql的執行順序的小問題

有關mysql中sql的執行順序的小問題

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

今天工作中碰到一個sql問題,關于left join的,后面雖然解決了,但是通過此問題了解了一下sql的執行順序

場景還原

為避免安全糾紛,把場景模擬。

有一個學生表-S,一個成績表G

CREATE TABLE `test_student` (
 `id` bigint(20) NOT NULL COMMENT '學號',
	`sex` TINYINT DEFAULT '0' COMMENT '性別 0-男 1-女',
 `name` varchar(255) DEFAULT NULL COMMENT '姓名'
) ENGINE=InnoDB CHARSET=utf8mb4 COMMENT='學生表';
 
CREATE TABLE `test_score` (
 `id` bigint(20) NOT NULL COMMENT '學號',
 `score` int NOT NULL COMMENT '分數',
	`level` TINYINT COMMENT '成績 0-不及格 1-及格 2-優良 3-優秀'
) ENGINE=InnoDB CHARSET=utf8mb4 COMMENT='成績表';
 
-- 初始化學生
INSERT INTO test_student VALUES(1, 0, '張三'), (2, 0, '李四'), (3, 1, '王X芳');
-- 初始化成績
INSERT INTO test_score VALUES(1, 10, 0), (2, 20, 0), (3, 100, 3);

現在有一個需求,查出學生的考試成績,可能的sql

SELECT ts.name AS '名字', tc.score AS '分數'
FROM test_student ts
LEFT JOIN test_score tc
ON ts.id = tc.s_id;

一切都很順利,突然,剛考完試,就轉來一個學生

INSERT INTO test_student VALUES(4, 0, '新來的');

他沒成績,還是剛才的sql查

老師只要看參加考試的學生的成績,怎么辦

1.用inner join

SELECT ts.name AS '名字', tc.score AS '分數'
FROM test_student ts
INNER JOIN test_score tc
ON ts.id = tc.s_id;

2.加條件過濾

SELECT ts.name AS '名字', tc.score AS '分數'
FROM test_student ts
LEFT JOIN test_score tc
ON ts.id = tc.s_id
AND tc.score is NOT NULL
;

發現加了條件過濾還是不對,額,改用where呢

SELECT ts.name AS '名字', tc.score AS '分數'
FROM test_student ts
LEFT JOIN test_score tc
ON ts.id = tc.s_id
WHERE tc.score is NOT NULL
;

bingo,那where為什么就對了呢。

這就涉及到sql的執行順序了

where與join on

從上面的例子推斷

where會從結果集中過濾出符合條件的記錄,不符合條件的丟棄

join操作:有時為了得到完整的結果,我們需要從兩個或更多的表中獲取結果。我們就需要執行 join。

除了我們在上面的例子中使用的 INNER JOIN(內連接),我們還可以使用其他幾種連接。

下面列出了您可以使用的 JOIN 類型,以及它們之間的差異。

  • JOIN: 如果表中有至少一個匹配,則返回行
  • LEFT JOIN: 即使右表中沒有匹配,也從左表返回所有的行
  • RIGHT JOIN: 即使左表中沒有匹配,也從右表返回所有的行
  • FULL JOIN: 只要其中一個表中存在匹配,就返回行(mysql不支持,可以考慮用視圖實現)

這里推薦一個寫的通俗易懂的簡單學習SQL的各種連接Join

sql順序

從上面看到,在sql中,on是寫在了where條件之前,那么數據庫引擎分析執行sql時,是否on也是在where前面呢?

一般sql的寫法順序

1.SELECT [列名稱 *代表所有的列]

2.FROM [表名稱]

3.join_type JOIN [表名稱]

4.ON [join條件]

5.WHERE [過濾條件]

6.GROUP BY [分組字段]

7.HAVING [分組條件]

8.ORDER BY [排序字段]

那么sql在執行時,順序是怎樣的呢?

標準的sql解析順序為:

1.FROM    組裝數據,來自不同數據源(表)

2.WHERE    根據條件過濾記錄

3.GROUP BY 對數據分組

4.計算聚集函數,如avg,sum

5.使用HAVING子句篩選分組

6.計算所有表達式

7.使用ORDER BY對結果排序

那么sql的執行順序呢?

1.FROM: 對前2個表執行笛卡爾積,生成虛表vt1

2.ON: 對vt1應用on條件,只有滿足join_condition條件的才能插入虛表vt2

3.OUTER(join):如果指定了OUTER JOIN保留表(preserved table)中未找到的行將行作為外部行添加到vt2,生成t3,如果from包含兩個以上表,則對上一個聯結生成的結果表和下一個表重復執行步驟和步驟直接結束

4.WHERE: 對vt3進行where篩選,只有滿足where條件的才能插入vt4

5.GROUP BY: 對vt4按group by字段分組,得到vt5

6.HAVING:對vt5應用HAVING篩選器只有使 having_condition 為true的組才插入vt6

7.SELECT:處理select列表產生vt7

8.DISTINCT:將重復的行從vt7中去除產生vt8

9.ORDER BY:將vt8的行按order by子句中的列 列表排序生成一個游標vc9

10.LIMIT(Mysql): 從vc9的開始處選擇指定數量的行生成vt10 并返回調用者

到了這里,應該發現,要寫好sql不容易。但是了解了sql的執行順序,能在開發的同理,更好的幫助寫出好的程序。

比如join表不能太多(先過濾條件然后再根據表連接 同時在表中建立相關查詢字段的索引這樣在大數據多表聯合查詢的情況下速度相當快),這種sql優化問題,下次再學習整理下。

實踐之!

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

您可能感興趣的文章:
  • MySQL語句執行順序和編寫順序實例解析
  • mysql代碼執行結構實例分析【順序、分支、循環結構】
  • 簡單了解mysql語句書寫和執行順序
  • 簡單了解MySQL SELECT執行順序
  • SQL語句執行深入講解(MySQL架構總覽->查詢執行流程->SQL解析順序)
  • sql和MySQL的語句執行順序分析
  • 淺談mysql執行過程以及順序

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

巨人網絡通訊聲明:本文標題《有關mysql中sql的執行順序的小問題》,本文關鍵詞  有關,mysql,中,sql,的,執行,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《有關mysql中sql的執行順序的小問題》相關的同類信息!
  • 本頁收集關于有關mysql中sql的執行順序的小問題的相關信息資訊供網民參考!
  • 推薦文章
    主站蜘蛛池模板: 馆陶县| 呼伦贝尔市| 会理县| 灯塔市| 青海省| 唐山市| 连山| 滦平县| 特克斯县| 花垣县| 衡南县| 古蔺县| 涿州市| 龙里县| 蓝田县| 蚌埠市| 鹤壁市| 胶南市| 集贤县| 池州市| 元谋县| 望奎县| 屏山县| 老河口市| 改则县| 成都市| 三河市| 南投市| 滨海县| 南皮县| 桂阳县| 临澧县| 凤翔县| 土默特左旗| 芦溪县| 南平市| 龙南县| 孝昌县| 逊克县| 南康市| 清河县|