Codemaker SQL

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_alumnonombreedadnivelcuota
1Antonio17DEV50.0
2María16DEV45.0
3Juan14Master40.0
4Elena10Junior35.0

Estructura básica de una consulta#

Casi todas las consultas siguen este orden:

PartePara qué¿Obligatoria?
SELECTQué columnas quiero ver (* para todas)Sí
FROMDe qué tabla saco la informaciónSí
WHEREQué condiciones deben cumplirse (el filtro)No
ORDER BYCómo quiero ordenar los resultadosNo
LIMITCuántas filas quiero como máximoNo

Ejemplo:

SQL
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:

nombreemail
Antonioantonio@correo.es
Maríamaria@correo.es

Filtrar con WHERE#

OperadorSignificaEjemploAlumnos que salen
=IgualWHERE nivel = 'DEV'Antonio, María
<>DistintoWHERE nivel <> 'DEV'Juan, Elena
> <Mayor, menorWHERE edad > 15Antonio, María
>= <=Mayor o igual, menor o igualWHERE edad <= 14Juan, Elena
BETWEENEntre dos valores (ambos incluidos)WHERE edad BETWEEN 10 AND 14Juan, Elena
INUno de varios valoresWHERE nivel IN ('Junior', 'Master')Juan, Elena
ANDSe cumplen las dos condicionesWHERE nivel = 'DEV' AND edad > 16Antonio
ORSe cumple al menos unaWHERE nivel = 'Junior' OR edad > 16Antonio, Elena

Nota

Fíjate en que en SQL se compara con un solo =, no con == como en Java.

Ordenar con ORDER BY#

PalabraOrdenEjemplo
ASCAscendente: de la A a la Z, de menor a mayor (es el orden por defecto)ORDER BY edad ASC → Elena, Juan, María, Antonio
DESCDescendente: de la Z a la A, de mayor a menorORDER BY edad DESC → Antonio, María, Juan, Elena

Funciones de agregación#

Calculan un único valor a partir de muchas filas:

FunciónPara quéEjemploResultado
COUNT()Contar filasSELECT COUNT(*) FROM alumnos;4
AVG()Hacer la mediaSELECT AVG(edad) FROM alumnos;14.25
SUM()SumarSELECT SUM(cuota) FROM alumnos;170.0
MAX()El valor más altoSELECT MAX(edad) FROM alumnos;17
MIN()El valor más bajoSELECT MIN(edad) FROM alumnos;10

Se pueden combinar con WHERE. Por ejemplo, ¿cuántos alumnos DEV hay?

SQL
SELECT COUNT(*) FROM alumnos WHERE nivel = 'DEV';
-- Resultado: 2

Bú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ónBusca 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 parteantonio@correo.es

Ejemplo:

SQL
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»:

EjemploMuestra 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):

SQL
SELECT nombre, edad
FROM alumnos
ORDER BY edad ASC
LIMIT 3;
nombreedad
Elena10
Juan14
María16

Errores frecuentes#

Mensaje o síntomaQué significaCómo se arregla
no such column: AnaHas escrito un texto sin comillas: WHERE nombre = Ana, y SQL lo toma por una columnaLos textos van entre comillas simples: WHERE nombre = 'Ana'
no such column: nombrEl nombre de la columna está mal escritoRevisa el nombre en la estructura de la tabla
La consulta no devuelve nadaNinguna fila cumple el WHEREPrueba primero sin WHERE y ve añadiendo condiciones; revisa mayúsculas y espacios del texto que buscas
LIKE no encuentra nadaFalta el comodín %LIKE 'An%', no LIKE 'An'