Categories
程式開發

MySQL-技術專題-連接查詢和子查詢


思維導圖:

MySQL-技術專題-連接查詢和子查詢 1

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

一、內連接查詢

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

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

SELECT * FROM 表1,表2;

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

select * from t_book;

MySQL-技術專題-連接查詢和子查詢 2

有5種字段,4條數據;

select * from t_booktype;

MySQL-技術專題-連接查詢和子查詢 3

有2種字段,3條數據;

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

select * from t_book,t_booktype;

MySQL-技術專題-連接查詢和子查詢 4

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

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

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

MySQL-技術專題-連接查詢和子查詢 2

如果想要在此表中加上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;

MySQL-技術專題-連接查詢和子查詢 6

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

二、外連接查詢

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

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;

MySQL-技術專題-連接查詢和子查詢 7

看到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;

MySQL-技術專題-連接查詢和子查詢 8

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

三、子查詢

1.帶IN關鍵字的子查詢

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

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

MySQL-技術專題-連接查詢和子查詢 9

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

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

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

MySQL-技術專題-連接查詢和子查詢 10

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

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

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

MySQL-技術專題-連接查詢和子查詢 11

查看price=80的書籍:

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

MySQL-技術專題-連接查詢和子查詢 12

3.帶exist關鍵字查詢

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

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

MySQL-技術專題-連接查詢和子查詢 13

當然,也有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 );

MySQL-技術專題-連接查詢和子查詢 14

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

5.帶all的關鍵字查詢

select * from t_book where price> all (select price from t_pricelevel);

MySQL-技術專題-連接查詢和子查詢 15

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