mysql之多表
已知2張基本表:部門表:dept (部門號,部門名稱);員工表 emp(員工號,員工姓名,年齡,入職時間,收入,部門號)
CREATE table dept(dept1 VARCHAR(6),dept_name VARCHAR(20)) default charset=utf8;
INSERT into dept VALUES ('101','財務');
INSERT into dept VALUES ('102','銷售');
INSERT into dept VALUES ('103','IT技術');
INSERT into dept VALUES ('104','行政');
CREATE table emp (sid VARCHAR(6),name VARCHAR(20),age TINYINT(2),woektime_start VARCHAR(10),incoming SMALLINT(10),dept2 VARCHAR(6))default charset=utf8;
insert into emp VALUES ('1789','張三',35,'1980/1/1',4000,'101');
insert into emp VALUES ('1674','李四',32,'1983/4/1',3500,'101');
insert into emp VALUES ('1776','王五',24,'1990/7/1',2000,'101');
insert into emp VALUES ('1568','趙六',57,'1970/10/11',7500,'102');
insert into emp VALUES ('1564','榮七',64,'1963/10/11',8500,'102');
insert into emp VALUES ('1879','牛八',55,'1971/10/20',7300,'103');
insert into emp VALUES ('1880','老九',55,'1971/10/20',8000,'105');
dept.dept1=emp.dept2
一、
1.普通內連接===》只能取到2表交集部分數據
Select * from dept inner join emp on dept.dept1=emp.drpt2
2.基本內連接===》只能取到2表交集部分數據
Select * from dept,emp where dept.dept1=emp.dept2
3.左連接===》以左表為主,左表的數據會全部顯示出來,右邊的數據不夠會補null處理
Select * from dept left join emp on dept.dept1=emp.dept2
4.右連接===》以右表為主,右表的數據會全部顯示出來,左邊的數據不夠會補null處理
Select * from dept right join emp on dept.dept1=emp.dept2
5.左獨有數據===》左表中單獨存在的數據會顯示出來
Select * from dept left join emp on dept.dept1=emp/dept2 where name is null
6.右獨有數據===》右表中單獨存在的數據單獨顯示
Select * from dept right join emp on dept.dept1=emp.dept2 where dept1 is null
7.全外連接(union)
1)內連接+左獨有+右獨有
select * from dept INNER JOIN emp on dept.dept1=emp.dept2
UNION
select * from dept left JOIN emp on dept.dept1=emp.dept2 where name is null
UNION
select * from dept right JOIN emp on dept.dept1=emp.dept2 where dept_name is NULL;
2)左連接+右獨有
select * from dept left JOIN emp on dept.dept1=emp.dept2
UNION
select * from dept right JOIN emp on dept.dept1=emp.dept2 where dept_name is NULL;
3)右連接+左獨有
select * from dept right JOIN emp on dept.dept1=emp.dept2
UNION
select * from dept left JOIN emp on dept.dept1=emp.dept2 where name is null;
二、子查詢
定義:一個查詢中嵌套另一個查詢
1.、子查詢的分類
(1)標量子查詢
(2)列子查詢
(3)行子查詢
(4)表子查詢(運用多)
2、子查詢詳解
(1)標量子查詢(返回一個值)
標量子查詢:把一個sql 執行返回的一個值,作為另一個sql的條件,得到的結果是一行一列,一般出現在where之后,
備注:標量子查詢允許使用的比較運算符號:=,!=,>,<,>=,<=
例子:select ?dept1 from dept ?where dept_name="財務";
select ?sum(incoming) from ?emp ?where ?dept2=(select ?dept1 from dept?where dept_name="財務");
(2)列子查詢(返回的結果是一個列)
定義:返回的是一列值
注意點:通常在where之后使用,使用是in或not in ,不運行使用比較運算符,因為他有多個值。
select ?dept_name ?from ?dept ?where dept1?in (select ?dept2 from ?emp where name="張三" or name="牛八")
(3)列子查詢
定義:返回的結果是一行多列,一般出現在where的后面
select ?* from ?emp where(age,incoming ) in (select ?age,incoming from ?emp ?where name="老九");查詢年紀,收入和老九一樣的所有人的信息
select ?sid from ?emp where(age,incoming ) in (select ?age,incoming from emp ?where name="老九");?查詢年紀,收入和老九相同人的sid.
- 表子查詢
定義:返回的結果是多行多列(返回的就是一個表),一般接在from的后面,返回的是一個表。零時表: as ?零時表名
select ?* from (select ?* ?from ?dept ?INNER JOIN ?emp ?on dept.dept1=emp.dept2)as s where s.dept2>101