1.如果查詢得結果在一張表中無法獲取,需要關聯多張表,那么這時就需要連表查詢。
2.連表查詢大多數都作用在外鍵得基礎上。--- 表與表之間有關聯。
查詢所有學生信息以及學生所在得班級信息。
1. 表與表之間存在的關系
一對多: 在多得一方添加外鍵列
多對多: 需要在創建一個中間表,該表中至少有兩個外鍵列。
2. 連表查詢
3. 內連接
內連接演示---結果都是一樣,只是語法不同。看個人習慣用哪個?
1.查詢每一個員工的姓名,及關聯的部門的名稱〔隱式內連接實現)
2.查詢每一個員工的姓名,及關聯的部門的名稱〔顯式內連接實現)
-- 隱式查詢 select 列名.... from 表1,表2 where 連表得條件。
-- 連表查詢時,如果不使用連表條件則出現笛卡爾集。
-- 所謂笛卡爾集 就是A表中每一條記錄關聯B中中得每條記錄
1.查詢每一個員工的姓名,及關聯的部門的名稱〔隱式內連接實現)
select * from tb_emp,tb_dept where tb_emp.dept_id=tb_dept.id;
-- 如果表的名字很長 可以為表起別名
select * from tb_emp e, tb_dept d where e.dept_id=d.id;
-- 顯示連接: A表 inner join B表 on 連表條件。
2.查詢每一個員工的姓名,及關聯的部門的名稱〔顯式內連接實現)
select * from tb_emp inner join tb_dept on tb_emp.dept_id=tb_dept.id;
select * from tb_emp e inner join tb_dept d on e.dept_id=d.id;

-- 上面的 inner可以省略。
select * from tb_emp e join tb_dept d on e.dept_id=d.id;
4. 外連接
外連接演示
--1.查詢emp表的所有數據, 和對應的部門信息(左外連接)
--2.查詢dept表的所有數據,和對應的員工信息(右外連接)
-- 語法: select 查詢列集 from A表 left join B表 on 連表條件
-- 1.查詢emp表的所有數據, 和對應的部門信息(左外連接)
select * from tb_emp e left outer join tb_dept d on e.dept_id = d.id;
select * from tb_emp e left join tb_dept d on e.dept_id=d.id;
-- 2.查詢dept表的所有數據,和對應的員工信息(右外連接)
select * from tb_emp e right join tb_dept d on e.dept_id=d.id;
5. 自連查詢
自己和自己相連接查詢。
select * from A表 join A表 on 連表條件。
自連接
--1.查詢員工及其所屬領導的名字。
--2.查詢所有員工 emp及其領導的名字emp ,如果員工沒有領導,也需要查詢出來
-- 1.查詢員工及其所屬領導的名字。你要查詢的結果再一張表中,但是還不能使用單表查詢得到結果。
select a.name,b.name from tb_emp a join tb_emp b on a.managerid=b.id;
-- 2.查詢所有員工 emp及其領導的名字emp ,如果員工沒有領導,也需要查詢出來
select a.name,b.name from tb_emp a left join tb_emp b on a.managerid=b.id;
6. 子查詢--嵌套查詢
一個查詢的結果 作為另一個查詢的條件 或者 臨時表。
-- 查詢市場部的員工信息-----

-- 子查詢返回的結果一列一條記錄。 這個時候可以用=
select * from tb_emp where dept_id=(select id from tb_dept where name='市場部')
-- 查詢市場部和研發部員工的信息。in
-- -- 查詢市場部和研發部員工的信息。
-- a) 查詢市場部和研發部的編號
select id from tb_dept where name in('市場部','研發部')
-- b) 再員工表中根據部門編號查詢員工信息
select * from tb_emp where dept_id in (select id from tb_dept where name in('市場部','研發部'))
-- 查詢在“方東白”入職之后的員工信息
select * from tb_emp where entrydate>(select entrydate from tb_emp where name='方東白')
-- -- 查詢比財務部所有人工資都高的員工信息。
a)求出財務部中最高的工資。
select max(salary) from tb_emp e join tb_dept d on e.dept_id=d.id where d.name='財務部'
b) 根據財務部最高工資查詢其他員工信息
select * from tb_emp where salary>( select max(salary) from tb_emp e join tb_dept d on e.dept_id=d.id where d.name='財務部')
7. 組合查詢
多個查詢的結果 組合到一起。
sql union sql --->把這兩條sql查詢的結果組合到一起。如果有重復記錄則合并成一條。
sql union all sql--->把這兩條sql查詢的結果組合到一起。如果有重復記錄,不合并。
注意: 這兩條sql返回的字段必須一樣。
select name from tb_emp where salary>8000
UNION
select * from tb_emp where age>40;
*請認真填寫需求信息,我們會在24小時內與您取得聯系。