本文用到的表

CREATE TABLE `cls` ( `cls_id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(30) NOT NULL, PRIMARY KEY (`cls_id`) )

CREATE TABLE `stu` ( `stu_id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(30) NOT NULL, `age` smallint(6) DEFAULT NULL, `cls_id` int(11) DEFAULT NULL, `score` tinyint(4) DEFAULT NULL, PRIMARY KEY (`stu_id`), KEY `fk_stu_cls` (`cls_id`), CONSTRAINT `fk_stu_cls` FOREIGN KEY (`cls_id`) REFERENCES `cls` (`cls_id`) )

CREATE TABLE `score` ( `id` int(11) NOT NULL AUTO_INCREMENT, `grade` varchar(10) DEFAULT NULL, `min_sc` tinyint(4) DEFAULT NULL, `max_sc` tinyint(4) DEFAULT NULL, PRIMARY KEY (`id`) )
1、連接查詢簡介
1)連接查詢分為
-
- 內連接查詢 inner join
- 外連接查詢
- 左連接查詢 left outer join
- 右連接查詢 right outer join
其中iner/outer 可以省略,因為區分內外連接查詢的不在於inner/outer,而是判斷有無left/right,有就是外連接查詢,沒有則為內鏈接查詢。
2)內連接查詢與外連接查詢的區別:假設A/B兩張表做連接查詢
① A/B能夠全部匹配的記錄查詢,內連接查詢
② 除了將A/B全部匹配的查詢出來之外,還將其中一張表的記錄全部顯示出來,對方表沒有記錄則用null值表示
③ 外連接查詢結果數 >= 內連接查詢結果數
④ 任何一個左連接都可以寫成右連接,任何一個右連接也都可以寫成左連接
1、內連接查詢
select xxx from A表 inner join B表 on 連接條件 where 查詢條件;
1)查詢每個學生的姓名與班級,要求顯示:學生姓名 班級名 兩列
mysql> select s.name, c.name from stu as s inner join cls as c on s.cls_id=c.cls_id; +-----------+-----------+ | name | name | +-----------+-----------+ | zhangsan | 火箭班 | | lisi | 提高班 | | wangwu | 速成班 | | zhaoliu | 提高班 | | guojing | 速成班 | | huangrong | 提高班 | | xiaolongn | 火箭班 | +-----------+-----------+ 7 rows in set (0.00 sec)
2、外連接查詢
select xxx from A表 left join B表 on 連接條件 where 查詢條件;
1)left join,左連接查詢,除了匹配結果外,還將左邊表未能匹配上的值顯示,這里全都匹配,看不到效果
mysql> select s.name, c.name from stu as s left join cls as c on s.cls_id=c.cls_id; +-----------+-----------+ | name | name | +-----------+-----------+ | zhangsan | 火箭班 | | xiaolongn | 火箭班 | | wangwu | 速成班 | | guojing | 速成班 | | lisi | 提高班 | | zhaoliu | 提高班 | | huangrong | 提高班 | +-----------+-----------+
2)right join,右連接查詢,除了匹配結果外,還將右邊表未能匹配上的值顯示,如最后一行
mysql> select s.name, c.name from stu as s right join cls as c on s.cls_id=c.cls_id; +-----------+-----------+ | name | name | +-----------+-----------+ | zhangsan | 火箭班 | | lisi | 提高班 | | wangwu | 速成班 | | zhaoliu | 提高班 | | guojing | 速成班 | | huangrong | 提高班 | | xiaolongn | 火箭班 | | NULL | 補習班 | +-----------+-----------+
3)right join <--> left join 之間的相互轉換,將left/right互換,A/B表位置互換即可。
mysql> select s.name, c.name from cls as c left join stu as s on s.cls_id=c.cls_id; +-----------+-----------+ | name | name | +-----------+-----------+ | zhangsan | 火箭班 | | lisi | 提高班 | | wangwu | 速成班 | | zhaoliu | 提高班 | | guojing | 速成班 | | huangrong | 提高班 | | xiaolongn | 火箭班 | | NULL | 補習班 | +-----------+-----------+
3、三張表以上的連接查詢
select xxx from A表 inner join B表 on 連接條件 inner join C表 on 連接條件 where 查詢條件;
這里A-B表先連接查詢,然后A-C表再連接查詢
1)查詢顯示結果。“學生姓名,班級名,成績等級”,學生姓名,班級名,成績等級在不同的表中
select s.name, c.name, sc.grade from stu as s inner join cls as c on s.cls_id=c.cls_id inner join score as sc on s.score between sc.min_sc and max_sc;
+-----------+-----------+--------+ | name | name | grade | +-----------+-----------+--------+ | zhangsan | 火箭班 | 及格 | | lisi | 提高班 | 中 | | wangwu | 速成班 | 中 | | zhaoliu | 提高班 | 優 | | guojing | 速成班 | 及格 | | huangrong | 提高班 | 良 | | xiaolongn | 火箭班 | 差 | +-----------+-----------+--------+