Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

TOP 5 MySQL Hapus Sintaks dengan Tips untuk Pengembang T-SQL

Perjalanan kami ke MySQL dimulai dengan CREATE TABLE diikuti oleh INSERT. Hari ini, kita melanjutkan ke pernyataan MySQL DELETE. Ini hampir sama dengan pernyataan MySQL UPDATE.

Karena Anda sudah familiar dengan T-SQL DELETE, tujuannya adalah untuk membuat Anda lebih produktif menggunakan sintaks MySQL. Ada perbedaan kecil dalam pernyataan DELETE ini, tetapi tidak ada yang tidak dapat Anda tangani. Mari kita mulai.

Menyiapkan Contoh Data

Salah satu kebutuhan yang paling umum adalah tugas menghapus baris MySQL. Kami akan memeriksanya di sini, tetapi pertama-tama, kami harus menyiapkan area kerja kami. Untuk menghapus catatan apa pun, pertama-tama kita harus memilikinya. Jadi, mari kita membangun database di MySQL.

Saya merasa nostalgia tentang serial TV dari tahun 80-an, jadi saya akan menggunakan episode dari MacGyver dan Quantum Leap untuk data sampel. Saya memiliki file Excel terakhir untuk mengimpor data ke database baru. File ini memiliki 2 lembar bernama Judul dan Episode . Kami akan mengimpor keduanya ke dalam dua tabel.

Sebelum mengimpor data, kita harus membuat database bernama tv-series dengan dua tabel yang disebut Judul dan Episode . Pekerjaan membuat tabel MySQL adalah dasar dengan alat yang tepat. Saya menggunakan dbForge Studio untuk MySQL, dan Gambar 1 dan 2 berikut menampilkan struktur tabel visual dari database saya yang disajikan oleh alat itu.

Script untuk tabel di bawah ini:

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);

Setelah membuat database dan tabel, kita dapat mengimpor data dari file Excel.

Alat yang paling mudah dan kuat yang saya gunakan untuk mengimpor file Excel ke MySQL adalah dbForge Studio untuk MySQL. Saya sangat menghargai penambahan kolom baru sebagai kunci utama di tabel target. Selain itu, format tanggal dan waktu deteksi otomatis adalah dukungan yang bagus. Ini mengonversi tanggal dengan tipe data teks dan format tanggal aneh tanpa kerumitan.

Karena kita akan membandingkan sintaks MySQL dengan T-SQL, Anda juga dapat mengimpor file Excel ke database baru di SQL Server. Kemudian, gunakan database dan nama tabel yang sama seperti di MySQL.

Informasi Lebih Lanjut

  • Alat impor dan ekspor MySQL di dbForge Studio untuk MySQL

1. Hapus Semua Data dari Tabel

Pertama, yang paling mudah. Mari kita coba mencadangkan Episode tabel dan kemudian menghapus catatan cadangan. Kami akan melakukan operasi penghapusan semua baris MySQL standar yang mungkin perlu Anda lakukan dalam situasi yang berbeda.

CREATE TABLE episodes_backup AS
SELECT * FROM episodes;

DELETE FROM episodes_backup;

Seperti yang Anda lihat, sintaksnya sama dengan T-SQL. Kueri akan menghapus semua catatan di episodes_backup tabel.

Beberapa catatan untuk Anda:

  1. Jika Anda perlu menghapus beberapa baris atau semua baris, TRUNCATE TABLE lebih cepat daripada DELETE tanpa klausa WHERE. Ini berlaku untuk MySQL dan SQL Server.
  2. Mengeksekusi kode di atas di MySQL Workbench akan memicu Kode Kesalahan 1175 . Itu tidak diizinkan karena MySQL Workbench default ke pembaruan mode aman. Dengan demikian, penghapusan atau pembaruan ke tabel tanpa klausa WHERE tidak diperbolehkan. Namun Anda dapat menonaktifkan fitur ini di Preferensi .

2. Hapus WHERE di MySQL

Poin kedua adalah tentang penggunaan DELETE dengan syarat, MySQL menghapus dari operasi pilih. Dengan cara ini, Anda dapat menghapus satu atau beberapa catatan dalam satu pernyataan, tetapi tidak semuanya. Misalnya, hapus baris pertama atau baris/baris tertentu lainnya. Bagaimana jika Anda mencari cara untuk menghindari duplikat catatan di SQL? Menggunakan kondisi WHERE akan menjadi solusinya.

Sekali lagi, sintaksnya sama di 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);

Tidak ada yang luar biasa di sini, tetapi bagian selanjutnya akan berbeda.

3. Batas Penghapusan MySQL

MEMBATASI? BATAS berapa?

LIMIT setara dengan TOP di T-SQL. Sebelum kita memiliki contoh DELETE, mari kita query record yang akan kita hapus. Lihat kode di bawah ini:

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

Inilah LIMIT Anda. Ini akan menghasilkan 2 record seperti yang ditunjukkan pada Gambar 3 untuk tampilan kartu di dbForge Studio untuk MySQL:

Sekarang, mari kita coba untuk menghapusnya. Perhatikan contoh di bawah ini:

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

Sebelum menghapus 2 episode, MySQL menanyakan semua episode dari tahun 1987. Kemudian mengurutkannya ke dalam musim dan nomor episode. Akhirnya, itu membatasi hasil menjadi 2 catatan. Ini juga merupakan metode yang cocok ketika kita perlu menghapus baris duplikat. Ini memungkinkan kami menentukan kondisi untuk penghapusan dan memastikan bahwa kami tidak akan menghapus apa pun yang diperlukan (tetapi membuat cadangan tetap akan memberikan keamanan data).

Apakah ada yang setara dengan T-SQL? Apakah menurut Anda ini akan berhasil?

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

Jika Anda menempelkan kode di atas di SQL Server Management Studio, Anda akan mendapatkan garis berlekuk-lekuk di klausa ORDER BY. Namun, TOP diperbolehkan.

Namun, jika Anda menghapus klausa ORDER BY, kueri Anda akan menghapus 2 catatan acak. Akhirnya, kode di atas tidak akan berjalan seperti yang diharapkan.

Untuk mendapatkan hasil yang sama seperti di MySQL, Anda memerlukan kode berikut:

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

Ini sedikit lebih lama di T-SQL daripada di MySQL. Tapi masih ada lagi.

4. HAPUS MySQL dengan GABUNG

Cara lain untuk menghapus catatan adalah menggunakannya dengan GABUNG yang akan memfilter catatan yang ingin Anda hapus. Seperti yang didefinisikan oleh banyak pengguna, ini adalah tugas bergabung menghapus MySQL. Tidak ada yang terlihat berbeda saat Anda tidak menggunakan alias tabel. Periksa contoh di bawah ini:

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

Ini juga akan bekerja di T-SQL. Tapi jika kita menggunakan tabel alias seperti ini:

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

MySQL akan melempar kesalahan. Sintaks yang benar di bawah ini:

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

Perhatikan perbedaannya!

5. Hapus Subquery di MySQL

Akhirnya, kami mencoba menggunakan subquery. Ini adalah cara berbeda untuk memfilter catatan yang ingin Anda hapus. Anda sudah melihat contohnya sebelumnya, tetapi mari kita ulangi lagi:

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

Ini adalah sintaks yang benar-benar valid di T-SQL. Tetapi apakah ini akan berfungsi di MySQL? Mari kita ubah sedikit:

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

Ups! Sepertinya kita menabrak dinding. Inilah yang dikatakan MySQL:

Versi MySQL ini belum mendukung 'LIMIT &IN/ALL/ANY/SOME subquery'

Bagaimana jika kita menghapus kata kunci LIMIT? Ini memicu kesalahan lain:

Anda tidak dapat menentukan 'episode' tabel target untuk pembaruan dalam klausa FROM.

Apakah ada solusi? Mengubah kode ke subquery bersarang akan berjalan dengan baik:

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)

Itu harus melakukannya. Tapi mari kita lihat contoh yang lebih masuk akal:

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

Sekarang, apa masalahnya dengan contoh-contoh ini? Mari kita lihat:

  1. MySQL tidak akan menerima pernyataan DELETE dengan filter subquery menggunakan kata kunci LIMIT. Belum.
  2. MySQL tidak akan menerima DELETE dari tabel target yang sama dengan tabel subquery yang memfilternya.

[sendpulse-form id="13566″]

Kesimpulan

Sejauh ini baik. Anda memiliki tiga perbandingan sintaks DELETE untuk MySQL dan T-SQL. Saya harap angsuran ketiga juga terbukti bermanfaat bagi Anda di masa depan.

Posting ini menyoroti sintaks MySQL saat menghapus

  • Semua catatan,
  • 1 record atau lebih dengan klausa WHERE,
  • Menggunakan LIMIT,
  • Menggunakan GABUNG,
  • Menggunakan subkueri.

Anda dapat dengan mudah melihat cara kinerja tugas kolom penghapusan MySQL, atau menghapus baris, beberapa baris, dan catatan tertentu berdasarkan kondisi.

Jika Anda menyukai posting ini, jangan ragu untuk membagikannya di platform media sosial favorit Anda. Beri tahu kami juga pendapat Anda di bagian Komentar di bawah.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana saya bisa mengaktifkan ekstensi MySQLi di PHP 7?

  2. YEARWEEK() Contoh – MySQL

  3. Ubah cap waktu Unix menjadi tanggal yang dapat dibaca manusia menggunakan MySQL

  4. Bagaimana cara membuat pengguna MySQL hanya-baca?

  5. Apa manfaat zerofill di MySQL?