mysql多表查詢的兩種方法


多表查詢的兩種方法

為什么要用多表查詢?
因為我們在涉及表的時候肯定不止一張表。

數據准備:
# 建表
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('技術','人力資源'));  # 也可通過添加連表操作同時查看部門信息


免責聲明!

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



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