Mysql
 sql >> Baza danych >  >> RDS >> Mysql

TOP 5 składni usuwania MySQL z poradami dla programistów T-SQL

Nasza podróż do MySQL rozpoczęła się od CREATE TABLE, a następnie INSERT. Dzisiaj przystępujemy do instrukcji MySQL DELETE. Jest prawie tak powszechny jak instrukcja MySQL UPDATE.

Ponieważ znasz T-SQL DELETE, celem jest zwiększenie produktywności przy użyciu składni MySQL. Istnieją niewielkie różnice w tych instrukcjach DELETE, ale nie ma nic, z czym nie możesz sobie poradzić. Zaczynajmy.

Przygotowywanie przykładowych danych

Jedną z najczęstszych potrzeb jest zadanie usuwania wiersza MySQL. Przyjrzymy się temu tutaj, ale najpierw musimy przygotować nasz obszar roboczy. Aby usunąć jakiekolwiek rekordy, najpierw musimy je mieć. Dlatego zbudujmy bazę danych w MySQL.

Czuję nostalgię za serialami telewizyjnymi z lat 80., więc wykorzystam odcinki MacGyvera i Quantum Leap jako przykładowe dane. Mam ostateczny plik Excela do zaimportowania danych do nowej bazy danych. Ten plik ma 2 arkusze o nazwie Tytuły i Odcinki . Zaimportujemy je do dwóch tabel.

Przed zaimportowaniem danych powinniśmy stworzyć bazę danych o nazwie serial telewizyjny z dwoma tabelami o nazwie Tytuły i Odcinki . Zadanie tworzenia tabeli MySQL jest elementarne z odpowiednim narzędziem. Używam dbForge Studio dla MySQL, a poniższe rysunki 1 i 2 przedstawiają wizualną strukturę tabeli mojej bazy danych prezentowaną przez to narzędzie.

Skrypt tabel znajduje się poniżej:

CREATE DATABASE IF NOT EXISTS `tv-series`;

USE `tv-series`;

CREATE TABLE `tv-series`.titles (
  TitleID int NOT NULL AUTO_INCREMENT,
  Title varchar(50) DEFAULT NULL,
  `From` int DEFAULT NULL,
  `To` int DEFAULT NULL,
  PRIMARY KEY (TitleID)
)
ENGINE = INNODB,
AUTO_INCREMENT = 3,
AVG_ROW_LENGTH = 8192,
CHARACTER SET utf8mb4,
COLLATE utf8mb4_0900_ai_ci;

CREATE TABLE `tv-series`.episodes (
  EpisodeID int NOT NULL AUTO_INCREMENT,
  TitleID int DEFAULT NULL,
  EpisodeTitle varchar(100) DEFAULT NULL,
  AirDate date DEFAULT NULL,
  Synopsis text DEFAULT NULL,
  EpisodeNo int NOT NULL,
  SeasonNo int NOT NULL,
  PRIMARY KEY (EpisodeID)
)
ENGINE = INNODB,
AUTO_INCREMENT = 160,
AVG_ROW_LENGTH = 414,
CHARACTER SET utf8mb4,
COLLATE utf8mb4_0900_ai_ci;

ALTER TABLE `tv-series`.episodes
ADD INDEX IDX_episodes_TitleID (TitleID);

Po utworzeniu bazy danych i tabel możemy zaimportować nasze dane z pliku Excel.

Najprostszym i najpotężniejszym narzędziem, którego użyłem do importowania plików Excela do MySQL, jest dbForge Studio for MySQL. Szczególnie doceniam dodanie nowej kolumny jako klucza podstawowego w tabeli docelowej. Również format automatycznego wykrywania daty i czasu jest świetnym wsparciem. Konwertuje daty z typem danych tekstowych i dziwnymi formatami daty bez kłopotów.

Ponieważ zamierzamy porównać składnię MySQL do T-SQL, możesz również zaimportować plik Excel do nowej bazy danych na SQL Server. Następnie użyj tych samych nazw baz danych i tabel, co w MySQL.

Więcej informacji

  • Narzędzie do importu i eksportu MySQL w dbForge Studio dla MySQL

1. Usuń wszystkie dane z tabeli

Po pierwsze, najłatwiejsze. Spróbujmy wykonać kopię zapasową odcinków tabeli, a następnie usuń rekordy kopii zapasowej. Wykonamy standardową operację usuwania wszystkich wierszy MySQL, która może być potrzebna w różnych sytuacjach.

CREATE TABLE episodes_backup AS
SELECT * FROM episodes;

DELETE FROM episodes_backup;

Jak widać, składnia jest taka sama jak w przypadku T-SQL. Zapytanie usunie wszystkie rekordy w epizodes_backup tabela.

Kilka uwag dla Ciebie:

  1. Jeśli chcesz usunąć wiele wierszy lub wszystkie wiersze, funkcja TRUNCATE TABLE jest szybsza niż DELETE bez klauzuli WHERE. Dotyczy to zarówno MySQL, jak i SQL Server.
  2. Wykonanie powyższego kodu w MySQL Workbench wyzwoli Kod błędu 1175 . Nie jest to dozwolone, ponieważ MySQL Workbench domyślnie aktualizuje się w trybie awaryjnym. Dlatego usuwanie lub aktualizowanie tabeli bez klauzuli WHERE jest niedozwolone. Możesz jednak wyłączyć tę funkcję w Preferencjach .

2. Usuń GDZIE w MySQL

Drugi punkt dotyczy użycia DELETE z warunkiem, czyli usunięcia MySQL z operacji select. W ten sposób możesz usunąć jeden lub więcej rekordów w jednym wyciągu, ale nie wszystkie. Na przykład usuń pierwszy wiersz lub inny określony wiersz/wiersze. Co zrobić, jeśli szukasz sposobu na uniknięcie zduplikowanych rekordów w SQL? Rozwiązaniem byłoby zastosowanie warunku WHERE.

Ponownie, składnia jest taka sama w T-SQL:

-- Delete 1 record using an equality operator
DELETE FROM episodes
WHERE EpisodeID = 150;

-- Delete 3 records using IN
DELETE FROM episodes
WHERE EpisodeID IN (151,152,153);

Nie ma tu nic nadzwyczajnego, ale następna sekcja będzie inna.

3. LIMIT USUŃ MySQL

LIMIT? Jaki LIMIT?

LIMIT jest odpowiednikiem TOP w T-SQL. Zanim mamy przykład DELETE, przyjrzyjmy się rekordom zapytań, które zamierzamy usunąć. Sprawdź poniższy kod:

SELECT * FROM episodes
WHERE year(AirDate) = 1987
ORDER BY SeasonNo, EpisodeNo
LIMIT 2;

Oto twój LIMIT. Spowoduje to powstanie 2 rekordów, jak pokazano na rysunku 3 dla widoku karty w dbForge Studio dla MySQL:

Teraz spróbujmy je usunąć. Spójrz na poniższy przykład:

DELETE FROM episodes
WHERE year(AirDate) = 1987
ORDER BY SeasonNo, EpisodeNo
LIMIT 2;

Przed usunięciem 2 odcinków MySQL przeszukał wszystkie odcinki z 1987 roku. Następnie posortował je według numerów sezonów i odcinków. Ostatecznie ograniczył wyniki do 2 rekordów. Jest to również odpowiednia metoda, gdy musimy usunąć zduplikowane wiersze. Pozwala nam określić warunki usunięcia i upewnić się, że nie usuniemy niczego niezbędnego (ale zrobienie kopii zapasowej i tak zapewni bezpieczeństwo danych).

Czy istnieje odpowiednik T-SQL? Czy myślisz, że to zadziała?

DELETE TOP (2) FROM episodes
WHERE year(AirDate) = 2020
ORDER BY SeasonNo, EpisodeNo
GO

Jeśli wkleisz powyższy kod w SQL Server Management Studio, otrzymasz faliste linie w klauzuli ORDER BY. Jednak TOP jest dozwolone.

Jeśli jednak usuniesz klauzulę ORDER BY, zapytanie usunie 2 losowe rekordy. Wreszcie powyższy kod nie będzie działał zgodnie z oczekiwaniami.

Aby uzyskać taki sam wynik jak w MySQL, potrzebujesz następującego kodu:

DELETE FROM episodes
WHERE EpisodeID IN
(SELECT TOP 2 EpisodeID FROM Episodes
 WHERE YEAR(AirDate) = 1987
 ORDER BY SeasonNo, EpisodeNo)

W T-SQL jest to nieco dłuższe niż w MySQL. Ale to nie wszystko.

4. MySQL DELETE z JOIN

Innym sposobem usuwania rekordów jest użycie go z funkcją JOIN, która filtruje rekordy, które chcesz usunąć. Jak definiuje to wielu użytkowników, jest to zadanie łączenia z usuwaniem MySQL. Nic nie wygląda inaczej, gdy nie używasz aliasu tabeli. Sprawdź poniższy przykład:

DELETE episodes
FROM episodes
INNER JOIN titles ON titles.TitleID = episodes.TitleID
WHERE titles.TitleID = 3
AND episodes.SeasonNo = 3;

To zadziała również w T-SQL. Ale jeśli użyjemy takiego aliasu tabeli:

DELETE episodes
FROM episodes e
INNER JOIN titles t ON t.TitleID = e.TitleID
WHERE t.TitleID = 3
AND e.SeasonNo = 3;

MySQL zgłosi błąd. Prawidłowa składnia jest poniżej:

DELETE e
FROM episodes e
INNER JOIN titles t ON t.TitleID = e.TitleID
WHERE t.TitleID = 3
AND e.SeasonNo = 3;

Zauważ różnicę!

5. Usuń podzapytanie w MySQL

Na koniec próbujemy użyć podzapytań. Jest to inny sposób filtrowania rekordów, które chcesz usunąć. Widziałeś już przykład jeden wcześniej, ale spróbujmy go jeszcze raz:

DELETE FROM episodes
WHERE EpisodeID IN
(SELECT TOP 2 EpisodeID FROM Episodes
 WHERE YEAR(AirDate) = 1987
 ORDER BY SeasonNo, EpisodeNo)

To jest doskonale poprawna składnia w T-SQL. Ale czy zadziała w MySQL? Zmieńmy to trochę:

DELETE FROM episodes
WHERE EpisodeID IN
(SELECT EpisodeID FROM Episodes
 WHERE YEAR(AirDate) = 1987
 ORDER BY SeasonNo, EpisodeNo
 LIMIT 2);

Ups! Wygląda na to, że uderzyliśmy w ścianę. Oto, co mówi MySQL:

Ta wersja MySQL nie obsługuje jeszcze podzapytania „LIMIT I WSZYSTKIE/WSZYSTKIE/NIEKTÓRE”

Co się stanie, jeśli usuniemy słowo kluczowe LIMIT? Wywołuje kolejny błąd:

Nie możesz określić „odcinków” tabeli docelowej dla aktualizacji w klauzuli FROM.

Czy jest w pobliżu praca? Zmiana kodu na zagnieżdżone podzapytanie będzie działać dobrze:

DELETE FROM episodes
WHERE EpisodeID IN
(SELECT EpisodeID FROM (SELECT EpisodeID FROM Episodes
 WHERE YEAR(AirDate) = 1987
 ORDER BY SeasonNo, EpisodeNo
 LIMIT 5) AS T)

Że należy to zrobić. Ale weźmy bardziej sensowny przykład:

DELETE FROM episodes
WHERE TitleID IN
(SELECT TitleID FROM titles
 WHERE `From` BETWEEN 1995 AND 2000);

O co chodzi z tymi przykładami? Zobaczmy:

  1. MySQL nie zaakceptuje instrukcji DELETE z filtrem podzapytania używającym słowa kluczowego LIMIT. Jeszcze nie.
  2. MySQL nie zaakceptuje DELETE z tabeli docelowej równej tabeli podzapytania, która ją filtruje.

[sendpulse-form id=”13566″]

Wniosek

Jak na razie dobrze. Masz trzy porównania składni DELETE dla MySQL i T-SQL. Mam nadzieję, że trzecia część okaże się przydatna również w przyszłości.

Ten post podkreślił składnię MySQL podczas usuwania

  • Wszystkie rekordy,
  • 1 lub więcej rekordów z klauzulą ​​WHERE,
  • Używając LIMIT,
  • Korzystanie z opcji JOIN,
  • Korzystanie z podzapytań.

Możesz łatwo zobaczyć sposoby wykonania zadania usuwania kolumn MySQL lub usunąć dowolny wiersz, wiele wierszy i określone rekordy według warunków.

Jeśli podobał Ci się ten post, udostępnij go na swoich ulubionych platformach społecznościowych. Daj nam również znać, co myślisz w sekcji Komentarze poniżej.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. 50 najważniejszych pytań do rozmowy kwalifikacyjnej MySQL, które musisz przygotować w 2022 r.

  2. Zainstaluj i skonfiguruj MySQL Workbench na Ubuntu 16.04

  3. Łączenie się z MySQL za pomocą Pythona

  4. Jak sprawić, by UTF-8 działał w aplikacjach internetowych Java?

  5. gem mysql2 skompilowany dla niewłaściwej biblioteki klienta mysql