1. Introducción a SQL
1.1. ¿Qué es SQL?
Section titled “1.1. ¿Qué es SQL?”SQL (Structured Query Language) es un lenguaje estándar para almacenar, manipular y recuperar datos en bases de datos relacionales. A diferencia de otros lenguajes de programación, SQL es un lenguaje declarativo, lo que significa que especificas qué datos quieres obtener en lugar de cómo obtenerlos.
Características principales
Section titled “Características principales”- Estandarizado: SQL es un estándar ANSI/ISO, aunque cada motor de base de datos puede tener sus propias extensiones.
- Declarativo: Describes qué datos quieres, no cómo obtenerlos.
- No sensible a mayúsculas/minúsculas para palabras clave (SELECT = select), pero puede serlo para nombres de objetos según la configuración.
- Versátil: Permite definir, consultar, manipular y controlar datos.
Historia y evolución
Section titled “Historia y evolución”- 1970: Edgar F. Codd propone el modelo relacional.
- 1974: IBM desarrolla SEQUEL (Structured English Query Language).
- 1979: Oracle lanza la primera implementación comercial de SQL.
- 1986: ANSI publica el primer estándar SQL.
- 1992: SQL-92, una revisión importante del estándar.
- 1999: SQL:1999 introduce características orientadas a objetos.
- 2003-2016: Actualizaciones posteriores (SQL:2003, SQL:2008, SQL:2011, SQL:2016) añaden XML, funciones analíticas, expresiones regulares, etc.
Componentes principales de SQL
Section titled “Componentes principales de SQL”SQL se divide en varios sublenguajes:
Data Definition Language: Define la estructura de la base de datos.
Comandos principales: CREATE, ALTER, DROP, TRUNCATE
Ejemplo:
CREATE TABLE empleados ( id INT PRIMARY KEY, nombre VARCHAR(50), salario DECIMAL(10,2));Data Manipulation Language: Manipula los datos almacenados.
Comandos principales: SELECT, INSERT, UPDATE, DELETE
Ejemplo:
SELECT nombre, salarioFROM empleadosWHERE salario > 50000;Data Control Language: Controla los permisos y accesos.
Comandos principales: GRANT, REVOKE
Ejemplo:
GRANT SELECT, INSERT ON empleados TO usuario_rh;Transaction Control Language: Gestiona las transacciones.
Comandos principales: COMMIT, ROLLBACK, SAVEPOINT
Ejemplo:
BEGIN TRANSACTION;UPDATE cuentas SET saldo = saldo - 1000 WHERE id = 1;UPDATE cuentas SET saldo = saldo + 1000 WHERE id = 2;COMMIT;1.2. Diferencias entre MySQL, Oracle y otros motores
Section titled “1.2. Diferencias entre MySQL, Oracle y otros motores”- Licencia: Código abierto (Community Edition) y comercial (Enterprise Edition)
- Rendimiento: Excelente para aplicaciones web y operaciones de lectura
- Sintaxis: Más simple y flexible
- Plataformas: Multiplataforma (Windows, Linux, macOS)
- Características distintivas: Fácil de usar, ideal para aplicaciones web
- Limitaciones: Menos funcionalidades avanzadas que Oracle
- Casos de uso: Aplicaciones web, blogs, CMS, e-commerce
- Licencia: Comercial (con versión Express gratuita limitada)
- Rendimiento: Superior para grandes volúmenes de datos y transacciones complejas
- Sintaxis: Más estricta, con extensiones PL/SQL potentes
- Plataformas: Multiplataforma con optimizaciones específicas
- Características distintivas: Alta escalabilidad, seguridad robusta, PL/SQL avanzado
- Limitaciones: Costo elevado, curva de aprendizaje más pronunciada
- Casos de uso: Grandes empresas, sistemas bancarios, ERP, aplicaciones críticas
- Licencia: Comercial (Microsoft) con versión Express gratuita
- Rendimiento: Bueno para entornos empresariales Windows
- Sintaxis: T-SQL (Transact-SQL)
- Plataformas: Principalmente Windows (versiones recientes para Linux)
- Características distintivas: Integración con productos Microsoft, herramientas de BI
- Limitaciones: Mejor rendimiento en entornos Windows
- Casos de uso: Empresas con ecosistema Microsoft, aplicaciones .NET
- Licencia: Código abierto
- Rendimiento: Excelente para operaciones complejas y datos estructurados
- Sintaxis: Estándar SQL con extensiones
- Plataformas: Multiplataforma
- Características distintivas: Altamente extensible, soporte para JSON, tipos de datos personalizados
- Limitaciones: Configuración inicial más compleja que MySQL
- Casos de uso: Aplicaciones geoespaciales, sistemas analíticos, startups
Comparativa de características
Section titled “Comparativa de características”| Característica | MySQL | Oracle | SQL Server | PostgreSQL |
|---|---|---|---|---|
| Tipos de datos JSON | Sí (5.7+) | Sí | Sí | Sí |
| Procedimientos almacenados | Sí | Sí (PL/SQL) | Sí (T-SQL) | Sí (PL/pgSQL) |
| Particionamiento | Sí | Sí (avanzado) | Sí | Sí |
| Replicación | Maestro-esclavo | Avanzada | Avanzada | Lógica/Streaming |
| Índices espaciales | Sí | Sí | Sí | Sí (PostGIS) |
| Vistas materializadas | No (solo vistas) | Sí | Sí | Sí |
| Soporte para XML | Limitado | Completo | Completo | Sí |
1.3. Instalación y configuración (MySQL Workbench, Oracle SQL Developer)
Section titled “1.3. Instalación y configuración (MySQL Workbench, Oracle SQL Developer)”- Descarga MySQL Workbench y MySQL Server desde mysql.com
- Ejecuta el instalador de MySQL Server
- Selecciona “Developer Default” para una instalación típica
- Configura la contraseña del usuario root
- Completa la instalación con las opciones predeterminadas
- Instala MySQL Workbench
- Abre MySQL Workbench y conecta con tu servidor local
Configuración recomendada
Section titled “Configuración recomendada”# Configuración básica de rendimiento para MySQL (my.ini o my.cnf)[mysqld]# Tamaño del buffer de consultasquery_cache_size = 64M# Tamaño del buffer de InnoDBinnodb_buffer_pool_size = 1G# Tamaño máximo de conexionesmax_connections = 200# Conjunto de caracteres por defectocharacter-set-server = utf8mb4collation-server = utf8mb4_unicode_ci- Descarga Oracle Database XE (Express Edition) desde oracle.com
- Instala Oracle Database XE
- Sigue el asistente de instalación
- Configura la contraseña para los usuarios SYS y SYSTEM
- Descarga e instala SQL Developer desde oracle.com
- Abre SQL Developer y crea una nueva conexión:
- Nombre: Conexión local
- Usuario: SYSTEM
- Contraseña: La que configuraste durante la instalación
- Nombre del host: localhost
- Puerto: 1521
- SID/Servicio: XE (o XEPDB1 para versiones más recientes)
Configuración recomendada
Section titled “Configuración recomendada”-- Configuración básica para Oracle Database-- Aumentar el tamaño de los procesosALTER SYSTEM SET processes=300 SCOPE=SPFILE;
-- Configurar el conjunto de caracteresALTER SYSTEM SET NLS_CHARACTERSET=AL32UTF8 SCOPE=SPFILE;
-- Configurar la zona horariaALTER SYSTEM SET timezone_region='America/Mexico_City' SCOPE=SPFILE;
-- Reiniciar la base de datos para aplicar cambiosSHUTDOWN IMMEDIATE;STARTUP;1.4. Conexión y ejecución de consultas en ambos motores
Section titled “1.4. Conexión y ejecución de consultas en ambos motores”Conexión a MySQL
Section titled “Conexión a MySQL”-- Desde línea de comandosmysql -u root -p
-- Desde código (ejemplo en PHP)$conexion = new mysqli('localhost', 'usuario', 'contraseña', 'basedatos');
-- Desde código (ejemplo en Python con pymysql)import pymysqlconn = pymysql.connect( host='localhost', user='usuario', password='contraseña', database='basedatos')Conexión a Oracle
Section titled “Conexión a Oracle”-- Desde línea de comandos (SQLPlus)sqlplus usuario/contraseña@//localhost:1521/XE
-- Desde código (ejemplo en Java con JDBC)Connection conn = DriverManager.getConnection( "jdbc:oracle:thin:@localhost:1521:XE", "usuario", "contraseña");
-- Desde código (ejemplo en Python con cx_Oracle)import cx_Oracleconn = cx_Oracle.connect( "usuario/contraseña@localhost:1521/XE")Ejecutando tu primera consulta
Section titled “Ejecutando tu primera consulta”-- Crear una base de datosCREATE DATABASE miprimerabd;
-- Usar la base de datosUSE miprimerabd;
-- Crear una tablaCREATE TABLE usuarios ( id INT AUTO_INCREMENT PRIMARY KEY, nombre VARCHAR(50) NOT NULL, email VARCHAR(100) UNIQUE, fecha_registro DATETIME DEFAULT CURRENT_TIMESTAMP);
-- Insertar datosINSERT INTO usuarios (nombre, email) VALUES ('Ana López', 'ana@ejemplo.com');INSERT INTO usuarios (nombre, email) VALUES ('Carlos Gómez', 'carlos@ejemplo.com');
-- Consultar datosSELECT * FROM usuarios;
-- Consulta con filtroSELECT nombre, email FROM usuarios WHERE nombre LIKE 'Ana%';-- Conectarse como usuario con privilegios-- Ya deberías estar conectado con SQL Developer o SQLPlus
-- Crear un usuario/esquema (equivalente a base de datos en MySQL)CREATE USER miprimerabd IDENTIFIED BY contraseña;GRANT CONNECT, RESOURCE TO miprimerabd;ALTER USER miprimerabd QUOTA UNLIMITED ON USERS;
-- Conectarse al nuevo esquema-- En SQL Developer: crear nueva conexión con el usuario miprimerabd
-- Crear una tablaCREATE TABLE usuarios ( id NUMBER GENERATED ALWAYS AS IDENTITY PRIMARY KEY, nombre VARCHAR2(50) NOT NULL, email VARCHAR2(100) CONSTRAINT email_unico UNIQUE, fecha_registro TIMESTAMP DEFAULT SYSTIMESTAMP);
-- Insertar datosINSERT INTO usuarios (nombre, email) VALUES ('Ana López', 'ana@ejemplo.com');INSERT INTO usuarios (nombre, email) VALUES ('Carlos Gómez', 'carlos@ejemplo.com');
-- Confirmar cambios (necesario en Oracle)COMMIT;
-- Consultar datosSELECT * FROM usuarios;
-- Consulta con filtroSELECT nombre, email FROM usuarios WHERE nombre LIKE 'Ana%';Diferencias en la sintaxis de consultas
Section titled “Diferencias en la sintaxis de consultas”| Operación | MySQL | Oracle |
|---|---|---|
| Limitar resultados | LIMIT 10 | FETCH FIRST 10 ROWS ONLY |
| Paginación | LIMIT 10 OFFSET 20 | OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY |
| Fecha actual | NOW(), CURRENT_TIMESTAMP | SYSDATE, SYSTIMESTAMP |
| Concatenación | CONCAT(a, b) o `a | |
| Subcadena | SUBSTRING(str, pos, len) | SUBSTR(str, pos, len) |
| Autoincremento | AUTO_INCREMENT | GENERATED ALWAYS AS IDENTITY |
| Formato de fecha | DATE_FORMAT(fecha, '%Y-%m-%d') | TO_CHAR(fecha, 'YYYY-MM-DD') |