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.
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.
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.
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ó.
DISTINCT alcanza a todas las columnas que se piden, no a una sola. Es el error más común con esta palabra, y no da ningún aviso. Con SELECT DISTINCT localidad, activo no se obtienen las localidades sin repetir: se obtienen las combinaciones de localidad y estado, así que una localidad va a volver a aparecer —una vez con activo = 1 y otra con activo = 0—. Si se quiere la lista limpia de una sola columna, se pide esa columna sola.
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.
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;
| id | nombre | rubro | precio | stock |
|---|---|---|---|---|
| 1 | Alfajor de chocolate | Golosinas | 1200.00 | 24 |
| 2 | Caramelos surtidos | Golosinas | 350.00 | 60 |
| 3 | Gaseosa de 500 ml | Bebidas | 2500.00 | 18 |
| 4 | Agua mineral | Bebidas | 1800.00 | 30 |
| 5 | Cigarrillos | Cigarrillos | 4500.00 | 12 |
| 6 | Sándwich de miga | Panadería | 3200.00 | 6 |
| 7 | Café en vaso | Bebidas | 1500.00 | 20 |
| 8 | Barrita de cereal | Golosinas | 2200.00 | 15 |
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;
| nombre | precio |
|---|---|
| Alfajor de chocolate | 1200.00 |
| Caramelos surtidos | 350.00 |
| Gaseosa de 500 ml | 2500.00 |
| Agua mineral | 1800.00 |
| Cigarrillos | 4500.00 |
| Sándwich de miga | 3200.00 |
| Café en vaso | 1500.00 |
| Barrita de cereal | 2200.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;
| genero | titulo |
|---|---|
| Policial | El secreto de sus ojos |
| Comedia | Relatos salvajes |
| Policial | Nueve reinas |
| Comedia | El hijo de la novia |
| Drama | La historia oficial |
| Comedia | Esperando la carroza |
| Policial | Tiempo de valientes |
| Drama | Kamchatka |
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;
| Producto | Precio | Disponibles |
|---|---|---|
| Alfajor de chocolate | 1200.00 | 24 |
| Caramelos surtidos | 350.00 | 60 |
| Gaseosa de 500 ml | 2500.00 | 18 |
| Agua mineral | 1800.00 | 30 |
| Cigarrillos | 4500.00 | 12 |
| Sándwich de miga | 3200.00 | 6 |
| Café en vaso | 1500.00 | 20 |
| Barrita de cereal | 2200.00 | 15 |
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;
| genero | anio |
|---|---|
| Comedia | 1985 |
| Comedia | 2001 |
| Comedia | 2014 |
| Drama | 1985 |
| Drama | 2002 |
| Policial | 2000 |
| Policial | 2005 |
| Policial | 2009 |
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;
| Mascota | Especie |
|---|---|
| Toby | Perro |
| Michi | Gato |
| Rocco | Perro |
| Luna | Gata |
| Coco | Loro |
| Nube | Conejo |
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:
- Descargar el archivo desde la tabla de arriba y fijarse dónde quedó: casi siempre, en la carpeta Descargas.
- 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.
- Elegir el archivo con el botón Seleccionar archivo. No hace falta crear antes la base de datos: el archivo la crea.
- 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
SELECTdice qué columnas yFROM, de qué tabla. Son las dos únicas cláusulas obligatorias.- Un
SELECTno 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
SELECTpero 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.ASda 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. DISTINCTelimina los repetidos del resultado, sin tocar la tabla.DISTINCTalcanza a todas las columnas pedidas, no a una sola.DISTINCTno esUNIQUE: uno es una operación de consulta, el otro una regla permanente.