2.5 Cláusulas básicas de SQL
2.5.1 Selección de campos
- Seleccionar todas las columnas de una tabla:
- Seleccionar columnas específicas:
- Alias de columna y tabla:
- Funciones de agregación:
SELECT COUNT(*), SUM(UnitPrice), MIN(UnitPrice), MAX(UnitPrice) FROM Track;
SELECT AVG(milliseconds) AS 'Duración Media' FROM Track; - Formato:
2.5.3 Filtrado de Resultados
- Filtrado de duplicados:
- Seleccionar filas con condiciones:
Múltiples condiciones:
- Operadores: ‘AND’, ‘OR’, ‘LIKE’, ‘NOT’, ‘IS NULL’, ‘IS NOT NULL’ ‘BETWEEN x AND y’, ‘IN (lista)’
- Coincidencias parciales:
‘%’ : Reemplazo por un conjunto de caracteres
’_’ : Reemplazo por un caracter
Rangos:
- Valores en una lista:
2.5.5 Unión de tablas
Intersección por clave primaria / clave foránea:
- Operador A [INNER] JOIN B: interesección de A y B
SELECT ar.Name AS Artista, a.Title AS Album
FROM Artist ar JOIN Album a ON ar.ArtistId = a.ArtistId;- Operador A LEFT JOIN B: interesección de A y B, y filas de A sin correspondencia en B
SELECT ar.Name AS Artista, a.Title AS Album
FROM Artist ar LEFT JOIN Album a ON ar.ArtistId = a.ArtistId;Operador A RIGHT JOIN B: interesección de A y B, y filas de B sin correspondencia en A
A ‘FULL [OUTER] JOIN’ B: interesección de A y B, y filas de A y B sin correspondencia
sqlite no soporta directamente RIGHT JOIN ni FULL JOIN
Producto cartesiano
2.5.6 Agrupamiento
- Funciones de agregación parciales
SELECT A.Title AS Album, COUNT(*) AS Canciones, SUM(UnitPrice) AS Precio
FROM Album A JOIN Track T ON A.AlbumId = T.AlbumId
GROUP BY A.Title; - CONSEJO: Es importante agrupar por clave candidata o superclave. La consulta anterior daría resultados incorrectos si existen dos álbumes diferentes con el mismo título. Mejor:
SELECT A.Title AS Album, COUNT(*) AS Canciones, SUM(UnitPrice) AS Precio
FROM Album A JOIN Track T ON A.AlbumId = T.AlbumId
GROUP BY A.AlbumId;- Además, también es importante que ese campo de agrupación o algo que garantice la identificación unívoca se presente en los resultados. En el ejemplo anterior sí aparecerían los álbumes por separado, pero no sería posible identificar cuál es cuál en los resultados. Mejor:
SELECT A.AlbumId, A.Title AS Album, COUNT(*) AS Canciones, SUM(UnitPrice) AS Precio
FROM Album A JOIN Track T ON A.AlbumId = T.AlbumId
GROUP BY A.AlbumId;- Incluso mejor, si asumimos que no habrá un artista con dos álbumes con el mismo nombre:
SELECT AR.Name AS Artista, AS Album, COUNT(*) AS Canciones, SUM(UnitPrice) AS Precio
FROM Album A JOIN Track T ON A.AlbumId = T.AlbumId
JOIN Artist AR ON A.ArtistId = AR.ArtistId
GROUP BY A.AlbumId;- Filtrado por grupos (seleccionar grupos con condiciones)
2.5.7 Subconsultas (subqueries)
Subqueries en la cláusula SELECT:
- La consulta debe devolver una única columna, y típicamente un único valor
SELECT T.Name, (SELECT COUNT(*)
FROM Track T2
WHERE T2.GenreId = T.GenreId) AS Canciones
FROM Track T JOIN Genre G ON T.GenreId = G.GenreId; Observación: en una subquery se puede hacer referencia a columnas de la consulta externa.
Subqueries en la cláusula WHERE / HAVING:
SELECT T.Name, T.Milliseconds
FROM Track T
WHERE T.Milliseconds > (SELECT AVG(Milliseconds) FROM Track); - Subqueries en la cláusula FROM:
2.5.8 Operaciones con conjuntos de resultados
- Query1 y Query2 deben devolver el mismo número de columnas, pero no necesariamente el mismo tipo de dato. Elimina filas duplicadas.
- Unión: Resultados existentes en alguna consulta (eq. OR)
- Intersección: Resultados existentes en ambas consultas (eq. AND)
- Diferencia (Except): Resultados existentes en Query1 pero no en Query2 (eq. MINUS)
- Cláusula UNION ALL: Elimina la restricción de filas duplicadas y muestra todo