DELETE FROM – usuwanie rekordów z bazy danych – Kurs SQL
W języku SQL do usuwania konkretnych rekordów, bądź zawartości całej tabeli w bazie danych służy polecenie DELETE
. Jego składnia jest następująca:
1 | DELETE FROM nazwa_tabeli WHERE warunek; |
Tak jak w przypadku polecenia UPDATE
czy SELECT
warunek WHERE
może być połączony z jednym z operatorów omówionych wcześniej (LIKE, IN, BETWEEN, >, <, <=, >=, <>, =
). Możemy również usuwać rekordy uzależnione od wartości pola z innej tabeli. Spójrzmy zatem na poniższe przykłady. Będą one oparte o dwie przykładowe tabele: pracownicy i oceny, które możecie zobaczyć poniżej:
Przykład 1:
Aby usunąć z tabeli pracownicy
rekord, którego id
jest równe 234
posłużymy się następującym poleceniem:
1 | DELETE FROM pracownicy WHERE id=234; |
Przykład 2:
Jeżeli chcemy z tabeli usunąć wszystkich pracowników których ostatnia litera imienia to a
wydamy polecenie:
1 | DELETE FROM pracownicy WHERE imie LIKE '%a' ; |
Składnia z wykorzystaniem LIKE szczegółowo została omówiona w części: SELECT, FROM, WHERE, LIKE, BETWEEN, IN – Kurs języka SQL (mySQL) cz. 4b
Przykład 3:
Poleceniem DELETE możemy posłużyć się także, kiedy chcemy usunąć wszystkie rekordy z danej tabeli. Jego składnia jest wtedy następująca:
1 | DELETE FROM pracownicy; |
W niektórych menadżerach do połączeń z bazą danych przed wykonaniem zapytania możecie otrzymać zapytanie o potwierdzenie usunięcia wszystkich rekordów. Możemy ominąć takie ostrzeżenie stosując warunek, który zawsze będzie spełniony, np. where 1=1
.
1 | DELETE FROM pracownicy WHERE 1=1; |
Kiedyś jeden z czytelników starszej wersji tego bloga zwrócił mi uwagę, że brakuje przykładów dotyczących usunięcia danych z tabeli w zależności od danych z innej tabeli. Przygotowałem ich kilka poniżej:
Przykład 4:
Z tabeli pracownicy należy usunąć pracowników, którzy nie otrzymali żadnej oceny (brak id_pracownik
z tabeli oceny
w id
z tabeli pracownicy
) . Musimy zatem w zapytaniu SQL wykorzystać obie te tabele. Spójrzmy zatem na poniższe zapytanie SQL:
1 | DELETE FROM pracownicy WHERE id NOT IN ( SELECT id_pracownika FROM oceny); |
Tłumacząc powyższy SQL, usuwamy wszystkich pracowników z tabli pracownicy
, których id
nie znajduje się w kolumnie id_pracownika
w tabeli oceny
. W naszym przykładzie zostanie usunięty jeden pracownik, Agnieszka Stępień o numerze id=237
.
Przykład 5:
Chcielibyśmy z tabeli pracownicy usunąć pracownika, który otrzymał najniższą średnią ocen. W tym przypadku w pierwszym korku musielibyśmy z tabeli oceny
wyliczyć średnią ocen dla każdego z pracowników i wybrać tego, który otrzymał najniższą średnią. Spójrzmy zatem na poniższe zapytanie:
1 2 | SELECT id_pracownika, AVG (ocena) FROM oceny GROUP BY id_pracownika; |
Powyższym zapytaniem otrzymamy listę wraz z ocenami:
Widzimy, że najniższą średnią uzyskał pracownik o numerze id/id_pracownika=234
. Jak zatem wybrać tylko jeden rekord z najniższą średnią i przekazać go do zapytania DELETE
? Możemy skorzystać z: ORDER BY
oraz LIMIT
. Spójrzmy zatem na przykład:
1 2 3 | SELECT id_pracownika FROM oceny GROUP BY id_pracownika ORDER BY AVG (ocena) ASC LIMIT 1 |
Otrzymany wynik jest dla nas satysfakcjonujący, a powyższe zapytanie możemy wykorzystać do zapytania DELETE
. Oto mamy gotowy SQL:
1 2 3 4 | DELETE FROM pracownicy WHERE id = ( SELECT id_pracownika FROM oceny GROUP BY id_pracownika ORDER BY AVG (ocena) ASC LIMIT 1) |
Uwaga:
Jeżeli chcesz usunąć wszystkie dane z konkretnej tablicy polecam użycie: TRUNCATE
. Więcej o tym poleceniu przeczytasz we wpisie: TRUNCATE TABLE – usuwanie wszystkich rekordów z tablicy – Kurs SQL. Możesz też poczytać o różnicach pomiędzy DELETE
i TRUNCATE
tutaj: DELETE FROM i TRUNCATE TABLE – jakie są różnice
Potrzebujesz innego przykładu? Napisz w komentarzu, chętnie pomogę!