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