¿Qué portátiles están fuera de garantía?
Al servicio de soporte de una empresa le hacen una pregunta sencilla. ¿Qué portátiles se compraron antes de 2023 y quién los tiene?
En una hoja de cálculo tendrías que recorrer la lista fila a fila. Una base de datos responde en un instante.
Solo tienes que hacer la pregunta de una forma que entienda.
Al terminar esta lección
Nota
Puedo pedir a una base de datos las filas que necesito.
Palabras clave
| Palabra | Qué significa | Ejemplo |
|---|---|---|
| Consulta | una pregunta que haces a una base de datos en SQL | |
| Cláusula | una parte de la consulta, que empieza con una palabra clave | WHERE |
| Condición | una prueba que cada fila supera o no | price < 30 |
| Resultado | las filas que devuelve una consulta | |
| Comodín | un símbolo de un patrón que vale por cualquier texto | % |
| NULL | la marca de un valor que falta |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
WHERE se queda con las filas que cumplen
Una consulta empieza con SELECT, que nombra las columnas. FROM nombra la tabla.
WHERE añade una condición. Una fila solo entra en el resultado si la cumple. Une condiciones con AND y OR.
El texto va entre comillas simples. Los números, sin comillas.
Ejecuta primero las dos líneas de preparación. Ya las usaste en la lección anterior, y repetirlas no hace daño.
Aceptar el certificado del servidor
printf '[client]\nssl-verify-server-cert=0\n' > ~/.my.cnfSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Un nombre corto para la tienda
alias sql='mariadb -h db -u student -pstudent shop -t -e'Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Buscar por un texto
sql "SELECT first_name, city FROM customers WHERE country = 'France' ORDER BY city, first_name"Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Dos condiciones a la vez
sql "SELECT name, price FROM products WHERE category_id = 4 AND price < 30 ORDER BY price"Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Ejemplo resuelto: las pruebas que puedes usar
| Prueba | Significa | Ejemplo |
|---|---|---|
| = <> | Igual, distinto | country = 'Spain' |
| < <= > >= | Menor o mayor | price < 30 |
| BETWEEN | Dentro de un rango, extremos incluidos | stock BETWEEN 5 AND 10 |
| LIKE | Coincide con un patrón, % es cualquier texto | name LIKE '%Set%' |
| IS NULL | Falta el valor | phone IS NULL |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Buscar nombres con un patrón
sql "SELECT name FROM products WHERE name LIKE '%Set%' ORDER BY name"Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Existencias entre 5 y 10
sql "SELECT name, stock FROM products WHERE stock BETWEEN 5 AND 10 ORDER BY stock, name"Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
NULL es un valor que falta
Algunos clientes no tienen teléfono. La columna guarda NULL: una marca que dice que no se sabe nada.
NULL no es igual a nada, ni siquiera a otro NULL. Por eso = NULL nunca encuentra ninguna fila.
Pregunta con IS NULL. Ejecuta las dos formas y compáralas.
Contar clientes sin teléfono
sql "SELECT COUNT(*) AS no_phone FROM customers WHERE phone IS NULL"Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
La misma pregunta, mal escrita
sql "SELECT COUNT(*) AS no_phone FROM customers WHERE phone = NULL"Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Un error frecuente
Advertencia
Mucha gente cree que phone = NULL encuentra los teléfonos que faltan. No encuentra ninguno, y no avisa. Un valor que falta no es igual a nada. Escribe siempre IS NULL o IS NOT NULL.
ORDER BY y LIMIT dan forma al resultado
Una tabla no tiene un orden fijo. Si el orden importa, pídelo con ORDER BY. DESC pone primero lo mayor.
LIMIT 3 se queda con las tres primeras filas del resultado. OFFSET 2 se salta antes dos filas.
Usa LIMIT junto con ORDER BY. Sin orden, "las tres primeras" no significa nada.
Los tres productos más baratos
sql "SELECT name, price FROM products ORDER BY price LIMIT 3"Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Saltar dos y tomar dos
sql "SELECT name, price FROM products ORDER BY price DESC LIMIT 2 OFFSET 2"Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Ejemplo resuelto: cómo se lee una consulta
| Paso | Cláusula | Qué hace la base |
|---|---|---|
| 1 | FROM | Elige la tabla |
| 2 | WHERE | Descarta las filas que no pasan la prueba |
| 3 | SELECT | Deja solo las columnas que nombraste |
| 4 | ORDER BY | Pone las filas en orden |
| 5 | LIMIT | Recorta la lista al tamaño pedido |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Pruébalo: portátiles por departamento
-- Portátiles de Legal o de Diseño.
SELECT tag, model, dept FROM laptops
WHERE dept = 'Legal' OR dept = 'Diseño';
-- Cámbialo para buscar los comprados en 2024 o después.
Pruébalo: los portátiles más caros
-- Los tres portátiles más caros, el más caro primero.
SELECT tag, price FROM laptops
ORDER BY price DESC
LIMIT 3;
-- Cambia DESC por ASC y ejecútalo otra vez.
Para ir más allá
La web de la tienda muestra los productos de cinco en cinco, del más barato al más caro. Escribe la consulta de la tercera página con LIMIT y OFFSET.
Dos productos de la tienda cuestan lo mismo, 19,99. Explica por qué esos dos podrían cambiar de sitio entre dos ejecuciones de la consulta. Después añade una segunda columna al ORDER BY para que el orden sea siempre el mismo.