連接查詢?子查詢?看這篇文章就行了!

語言: CN / TW / HK

寫在前面:

小夥伴兒們,大家好!上一篇我們講了MySQL中的聚合函數查詢——MySQL系列(2)——聚合函數查詢

這期讓我們繼續學習MySQL中的連接查詢子查詢

思維導圖:

連接查詢是將兩個或者兩個以上的表連接起來,從中選取所需要的數據;

連接查詢是關係數據庫中最主要的查詢。

一、內連接查詢

可以查詢兩個或兩個以上的表

1.查詢兩個表的所有數據,以笛卡爾積的形式展現出來

SELECT * FROM 表1,表2;

例如:查詢t_book表和t_booktype表的內容:

select * from t_book;

有5種字段,4條數據;

select * from t_booktype;

有2種字段,3條數據;

而查看兩個結合表的數據,則用:

select * from t_book,t_booktype;

總共有12條數據,7種字段;

2.將兩張表的數據合成一張表(字段結合)

例如,之前查詢到t_book表中的內容是:

如果想要在此表中加上t_booktype字段的話,就要用內連接:

select * from t_book,t_booktype where t_book.bookTypeId=t_booktype.id;

去掉bookTypeId和id字段,則有:

select bookName,price,author,bookTypeName from t_book,t_booktype where t_book.bookTypeId=t_booktype.id;

當然,這樣效果不是很好,讀者很難區分bookTypeName到底是t_book表中還是t_bookType表中的字段;

這時,可以給兩個表取別名,給t_book表取別名tb,給t_booktype表取別名tby,則有:

select tb.bookName,tb.price,tb.author,tby.bookTypeName from t_book tb,t_booktype tby where tb.bookTypeId=tby.id;

結果是一樣的,但是可以看出哪個表對應的哪個字段;

二、外連接查詢

外連接查詢可以查出一張表的所有信息

SELECT * FROM 表名1 LEFE|RIGHT JOIN 表名2 ON 表名1.屬性1=表名2.屬性2;

1.左連接查詢:

可以查出表1的所有記錄,而表2只能查出匹配的記錄;

例如:查出表1的所有記錄,加上表2的bookTypeName字段:

select * from t_book left join t_bookType on t_book.Id=t_bookTypeId.id;

看到t_book表的所有記錄都有,且id為4的記錄在t_bookType表中並沒有與之對應的,因此為null;

2.右連接查詢:

可以查出表2的所有記錄,而表1只能查出匹配的記錄;

例如:查出表2的所有記錄,加上表1的字段:

select * from t_book left join t_bookType on t_book.Id=t_bookTypeId.id;

可以看到t_bookType表的內容都查出來了,且bookypeName為3的記錄在t_book表中沒有記錄對應,因此為null;

三、子查詢

1.帶IN關鍵字的子查詢

若要查詢bookTypeId在t_booktype表中的數據:

select * from t_book where bookTypeId in (select id from t_booktype);

可以看出沒有bookTypeId等於4的這條數據,因為bookTypeId等於4不在t_booktype表中;

若要查詢bookTypeId不在t_booktype表中的數據:

select * from t_book where bookTypeId not in (select id from t_booktype);

可以看出查到了booTypeId等於4的這條不在t_booktype表中的數據;

2.帶比較運算符的子查詢

先查看t_pricelevel表內容:select * from t_pricelevel;

查看price=80的書籍:

select * from t_book where price >=(select price from t_pricelevel where priceLevel = 1);

3.帶exist關鍵字查詢

例如:如果t_booktype表存在,才需要繼續查詢t_book表;

select * from t_book where exists (select * from t_booktype);

當然,也有not exists,在前面加上NOT即可;

4.帶any的關鍵字子查詢

例如:查詢t_book表中price任何一個大於t_pricelevel表中price的數據:

select * from t_book where price > any (select price from t_pricelevel where priceLevel );

可以看出t_book表中price=24的數據並沒有查出來;

5.帶all的關鍵字查詢
select * from t_book where price> all (select price from t_pricelevel);

t_book表中只有兩條數據大於t_pricelevel表中最大的價格80;



好了,今天就先分享到這裏了,下期繼續給大家帶來MySQL系列後續講解!歡迎關注我的原創技術公眾號~


本文分享自微信公眾號 - 程序員的時光(gh_9211ec727426)。
如有侵權,請聯繫 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閲讀的你也加入,一起分享。