Fundamentos de SQL: Manipulación y Consulta de Datos

SQL, que significa Structured Query Language (Lenguaje de Consulta Estructurado), es el estándar universal para interactuar con bases de datos relacionales. Aunque el estándar define las reglas generales, cada sistema de gestión de bases de datos (DBMS) puede implementar sus propias "extensiones" o "dialectos".

Sintaxis Genarel de SQL

  • Las sentencias SQL pueden escribirse en una o varias líneas, finalizando siempre con un punto y coma (;).
  • El uso de espacios y sangrías es crucial para mejorar la legibilidad del código.
  • En MySQL, SQL no distingue entre mayúsculas y minúsculas para palabras clave, pero por convención, se recomienda usar mayúsculas para las palabras clave (ej., SELECT, FROM, WHERE).
  • Tipos de comentarios:
    • Comentario de una línea: -- Texto de comentario o # Texto de comentario (específico de MySQL).
    • Comentario de múltiples líneas: /* Texto de comentario */.

Clasificación de las Sentencias SQL

Las sentencias SQL se dividen en varias categorías según su propósito:

  1. DDL (Data Definition Language) - Lenguaje de Definición de Datos: Se utiliza para definir, modificar y eliminar objetos de la base de datos como bases de datos, tablas, vistas e índices. Palabras clave comunes incluyen CREATE, ALTER, DROP, SHOW, USE.
  2. DML (Data Manipulation Language) - Lenguaje de Manipulación de Datos: Permite insertar, actualizar y eliminar datos dentro de las tablas de la base de datos. Las palabras clave principales son INSERT, UPDATE, DELETE.
  3. DQL (Data Query Language) - Lenguaje de Consulta de Datos: Se emplea para recuperar datos de las tablas. La palabra clave principal es SELECT.
  4. DCL (Data Control Language) - Lenguaje de Control de Datos: Gestiona los permisos de acceso y los niveles de seguridad de la base de datos, así como la creación de usuarios. Incluye palabras clave como GRANT y REVOKE.

DDL: Operaciones sobre Bases de Datos

1. Creación de Bases de Datos (CREATE)

Para crear una nueva base de datos:

CREATE DATABASE mi_aplicacion_db;

Es buena práctica verificar si una base de datos ya existe antes de intentar crearla:

CREATE DATABASE IF NOT EXISTS mi_aplicacion_db;

Se puede especificar el conjunto de caracteres y la intercalación:

CREATE DATABASE mi_aplicacion_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

2. Consulta de Bases de Datos (RETRIEVE)

Para ver todas las bases de datos disponibles en el servidor:

SHOW DATABASES;

Para obtener la sentencia de creación de una base de datos específica (útil para ver su configuración de caracteres):

SHOW CREATE DATABASE mi_aplicacion_db;

3. Modificación de Bases de Datos (ALTER)

Para cambiar el conjunto de caracteres de una base de datos existente:

ALTER DATABASE mi_aplicacion_db CHARACTER SET latin1;

4. Eliminación de Bases de Datos (DROP)

Para eliminar una base de datos y todo su contenido (¡cuidado!):

DROP DATABASE mi_aplicacion_db;

Para eliminar solo si la base de datos existe, evitando errores:

DROP DATABASE IF EXISTS mi_aplicacion_db;

5. Selección y Uso de una Base de Datos

Para activar una base de datos y realizar operaciones dentro de ella:

USE mi_aplicacion_db;

Para verificar qué base de datos está actualmente en uso:

SELECT DATABASE();


DDL: Operaciones sobre Tablas

Antes de operar con tablas, asegúrese de haber seleccionado la base de datos correcta con USE.

USE mi_aplicacion_db;

1. Creación de Tablas (CREATE)

La sintaxis básica para crear una tabla implica definir sus columnas y sus respectivos tipos de datos:

CREATE TABLE productos (
   id_producto INT PRIMARY KEY AUTO_INCREMENT,
   nombre VARCHAR(100) NOT NULL,
   precio DECIMAL(10, 2),
   stock INT DEFAULT 0,
   fecha_creacion TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

Tipos de datos comunes:

  • INT: Números enteros.
  • DECIMAL(P, S): Números decimales con precisión (P) total de dígitos y escala (S) de dígitos después del punto decimal.
  • DATE: Almacena solo la fecha (YYYY-MM-DD).
  • DATETIME: Almacena fecha y hora (YYYY-MM-DD HH:MM:SS).
  • TIMESTAMP: Almacena fecha y hora, a menudo utilizado para registrar automáticamente la fecha/hora de creación o actualización de un registro.
  • VARCHAR(longitud): Cadenas de caracteres de longitud variable hasta el valor especificado.

Para crear una tabla copiando la estructura de otra existente:

CREATE TABLE productos_historico LIKE productos;

2. Consulta de Tablas (RETRIEVE)

Para listar todas las tablas en la base de datos actual:

SHOW TABLES;

Para ver la estructura detallada de una tabla (columnas, tipos, claves, etc.):

DESCRIBE productos;
-- O
SHOW COLUMNS FROM productos;

3. Modificación de Tablas (ALTER)

Cambiar el nombre de una tabla:

ALTER TABLE productos RENAME TO inventario_general;

Cambiar el conjunto de caracteres de una tabla:

ALTER TABLE inventario_general CHARACTER SET utf8mb4;

4. Eliminación de Tablas (DROP)

Para eliminar una tabla completamente:

DROP TABLE inventario_general;

Para eliminar una tabla solo si existe:

DROP TABLE IF EXISTS inventario_general;


DDL: Operaciones sobre Columnas

Estas operaciones se realizan usando la sentencia ALTER TABLE.

1. Añadir una Columna

Para agregar una nueva columna a una tabla existente:

ALTER TABLE productos ADD COLUMN proveedor_id INT;

2. Modificar una Columna

Para cambiar el nombre de una columna y/o su tipo de datos:

ALTER TABLE productos CHANGE COLUMN proveedor_id id_proveedor INT NOT NULL DEFAULT 1;

Para cambiar solo el tipo de datos o las restricciones de una columna (sin cambiar su nombre):

ALTER TABLE productos MODIFY COLUMN nombre VARCHAR(150) NOT NULL;

3. Eliminar una Columna

Para eliminar una columna de una tabla:

ALTER TABLE productos DROP COLUMN stock;


DML: Manipulación de Datos en Tablas

La manipulación de datos se refiere a las operaciones de inserción, actualización y eliminación de registros (filas) dentro de las tablas.

1. Insertar Datos (INSERT)

Para añadir nuevas filas a una tabla, especificando las columnas y sus valores:

INSERT INTO productos (nombre, precio, stock) VALUES ('Smartphone Pro', 999.99, 50);

Si se proporcionan valores para todas las columans de la tabla en el orden correcto, se pueden omitir los nombres de las columnas:

-- Asumiendo id_producto es AUTO_INCREMENT y fecha_creacion es DEFAULT CURRENT_TIMESTAMP
INSERT INTO productos VALUES (DEFAULT, 'Smartwatch Deluxe', 250.00, 100, DEFAULT);

Para insertar múltiples filas en una sola sentencia:

INSERT INTO productos (nombre, precio, stock) VALUES
   ('Auriculares Bluetooth', 75.00, 200),
   ('Cámara Web HD', 49.99, 150),
   ('Disco Duro Externo', 120.50, 80);

Nota: Los valores de texto y fecha/hora deben ir entre comillas simples (') o dobles ("), mientras que los números no.

2. Actualizar Datos (UPDATE)

Para modificar los valores de las filas existentes en una tabla:

UPDATE productos SET precio = 1049.99 WHERE nombre = 'Smartphone Pro';

Se pueden actualizar múltiples columnas a la vez:

UPDATE productos SET stock = 120, precio = 55.00 WHERE nombre = 'Cámara Web HD';

¡Advertencia! Si se omite la cláusula WHERE, la actualización afectará a todas las filas de la tabla.

UPDATE productos SET stock = 0; -- Establecerá el stock de TODOS los productos a 0

3. Eliminar Datos (DELETE)

Para borrar filas específicas de una tabla:

DELETE FROM productos WHERE id_producto = 2;

Para eliminar múltiples filas basadas en una condición:

DELETE FROM productos WHERE stock < 100;

¡Advertencia! Sin la cláusula WHERE, se eliminarán todas las filas de la tabla:

DELETE FROM productos; -- Eliminará todos los registros

Alternativa para borrar todos los registros de una tabla, más eficiente en muchos casos:

TRUNCATE TABLE productos;

La diferencia clave es que TRUNCATE TABLE es una operación DDL que reinicia la tabla (eliminándola y volviéndola a crear), siendo más rápida y restableciendo los contadores AUTO_INCREMENT. DELETE FROM es una operación DML que borra fila por fila, y no reinicia AUTO_INCREMENT a menos que la tabla esté vacía.


DQL: Consultando Datos

La sentencia SELECT es la herramienta principal para recuperar información de una o varias tablas.

1. Sintaxis Básica de Consulta

SELECT
   lista_campos
FROM
   lista_tablas
WHERE
   condicion_filtro
GROUP BY
   campos_agrupacion
HAVING
   condicion_agregada
ORDER BY
   campos_ordenacion
LIMIT
   desplazamiento, cantidad;

2. Consultas Fundamentales

a. Selección de Campos

Para seleccionar campos específicos:

SELECT nombre, precio FROM productos;

Para seleccionar todos los campos de una tabla:

SELECT * FROM productos;

b. Eliminación de Duplicados (DISTINCT)

Para mostrar solo valores únicos en una columna:

SELECT DISTINCT categoria FROM productos;

(Asumiendo que existe una columna categoria)

c. Campos Calculados

Se pueden realizar operaciones aritméticas con los campos numéricos:

SELECT nombre, precio * 1.21 AS precio_con_iva FROM productos;

La función IFNULL(expresion1, expresion2) permite reemplazar valores NULL por un valor predeterminado. Esto es útil en cálculos:

SELECT id_empleado, salario + IFNULL(comision, 0) AS salario_total FROM empleados;

(Asumiendo una tabla empleados con columnas salario y comision)

d. Alias (AS)

Se pueden asignar alias a tablas o columnas para hacer las consultas más legibles o manejar ambigüedades:

SELECT nombre AS NombreArticulo, stock AS CantidadEnAlmacen FROM productos;

La palabra clave AS es opcional.

3. Filtrado de Datos (WHERE)

La cláusula WHERE se utiliza para especificar las condiciones que deben cumplir las filas para ser incluidas en el resultado de la consulta. Se pueden usar varios operadores:

  • Operadores de comparación: =, <> (o !=), <, >, <=, >=.
  • Operadores lógicos: AND, OR, NOT.
  • Otros operadores:
    • BETWEEN valor1 AND valor2: Valor dentro de un rango inclusivo.
    • IN (valor1, valor2, ...): Valor coincide con cualquiera en una lista.
    • LIKE 'patrón': Búsqueda de patrones (% para cero o más caracteres, _ para un solo carácter).
    • IS NULL / IS NOT NULL: Comprueba si un valor es nulo.

Ejemplos:

SELECT * FROM productos WHERE precio > 100 AND stock < 50;
SELECT nombre FROM productos WHERE categoria IN ('Electrónica', 'Hogar');
SELECT nombre FROM productos WHERE nombre LIKE 'Smart%';
SELECT id_empleado, nombre FROM empleados WHERE fecha_contratacion IS NULL;

4. Ordenación de Resultados (ORDER BY)

La cláusula ORDER BY se usa para clasificar las filas del resultado. Se puede especificar el orden ascendente (ASC, por defecto) o descendente (DESC).

SELECT nombre, precio FROM productos ORDER BY precio DESC;

Se pueden especificar múltiples criterios de ordenación:

SELECT nombre, categoria, precio FROM productos ORDER BY categoria ASC, precio DESC;

En este caso, los productos se ordenan primero por categoría (ascendente) y, dentro de cada categoría, por precio (descendente).

5. Funciones de Agregación

Las funciones de agregación operan sobre un conjunto de filas para devolver un único valor.

  • COUNT(): Cuenta el número de filas.
    • COUNT(*): Cuenta todas las filas, incluyendo las que tienen valores nulos.
    • COUNT(columna): Cuenta las filas donde la columna no es nula.
  • SUM(columna): Calcula la suma de los valores en una columna numérica.
  • AVG(columna): Calcula el promedio de los valores en una columna numérica.
  • MAX(columna): Encuentra el valor máximo en una columna.
  • MIN(columna): Encuentra el valor mínimo en una columna.

Ejemplos:

SELECT COUNT(*) AS total_productos FROM productos;
SELECT SUM(stock) AS stock_total_almacen FROM productos WHERE categoria = 'Electrónica';
SELECT AVG(precio) AS precio_promedio FROM productos;
SELECT MAX(precio) AS producto_mas_caro FROM productos;

Nota: Las funciones de agregación ignoran los valores NULL. Si desea incluir nulos en cálculos de suma o promedio, use IFNULL() primero.

6. Agrupación de Resultados (GROUP BY y HAVING)

La cláusula GROUP BY se usa para agrupar filas que tienen los mismos valores en una o más columnas, permitiendo aplicar funciones de agregación a cada grupo.

SELECT categoria, COUNT(*) AS numero_productos, AVG(precio) AS precio_medio
FROM productos
GROUP BY categoria;

La cláusula HAVING es similar a WHERE, pero se utiliza para filtrar los resultados después de que los grupos han sido formados y las funciones de agregación aplicadas.

Diferencias clave entre WHERE y HAVING:

  • WHERE filtra filas individuales antes de la agrupación. No puede contener funciones de agregación.
  • HAVING filtra grupos después de la agrupación. Puede contener funciones de argegación.

Ejemplo con HAVING:

SELECT categoria, AVG(precio) AS precio_medio
FROM productos
GROUP BY categoria
HAVING AVG(precio) > 150;

Esta consulta agrupa los productos por categoría y luego filtra solo aquellas categorías cuyo precio promedio es superior a 150.

7. Paginación de Resultados (LIMIT y OFFSET)

La cláusula LIMIT se usa para restringir el número de filas devueltas por una consulta. Es una característica específica de MySQL (y PostgreSQL, SQLite).

SELECT * FROM productos LIMIT 10; -- Muestra las primeras 10 filas.

Para implementar paginación, se usa LIMIT junto con OFFSET, que especifica cuántas filas saltar desde el inicio del conjunto de resultados.

La fórmula para la paginación es: OFFSET = (numero_pagina - 1) * filas_por_pagina.

-- Mostrar la primera página (10 filas por página)
SELECT * FROM productos ORDER BY id_producto LIMIT 10 OFFSET 0;

-- Mostrar la segunda página (10 filas por página)
SELECT * FROM productos ORDER BY id_producto LIMIT 10 OFFSET 10;

-- Mostrar la tercera página (10 filas por página)
SELECT * FROM productos ORDER BY id_producto LIMIT 10 OFFSET 20;

Es importante combinar LIMIT y OFFSET con un ORDER BY para asegurar un orden consistente en los resultados paginados.

Etiquetas: SQL MySQL DDL DML dql

Publicado el 7-20 04:06