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 [posición] OFFSET [número de filas];

No es necesario usar todas las herramientas, tan solo lo que nos sea necesario.

Limitar

SELECT [columnas] FROM [tabla] LIMIT [posición] OFFSET [número de filas];

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

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.

LIMIT decimos el número de resultados que queremos. Aquí decimos que 5.

Una versión resumida es eliminando OFFSET, cambiar el orden y añadir una coma de separación.

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

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

2-2