mysql 数据联合查询语句_MySQL - 数据查询 - 联合查询
1.?內連接查詢
在實際開發中,我們會聯合多個表來實現查詢,比如把班級表和學生表聯合起來就同時可以看到班級、老師和學員的信息,一個班級表:
ID
名稱
班主任
101
一班
Martin
102
二班
Rock
103
三班
Janny
一個班級對應著多個學生,以下是與之對應的學生表”:
ID
姓名
班級ID
性別
年齡
1
小花
101
M
9
2
小紅
102
F
8
3
小軍
102
M
8
4
小白
101
F
9
將兩個表中ID 相同的記錄關聯起來組成一個新的“列表”,這就是聯合查詢:
CLASS_ID
名稱
班主任
姓名
ID
性別
101
一班
Martin
小花
1
M
102
二班
Rock
小紅
2
F
102
二班
Rock
小軍
3
M
101
一班
Martin
小白
4
F
這種只有2張表匹配的行才能顯示的連接方式在Mysql 中稱之為內連接: INNER JOIN
在MySQL中內連接數據查詢通過“INNER JOIN…ON”語句來實現,語法形式如下所示。
SELECT field1,field2,…,fieldn FROM tablename1 INNER JOIN tablename2 [INNER JOIN tablenamen] ON CONDITION
其中
參數fieldn表示要查詢的字段名,來源于所連接的表 tablename1 和 tablename2,
關鍵字 INNER JOIN 表示表進行內連接,
參數CONDITION表示進行匹配的條件。
1 mysql> create databaseschool; #創建數據庫school2 mysql> useschool; #選擇數據庫school3 mysql> CREATE TABLEclass (4 `id` int NOT NULLAUTO_INCREMENT,5 `name` varchar(128) DEFAULT NULL,6 `teacher` varchar(64) DEFAULT NULL,7 UNIQUE KEY`id` (`id`)8 ); #創建班級表 class9 mysql> insert into class values(101, '一班', 'Martin'),(102, '二班', 'Rock'),(103, '三班', 'Janny'); #創建成績表 grade10 mysql> CREATE TABLE`student` (11 `id` int NOT NULL AUTO_INCREMENT UNIQUE,12 `name` varchar(64) DEFAULT NULL,13 `class_id` int DEFAULT NULL,14 `sex` enum('F','M') DEFAULT NULL
15 );16 mysql> insert into student values(1,'小花',101,'M'),(2,'小紅',102, 'F'),(3,'小軍',102,'F'),(4,'小白',101,'F'); #插入多條記錄17 mysql> select * from class inner join student on class.id =student.class_id; #查詢class 表和student 表中班級字段相同的記錄并進行內連接18 mysql> select * from class as a inner join student as b where a.id = b.class_id; #同上,使用別名查詢
當表名特別長時,直接使用表名很不方便,或者在實現自連接操作時,直接使用表名無法區別表。為了解決這一類問題,MySQL提供了一種機制來為表取別名,具體語法如下:
SELECT field1, field2, ...,fieldn [AS]otherfieldnFROM tablename1 [AS]othertablename1, ...,
Tablenamen[AS] othertablenamen ... where othertablename1.fieldx = othertablenamen.fieldx ... ;
其中,參數tablename*為表原來的名字,參數othertablename*為新表名,之所以要為表設置新的名字,是為了讓SQL語句代碼更加直觀、更加人性化和實現更加復雜的功能。
1.1 自連接
內連接查詢中存在一種特殊的等值連接——自連接。所謂自連接,就是指表與其自身進行連接。
如:查詢學生 ”小紅 ”所在班級的其他學生,SQL語句如下:
1 mysql> useschool; #選擇數據庫school2 mysql> select t1.id, t1.name, t1.class_id from student t1 inner join student t2 on t1.class_id = t2.class_id and t2.name= '小紅'; #查詢學生 ”小紅 ”所在班級的其他學生
1.2 等值連接
內連接查詢中的等值連接就是在關鍵字ON后的匹配條件中通過等于關系運算符(=)來實現等值條件。
1 mysql> select * from class as a inner join student as b where a.id = b.class_id;
1.3 不等值連接
內連接查詢中的不等連接就是在關鍵字ON后的匹配條件中通過除了等于關系運算符來實現不等條件外,還可以使用關系運算符,包含“>”“>=”“
mysql> select * from class as a inner join student as b where a.id != b.class_id;
2.?外連接查詢
當我們在查詢數據時,要求返回所操作表中至少一個表的所有數據記錄,通過SQL語句“OUTER JOIN…ON”來實現。外連接數據查詢語法形式如下:
SELECTfield1,field2,…,fieldnFROM tablename1 LEFT|RIGHT [OUTER] JOINtablename2ON CONDITION
在上述語句中,參數fieldn表示所要查詢的字段名字,來源于所連接的表tablename1和tablename2,關鍵字OUTER JOIN表示表進行外連接,參數CONDITION表示進行匹配的條件。
外連接查詢可以分為以下二類:
2.1 左外連接
外連接查詢中的左外連接,就是指新關系中執行匹配條件時,以關鍵字LEFT JOIN左邊的表為參考表。左連接的結果包括LEFT OUTER字句中指定的左表的所有行,而不僅僅是連接列所匹配的行,如果左表的某行在右表中沒有匹配行,則在相關聯的結果行中,右表的所有選擇列表均為空值。
例如:查詢所有學生的學號、姓名、班級編號、性別、班級名、班主任信息,具體SQL語句如下:
1 mysql> useschool; #選擇數據庫school2 mysql> select * from student as a left join class as b on a.class_id =b.id; #左連接查詢所有學生對應的班級信息3 mysql> select * from class as a left join student as b on a.id = b.class_id; #左連接查詢所有班級的學員信息
(左連接查詢一 所有學員對應的班級信息)
(左連接查詢二 所有班級對應的學員信息)
2.2 右外連接
外連接查詢中的右外連接在新關系中執行匹配條件時,以關鍵字RIGHT JOIN右邊的表為參考表,如果右表的某行在左表中沒有匹配行,左表將返回空值。
例如:查詢所有班級的所有學生信息。具體SQL語句如下:
1 mysql> useschool; #選擇數據庫school2 mysql> select * from student as a right join class as b on a.class_id =b.id; #右連接查詢所有班級對應的學員信息3 mysql> select * from class as a right join student as b on a.id = b.class_id; #右連接查詢所有學員對應的班級信息
3.?合并查詢數據記錄
在MySQL中通過關鍵字UNION來實現合并操作,即可以通過其將多個SELECT語句的查詢結果合并在一起,組成新的關系。在MySQL軟件中,合并查詢數據記錄可通過SQL語句UNION來實現,具體語法形式如下:
SELECT field1,field2,…,fieldn FROMtablename1UNION | UNION ALL
SELECT field1,field2,…,fieldn FROMtablename2UNION | UNION ALL SELECT field1,field2,…,fieldn ;
注意: 多個選擇語句select 的列數相同就可以合并,union和union all的主要區別是union all是把結果集直接合并在一起,而union 是將union all后的結果再執行一次distinct,去除重復的記錄后的結果。
1 mysql> useschool; #選擇數據庫school2 mysql> select teacher from class union all select name fromstudent; #查詢班級表所有老師和學生表中所有學生姓名3 mysql> select teacher as people from class union all select name as people fromstudent; #同上,使用別名查詢4 mysql> select teacher,id from class union all select name,class_id from student; #查詢班級表所有(老師、班級ID)和學生表中所有學生(姓名、班級ID)
4.?子查詢
所謂子查詢,是指在一個查詢中嵌套了其他的若干查詢,即在一個SELECT查詢語句的WHERE或FROM子句中包含另一個SELECT查詢語句。在查詢語句中,外層SELECT查詢語句稱為主查詢,WHERE子句中的SELECT查詢語句被稱為子查詢,也被稱為嵌套查詢。
通過子查詢可以實現多表查詢,該查詢語句中可能包含IN、ANY、ALL和EXISTS等關鍵字,除此之外還可能包含比較運算符。理論上,子查詢可以出現在查詢語句的任意位置,但是在實際開發中子查詢經常出現在WHERE和FROM子句中。
4.1 帶比較運算符的子查詢
子查詢可以使用比較運算符。這些比較運算符包括=、!=、>、>=、等。其中,<>與!=是等價的。比較運算符在子查詢中使用得非常廣泛,如查詢分數、年齡、價格和收入等。
例如:查詢student 表中“小花”所在班級班主任的名字。SQL語句如下:
mysql> useschool; #選擇數據庫school
mysql> select teacher from class where id = (select class_id from student where name='小花'); #查詢“小花”所在班級班主任的姓名
注意:使用比較運算符時,select 子句獲得的記錄數不能大于1條!!!
4.2 帶關鍵字IN的子查詢
一個查詢語句的條件可能落在另一個SELECT語句的查詢結果中,這時可以使用IN關鍵字,SQL示例如下:
NOT IN的用法與IN相同。
例如:查詢student 表中“小花”所在班級班主任的名字。SQL語句如下:
1 mysql> useschool; #選擇數據庫school2 mysql> select teacher from class where id in (select class_id from student where name='小花'); #查詢student 表中“小花”所在班級班主任的名字3 mysql> select teacher from class where id in (select class_id from student where name like '小%'); #查詢姓名以“小”字開頭的學生所在班級班主任的姓名
4.3 帶關鍵字EXISTS的子查詢
關鍵字EXISTS表示存在,后面的參數是一個任意的子查詢,系統對子查詢進行運算以判斷它是否返回行;如果至少返回一行,那么EXISTS的結果為true,此時外層語句將進行查詢;如果子查詢沒有返回任何行,那么EXISTS返回的結果是false,此時外層語句將不進行查詢。
例如:如果102班存在學生記錄,就查詢102班的班級信息的記錄。SQL示例語句如下:
mysql> useschool; #選擇數據庫school
mysql> select * from class where id=102 and exists (select * from student where class_id=102); #如果102班存在學生記錄,就查詢102班的班級信息
4.4 帶關鍵字ANY的子查詢
關鍵字ANY表示滿足其中任一條件。使用關鍵ANY時,只要滿足內層查詢語句返回的結果中的任何一個就可以通過該條件來執行外層查詢語句。例如,需要查詢哪些學生可以獲取獎學金,那么首先要有一張獎學金表,從表中查詢出各種獎學金要求的最低分,只要一個同學的乘積大于等于不同獎學金最低分的任何一個,這個同學就可以獲得獎學金。關鍵字ANY通常和比較運算符一起使用。例如,“>ANY”表示大于任何一個值,“=ANY”表示等于任何一個值。
例如:查詢數據庫school的表student中哪些學生可以獲得獎學金。學生的成績達到其中任何一項獎學金規定的分數即可,SQL語句示例如下:
mysql> useschool; #選擇數據庫school
mysql> create table scholarship (score int, level varchar(64));
mysql> insert into scholarship values(240, '二等獎'),(257,'一等獎');
mysql> select st.id, st.name, st.math+st.chinese+st.english total from grade st where (math+chinese+english) >= ANY (select score from scholarship); #查詢能獲得獎學金的學院記錄
4.5 帶關鍵字ALL的子查詢
關鍵字ALL表示滿足所有條件。使用關鍵字ALL時,只有滿足內層查詢語句返回的所有結果才可以執行外層查詢語句。例如,需要查詢哪些同學能夠獲得一等獎學金,首先要從獎學金表中查詢出各種獎學金要求的最低分。因為一等獎學金要求的分數最高,只有當成績高于所有獎學金最低分時,這個同學才可能獲得一等獎學金。關鍵字ALL也經常與比較運算符一起使用。例如,“>ALL”表示大于所有值,“
例如:查詢數據庫school的表student中哪些學生可以獲得一等獎學金,即學生的總成績要達到一等獎學金規定的分數,而一等獎學金是最高獎學金。SQL語句示例如下:
mysql> useschool; #選擇數據庫school
mysql> select st.id, st.name, st.math+st.chinese+st.english total from grade st where (math+chinese+english) >= ALL (select score fromscholarship); #查詢能獲得一等獎學金的同學記錄
mysql> select st.id, st.name, st.math+st.chinese+st.english total from grade st where (math+chinese+english) < ALL (select score from scholarship); #查詢不能獲得獎學金的同學記錄
========================================================================================================================
總結
以上是生活随笔為你收集整理的mysql 数据联合查询语句_MySQL - 数据查询 - 联合查询的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql 多表查询 like_MYSQ
- 下一篇: mysql关联查询关键字_MySQL数据