29 enero, 2020

Creación de Tablas

DEFINICIÓN DE UNA TABLA

Una tabla es una colección de datos sobre una entidad (Persona, Lugar, Cosa) específica, que tiene un número discreto de atributos designados (por ejemplo, cantidad o tipo). Las tablas son los objetos principales de SQL Server y del modelo relacional en general.

En SQL Server una tabla suele denominarse tabla de base, para hacer énfasis sobre dónde se almacenan los datos. La utilización de << Tabla de base >>, también distingue la tabla de una vista (View), (una tabla virtual que es una consulta interna de una tabla base.).

Conforme se utiliza la base de datos con frecuencia se encontrará conveniente definir tablas propias para almacenar datos personales o datos extraídos de otras tablas.



CLAVE PRIMARIA Y CLAVE FORÁNEA

El principio fundamental del modelo relacional, es que cada fila de una tabla es en cierta medida exclusiva y puede distinguirse de alguna forma de cualquier otra fila de la tabla. La combinación de todas las columnas de una tabla puede utilizarse como un identificador exclusivo, pero en la práctica el identificador suele ser mucho como la combinación de unas pocas columnas y, a menudo, es simplemente una columna, a la cual se le denomina Primary Key o Clave Primaria


CLAVE PRIMARIA Y CLAVE FORÁNEA

Una Clave Foránea o Foreign Key es una o varias columnas de una tabla cuyos valores deben ser iguales a los de una restricción Primary Key en otra tabla. SQL Server impone de manera automática la integridad referencial mediante la utilización de Foreign Key y a esta característica se le denomina integridad referencial declarativa.


DEFINICIÓN DE RELACIONES

El término "relaciones" usualmente se refiere a las relaciones entre claves foráneas y primarias, y entre tablas. Estas relaciones deben ser definidas porque determinan qué columnas son o no claves primarias o claves foráneas. A continuación, veamos los tipos de relación que pueden existir entre las tablas:

Relación Uno-a-Varios:

La relación uno a varios (uno a muchos), es el tipo de relación más común. En este tipo de relación, una fila de la tabla A puede tener varias filas coincidentes en la tabla B, pero una fila de la tabla B sólo puede tener una fila coincidente en la tabla A. Por ejemplo, las tablas Editor y Libro tienen una relación uno a varios: cada editor produce muchos títulos, pero cada Libro procede de un único editor. Una relación de uno a varios sólo se crea si una de las columnas relacionadas es una clave principal o tiene una restricción única (una restricción única impide que el campo tenga valores repetidos). El lado de la clave principal de una relación de uno a varios se indica con un símbolo de llave, mientras que el lado de la clave externa de una relación se indica con un símbolo de infinito.

En el ejemplo tenemos:

Un estado lo es de muchos usuarios pero un usuario tiene únicamente un estado.


A continuación, se muestra la relación uno a muchos en una relación recursiva.

Un contrato puede ser la extensión de otro contrato y un contrato puede tener muchas extensiones.


Un empleado puede ser supervisado por otro empleado y un empleado puede supervisar a muchos empleados.


Relaciones de varios a varios

En las relaciones de varios a varios (muchos a muchos), una fila de la tabla A puede tener varias filas coincidentes en la tabla B, y viceversa. Para crear una relación de este tipo, defina una tercera tabla, denominada tabla de unión, cuya clave principal está formada por las claves externas de las tablas A y B. 

  • Por ejemplo, la tabla Boleta y la tabla Producto tienen una relación de varios a varios definida por una relación de uno a varios entre cada una de estas tablas y la tabla DETALLEBOLETA. La clave principal de la tabla DETALLEBOLETA es la combinación de la columna COD_BOL (la clave principal de la tabla BOLETA) y la columna COD_PROD (la clave principal de la tabla PRODUCTO).


  • Otro ejemplo: Un contrato puede registrar muchos departamentos y un departamento puede estar registrado en muchos contratos. Para poder implementar esta relación compleja debemos adicionar una tabla de detalle (DETALLECONTRATO).


Relaciones de uno a uno

En una relación de uno a uno, una fila de la tabla A no puede tener más de una fila coincidente en la tabla B y viceversa. Una relación de uno a uno se crea si las dos columnas relacionadas son claves principales o tienen restricciones únicas. Este tipo de relación no es común porque la mayor parte de la información relacionada de esta manera estaría en una tabla. 

Se puede utilizar una relación de uno a uno para:

Dividir una tabla con muchas columnas
  • Aislar parte de una tabla por razones de seguridad
  • Almacenar datos que no se deseen conservar y se puedan eliminar fácilmente con tan sólo suprimir la tabla
  • Almacenar información aplicable únicamente a un subconjunto de la tabla principal.
  • Implementar entidades del tipo Generalización con sus especializaciones.

El lado de la clave principal de una relación de uno a uno se indica con un símbolo de llave. El lado de la clave externa también se indica con un símbolo de llave.
  • El ejemplo, a continuación, muestra a la tabla USUARIO (generalización) relacionándose con la tabla PROPIETARIO (especialización 1) y la tabla INQUILINO (especialización 2), de uno a uno.


Ahora que ya conoce el concepto de tablas y el concepto de relaciones, empezará a implementar algunas tablas para distintos casos.

¡EMPECEMOS!


CASO 1: DEPARTAMENTOS

Se desea implementar una base de datos para el control de contratos de departamentos entre diferentes edificios. Para ello, se cuenta con el siguiente diagrama:


Usando TRANSACT/SQL, cree las siguiente base de datos:

  1. Cree la base de datos Departamentos
  2. Active la base de datos Departamentos
  3. Cree las tablas mostradas
  4. Agregue las llaves Primarias (ADD PRIMARY KEY)
  5. Agregue las llaves Foráneas y Relaciones (ADD FOREIGN KEY – REFERENCES)
Solución
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
/**********************/
/**CASO DEPARTAMENTOS**/
/**********************/
 
-- 1. Crea la base de datos departamentos
CREATE DATABASE DEPARTAMENTOS
GO
 
-- 2. Activa la base de datos departamentos
USE DEPARTAMENTOS
GO
 
-- 3. Crea las tablas mostradas
CREATE TABLE CONTRATO (
 COD_CONT char(6) NOT NULL,
 PROP_COD_USUA char(6) NULL,
 INQ_COD_USUA char(6) NULL,
 FEC_FIRMA datetime NOT NULL,
 REFERENCIA varchar(100) NULL,
 COD_EST char(6) NULL,
 COD_CONT_ORIG char(6) NULL
)
CREATE TABLE DEPARTAMENTOS (
 COD_EDIF char(6) NOT NULL,
 COD_DEP char(6) NOT NULL,
 AREA_TOTAL_DEP decimal NOT NULL,
 AREA_CONSTRUIDA_DEP decimal NULL,
 NUM_AMB_DEP int NULL,
 PISO_DEP int NULL,
 PRECIO_ALQXMES_DEP money NULL,
 COD_EST char(6) NULL
)
CREATE TABLE DETALLECONTRATO (
 COD_EDIF char(6) NOT NULL,
 COD_DEP char(6) NOT NULL,
 COD_CONT char(6) NOT NULL,
 FEC_INI_ALQ datetime NOT NULL,
 FEC_FIN_ALQ datetime NOT NULL
)
CREATE TABLE EDIFICIOS (
 COD_EDIF char(6) NOT NULL,
 NOM_EDIF varchar(60) NOT NULL,
 DIRECC_EDIF varchar(60) NOT NULL,
 CODPOSTAL_EDIF varchar(4) NOT NULL,
 AREA_TOTAL_EDIF decimal NOT NULL,
 AREA_CONSTRUIDA_EDIF decimal NULL,
 REFERENCIA_EDIF varchar(100) NULL,
 COD_EST char(6) NULL
)
CREATE TABLE ESTADO (
 COD_EST char(6) NOT NULL,
 DESC_EST varchar(20) NOT NULL
)
 
CREATE TABLE FAMILIARES (
 COD_FAMI char(6) NOT NULL,
 COD_USUA char(6) NOT NULL,
 NOM_FAMI varchar(25) NOT NULL,
 APEPATER_FAMI varchar(25) NOT NULL,
 APEMATER_FAMI varchar(25) NOT NULL,
 GRADO_PARENTES_FAMI varchar(50) NOT NULL
)
CREATE TABLE INQUILINO (
 COD_USUA char(6) NOT NULL,
 NOM_AVAL_INQ varchar(30) NOT NULL,
 APELL_AVAL char(30) NOT NULL,
 HABER_BAS_INQ int NOT NULL,
 EST_CIVIL_INQ char(1) NULL,
 LUG_TRAB_INQ varchar(50) NULL
)
CREATE TABLE PROPIETARIO (
 COD_USUA char(6) NOT NULL,
 TIPO_PROP varchar(30) NOT NULL,
 TELEFONO_PROP char(10)
)
CREATE TABLE USUARIO (
 COD_USUA char(6) NOT NULL,
 NOM_USUA varchar(25) NOT NULL,
 APEPATER_USUA varchar(25) NOT NULL,
 APEMATER_USUA varchar(25) NOT NULL,
 FEC_NAC_USUA datetime NULL,
 FEC_REG_USUA datetime NULL,
 TIPO_DOC_USUA varchar(20) NOT NULL,
 NUM_DOC_USUA char(8) NOT NULL,
 COD_EST char(6) NOT NULL
)
GO
 
-- 4. Agrega las llaves primarias a todas las tablas
 
/* NONCLUSTERED: Crea un índice en el que el orden lógico de los valores de clave
 determina el orden físico de las filas correspondientes de la tabla. */
 
ALTER TABLE CONTRATO
ADD PRIMARY KEY NONCLUSTERED (COD_CONT)
ALTER TABLE DEPARTAMENTOS
ADD PRIMARY KEY NONCLUSTERED (COD_EDIF, COD_DEP)
ALTER TABLE DETALLECONTRATO
ADD PRIMARY KEY NONCLUSTERED (COD_EDIF, COD_DEP, COD_CONT)
ALTER TABLE EDIFICIOS
ADD PRIMARY KEY NONCLUSTERED (COD_EDIF)
ALTER TABLE ESTADO
ADD PRIMARY KEY NONCLUSTERED (COD_EST)
ALTER TABLE FAMILIARES
ADD PRIMARY KEY NONCLUSTERED (COD_FAMI, COD_USUA)
ALTER TABLE INQUILINO
ADD PRIMARY KEY NONCLUSTERED (COD_USUA)
ALTER TABLE PROPIETARIO
ADD PRIMARY KEY NONCLUSTERED (COD_USUA)
ALTER TABLE USUARIO
ADD PRIMARY KEY NONCLUSTERED (COD_USUA)
GO
 
 
-- 5. Agregando llaves Foráneas y relacionando tablas
 
-- SE CREA LA RELACIÓN RECURSIVA.
ALTER TABLE CONTRATO
ADD FOREIGN KEY (INQ_COD_USUA) REFERENCES INQUILINO,
FOREIGN KEY (COD_CONT_ORIG) REFERENCES CONTRATO
-- SE CREAN LAS RELACIONES DEL RESTO DE TABLAS.
ALTER TABLE CONTRATO
ADD FOREIGN KEY (PROP_COD_USUA) REFERENCES PROPIETARIO
ALTER TABLE CONTRATO
ADD FOREIGN KEY (COD_EST) REFERENCES ESTADO
ALTER TABLE DEPARTAMENTOS
ADD FOREIGN KEY (COD_EDIF) REFERENCES EDIFICIOS
ALTER TABLE DEPARTAMENTOS
ADD FOREIGN KEY (COD_EST) REFERENCES ESTADO
ALTER TABLE DETALLECONTRATO
ADD FOREIGN KEY (COD_CONT) REFERENCES CONTRATO
ALTER TABLE DETALLECONTRATO
ADD FOREIGN KEY (COD_EDIF, COD_DEP) REFERENCES DEPARTAMENTOS
ALTER TABLE EDIFICIOS
ADD FOREIGN KEY (COD_EST) REFERENCES ESTADO
ALTER TABLE FAMILIARES
ADD FOREIGN KEY (COD_USUA) REFERENCES INQUILINO
ALTER TABLE INQUILINO
ADD FOREIGN KEY (COD_USUA) REFERENCES USUARIO
ALTER TABLE PROPIETARIO
ADD FOREIGN KEY (COD_USUA) REFERENCES USUARIO
ALTER TABLE USUARIO
ADD FOREIGN KEY (COD_EST) REFERENCES ESTADO
GO



SI NO TIENES EL SQL SERVER INSTALADO, PUEDES EJECUTAR EL QUERY INGRESANDO AL SIGUIENTE ENLACE PARA QUE PUEDAS PRACTICAR SIN LA NECESIDAD DE TENER INSTALADO ALGUNA VERSIÓN DEL SQL SERVER EN TU PC.

RexTexter: https://rextester.com/ZBTXF99415


CASO 2: VENTAS

Se ha diseñado una base de datos para el control de las ventas realizadas en una empresa, como se detalla en el siguiente diagrama.



Cree la base de datos Ventas indicando propiedades para el archivo primario, un archivo secundario y un archivo de registro. Identifique los tipos de datos que le corresponde a los campos de las tablas.

Solución

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
-- Crea la base de datos
Create Database VENTAS
On
(
 Name = 'VENTAS_DATA',
 Filename = 'c:\data\VENTAS_DATA.mdf',
 Size = 15MB,
 Maxsize = 200MB,
 Filegrowth = 20%
),
(
 Name = 'VENTAS_SEC_001',
 Filename = 'c:\data\VENTA_SEC_001.ndf',
 Size = 10MB,
 Maxsize = 80MB,
 Filegrowth = 2MB
)
Log on
(
 Name = 'VENTAS_Log',
 Filename = 'c:\data\VENTAS_Log.ldf',
 Size = 10 MB,
 Maxsize = 70 MB,
 Filegrowth = 5 MB
)
Go
 
-- Activa la base de datos
Use VENTAS
Go
 
-- Crea la tabla distrito
Create Table DISTRITO
(
 COD_DIST CHAR(5) NOT NULL PRIMARY KEY,
 DESC_DIST VARCHAR(20)
)
 
-- Crea la tabla EMPLEADO
Create Table EMPLEADO
(
 COD_EMP CHAR(5) NOT NULL PRIMARY KEY,
 NOM_EMP VARCHAR(30),
 APE_PAT_EMP VARCHAR(30),
 APE_MAT_EMP VARCHAR(30),
 FEC_NAC_EMP DATETIME,
 DIR_EMP VARCHAR(100),
 TEL_EMP CHAR(15),
 COD_DIST_EMP CHAR(5) REFERENCES DISTRITO,
 CORREO_EMP VARCHAR(50),
 FEC_ING_EMP DATETIME,
 COD_SUPERVISOR CHAR(5) REFERENCES EMPLEADO
)
 
-- Crea la tabla cliente
Create Table CLIENTE
(
 COD_CLI CHAR (5) NOT NULL PRIMARY KEY,
 DIR_CLI VARCHAR(50),
 TEL_CLI CHAR(15),
 COD_DIST_CLI CHAR(5) REFERENCES DISTRITO,
 CORREO_CLI VARCHAR(30),
 WEB VARCHAR(50)
)
 
-- Crea la tabla cliente persona juridica
Create Table CLIENTE_PER_JURIDICA
(
 COD_CLI CHAR(5) REFERENCES CLIENTE,
 RAZON_SOCIAL_CLI VARCHAR(100),
 RUC_CLI CHAR(11),
 CONTACTO_CLI VARCHAR(20),
 COD_CARGO_CLI CHAR(5),
 PRIMARY KEY (COD_CLI)
)
 
-- Crea la tabla cliente persona natural
Create Table CLIENTE_PER_NATURAL
(
 COD_CLI CHAR(5) REFERENCES CLIENTE,
 NOM_CLI VARCHAR(100),
 APE_PAT_CLI VARCHAR(30),
 APE_MAT_CLI VARCHAR(30),
 PRIMARY KEY (COD_CLI)
)
 
-- Crea la tabla tipo de producto
Create Table TIPO_PRODUCTO
(
 COD_TIPO_PROD CHAR(5) NOT NULL PRIMARY KEY,
 DESC_TIPO_PROD VARCHAR(50)
)
 
-- Crea la tabla producto
Create table PRODUCTO
(
 COD_PROD CHAR(5) NOT NULL PRIMARY KEY,
 DESC_PROD VARCHAR(50),
 PRECIO_PROD DECIMAL(9,2),
 STOCK_ACT_PROD INT,
 STOCK_MIN_PROD INT,
 COD_TIPO_PROD CHAR(5) REFERENCES TIPO_PRODUCTO
)
 
-- Crea la tabla boleta
Create Table BOLETA
(
 COD_BOL CHAR(5) NOT NULL PRIMARY KEY,
 COD_EMP CHAR(5) REFERENCES EMPLEADO,
 FECHA_BOL DATETIME,
 COD_CLI CHAR(5) REFERENCES CLIENTE,
 ESTADO_BOL CHAR(10)
)
 
-- Crea la taba detalle boleta
Create table DETALLEBOLETA
(
 COD_BOL CHAR(5) REFERENCES BOLETA,
 COD_PROD CHAR(5) REFERENCES PRODUCTO,
 CANTIDAD INT,
 PRECIO_VENTA DECIMAL(9,2)
 PRIMARY KEY(COD_BOL,COD_PROD)
)


SI NO TIENES EL SQL SERVER INSTALADO, PUEDES EJECUTAR EL QUERY INGRESANDO AL SIGUIENTE ENLACE PARA QUE PUEDAS PRACTICAR SIN LA NECESIDAD DE TENER INSTALADO ALGUNA VERSIÓN DEL SQL SERVER EN TU PC.

RexTexter: https://rextester.com/YDI16825



CASO 3: COMIDAS

Cree la base de datos comidas e implemente las siguientes tablas: cliente, vendedor, comida, factura y detalle factura.

Solución

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
/* Cree la base de datos comidas y implemente las siguientes tablas
cliente, vendedor, comida, factura y detalle factura. */
 
-- Crea la base de datos
CREATE DATABASE COMIDAS
GO
 
-- Activa la base de datos
USE COMIDAS
GO
 
-- Crea las tablas
CREATE TABLE CLIENTE
(
 COD_CLI CHAR(5) NOT NULL PRIMARY KEY,
 NOM_CLI VARCHAR(40),
 APE_PAT_CLI VARCHAR(40),
 DIR_CLI VARCHAR(40),
 DNI_CLI CHAR(8),
 FEC_NACI_CLI DATETIME,
 SEC_CLI CHAR (1),
 CONSUMO_PROM_CLI DECIMAL (9,2),
)
 
CREATE TABLE VENDEDOR
(
 COD_VEN CHAR(5) NOT NULL PRIMARY KEY,
 NOM_VEN VARCHAR(40),
 APE_PAT_VEN VARCHAR(40),
 DIR_VEN VARCHAR(40),
 DNI_VEN CHAR(8),
 FEC_NACI_VEN DATETIME,
 SEX_VEN CHAR (1),
)
 
CREATE TABLE COMIDA
(
 COD_COMI CHAR(5) NOT NULL PRIMARY KEY,
 DESC_COMI VARCHAR(40),
 PRECIO_COMI DECIMAL(9,2),
)
 
CREATE TABLE FACTURA
(
 NRO_FACT CHAR(6) NOT NULL PRIMARY KEY,
 FECHA_FACT DATETIME,
 STT_FACT DECIMAL(9,2),
 IGV_FACT DECIMAL(9,2),
 TOT_FACT DECIMAL(9,2),
 COD_CLI CHAR(5)REFERENCES CLIENTE,
 COD_VEN CHAR(5)REFERENCES VENDEDOR
)
 
CREATE TABLE DETALLE_FACTURA
(
 NRO_FACT CHAR(6) NOT NULL REFERENCES FACTURA,
 COD_COMI CHAR(5) NOT NULL REFERENCES COMIDA,
 CAN_VEN INT,
 MON_PAR DECIMAL(9,2),
 PRIMARY KEY (NRO_FACT,COD_COMI)
)
GO


SI NO TIENEN EL SQL SERVER INSTALADO, PUEDEN EJECUTAR EL QUERY INGRESANDO AL SIGUIENTE ENLACE PARA QUE PUEDAN PRACTICAR SIN LA NECESIDAD DE TENER INSTALADO ALGUNA VERSIÓN DEL SQL SERVER EN SU PC.

RexTexter: https://rextester.com/RPM19764


Actualizamos las base de datos y podemos ver que aparece la base de datos con las tablas que acabamos de crear.


Para crear el diagrama de base de datos debemos hacer clic derecho en la carpeta Diagrama de base de datos.


¡Acabas de ver el tema Creación de tablas del mini curso de Base de Datos en SQL Server! ¡Fácil verdad! Ir al índice

Asimismo, si quieres comprar la guía completa con todos los temas, ejercicios, evaluaciones, proyectos, aplicaciones, banco de datos y más; puedes ingresar al siguiente enlace. Y si eres seguidor accedes a un descuento del -%50.

¡Quiero esto!

No hay comentarios, ¡cuéntame algo!

Me gustaría saber tu opinión. ¡Saludos!