¿Qué comando SQL se usa para extraer datos de una base de datos?

SQL y PDO: Consultas y Manipulación de Datos

★★★★★Valoración: 4.23 (2762 votos)

El corazón de muchas aplicaciones modernas reside en la gestión de datos, y para interactuar con ellos de manera efectiva, necesitamos lenguajes poderosos. Uno de los más fundamentales y extendidos es SQL (Structured Query Language). SQL es el estándar de facto para comunicarse con bases de datos relacionales, permitiéndonos desde consultar información hasta modificar la estructura misma de los datos. Comprender SQL es un paso crucial para cualquier desarrollador o analista de datos.

Pero saber SQL es solo una parte de la ecuación. Para utilizar SQL en el contexto de una aplicación, especialmente en desarrollo web con lenguajes como PHP, necesitamos una forma de conectar nuestra aplicación a la base de datos y enviar esas instrucciones SQL. Aquí es donde entra en juego PDO (PHP Data Objects), una capa de abstracción de acceso a bases de datos en PHP que proporciona una interfaz ligera y consistente para acceder a diferentes tipos de bases de datos.

¿Qué método de PDO debería usar si quiero hacer una consulta plana SQL?
Utilice el método PDO::query para ejecutar una sentencia que devuelve uno o varios conjuntos de resultados. Para preparar y ejecutar una sentencia SQL que incluya una entrada de variable, utilice los métodos PDO::prepare, PDOStatement::bindParamy PDOStatement::execute .

Este artículo te guiará a través de los comandos SQL más comunes y te mostrará cómo ejecutarlos utilizando PDO, respondiendo específicamente a cómo realizar consultas y extracciones de datos de manera segura y eficiente.

Índice de Contenido

¿Qué es SQL y Por Qué es Crucial?

Como mencionamos, SQL es un lenguaje estándar diseñado específicamente para gestionar y manipular bases de datos relacionales. Su sintaxis, aunque poderosa, es relativamente sencilla de entender, asemejándose al lenguaje natural en muchos aspectos. Su importancia radica en su universalidad; la mayoría de los sistemas de gestión de bases de datos (SGBD) como MySQL, PostgreSQL, SQLite, SQL Server, Oracle, etc., soportan SQL, aunque con algunas variaciones dialectales.

Con SQL, podemos realizar una amplia gama de operaciones:

  • Ejecutar consultas para obtener información específica.
  • Recuperar datos de una o varias tablas.
  • Insertar nuevos registros.
  • Actualizar información existente.
  • Eliminar registros.
  • Crear, modificar o eliminar estructuras de bases de datos (tablas, índices, vistas).
  • Definir y gestionar permisos de acceso.
  • Crear procedimientos almacenados y funciones.

Dominar SQL es, por lo tanto, indispensable para interactuar con bases de datos, que son el pilar de la persistencia de datos en casi cualquier sistema de información.

Los Comandos SQL Fundamentales para la Manipulación de Datos

Exploremos algunos de los comandos SQL más utilizados, aquellos que nos permiten interactuar directamente con los datos dentro de nuestras tablas.

El Comando SELECT: Extrayendo Información

La operación más frecuente es, sin duda, la extracción de datos. Para esto, usamos el comando SELECT. Su forma básica nos permite especificar qué columnas queremos ver y de qué tabla:

SELECT columna1, columna2, ... FROM nombre_tabla;

Si deseamos obtener todas las columnas de una tabla, podemos usar el asterisco (*):

SELECT * FROM nombre_tabla;

Filtrando Resultados con WHERE

Rara vez queremos todos los datos. La cláusula WHERE nos permite filtrar filas basándonos en una condición. Solo se retornarán las filas que cumplan esa condición:

SELECT columna1, columna2 FROM nombre_tabla WHERE condicion;

Las condiciones pueden incluir operadores de comparación (=, <> o !=, >, <, >=, <=), operadores lógicos (AND, OR, NOT), patrones (LIKE), rangos (BETWEEN), o listas de valores (IN).

Ordenando Resultados con ORDER BY

Para presentar los datos en un orden específico, utilizamos la cláusula ORDER BY. Podemos ordenar por una o varias columnas, de forma ascendente (ASC) o descendente (DESC). ASC es el orden por defecto si no se especifica:

SELECT columna1, columna2 FROM nombre_tabla WHERE condicion ORDER BY columna_ordenacion ASC|DESC;

El Comando SELECT DISTINCT: Valores Únicos

A veces, una columna puede contener valores repetidos, y solo nos interesa ver la lista de valores únicos presentes. La palabra clave DISTINCT se usa junto con SELECT para lograr esto:

SELECT DISTINCT columna1 FROM nombre_tabla;

Podemos aplicar DISTINCT a múltiples columnas para obtener combinaciones únicas de esos valores.

El Comando INSERT INTO: Agregando Nuevos Datos

Para añadir nuevos registros a una tabla, usamos INSERT INTO. Podemos especificar las columnas a las que queremos añadir datos, lo cual es útil si no vamos a insertar valores en todas ellas (por ejemplo, si algunas columnas tienen valores por defecto o son autoincrementales):

INSERT INTO nombre_tabla (columna1, columna2, ...) VALUES (valor1, valor2, ...);

Si vamos a insertar valores en todas las columnas (en el orden en que están definidas en la tabla), podemos omitir la lista de columnas:

INSERT INTO nombre_tabla VALUES (valor1, valor2, ...);

El Comando UPDATE: Modificando Datos Existentes

Para cambiar los valores de uno o más registros existentes, utilizamos UPDATE. Es crucial usar la cláusula WHERE con UPDATE para especificar qué registros modificar. Si omites WHERE, ¡actualizarás *todos* los registros de la tabla!

UPDATE nombre_tabla SET columna1 = nuevo_valor1, columna2 = nuevo_valor2, ... WHERE condicion;

El Comando DELETE: Eliminando Datos

Para borrar registros de una tabla, usamos DELETE. Al igual que con UPDATE, la cláusula WHERE es vital para especificar qué registros eliminar. ¡Sin WHERE, borrarás *todos* los registros de la tabla!

DELETE FROM nombre_tabla WHERE condicion;

Funciones de Agregación: COUNT(), AVG(), SUM()

SQL proporciona funciones integradas para realizar cálculos sobre conjuntos de filas. Las más comunes incluyen:

  • COUNT(): Cuenta el número de filas que cumplen un criterio.
  • AVG(): Calcula el valor promedio de una columna numérica.
  • SUM(): Calcula la suma total de una columna numérica.

Estas funciones a menudo se usan junto con SELECT y WHERE, y son fundamentales para obtener resúmenes de datos.

SELECT COUNT(nombre_columna) FROM nombre_tabla WHERE condicion;

SELECT AVG(nombre_columna) FROM nombre_tabla WHERE condicion;

SELECT SUM(nombre_columna) FROM nombre_tabla WHERE condicion;

Combinando Tablas con JOIN

Las bases de datos relacionales dividen la información en múltiples tablas para evitar redundancia. A menudo, necesitamos combinar datos de dos o más tablas basándonos en una relación entre ellas (generalmente una columna común). La cláusula JOIN se utiliza para esto.

El tipo más común es INNER JOIN, que retorna solo las filas donde la condición de unión se cumple en ambas tablas:

SELECT T1.columna, T2.columna FROM Tabla1 T1 INNER JOIN Tabla2 T2 ON T1.columna_comun = T2.columna_comun;

Existen otros tipos de JOIN como LEFT JOIN, RIGHT JOIN y FULL JOIN, que incluyen filas de una tabla incluso si no hay coincidencia en la otra.

Ejecutando SQL con PDO (PHP Data Objects)

Ahora que conocemos los comandos básicos, veamos cómo podemos ejecutarlos desde PHP utilizando PDO. PDO es una capa de abstracción que nos permite usar el mismo código PHP para interactuar con diferentes tipos de bases de datos, cambiando solo la cadena de conexión.

Conectando a la Base de Datos

Lo primero es establecer una conexión. Esto se hace creando una instancia de la clase PDO:

try {

$dsn = 'mysql:host=localhost;dbname=mi_base_datos;charset=utf8';

$usuario = 'mi_usuario';

$contrasena = 'mi_contrasena';

$conexion = new PDO($dsn, $usuario, $contrasena);

$conexion->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // Configurar manejo de errores

} catch (PDOException $e) {

echo 'Error de conexión: ' . $e->getMessage();

die();

}

Es vital configurar el manejo de errores a ERRMODE_EXCEPTION para que PDO lance excepciones en caso de problemas, lo cual facilita la depuración.

¿Qué Método PDO Usar para una Consulta Plana SQL?

La pregunta clave. PDO ofrece varios métodos para ejecutar sentencias SQL. Para una "consulta plana SQL", que interpretamos como una sentencia SQL que no contiene valores variables provenientes de fuentes externas (como la entrada del usuario), los métodos más relevantes son query() y prepare()/execute(). Existe también exec(), pero este es para sentencias que no retornan conjuntos de resultados (como INSERT, UPDATE, DELETE, CREATE TABLE, etc.) y solo devuelve el número de filas afectadas.

El Método query()

Este método es ideal para ejecutar sentencias SELECT simples que no necesitan parámetros ni contienen datos de entrada del usuario. Ejecuta la sentencia directamente y retorna un objeto PDOStatement si la consulta es exitosa, o false en caso de error (si el modo de error no está configurado para lanzar excepciones).

try {

$sentencia = $conexion->query('SELECT id, nombre FROM usuarios WHERE activo = 1 ORDER BY nombre');

while ($fila = $sentencia->fetch(PDO::FETCH_ASSOC)) {

print_r($fila);

}

} catch (PDOException $e) {

echo 'Error en la consulta: ' . $e->getMessage();

}

El método query() es conciso para consultas fijas, pero no debe usarse si la consulta incluye o podría incluir cualquier dato proveniente del usuario o de cualquier fuente externa no confiable. Usarlo con datos externos abre la puerta a la inyección SQL.

¿Cómo obtener datos de una selección en PHP?
La consulta SELECT en PHP puede usarse como prefijo para seleccionar registros de una tabla . Devuelve un conjunto de registros de una o más tablas especificadas. SELECT es un comando que permite seleccionar un registro de una tabla. Las columnas de la tabla "Nombre de mi tabla" son la columna A>, la columna B>, etc.22 oct 2024

Los Métodos prepare() y execute()

Estos métodos trabajan juntos y son la forma recomendada y segura de ejecutar la mayoría de las sentencias SQL, especialmente si involucran datos variables. El proceso se divide en dos pasos:

  1. Preparar (prepare()): Se envía la estructura de la consulta al servidor de base de datos, que la analiza y optimiza. Los valores variables se reemplazan por marcadores de posición (? o :nombre). Este paso retorna un objeto PDOStatement.
  2. Ejecutar (execute()): Se envían los valores reales para los marcadores de posición. Estos valores se envían por separado de la consulta, lo que previene la inyección SQL.

Este método es más flexible y mucho más seguro. Es la forma estándar de manejar sentencias con cláusulas WHERE que usan valores dinámicos, sentencias INSERT, UPDATE, y DELETE.

Ejemplo con marcadores de posición con nombre:

try {

$idUsuario = 5;

$sentencia = $conexion->prepare('SELECT nombre, email FROM usuarios WHERE id = :id AND activo = 1');

$sentencia->bindParam(':id', $idUsuario, PDO::PARAM_INT); // Enlazar parámetro

$sentencia->execute();

$usuario = $sentencia->fetch(PDO::FETCH_ASSOC);

if ($usuario) {

print_r($usuario);

}

} catch (PDOException $e) {

echo 'Error al preparar/ejecutar: ' . $e->getMessage();

}

Ejemplo con marcadores de posición de signo de interrogación:

try {

$email = '[email protected]';

$sentencia = $conexion->prepare('UPDATE usuarios SET activo = 0 WHERE email = ?');

$sentencia->execute([$email]); // Pasar valores en un array a execute

echo 'Filas afectadas: ' . $sentencia->rowCount();

} catch (PDOException $e) {

echo 'Error al preparar/ejecutar: ' . $e->getMessage();

}

Para una "consulta plana SQL" que sea una simple selección sin parámetros, podrías usar query(). Sin embargo, la práctica más segura y recomendable es siempre usar prepare() y execute(), incluso para consultas aparentemente simples. Esto crea un hábito seguro y protege contra futuras modificaciones del código que puedan introducir vulnerabilidades.

El Método exec()

Este método se usa para ejecutar sentencias SQL que no retornan un conjunto de resultados. Es decir, para INSERT, UPDATE, DELETE, CREATE TABLE, DROP TABLE, etc., cuando no necesitas recuperar datos, solo saber si la operación tuvo éxito y cuántas filas fueron afectadas.

try {

$sql = 'DELETE FROM usuarios WHERE activo = 0';

$filasAfectadas = $conexion->exec($sql);

echo 'Se eliminaron ' . $filasAfectadas . ' usuarios inactivos.';

} catch (PDOException $e) {

echo 'Error al ejecutar DELETE: ' . $e->getMessage();

}

Al igual que query(), exec() no debe usarse con sentencias que incluyan datos de entrada del usuario por el riesgo de inyección SQL. Para INSERT, UPDATE, DELETE con datos variables, usa siempre prepare()/execute().

Obteniendo Resultados de Consultas SELECT

Después de ejecutar un SELECT con query() o prepare()/execute(), el objeto PDOStatement resultante nos permite recuperar los datos. Los métodos más comunes son:

  • fetch(): Recupera la siguiente fila del conjunto de resultados. Puedes especificar el estilo de recuperación (por defecto, una mezcla de array numérico y asociativo; PDO::FETCH_ASSOC es muy común para obtener un array asociativo con nombres de columna). Se usa típicamente en un bucle para iterar sobre todas las filas.
  • fetchAll(): Recupera todas las filas restantes del conjunto de resultados en un único array. Útil si esperas un número pequeño de resultados o necesitas procesar todos los datos a la vez.

Ejemplo con fetchAll():

try {

$sentencia = $conexion->query('SELECT id, nombre FROM productos');

$productos = $sentencia->fetchAll(PDO::FETCH_ASSOC);

print_r($productos);

} catch (PDOException $e) {

echo 'Error al obtener todos los productos: ' . $e->getMessage();

}

La Amenaza de la Inyección SQL y Cómo Prevenirla

La inyección SQL es una de las vulnerabilidades de seguridad web más comunes y peligrosas. Ocurre cuando datos no confiables (típicamente entrada del usuario desde formularios, URLs, cookies, etc.) se concatenan directamente en una sentencia SQL. Un atacante puede insertar código SQL malicioso que altere la lógica de tu consulta, permitiéndole robar datos, modificar información o incluso destruir tu base de datos.

Considera este ejemplo inseguro (¡NUNCA hagas esto!):

// Supongamos que $id viene de la entrada del usuario (e.g., $_GET['id'])

$id = $_GET['id'];

// Sentencia INSEGURA

$sql = "SELECT * FROM usuarios WHERE id = " . $id;

$resultado = $conexion->query($sql);

Si el atacante ingresa en la URL ?id=5 OR 1=1, la consulta se convierte en SELECT * FROM usuarios WHERE id = 5 OR 1=1. Como 1=1 siempre es verdadero, la cláusula WHERE se vuelve verdadera para *todas* las filas, y el atacante obtiene acceso a todos los datos de la tabla usuarios.

La forma estándar y efectiva de prevenir la inyección SQL con PDO es mediante el uso de sentencias preparadas (prepare() y execute()). Al usar marcadores de posición, PDO se asegura de que los valores se traten estrictamente como datos, no como parte del código SQL, neutralizando así cualquier intento de inyección.

Tabla Comparativa de Métodos PDO para Ejecutar SQL

Método(s)Uso PrincipalRetornaSeguridad (Inyección SQL)Cuándo Usarlo
query()Sentencias SELECT simples sin parámetros variables.Objeto PDOStatement (o false en caso de error).INSEGURO si se usa con datos variables/externos.Sólo para consultas fijas, sin ninguna entrada externa. Generalmente, es mejor usar prepare()/execute() siempre.
prepare() y execute()Sentencias SELECT, INSERT, UPDATE, DELETE con parámetros variables.prepare() retorna PDOStatement. execute() retorna true/false.SEGURO cuando se usan marcadores de posición y se enlazan parámetros correctamente.La forma RECOMENDADA para la mayoría de las operaciones SQL, especialmente con entrada de usuario.
exec()Sentencias INSERT, UPDATE, DELETE, DDL (CREATE, DROP) que no retornan resultados.Número de filas afectadas (entero).INSEGURO si se usa con datos variables/externos.Para operaciones que no devuelven datos y no usan entrada externa (o si la entrada externa se maneja de forma segura antes). Mejor usar prepare()/execute() para INSERT/UPDATE/DELETE con datos variables.

Preguntas Frecuentes sobre SQL y PDO

¿Qué es exactamente una "consulta plana SQL"?

El término "consulta plana" o "sentencia plana" generalmente se refiere a una sentencia SQL simple, escrita directamente, sin el uso de procedimientos almacenados o lógica compleja en el lado del servidor. En el contexto de la ejecución desde una aplicación, a menudo implica una sentencia que no requiere o no utiliza parámetros variables provenientes de la aplicación, aunque a veces puede referirse a cualquier sentencia SQL cruda.

¿Por qué usar PDO en lugar de las extensiones específicas de base de datos como MySQLi?

PDO ofrece una capa de abstracción. Esto significa que puedes cambiar el tipo de base de datos (de MySQL a PostgreSQL, por ejemplo) con cambios mínimos en tu código PHP, principalmente solo modificando la cadena de conexión (DSN). MySQLi, en cambio, está ligado específicamente a MySQL.

¿Cuándo debería usar query() en lugar de prepare()/execute()?

Técnicamente, podrías usar query() para cualquier sentencia SELECT muy simple y fija, como SELECT * FROM configuracion, donde no hay posibilidad de que la entrada externa influya en la consulta. Sin embargo, como buena práctica de seguridad, siempre es mejor usar prepare()/execute(). Te acostumbras al patrón seguro, y si la consulta necesita ser modificada más tarde para incluir parámetros, ya tienes la estructura correcta. La única excepción clara para query() podría ser para sentencias DDL (CREATE, ALTER, DROP) o sentencias de control de transacciones (COMMIT, ROLLBACK), aunque exec() es a menudo más adecuado para DDL.

¿Cómo evito la inyección SQL con PDO?

La forma principal es usar sentencias preparadas (prepare()) con marcadores de posición (? o :nombre) y luego pasar los valores variables a través del método execute(). PDO se encarga internamente de escapar o manejar correctamente los valores para que no sean interpretados como código SQL.

¿Cuál es la diferencia entre fetch() y fetchAll()?

fetch() recupera una sola fila del conjunto de resultados cada vez que se llama. Es ideal para iterar sobre grandes conjuntos de resultados sin cargar toda la información en memoria a la vez. fetchAll() recupera *todas* las filas restantes del conjunto de resultados en un solo array. Es conveniente para conjuntos de resultados pequeños, pero puede consumir mucha memoria con tablas grandes.

Conclusión

Comprender SQL es fundamental para cualquier interacción con bases de datos relacionales. Dominar comandos como SELECT, INSERT, UPDATE, DELETE, y el uso de cláusulas como WHERE y ORDER BY te permite manipular tus datos de manera efectiva. Al integrar este conocimiento con PDO en PHP, obtienes una herramienta poderosa y flexible para conectar tus aplicaciones a bases de datos diversas. Crucialmente, el uso de sentencias preparadas con prepare() y execute() no es solo una opción, sino una necesidad para proteger tus aplicaciones de la peligrosa inyección SQL. Siempre opta por la seguridad; te ahorrará muchos problemas a largo plazo.

Sigue practicando, experimentando y, como siempre, ¡NUNCA PARES DE APRENDER!

Si quieres conocer otros artículos parecidos a SQL y PDO: Consultas y Manipulación de Datos puedes visitar la categoría Bases de datos.

Ivan

Soy un entusiasta de la tecnología con especialización en bases de datos, particularmente en MySQL. A través de mis tutoriales detallados, busco desmitificar los conceptos complejos y proporcionar soluciones prácticas a los desafíos cotidianos relacionados con la gestión de datos

Aprende mas sobre MySQL

Subir