SQL Tema 5
Consultas de datos (SELECT)
El comando SELECT de SQL es la herramienta que usamos para «preguntar» a la base de datos.
Importante
Regla de oro: cuando consultamos datos, SQL siempre nos responde con una nueva tabla temporal con los resultados.
Todos los ejemplos de este tema usan la tabla alumnos tal y como quedó al final del tema anterior:
| id_alumno | nombre | edad | nivel | cuota |
|---|---|---|---|---|
| 1 | Antonio | 17 | DEV | 50.0 |
| 2 | María | 16 | DEV | 45.0 |
| 3 | Juan | 14 | Master | 40.0 |
| 4 | Elena | 10 | Junior | 35.0 |
Estructura básica de una consulta#
Casi todas las consultas siguen este orden:
| Parte | Para qué | ¿Obligatoria? |
|---|---|---|
SELECT | Qué columnas quiero ver (* para todas) | Sí |
FROM | De qué tabla saco la información | Sí |
WHERE | Qué condiciones deben cumplirse (el filtro) | No |
ORDER BY | Cómo quiero ordenar los resultados | No |
LIMIT | Cuántas filas quiero como máximo | No |
Ejemplo:
SELECT nombre, email
FROM alumnos
WHERE nivel = 'DEV'
ORDER BY nombre ASC;Explicación: coge los nombres y los emails de los alumnos de nivel DEV, y muéstramelos ordenados alfabéticamente. El resultado:
| nombre | |
|---|---|
| Antonio | antonio@correo.es |
| María | maria@correo.es |
Filtrar con WHERE#
| Operador | Significa | Ejemplo | Alumnos que salen |
|---|---|---|---|
= | Igual | WHERE nivel = 'DEV' | Antonio, María |
<> | Distinto | WHERE nivel <> 'DEV' | Juan, Elena |
> < | Mayor, menor | WHERE edad > 15 | Antonio, María |
>= <= | Mayor o igual, menor o igual | WHERE edad <= 14 | Juan, Elena |
BETWEEN | Entre dos valores (ambos incluidos) | WHERE edad BETWEEN 10 AND 14 | Juan, Elena |
IN | Uno de varios valores | WHERE nivel IN ('Junior', 'Master') | Juan, Elena |
AND | Se cumplen las dos condiciones | WHERE nivel = 'DEV' AND edad > 16 | Antonio |
OR | Se cumple al menos una | WHERE nivel = 'Junior' OR edad > 16 | Antonio, Elena |
Nota
Fíjate en que en SQL se compara con un solo =, no con == como en Java.
Ordenar con ORDER BY#
| Palabra | Orden | Ejemplo |
|---|---|---|
ASC | Ascendente: de la A a la Z, de menor a mayor (es el orden por defecto) | ORDER BY edad ASC → Elena, Juan, María, Antonio |
DESC | Descendente: de la Z a la A, de mayor a menor | ORDER BY edad DESC → Antonio, María, Juan, Elena |
Funciones de agregación#
Calculan un único valor a partir de muchas filas:
| Función | Para qué | Ejemplo | Resultado |
|---|---|---|---|
COUNT() | Contar filas | SELECT COUNT(*) FROM alumnos; | 4 |
AVG() | Hacer la media | SELECT AVG(edad) FROM alumnos; | 14.25 |
SUM() | Sumar | SELECT SUM(cuota) FROM alumnos; | 170.0 |
MAX() | El valor más alto | SELECT MAX(edad) FROM alumnos; | 17 |
MIN() | El valor más bajo | SELECT MIN(edad) FROM alumnos; | 10 |
Se pueden combinar con WHERE. Por ejemplo, ¿cuántos alumnos DEV hay?
SELECT COUNT(*) FROM alumnos WHERE nivel = 'DEV';
-- Resultado: 2Búsqueda por patrones (LIKE)#
A veces no queremos buscar algo exacto, sino algo que empiece por, termine por o contenga algo. Para esto está LIKE junto al comodín %, que significa «cualquier cosa»:
| Patrón | Busca textos que… | Ejemplos que encajan |
|---|---|---|
LIKE 'A%' | empiecen por «A» | Antonio, Ana, Andrés |
LIKE '%a' | terminen en «a» | María, Elena |
LIKE '%correo%' | contengan «correo» en cualquier parte | antonio@correo.es |
Ejemplo:
SELECT * FROM alumnos WHERE nombre LIKE 'An%';
-- Con nuestros datos devuelve a Antonio. Con más alumnos, también saldrían Ana, Andrés...El operador de negación (NOT)#
Sirve para excluir registros. Es «lo contrario de»:
| Ejemplo | Muestra a… |
|---|---|
WHERE NOT nivel = 'Junior' | Todos los que no son Junior: Antonio, María, Juan |
WHERE nombre NOT LIKE 'A%' | Todos cuyo nombre no empieza por A: María, Juan, Elena |
Limitar resultados (LIMIT)#
Se utiliza para que la tabla de resultados no sea infinita: solo devuelve el número de filas que le pidamos. Se pone siempre al final de la consulta.
Ejemplo (el «Top 3» de los más jóvenes):
SELECT nombre, edad
FROM alumnos
ORDER BY edad ASC
LIMIT 3;| nombre | edad |
|---|---|
| Elena | 10 |
| Juan | 14 |
| María | 16 |
Errores frecuentes#
| Mensaje o síntoma | Qué significa | Cómo se arregla |
|---|---|---|
no such column: Ana | Has escrito un texto sin comillas: WHERE nombre = Ana, y SQL lo toma por una columna | Los textos van entre comillas simples: WHERE nombre = 'Ana' |
no such column: nombr | El nombre de la columna está mal escrito | Revisa el nombre en la estructura de la tabla |
| La consulta no devuelve nada | Ninguna fila cumple el WHERE | Prueba primero sin WHERE y ve añadiendo condiciones; revisa mayúsculas y espacios del texto que buscas |
LIKE no encuentra nada | Falta el comodín % | LIKE 'An%', no LIKE 'An' |