Lección 3: Filtrar | Curso SQL

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 ASCendente.

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 DESCendente.

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

3-1

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
...

3-2

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

3-3

Esta obra está bajo una Licencia Creative Commons Atribución-NoComercial-SinDerivadas 4.0 Internacional.

Atribución/Reconocimiento-NoComercial-SinDerivados 4.0 Internacional

¿Me ayudas?

Comprame un café
Pulsa sobre la imagen

No te sientas obligado a realizar una donación, pero cada aportación mantiene el sitio en activo logrando que continúe existiendo y sea accesible para otras personas. Además me motiva a crear nuevo contenido.

Comentarios

{{ comments.length }} comentarios

Nuevo comentario

Nueva replica  {{ formatEllipsisAuthor(replyComment.author) }}

Acepto la política de Protección de Datos.

Escribe el primer comentario