最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

有關(guān)mysql中sql的執(zhí)行順序的小問(wèn)題

 更新時(shí)間:2019年05月22日 08:42:20   作者:kobe_t  
在MySQL中我們可能會(huì)遇到一些關(guān)于執(zhí)行順序的問(wèn)題,下面小編就來(lái)帶大家了解一下原因以及如何解決

今天工作中碰到一個(gè)sql問(wèn)題,關(guān)于left join的,后面雖然解決了,但是通過(guò)此問(wèn)題了解了一下sql的執(zhí)行順序

場(chǎng)景還原

為避免安全糾紛,把場(chǎng)景模擬。

有一個(gè)學(xué)生表-S,一個(gè)成績(jī)表G

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

現(xiàn)在有一個(gè)需求,查出學(xué)生的考試成績(jī),可能的sql

SELECT ts.name AS '名字', tc.score AS '分?jǐn)?shù)'
FROM test_student ts
LEFT JOIN test_score tc
ON ts.id = tc.s_id;

一切都很順利,突然,剛考完試,就轉(zhuǎn)來(lái)一個(gè)學(xué)生

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

他沒(méi)成績(jī),還是剛才的sql查

老師只要看參加考試的學(xué)生的成績(jī),怎么辦

1.用inner join

SELECT ts.name AS '名字', tc.score AS '分?jǐn)?shù)'
FROM test_student ts
INNER JOIN test_score tc
ON ts.id = tc.s_id;

2.加條件過(guò)濾

SELECT ts.name AS '名字', tc.score AS '分?jǐn)?shù)'
FROM test_student ts
LEFT JOIN test_score tc
ON ts.id = tc.s_id
AND tc.score is NOT NULL
;

發(fā)現(xiàn)加了條件過(guò)濾還是不對(duì),額,改用where呢

SELECT ts.name AS '名字', tc.score AS '分?jǐn)?shù)'
FROM test_student ts
LEFT JOIN test_score tc
ON ts.id = tc.s_id
WHERE tc.score is NOT NULL
;

bingo,那where為什么就對(duì)了呢。

這就涉及到sql的執(zhí)行順序了

where與join on

從上面的例子推斷

where會(huì)從結(jié)果集中過(guò)濾出符合條件的記錄,不符合條件的丟棄

join操作:有時(shí)為了得到完整的結(jié)果,我們需要從兩個(gè)或更多的表中獲取結(jié)果。我們就需要執(zhí)行 join。

除了我們?cè)谏厦娴睦又惺褂玫?INNER JOIN(內(nèi)連接),我們還可以使用其他幾種連接。

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

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

這里推薦一個(gè)寫(xiě)的通俗易懂的簡(jiǎn)單學(xué)習(xí)SQL的各種連接Join

sql順序

從上面看到,在sql中,on是寫(xiě)在了where條件之前,那么數(shù)據(jù)庫(kù)引擎分析執(zhí)行sql時(shí),是否on也是在where前面呢?

一般sql的寫(xiě)法順序

1.SELECT [列名稱(chēng) *代表所有的列]

2.FROM [表名稱(chēng)]

3.join_type JOIN [表名稱(chēng)]

4.ON [join條件]

5.WHERE [過(guò)濾條件]

6.GROUP BY [分組字段]

7.HAVING [分組條件]

8.ORDER BY [排序字段]

那么sql在執(zhí)行時(shí),順序是怎樣的呢?

標(biāo)準(zhǔn)的sql解析順序?yàn)椋?/strong>

1.FROM    組裝數(shù)據(jù),來(lái)自不同數(shù)據(jù)源(表)

2.WHERE    根據(jù)條件過(guò)濾記錄

3.GROUP BY 對(duì)數(shù)據(jù)分組

4.計(jì)算聚集函數(shù),如avg,sum

5.使用HAVING子句篩選分組

6.計(jì)算所有表達(dá)式

7.使用ORDER BY對(duì)結(jié)果排序

那么sql的執(zhí)行順序呢?

1.FROM: 對(duì)前2個(gè)表執(zhí)行笛卡爾積,生成虛表vt1

2.ON: 對(duì)vt1應(yīng)用on條件,只有滿(mǎn)足join_condition條件的才能插入虛表vt2

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

4.WHERE: 對(duì)vt3進(jìn)行where篩選,只有滿(mǎn)足where條件的才能插入vt4

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

6.HAVING:對(duì)vt5應(yīng)用HAVING篩選器只有使 having_condition 為true的組才插入vt6

7.SELECT:處理select列表產(chǎn)生vt7

8.DISTINCT:將重復(fù)的行從vt7中去除產(chǎn)生vt8

9.ORDER BY:將vt8的行按order by子句中的列 列表排序生成一個(gè)游標(biāo)vc9

10.LIMIT(Mysql): 從vc9的開(kāi)始處選擇指定數(shù)量的行生成vt10 并返回調(diào)用者

到了這里,應(yīng)該發(fā)現(xiàn),要寫(xiě)好sql不容易。但是了解了sql的執(zhí)行順序,能在開(kāi)發(fā)的同理,更好的幫助寫(xiě)出好的程序。

比如join表不能太多(先過(guò)濾條件然后再根據(jù)表連接 同時(shí)在表中建立相關(guān)查詢(xún)字段的索引這樣在大數(shù)據(jù)多表聯(lián)合查詢(xún)的情況下速度相當(dāng)快),這種sql優(yōu)化問(wèn)題,下次再學(xué)習(xí)整理下。

實(shí)踐之!

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 數(shù)據(jù)庫(kù)索引的知識(shí)點(diǎn)整理小結(jié),你所需要了解的都在這兒了

    數(shù)據(jù)庫(kù)索引的知識(shí)點(diǎn)整理小結(jié),你所需要了解的都在這兒了

    這篇文章主要介紹了數(shù)據(jù)庫(kù)索引的知識(shí)點(diǎn)整理小結(jié),你所需要了解的都在這兒了,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-07-07
  • MySQL中如何開(kāi)啟二進(jìn)制日志(Binlog)

    MySQL中如何開(kāi)啟二進(jìn)制日志(Binlog)

    本文詳細(xì)介紹了如何在不同操作系統(tǒng)(Windows、Linux、Docker)下開(kāi)啟MySQL的二進(jìn)制日志(Binlog),包括停止MySQL服務(wù)、編輯配置文件、創(chuàng)建日志文件目錄、啟動(dòng)服務(wù)以及驗(yàn)證Binlog是否開(kāi)啟
    2025-03-03
  • Ubuntu移除mysql后重新安裝的方法

    Ubuntu移除mysql后重新安裝的方法

    這篇文章主要介紹了Ubuntu移除mysql后重新安裝的方法,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-04-04
  • MySQL使用C語(yǔ)言連接完整代碼樣例

    MySQL使用C語(yǔ)言連接完整代碼樣例

    這篇文章主要介紹了如何使用C語(yǔ)言連接MySQL數(shù)據(jù)庫(kù),包括安裝MySQL連接庫(kù)、初始化MySQL、連接數(shù)據(jù)庫(kù)、執(zhí)行SQL查詢(xún)、獲取查詢(xún)結(jié)果、關(guān)閉連接等步驟,并提供了完整的代碼示例,需要的朋友可以參考下
    2025-03-03
  • MySQL中distinct語(yǔ)句的基本原理及其與group by的比較

    MySQL中distinct語(yǔ)句的基本原理及其與group by的比較

    這篇文章主要介紹了MySQL中distinct語(yǔ)句的基本原理及其與group by的比較,一般情況下來(lái)說(shuō)group by和distinct的實(shí)現(xiàn)原理相近且性能稍好,需要的朋友可以參考下
    2016-01-01
  • Mysql臨時(shí)表及分區(qū)表區(qū)別詳解

    Mysql臨時(shí)表及分區(qū)表區(qū)別詳解

    這篇文章主要介紹了Mysql臨時(shí)表及分區(qū)表區(qū)別詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-09-09
  • SQL SERVER 日期格式轉(zhuǎn)換詳解

    SQL SERVER 日期格式轉(zhuǎn)換詳解

    本篇文章是對(duì)SQL SERVER 日期格式轉(zhuǎn)換進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-06-06
  • MySQL中的常用函數(shù)及用法總結(jié)

    MySQL中的常用函數(shù)及用法總結(jié)

    MySQL是一種常用的關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng),它提供了許多內(nèi)置函數(shù)來(lái)處理數(shù)據(jù),本文將介紹MySQL中的各種常用函數(shù),包括字符串函數(shù)、日期函數(shù)、數(shù)學(xué)函數(shù)、聚合函數(shù)等,需要的朋友可以參考下
    2023-06-06
  • MySQL的LEFT JOIN表連接的進(jìn)階學(xué)習(xí)教程

    MySQL的LEFT JOIN表連接的進(jìn)階學(xué)習(xí)教程

    這篇文章主要介紹了MySQL的LEFT JOIN表連接的進(jìn)階學(xué)習(xí)教程,包括對(duì)左連接的查詢(xún)效率分析以及相關(guān)建議,需要的朋友可以參考下
    2015-12-12
  • MySQL InnoDB 事務(wù)鎖源碼分析

    MySQL InnoDB 事務(wù)鎖源碼分析

    InnoDB 事務(wù)鎖,事務(wù)鎖實(shí)現(xiàn)起來(lái)的代碼卻是又臭又硬的好大一坨,各種細(xì)節(jié),今天小編在這里整理一個(gè)源碼閱讀筆記,把那一坨加鎖相關(guān)的代碼提煉出來(lái),感興趣的小伙伴別忘記收藏奧
    2021-09-09

最新評(píng)論

隆安县| 米林县| 富阳市| 务川| 扎兰屯市| 莲花县| 合山市| 阿图什市| 青阳县| 丰顺县| 原平市| 西乌珠穆沁旗| 亳州市| 浦县| 崇阳县| 泰和县| 东至县| 大姚县| 年辖:市辖区| 通榆县| 扎赉特旗| 沅江市| 明溪县| 平定县| 巴楚县| 平舆县| 扬中市| 尖扎县| 绥江县| 政和县| 锡林浩特市| 峨山| 荣成市| 杂多县| 舞钢市| 遵化市| 邓州市| 青铜峡市| 南木林县| 潜江市| 台东市|