Mi aprendizaje sobre DDL y DML
/*CREACION BASE DE DATOS CONSTRUCTORA*/
/*CARLOS MARIO VELASQUEZ ORTIZ*/
/*FEBRERO 25 DE FEBRERO 2025*/
CREAR BASE DE DATOS CONSTRUCTORA
CREATE DATABASE BD_CONSTRUCTORA2025_1;
USE BD_CONSTRUCTORA2025_1;
/* CREAR TABLA OFICIO */
CREATE TABLE tblOficio(
Tipo_Oficio VARCHAR(30),
Bonificacion INT,
CHECK(Bonificacion >= 30000 and Bonificacion <= 80000),
Horas_Semanas INT,
CHECK(Horas_Semanas >= 30 and Horas_Semanas <= 60),
PRIMARY KEY (Tipo_Oficio));
/*CREAR TABLA TRABAJADOR*/
CREATE TABLE tblTrabajador(
Cedula INT,
Nombre VARCHAR(50) not null,
Valor_Hora INT,
/*CHCK COMANDO PARA HACER VALIDACIONES*/
CHECK(Valor_Hora >= 7000 and Valor_Hora <= 20000),
Tipo_Oficio VARCHAR(30),
PRIMARY KEY (Cedula),
FOREIGN KEY (Tipo_Oficio) REFERENCES tblOficio(Tipo_Oficio));
/*CREAR TABLA AREA*/
CREATE TABLE tblArea(
Cod_Area VARCHAR(10),
Nom_Area VARCHAR(30),
Estrato int,
CHECK(Estrato >= 1 and Estrato <= 7),
PRIMARY KEY (Cod_Area));
/*CREAR TABLA EDIFICIO*/
CREATE TABLE tblEdificio(
Iden_Edif INT,
Direccion VARCHAR(30),
Tipo VARCHAR (30),
Calidad INT,
CHECK (Calidad >= 1 and Calidad <= 5),
Categoria INT,
CHECK(Categoria >= 1 and Calidad <= 5),
Cod_Area VARCHAR (10)
PRIMARY KEY (Iden_Edif),
FOREIGN KEY(Cod_Area) REFERENCES tblArea(Cod_Area));
/*CREAR TABLA ASIGNAR*/
CREATE TABLE tblAsignar(
Cedula INT,
Iden_Edif INT,
Fecha_I DATETIME,
Num_Dias INT,
CHECK (Num_Dias > 0),
PRIMARY KEY(Cedula,Iden_edif),
FOREIGN KEY(Cedula) REFERENCES tbltrabajador(Cedula),
FOREIGN KEY(Iden_edif) REFERENCES tblEdificio(Iden_Edif));
/************ INSERTAR DATOS A LA CADA UNA DE LAS TABLAS *********/
/***INSERTA DATOS A LA TABLA OFICIO***/
INSERT INTO tbloficio VALUES('Decorador',30000,35)
INSERT INTO tbloficio VALUES('Albañil',35000,37)
INSERT INTO tbloficio VALUES('Carpintero',31000,40)
INSERT INTO tbloficio VALUES('Electrico',35000,35)
INSERT INTO tbloficio VALUES('Arquitecto',40000,30)
/***** INSERTAR DATOS A LA TABLA TRABAJADOR******/
INSERT INTO tbltrabajador VALUES(1235,'Annie',12500,'Electrico')
INSERT INTO tbltrabajador VALUES(1311,'Roberto',15750,'Decorador')
INSERT INTO tbltrabajador VALUES(1412,'Carlos',13700,'Decorador')
INSERT INTO tbltrabajador VALUES(1415,'Lina',12500,'Decorador')
INSERT INTO tbltrabajador VALUES(1418,'Pedro',10000,'Carpintero')
INSERT INTO tbltrabajador VALUES(1520,'Luis',11750,'Electrico')
INSERT INTO tbltrabajador VALUES(1525,'Juan',20000,'Arquitecto')
INSERT INTO tbltrabajador VALUES(2920,'Raul',10000,'Carpintero')
INSERT INTO tbltrabajador VALUES(3001,'Gabriel',15500,'Decorador')
INSERT INTO tbltrabajador VALUES(3231,'Alvaro',17400,'Decorador')
INSERT INTO tbltrabajador VALUES(4446,'Mario',8200,'Albañil')
INSERT INTO tbltrabajador VALUES(8520,'Bernardo',8500,'Albañil')
/***** INSERTAR DATOS A LA TABLA AREA******/
INSERT INTO tblarea VALUES('a10','Sur',2)
INSERT INTO tblarea VALUES('a11','Sur',4)
INSERT INTO tblarea VALUES('a12','Norte',3)
INSERT INTO tblarea VALUES('a13','Norte',2)
/***** INSERTAR DATOS A LA TABLA EDIFICIOS******/
INSERT INTO tbledificio VALUES(111,'calle1213','Oficina',3,2,'a10')
INSERT INTO tbledificio VALUES(210,'calle1222','Oficina',4,3,'a10')
INSERT INTO tbledificio VALUES(215,'calle1215','Comercio',5,3,'a11')
INSERT INTO tbledificio VALUES(312,'calle1313','Oficina',5,2,'a13')
INSERT INTO tbledificio VALUES(435,'calle1513','Comercio',2,4,'a13')
INSERT INTO tbledificio VALUES(460,'calle1263','Almacen',4,4,'a12')
INSERT INTO tbledificio VALUES(520,'calle1223','Residencia',3,5,'a10')
INSERT INTO tbledificio VALUES(820,'calle1245','Almacen',3,5,'a10')
/***** INSERTAR DATOS A LA TABLA ASIGNAR******/
INSERT INTO tblasignar VALUES(1235,111,'02/02/02',25)
INSERT INTO tblasignar VALUES(1235,210,'01/03/02',5)
INSERT INTO tblasignar VALUES(1235,520,'02/02/02',25)
INSERT INTO tblasignar VALUES(1235,820,'01/03/02',5)
INSERT INTO tblasignar VALUES(1235,215,'02/07/02',10)
INSERT INTO tblasignar VALUES(1235,312,'02/02/02',10)
INSERT INTO tblasignar VALUES(1235,435,'01/02/04',22)
INSERT INTO tblasignar VALUES(1235,460,'02/02/05',21)
INSERT INTO tblasignar VALUES(1412,210,'02/02/02',22)
INSERT INTO tblasignar VALUES(1412,312,'02/02/02',14)
INSERT INTO tblasignar VALUES(1418,435,'02/02/02',23)
INSERT INTO tblasignar VALUES(1418,460,'02/02/02',10)
INSERT INTO tblasignar VALUES(3231,312,'02/02/02',25)
INSERT INTO tblasignar VALUES(3231,111,'02/02/02',13)
INSERT INTO tblasignar VALUES(4446,111,'02/02/02',18)
/***** REALIZAR CONSULTAS******/
/***** CONSULTAR TODOS LOS DATOS DE CADA UNA DE LAS TABLAS *****/
SELECT * FROM tblArea
SELECT * FROM tblAsignar
SELECT * FROM tblEdificio
SELECT * FROM tblOficio
SELECT * FROM tblTrabajador
/***** HALLAR EL TOTAL DE DIAS ASIGNADOS A CADA UNO DE LOS TRABAJADORS SI ESTE ES MAYOR QUE 20 *****/
SELECT cedula, SUM (Num_Dias) AS TOTAL
FROM tblAsignar
GROUP BY cedula
HAVING SUM(Num_Dias) > 20;
/***** MOSTRAR EL NOMBRE Y EL VALOR HORA DE LOS TRABAJADORES *****/
SELECT Nombre, Valor_Hora FROM tblTrabajador;
/***** MOSTRAR TODOS DE LOS TRABAJADORES *****/
SELECT *FROM tblTrabajador
/***** MOSTRAR LOS OFICIOS DE LOS TRABAJADORES CON DISTINCT (MUESTRA LOS DATOS SIN REPETIR VALORES *****/
SELECT DISTINCT Tipo_Oficio FROM tblTrabajador;
/***** MOSTRAR LOS 3 PRIMEROS REGISTROS DE LOS TRABAJADORES *****/
SELECT TOP 3 Nombre, Valor_Hora FROM tblTrabajador;
/** MOSTRAR NOMBRE DEL TRABAJADOR CON EL VALOR HORA AUMENTADO EL 3%***/
SELECT Nombre, Valor_Hora , Valor_Hora * 0.03 AS PORCENTAJE,
Valor_Hora+Valor_Hora*0.03 AS TOTAL
FROM tblTrabajador
/*** MOSTRAR LOS OFICIOS DE LOS TRABAJADORES RENOMBRANDO EN OFICIO ***/
SELECT Tipo_Oficio AS OFICIO
FROM tblTrabajador;
/***** MOSTRAR EL TOTAL MAXIMO DE LOS VALORES HORA*****/
SELECT SUM (Valor_Hora) AS TOTAL,
MAX(Valor_Hora) AS MAXIMO
FROM tblTrabajador
/***** MOSTRAR LOS NOMBRES DE LOS TRABAJADORES Y EL NUMERO DE DIAS ASIGNADO *****/
SELECT tblTrabajador.Nombre, tblAsignar.Num_Dias
FROM tblTrabajador
INNER JOIN tblAsignar
ON tblTrabajador.Cedula = tblAsignar.Cedula;
/****MOSTRAR LOS TRABAJADORES QUE TENGAN EL MISMO VALOR DE HORAS ****/
SELECT tra.nombre, tra.valor_hora
FROM tblTrabajador tra, tblTrabajador do
WHERE tra.Valor_Hora = do.Valor_Hora
AND tra.Cedula <> do.Cedula
GROUP BY tra.Valor_Hora, tra.nombre;
/***** MOSTRAR LOS NOMBRES DE LOS TRABAJADORES QUE TIENEN UN VALOR HORA MAYOR QUE 10000 *****/
SELECT nombre, Valor_Hora AS VALOR_HORA
FROM tblTrabajador WHERE Valor_Hora > 10000;
select * from tblTrabajador
/***** MOSTRAR LOS NOMBRES DE LOS TRABAJADORES QUE TIENEN UN VALOR HORA ENTRE 10000 Y 30000 *****/
SELECT nombre, Valor_Hora AS VALOR_HORA
FROM tblTrabajador
WHERE Valor_Hora BETWEEN 10000 AND 30000;
/***** MOSTRAR LOS NOMBRES DEL TRABAJADOR QUE EL NOMBRE TENGA LA CADENA AR *****/
SELECT nombre FROM tblTrabajador WHERE Nombre LIKE '%AR%';
/****MOSTRAR LOS NOMBRES DE LOS TRABAJADORES NELSON FERNANDO O GABRIEL****/
SELECT * FROM tblTrabajador
WHERE Nombre IN ( 'NELSON', 'FERNANDO','GABRIEL');
/****MOSTRAR LOS NOMBRES DE LOS TRABAJADORES Y EL NUMERO DE DIAS ASIGNADO SI ES MAYOR QUE 15****/
SELECT tblTrabajador.Nombre AS NOM_TRABAJADOR, tblAsignar.Num_Dias AS NUMERO_DIAS_ASIGNADOS
FROM tblTrabajador
INNER JOIN tblAsignar
ON tblTrabajador.Cedula = tblAsignar.Cedula
WHERE tblAsignar.Num_Dias > 15;
/****LA SENTENCIA LEFT JOIN COMBINA LOS VALORES DE LA PRIMERA TABLA CON LOS VALORES DE LA SEGUDNA TABLA SIEMPRE DEVOLVERA LAS FILAS DE LA PRIMERA TABLA E INCLUSO AUNQUE NO CUMPLA LA CONDUCION****/
SELECT * FROM tblTrabajador
LEFT JOIN tblAsignar ON tblTrabajador.Cedula = tblAsignar.Cedula;
SELECT * FROM tblAsignar
/****LA SENTENCIA RIGHT JOIN COMBINA LOS VALORES DE LA PRIMERA TABLA CON LOS VALORES DE LA SEGUDNA TABLA SIEMPRE DEVOLVERA LAS FILAS DE LA SEGUNDA TABLA E INCLUSO AUNQUE NO CUMPLA LA CONDUCION EN ALGUNAS BASES DE DAROS LA SENTENCIA RGTH JOIN ES IGUAL A RIGHT OUTER JOIN****/
SELECT * FROM tblTrabajador
RIGHT JOIN tblAsignar ON tblTrabajador.Cedula = tblAsignar.Cedula;
SELECT * FROM tblAsignar
/****HALLAR LA CANTIDAD DE TRABAJADORES POR CADA OFICIO****/
SELECT Tipo_Oficio, COUNT(*) AS Total_Trabajadores
FROM tblTrabajador
GROUP BY Tipo_Oficio;
/**** HALLAR EL TOTAL DE DIAS ASIGNADOS A CADA TRANAJADOR SI ESTE ES MAYOR QUE 20****/
SELECT cedula, SUM(Num_Dias) AS total_dias
FROM tblAsignar
GROUP BY cedula
HAVING SUM(Num_Dias) > 20;
/**** HALLAR LOS DATOS DE LOS TRABAJADORES ORDENADOS POR NOMBRE****/
SELECT * FROM tblTrabajador
ORDER BY Nombre
/****HALLAR EL NOMBRE Y EL TOTAL DE DIAS ASIGNADOS A CADA TRABAJADOR Y MOSTRAR SI EL TOTAL DE DIAS ES MAYOR QUE EL MINIMO VALOR DE NUMERO DE HORAS****/
SELECT tblAsignar.Cedula, tblTrabajador.Nombre, SUM(Num_Dias) AS TOTAL_DIAS
FROM tblAsignar
INNER JOIN tblTrabajador ON tblAsignar.Cedula = tblTrabajador.Cedula
GROUP BY tblAsignar.Cedula, tblTrabajador.Nombre
HAVING sum( num_Dias) > ( SELECT MIN(Horas_Semanas) from tblOficio);
Comentarios
Publicar un comentario