¿Qué platos cuestan menos de tres euros?
La cantina del instituto tiene cuarenta platos en su base de datos. Un estudiante pregunta qué platos vegetarianos cuestan menos de 3 euros.
SQL (Structured Query Language, "lenguaje de consultas estructurado") sirve para eso. Con unas pocas palabras pides a la base justo los registros que necesitas.
Al terminar esta lección
Nota
Puedo pedir a una base de datos los registros que cumplen una condición.
Palabras clave
| Palabra | Qué significa | Ejemplo |
|---|---|---|
| Consulta | una pregunta que haces a una base de datos | |
| SQL | el lenguaje con el que se escriben las consultas | |
| Condición | una prueba que cada registro pasa o no | price < 3 |
| Resultado | los registros que devuelve una consulta | |
| NULL | la marca de un valor que falta | |
| Comodín | un símbolo que vale por cualquier texto | % |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
WHERE se queda con los registros que cumplen
Una consulta empieza con SELECT, que nombra los campos. FROM nombra la tabla.
WHERE añade una condición. Un registro solo entra en el resultado si la cumple. Une varias con AND (las dos) y OR (una de las dos).
El texto va entre comillas simples. Los números, sin comillas.
Ejemplo resuelto: las pruebas que puedes usar
| Prueba | Significa | Ejemplo |
|---|---|---|
| = y <> | Igual, distinto | country = 'Spain' |
| < <= > >= | Menor o mayor | price < 6 |
| BETWEEN | Dentro de un rango, extremos incluidos | stock BETWEEN 5 AND 10 |
| LIKE | Coincide con un patrón; % vale por cualquier texto | name LIKE '%Pot%' |
| IS NULL | Falta el valor | phone IS NULL |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Pruébalo: los postres de la cantina
-- Los platos de la sección Postres.
SELECT dish, price FROM menu
WHERE section = 'Postres';
-- Cámbialo para ver los que cuestan menos de 2 euros.
Lo mismo en el laboratorio
En el laboratorio la tienda tiene treinta y siete productos. 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.
Productos de menos de 6 euros
sql "SELECT name, price FROM products WHERE price < 6 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.
Buscar nombres con un patrón
sql "SELECT name FROM products WHERE name LIKE '%Pot%' 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.
NULL es un valor que falta
Algunos clientes no tienen teléfono. En ese campo la base 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 ningún registro. Pregunta con IS NULL.
Ejecuta las dos formas y compara.
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 tampoco avisa. Un valor que falta no es igual a nada. Escribe siempre IS NULL o IS NOT NULL.
Pruébalo: platos sin aviso de alergia
-- Los platos que no avisan de ninguna alergia.
SELECT dish FROM menu
WHERE allergy_note IS NULL;
-- Cambia IS NULL por IS NOT NULL y ejecútalo otra vez.
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 los tres primeros registros del resultado.
Usa LIMIT junto con ORDER BY. Sin orden, "los tres primeros" no significa nada.
Los tres productos más caros
sql "SELECT name, price FROM products ORDER BY price DESC 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.
Pruébalo: los platos más baratos
-- Los tres platos más baratos, el más barato primero.
SELECT dish, price FROM menu
ORDER BY price, dish
LIMIT 3;
-- Cambia el 3 por un 5.
Para ir más lejos: los empates
En el menú hay platos con el mismo precio. Si pides los dos más baratos con ORDER BY price LIMIT 2 y dos platos empatan, ¿cuál sale primero?
Añade un segundo criterio al ORDER BY, como dish, y explica por qué así el resultado es siempre el mismo.