前期準備
#建表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 'male',
age int,
dep_id int
#插入資料
insert into dep values
(200,'技術'),
(201,'人力資源'),
(202,'銷售'),
(203,'運營');
insert into emp(name,***,age,dep_id) values
('jason','male',18,200),
('egon','female',48,201),
('kevin','male',38,201),
('nick','female',28,202),
('owen','male',18,200),
('jerry','female',18,204)
按照之前的思路,如果我們想要查表是不是應該這樣寫,那我們看下結果。
select * from emp,dep;
mysql> select * from emp,dep;
| id | name | *** | age | dep_id | id | name |
| 1 | jason | male | 18 | 200 | 200 | 技術 |
| 1 | jason | male | 18 | 200 | 201 | 人力資源 |
| 1 | jason | male | 18 | 200 | 202 | 銷售 |
| 1 | jason | male | 18 | 200 | 203 | 運營 |
| 2 | egon | female | 48 | 201 | 200 | 技術 |
| 2 | egon | female | 48 | 201 | 201 | 人力資源 |
左表一條記錄與右表所有記錄都對應一遍叫笛卡爾積,將所有的資料都對應了一遍,雖然不合理但是其中有合理的資料,現在我們需要做的就是找出合理的資料。
內連線內連線:只取兩張表有對應關係的記錄:只取兩張表有對應關係的記錄 關鍵字inner join
查詢員工及所在部門的資訊
select * from emp inner join dep on emp.dep_id = dep.id;
查詢部門為技術部的員工及部門資訊
select * from emp inner join dep on emp.dep_id = dep.id where dep.name = "技術";
左連線在內連線的基礎上保留左表沒有對應關係的記錄
select * from emp left join dep on emp.dep_id = dep.id;
| id | name | *** | age | dep_id | id | name |
| 1 | jason | male | 18 | 200 | 200 | 技術 |
| 5 | owen | male | 18 | 200 | 200 | 技術 |
| 2 | egon | female | 48 | 201 | 201 | 人力資源 |
| 3 | kevin | male | 38 | 201 | 201 | 人力資源 |
| 4 | nick | female | 28 | 202 | 202 | 銷售 |
| 6 | jerry | female | 18 | 204 | null | null |
右連線在內連線的基礎上保留右表沒有對應關係的記錄
select * from emp right join dep on emp.dep_id = dep.id;
| id | name | *** | age | dep_id | id | name |
| 1 | jason | male | 18 | 200 | 200 | 技術 |
| 2 | egon | female | 48 | 201 | 201 | 人力資源 |
| 3 | kevin | male | 38 | 201 | 201 | 人力資源 |
| 4 | nick | female | 28 | 202 | 202 | 銷售 |
| 5 | owen | male | 18 | 200 | 200 | 技術 |
| null | null | null | null | null | 203 | 運營 |
全連線在內連線的基礎上保留左、右面表沒有對應關係的的記錄
select * from emp left join dep on emp.dep_id = dep.id
union
select * from emp right join dep on emp.dep_id = dep.id;
| id | name | *** | age | dep_id | id | name |
| 1 | jason | male | 18 | 200 | 200 | 技術 |
| 5 | owen | male | 18 | 200 | 200 | 技術 |
| 2 | egon | female | 48 | 201 | 201 | 人力資源 |
| 3 | kevin | male | 38 | 201 | 201 | 人力資源 |
| 4 | nick | female | 28 | 202 | 202 | 銷售 |
| 6 | jerry | female | 18 | 204 | null | null |
| null | null | null | null | null | 203 | 運營 |
子查詢就是將乙個查詢語句的結果用括號括起來當作另外乙個查詢語句的條件去用
查詢部門是技術或者人力資源的員工資訊
思路:先獲取技術部和人力資源部的id號,再去員工表裡面根據前面的id篩選出符合要求的員工資訊
select * from emp where dep_id in (select id from dep where name = "技術" or name = "人力資源");
查詢每個部門最新入職的員工
思路:先查每個部門最新入職的員工,再按部門對應上聯表查詢
select t1.id,t1.name,t1.hire_date,t1.post,t2.* from emp as t1
inner join
(select post,max(hire_date) as max_date from emp group by post) as t2
on t1.post = t2.post
where t1.hire_date = t2.max_date
記住乙個規律,表的查詢結果可以作為其他表的查詢條件,也可以通過其別名的方式把它作為一張虛擬表去跟其他表做關聯查詢
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 多表查詢
分享主題 mysql多表查詢 本庫中表 act promotion item left join select a.act id,a.act name,p.prmotion desc from act a left join promotion p on a.act id p.act id 查詢活動...