1. 程式人生 > 資料庫 >多測師課堂008_mysql之多表(002)高階講師肖sir

多測師課堂008_mysql之多表(002)高階講師肖sir

什麼是多表關聯查詢 ?
有時候查詢的資料需要從2個表或者更多的表中提取,這個時候就需要使用多表關聯查詢多表查詢分1.內連線 2.左連線 3.右連線 4、全外連線


1、笛卡爾積查詢
兩張表相乘得到的結果:比如,左邊有m條記錄,右邊有n條記錄,查詢出來的結果就是m*n,這種查詢包含大量的錯誤結果,通常不會使用這種查詢
select * from 表1,表2 ;
格式:select * from dept,emp ;
2、內連線 (普通內連線,隱藏內連線)
查詢兩個表共有的關聯的資料
普通內連線:
select * from dept inner join emp on dept.dept1=emp.dept2;

隱藏內連線:
select * FROM dept,emp where dept.dept1=emp.dept2 ;
左連線:
select * from dept left join emp on dept.dept1=emp.dept2 ;
右連線:
select * from dept right join emp on dept.dept1=emp.dept2 ;

左表獨有的資料:
select * from dept left join emp on dept.dept1=emp.dept2 where name is null;

右表獨有的資料:

select * from dept right join emp on dept.dept1=emp.dept2 where name is null;


左表和右表獨有的資料: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 name is null;


全外連線:

方法一:內連線+左右獨有

select * FROM dept,emp where 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 name is null;
方法二:左連線+右獨有資料

select * from dept left join emp on dept.dept1=emp.dept2
union
select * from dept right join emp on dept.dept1=emp.dept2 where name is nul
方法三:右連線+左獨有的資料

 

子查詢:
什麼是子查詢?一個查詢巢狀另一個查詢 子查詢分
1. 標量子查詢 (返回一個值)
標量子查詢 把一個sql執行返回的一個值,作為另一個sql的一個條件
得到的結果是一行一列,一般出現在where之後

注意點:標量子查詢允許使用的符號
=,!=,> ,>=,=<,<
select * from emp where dept2=(

select dept1 from dept where dept_name="財務" ) ;
2. 列子查詢 (返回一個列)
定義:返回的是一列值

注意點:通常在where 條件的後使用,使用的是in 或not in ,不允許使用=,>,<
例題:
求出工資>2000部門

select DISTINCT(dept2) from emp where incoming >5000 ;

select dept_name from dept where dept1 in (select DISTINCT(dept2) from emp where incoming >5000 )

 

select dept_name from dept where dept1 in (select DISTINCT(dept2) from emp where incoming >5000 )
3. 行子查詢 (返回一行多列)
指子查詢返回的結果集是一行多列
一般出現在where後

select age ,dept2,incoming from emp1 where name="牛十
select * from emp1 where (age,dept2) =any (select age ,dept2 from emp1 where name="牛十");

 

 


4. 表子查詢 (返回一個表) from的後面指子查詢返回的結果是一個表(多行多列)select dept2,max(incoming) from emp group by dept2

select dept_name ,s.c from dept ,( select dept2,max(incoming) c from emp group by dept2) s where dept.dept1=s.dept2 ;

select DISTINCT(dept_name) from dept inner join (select dept2,age from emp where dept2=101 )as s on dept.dept1=s.dept2 ;

注意:臨時表 取別名 ,聚合函式取別名 ,

1、帶in關鍵字的子查詢

一個查詢預計的條件可能落在另一select語句的查詢結果中

2、比較運算子的子查詢

= ,> ,>,>= ,=<
3、帶any關鍵字的子查詢
=any 與 in 等效
與比較運算子聯合使用,表示子查詢返回的任何值比較為真,則返回真


4、some

5、帶all的關鍵字的字查詢
!=all 或者 <>all 與 not in 等效
表示滿足所有的條件

6、帶exists 關鍵字的子查詢
理解為:將主查詢的資料,放到子查詢中做條件驗證,根據驗證結果,來決定主查詢的是資料結構
在子查詢到記錄,則進行外層查詢,否則,不執行外層查詢
7、合併查詢 union 去除重複的記錄

union all 不會去除重複的記錄


注意:
1、子查詢必須放在一對小括號內;
2、“=”是比較運算子,還可以與其他比較運算子一起使用,要求子查詢的列只有一個一行一列
3、子查詢通常作為where的條件,表子查詢一般在from的後面
4、子查詢不能包含order by的語句


select a.dept1 from (select * from dept where dept_name="財務" or dept_name="銷售")a where dept1>101;

select DISTINCT(dept_name) from dept inner join (select dept2,age from emp where dept2=101 )as s on dept.dept1=s.dept2 ;

mysql 刪除表的操作(delete,truncate,drop)

delete:刪除整張表

格式:delete from 表名 刪除整個表
delete from 表名 where 條件


truncate:刪除表的資料

格式:truncate table 表名
例題:truncate table bb

drop:刪除表結構和表資料,以及約束,觸發器,索引


格式:drop table 表名


區別:
1、執行速度 drop>truncate>delete
2、應用範圍:tuncate 只能對table,delete可以是table和view ;
3、表所佔的空間
drop 把表佔的空間全部釋放
delete 刪除不會減少表所佔的空間
turncate 刪除會恢復到初始大小
4、tuncate 刪除後不能恢復資料,delect刪除資料可以恢復