mysql連線查詢、聯合查詢、子查詢原理與用法例項詳解
阿新 • • 發佈:2020-04-23
本文例項講述了mysql連線查詢、聯合查詢、子查詢原理與用法。分享給大家供大家參考,具體如下:
本文內容:
- 連線查詢
- 聯合查詢
- 子查詢
- from子查詢
- where子查詢
- exists子查詢
首發日期:2018-04-11
連線查詢:
- 連線查詢就是將多個表聯合起來查詢,連線查詢方式有內連線、外連線、自然連線、交叉連線。連線查詢使得可以同時檢視多張表中資料。
- 內連線:有條件連線,多個表之間依據指定條件連線,匹配結果是保留符合匹配結果的記錄。
- 外連線:與內連線不同的是不管匹配符不符合都保留,根據外連線連線方式來決定保留哪張表,比如保留左表的話,那麼左表無法匹配右表時,保留左表資料,然後置右表字段資料為null.
- 自然連線:有條件連線,自動依據“同名欄位”連線(多個同名欄位就都作為條件)。
- 交叉連線cross join:無條件連線,將每一條記錄與另外一個表的每一條記錄連線(笛卡爾積),結果是欄位數等於原來欄位數之和,記錄數等於之前各個表記錄數之乘積。
-- 實驗表結構 create table student( id int,name varchar(15),gender varchar(15),cid int ); create table class( cid int,cname varchar(15) ); drop table student,class; -- 實驗表資料: insert into student values(1,"lilei","male",1),(2,"hanmeimei",2),(3,"jack",(4,"alice","female",4); --這裡特意建立了一個class中沒有的4 insert into class values(1,"linux"),"python"),"java"),(5,"html5");--這裡特意建立了一個student中沒有的5 select * from student; select * from class;
內連線:
- 從左表中取出每一條記錄,去右表中與所有的記錄進行匹配,保留匹配成功的記錄,並將兩份記錄拼接。
- 語法:select 欄位列表 from 左表 [inner] join 右表 on 左表.欄位 = 右表.欄位;
- 不使用on條件的時候,結果與交叉連線相同
-- 內連線 -- select * from student inner join class; --結果與交叉連線相同 select * from student join class on student.cid = class.cid; select * from student inner join class on student.cid = class.cid;
外連線:
- 與內連線不同的是主表記錄不管匹配符不符合都保留,方式有左外連線、右外連線,左外連線是保留左表,右外連線是保留右表
- 語法:
- 左外連線:select 欄位列表 from 左表 left join 右表 on 左表.欄位 = 右表.欄位;
- 右外連線:select 欄位列表 from 左表 right join 右表 on 左表.欄位 = 右表.欄位;
select * from student left join class on student.cid = class.cid;
select * from student right join class on student.cid = class.cid;
自然連線:
- 自動匹配連線條件,系統以欄位名字作為匹配模式(同名欄位就作為條件,多個同名欄位就都作為條件)
- 自然內連線:類似內連線,但不提供連線條件。
- 自然外連線:類似外連線,但不提供連線條件。
- 語法:
- 自然內連線:select 欄位列表 from 表名 natural join 表名;
- 自然外連線:select 欄位列表 from 表名 natural left\right join 表名;
select * from student natural join class;
select * from student natural left join class;
交叉連線:
- 將每一條記錄與另外一個表的每一條記錄連線
- 語法:
- select 欄位列表 from 表名 cross join 表名;
- select 欄位列表 from 表名,表名;
select * from student cross join class; select * from student,class;
補充:
- 在多個表中,為了區分每個表,以及簡便使用,可以使用表別名。
select * from student inner join class on student.cid = class.cid;-- 原本結果 select id,name,gender,c.cid,cname from student as s inner join class as c on s.cid = c.cid;-- 使用表別名
聯合查詢:
- 聯合查詢是將多個查詢結果在記錄上進行拼接。(相當於將其他表的查詢記錄結果連線到第一個表的後面)【因為是拼接,所以多個查詢結果的欄位數必須相同】【拼接不在意資料型別,比如第一個表的第一個欄位是int,但後面的表中的varchar依然可以拼接到第一列中】
- 語法:select語句 union select語句…;
select name,gender from student union select * from class; -- 因為class就兩個欄位,所以第一個只選出兩個欄位
補充:
- union可以有選項,加在union 後面,all選項是不對相同去重,distinct是去重。
- 聯合查詢一般用來處理同一表中以不同方法顯示不同資料。(比如,想將學生各科成績表中的兩科(這裡假設為python 跟linux)同時查詢出來)
- union和order by同時使用報錯時
- 如果你想針對聯合查詢中的某個查詢結果排序,需要將這個select語句用括號括起來。【另外,由於聯合查詢的拼接機制,需要在order by 後面加上limit子句才行,limit的數量可以是一個很大的值。】
- 如果是針對最終的聯合查詢結果,就在最後一個select語句中使用order by 【建議給最後一個欄位加上括號,再加ordery by,使用情況是有同名欄位】
子查詢:
- 子查詢是巢狀在查詢語句中的查詢。
- 子查詢按照出現的位置可以分為三類:
- from子查詢:子查詢跟在from之後的;一般用在“先查出二維表,再處理”的情況。
- 比如:
-- 這是一個無意義的例子。僅為舉例使用 select cid,cname from (select * from class where cname="python") as c;
- 比如:
- where子查詢:子查詢跟在where條件中;一般用在“先查詢出指定條件再查詢”的情況
- 比如:
select * from student where cid=(select cid from class where cname="python");
- 比如:
- exist子查詢:子查詢在exist語句裡面;一般用作“存在才做”的情況
- 比如:
-- 這是一個如果學生沒有選擇cid=1的課,那麼不輸出對應課程資訊的例子 select * from class where exists(select * from student where cid=1) and cid=1;
- 比如:
- 事實上,有些人認為union之後跟著的也是子查詢,不過這裡不把這些當作子查詢,只把上面幾個與“查詢”非常緊密相關的當作子查詢。
- from子查詢:子查詢跟在from之後的;一般用在“先查出二維表,再處理”的情況。
補充:
- 事實上,還可以根據結果來分類子查詢:
- 標量子查詢,子查詢得到的結果是一行一列,情況一般發生於where子查詢只查詢出一行一列的情況。
- 列子查詢,子查詢得到的結果是一列多行,情況一般發生於where子查詢查詢出一列多行的情況。
- 行子查詢,子查詢得到的結果是多列一行(或者多行多列) ,情況一般發生在where子查詢查詢出多列一行的情況。
- 表子查詢,子查詢得到的結果是多行多列 ,情況一般發生在from子查詢中
- where子查詢中有時候還使用一些其他關鍵字,如any,all,some,但對=來說,=基本可以實現他們的功能了。
更多關於MySQL相關內容感興趣的讀者可檢視本站專題:《MySQL查詢技巧大全》、《MySQL事務操作技巧彙總》、《MySQL儲存過程技巧大全》、《MySQL資料庫鎖相關技巧彙總》及《MySQL常用函式大彙總》
希望本文所述對大家MySQL資料庫計有所幫助。