PHP MySQL Select: Guía Completa
Aprende a usar SQL SELECT en PHP — filtra con WHERE, ordena con ORDER BY, pagina con LIMIT y obtén filas de forma segura con mysqli y PDO.
SELECT es la sentencia SQL que lee datos de una base de datos — es la que usarás más que cualquier otra. Esta guía cubre la sintaxis de SELECT, las cláusulas que dan forma a tus resultados y las dos extensiones de PHP (mysqli y PDO) que usas para ejecutar una consulta y recorrer las filas que devuelve.
Si aún no te has conectado a una base de datos, comienza con PHP MySQL Connect; para insertar filas en una tabla primero, consulta PHP MySQL Insert.
Qué hace la sentencia SELECT
SELECT recupera filas de una o más tablas. En su forma más sencilla, nombras las columnas que quieres y la tabla de la que leerlas:
SELECT column1, column2, ...
FROM table_name;Usa * para seleccionar todas las columnas. Es conveniente para exploración rápida, pero deberías nombrar las columnas explícitamente en el código de la aplicación — es más rápido, deja clara tu intención y tu código no se romperá cuando alguien añada una columna a la tabla.
-- All columns (fine for the mysql console, avoid in app code)
SELECT * FROM users;
-- Only what you need (preferred)
SELECT id, name, email FROM users;Un SELECT siempre devuelve un conjunto de resultados: cero o más filas, cada una formada por las columnas que pediste. PHP te entrega ese conjunto de resultados como algo que puedes recorrer en un bucle.
Dar forma al conjunto de resultados
La forma de columnas-y-tabla es solo el comienzo. Cinco cláusulas te permiten filtrar, ordenar, agrupar y combinar datos. Deben aparecer en este orden cuando usas más de una:
| Cláusula | Qué hace | Más información |
|---|---|---|
WHERE | Conserva solo las filas que coinciden con una condición | MySQL WHERE |
GROUP BY | Agrupa filas para agregados como COUNT() | — |
HAVING | Filtra esos grupos (como WHERE, pero para agregados) | — |
ORDER BY | Ordena las filas | MySQL ORDER BY |
LIMIT | Limita cuántas filas se devuelven | MySQL LIMIT |
Filtrar con WHERE
Devuelve solo los usuarios llamados John:
SELECT name, email
FROM users
WHERE name = 'John';Ordenar con ORDER BY
Ordena alfabéticamente por nombre. ASC es ascendente (el valor por defecto), DESC es descendente:
SELECT name, email
FROM users
ORDER BY name ASC;Limitar filas con LIMIT
Obtén solo los 10 usuarios más recientes — esencial para la paginación y para no cargar un millón de filas en memoria:
SELECT name, email
FROM users
ORDER BY created_at DESC
LIMIT 10;Unir tablas
JOIN une tablas relacionadas mediante una clave compartida. Aquí cada pedido se vincula al usuario que lo realizó:
SELECT users.name, orders.order_id
FROM users
JOIN orders ON users.id = orders.user_id;Ejecutar un SELECT desde PHP
Para obtener datos en tu código PHP, el flujo es siempre el mismo:
- Conectar a la base de datos.
- Ejecutar la sentencia
SELECT. - Obtener las filas del conjunto de resultados.
- Cerrar la conexión (PHP también la cierra automáticamente al final de la solicitud).
Utiliza siempre sentencias preparadas para la entrada del usuario
Nunca pegues una variable directamente en una cadena de consulta. Si $name proviene de un formulario, un atacante puede inyectar SQL y leer o destruir toda tu base de datos:
// DANGER: SQL injection. Never do this with untrusted input.
$result = $conn->query("SELECT name, email FROM users WHERE name = '$name'");Una sentencia preparada envía la consulta y los datos por separado, de modo que el valor nunca puede interpretarse como SQL. Este es el hábito más importante al leer datos proporcionados por el usuario. Consulta MySQL Prepared Statements para más información.
Con mysqli
$conn = mysqli_connect("localhost", "username", "password", "database");
if (!$conn) {
die("Connection failed: " . mysqli_connect_error());
}
$stmt = $conn->prepare("SELECT name, email FROM users WHERE name = ?");
$name = "John";
$stmt->bind_param("s", $name); // "s" = the parameter is a string
$stmt->execute();
$result = $stmt->get_result();
if ($result->num_rows > 0) {
while ($row = $result->fetch_assoc()) {
echo "Name: " . $row["name"] . " - Email: " . $row["email"] . "<br>";
}
} else {
echo "0 results";
}
$stmt->close();
mysqli_close($conn);fetch_assoc() devuelve cada fila como un array asociativo indexado por nombre de columna ($row["name"]). Usa fetch_array() si también quieres claves numéricas, o fetch_all(MYSQLI_ASSOC) para obtener todas las filas a la vez en un array.
Con PDO
Para proyectos nuevos, PDO es generalmente la mejor opción: tiene una API consistente para MySQL, PostgreSQL, SQLite y más, y sus sentencias preparadas son fáciles de leer.
$pdo = new PDO("mysql:host=localhost;dbname=database;charset=utf8mb4", "username", "password");
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$stmt = $pdo->prepare("SELECT name, email FROM users WHERE name = ?");
$stmt->execute(["John"]);
foreach ($stmt as $row) {
echo "Name: " . $row["name"] . " - Email: " . $row["email"] . "<br>";
}Configurar PDO::ERRMODE_EXCEPTION hace que las consultas fallidas lancen excepciones en lugar de fallar silenciosamente — envuelve las llamadas a la base de datos en try/catch para que los problemas salgan a la superficie en vez de desaparecer.
Errores comunes
num_rowsdevuelve filas, no un boolean. Comprueba> 0(mysqli) antes de asumir que obtuviste datos.- Seleccionar
*y luego leer una columna sigue transfiriendo todas las columnas por la red. Selecciona solo lo que uses. - Olvidar
LIMITen tablas grandes puede cargar enormes conjuntos de resultados en memoria. Pagina los resultados. - La comparación de cadenas en
WHEREno distingue mayúsculas de minúsculas por defecto en las collations comunes de MySQL —'john'coincide con'John'.
Conclusión
SELECT es el motor de toda aplicación PHP/MySQL. Nombra tus columnas explícitamente, da forma a los resultados con WHERE, ORDER BY, LIMIT y JOIN, y siempre lee la entrada del usuario a través de sentencias preparadas (mysqli o PDO) para estar protegido frente a la inyección SQL. Desde aquí, aprende a modificar datos con MySQL Insert y MySQL Update.