Creación de bases de datos con SQL, ejercicio propuesto y resuelto, con código

Consideremos la Base de Datos (BD) EMPLEADOS que contiene información correspondiente a una sencilla aplicación de procedimientos de pedidos para una pequeña empresa de distribución. Consta de 5 tablas:

CLIENTES: Contiene una fila por cada uno de los clientes de la empresa. Sus campos son NUMCLIE (numero de cliente), EMPRESA, REPCLIENTE (numero de empleado del representante que atiende al cliente) y LIMCREDITO (limite de crédito).

REPVENTAS: Que contiene una fila por cada uno de los 10 vendedores de la empresa. Sus campos son NUMEMPL (numero de empleado), NOMBRE, EDAD, OFICINAREP (numero de oficina de representación del vendedor), TITULO, CONTRATO, DIRECTOR, CUOTA (ventas previstas) y VENTAS (ventas realizadas).

OFICINAS: Que contiene una fila por cada una de las 5 oficinas en las que trabajan los vendedores. Sus campos son OFICINA (numero de oficina), CIUDAD, REGION, DIR (numero del empleado del director), OBJETIVO (ventas anuales previstas) y VENTAS (ventas anuales realizadas).

PRODUCTOS: Que contiene una fila por cada uno de los productos disponibles para su venta. Sus campos son IDEFAB (identificador del fabricante), IDPRODUCTO (identificador del producto), DESCRIPCION, PRECIO, EXISTENCIA.

PEDIDOS: Que contiene una fila por cada pedido ordenado por un cliente. Por simplicidad se supone que cada pedido se refiere a un solo producto. Sus campos son NUMPEDIDO (numero de pedido), FECHAPEDIDO (fecha del pedido), CLIE (numero de cliente), REP (numero de empleado del representante), FAB (identificador del fabricante), PROUCTO (identificador de producto), CANT (cantidad) e IMPORTE.

A primera vista tanto la columna OFICINA como la columna CIUDAD podrían servir como clave primaria para la tabla, pero si la empresa se amplia y abre 2 oficinas de venta en la misma ciudad, la columna ciudad ya no podría servir como clave primaria. En la práctica “numero de ID” tales como el numero de la oficina, el número de empleados y los números de clientes se eligen con frecuencia como clave primaria.

La tabla PRODUCTOS es un ejemplo donde la clave primaria debe ser una combinación de columnas. La columna ID_FAB identifica al fabricante en la tabla y la columna ID_PRODUCTO identifica el número de producto del fabricante. La columna ID_PRODUCTO podría ser buena clave primaria, pero no hay nada que impida que dos fabricantes diferentes utilicen el mismo número para sus productos, por lo tanto debe utilizarse una combinación de las columnas ID_FAB e ID_PRODUCTO

Claves foráneas

En nuestra BD la columna OFICINA_REP es una clave foránea para la tabla OFICINA. Aunque es una columna en la tabla REPVENTAS, los valores que esta columna contiene son número de oficina. Coinciden con los valores de la columna OFICINA, que es la clave primaria para la tabla OFICINA. Juntas una clave primaria y una foránea crean una relación padre/hijo. Por la misma razón la columna DIR de la tabla OFICINA es una clave foránea para la tabla REPVENTAS, ya que los valores que esta columna contiene son número de empleados que coinciden con valores de la columna NUM_EMPL que es clave primaria en la tabla REPVENTAS. En idéntica situación está la columna REP_CLIE de la tabla CIENTES que también es una clave foránea para la tabla RPVENTAS, ya que los valores que esta columna contiene son números de empleados que coinciden con valores de la columna NUM_EMPL.

Una tabla puede contener más de una clave foránea si está relacionada con más de una tabla adicional. En nuestra BD podemos definir 3 claves foráneas en la tabla PEDIDOS.

Columna CLIE es una clave foránea para la tabla CIENTES, que relacionada cada pedido con el cliente que la remitió.

Columna REP es una clave foránea para la tabla REPVENTAS que relaciona cada pedido con el vendedor que la tomo

Las columnas FAB y PRODUCTO juntas son claves foráneas compuestas para la tabla PRODUCTOS, que relaciona cada pedido con el producto solicitado.

Descargar Codigo SQL

Introducción de registros en las tablas con SQL

En caso de nuevas filas de datos a tablas ya existentes la sentencia básica es INSERT. La sentencia INSERT agrega una o más filas nuevas a una tabla. Tratada de forma simplificada la sentencia INSERT tiene la siguiente forma:

INSERT [ LOW_ PRIORITY | DELAYED ] [ INGNORE ] [ INTO ] nombre_tabla
[ ( lista_columnas ) ] VALUES ( valores_de_datos )

lista_columnas es una lista separada por comas “,” de los nombres de las tablas que se pueden utilizar para especificar las columnas para la que se suministran los datos. Si no se especifica lista_columnas, todas las columnas de las tabas reciben datos. Si lista_columna no enumero toda las columnas de la tabla, se inserta NULL en las colunmas que no estén en la lista. Todas las columnas no citadas en la lista de columnas deben permitir valores NULL o tener un campo predeterminado asignado. Los valores_de_datos deben corresponder con la lista de columnas. El numero de valores de datos debe ser el mismo que el numero de columnas y el tipo de datos, precisión y escala de cada valor de dato debe coincidir con los de la columna correspondiente. Si lista_columna no se especifica la sintaxis completa es:

INSERT [ LOW_PRIORITY | DELAYED ] [ INGNORE ] [ INTO ] nombre_tabla
VALUES ( valores_de_datos )

LOW_PRIORITY hace q INSERT espere a que ningún cliente este leyendo la tabla. DELAYED hace que las filas se sitúen en una cola para insertarlas posteriormente. INGNORE evita que se dupliquen valores de claves únicas sin error.

Como ejemplo completo de construcción de tablas de una base de datos e inserción de sus registros, se presenta a continuación la sintaxis SQL completa para crear la base de datos EDUCA. El diseño completo de las relaciones existentes entre tablas y las restricciones de integridad son el corazón de una base de datos.

Codigo SQL del diagrama anterior.

Fuente: MySQL para Windows y Linux 2a edición.
Autor: César Pérez.
Edit.: Alafaomega Ra-Ma.

Creacion de tablas mediante SQL de MySQL

Las tablas son las estructuras de datos básicas en cualquier base de datos relacional. Una tabla es una colección organizada de registros (o filas), todas ellas con los mismos atributos (columnas o campos). Las columnas de la tabla describen la estructura de la misma y las restricciones de integridad describen los datos que son validos dentro de la misma. La sentencia SQL para la creación de tablas en MySQL es CREATE TABLE que tiene la siguiente sintaxis básica:

CREATE [TEMPORARY] TABLE [IF NO EXISTS] nombre_tabla
( definición de columnas,…)
[ opciones de tabla ]
[ [IGNORE | REPLACE] ] sentencia de selección.

La parte de la sentencia CREATE TABLE definición de columnas tiene la siguiente sintaxis:

{ nombrer_columna tipo_de_datos
[ NOT NULL | NULL ] [DEFAULT valor_predeterminado ]
[ AUTO_INCREMENT ] [ PRIMARY KEY ] [ referencia ]
PRIMARY KEY ( columna_indice )
KEY [ nombre_indice ] (columna_indice )
INDEX [ nombre_indice ] (columna_indice )
UNIQUE [ INDEX ] [ nombre_indice ] (columna_indice )
[ CONSTRAINT nombre ] FOREING KEY [ nombre_indice ] (columna_indice ) [ referencia ]
CHECK ( expresión) }

La parte de la sentencia CREATE TABLE referencia tiene la siguiente sintaxis:

REFERENCES nombre_tabla [ ( columnas_indice) ]
[ ON DELETE {RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT } ]
[ ON UPDATE {RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT } ]
[ MATCH FULL | MATCH PARTIAL

TEMPORARY indica que la tabla que se crea solamente existe hasta que finalice la conexión del índice actual. IF NOT EXISTS provoca que no se cree la tabla si existe otra con el mismo nombre y que no haya errores.

NULL | NOT NULL son palabras claves que determinan si se permiten o no valores nulos (NULL) en la columna. NULL no es estrictamente una restricción, pero se puede especificar de la misma manera que NOT NULL. DEFAULT indica el valor predeterminado para la columna. AUTO_INCREMENT se usa solamente para columnas de tipo entero indica que su valor se incrementa en 1 y se va incrementando de unidad en unidad. PRIMARY KEY es una restricción que exige la integridad de entidad para una o varias columnas dadas a través de un índice único. Sólo se puede crear una restricción PRIMARY KEY por cada tabla. UNIQUE es una restricción que proporciona la integridad de entidad para una o varias columnas dadas a través de un índice único. Una tabla puede tener varias restricciones UNIQUE.

CONSTRAINT es una palabra clave opcional que indica el principio de la definición de una restricción PRIMARY KEY, NOT NULL, FOREING KEY o CHECK. Las restricciones son propiedades que exigen la integridad de los datos y pueden crear índices para la tabla y sus columnas. El argumento nombre es el nombre de una restricción. El nombre de la restricción debe ser único en la base de datos.

FOREING KEY …REFERENCES es una restricción que proporciona integridad referencial para los datos de la columna o columnas. Las restricciones FOREING KEY requieren que cada valor de la columna existe en la columna de referencia correspondiente de la tabla a la que se hace referencia. Las restricciones FOREING KEY pueden hacer referencia sólo a columnas que sean PRIMARY KEY o UNIQUE en la tabla de referencia o a columnas a las que se haga referencia en UNIQUE INDEX en la tabla de referencia. El argumento nombre_indice es el nombre de la restricción FOREING KEY, el argumento columna_indice es una columna o lista de columnas de la tabla actual a la que hace referencia la restricción FOREING KEY. El argumento nombre_tabla es el nombre de la tabla externa a la que hace referencia la restricción FOREING KEY y el argumento columnas_indice es una columna o lista de columnas de la tabla externa a la que referencia la restricción FOREING KEY. INDEX y KEY son sinónimos y establecen índices que pueden contener valores duplicados de modo que el índice se basa en las columnas citadas en columnas_indice y cada una de ellas debe ser una columna de nombre_tabla.

ON DELETE { CASCADE | NO ACTION } especificada que acción tiene lugar en una fila de la tabla creada, si esa fila tiene una relación referencial y la fila a la que hace referencia se elimina de la tabla primaria. El valor determinado es NO ACTION. Si se especifica CASCADE y se elimina una fila de la tabla primaria, también se elimina la fila de la tabla desde donde se hace referencia. Si se especifica NO ACTION, SQL Server genera un error y se deshace la acción de eliminación en la tabla primaria.

ON UPDATE { CASCADE | NO ACTION } especifica que acción tiene lugar en una fila de la tabla creada; si esa fila tiene una relación referencial y la fila a la que se hace referencia se actualiza en la tabla primaria. El valor predeterminado es NO ACTION. Si se especifica CASCADE la fila se actualiza en la tabla de referencia si esa fila se actualiza en la tabla primaria. Si se especifica NO ACTION SQL Server genera un error y se deshace la acción de actualización en la fila de la tabla primaria. CHECK es una restricción que exige la integridad del dominio al limitar los valores posibles que se pueden escribir en una o varias columnas.

Fuente: MySQL para Windows y Linux 2a edición.
Autor: César Pérez.
Edit.: Alafaomega Ra-Ma.

Generar el XML de una tabla en SQL Server

1.- Primero creamos y accesamos a la BD:

CREATE DATABASE EJEMPLOXML2
USE EJEMPLOXML2

2.- Creamos nuetras respectivas tablas en este caso yo usare solo 2:

CREATE TABLE TABLA1(NUMERO NVARCHAR (10) PRIMARY KEY NOT NULL, NOMBRE NVARCHAR(20), AP_PAT NVARCHAR(20), AP_MAT NVARCHAR(20))
CREATE TABLE TABLA2(NUMERO2 NVARCHAR (10) PRIMARY KEY NOT NULL, NOMBRE2 NVARCHAR(20), AP_PAT2 NVARCHAR(20), AP_MAT2 NVARCHAR(20))

3.- Insertamos unos cuantos registros en las tablas.

4.- Con la siguiente instruccion generamos atumaticamente el XML de la tabla:

SELECT *FROM TABLA1 FOR XML AUTO

Como vemos, no tenemos un nodo raíz, en este caso se usa como nodo el nombre de la tabla y como atributos los campos de dicha tabla, el resultado seria el siguiente.
xml

Con la siguiente instruccion lo que hacemos es poner un espacio de nombre.
WITH XMLNAMESPACES (DEFAULT ‘https://linuxwall32.wordpress.com/’)

Con SELECT TOP elegimos el numero maximo de registros que queremos visualizar.

NOMBRE, AP_PAT, AP_MAT FROM son los campos de nuestra tabla que se visualizaran en el subnodo item, por ultimo generamos el XML y ponemos como nodo raíz TABLA1

Quedandonos el codigo completo así:
WITH XMLNAMESPACES (DEFAULT ‘https://linuxwall32.wordpress.com/’)
SELECT TOP 5 NUMERO, NOMBRE, AP_PAT, AP_MAT FROM TABLA1 as item FOR XML AUTO, ROOT (‘TABLA1’), ELEMENTS

El resultado seria el siguiente:
xml2