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.
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:
- Cree la base de datos Departamentos
- Active la base de datos Departamentos
- Cree las tablas mostradas
- Agregue las llaves Primarias (ADD PRIMARY KEY)
- 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.
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!