Lección 3: Filtrar
Es un poco lento obtener todos los datos de una tabla para obtener un solo dato. ¿Te imaginas lo lento que iría Facebook si te devolviera sus 2.300 millones de usuarios para solo saber si has metido correctamente la contraseña? Por ello los datos hay que limitarlos de alguna manera. Por suerte SQL nos otorga filtros para quedarnos únicamente con lo que nos interesa como: limitar el número de filas devueltas (LIMIT
), ordenando las columnas (ORDER BY
) y crear condicionales (WHERE
).
SELECT [columnas] FROM [tabla] WHERE [condicionales] ORDER BY [columna] ASC/DESC LIMIT [número de filas] OFFSET [posición];
No es necesario usar todas las herramientas, tan solo lo que nos sea necesario.
Limitar
SELECT [columnas] FROM [tabla] LIMIT [número de filas] OFFSET [posición];
Para listar los 5 primeros resultados.
SELECT TrackId, Name, Composer FROM Track LIMIT 5 OFFSET 0;
1|For Those About To Rock (We Salute You)|Angus Young, Malcolm Young, Brian Johnson
2|Balls to the Wall|
3|Fast As a Shark|F. Baltes, S. Kaufman, U. Dirkscneider & W. Hoffman
4|Restless and Wild|F. Baltes, R.A. Smith-Diesel, S. Kaufman, U. Dirkscneider & W. Hoffman
5|Princess of the Dawn|Deaffy & R.A. Smith-Diesel
LIMIT
decimos el número de resultados que queremos. Aquí decimos que 5.
OFFSET
indica la posición por la cual empezará a contar. En el mundo de la programación se empieza a contar desde 0, por lo que le estamos diciendo que empiece desde el principio.
Una versión resumida es eliminando OFFSET
, cambiar el orden y añadir una coma de separación.
SELECT [columnas] FROM [tabla] LIMIT [posición], [número de filas];
SELECT TrackId, Name, Composer FROM Track LIMIT 0, 5;
¿Cómo podría obtener la fila 16, 17 y 18?
SELECT TrackId, Name, Composer FROM Track LIMIT 3 OFFSET 15;
16|Dog Eat Dog|AC/DC
17|Let There Be Rock|AC/DC
18|Bad Boy Boogie|AC/DC
Ordenar
SELECT [columnas] FROM [tabla] ORDER BY [columna] ASC/DESC;
Ordeno por el nombre de forma ASC
endente.
SELECT name FROM Playlist ORDER BY name ASC;
90’s Music
Audiobooks
Audiobooks
Brazilian Music
Classical
Classical 101 - Deep Cuts
Classical 101 - Next Steps
Classical 101 - The Basics
Grunge
Heavy Metal Classic
Movies
Movies
Music
Music
Music Videos
On-The-Go 1
TV Shows
TV Shows
Ordeno por el nombre de forma DESC
endente.
SELECT name FROM Playlist ORDER BY name DESC;
TV Shows
TV Shows
On-The-Go 1
Music Videos
Music
Music
Movies
Movies
Heavy Metal Classic
Grunge
Classical 101 - The Basics
Classical 101 - Next Steps
Classical 101 - Deep Cuts
Classical
Brazilian Music
Audiobooks
Audiobooks
90’s Music
Condicionales
Al igual que un lenguaje de programación podemos filtrar a través de igualaciones u operaciones aritméticas. Para ello usaremos siempre WHERE
al antes de indicar la instrucción.
SELECT [columnas] FROM [tabla] WHERE [condicionales];
Comparación
SELECT [columnas] FROM [tabla] WHERE [columna] = [valor];
Ejemplo
SELECT BillingCity FROM Invoice WHERE Total = 1.98;
Berlin
Paris
Redmond
Cupertino
Sidney
...
LIKE
Una forma de buscar palabras con cierto patrón. La clave esta en usar el símbolo %
para indicar por donde empieza.
Que empieza por…
SELECT [columnas] FROM [tabla] WHERE [columna] LIKE 'texto%';
Ejemplo
Buscamos todas las ciudades que empiecen por R
.
SELECT DISTINCT BillingCity FROM Invoice WHERE BillingCity LIKE 'R%';
Redmond
Reno
Rio de Janeiro
Rome
El prefijo DISTINCT
evita que se dupliquen los resultados.
Que terminan por…
SELECT [columnas] FROM [tabla] WHERE [columna] LIKE '%texto';
Ejemplo
Buscamos todas las ciudades que terminen por o
.
SELECT DISTINCT BillingCity FROM Invoice WHERE BillingCity LIKE '%o';
Oslo
Cupertino
Reno
Porto
...
Que contengan por…
SELECT [columnas] FROM [tabla] WHERE [columna] LIKE '%texto%';
Ejemplo
Buscamos todas las ciudades que contengan ew
.
SELECT DISTINCT BillingCity FROM Invoice WHERE BillingCity LIKE '%ew%';
Mountain View
New York
¿Quieres ignorar mayusculas y minúsculas? Añade al final COLLATE NOCASE
. Ejemplo: SELECT AlbumId FROM Album WHERE Title LIKE 'b%' COLLATE NOCASE
;
Operadores lógicos
SELECT [columnas] FROM [tabla] WHERE [columna] [> < >= <=] [valor];
Ejemplo
SELECT BillingCity, Total FROM Invoice WHERE Total < 5;
Stuttgart|1.98
Oslo|3.96
Frankfurt|0.99
Berlin|1.98
Paris|1.98
Bordeaux|3.96
...
AND
Concadenar varias condiciones. Deben cumplirse todas para dar el resultado.
SELECT [columnas] FROM [tabla] WHERE [condicion] AND [condicion] AND ...;
Ejemplo
SELECT InvoiceId, BillingCity, Total FROM Invoice WHERE Total < 5 AND BillingCity = 'London';
43|London|1.98
140|London|1.98
163|London|3.96
237|London|0.99
...
OR
Si una de las condiciones se cumple será válido. Podría darse el caso de tener 21 condiciones de las cuales solo 1 se cumpliera, y sería aceptado.
SELECT [columnas] FROM [tabla] WHERE [condicion] OR [condicion] OR ...;
Ejemplo
SELECT InvoiceId, BillingCity, Total FROM Invoice WHERE BillingCity = 'London' OR BillingCity = 'New York' OR BillingCity = 'Paris';
8|Paris|1.98
11|London|8.91
19|Paris|13.86
43|London|1.98
54|London|13.86
...
BETWEEN
Nos permite buscar un valor entre un rango.
SELECT [columnas] FROM [tabla] WHERE ([columna] BETWEEN [valor] AND [valor]);
Ejemplo
SELECT InvoiceId, BillingCity, Total FROM Invoice WHERE (Total BETWEEN 10 AND 12);
298|Redmond|10.91
311|Salt Lake City|11.94
312|Lisbon|10.91
...
GROUP BY
Cuando dispones de muchas filas, algunas de ellas con valores repetidos, con SQL puedes agrupar marcando las columnas dominantes.
SELECT [tabla.columnas] FROM [tabla_1] GROUP BY [tabla.columnas]
Vamos a agrupar todas las canciones por su precio.
SELECT TrackId, UnitPrice FROM Track GROUP BY UnitPrice;
1 0.99
2819 1.99
Nos devuelve el primer resultado de cada grupo. Ahora contamos.
SELECT COUNT(*), UnitPrice FROM Track GROUP BY UnitPrice;
COUNT(*) | UnitPrice
3290 0.99
213 1.99
Hemos logrado una lista donde contamos las canciones por precio.
Además es posible agrupar por varias columnas. Vamos a calcular la media de precio por canción de cada género, de mayor a menor.
SELECT GenreId, AVG(UnitPrice) AS price FROM Track GROUP BY GenreId, UnitPrice ORDER BY price DESC;
GenreId | price
19 1.99
20 1.99
18 1.99
22 1.99
21 1.99
1 0.990000000000008
7 0.990000000000007
3 0.990000000000005
4 0.990000000000005
8 0.990000000000001
14 0.990000000000001
9 0.99
5 0.99
11 0.99
10 0.99
25 0.99
23 0.99
24 0.99
12 0.99
17 0.99
6 0.989999999999999
13 0.989999999999999
15 0.989999999999999
16 0.989999999999999
2 0.989999999999998
Si quieres averiguar el nombre del género necesitarás fusionar la tabla correspondiente (lección Joins).
HAVING
Considéralo un WHERE
, o una condicional, para GROUP BY
.
SELECT [tabla.columnas] FROM [tabla_1] GROUP BY [tabla.columnas] HAVING [condicinales]
Continuando con el último ejemplo. ¿Y si quiero conocer la media de precio por género solamente cuando sea mayor de 1?
SELECT GenreId, AVG(UnitPrice) AS price FROM Track GROUP BY GenreId, UnitPrice HAVING price > 1;
GenreId | price
19 1.99
20 1.99
18 1.99
22 1.99
21 1.99
Esta obra está bajo una Licencia Creative Commons Atribución-NoComercial-SinDerivadas 4.0 Internacional.
¿Me invitas a un café? ☕
Puedes hacerlo usando el terminal.
ssh customer@andros.dev -p 5555
Comentarios
Nuevo comentario
Nueva replica {{ formatEllipsisAuthor(replyComment.author) }}
Escribe el primer comentario
{{ comments.length }} comentarios