在實際開發中,咱們會聯合多個表來實現查詢,好比把班級表和學生表聯合起來就同時能夠看到班級、老師和學員的信息,一個班級表:mysql
IDsql |
名稱數據庫 |
班主任spa |
101code |
一班blog |
Martinip |
102ci |
二班開發 |
Rockio |
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 database school; #建立數據庫school 2 mysql> use school; #選擇數據庫school 3 mysql> CREATE TABLE class ( 4 `id` int NOT NULL AUTO_INCREMENT, 5 `name` varchar(128) DEFAULT NULL, 6 `teacher` varchar(64) DEFAULT NULL, 7 UNIQUE KEY `id` (`id`) 8 ); #建立班級表 class 9 mysql> insert into class values(101, '一班', 'Martin'),(102, '二班', 'Rock'),(103, '三班', 'Janny'); #建立成績表 grade 10 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] otherfieldn FROM tablename1 [AS] othertablename1, ..., Tablenamen [AS] othertablenamen ... where othertablename1.fieldx = othertablenamen.fieldx ... ;
其中,參數tablename*爲表原來的名字,參數othertablename*爲新表名,之因此要爲表設置新的名字,是爲了讓SQL語句代碼更加直觀、更加人性化和實現更加複雜的功能。
內鏈接查詢中存在一種特殊的等值鏈接——自鏈接。所謂自鏈接,就是指表與其自身進行鏈接。
如:查詢學生 」小紅 」所在班級的其餘學生,SQL語句以下:
1 mysql> use school; #選擇數據庫school 2 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= '小紅'; #查詢學生 」小紅 」所在班級的其餘學生
內鏈接查詢中的等值鏈接就是在關鍵字ON後的匹配條件中經過等於關係運算符(=)來實現等值條件。
1 mysql> select * from class as a inner join student as b where a.id = b.class_id;
內鏈接查詢中的不等鏈接就是在關鍵字ON後的匹配條件中經過除了等於關係運算符來實現不等條件外,還可使用關係運算符,包含「>」「>=」「<」「<=」和「!=」等運算符號。
mysql> select * from class as a inner join student as b where a.id != b.class_id;
當咱們在查詢數據時,要求返回所操做表中至少一個表的全部數據記錄,經過SQL語句「OUTER JOIN…ON」來實現。外鏈接數據查詢語法形式以下:
SELECT field1,field2,…,fieldn FROM tablename1 LEFT|RIGHT [OUTER] JOIN tablename2 ON CONDITION
在上述語句中,參數fieldn表示所要查詢的字段名字,來源於所鏈接的表tablename1和tablename2,關鍵字OUTER JOIN表示表進行外鏈接,參數CONDITION表示進行匹配的條件。
外鏈接查詢能夠分爲如下二類:
外鏈接查詢中的左外鏈接,就是指新關係中執行匹配條件時,以關鍵字LEFT JOIN左邊的表爲參考表。左鏈接的結果包括LEFT OUTER字句中指定的左表的全部行,而不單單是鏈接列所匹配的行,若是左表的某行在右表中沒有匹配行,則在相關聯的結果行中,右表的全部選擇列表均爲空值。
例如:查詢全部學生的學號、姓名、班級編號、性別、班級名、班主任信息,具體SQL語句以下:
1 mysql> use school; #選擇數據庫school 2 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; #左鏈接查詢全部班級的學員信息
(左鏈接查詢一 全部學員對應的班級信息)
(左鏈接查詢二 全部班級對應的學員信息)
外鏈接查詢中的右外鏈接在新關係中執行匹配條件時,以關鍵字RIGHT JOIN右邊的表爲參考表,若是右表的某行在左表中沒有匹配行,左表將返回空值。
例如:查詢全部班級的全部學生信息。具體SQL語句以下:
1 mysql> use school; #選擇數據庫school 2 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; #右鏈接查詢全部學員對應的班級信息
在MySQL中經過關鍵字UNION來實現合併操做,便可以經過其將多個SELECT語句的查詢結果合併在一塊兒,組成新的關係。在MySQL軟件中,合併查詢數據記錄可經過SQL語句UNION來實現,具體語法形式以下:
SELECT field1,field2,…,fieldn FROM tablename1 UNION | UNION ALL SELECT field1,field2,…,fieldn FROM tablename2 UNION | UNION ALL SELECT field1,field2,…,fieldn ;
注意: 多個選擇語句select 的列數相同就能夠合併,union和union all的主要區別是union all是把結果集直接合並在一塊兒,而union 是將union all後的結果再執行一次distinct,去除重複的記錄後的結果。
1 mysql> use school; #選擇數據庫school 2 mysql> select teacher from class union all select name from student; #查詢班級表全部老師和學生表中全部學生姓名 3 mysql> select teacher as people from class union all select name as people from student; #同上,使用別名查詢 4 mysql> select teacher,id from class union all select name,class_id from student; #查詢班級表全部(老師、班級ID)和學生表中全部學生(姓名、班級ID)
所謂子查詢,是指在一個查詢中嵌套了其餘的若干查詢,即在一個SELECT查詢語句的WHERE或FROM子句中包含另外一個SELECT查詢語句。在查詢語句中,外層SELECT查詢語句稱爲主查詢,WHERE子句中的SELECT查詢語句被稱爲子查詢,也被稱爲嵌套查詢。
經過子查詢能夠實現多表查詢,該查詢語句中可能包含IN、ANY、ALL和EXISTS等關鍵字,除此以外還可能包含比較運算符。理論上,子查詢能夠出如今查詢語句的任意位置,可是在實際開發中子查詢常常出如今WHERE和FROM子句中。
子查詢可使用比較運算符。這些比較運算符包括=、!=、>、>=、<、<=和<>等。其中,<>與!=是等價的。比較運算符在子查詢中使用得很是普遍,如查詢分數、年齡、價格和收入等。
例如:查詢student 表中「小花」所在班級班主任的名字。SQL語句以下:
mysql> use school; #選擇數據庫school mysql> select teacher from class where id = (select class_id from student where name='小花'); #查詢「小花」所在班級班主任的姓名
注意:使用比較運算符時,select 子句得到的記錄數不能大於1條!!!
一個查詢語句的條件可能落在另外一個SELECT語句的查詢結果中,這時可使用IN關鍵字,SQL示例以下:
NOT IN的用法與IN相同。
例如:查詢student 表中「小花」所在班級班主任的名字。SQL語句以下:
1 mysql> use school; #選擇數據庫school 2 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 '小%'); #查詢姓名以「小」字開頭的學生所在班級班主任的姓名
關鍵字EXISTS表示存在,後面的參數是一個任意的子查詢,系統對子查詢進行運算以判斷它是否返回行;若是至少返回一行,那麼EXISTS的結果爲true,此時外層語句將進行查詢;若是子查詢沒有返回任何行,那麼EXISTS返回的結果是false,此時外層語句將不進行查詢。
例如:若是102班存在學生記錄,就查詢102班的班級信息的記錄。SQL示例語句以下:
mysql> use school; #選擇數據庫school mysql> select * from class where id=102 and exists (select * from student where class_id=102); #若是102班存在學生記錄,就查詢102班的班級信息
關鍵字ANY表示知足其中任一條件。使用關鍵ANY時,只要知足內層查詢語句返回的結果中的任何一個就能夠經過該條件來執行外層查詢語句。例如,須要查詢哪些學生能夠獲取獎學金,那麼首先要有一張獎學金錶,從表中查詢出各類獎學金要求的最低分,只要一個同窗的乘積大於等於不一樣獎學金最低分的任何一個,這個同窗就能夠得到獎學金。關鍵字ANY一般和比較運算符一塊兒使用。例如,「>ANY」表示大於任何一個值,「=ANY」表示等於任何一個值。
例如:查詢數據庫school的表student中哪些學生能夠得到獎學金。學生的成績達到其中任何一項獎學金規定的分數便可,SQL語句示例以下:
mysql> use school; #選擇數據庫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); #查詢能得到獎學金的學院記錄
關鍵字ALL表示知足全部條件。使用關鍵字ALL時,只有知足內層查詢語句返回的全部結果才能夠執行外層查詢語句。例如,須要查詢哪些同窗可以得到一等獎學金,首先要從獎學金錶中查詢出各類獎學金要求的最低分。由於一等獎學金要求的分數最高,只有當成績高於全部獎學金最低分時,這個同窗纔可能得到一等獎學金。關鍵字ALL也常常與比較運算符一塊兒使用。例如,「>ALL」表示大於全部值,「<ALL」表示小於全部值。
例如:查詢數據庫school的表student中哪些學生能夠得到一等獎學金,即學生的總成績要達到一等獎學金規定的分數,而一等獎學金是最高獎學金。SQL語句示例以下:
mysql> use school; #選擇數據庫school 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> select st.id, st.name, st.math+st.chinese+st.english total from grade st where (math+chinese+english) < ALL (select score from scholarship); #查詢不能得到獎學金的同窗記錄
========================================================================================================================