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

語言: 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源創計劃”,歡迎正在閱讀的你也加入,一起分享。