Portada » Informática » Dominando las Bases de Datos: Conceptos Clave y Ejercicios SQL Prácticos
Una base de datos o banco de datos es un conjunto de datos pertenecientes a un mismo contexto y almacenados sistemáticamente para su posterior uso. En este sentido, una biblioteca puede considerarse una base de datos compuesta en su mayoría por documentos y textos impresos en papel e indexados para su consulta. En la actualidad, y debido al desarrollo tecnológico de campos como la informática y la electrónica, la mayoría de las bases de datos están en formato digital (electrónico), lo que ofrece un amplio rango de soluciones al problema de almacenar datos.
Existen programas denominados Sistemas de Gestión de Bases de Datos (SGBD) que permiten almacenar y posteriormente acceder a los datos de forma rápida y estructurada. Las propiedades de estos SGBD, así como su utilización y administración, se estudian dentro del ámbito de la informática.
Entre los más conocidos se encuentran:
¿Por qué utilizar una base de datos?
Para profundizar en los SGBD más utilizados, a continuación se presentan algunos recursos y manuales de referencia:
Manual de Referencia MySQL 5.0 (ES)
PHP & MySQL Everyday Apps for Dummies: Descargar
(No se proporcionó un enlace específico para el manual de PostgreSQL en el documento original)
(No se proporcionó un enlace específico para el manual de Oracle en el documento original)
Manual de Referencia – SQL Server
Manual Genérico (posiblemente no específico de SQL Server)
Microsoft SQL Server 2005 Reporting Services for Dummies: Descargar
Access Forms & Reports for Dummies: Descargar
mysql -u usuario -p clave
En el caso en el que el servidor no se encuentre en el ordenador que estamos trabajando, el orden de uso será:
mysql -h nombre_del_host -u usuario -p clave
SHOW DATABASES;
SELECT DATABASE();
SHOW TABLES;
USE nombre_base;
DESCRIBE nombre_tabla;
CREATE DATABASE nombre_base;
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] nombre_tabla (
nombre_campo tipo1 opciones2 cláusulas3,
...,
[último campo]
);
[TEMPORARY]
: La tabla existirá mientras exista la conexión con el cliente actual o hasta que se emita la instrucción DROP TABLE
.[IF NOT EXISTS]
: Si la tabla ya existe, no se crea una nueva, evitando un error.TINYINT
: 1 byteSMALLINT
: 2 bytesMEDIUMINT
: 3 bytesINT
: 4 bytesBIGINT
: 8 bytesFLOAT
: 4 bytesDOUBLE
: 8 bytesDECIMAL
: VariableCHAR(n)
: Cadena de caracteres de longitud fijaVARCHAR(n)
: Cadena de caracteres de longitud variableTINYBLOB
: Objeto binario largo (muy pequeño)BLOB
: Objeto binario largo (pequeño)MEDIUMBLOB
: Objeto binario largo (medio)LONGBLOB
: Objeto binario largo (grande)TINYTEXT
: Cadena de texto muy pequeñaTEXT
: Cadena de texto pequeñaMEDIUMTEXT
: Cadena de texto mediaLONGTEXT
: Cadena de texto largaENUM
: Una enumeraciónSET
: Un conjuntoDATE
: Valor fecha (AAAA-MM-DD)TIME
: Valor de hora (HH-MM-SS)DATETIME
: Valor de fecha y horaTIMESTAMP
: Valor de lapso de tiempo (AAAAMMDDHHMMSS)YEAR
: Valor de añoNULL
: Admite valores nulos.NOT NULL
: Rechaza dejar el campo en blanco.DEFAULT
: Permite establecer un valor por defecto.AUTO_INCREMENT
: Para generar identificadores únicos o valores en serie.UNSIGNED
: Rechazo de valores negativos.BINARY
: Trata los valores como cadenas binarias (campos CHAR
y VARCHAR
).PRIMARY KEY
: Columna indexada para búsqueda rápida. Clave principal, solo puede haber una.UNIQUE
: Crea un índice con valores únicos.INDEX
, KEY
: Son sinónimos y crean índices que pueden contener valores repetidos.INSERT [LOW_PRIORITY | DELAYED] [IGNORE] [INTO] nombre_tabla forma_introducción1;
LOW_PRIORITY | DELAYED
:
LOW_PRIORITY
: Hace que la inserción sea postergada hasta que ningún cliente utilice la tabla.DELAYED
: Genera una cola de introducción de registros, que se añadirán a la tabla cuando esta quede libre de usuarios.IGNORE
: Se desechan las filas que duplican valores para claves únicas.INTO
: Requerido en versiones anteriores a la 3.22.5.(lista_columnas) VALUES (lista_valores_o_expresión)
(lista_columnas) SELECT (opción_de_recuperación)
SET (nombre_columna=expresion, ....)
USE nombre_base;
La forma general del comando de consulta es:
SELECT opciones1
lista2
cláusulas3;
ALL
: Provoca el regreso de todas las filas (por defecto).DISTINCT
, DISTINCTROW
: Especifican que las líneas duplicadas deben ser eliminadas.HIGH_PRIORITY
: Da mayor prioridad a la instrucción en caso de espera.SQL_BIG_RESULT
, SQL_SMALL_RESULT
: Especifican que el conjunto de resultados será más largo o más corto (para optimización).STRAIGHT_JOIN
: Fuerza a las tablas a unirse en el orden citado en la cláusula FROM
.Especifica las columnas que deben devolverse. El símbolo *
especifica que deben extraerse todas las columnas. La separación entre los diferentes nombres de columnas se hace con el símbolo ,
.
INTO OUTFILE nombre_fichero opciones
: El resultado de la consulta es transferido a un fichero. Para esto, se deben tener privilegios para crear el fichero y, además, este no debe existir.[FIELDS [TERMINATED BY 'cadena']a
[OPTIONALLY] [ENCLOSED BY 'carácter']b
[ESCAPED BY 'carácter']c
[LINES TERMINATED BY 'carácter']d
OPTIONALLY
establece que los valores solo se entrecomillan para las columnas CHAR
y VARCHAR
.Los caracteres especiales para ESCAPED BY
son los siguientes:
\0
: ASCII 0\b
: Retroceso\n
: Salto de línea\r
: Retorno de carro\s
: Espacio\t
: Tabulación\'
: Comilla simple\"
: Comilla doble\\
: Barra inversaFROM tabla-tablas
: Especifica una o varias tablas desde las que se obtendrán las filas. Existen varias posibilidades de unión de tablas (consultar la documentación de MySQL).WHERE expresión
: Establece una expresión que se aplica a las filas seleccionadas.GROUP BY lista_columnas
: Agrupa filas del conjunto de resultados de acuerdo con las columnas citadas.HAVING expresión
: Especifica una expresión secundaria para limitar filas después de satisfechas las condiciones expuestas en la cláusula WHERE
.ORDER BY entero_unsigned|nombre_columna|fórmula
: Indica cómo se va a clasificar el conjunto de resultados. Las posibilidades son:
ASC
: AscendenteDESC
: DescendenteRAND()
: Orden aleatorioPROCEDURE nombre_procedimiento
: Indica un nombre de procedimiento al que serán enviados los datos antes de su salida.
SELECT Apellidos FROM EMPLEADOS;
SELECT DISTINCT Apellidos FROM EMPLEADOS;
SELECT * FROM EMPLEADOS WHERE Departamento = 14;
SELECT * FROM EMPLEADOS
WHERE Departamento = 37 OR Departamento = 77;
SELECT * FROM EMPLEADOS
WHERE Departamento IN (37,77);
SELECT * FROM EMPLEADOS
WHERE Apellidos LIKE 'P%';
SELECT SUM(Presupuesto) FROM DEPARTAMENTOS;
SELECT Departamento, COUNT(*)
FROM EMPLEADOS
GROUP BY Departamento;
SELECT *
FROM EMPLEADOS INNER JOIN DEPARTAMENTOS
ON EMPLEADOS.Departamento = DEPARTAMENTOS.Codigo;
SELECT EMPLEADOS.Nombre, Apellidos, DEPARTAMENTOS.Nombre, Presupuesto
FROM EMPLEADOS INNER JOIN DEPARTAMENTOS
ON EMPLEADOS.Departamento = DEPARTAMENTOS.Codigo;
SELECT E.Nombre, Apellidos, D.Nombre, Presupuesto
FROM EMPLEADOS E INNER JOIN DEPARTAMENTOS D
ON E.Departamento = D.Codigo;
SELECT EMPLEADOS.Nombre, Apellidos
FROM EMPLEADOS INNER JOIN DEPARTAMENTOS
ON EMPLEADOS.Departamento = DEPARTAMENTOS.Codigo
AND DEPARTAMENTOS.Presupuesto > 60000;
SELECT Nombre, Apellidos FROM EMPLEADOS
WHERE Departamento IN
(SELECT Codigo FROM DEPARTAMENTOS WHERE Presupuesto > 60000);
SELECT *
FROM DEPARTAMENTOS
WHERE Presupuesto >
(
SELECT AVG(Presupuesto)
FROM DEPARTAMENTOS
);
SELECT Nombre FROM DEPARTAMENTOS
WHERE Codigo IN
(
SELECT Departamento
FROM EMPLEADOS
GROUP BY Departamento
HAVING COUNT(*) > 2
);
SELECT DEPARTAMENTOS.Nombre
FROM EMPLEADOS INNER JOIN DEPARTAMENTOS
ON Departamento = Codigo
GROUP BY DEPARTAMENTOS.Nombre
HAVING COUNT(*) > 2;
UPDATE DEPARTAMENTOS SET Presupuesto = Presupuesto * 0.9;
UPDATE EMPLEADOS SET Departamento = 14 WHERE Departamento = 77;
DELETE FROM EMPLEADOS
WHERE Departamento = 14;
DELETE FROM EMPLEADOS
WHERE Departamento IN
(
SELECT Codigo FROM DEPARTAMENTOS
WHERE Presupuesto >= 60000
);
DELETE FROM EMPLEADOS;
Hago una pausa cuando tocamos la eliminación de registros. Según mi criterio, jamás debemos eliminar los registros de forma permanente (personas, productos, etc.).
Para esto, en nuestra tabla debemos añadir un campo denominado «estado» que especifique dos valores, por ejemplo, ‘1’ para activo y ‘0’ para eliminado.
Y al momento de «eliminar un registro», debemos hacer simplemente un UPDATE
cambiando el estado. Cuando se listen los productos o personas, deberemos añadir a la consulta AND estado = '1'
(o 'Activo'
, según el valor definido).
Esto permite conservar todos los registros históricos, una práctica común y recomendada en muchas empresas para auditoría y recuperación de datos.