134 MySQL多表查詢

1、連表查詢

  • 鏈接:將有聯繫的多張表經過關聯(有聯繫就行,不必定是外鍵)字段,進行鏈接,形參一張大表
  • 連表查詢:在大表的基礎上進行查詢,就稱之爲連表查詢
  • 將表與表創建鏈接的方式有四種:內鏈接、左鏈接、右鏈接、全鏈接

2、一對多的表關係

2.1 數據準備

1.建立部門表
create table dep(
    id int primary key auto_increment,
    name varchar(16),
    work varchar(16)
);

2.建立員工表
create table emp(
    id int primary key auto_increment,
    name varchar(16),
    salary float,
    dep_id int
);

# 插入數據
insert into dep values(1, '市場部', '銷售'), (2, '教學部', '授課'), (3, '管理部', '開車');
insert into emp(name, salary, dep_id) values('egon', 3.0, 2),('yanghuhu', 2.0, 2),('sanjiang', 10.0, 1),('owen', 88888.0, 2),('liujie', 8.0, 1),('yingjie', 1.2, 0);



###################cmd圖示
mysql> select * from emp;
+----+----------+--------+--------+
| id | name     | salary | dep_id |
+----+----------+--------+--------+
|  1 | egon     |      3 |      2 |
|  2 | yanghuhu |      2 |      2 |
|  3 | sanjiang |     10 |      1 |
|  4 | owen     |  88888 |      2 |
|  5 | liujie   |      8 |      1 |
|  6 | yingjie  |    1.2 |      0 |
+----+----------+--------+--------+
6 rows in set (0.00 sec)

mysql> select * from dep;
+----+-----------+--------+
| id | name      | work   |
+----+-----------+--------+
|  1 | 市場部    | 銷售   |
|  2 | 教學部    | 授課   |
|  3 | 管理部    | 開車   |
+----+-----------+--------+
3 rows in set (0.00 sec)

2.2 笛卡爾積的概念

笛卡爾積: 集合 X{a, b} * Y{o, p, q} => Z{{a, o}, {a, p}, {a, q}, {b, o}, {b, p}, {b, q}}

mysql>: select * from emp, dep;

總結:是兩張表 記錄的全部排列組合,數據沒有利用價值

2.3 內鏈接

1.關鍵字:inner join on
2.語法:from A表 inner join B表 on A表.關聯字段=B表.關聯字段


select 
    emp.id,emp.name,salary,dep.name,work 
from emp inner join dep on emp.dep_id = dep.id 
order by emp.id;
#######################cmd 圖解
mysql> select 
            emp.id,
            emp.name 
            salary,
            dep.name,
            work 
            from emp join dep on emp.dep_id=dep.id
            order by emp.id;
+----+----------+-----------+--------+
| id | salary   | name      | work   |
+----+----------+-----------+--------+
|  1 | egon     | 教學部    | 授課   |
|  2 | yanghuhu | 教學部    | 授課   |
|  3 | sanjiang | 市場部    | 銷售   |
|  4 | owen     | 教學部    | 授課   |
|  5 | liujie   | 市場部    | 銷售   |
+----+----------+-----------+--------+

# 總結:只保留兩個表有關聯的數據

2.4 左鏈接

1.關鍵字:left join on
2.語法:from 左表 left join 右表 on 左表.關聯字段=右表.關聯字段

select 
    emp.id,emp.name,salary,dep.name,work 
from emp left join dep on emp.dep_id = dep.id 
order by emp.id;
###################cmd 圖解
mysql> select
    -> emp.id,emp.name,salary,dep.name,work
    ->     from emp left join dep on emp.dep_id = dep.id order by emp.id;
+----+----------+--------+-----------+--------+
| id | name     | salary | name      | work   |
+----+----------+--------+-----------+--------+
|  1 | egon     |      3 | 教學部    | 授課   |
|  2 | yanghuhu |      2 | 教學部    | 授課   |
|  3 | sanjiang |     10 | 市場部    | 銷售   |
|  4 | owen     |  88888 | 教學部    | 授課   |
|  5 | liujie   |      8 | 市場部    | 銷售   |
|  6 | yingjie  |    1.2 | NULL      | NULL   |
+----+----------+--------+-----------+--------+


# 總結:保留左表的所有數據,右表有對應數據直接連表顯示,沒有對應關係空填充

2.5 右鏈接

1.關鍵字:right join on
2.語法:from A表 right join B表 on A表.關聯字段=B表關聯字段

select 
    emp.id,emp.name,salary,dep.name,work 
from emp right join dep on emp.dep_id = dep.id 
order by emp.id;

#######################cmd 圖解
mysql> select
    -> emp.id,emp.name,salary,dep.name,work
    -> from emp right join dep on emp.dep_id = dep.id
    -> order by emp.id;
+------+----------+--------+-----------+--------+
| id   | name     | salary | name      | work   |
+------+----------+--------+-----------+--------+
| NULL | NULL     |   NULL | 管理部    | 開車   |
|    1 | egon     |      3 | 教學部    | 授課   |
|    2 | yanghuhu |      2 | 教學部    | 授課   |
|    3 | sanjiang |     10 | 市場部    | 銷售   |
|    4 | owen     |  88888 | 教學部    | 授課   |
|    5 | liujie   |      8 | 市場部    | 銷售   |
+------+----------+--------+-----------+--------+

# 總結:保留右表的所有數據,左表有對應數據直接連表顯示,沒有對應關係空填充

2.6 左右鏈接能夠轉換

1.left左邊的是左表,右邊的是右表
2.right左邊的是左表,右邊的是右表
3.因此咱們交換左右表的位置也是能夠的   

select 
    emp.id,emp.name,salary,dep.name,work 
from emp right join dep on emp.dep_id = dep.id 
order by emp.id;

mysql>: 
select 
    emp.id,emp.name,salary,dep.name,work 
from dep left join emp on emp.dep_id = dep.id 
order by emp.id;

# 總結:更換一下左右表的位置,相對應更換左右鏈接關鍵字,結果相同

2.7 全鏈接

1.就是先把兩張表進行左鏈接,中間加一個關鍵字union, 而後再進行右連接
select 
    emp.id,emp.name,salary,dep.name,work 
from emp left join dep on emp.dep_id = dep.id 

union

select 
    emp.id,emp.name,salary,dep.name,work 
from emp right join dep on emp.dep_id = dep.id 

order by id;


###############################cmd 圖示
mysql> select
    -> emp.id,emp.name,salary,dep.name,work
    -> from emp left join dep on emp.dep_id = dep.id
    ->
    -> union
    ->
    -> select
    -> emp.id,emp.name,salary,dep.name,work
    -> from emp right join dep on emp.dep_id = dep.id
    ->
    -> order by id;
+------+----------+--------+-----------+--------+
| id   | name     | salary | name      | work   |
+------+----------+--------+-----------+--------+
| NULL | NULL     |   NULL | 管理部    | 開車   |
|    1 | egon     |      3 | 教學部    | 授課   |
|    2 | yanghuhu |      2 | 教學部    | 授課   |
|    3 | sanjiang |     10 | 市場部    | 銷售   |
|    4 | owen     |  88888 | 教學部    | 授課   |
|    5 | liujie   |      8 | 市場部    | 銷售   |
|    6 | yingjie  |    1.2 | NULL      | NULL   |
+------+----------+--------+-----------+--------+

# 總結:左表右表數據都被保留,彼此有對應關係正常顯示,彼此沒有對應關係均空填充對方

3、一對一與一對多狀況一致

# 建立一對一 做者與做者詳情 表
create table author(
    id int,
    name varchar(64),
    detail_id int
);
create table author_detail(
    id int,
    phone varchar(11)
);
# 填充數據
insert into author values(1, 'Bob', 1), (2, 'Tom', 2), (3, 'ruakei', 0);
insert into author_detail values(1, '13344556677'), (2, '14466779988'), (3, '12344332255');


# 內連
select author.id,name,phone from author join author_detail on author.detail_id = author_detail.id order by author.id;



# 全連(左連加外聯)
select author.id,name,phone from author left join author_detail on author.detail_id = author_detail.id
union
select author.id,name,phone from author right join author_detail on author.detail_id = author_detail.id
order by id;

4、多對多的錶鏈接

# 在一對一基礎上,創建 做者與書 的多對多關係關係

# 利用以前的做者表
create table author(
    id int,
    name varchar(64),
    detail_id int
);
insert into author values(1, 'Bob', 1), (2, 'Tom', 2), (3, 'ruakei', 0);

# 建立新的書表
create table book(
    id int,
    name varchar(64),
    price decimal(5,2)
);
insert into book values(1, 'python', 3.66), (2, 'Linux', 2.66), (3, 'Go', 4.66);

# 建立 做者與書 的關係表
create table author_book(
    id int,
    author_id int,
    book_id int
);
# 數據:author-book:1-1,2  2-2,3  3-1,3
insert into author_book values(1,1,1),(2,1,2),(3,2,2),(4,2,3),(5,3,1),(6,3,3);

# 將有關聯的表一一創建鏈接,查詢因此本身所需字段
select book.name, book.price, author.name from book 
join author_book on book.id = author_book.book_id
join author on author_book.author_id = author.id;


select book.name,book.price,author.name,author_detail.phone from book
join author_book on book.id =author_book.book_id
join author on author_book.author_id = author.id
left join author_detail on author.detail_id = author_detail.id
相關文章
相關標籤/搜索