亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數據庫 > SQL Server > 正文

sql中的left join及on、where條件關鍵字的區別詳解

2024-08-31 01:05:25
字體:
來源:轉載
供稿:網友

LEFT JOIN 關鍵字會從左表 (table_name1) 那里返回所有的行,即使在右表 (table_name2) 中沒有匹配的行。

LEFT JOIN 關鍵字語法

SELECT column_name(s)FROM table_name1LEFT JOIN table_name2 ON table_name1.column_name=table_name2.column_name

注釋:在某些數據庫中, LEFT JOIN 稱為 LEFT OUTER JOIN。

創建兩張表并插入一些數據

create table class( class_id int, class_name varchar(20), class_grade char(1));insert into class values (1,'語文','A');insert into class values (2,'數學','B');insert into class values (3,'英語','C');create table score( class_id int, stu_id varchar(20), Score int);insert into score values (1,'A001',91);insert into score values (2,'A001',95);insert into score values (1,'A002',82);insert into score values (2,'A002',87);insert into score values (3,'B003',65);

查看表中的數據

mysql> select * from class;+----------+------------+-------------+| class_id | class_name | class_grade |+----------+------------+-------------+|    1 | 語文    | A      ||    2 | 數學    | B      ||    3 | 英語    | C      |+----------+------------+-------------+3 rows in set (0.00 sec)mysql> select * from score;+----------+--------+-------+| class_id | stu_id | Score |+----------+--------+-------+|    1 | A001  |  91 ||    2 | A001  |  95 ||    1 | A002  |  82 ||    2 | A002  |  87 ||    3 | B003  |  65 |+----------+--------+-------+5 rows in set (0.00 sec)mysql>

比較下面幾組查詢結果

--如果你對left join足夠熟悉的話,先不要看結果,是否可以直接說出下面查詢的結果

mysql> select * from class A left join score B on A.class_id=B.class_id;+----------+------------+-------------+----------+--------+-------+| class_id | class_name | class_grade | class_id | stu_id | Score |+----------+------------+-------------+----------+--------+-------+|    1 | 語文    | A      |    1 | A001  |  91 ||    2 | 數學    | B      |    2 | A001  |  95 ||    1 | 語文    | A      |    1 | A002  |  82 ||    2 | 數學    | B      |    2 | A002  |  87 ||    3 | 英語    | C      |    3 | B003  |  65 |+----------+------------+-------------+----------+--------+-------+5 rows in set (0.00 sec)mysql> select * from class A left join score B on A.class_id=B.class_id and 1=1;+----------+------------+-------------+----------+--------+-------+| class_id | class_name | class_grade | class_id | stu_id | Score |+----------+------------+-------------+----------+--------+-------+|    1 | 語文    | A      |    1 | A001  |  91 ||    2 | 數學    | B      |    2 | A001  |  95 ||    1 | 語文    | A      |    1 | A002  |  82 ||    2 | 數學    | B      |    2 | A002  |  87 ||    3 | 英語    | C      |    3 | B003  |  65 |+----------+------------+-------------+----------+--------+-------+5 rows in set (0.01 sec)mysql> select * from class A left join score B on A.class_id=B.class_id and 1=0;+----------+------------+-------------+----------+--------+-------+| class_id | class_name | class_grade | class_id | stu_id | Score |+----------+------------+-------------+----------+--------+-------+|    1 | 語文    | A      |   NULL | NULL  | NULL ||    2 | 數學    | B      |   NULL | NULL  | NULL ||    3 | 英語    | C      |   NULL | NULL  | NULL |+----------+------------+-------------+----------+--------+-------+3 rows in set (0.00 sec)mysql> select * from class A left join score B on 1=0;+----------+------------+-------------+----------+--------+-------+| class_id | class_name | class_grade | class_id | stu_id | Score |+----------+------------+-------------+----------+--------+-------+|    1 | 語文    | A      |   NULL | NULL  | NULL ||    2 | 數學    | B      |   NULL | NULL  | NULL ||    3 | 英語    | C      |   NULL | NULL  | NULL |+----------+------------+-------------+----------+--------+-------+3 rows in set (0.00 sec)

mysql> left join的最重要特點是:不管on后面是什么條件,都會返回左表中的所有行!

mysql> select * from class A left join score B on A.class_id=B.class_id and A.class_name='語文';+----------+------------+-------------+----------+--------+-------+| class_id | class_name | class_grade | class_id | stu_id | Score |+----------+------------+-------------+----------+--------+-------+|    1 | 語文    | A      |    1 | A001  |  91 ||    1 | 語文    | A      |    1 | A002  |  82 ||    2 | 數學    | B      |   NULL | NULL  | NULL ||    3 | 英語    | C      |   NULL | NULL  | NULL |+----------+------------+-------------+----------+--------+-------+4 rows in set (0.00 sec)mysql> select * from class A left join score B on A.class_id=B.class_id and A.class_name='數學';+----------+------------+-------------+----------+--------+-------+| class_id | class_name | class_grade | class_id | stu_id | Score |+----------+------------+-------------+----------+--------+-------+|    2 | 數學    | B      |    2 | A001  |  95 ||    2 | 數學    | B      |    2 | A002  |  87 ||    1 | 語文    | A      |   NULL | NULL  | NULL ||    3 | 英語    | C      |   NULL | NULL  | NULL |+----------+------------+-------------+----------+--------+-------+4 rows in set (0.00 sec)mysql> select * from class A left join score B on A.class_id=B.class_id and A.class_name='英語';+----------+------------+-------------+----------+--------+-------+| class_id | class_name | class_grade | class_id | stu_id | Score |+----------+------------+-------------+----------+--------+-------+|    3 | 英語    | C      |    3 | B003  |  65 ||    1 | 語文    | A      |   NULL | NULL  | NULL ||    2 | 數學    | B      |   NULL | NULL  | NULL |+----------+------------+-------------+----------+--------+-------+3 rows in set (0.01 sec)mysql> select * from class A left join score B on A.class_id=B.class_id and A.class_name='體育';+----------+------------+-------------+----------+--------+-------+| class_id | class_name | class_grade | class_id | stu_id | Score |+----------+------------+-------------+----------+--------+-------+|    1 | 語文    | A      |   NULL | NULL  | NULL ||    2 | 數學    | B      |   NULL | NULL  | NULL ||    3 | 英語    | C      |   NULL | NULL  | NULL |+----------+------------+-------------+----------+--------+-------+3 rows in set (0.00 sec)mysql>

如果on后面的條件是左表中的列(and leftTable.colName='***'),左表中滿足條件的行和右表中的行進行匹配(根據on leftTable.id=rightTable.id);左表中不滿足條件的行,直接輸出,其對應的右表中的列都是null。

mysql> select * from class A left join score B on A.class_id=B.class_id and B.Score=90;+----------+------------+-------------+----------+--------+-------+| class_id | class_name | class_grade | class_id | stu_id | Score |+----------+------------+-------------+----------+--------+-------+|    1 | 語文    | A      |   NULL | NULL  | NULL ||    2 | 數學    | B      |   NULL | NULL  | NULL ||    3 | 英語    | C      |   NULL | NULL  | NULL |+----------+------------+-------------+----------+--------+-------+3 rows in set (0.01 sec)mysql> select * from class A left join score B on A.class_id=B.class_id and B.Score=65;+----------+------------+-------------+----------+--------+-------+| class_id | class_name | class_grade | class_id | stu_id | Score |+----------+------------+-------------+----------+--------+-------+|    3 | 英語    | C      |    3 | B003  |  65 ||    1 | 語文    | A      |   NULL | NULL  | NULL ||    2 | 數學    | B      |   NULL | NULL  | NULL |+----------+------------+-------------+----------+--------+-------+3 rows in set (0.01 sec)mysql>

如果on后面的條件是右表中的列(and rightTable.colName='***'),首先會根據(and rightTable.colName='***')過濾掉右表中不滿足條件的行;然后,左表中的行根據(on leftTable.id=rightTable.id)和右表中滿足條件的行進行匹配。

mysql> select * from class A left join score B on A.class_id=B.class_id and A.class_name='語文' and B.Score=90;+----------+------------+-------------+----------+--------+-------+| class_id | class_name | class_grade | class_id | stu_id | Score |+----------+------------+-------------+----------+--------+-------+|    1 | 語文    | A      |   NULL | NULL  | NULL ||    2 | 數學    | B      |   NULL | NULL  | NULL ||    3 | 英語    | C      |   NULL | NULL  | NULL |+----------+------------+-------------+----------+--------+-------+3 rows in set (0.00 sec)mysql> select * from class A left join score B on A.class_id=B.class_id and A.class_name='語文' and B.Score=91;+----------+------------+-------------+----------+--------+-------+| class_id | class_name | class_grade | class_id | stu_id | Score |+----------+------------+-------------+----------+--------+-------+|    1 | 語文    | A      |    1 | A001  |  91 ||    2 | 數學    | B      |   NULL | NULL  | NULL ||    3 | 英語    | C      |   NULL | NULL  | NULL |+----------+------------+-------------+----------+--------+-------+3 rows in set (0.01 sec)mysql> select * from class A left join score B on A.class_id=B.class_id and A.class_name='體育' and B.Score=90;+----------+------------+-------------+----------+--------+-------+| class_id | class_name | class_grade | class_id | stu_id | Score |+----------+------------+-------------+----------+--------+-------+|    1 | 語文    | A      |   NULL | NULL  | NULL ||    2 | 數學    | B      |   NULL | NULL  | NULL ||    3 | 英語    | C      |   NULL | NULL  | NULL |+----------+------------+-------------+----------+--------+-------+3 rows in set (0.00 sec)mysql> select * from class A left join score B on A.class_id=B.class_id and A.class_name='體育' and B.Score=82;+----------+------------+-------------+----------+--------+-------+| class_id | class_name | class_grade | class_id | stu_id | Score |+----------+------------+-------------+----------+--------+-------+|    1 | 語文    | A      |   NULL | NULL  | NULL ||    2 | 數學    | B      |   NULL | NULL  | NULL ||    3 | 英語    | C      |   NULL | NULL  | NULL |+----------+------------+-------------+----------+--------+-------+3 rows in set (0.00 sec)mysql>

/**********************過濾條件在on中時**********************/

總結一下,如果 left join on leftTable.id=rightTable.id 后還有其他條件:

(1)and leftTable.colName='***',過濾左表,但是左表不滿足條件的行直接輸出,并將右表對應部分置為null
(2)and rightTable.colName='***',過濾右表,對左表沒有影響
(3)and leftTable.colName='***' and rightTable.colName='***',就是上面(1)和(2)一起發揮作用

不管on后面有哪些條件,left join都要返回左表中的所有行!

mysql> select * from class A left join score B on A.class_id=B.class_id where A.class_name='語文';+----------+------------+-------------+----------+--------+-------+| class_id | class_name | class_grade | class_id | stu_id | Score |+----------+------------+-------------+----------+--------+-------+|    1 | 語文    | A      |    1 | A001  |  91 ||    1 | 語文    | A      |    1 | A002  |  82 |+----------+------------+-------------+----------+--------+-------+2 rows in set (0.01 sec)mysql> select * from class A left join score B on A.class_id=B.class_id where A.class_name='數學';+----------+------------+-------------+----------+--------+-------+| class_id | class_name | class_grade | class_id | stu_id | Score |+----------+------------+-------------+----------+--------+-------+|    2 | 數學    | B      |    2 | A001  |  95 ||    2 | 數學    | B      |    2 | A002  |  87 |+----------+------------+-------------+----------+--------+-------+2 rows in set (0.00 sec)mysql> select * from class A left join score B on A.class_id=B.class_id where A.class_name='英語';+----------+------------+-------------+----------+--------+-------+| class_id | class_name | class_grade | class_id | stu_id | Score |+----------+------------+-------------+----------+--------+-------+|    3 | 英語    | C      |    3 | B003  |  65 |+----------+------------+-------------+----------+--------+-------+1 row in set (0.00 sec)mysql> select * from class A left join score B on A.class_id=B.class_id where A.class_name='體育';Empty set (0.00 sec)mysql> select * from class A left join score B on A.class_id=B.class_id where B.Score=90;Empty set (0.01 sec)mysql> select * from class A left join score B on A.class_id=B.class_id where B.Score=91;+----------+------------+-------------+----------+--------+-------+| class_id | class_name | class_grade | class_id | stu_id | Score |+----------+------------+-------------+----------+--------+-------+|    1 | 語文    | A      |    1 | A001  |  91 |+----------+------------+-------------+----------+--------+-------+1 row in set (0.00 sec)mysql> select * from class A left join score B on A.class_id=B.class_id where A.class_name='語文' and B.Score=90;Empty set (0.00 sec)mysql> select * from class A left join score B on A.class_id=B.class_id where A.class_name='語文' and B.Score=91;+----------+------------+-------------+----------+--------+-------+| class_id | class_name | class_grade | class_id | stu_id | Score |+----------+------------+-------------+----------+--------+-------+|    1 | 語文    | A      |    1 | A001  |  91 |+----------+------------+-------------+----------+--------+-------+1 row in set (0.00 sec)mysql> select * from class A left join score B on A.class_id=B.class_id where A.class_name='體育' and B.Score=90;Empty set (0.00 sec)mysql> select * from class A left join score B on A.class_id=B.class_id where A.class_name='體育' and B.Score=91;Empty set (0.00 sec)mysql>

/**********************過濾條件在where中時**********************/

過濾條件寫在where中時,先根據where條件對表進行過濾,然后再執行left join

總結

以上所述是小編給大家介紹的sql中的left join及on、where關鍵字的區別詳解,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對VeVb武林網網站的支持!


注:相關教程知識閱讀請移步到MSSQL教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91爱视频在线| 日韩国产激情在线| 大荫蒂欧美视频另类xxxx| 91人人爽人人爽人人精88v| 亚洲网站视频福利| 欧美理论电影在线观看| 国产精品久久久久久久久借妻| 日韩av综合网| 国产在线播放91| 亚洲激情在线视频| 国产精品久久久久久久7电影| 亚洲精品91美女久久久久久久| www日韩欧美| 97色伦亚洲国产| 在线电影中文日韩| 久久综合伊人77777| 欧美国产日韩xxxxx| 午夜精品一区二区三区在线| 久久久爽爽爽美女图片| 久久网福利资源网站| 欧美日韩午夜激情| 欧美日韩国产91| 国产在线视频一区| 亚洲国产精品悠悠久久琪琪| 精品久久久999| 日韩小视频在线| 国产乱肥老妇国产一区二| 精品国偷自产在线视频| 亚洲综合一区二区不卡| 精品香蕉一区二区三区| 黄色成人av网| 美女少妇精品视频| 国产一区二区三区视频在线观看| 成人激情春色网| 久久天天躁狠狠躁夜夜av| 国产精品wwww| 欧美性videos高清精品| 亚洲第五色综合网| 亚洲自拍小视频免费观看| 亚洲欧美在线第一页| 亚洲最大的网站| 在线一区二区日韩| 久久亚洲精品网站| 欧美孕妇孕交黑巨大网站| 欧美性xxxx极品hd欧美风情| 久久国产天堂福利天堂| 国产在线拍偷自揄拍精品| 国产精品男人的天堂| 国产精品v片在线观看不卡| 欧美另类极品videosbest最新版本| 最好看的2019的中文字幕视频| 日韩中文字幕久久| 亚洲成年网站在线观看| 午夜精品三级视频福利| 久久久久久久国产| 91久久国产综合久久91精品网站| 亚洲精品电影网| 国产999精品久久久影片官网| 色综合五月天导航| 北条麻妃一区二区三区中文字幕| 亚洲精品久久久久久下一站| 亚洲国产高清福利视频| 欧美一区视频在线| 91沈先生作品| 精品人伦一区二区三区蜜桃免费| 亚洲人在线视频| 亚洲欧美国产精品久久久久久久| 2019中文字幕免费视频| 一个人www欧美| 欧美成在线视频| 国产aaa精品| 国产91精品久久久| 狠狠躁夜夜躁人人爽天天天天97| 日韩av理论片| 亚洲最大在线视频| 中文字幕精品一区二区精品| 亚洲激情小视频| 国产一区二区精品丝袜| 国自产精品手机在线观看视频| 亚洲精品免费网站| 精品国产一区二区三区久久狼5月| 久久久精品2019中文字幕神马| 亚洲丁香婷深爱综合| 精品露脸国产偷人在视频| 日韩精品有码在线观看| 欧美精品videos另类日本| 欧美成人剧情片在线观看| 欧美一级高清免费播放| 亚洲国产欧美一区二区三区久久| 亚洲综合小说区| 一区二区三区四区精品| 美女av一区二区三区| 成人网欧美在线视频| 日韩av大片在线| 亚洲视频精品在线| 国产不卡一区二区在线播放| 亚洲一区亚洲二区| 色在人av网站天堂精品| 欧美亚洲视频在线看网址| 中文字幕在线亚洲| 亚洲japanese制服美女| 欧美日韩一区二区三区| 亚洲女同精品视频| 国产不卡精品视男人的天堂| 欧美亚洲成人免费| 国产精品国产福利国产秒拍| 欧美精品一二区| 色综合91久久精品中文字幕| 国产精品精品一区二区三区午夜版| 国内精品久久久久影院 日本资源| 色综合久久精品亚洲国产| 啊v视频在线一区二区三区| 亚洲成人a**站| 操日韩av在线电影| 精品性高朝久久久久久久| 欧美日韩不卡合集视频| 欧美中在线观看| 久久久久久久久久久久av| 亚洲一区二区免费在线| 怡红院精品视频| 欧美黄色www| 亚洲精品日韩激情在线电影| 亚洲乱码国产乱码精品精天堂| 日av在线播放中文不卡| 欧美高清在线播放| 成人免费看吃奶视频网站| 欧美另类第一页| 欧美视频在线免费| 91久久综合亚洲鲁鲁五月天| 国产午夜精品视频| 91情侣偷在线精品国产| 一本色道久久综合狠狠躁篇怎么玩| 高清一区二区三区四区五区| 日本不卡免费高清视频| 欧美性猛交xxxx乱大交3| 欧美成人sm免费视频| 国产va免费精品高清在线| 日韩精品在线观看一区| 亚洲美女喷白浆| 粉嫩老牛aⅴ一区二区三区| 欧美亚洲午夜视频在线观看| 日韩成人免费视频| 青青草99啪国产免费| 亚洲综合最新在线| 中文字幕自拍vr一区二区三区| 88xx成人精品| 91wwwcom在线观看| 热99在线视频| 萌白酱国产一区二区| 亚洲国产精品yw在线观看| 亚洲欧洲在线视频| 久久久久久国产精品美女| 国产精品美女主播在线观看纯欲| 亚洲成年人在线播放| 91精品国产综合久久久久久蜜臀| 亚洲激情在线观看视频免费| 91精品视频网站| 日韩激情av在线免费观看| 综合136福利视频在线| 97欧美精品一区二区三区| 亚洲欧洲自拍偷拍| 国产一区在线播放| 亚洲精品不卡在线| 亚洲欧美日韩高清|