sql >> Base de Datos >  >> RDS >> Mysql

TOP 5 Sintaxis de eliminación de MySQL con consejos para desarrolladores de T-SQL

Nuestro viaje a MySQL comenzó con CREATE TABLE seguido de INSERT. Hoy, estamos procediendo a la declaración MySQL DELETE. Es casi tan común como la instrucción UPDATE de MySQL.

Dado que está familiarizado con T-SQL DELETE, el objetivo es aumentar su productividad utilizando la sintaxis de MySQL. Hay pequeñas diferencias en estas instrucciones DELETE, pero no hay nada que no puedas manejar. Comencemos.

Preparación de los datos de muestra

Una de las necesidades más comunes es la tarea de eliminar fila de MySQL. Lo examinaremos aquí, pero primero, tenemos que preparar nuestra área de trabajo. Para eliminar cualquier registro, primero debemos tenerlos. Por lo tanto, construyamos una base de datos en MySQL.

Siento nostalgia por las series de televisión de los años 80, así que usaré episodios de MacGyver y Quantum Leap como datos de muestra. Tengo el archivo de Excel final para importar los datos a una nueva base de datos. Este archivo tiene 2 hojas llamadas Títulos y Episodios . Los importaremos a ambos en dos tablas.

Antes de importar datos, debemos crear una base de datos llamada tv-series con dos tablas llamadas Títulos y Episodios . El trabajo de creación de tablas de MySQL es elemental con la herramienta adecuada. Estoy usando dbForge Studio para MySQL, y las siguientes Figuras 1 y 2 muestran la estructura de la tabla visual de mi base de datos presentada por esa herramienta.

El script para las tablas se encuentra a continuación:

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

Después de crear la base de datos y las tablas, podemos importar nuestros datos desde el archivo de Excel.

La herramienta más sencilla y potente que utilicé para importar archivos de Excel a MySQL es dbForge Studio para MySQL. Aprecio especialmente la adición de una nueva columna como clave principal en la tabla de destino. Además, el formato de fecha y hora de detección automática es una gran ayuda. Convierte fechas con un tipo de datos de texto y formatos de fecha extraños sin problemas.

Como vamos a comparar la sintaxis de MySQL con T-SQL, también puede importar el archivo de Excel a una nueva base de datos en SQL Server. Luego, use los mismos nombres de base de datos y tablas que en MySQL.

Más información

  • Herramienta de importación y exportación de MySQL en dbForge Studio para MySQL

1. Eliminar todos los datos de la tabla

Primero, lo más fácil. Intentemos hacer una copia de seguridad de los Episodios tabla y luego elimine los registros de la copia de seguridad. Realizaremos la operación estándar de eliminación de todas las filas de MySQL que es posible que deba realizar en diferentes situaciones.

CREATE TABLE episodes_backup AS
SELECT * FROM episodes;

DELETE FROM episodes_backup;

Como puede ver, la sintaxis es la misma que para T-SQL. La consulta eliminará todos los registros en episodes_backup mesa.

Algunas notas para ti:

  1. Si necesita eliminar varias filas o todas las filas, TRUNCATE TABLE es más rápido que DELETE sin una cláusula WHERE. Esto es cierto tanto para MySQL como para SQL Server.
  2. Ejecutar el código anterior en MySQL Workbench activará un Código de error 1175 . No está permitido porque MySQL Workbench se actualiza de forma predeterminada en modo seguro. Por lo tanto, no se permite eliminar o actualizar una tabla sin una cláusula WHERE. Sin embargo, puede deshabilitar esta función en Preferencias .

2. Eliminar DONDE en MySQL

El segundo punto se trata de usar DELETE con una condición, la operación MySQL delete from select. De esta forma, puede eliminar uno o más registros en un solo extracto, pero no todos. Por ejemplo, elimine la primera fila u otra fila o filas específicas. ¿Qué sucede si está buscando una forma de evitar registros duplicados en SQL? Usar la condición WHERE sería la solución.

De nuevo, la sintaxis es la misma en 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);

Nada extraordinario aquí, pero la próxima sección será diferente.

3. LÍMITE DE ELIMINACIÓN DE MySQL

¿LÍMITE? ¿Qué LÍMITE?

LIMIT es equivalente a TOP en T-SQL. Antes de tener un ejemplo de ELIMINAR, consultemos los registros que vamos a eliminar. Mira el código a continuación:

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

Aquí está su LÍMITE. Dará como resultado 2 registros como se muestra en la Figura 3 para la vista de tarjeta en dbForge Studio para MySQL:

Ahora, intentemos eliminarlos. Echa un vistazo al siguiente ejemplo:

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

Antes de eliminar 2 episodios, MySQL consultó todos los episodios desde 1987. Luego los clasificó en números de temporada y episodio. Finalmente, limitó los resultados a 2 registros. También es un método adecuado cuando necesitamos eliminar filas duplicadas. Nos permite especificar las condiciones para la eliminación y asegurarnos de que no eliminaremos nada necesario (pero hacer una copia de seguridad aún garantizaría la seguridad de los datos).

¿Hay un equivalente de T-SQL? ¿Crees que esto funcionará?

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

Si pega el código anterior en SQL Server Management Studio, obtendrá líneas onduladas en la cláusula ORDER BY. Sin embargo, TOP está permitido.

Sin embargo, si elimina la cláusula ORDER BY, su consulta eliminará 2 registros aleatorios. Finalmente, el código anterior no se ejecutará como se esperaba.

Para tener el mismo resultado que en MySQL, necesita el siguiente código:

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

Es un poco más largo en T-SQL que en MySQL. Pero hay más.

4. ELIMINAR MySQL con UNIRSE

Otra forma de eliminar registros es usarlo con un JOIN que filtrará los registros que desea eliminar. Como muchos usuarios lo definen, es la tarea de unión de eliminación de MySQL. Nada se ve diferente cuando no está usando un alias de tabla. Mira el ejemplo a continuación:

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

Esto también funcionará en T-SQL. Pero si usamos un alias de tabla como este:

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

MySQL arrojará un error. La sintaxis correcta es la siguiente:

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

¡Observa la diferencia!

5. Eliminar subconsulta en MySQL

Finalmente, intentamos usar subconsultas. Es una forma diferente de filtrar los registros que desea eliminar. Ya viste el ejemplo uno antes, pero vamos a tenerlo de nuevo:

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

Esta es una sintaxis perfectamente válida en T-SQL. ¿Pero funcionará en MySQL? Cambiémoslo un poco:

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

¡Ups! Parece que chocamos contra la pared. Esto es lo que dice MySQL:

Esta versión de MySQL aún no es compatible con las subconsultas 'LIMIT &IN/ALL/CUALQUIERA/ALGUNAS'

¿Qué sucede si eliminamos la palabra clave LIMIT? Activa otro error:

No puede especificar los "episodios" de la tabla de destino para una actualización en la cláusula FROM.

¿Hay una solución? Cambiar el código a una subconsulta anidada funcionará bien:

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)

Deberias hacer eso. Pero veamos un ejemplo más sensato:

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

Ahora, ¿cuál es el problema con estos ejemplos? Veamos:

  1. MySQL no aceptará la declaración DELETE con un filtro de subconsulta usando la palabra clave LIMIT. Todavía no.
  2. MySQL no aceptará DELETE de la tabla de destino igual a la tabla de subconsulta que la filtra.

[ID de formulario de envío de pulso =”13566″]

Conclusión

Hasta aquí todo bien. Tiene tres comparaciones de sintaxis DELETE para MySQL y T-SQL. Espero que la tercera entrega también les resulte útil en el futuro.

Esta publicación destacó la sintaxis de MySQL al eliminar

  • Todos los registros,
  • 1 o más registros con una cláusula WHERE,
  • Usando LIMIT,
  • Con ÚNETE,
  • Uso de subconsultas.

Puede ver fácilmente las formas en que MySQL elimina el rendimiento de la tarea de columna, o eliminar cualquier fila, múltiples filas y registros específicos por condiciones.

Si te gustó esta publicación, no dudes en compartirla en tus plataformas de redes sociales favoritas. Háganos saber también lo que piensa en la sección de Comentarios a continuación.