SQL點滴系列之刪除數據(五)

【SQL從一點一滴分析系列文章】為實際開發中的點點滴滴的總結,從最最簡單的SQL 查詢 到 綜合分析查詢
在分析 SQL 時,也會同時分析 mybatis 、Hibernate 中的相關操作
點擊查看詳情

本節講述 在數據庫中刪除表中的數據,以及 having 與 where 的分析

1 刪除表中所有的記錄

實際開發中,我們有時需要刪除一個表中的所有的數據,我們可以使用 delete 命令來操作

delete from t_user
2 刪除表中指定的記錄

刪除表中指定數據或者說是滿足某些條件的數據,我們可以使用 where 子句,例如刪除表中 年齡小于 18 歲的用戶,我們可以這樣寫

delete from t_user where user_age <18

這里使用到的是滿足條件的記錄,如果要刪除單個記錄,那么在指定的判斷條件一般使用 主關鍵字或其他唯一的關鍵字來作為判別條件,例如我們這樣寫

delete from t_user where user_id =118

在這里使用到的 user_id 就是用戶表中用戶的唯一關鍵標識,所以這里只是刪除了其中一條數據。

3 刪除違反參照完整性的記錄

例如,某些用戶員工被分配到了一個不存在的部門中,要將這些員工刪除,那么我們可以使用 not exists 和子查詢來判斷刪除

delete from t_emp e
     where not  exists (
       select * from t_dep d where  d.did = e.did
)

也可以使用 not in 來查詢

delete from t_emp  e
where  e.did not in (select d.did from t_dep d)

t_emp 表用來保存被分配部門的用戶信息數據
t_dep 表用來保存部門信息

4 刪除表中的重復記錄

例如在表 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 是重復的

5 刪除從其他表引用的記錄

從一個表中刪除被另一個表中引用的記錄,例如下面的表中記錄來了來透支經費的部門,每行記錄了透支發生的部門與透支金額以及事由

在這里插入圖片描述

例如在這里我們需要刪除所在部門已經發生了三次以上的透支申請的所有部門的記錄,在這里我們可以這樣來寫

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 命令將刪除由子查詢返回的部門。

6 HAVING 關鍵字一談

HAVING 子句可以讓我們篩選分組后的各組數據,也就是說HAVING語句通常與GROUP BY語句聯合使用,用來過濾由GROUP BY語句返回的記錄集。

6.1 SQL語言中中的聚合函數

例如 SUM, COUNT, MAX, AVG等這些函數和其它函數的根本區別就是它們一般作用在多條記錄上

select sum(acc_count) from t_acc

如上 通過 sum 函數來統計 所有部門的透支金額
通過使用 GROUP BY 子句,可以讓SUM 和 COUNT 這些函數對屬于一組的數據起作用

6.2 顯示每個地區的總人口數和總面積
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可以。

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容