多表查詢的兩種方法
為什么要用多表查詢?
因為我們在涉及表的時候肯定不止一張表。
數據准備:
# 建表
create table dep(
id int primary key auto_increment,
name varchar(20)
);
create table emp(
id int primary key auto_increment,
name varchar(20),
sex enum('male','female') not null default 'male',
age int,
dep_id int
);
# 插入數據
insert into dep values
(200,'技術'),
(201,'人力資源'),
(202,'銷售'),
(203,'運營'),
(205,'安保');
insert into emp(name,sex,age,dep_id) values
('jason','male',18,200),
('tony','female',48,201),
('kevin','male',18,201),
('nick','male',28,202),
('owen','male',18,203),
('jerry','female',18,204);
1、多表查詢方法之連表操作
補充:
1、from 后可跟多個表用逗號隔開,使兩張表拼接
eg :from emp,dep
2、在涉及到多表操作的時候 為了避免表字段重復
需要在字段名的前面加上表名限制
實例:
1、查找員工名字和對應的部門名稱
分析:
select * from emp,dep; # 先使員工表和部門表進行拼接 這樣查找的結果是員工對應了每一個部門的id
select * from emp,dep where dep_id=id; # 想要兩個表id對應 這樣的寫法是不對的
select * from emp,dep where emp.dep_id=dep.id; # 這樣的寫法才對 指定表名 表名.字段名的方式
select emp.name,dep.name from emp,dep where emp.dep_id=dep.id; # 只取人名和對應的部門
# 上述的方法非常的麻煩也不符合合理的操作方式 那么接下來就要用到幾個規定的語法格式實現對表查詢
1、inner join:內連接 :只連接兩個表中都存在(有對應關系)的數據
select * from emp inner join dep on emp.dep_id = dep.id;
2、left join : 左連接:以左邊表為基准展示左表的所有數據沒有對應則null填充
select * from emp left join dep on emp.dep_id=dep.id;
3、reght join :右連接:以右邊表為基准展示右邊表的所有數據沒有對應則null填充
select * from emp right join dep on emp.dep_id=dep.id;
4、union :全連接:展示左右兩個表中所有的數據沒有對應則用null填充 (其實相當於一個連接符 把左右連接合起來)
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;
2、多表查詢方法之子查詢
定義:
子查詢:其實就是分布操作 將一張表的查詢結果當作另外一條sql語句的查詢條件
實例:
1、查詢部門是技術部或者人力資源部的員工信息
第一種方法:分布式
先查詢技術部和人力資源部的部門編號:
select id from dep where name in('技術','人力資源');
根據部門的編號去員工表里篩選出對應的員工數據:
select * from emp where dep_id in (200,201); # 查詢到部門編號在根據上一步結果判斷 這樣的話是比較繁瑣的
子查詢方法:將sql語句括號括起來充當查詢條件
select * from emp where dep_id in (select id from dep where name in('技術','人力資源')); # 在不知道員工部門編號的情況下可一步實現查看部門員工信息
完善:
select * from emp inner join dep on emp.dep_id = dep.id where dep_id in (select id from dep where name in('技術','人力資源')); # 也可通過添加連表操作同時查看部門信息