KriaturasBases de datos para quien empieza

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

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

SQL
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".

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

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

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

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

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

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

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

SQL
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".

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

SQL
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 … FROM pide datos de una tabla. Con * traes todas las columnas; nombrándolas, solo las que quieres (proyectar).
  • WHERE filtra: te quedas solo con las filas que cumplen una condición. Usas operadores (=, <>, <, >, <=, >=) y los combinas con AND y OR. Los textos van entre comillas simples.
  • ORDER BY ordena el resultado, ascendente (ASC) o descendente (DESC), y admite varias columnas para desempatar. No cambia la tabla.
  • AS pone 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.