Tag Archives: sql

Cómo utilizar JOIN en sentencias UPDATE o DELETE.

Una práctica muy recomendable antes de lanzar una sentencia UPDATE o DELETE sobre un subconjunto de tuplas, es probar a realizar la proyección, afinando las condiciones de restricción para el subconjunto (mediante una sentencia WHERE). Cuando nos encontramos ante una condiciones sencillas, reutilizar la misma clausula WHERE es trivial. Pero qué sucede cuando queremos utilizar funciones de composición (JOIN) para restringir el conjunto de datos.

Ejemplo para UPDATE, donde se puede ver como se han utilizado varios JOINs en el bloque de referencia a la table (table_reference en el manual de MySql):

UPDATE table1 T1 INNER JOIN table2 T2 ON T1.id = T2.id INNER JOIN table3 T3 ON T3.other_id = T2.other_id INNER JOIN table4 T4 ON T4.category = T3.category SET T1.readed = 0 WHERE T1.type = 'X' AND T1.category  = 'A';

Ejemplo para DELETE. En este caso después del DELETE hay que especificar la tabla o tablas (multi-delete):

DELETE T2 FROM table2 T2 ON T1.id = T2.id INNER JOIN table3 T3 ON T3.other_id = T2.other_id INNER JOIN table4 T4 ON T4.category = T3.category WHERE T1.type = 'X' AND T1.category  = 'A';

Espero que estos ejemplos os sirvan de ayuda.

NOTA: Todos los ejemplos se han ejecutado en un servidor MySql version 5.1.

Actualización

Ejemplo para MS SQL 2005:

UPDATE table1 SET T1.readed = 0 FROM table1 T1 INNER JOIN table2 T2 ON T1.id = T2.id INNER JOIN table3 T3 ON T3.other_id = T2.other_id INNER JOIN table4 T4 ON T4.category = T3.category  WHERE T1.type = 'X' AND T1.category  = 'A';

Funciones de agregación para valores no numéricos.

Las funciones de agregación se utilizan habitualmente, en SQL, durante la agrupación de resultados para mostrar sumatorios, estadísticas, etc. Pero puede ser que necesitemos obtener una concatenación de strings a partir de una agrupación. En MySql la solución viene de la mano de la función de agregación GROUP_CONCAT. La función acepta como parámetro una sintaxis basado en SQL para seleccionar el campo que se quiere concatenar, el separador a utilizar e incluso si hay que ordenar el resultado o mostrar valores no repetidos.

Ejemplo:

SELECT idPregunta, nombre, `email`, fecha, pregunta, GROUP_CONCAT(
    DISTINCT respuesta ORDER BY idRespuesta SEPARATOR ', '
)
FROM Respuestas
WHERE bloqueRespuestas = 'BqcjWf8en'
GROUP BY idPregunta /*, nombre, `email`, fecha, pregunta*/;

En el ejemplo se puede ver una consulta para recuperar las preguntas a un cuestionario y las posibles respuestas concatenadas en un string. Lo más curioso es como, a diferencia de la agrupación normal (con enteros), en este caso no hace falta agrupar por todos los campos proyectados en la consulta. Únicamente por el campo que se desea agrupar.

Set or reset AUTO_INCREMENT in a table on MySql

If you want to set or reset the AUTO_INCREMENT value to a determinated value in MySql, use this command

ALTER TABLE TABLE_NAME AUTO_INCREMENT = X

where X is the new value or 0 to reset.

SQL case-sensitive comparison over MySql

If someone is finding a way to do a case sensitive comparison in SQL (over MySql), below can find the recipe:

This one produces a True result:

1
SELECT 'A' = 'a';

The solution is doing the comparison with a = or LIKE and the BINARY clause:

2
SELECT 'A' LIKE BINARY 'a';

or

3
SELECT 'A' = BINARY 'a';

This produces a False result (good for case sensitive comparisons)

And be careful because this:

4
SELECT 'A' LIKE 'a';

produces a True result.