7 Lenguaje SQL Creación de bases de datos y tablas

13
7 Lenguaje SQL Creación de bases de datos y tablas ^ A nivel teórico, existen dos lenguajes para el manejo de bases de datos: DDL (Data Definition Language) Lenguaje de definición de datos. Es el lenguaje que se usa para crear bases de datos y tablas, y para modificar sus estructuras, así como los permisos y privilegios. Este lenguaje trabaja sobre unas tablas especiales llamadas diccionario de datos. DML (Data Manipilation Language) lenguaje de manipulación de datos. Es el que se usa para modificar y obtener datos desde las bases de datos. SQL engloba ambos lenguajes DDL+DML, y los estudiaremos juntos, ya que ambos forman parte del conjunto de sentencias de SQL. En este capítulo vamos a explicar el proceso para pasar del modelo lógico relacional, en forma de esquemas de relaciones, al modelo físico, usando sentencias SQL, y viendo las peculiaridades específicas de MySQL. Crear una base de datos ^ Cada conjunto de relaciones que componen un modelo completo forma una base de datos. Desde el punto de vista de SQL, una base de datos es sólo un conjunto de relaciones (o tablas), y para organizarlas o distinguirlas se accede a ellas mediante su nombre. A nivel de sistema operativo, cada base de datos se guarda en un directorio diferente. Debido a esto, crear una base de datos es una tarea muy simple. Claro que, en el momento de crearla, la base de datos estará vacía, es decir, no contendrá ninguna tabla. Vamos a crear y manipular nuestra propia base de datos, al tiempo que nos familiarizamos con la forma de trabajar de MySQL. Para empezar, crearemos una base de datos para nosotros solos, y la llamaremos "prueba". Para crear una base de datos se usa una sentencia CREATE DATABASE : mysql> CREATE DATABASE prueba; Query OK, 1 row affected (0.03 sec) mysql>

Transcript of 7 Lenguaje SQL Creación de bases de datos y tablas

Page 1: 7 Lenguaje SQL Creación de bases de datos y tablas

7 Lenguaje SQL Creación de bases de datos y tablas ^

A nivel teórico, existen dos lenguajes para el manejo de bases de datos:

DDL (Data Definition Language) Lenguaje de definición de datos. Es el lenguaje que se usa para crear bases de datos y tablas, y para modificar sus estructuras, así como los permisos y privilegios.

Este lenguaje trabaja sobre unas tablas especiales llamadas diccionario de datos.

DML (Data Manipilation Language) lenguaje de manipulación de datos. Es el que se usa para modificar y obtener datos desde las bases de datos.

SQL engloba ambos lenguajes DDL+DML, y los estudiaremos juntos, ya que ambos forman parte del conjunto de sentencias de SQL.

En este capítulo vamos a explicar el proceso para pasar del modelo lógico relacional, en forma de esquemas de relaciones, al modelo físico, usando sentencias SQL, y viendo las peculiaridades específicas de MySQL.

Crear una base de datos ^

Cada conjunto de relaciones que componen un modelo completo forma una base de datos. Desde el punto de vista de SQL, una base de datos es sólo un conjunto de relaciones (o tablas), y para organizarlas o distinguirlas se accede a ellas mediante su nombre. A nivel de sistema operativo, cada base de datos se guarda en un directorio diferente.

Debido a esto, crear una base de datos es una tarea muy simple. Claro que, en el momento de crearla, la base de datos estará vacía, es decir, no contendrá ninguna tabla.

Vamos a crear y manipular nuestra propia base de datos, al tiempo que nos familiarizamos con la forma de trabajar de MySQL.

Para empezar, crearemos una base de datos para nosotros solos, y la llamaremos "prueba". Para crear una base de datos se usa una sentencia CREATE DATABASE:

mysql> CREATE DATABASE prueba; Query OK, 1 row affected (0.03 sec) mysql>

Page 2: 7 Lenguaje SQL Creación de bases de datos y tablas

Podemos averiguar cuántas bases de datos existen en nuestro sistema usando la sentencia SHOW DATABASES:

mysql> SHOW DATABASES; +--------------------+ | Database | +--------------------+ | mysql | | prueba | | test | +--------------------+ 3 rows in set (0.00 sec) mysql>

A partir de ahora, en los próximos capítulos, trabajaremos con esta base de datos, por lo tanto la seleccionaremos como base de datos por defecto. Esto nos permitirá obviar el nombre de la base de datos en consultas. Para seleccionar una base de datos se usa el comando USE, que no es exactamente una sentencia SQL, sino más bien de una opción de MySQL:

mysql> USE prueba; Database changed mysql>

Crear una tabla ^

Veamos ahora la sentencia CREATE TABLE que sirve para crear tablas.

La sintaxis de esta sentencia es muy compleja, ya que existen muchas opciones y tenemos muchas posibilidades diferentes a la hora de crear una tabla. Las iremos viendo paso a paso, y en poco tiempo sabremos usar muchas de sus posibilidades.

En su forma más simple, la sentencia CREATE TABLE creará una tabla con las columnas que indiquemos. Crearemos, como ejemplo, una tabla que nos permitirá almacenar nombres de personas y sus fechas de nacimiento. Deberemos indicar el nombre de la tabla y los nombres y tipos de las columnas:

mysql> USE prueba Database changed mysql> CREATE TABLE gente (nombre VARCHAR(40), fecha DATE); Query OK, 0 rows affected (0.53 sec) mysql>

Hemos creado una tabla llamada "gente" con dos columnas: "nombre" que puede contener cadenas de hasta 40 caracteres y "fecha" de tipo fecha.

Page 3: 7 Lenguaje SQL Creación de bases de datos y tablas

Podemos consultar cuántas tablas y qué nombres tienen en una base de datos, usando la sentencia SHOW TABLES:

mysql> SHOW TABLES; +------------------+ | Tables_in_prueba | +------------------+ | gente | +------------------+ 1 row in set (0.01 sec) mysql>

Pero tenemos muchas más opciones a la hora de definir columnas. Además del tipo y el nombre, podemos definir valores por defecto, permitir o no que contengan valores nulos, crear una clave primaria, indexar...

La sintaxis para definir columnas es:

nombre_col tipo [NOT NULL | NULL] [DEFAULT valor_por_defecto] [AUTO_INCREMENT] [[PRIMARY] KEY] [COMMENT 'string'] [definición_referencia]

Veamos cada una de las opciones por separado.

Valores nulos

Al definir cada columna podemos decidir si podrá o no contener valores nulos.

Debemos recordar que, como vimos en los capítulos de modelado, aquellas columnas que son o forman parte de una clave primaria no pueden contener valores nulos.

Veremos que, si definimos una columna como clave primaria, automáticamente se impide que pueda contener valores nulos, pero este no es el único caso en que puede ser interesante impedir la asignación de valores nulos para una columna.

La opción por defecto es que se permitan valores nulos, NULL, y para que no se permitan, se usa NOT NULL. Por ejemplo:

mysql> CREATE TABLE ciudad1 (nombre CHAR(20) NOT NULL, poblacion INT NULL); Query OK, 0 rows affected (0.98 sec)

Valores por defecto

Para cada columna también se puede definir, opcionalmente, un valor por defecto. El valor por defecto se asignará de forma automática a una columna cuando no se especifique un valor determinado al añadir filas.

Page 4: 7 Lenguaje SQL Creación de bases de datos y tablas

Si una columna puede tener un valor nulo, y no se especifica un valor por defecto, se usará NULL como valor por defecto. En el ejemplo anterior, el valor por defecto para poblacion es NULL.

Por ejemplo, si queremos que el valor por defecto para poblacion sea 5000, podemos crear la tabla como:

mysql> CREATE TABLE ciudad2 (nombre CHAR(20) NOT NULL, -> poblacion INT NULL DEFAULT 5000); Query OK, 0 rows affected (0.09 sec)

Claves primarias

También se puede definir una clave primaria sobre una columna, usando la palabra clave KEY o PRIMARY KEY.

Sólo puede existir una clave primaria en cada tabla, y la columna sobre la que se define una clave primaria no puede tener valores NULL. Si esto no se especifica de forma explícita, MySQL lo hará de forma automática.

Por ejemplo, si queremos crear un índice en la columna nombre de la tabla de ciudades, crearemos la tabla así:

mysql> CREATE TABLE ciudad3 (nombre CHAR(20) NOT NULL PRIMARY KEY, -> poblacion INT NULL DEFAULT 5000); Query OK, 0 rows affected (0.20 sec)

Usar NOT NULL PRIMARY KEY equivale a PRIMARY KEY, NOT NULL KEY o sencillamente KEY. Personalmente, prefiero usar la primera forma o la segunda.

Existe una sintaxis alternativa para crear claves primarias, que en general es preferible, ya que es más potente. De hecho, la que hemos explicado es un alias para la forma general, que no admite todas las funciones (como por ejemplo, crear claves primarias sobre varias columnas). Veremos esta otra alternativa un poco más abajo.

Columnas autoincrementadas

En MySQL tenemos la posibilidad de crear una columna autoincrementada, aunque esta columna sólo puede ser de tipo entero.

Si al insertar una fila se omite el valor de la columna autoinrementada o si se inserta un valor nulo para esa columna, su valor se calcula automáticamente, tomando el valor más alto de esa columna y sumándole una unidad. Esto permite crear, de una forma sencilla, una columna con un valor único para cada fila de la tabla.

Generalmente, estas columnas se usan como claves primarias 'artificiales'. MySQL está optimizado para usar valores enteros como claves primarias, de modo que la combinación

Page 5: 7 Lenguaje SQL Creación de bases de datos y tablas

de clave primaria, que sea entera y autoincrementada es ideal para usarla como clave primaria artificial:

mysql> CREATE TABLE ciudad5 (clave INT AUTO_INCREMENT PRIMARY KEY, -> nombre CHAR(20) NOT NULL, -> poblacion INT NULL DEFAULT 5000); Query OK, 0 rows affected (0.11 sec) mysql>

Comentarios

Adicionalmente, al crear la tabla, podemos añadir un comentario a cada columna. Este comentario sirve como información adicional sobre alguna característica especial de la columna, y entra en el apartado de documentación de la base de datos:

mysql> CREATE TABLE ciudad6 -> (clave INT AUTO_INCREMENT PRIMARY KEY COMMENT 'Clave principal', -> nombre CHAR(50) NOT NULL, -> poblacion INT NULL DEFAULT 5000); Query OK, 0 rows affected (0.08 sec)

Ejemplo 1 ^ 

Veamos ahora como crear las bases de datos y tablas correspondientes a los ejemplos que vamos siguiendo desde el principio del curso.

Nuestro primer ejemplo tenía este esquema:

Estación(Identificador, Latitud, Longitud, Altitud) Muestra(IdentificadorEstacion, Fecha, Temperatura mínima, Temperatura máxima, Precipitaciones, Humedad mínima, Humedad máxima, Velocidad del viento mínima, Velocidad del viento máxima)

Y habíamos elegido los siguientes tipos para cada columna:

Columna  Tipo

Identificador  MEDIUMINT UNSIGNED

Page 6: 7 Lenguaje SQL Creación de bases de datos y tablas

Latitud  VARCHAR(14)

Longitud  VARCHAR(15)

Altitud  MEDIUMINT

IdentificadorEstacion  MEDIUMINT UNSIGNED

Fecha  DATE 

Temperatura mínima  TINYINT

Temperatura máxima  TINYINT

Precipitaciones  SMALLINT UNSIGNED

Humedad mínima  TINYINT UNSIGNED

Humedad máxima  TINYINT UNSIGNED

Velocidad del viento mínima  SMALLINT UNSIGNED

Velocidad del viento máxima  SMALLINT UNSIGNED

Primero crearemos una base de datos, a la que podemos llamar "meteo":

mysql> CREATE DATABASE meteo; Query OK, 1 row affected (0.02 sec)

Podemos situarnos en la base de datos, usando la USE o bien crear las tablas usando el nombre completo, es decir, mediante el prefijo "meteo.". Empecemos con la primera tabla:

mysql> USE meteo Database changed mysql> CREATE TABLE estacion ( -> identificador MEDIUMINT UNSIGNED NOT NULL, -> latitud VARCHAR(14) NOT NULL, -> longitud VARCHAR(15) NOT NULL, -> altitud MEDIUMINT NOT NULL, -> PRIMARY KEY (identificador) -> ) ENGINE=InnoDB; Query OK, 0 rows affected (0.30 sec)

Hemos creado una clave primaria, y como es obligatorio, hemos definido la columna 'indentificador' como NOT NULL. Usaremos tablas InnoDB ya que queremos que MySQL haga el control de las claves foráneas.

Page 7: 7 Lenguaje SQL Creación de bases de datos y tablas

Veamos ahora la segunda tabla:

mysql> CREATE TABLE muestra ( -> identificadorestacion MEDIUMINT UNSIGNED NOT NULL, -> fecha DATE NOT NULL, -> temperaturaminima TINYINT, -> temperaturamaxima TINYINT, -> precipitaciones SMALLINT UNSIGNED, -> humedadminima TINYINT UNSIGNED, -> humedadmaxima TINYINT UNSIGNED, -> velocidadminima SMALLINT UNSIGNED, -> velocidadmaxima SMALLINT UNSIGNED, -> KEY (identificadorestacion), -> FOREIGN KEY (identificadorestacion) -> REFERENCES estacion(identificador) -> ON DELETE NO ACTION -> ON UPDATE CASCADE -> ) ENGINE=InnoDB; Query OK, 0 rows affected (0.16 sec)

A falta de datos concretos en el enunciado sobre qué hacer con las muestras de estaciones si estas desaparecen, hemos optado por mantener el valor de la clave foránea. También hemos decidido modificar el identificador si se cambia en la tabla de estaciones.

Ejemplo 2 ^ 

El segundo ejemplo consiste en modelar una biblioteca. Este era el esquema:

Libro(ClaveLibro, Título, Idioma, Formato, ClaveEditorial) Tema(ClaveTema, Nombre) Autor(ClaveAutor, Nombre) Editorial(ClaveEditorial, Nombre, Dirección, Teléfono) Ejemplar(ClaveEjemplar, ClaveLibro, NúmeroOrden, Edición, Ubicación, Categoría) Socio(ClaveSocio, Nombre, Dirección, Teléfono, Categoría) Préstamo(ClaveSocio, ClaveEjemplar, NúmeroOrden, Fecha_préstamo, Fecha_devolución, Notas) Trata_sobre(ClaveLibro, ClaveTema) Escrito_por(ClaveLibro, ClaveAutor)

Y los tipos para las columnas:

Columna  Tipo 

ClaveLibro  INT 

Titulo  VARCHAR(60) 

Page 8: 7 Lenguaje SQL Creación de bases de datos y tablas

Idioma  VARCHAR(15) 

Formato  VARCHAR(15) 

ClaveTema  SMALLINT 

Nombre(tema)  VARCHAR(40) 

ClaveAutor  INT 

Nombre(autor)  VARCHAR(60) 

ClaveEditorial  SMALLINT 

Nombre(editorial)  VARCHAR(60) 

Direccion(editorial) VARCHAR(60) 

Telefono(editorial)  VARCHAR(15) 

ClaveEjemplar  INT 

NumeroOrden  SMALLINT 

Edicion  SMALLINT 

Ubicacion  VARCHAR(15) 

Categoria(libro)  CHAR 

ClaveSocio  INT 

Nombre(socio)  VARCHAR(60) 

Direccion(socio)  VARCHAR(60) 

Telefono(socio)  VARCHAR(15) 

Categoria(socio)  CHAR 

Fecha_prestamo  DATE 

Page 9: 7 Lenguaje SQL Creación de bases de datos y tablas

Fecha_devolucion  DATE 

Notas  BLOB 

Empecemos por crear la base de datos:

mysql> CREATE DATABASE biblio; Query OK, 1 row affected (0.16 sec) mysql>USE biblio Database changed mysql>

Ahora crearemos las tablas. Primero crearemos la tabla de editoriales, ya que su clave primaria se usa como clave foránea en la tabla de libros:

mysql> CREATE TABLE editorial ( -> claveeditorial SMALLINT NOT NULL, -> nombre VARCHAR(60), -> direccion VARCHAR(60), -> telefono VARCHAR(15), -> PRIMARY KEY (claveeditorial) -> ) ENGINE=InnoDB; Query OK, 0 rows affected (0.09 sec) mysql>

Ahora podemos crear la tabla de libros:

mysql> CREATE TABLE libro ( -> clavelibro INT NOT NULL, -> titulo VARCHAR(60), -> idioma VARCHAR(15), -> formato VARCHAR(15), -> claveeditorial SMALLINT, -> PRIMARY KEY (clavelibro), -> KEY(claveeditorial), -> FOREIGN KEY (claveeditorial) -> REFERENCES editorial(claveeditorial) -> ON DELETE SET NULL -> ON UPDATE CASCADE -> ) ENGINE=InnoDB; Query OK, 0 rows affected (0.11 sec) mysql>

Seguimos con las tablas de tema, autor:

mysql> CREATE TABLE tema ( -> clavetema SMALLINT NOT NULL, -> nombre VARCHAR(40),

Page 10: 7 Lenguaje SQL Creación de bases de datos y tablas

-> PRIMARY KEY (clavetema) -> ) ENGINE=InnoDB; Query OK, 0 rows affected (0.06 sec) mysql> CREATE TABLE autor ( -> claveautor INT NOT NULL, -> nombre VARCHAR(60), -> PRIMARY KEY (claveautor) -> ) ENGINE=InnoDB; Query OK, 0 rows affected (0.09 sec) mysql>

Seguimos con la tabla ejemplar, que recordemos que contiene entidades subordinadas de libro:

mysql> CREATE TABLE ejemplar ( -> claveejemplar INT NOT NULL, -> clavelibro INT NOT NULL, -> numeroorden SMALLINT NOT NULL, -> edicion SMALLINT, -> ubicacion VARCHAR(15), -> categoria CHAR, -> PRIMARY KEY (claveejemplar), -> FOREIGN KEY (clavelibro) -> REFERENCES libro(clavelibro) -> ON DELETE CASCADE -> ON UPDATE CASCADE -> ) ENGINE=InnoDB; Query OK, 0 rows affected (0.11 sec) mysql>

Seguimos con la tabla de socio:

mysql> CREATE TABLE socio ( -> clavesocio INT NOT NULL, -> nombre VARCHAR(60), -> direccion VARCHAR(60), -> telefono VARCHAR(15), -> categoria CHAR, -> PRIMARY KEY (clavesocio) -> ) ENGINE=InnoDB; Query OK, 0 rows affected (0.08 sec) mysql>

Ahora la tabla de prestamo:

mysql> CREATE TABLE prestamo ( -> clavesocio INT, -> claveejemplar INT, -> numeroorden SMALLINT, -> fecha_prestamo DATE NOT NULL, -> fecha_devolucion DATE DEFAULT NULL,

Page 11: 7 Lenguaje SQL Creación de bases de datos y tablas

-> notas BLOB, -> FOREIGN KEY (clavesocio) -> REFERENCES socio(clavesocio) -> ON DELETE SET NULL -> ON UPDATE CASCADE, -> FOREIGN KEY (claveejemplar) -> REFERENCES ejemplar(claveejemplar) -> ON DELETE SET NULL -> ON UPDATE CASCADE -> ) ENGINE=InnoDB; Query OK, 0 rows affected (0.16 sec) mysql>

Sólo nos quedan por crear las tablas trata_sobre y escrito_por:

mysql> CREATE TABLE trata_sobre ( -> clavelibro INT NOT NULL, -> clavetema SMALLINT NOT NULL, -> FOREIGN KEY (clavelibro) -> REFERENCES libro(clavelibro) -> ON DELETE CASCADE -> ON UPDATE CASCADE, -> FOREIGN KEY (clavetema) -> REFERENCES tema(clavetema) -> ON DELETE CASCADE -> ON UPDATE CASCADE -> ) ENGINE=InnoDB; Query OK, 0 rows affected (0.11 sec) mysql> CREATE TABLE escrito_por ( -> clavelibro INT NOT NULL, -> claveautor INT NOT NULL, -> FOREIGN KEY (clavelibro) -> REFERENCES libro(clavelibro) -> ON DELETE CASCADE -> ON UPDATE CASCADE, -> FOREIGN KEY (claveautor) -> REFERENCES autor(claveautor) -> ON DELETE CASCADE -> ON UPDATE CASCADE -> ) ENGINE=InnoDB; Query OK, 0 rows affected (0.13 sec) mysql>

Comentarios de los usuarios (4)

 

Juan 2012‐04‐22 20:41:18 

Page 12: 7 Lenguaje SQL Creación de bases de datos y tablas

mysql> CREATE TABLE prestamo (

-> clavesocio INT,

-> claveejemplar INT,

-> numeroorden SMALLINT,

-> fecha_prestamo DATE NOT NULL,

-> fecha_devolucion DATE DEFAULT NULL,

-> notas BLOB,

-> FOREIGN KEY (clavesocio)

-> REFERENCES socio(clavesocio)

-> ON DELETE SET NULL

-> ON UPDATE CASCADE,

-> FOREIGN KEY (clavelibro) <== debe ser claveejemplar

-> REFERENCES ejemplar(clavelibro)

-> ON DELETE SET NULL

-> ON UPDATE CASCADE

-> ) ENGINE=InnoDB;

Query OK, 0 rows affected (0.16 sec)

Otro fallo encontre, que no me iba y creo que fue por eso, lo pongo por si os sirve pa correjirlo

 

Juan 2012‐04‐22 21:10:36 

bueno tambien falta tabla autor

mysql> CREATE TABLE autor (

Page 13: 7 Lenguaje SQL Creación de bases de datos y tablas

-> claveautor INT PRIMARY KEY,

-> nombre VARCHAR(60))

-> ENGINE=INNODB;

Query OK, 0 rows affected (0.10 sec)

La ultima tabla no se creaba ya que la clave foranea no econtraba esa tabla, el resto funciona perfectamnte