連線
# 連線:將有聯絡的多張表通過關聯(有聯絡就行,不一定是外來鍵)字段,進行連線,形參一張大表
# 連表查詢:在大表的基礎上進行查詢,就稱之為連表查詢
# 將表與表建立連線的方式有四種:內連線、左連線、右連線、全連線
一對多資料準備mysql>: create database db3;
mysql>: use db3;
mysql>:
create table dep(
id int primary key auto_increment,
name varchar(16),
work varchar(16)
);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);
笛卡爾積# 笛卡爾積: 集合 x * y => z, , , , , }
mysql>: select * from emp, dep;
# 總結:是兩張表 記錄的所有排列組合,資料沒有利用價值
內連線# 關鍵字:inner join on
# 語法:from a表 inner join b表 on a表.關聯字段=b表.關聯字段
mysql>:
select
emp.id,emp.name,salary,dep.name,work
from emp inner join dep on emp.dep_id = dep.id
order by emp.id;
# 總結:只保留兩個表有關聯的資料
左連線# 關鍵字:left join on
# 語法:from 左表 left join 右表 on 左表.關聯字段=右表.關聯字段
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;
# 總結:保留左表的全部資料,右表有對應資料直接連表顯示,沒有對應關係空填充
右連線# 關鍵字:right join on
# 語法:from a表 right join b表 on a表.關聯字段=b表關聯字段
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;
# 總結:保留右表的全部資料,左表有對應資料直接連表顯示,沒有對應關係空填充
左右可以相互轉化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;
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;
# 總結:更換一下左右表的位置,相對應更換左右連線關鍵字,結果相同
全連線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;
# 總結:左表右表資料都被保留,彼此有對應關係正常顯示,彼此沒有對應關係均空填充對方
一對一與一對多情況一致# 建立一對一 作者與作者詳情 表
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;
多對多:兩表兩表建立連線# 在一對一基礎上,建立 作者與書 的多對多關係關係
# 利用之前的作者表
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, 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;
mysql多表 MySQL 多表查詢
多表查詢 select listname from tablename1,tablename2 笛卡爾積 多表查詢中,如果沒有連線條件,則會產生笛卡爾積 數學中的定義 假設集合a 集合b 則兩個集合的笛卡爾積為 實際執行環境下,應避免使用笛卡爾積 解決方案 在where加入有效的連線條件 等值連線 ...
mysql多表查詢方式 MySQL多表查詢方式問題
你的 sql 沒有用到任何索引,對 a b 兩個表都是全表掃瞄,在資料量小的時候是沒有問題的,但是如果資料量超過 100 萬,效能問題就會突顯出來。這裡不清楚你的 created at 欄位是什麼型別,不過從你的 date format created at,y m d 看來,應該是 datetim...
mysql 多表查詢or MySQL 多表查詢
前期準備 建表create table dep id int,name varchar 20 create table emp id int primary key auto increment,name varchar 20 enum male female not null default ma...