mysql 連接查詢 join


本文用到的表

CREATE TABLE `cls` (
  `cls_id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(30) NOT NULL,
  PRIMARY KEY (`cls_id`)
)
cls表--班級表
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`)
)
stu表--學生表
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`)
) 
score表--成績等級表

 

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 | 火箭班    ||
+-----------+-----------+--------+

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM