欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

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

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

創(chuàng)新互聯(lián)專注于寧晉網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗。 熱誠為您提供寧晉營銷型網(wǎng)站建設(shè),寧晉網(wǎng)站制作、寧晉網(wǎng)頁設(shè)計、寧晉網(wǎng)站官網(wǎng)定制、重慶小程序開發(fā)服務(wù),打造寧晉網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供寧晉網(wǎng)站排名全網(wǎng)營銷落地服務(wù)。

場景還原

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

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

CREATE TABLE `test_student` (
 `id` bigint(20) NOT NULL COMMENT '學(xué)號',
	`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é)號',
 `score` int NOT NULL COMMENT '分?jǐn)?shù)',
	`level` TINYINT COMMENT '成績 0-不及格 1-及格 2-優(yōu)良 3-優(yōu)秀'
) ENGINE=InnoDB CHARSET=utf8mb4 COMMENT='成績表';
 
-- 初始化學(xué)生
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);

現(xiàn)在有一個需求,查出學(xué)生的考試成績,可能的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;

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

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

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

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

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

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

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.加條件過濾

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
;

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

發(fā)現(xiàn)加了條件過濾還是不對,額,改用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
;

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

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

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

where與join on

從上面的例子推斷

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

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

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

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

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

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

sql順序

從上面看到,在sql中,on是寫在了where條件之前,那么數(shù)據(jù)庫引擎分析執(zhí)行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在執(zhí)行時,順序是怎樣的呢?

標(biāo)準(zhǔn)的sql解析順序為:

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

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

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

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

5.使用HAVING子句篩選分組

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

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

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

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

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

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

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

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

6.HAVING:對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子句中的列 列表排序生成一個游標(biāo)vc9

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

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

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

實踐之!

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持創(chuàng)新互聯(lián)。

網(wǎng)頁標(biāo)題:有關(guān)mysql中sql的執(zhí)行順序的小問題
轉(zhuǎn)載注明:http://aaarwkj.com/article42/jessec.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站收錄云服務(wù)器、用戶體驗品牌網(wǎng)站設(shè)計、軟件開發(fā)、靜態(tài)網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

商城網(wǎng)站建設(shè)
久久免费少妇高潮99精品| 国产精品18禁一区二区三区| 日韩久久这里只有精品视频| 日本加勒比中文在线观看| 日韩中文字幕视频久久| 久久亚洲精品国产精品黑人| 免费人成网站视频在线观看不卡| 久久三级中文欧大战字幕| 久久久久久97精品| 亚洲欧美综合一区二区三区| 亚洲伊人久久一区二区| 亚洲欧美精品专区久久| 亚洲日本成人一区二区| 国产精品久久久99| 精品人妻一区二区三区观看| 国产一区丝袜高跟在线| 国产日韩亚洲欧美在线| 一本大道东京热无码AⅤ片| 欧美日韩男女性生活视频| 热热久久这里只有精品| 91精品午夜在线观看| 国产欧洲日本一区二区| 日本欧美三级一二三区| 麻豆午夜福利在线播放| 欧美日韩一级一区二区三区| 欧美日韩黄片免费在线观看| 真做的欧美三级在线观看| 亚洲va在线va天堂va在线| 精品人妻系列一区二区| 免费搜索国产男女视频| 欧美丰满老妇性猛交| 欧美又粗又成人大视频| 亚洲午夜福利影院在线免费观看| 亚洲欧美制服另类国产| 最美是你免费视频观看| 青青青在线视频观看华人| 五十路六十路美熟人妻| 日韩女优中文字幕在线播放| 日本韩国亚洲欧美一区二区| 久久精品一区二区婷婷| 日韩欧美亚洲精品中文字幕αv|