【SQL從一點一滴分析系列文章】爲實際開發中的點點滴滴的總結,從最最簡單的SQL 查詢 到 綜合分析查詢 在分析 SQL 時,也會同時分析 mybatis 、Hibernate 中的相關操做 點擊查看詳情sql
本節講述 在數據庫中刪除表中的數據,以及 having 與 where 的分析數據庫
實際開發中,咱們有時須要刪除一個表中的全部的數據,咱們可使用 delete 命令來操做mybatis
delete from t_user
複製代碼
刪除表中指定數據或者說是知足某些條件的數據,咱們可使用 where 子句,例如刪除表中 年齡小於 18 歲的用戶,咱們能夠這樣寫函數
delete from t_user where user_age <18
複製代碼
這裏使用到的是知足條件的記錄,若是要刪除單個記錄,那麼在指定的判斷條件通常使用 主關鍵字或其餘惟一的關鍵字來做爲判別條件,例如咱們這樣寫spa
delete from t_user where user_id =118
複製代碼
在這裏使用到的 user_id 就是用戶表中用戶的惟一關鍵標識,因此這裏只是刪除了其中一條數據。.net
例如,某些用戶員工被分配到了一個不存在的部門中,要將這些員工刪除,那麼咱們可使用 not exists 和子查詢來判斷刪除code
delete from t_emp e
where not exists (
select * from t_dep d where d.did = e.did
)
複製代碼
也可使用 not in 來查詢cdn
delete from t_emp e
where e.did not in (select d.did from t_dep d)
複製代碼
t_emp 表用來保存被分配部門的用戶信息數據 t_dep 表用來保存部門信息blog
例如在表 t_dup 中有這樣的數據 圖片
咱們想保留一個 name 爲張三的記錄,其餘 name 爲張三的記錄,不須要關心 id 是多少,最終表中只有一條有關張三的記錄,咱們能夠這樣寫delete from t_dup
where id not in (select min(id) from t_dup group by name)
複製代碼
在 MySQL 中,使用上述寫法會有異常
Error : You can't specify target table 't_dup' for update in FROM clause
複製代碼
不能先select出同一表中的某些值,再update這個表(在同一語句中),因此在 MySQL 中能夠這樣寫
delete from t_dup
where name in (
select t.name from
(
select name from t_dup group by name HAVING count(1) > 1
) t
)
複製代碼
要刪除重複記錄,首先要明肯定義這個重複的概念,也就是說你要刪除什麼樣的重複數據,而在上述的操做中,定義的是 name 是重複的
從一個表中刪除被另外一個表中引用的記錄,例以下面的表中記錄來了來透支經費的部門,每行記錄了透支發生的部門與透支金額以及事由
例如在這裏咱們須要刪除所在部門已經發生了三次以上的透支申請的全部部門的記錄,在這裏咱們能夠這樣來寫delete from t_emp
where dep_id in(select acc_dep_id from t_acc group by acc_dep_id having count(*) >=3)
複製代碼
上述sql 操做中,子查詢
select acc_dep_id from t_acc group by acc_dep_id having count(*) >=3)
複製代碼
這裏用來查詢那些發生過三次以上的透支申請的部門,而後 delete 命令將刪除由子查詢返回的部門。
HAVING 子句可讓咱們篩選分組後的各組數據,也就是說HAVING語句一般與GROUP BY語句聯合使用,用來過濾由GROUP BY語句返回的記錄集。
例如 SUM, COUNT, MAX, AVG等這些函數和其它函數的根本區別就是它們通常做用在多條記錄上
select sum(acc_count) from t_acc
複製代碼
如上 經過 sum 函數來統計 全部部門的透支金額 經過使用 GROUP BY 子句,可讓SUM 和 COUNT 這些函數對屬於一組的數據起做用
select region, sum(population), sum(area)
from t_user_city group by region
複製代碼
先以region把返回記錄分紅多個組,這就是GROUP BY的字面含義,分完組後,而後用聚合函數 sum 對每組中的不一樣字段(一或多條記錄)做運算。
而後咱們在上述的查詢結果再進一步篩選,顯示每一個地區的總人口數和總面積,但人口數量超過1000000的地區,咱們能夠這樣來寫
select region, sum(population), sum(area)
from t_user_city group by region
having sum(population)>1000000
複製代碼
在這裏使用到了 having 來篩選了數據,沒有使用 where 關鍵字,where關鍵字有個區別是where是group by以前進行條件篩選,而having是group by以後進行條件篩選,咱們上述的需求,是須要在分組以後篩選,還有一點就是where後的條件表達式裏不容許使用聚合函數,而having能夠。