Parte I · Primeros pasos
Capítulo 3 — Preguntar a los datos
En el capítulo anterior montaste tus dos primeras tablas, jugador y carta, y
las llenaste de filas. Ahora mismo, dentro de tu base de datos de Kriaturas, hay
cuatro jugadores y un puñado de cartas esperando. Pero esos datos, ahí
guardados, todavía no hacen nada. Son como una colección de cartas dentro de una
caja cerrada: existen, pero no las has mirado.
En este capítulo abres la caja. Vas a aprender a preguntarle cosas a la base
de datos: enséñame todas las cartas, dame solo las baratas, ordéname los
jugadores del más veterano al más nuevo. Al acabar sabrás hacer tus primeras
consultas reales con tres herramientas que vas a usar el resto de tu vida con
bases de datos: SELECT, WHERE y ORDER BY.
El punto de partida
Para todo el capítulo trabajamos sobre las dos tablas que ya tienes. Recordemos qué hay dentro, porque vamos a hacerles preguntas todo el rato.
La tabla jugador:
| id | alias | fecha_alta | |
|---|---|---|---|
| 1 | DragoFuego99 | drago@ejemplo.com | 2026-03-01 |
| 2 | LunaVerde | luna@ejemplo.com | 2026-03-04 |
| 3 | PixelPunk | pixel@ejemplo.com | 2026-03-10 |
| 4 | ToxiRana | toxi@ejemplo.com | 2026-03-15 |
Y la tabla carta:
| id | nombre | rareza | coste |
|---|---|---|---|
| 1 | Chispín | común | 2 |
| 2 | Flamita | común | 2 |
| 3 | Burbujo | rara | 3 |
| 4 | Hojarasca | épica | 4 |
| 5 | Entreno intensivo | común | 1 |
| 6 | Poción | común | 1 |
Con esto basta. No vamos a tocar ni a añadir nada: solo vamos a preguntar.
La pregunta más básica: `SELECT`
La orden para pedirle datos a una base de datos se llama SELECT (en inglés,
"selecciona"). Junto a otra palabra, FROM ("desde"), forma la pregunta más
común del mundo de las bases de datos: "selecciona estas columnas desde esta
tabla".
Una consulta (en inglés, query) no es más que eso: una orden que le pides a la base de datos para que te devuelva datos. No cambia nada de lo que hay guardado; solo lo lee y te lo enseña.
Tu primera consulta pide todo lo que hay en la tabla de cartas:
SELECT * FROM carta;
Ese asterisco, *, significa "todas las columnas". Léelo como "dame todas las
columnas de la tabla carta". El resultado es la tabla entera:
| id | nombre | rareza | coste |
|---|---|---|---|
| 1 | Chispín | común | 2 |
| 2 | Flamita | común | 2 |
| 3 | Burbujo | rara | 3 |
| 4 | Hojarasca | épica | 4 |
| 5 | Entreno intensivo | común | 1 |
| 6 | Poción | común | 1 |
Felicidades: acabas de hacerle tu primera pregunta a tu base de datos. Y te ha respondido.
Pedir solo algunas columnas
Casi nunca necesitas todas las columnas. Cuando muestras la lista de cartas en
pantalla, a lo mejor solo te interesa el nombre y el coste, no el id interno ni
la rareza. Para eso, en lugar del *, escribes los nombres de las columnas que
quieres, separados por comas:
SELECT nombre, coste FROM carta;
Resultado:
| nombre | coste |
|---|---|
| Chispín | 2 |
| Flamita | 2 |
| Burbujo | 3 |
| Hojarasca | 4 |
| Entreno intensivo | 1 |
| Poción | 1 |
A elegir qué columnas quieres se le llama proyectar (o proyección). Quédate con la idea: proyectar es recortar las columnas, quedarte solo con las que te interesan. La base de datos te da exactamente lo que pides, ni más ni menos.
Filtrar filas: `WHERE`
Hasta ahora has elegido columnas, pero te seguían apareciendo todas las
filas. El siguiente salto es enorme: quedarte solo con las filas que cumplen
una condición. Eso se hace con WHERE (en inglés, "donde").
Imagina que quieres ver solo las cartas raras. Le dices a la base de datos: dame las cartas donde la rareza sea "rara".
SELECT * FROM carta WHERE rareza = 'rara';
Resultado:
| id | nombre | rareza | coste |
|---|---|---|---|
| 3 | Burbujo | rara | 3 |
De las seis cartas, solo una pasa el filtro. Las demás se quedan fuera porque no cumplen la condición. Filtrar es justo eso: poner una regla y quedarte solo con las filas que la cumplen.
Fíjate en un detalle que importa mucho: 'rara' va entre comillas simples. Es un
texto, y los textos siempre se escriben entre comillas. Si escribieras
WHERE rareza = rara (sin comillas), la base de datos pensaría que rara es el
nombre de otra columna, no encontraría ninguna así y te daría un error. Lo
veremos otra vez en los errores comunes, porque es el fallo número uno de quien
empieza.
Comparar números
Con los textos comparas si son iguales. Con los números puedes hacer mucho más: mayor que, menor que, igual… Por ejemplo, las cartas baratas, esas que cuestan 2 o menos:
SELECT nombre, coste FROM carta WHERE coste <= 2;
Resultado:
| nombre | coste |
|---|---|
| Chispín | 2 |
| Flamita | 2 |
| Entreno intensivo | 1 |
| Poción | 1 |
El símbolo <= significa "menor o igual que". Aquí tienes los que más vas a
usar:
| Operador | Significa |
|---|---|
= |
igual a |
<> |
distinto de |
< |
menor que |
> |
mayor que |
<= |
menor o igual que |
>= |
mayor o igual que |
Con <> (distinto de) podrías pedir, por ejemplo, todas las cartas que no
son comunes:
SELECT nombre, rareza FROM carta WHERE rareza <> 'común';
Resultado:
| nombre | rareza |
|---|---|
| Burbujo | rara |
| Hojarasca | épica |
Combinar condiciones: AND y OR
Muchas veces una sola condición no basta. Quieres las cartas que son raras y además baratas, o las que son raras o épicas. Para encadenar condiciones tienes dos palabras:
AND("y"): se tienen que cumplir las dos condiciones.OR("o"): basta con que se cumpla una de las dos.
Por ejemplo, las cartas que son raras o épicas (las más especiales de tu colección):
SELECT nombre, rareza FROM carta WHERE rareza = 'rara' OR rareza = 'épica';
Resultado:
| nombre | rareza |
|---|---|
| Burbujo | rara |
| Hojarasca | épica |
Y si quisieras solo las cartas comunes que además cuestan 1, usarías AND:
SELECT nombre FROM carta WHERE rareza = 'común' AND coste = 1;
Resultado:
| nombre |
|---|
| Entreno intensivo |
| Poción |
La diferencia es clave y conviene grabarla: AND es más exigente (pide las dos
cosas a la vez, así que normalmente devuelve menos filas), OR es más generoso
(le vale con una, así que suele devolver más).
Ordenar el resultado: `ORDER BY`
Por defecto, la base de datos te devuelve las filas en el orden que le da la gana.
No te fíes de que salgan ordenadas por id ni por nada: si quieres un orden
concreto, tienes que pedirlo. Para eso está ORDER BY (en inglés, "ordena
por").
Por ejemplo, ordenar las cartas de la más cara a la más barata:
SELECT nombre, coste FROM carta ORDER BY coste DESC;
Resultado:
| nombre | coste |
|---|---|
| Hojarasca | 4 |
| Burbujo | 3 |
| Chispín | 2 |
| Flamita | 2 |
| Entreno intensivo | 1 |
| Poción | 1 |
Esa palabra del final, DESC, significa descendente: de mayor a menor. Si la
quitas, o pones ASC, ordena al revés, de menor a mayor (ascendente, que es lo
que hace por defecto):
SELECT nombre, coste FROM carta ORDER BY coste ASC;
Una cosa importante que confunde a casi todo el mundo al principio: ORDER BY no
cambia la tabla. La tabla carta sigue guardada igual que siempre. ORDER BY
solo ordena el resultado que te devuelve esta consulta concreta. Es como
barajar las cartas para enseñártelas en cierto orden: la caja sigue teniendo las
mismas cartas.
Ordenar por varias columnas (el desempate)
¿Y si dos cartas cuestan lo mismo? En el ejemplo de arriba, Chispín y Flamita cuestan 2 las dos. ¿Cuál va primero? Puedes decidirlo: cuando hay empate en la primera columna, que desempate una segunda. Basta con separarlas por comas:
SELECT nombre, coste FROM carta ORDER BY coste DESC, nombre ASC;
Esto dice: ordena por coste de mayor a menor y, cuando dos cartas empaten en coste, desempata por nombre en orden alfabético. Resultado:
| nombre | coste |
|---|---|
| Hojarasca | 4 |
| Burbujo | 3 |
| Chispín | 2 |
| Flamita | 2 |
| Entreno intensivo | 1 |
| Poción | 1 |
Ahora Chispín va antes que Flamita porque, a igualdad de coste, la "C" va antes que la "F". Así de fácil construye un juego el orden de cualquier lista.
Las tres piezas juntas
Lo bonito viene cuando combinas las tres cosas en una sola pregunta: elige
columnas, filtra filas y ordena el resultado. El orden de las palabras siempre es
el mismo: primero SELECT, luego FROM, luego WHERE y al final ORDER BY.
Por ejemplo: "dame el nombre y el coste de las cartas comunes, de la más barata a la más cara".
SELECT nombre, coste
FROM carta
WHERE rareza = 'común'
ORDER BY coste ASC;
Resultado:
| nombre | coste |
|---|---|
| Entreno intensivo | 1 |
| Poción | 1 |
| Chispín | 2 |
| Flamita | 2 |
Léelo de corrido y verás que casi suena a español: "selecciona nombre y coste, desde carta, donde la rareza sea común, ordenado por coste". Una buena consulta se lee casi como una frase. Cuando llegues a ese punto, ya habrás entendido la idea.
Poner nombres más bonitos: AS
Un último truco pequeño pero útil. A veces el nombre de una columna no es el más
claro para mostrarlo. Puedes ponerle un alias, un nombre temporal solo para el
resultado, con la palabra AS ("como"):
SELECT alias AS jugador, fecha_alta AS desde
FROM jugador;
Resultado:
| jugador | desde |
|---|---|
| DragoFuego99 | 2026-03-01 |
| LunaVerde | 2026-03-04 |
| PixelPunk | 2026-03-10 |
| ToxiRana | 2026-03-15 |
La columna alias aparece ahora con el título jugador, y fecha_alta como
desde. Igual que ORDER BY, esto no cambia la tabla: solo cambia cómo se
muestra el resultado. Es maquillaje para que se lea mejor.
Resumen
En este capítulo has aprendido a hacerle preguntas a tu base de datos:
SELECT … FROMpide datos de una tabla. Con*traes todas las columnas; nombrándolas, solo las que quieres (proyectar).WHEREfiltra: te quedas solo con las filas que cumplen una condición. Usas operadores (=,<>,<,>,<=,>=) y los combinas conANDyOR. Los textos van entre comillas simples.ORDER BYordena el resultado, ascendente (ASC) o descendente (DESC), y admite varias columnas para desempatar. No cambia la tabla.ASpone un alias (un nombre más bonito) a una columna en el resultado.
Con esto ya puedes sacar de tu base de datos justo la información que necesitas, filtrada y ordenada a tu gusto. Es muchísimo, y todo dentro de una sola tabla.
Y ahí está, precisamente, la siguiente pregunta. Un jugador tiene sus mazos; cada
mazo, sus cartas. Pero el jugador vive en la tabla jugador y las cartas en la
tabla carta: en tablas distintas. ¿Cómo le pides a la base de datos algo que
está repartido entre varias tablas, como "las cartas que tiene DragoFuego99"? Para
eso hay que aprender a conectar tablas. Y eso es justo lo que empieza en el
próximo capítulo.