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:

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 (LIKEINBETWEEN><<=>=<>, =). 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:

pracownicy
oceny

Przykład 1:

Aby usunąć z tabeli pracownicy rekord, którego id jest równe 234 posłużymy się następującym poleceniem:

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:

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:

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.

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:

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:

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:

SELECT id_pracownika FROM oceny GROUP BY id_pracownika
ORDER BY AVG(ocena) ASC
LIMIT 1
wynik zapytania

Otrzymany wynik jest dla nas satysfakcjonujący, a powyższe zapytanie możemy wykorzystać do zapytania DELETE. Oto mamy gotowy SQL:

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ę!