Ir al contenido principal

Consultas básicas

SELECT y FROM

Son las dos cláusulas de la instrucción más usada de todo SQL. Y son las dos únicas obligatorias: cualquier otra que aparezca es opcional.

SELECT nombre, documento      -- qué columnas quiero
FROM   socios;                -- de qué tabla

Se pueden leer casi como una frase en castellano: «de la tabla socios, dame el nombre y el documento». Y esa frase tiene una propiedad que conviene entender desde el principio: no cambia nada. La consulta devuelve datos; la tabla queda exactamente igual. Se puede ejecutar mil veces y el resultado va a ser el mismo, siempre.

Resultado de SELECT nombre, documento FROM socios: la grilla con solo esas dos columnas y el aviso de que la consulta devolvió 50 filas
El resultado de pedir dos columnas: una grilla con esas dos y nada más. El aviso verde de arriba dice cuántas filas devolvió en total.

Lo que devuelve no es la tabla

El resultado de un SELECT se llama conjunto de resultados, y es importante no confundirlo con la tabla. Es una vista —una grilla armada al momento de la consulta, con las columnas que se pidieron y en el orden en que se pidieron—, y no tiene ninguna relación de identidad con lo que está guardado.

Esa distinción tiene consecuencias prácticas que aparecen todo el tiempo: se pueden elegir las columnas que se quieren y en qué orden, se pueden calcular columnas que no existen en la tabla, y se pueden repetir campos. Si una consulta pide nombre, nombre, devuelve el nombre dos veces. Nada de eso toca la tabla: modificar el resultado no modifica los datos.

Un detalle sobre el orden, que explica algunos errores desconcertantes: la sentencia se escribe empezando por SELECT, pero la base la resuelve en otro orden —primero busca la tabla, después filtra los registros y al final arma la lista de columnas—. Saberlo aclara por qué un nombre definido con AS en el SELECT no se puede usar en el WHERE: cuando el filtro se evalúa, ese nombre todavía no existe.

Todas las columnas o columnas específicas

Existe una forma abreviada de pedir todas las columnas: el asterisco.

SELECT * FROM socios;                     -- todas las columnas
SELECT id, nombre, documento FROM socios;  -- solo estas tres

El asterisco es cómodo y conviene conocerlo, porque aparece en todos los ejemplos y en todas las herramientas. El problema es que se lo use para trabajar, y no solo para mirar:

  SELECT * Columnas nombradas
Para qué sirve Explorar: «¿qué hay en esta tabla?» Trabajar: obtener exactamente lo que se necesita.
Si se agrega un campo a la tabla La consulta empieza a devolver algo distinto sin que nadie lo haya pedido. Devuelve lo mismo de siempre. No se rompe.
Cuántos datos viajan Todos, incluidos los que no se van a usar. Solo los necesarios.
Qué dice el código No comunica ninguna intención. Documenta qué se esperaba obtener.

La segunda fila es la que más pesa en un sistema en funcionamiento. Una consulta con * que hoy devuelve ocho columnas va a devolver nueve el día que alguien agregue un campo, y todo lo que lea esa consulta —una página, un programa, un informe— va a recibir un dato inesperado. Nada va a avisar: la consulta se sigue ejecutando sin errores. Por eso el criterio es: el asterisco para explorar, los nombres para trabajar.

Resultado de SELECT * FROM socios: la grilla con las ocho columnas de la tabla
El asterisco trae las ocho columnas, incluidas las que no se necesitan. La grilla se puede desplazar en horizontal para ver las que quedan afuera de la pantalla.

Alias con AS

Un alias es un nombre alternativo que se le da a una columna en el resultado. Se escribe con AS y no modifica la tabla: cambia el encabezado de la grilla que devuelve la consulta y, sobre todo, permite nombrar columnas calculadas, que de otro modo no tendrían nombre.

SELECT nombre    AS socio,
       alta      AS fecha_alta,
       precio    AS precio_sin_iva,
       precio * 1.21 AS precio_con_iva
FROM productos;

Sin el AS, la cuarta columna aparecería con un encabezado horrible del tipo precio * 1.21. Con el alias, el resultado se lee sin pensar. Y hay dos casos en los que el alias deja de ser una comodidad y pasa a ser necesario:

  • Cuando la columna es un cálculo. Ahí no hay un nombre original que heredar, así que sin alias el encabezado es directamente la fórmula.
  • Cuando dos columnas se llaman igual. Si se cruzan dos tablas que las dos tienen un campo id, en el resultado hay que poder distinguirlos (esto se retoma en las consultas entre tablas).

Dos advertencias sobre el alias. La primera: el alias vive solo en el resultado; la tabla sigue teniendo el nombre de siempre. La segunda: en la mayoría de los gestores el alias no se puede usar en el WHERE, por lo que se explicó más arriba sobre el orden en que se resuelve la consulta. Un alias con espacios obliga a delimitarlo, y cómo se delimita depende del dialecto; lo más práctico es evitarlos, usando el guión bajo: AS precio_con_iva en lugar de AS precio con iva.

Resultado de una consulta con alias: los encabezados de la grilla dicen producto, precio_sin_iva y precio_con_iva
Los alias se ven en los encabezados de la grilla. La tabla sigue teniendo los mismos nombres: lo que cambió es el título de la columna en el resultado.

Eliminación de duplicados con DISTINCT

Un SELECT normal devuelve todos los registros que cumplen la condición, aunque sean idénticos entre sí. Si se piden las localidades de los socios, una localidad con treinta socios aparece treinta veces. DISTINCT elimina esas repeticiones del resultado:

SELECT localidad FROM socios;            -- repite cada localidad por cada socio
SELECT DISTINCT localidad FROM socios;   -- cada localidad una sola vez

Es la forma más rápida de averiguar qué valores distintos hay en un campo: qué localidades aparecen, qué categorías existen, qué años tienen movimientos. Muchas veces es el primer paso para entender datos que uno no cargó.

Conviene además no confundir DISTINCT con la restricción UNIQUE, aunque las dos hablen de repetidos. UNIQUE es una regla de la tabla: impide guardar dos registros iguales en ese campo, y es permanente. DISTINCT es una operación de una consulta: no impide nada, solo evita mostrar repetidos en ese resultado puntual. La tabla no cambia: los treinta socios de La Plata siguen estando, aunque la consulta los muestre una sola vez.

Resultado de SELECT DISTINCT localidad FROM socios: ocho filas, una por localidad, con una fila NULL al final
Con DISTINCT la grilla baja de 50 filas a 8: una por localidad. La fila NULL del final es la de los socios que no tienen localidad cargada.

Ejemplos resueltos

Los siguientes ejemplos se resuelven con los datos de los archivos para practicar, así que se pueden ejecutar tal cual están escritos y dan el mismo resultado que aparece acá. Ningún resultado está escrito a mano: salen de correr estas mismas consultas contra la base. Abajo de cada uno está el nombre de la base, para saber de dónde salen los datos.

1. Todas las columnas, todos los productos

La consulta más simple que existe: el asterisco pide todas las columnas, y sin ninguna condición la base devuelve todas las filas. Esta es la tabla de productos del kiosco: lo que se vende, el rubro al que pertenece, a cuánto se vende y cuánto queda en el depósito.

SELECT *
FROM productos;
idnombrerubropreciostock
1Alfajor de chocolateGolosinas1200.0024
2Caramelos surtidosGolosinas350.0060
3Gaseosa de 500 mlBebidas2500.0018
4Agua mineralBebidas1800.0030
5CigarrillosCigarrillos4500.0012
6Sándwich de migaPanadería3200.006
7Café en vasoBebidas1500.0020
8Barrita de cerealGolosinas2200.0015

Base kiosco · 8 filas.

2. Solo algunas columnas

Casi siempre alcanza con una parte. Pedir dos columnas en lugar de cinco hace que el resultado se lea mejor y que la base trabaje menos, porque no tiene que ir a buscar lo que no se pidió. Para mirar los precios, con el nombre y el precio alcanza.

SELECT nombre, precio
FROM productos;
nombreprecio
Alfajor de chocolate1200.00
Caramelos surtidos350.00
Gaseosa de 500 ml2500.00
Agua mineral1800.00
Cigarrillos4500.00
Sándwich de miga3200.00
Café en vaso1500.00
Barrita de cereal2200.00

Base kiosco · 8 filas.

3. El orden de las columnas lo pone la consulta

Las columnas salen en el orden en que se escriben, y ese orden no tiene por qué ser el de la tabla: acá el género va primero, aunque en peliculas esté segundo. La tabla no cambia: lo que cambia es el resultado de esta consulta.

SELECT genero, titulo
FROM peliculas;
generotitulo
PolicialEl secreto de sus ojos
ComediaRelatos salvajes
PolicialNueve reinas
ComediaEl hijo de la novia
DramaLa historia oficial
ComediaEsperando la carroza
PolicialTiempo de valientes
DramaKamchatka

Base videoclub · 8 filas.

4. Un alias para cada columna

Los encabezados de la tabla de resultados se pueden renombrar con AS, para que el resultado se lea como una planilla y no como una lista de campos técnicos. Ojo: el alias cambia el encabezado, no el nombre de la columna en la base.

SELECT nombre AS Producto, precio AS Precio, stock AS Disponibles
FROM productos;
ProductoPrecioDisponibles
Alfajor de chocolate1200.0024
Caramelos surtidos350.0060
Gaseosa de 500 ml2500.0018
Agua mineral1800.0030
Cigarrillos4500.0012
Sándwich de miga3200.006
Café en vaso1500.0020
Barrita de cereal2200.0015

Base kiosco · 8 filas.

5. Los rubros, sin repetir

En la tabla hay ocho productos, pero varios son del mismo rubro. DISTINCT deja cada valor una sola vez: sirve para saber qué valores distintos hay en una columna, sin contar las repeticiones.

SELECT DISTINCT rubro
FROM productos;
rubro
Golosinas
Bebidas
Cigarrillos
Panadería

Base kiosco · 4 filas.

6. DISTINCT con dos columnas

Con DISTINCT y dos columnas, lo que se elimina son las combinaciones repetidas, no los valores repetidos de cada columna por separado. Acá se pide la combinación de género y año: dos comedias de años distintos son dos filas, no una.

SELECT DISTINCT genero, anio
FROM peliculas
ORDER BY genero, anio;
generoanio
Comedia1985
Comedia2001
Comedia2014
Drama1985
Drama2002
Policial2000
Policial2005
Policial2009

Base videoclub · 8 filas.

7. Lo mismo, con otra tabla

Las cuatro cláusulas que se vieron hasta acá funcionan igual en cualquier tabla. Esta es la de mascotas de una veterinaria: se piden dos columnas con alias, y el resultado se lee como una planilla.

SELECT nombre AS Mascota, especie AS Especie
FROM mascotas;
MascotaEspecie
TobyPerro
MichiGato
RoccoPerro
LunaGata
CocoLoro
NubeConejo

Base veterinaria · 6 filas.

Archivos para practicar

Todo lo que se explica en esta página se puede probar de verdad, sin copiar y pegar sentencia por sentencia. Cada archivo crea su propia base, con las tablas y los datos ya cargados, y trae al final —comentadas— las consultas para practicar.

Archivo Descargar Qué trae
kiosco.sql Descargar Un kiosco, con dos tablas: los productos con su precio y su stock, y las ventas. Es la base que más se usa en los ejemplos de esta página.
videoclub.sql Descargar Un videoclub, con tres tablas: películas, socios y alquileres.
veterinaria.sql Descargar Una veterinaria, con tres tablas: dueños, mascotas y consultas.

Cómo se importa

Importar es abrir el archivo .sql dentro del gestor para que él ejecute todas las sentencias de una sola vez. Son cuatro pasos, y son siempre los mismos:

  1. Descargar el archivo desde la tabla de arriba y fijarse dónde quedó: casi siempre, en la carpeta Descargas.
  2. Abrir phpMyAdmin —en XAMPP, el botón Admin que está en la fila de MySQL— y entrar a la pestaña Importar, la que está arriba de todo.
  3. Elegir el archivo con el botón Seleccionar archivo. No hace falta crear antes la base de datos: el archivo la crea.
  4. Apretar Importar y esperar el mensaje verde: «La importación se ha finalizado correctamente».

Si el mensaje es verde, ya está: la base aparece en la lista de la izquierda, con sus tablas y con los datos cargados. Si sale en rojo, phpMyAdmin dice en qué línea del archivo se trabó, y las dos causas más comunes son que la base ya existía o que el archivo se cortó al descargarse.

Cuidado con el nombre de la base. Al importar, cada archivo borra la base con ese nombre si ya existía y la vuelve a crear vacía. Es lo que permite repetir la práctica todas las veces que haga falta —siempre arranca igual—, pero también significa que no conviene guardar datos propios en una base que se llame biblioteca_1_tabla, biblioteca_2_tablas o biblioteca_3_tablas.

Resumen

  • SELECT dice qué columnas y FROM, de qué tabla. Son las dos únicas cláusulas obligatorias.
  • Un SELECT no cambia nada: la tabla queda igual.
  • Lo que devuelve es un conjunto de resultados, no la tabla. Se pueden elegir, repetir y calcular columnas.
  • La sentencia se escribe empezando por SELECT pero se resuelve en otro orden.
  • * sirve para explorar; para trabajar se nombran las columnas.
  • * se rompe en silencio cuando la tabla cambia; los nombres, no.
  • AS da un nombre alternativo en el resultado, y es imprescindible para las columnas calculadas.
  • El alias vive solo en el resultado y no se puede usar en el WHERE.
  • DISTINCT elimina los repetidos del resultado, sin tocar la tabla.
  • DISTINCT alcanza a todas las columnas pedidas, no a una sola.
  • DISTINCT no es UNIQUE: uno es una operación de consulta, el otro una regla permanente.

Ver filtros y ordenamiento