bloque1:sql
Diferencias
Muestra las diferencias entre dos versiones de la página.
Ambos lados, revisión anteriorRevisión previaPróxima revisión | Revisión previa | ||
bloque1:sql [2021/10/21 22:36] – [Base de Datos de prueba] fernando | bloque1:sql [2024/09/16 15:37] (actual) – editor externo 127.0.0.1 | ||
---|---|---|---|
Línea 10: | Línea 10: | ||
Es la sentencia utilizada para la creación de un objeto (base de datos, tabla, usuario, vista, procedimiento, | Es la sentencia utilizada para la creación de un objeto (base de datos, tabla, usuario, vista, procedimiento, | ||
+ | |||
+ | Para crear una Base de Datos: | ||
+ | <code sql> | ||
+ | CREATE DATABASE [IF NOT EXISTS] < | ||
+ | </ | ||
La sintaxis para la creación de una tabla es la siguiente: | La sintaxis para la creación de una tabla es la siguiente: | ||
Línea 18: | Línea 23: | ||
< | < | ||
| | ||
+ | ) | ||
+ | |||
+ | -- Ejemplo | ||
+ | CREATE TABLE asignaturas( | ||
+ | id INT PRIMARY KEY, | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
); | ); | ||
- | </ | ||
- | Y para crear una Base de Datos: | ||
- | <code sql> | ||
- | CREATE DATABASE [IF NOT EXISTS] < | ||
- | </ | ||
+ | |||
+ | </ | ||
==== Eliminar un objeto: DROP ==== | ==== Eliminar un objeto: DROP ==== | ||
Línea 49: | Línea 60: | ||
[ DROP COLUMN < | [ DROP COLUMN < | ||
[ ADD CONSTRAINT < | [ ADD CONSTRAINT < | ||
+ | </ | ||
+ | |||
+ | |||
+ | Ejemplos: | ||
+ | <code sql> | ||
+ | ALTER TABLE alumnos ADD PRIMARY KEY(id); | ||
+ | ALTER TABLE alumnos DROP PRIMARY KEY; | ||
+ | ALTER TABLE alumnos ADD FOREIGN KEY (id_curso) REFERENCES cursos(id); | ||
+ | ALTER TABLE alumnos DROP COLUMN nombre; | ||
+ | ALTER TABLE alumnos MODIFY nombre VARCHAR(30) NOT NULL; | ||
</ | </ | ||
Línea 93: | Línea 114: | ||
=== Tipos numéricos === | === Tipos numéricos === | ||
- | Para la representación de tipos de datos numéricos. Los tipos más utilizados son '' | + | Para la representación de tipos de datos numéricos. Los tipos más utilizados son '' |
| | ||
En ocasiones el rango de los valores negativos resultará prescindible (claves numéricas, valores de dinero, cantidades, . . .) por lo que será posible ampliar el rango positivo de un tipo numérico añadiendo la restricción '' | En ocasiones el rango de los valores negativos resultará prescindible (claves numéricas, valores de dinero, cantidades, . . .) por lo que será posible ampliar el rango positivo de un tipo numérico añadiendo la restricción '' | ||
Línea 113: | Línea 134: | ||
Permite almacenar valores lógicos Verdadero/ | Permite almacenar valores lógicos Verdadero/ | ||
- | === Restricciones === | + | ==== Restricciones |
Las restricciones se pueden establecer, o no, a las columnas de cada tabla para forzar a que los datos almacenados | Las restricciones se pueden establecer, o no, a las columnas de cada tabla para forzar a que los datos almacenados | ||
- | en ellas cumplan una serie de condiciones, | + | en ellas cumplan una serie de condiciones, |
- | Hay que tener en cuenta que, por lo general, las restricciones se definen en línea con la definición del campo (tal y como se muestra en la sintaxis de la sentencia de '' | + | Hay que tener en cuenta que, por lo general, las restricciones se definen en línea con la definición del campo (tal y como se muestra en la sintaxis de la sentencia de '' |
- | == Clave primaria == | + | === Clave primaria |
Una clave primaria dentro de una tabla, es una columna o conjunto de columnas cuyo valor identifica | Una clave primaria dentro de una tabla, es una columna o conjunto de columnas cuyo valor identifica | ||
Línea 126: | Línea 147: | ||
Para definir una clave primaria utilizamos la restricción '' | Para definir una clave primaria utilizamos la restricción '' | ||
<code sql> | <code sql> | ||
- | dni VARCHAR(9) PRIMARY KEY | + | CREATE TABLE personas( |
+ | dni VARCHAR(9) PRIMARY KEY, | ||
+ | ... | ||
+ | ); | ||
</ | </ | ||
Y si lo hacemos al final de la definición de las columnas, quedaría así: | Y si lo hacemos al final de la definición de las columnas, quedaría así: | ||
<code sql> | <code sql> | ||
- | PRIMARY KEY (dni) | + | CREATE TABLE personas( |
+ | dni VARCHAR(9), | ||
+ | | ||
+ | PRIMARY KEY (dni) | ||
+ | ); | ||
+ | |||
</ | </ | ||
Hay que tener en cuenta que a la hora de definir claves primarias compuestas (la componen 2 ó más campos de la tabla), ésta deberá ser definida forzosamente tras la definición de los campos involucrados, | Hay que tener en cuenta que a la hora de definir claves primarias compuestas (la componen 2 ó más campos de la tabla), ésta deberá ser definida forzosamente tras la definición de los campos involucrados, | ||
<code sql> | <code sql> | ||
- | PRIMARY KEY (nombre, apellidos) | + | CREATE TABLE personas( |
+ | dni VARCHAR(9), | ||
+ | | ||
+ | | ||
+ | PRIMARY KEY (nombre, apellidos) | ||
+ | ); | ||
</ | </ | ||
- | == Autonumérico == | + | === Autonumérico |
Especialmente útil en el caso de aquellas columnas que se definan como claves primarias de cada tabla, resulta añadir la restricción de campo autonumérico, | Especialmente útil en el caso de aquellas columnas que se definan como claves primarias de cada tabla, resulta añadir la restricción de campo autonumérico, | ||
Línea 144: | Línea 179: | ||
La forma de definirlo es añadiendo la restricción '' | La forma de definirlo es añadiendo la restricción '' | ||
<code sql> | <code sql> | ||
- | id INT UNSIGNED | + | id INT PRIMARY KEY AUTO_INCREMENT |
</ | </ | ||
- | == Clave ajena == | + | === Clave ajena === |
- | Una clave ajena está formada por una o varias columnas que hacen referencia a una clave primaria de otra o de la misma tabla. Se pueden definir tantas claves ajenas como sea necesario (no hay límite). El valor de la columna o columnas que son clave ajena será NULL, o bien el valor de la clave primaria de la tabla a la que hacen referencia (integridad referencial). Así, a la hora de definir una clave ajena, deberemos indicar con la cláusula '' | + | Una clave ajena está formada por una o varias columnas que hacen referencia a una clave primaria de otra o de la misma tabla. Se pueden definir tantas claves ajenas como sea necesario (no hay límite) |
- | Habrá que tener en cuenta que mientras que un campo definido como clave ajena haga referencia a un campo definido como clave primaria, la columna de la segunda tabla no podrá ser eliminada hasta que no lo haga la columna que le hace referencia (integridad referencial). Para evitar estos problemas (aunque no siempre es un problema) es posible | + | Las claves ajenas se deben definir |
- | * **RESTRICT**: | + | |
- | * **CASCADE**: | + | |
- | * **SET NULL**: Realiza la operación y fija a '' | + | |
- | * **NO ACTION**: Se rechaza la operación de eliminación/ | + | |
- | A continuación, | ||
<code sql> | <code sql> | ||
- | FOREIGN | + | CREATE TABLE asignaturas( |
- | FOREIGN KEY (id_curso) REFERENCES cursos (id) ON DELETE CASCADE | + | id INT PRIMARY |
+ | | ||
+ | | ||
+ | id_curso INT, | ||
+ | |||
+ | FOREIGN KEY (id_curso) REFERENCES cursos (id) | ||
+ | ); | ||
</ | </ | ||
- | Como ocurre con las claves primarias, si las claves ajenas son compuestas, se definen forzosamente al final de las definiciones de las columnas de la tabla, de la siguiente | + | |
+ | El ejemplo anterior haría referencia a una definición | ||
<code sql> | <code sql> | ||
- | FOREIGN KEY (id_curso, id_aula) REFERENCES | + | CREATE TABLE cursos( |
- | FOREIGN | + | id INT PRIMARY |
+ | | ||
+ | . . . | ||
+ | ); | ||
</ | </ | ||
- | En cualquiera de los casos hay que tener en cuenta que habrá que definir primero el campo con el tipo de dato correcto (el mismo que dicho campo en la tabla donde aparece como clave principal) y luego la propia definición de dicho campo como clave ajena. | + | Si una tabla tiene diferentes claves ajenas, se definen del mismo modo: |
+ | <code sql> | ||
- | == Definir claves ajenas en MySQL == | + | |
- | + | id_profesor INT, | |
- | Para definir claves ajenas en MySQL habrá que tener en cuenta algunas consideraciones: | + | |
+ | | ||
+ | | ||
+ | </ | ||
- | * La columna deberá ser del mismo tipo (y atributos) | + | En caso que la clave ajena haga referencia |
- | * La columna deberá ser un índice | + | |
- | * Si la columna se define como obligatoria ('' | + | |
- | * Ambas tablas (la referenciada y la que hace referencia) deberán ser de tipo InnoDB. A partir de la versión 5.5 de MySQL es el motor de almacenamiento por defecto para cualquier tabla. En caso contrario es necesario indicar lo siguiente al final de la creación de la tabla: | + | |
<code sql> | <code sql> | ||
- | CREATE TABLE tabla ( | + | FOREIGN KEY (id_curso, id_aula) REFERENCES cursos(id_curso, |
- | . . . | + | |
- | . . . | + | |
- | ) ENGINE = Innodb; | + | |
</ | </ | ||
- | Así, normalmente, | + | En cualquiera de los casos hay que tener en cuenta que habrá que definir primero el campo con el tipo de dato correcto (el mismo que dicho campo en la tabla donde aparece como clave principal) y luego la propia definición de dicho campo como clave ajena. |
- | <code sql> | + | Habrá que tener en cuenta que mientras que un campo definido como clave ajena haga referencia a un campo definido como clave primaria, la columna de la segunda tabla no podrá ser eliminada hasta que no lo haga la columna que le hace referencia |
- | id_cliente INT UNSIGNED, | + | |
- | INDEX (id_cliente), | + | |
- | FOREIGN KEY (id_cliente) | + | |
- | | + | * **SET NULL**: Realiza la operación y fija a '' |
- | | + | * **NO ACTION**: Se rechaza la operación de eliminación/actualización, |
- | </code> | + | |
- | En el caso anterior suponemos que la clave primaria a la cual se hace referencia está definida como sigue: | + | Si no especifico ningun tipo de acción, |
<code sql> | <code sql> | ||
- | CREATE TABLE Clientes ( | + | -- No podré eliminar cursos si hay asignaturas referenciandolos: |
- | id INT UNSIGNED PRIMARY | + | FOREIGN |
- | . . . | + | |
- | ); | + | -- Si modifico el valor de la clave primaria de un curso, se actualiza la clave ajena |
+ | -- Si elimino un curso, se pondrá a NULL el valor de la clave ajena de las asignaturas | ||
+ | FOREIGN KEY (id_curso) REFERENCES cursos (id) ON UPDATE CASCADE ON DELETE SET NULL | ||
</ | </ | ||
- | Actualmente, | + | == Consideraciones == |
- | <code sql> | + | Para definir claves ajenas en MySQL habrá que tener en cuenta algunas consideraciones: |
- | id_cliente INT UNSIGNED, | + | |
- | FOREIGN KEY (id_cliente) | + | * Una columna clave ajena nunca podrá ser '' |
- | | + | * La columna deberá ser del mismo tipo (y atributos) que la columna a la que se referencia. |
- | | + | |
- | </ | + | |
- | == Campos obligatorios == | + | === Campos obligatorios |
Esta restricción obliga a que se le tenga que dar valor obligatoriamente a una columna. Por tanto, no podrá | Esta restricción obliga a que se le tenga que dar valor obligatoriamente a una columna. Por tanto, no podrá | ||
Línea 221: | Línea 261: | ||
</ | </ | ||
- | == Valores por defecto == | + | === Valores por defecto |
Se puede definir el valor que una columna tomará por defecto, es decir, si al introducir una fila no se especifica valor para dicha columna. Se utiliza la palabra reservada '' | Se puede definir el valor que una columna tomará por defecto, es decir, si al introducir una fila no se especifica valor para dicha columna. Se utiliza la palabra reservada '' | ||
Línea 230: | Línea 270: | ||
</ | </ | ||
- | == Condiciones == | + | === Condiciones |
De forma más genérica, podemos forzar a que los valores de determinados campos de la tabla cumplan una ciertas condiciones. En caso contrario no se permitirá la inserción de esa fila en dicha tabla. | De forma más genérica, podemos forzar a que los valores de determinados campos de la tabla cumplan una ciertas condiciones. En caso contrario no se permitirá la inserción de esa fila en dicha tabla. | ||
- | <code sql> | + | Lo habitual es definir una columna como de tipo enumeración ('' |
- | nombre VARCHAR(250) CHECK (nombre = UPPER(nombre)) | + | |
- | edad INT CHECK (edad > 0) | + | |
- | curso INT CHECK (curso BETWEEN 1 AND 2) | + | |
- | </ | + | |
- | + | ||
- | Hay que tener en cuenta que en MySQL está restricción no tiene ningún efecto y lo habitual es definir una columna como de tipo enumeración ('' | + | |
<code sql> | <code sql> | ||
Línea 247: | Línea 281: | ||
</ | </ | ||
- | == Valores únicos == | + | === Valores únicos |
- | La restricción '' | + | La restricción '' |
<code sql> | <code sql> | ||
email VARCHAR(100) UNIQUE | email VARCHAR(100) UNIQUE | ||
</ | </ | ||
+ | |||
==== Creación de scripts en MySQL ==== | ==== Creación de scripts en MySQL ==== | ||
Línea 338: | Línea 373: | ||
pistas_cerradas (# | pistas_cerradas (# | ||
polideportivos (#id, nombre, direccion, ciudad, extension) | polideportivos (#id, nombre, direccion, ciudad, extension) | ||
+ | servicios_polideportivo(# | ||
reservas (#id, fecha_reserva, | reservas (#id, fecha_reserva, | ||
usuarios (#id, dni, nombre, apellidos, email, ciudad, fecha_nacimiento, | usuarios (#id, dni, nombre, apellidos, email, ciudad, fecha_nacimiento, | ||
Línea 478: | Línea 514: | ||
+ | ==== Generar Datos de Prueba ==== | ||
+ | Para poder trabajar con una base de datos es necesario que esta contenga datos, cuanta más cantidad mejor. Para ello necesitamos hacer muchas inserciones (INSERT INTO) en cada una de las tablas de la base de datos. | ||
+ | Existen programas que tienen sus propias bases de datos con datos de ejemplo y nos permiten generar datos adaptados a los campos de nuestras tablas. En la sección [[extra: | ||
+ | |||
+ | |||
+ | {{ vimeo> | ||
+ | > Generadores de datos | ||
===== Consulta de registros ===== | ===== Consulta de registros ===== | ||
Línea 732: | Línea 775: | ||
{{ youtube> | {{ youtube> | ||
\\ | \\ | ||
+ | |||
+ | === Operadores Aritméticos === | ||
+ | Por otra parte, también tenemos los operadores aritméticos habituales de los lenguajes de programación: | ||
+ | |||
+ | ^Operador^Operación^ | ||
+ | |+|Suma| | ||
+ | |-|Resta| | ||
+ | |*|Producto| | ||
+ | |/ | ||
+ | |div|División entera| | ||
+ | |mod ó %| Módulo: resto entero de división.| | ||
+ | |||
+ | <code sql> | ||
+ | -- Calcula el 10% de las ganancias por reservas del año pasado | ||
+ | SELECT (SUM(precio) * 0.1) AS ' | ||
+ | FROM reservas | ||
+ | WHERE YEAR(fecha_reserva) = YEAR(CURDATE()) - 1; | ||
+ | </ | ||
==== Funciones agregadas ==== | ==== Funciones agregadas ==== | ||
Línea 789: | Línea 850: | ||
-- Código y tipo de la pista más barata | -- Código y tipo de la pista más barata | ||
SELECT codigo, tipo | SELECT codigo, tipo | ||
- | FROM tipo | + | FROM pistas |
WHERE precio = (SELECT MIN(precio) FROM pistas); | WHERE precio = (SELECT MIN(precio) FROM pistas); | ||
Línea 1192: | Línea 1253: | ||
-> 1998 | -> 1998 | ||
</ | </ | ||
- | |||
- | ===== Cliente MySQL WorkBench ===== | ||
- | |||
- | ==== Mostrar Diagrama Relacional ==== | ||
- | Si queremos mostrar el diagrama relacional de una base de datos una vez que ya tenemos la estructura física de la misma creada (tablas), necesitamos realizar un proceso llamado " | ||
- | |||
- | - Pestaña // | ||
- | - Aceptar los parémetros de conextion | ||
- | - Seleccionar la bbdd de la que deseamos realizar la ingeniería inversa | ||
- | - Aceptar los siguiente pasos | ||
- | |||
- | ==== Exportar script de bbdd ==== | ||
- | Para exportar scripts con bases de datos //Mysql// o //Mariadb// incluyen la herramienta // | ||
- | |||
- | Desde la sección de sección // | ||
- | |||
- | En la siguiente ventana debemos indicar varias cosas: | ||
- | |||
- | {{ : | ||
- | |||
- | * //Dump Structura and Data//: exportar la estructura y los datos contenidos. | ||
- | * //Dump Stores Procedures...//, | ||
- | * //Export to Self-Contained File//: Para exportar toda la base de datos en un solo fichero (podemos dar nombre al fichero). En caso contratio creará un fichero por cada tabla. | ||
- | * //Include Create Schema//: incluye las instrucciones '' | ||
- | |||
- | |||
- | *Si utilizamos la versión **MySql WorkBench 8 o posterior**, | ||
- | |||
- | - Pestaña '' | ||
- | - Sección '' | ||
- | - Campo '' | ||
- | |||
- | {{ : | ||
---- | ---- | ||
(c) {{date> %Y}} Santiago Faci y Fernando Valdeón | (c) {{date> %Y}} Santiago Faci y Fernando Valdeón |
bloque1/sql.1634855778.txt.gz · Última modificación: 2024/09/16 15:38 (editor externo)