多測師課堂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;
右表獨有的資料:
左表和右表獨有的資料: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
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刪除資料可以恢復