Professional Documents
Culture Documents
SUBCONSULTAS Es una SELECT anidada en una instruccin INSERT, DELETE, SELECT o UPDATE. Como una tabla derivada
Select e.emp_no as Numero ,e.Apellido from (select emp_no, apellido from emp) as e
Select emp_no as [Numero] ,Apellido ,Salario ,(select avg(Salario) from emp) as Diferencia from emp where oficio = 'Empleado'
Para correlacionar datos: Expresin dinmica que cambia en cada fila de una consulta externa Es una combinacin entre la subconsulta y la fila de la consulta externa. Dividen consultas complejas con dos o ms consultas simples relacionadas
Subconsulta correlacionada Select apellido, oficio,dept_no from emp as e where 20 < (select dept_no from dept as d where e.dept_no = d.dept_no and d.dnombre = 'Ventas')
danilo.rodriguez@fec.uni.edu.ni
Simulacin de una clausula JOIN Vamos a mostrar los oficios que estn en ms de un departamento. Select distinct e1.oficio from emp as e1 where e1.oficio in(Select e2.oficio from emp as e2 where e1.dept_no <> e2.dept_no) Se debe utilizar antes una combinacin que una subconsulta, la combinacin sera asi, dando los mismos resultados: Select distinct e1.Oficio from emp as e1 inner join emp as e2 on e1.oficio = e2.oficio where e1.dept_no <> e2.dept_no Estos son los dos oficios que estn en ms de un departamento.
select e1.apellido,e1.oficio, e1.salario from emp as e1 where e1.salario > (select avg(e2.salario) from emp as e2 where e1.oficio = e2.oficio)
Esta es la consulta utilizando el HAVING, que es la que deberamos utilizar antes que una subconsulta de simulacin HAVING: SELECT e1.apellido,e1.oficio, e1.salario FROM emp AS e1 INNER JOIN emp AS e2 ON e1.oficio = e2.oficio GROUP BY e1.oficio, e1.salario,e1.apellido HAVING e1.salario > AVG (e2.salario)
danilo.rodriguez@fec.uni.edu.ni
Clausulas EXISTS Y NOT EXISTS Comprueba si el dato que buscamos existe en la consulta. Mostrar los empleados que no tienen departamento: select apellido,fecha_alt,salario from emp as e where not exists(select * from dept as o where e.dept_no = o.dept_no)
Recomendaciones: Utilizar subconsultas para dividir una consulta compleja. Utilizar Alias para tablas en subconsultas correlacionadas y combinaciones. Utilizar EXISTS en vez de IN SUBCONSULTAS 1. Mostrar el nmero de empleado, el apellido y la fecha de alta del empleado ms antiguo de la empresa 2. Mostrar el nmero de empleado, el apellido y la fecha de alta del empleado ms modernos de la empresa. 3. Visualizar el apellido y el oficio de los empleados con el mismo oficio que Jimnez. 4. Queremos saber el apellido, oficio, salario y nmero de departamento de los empleados con salario mayor que el mejor salario del departamento 30. 5. Mostrar el apellido, la funcin, sala o departamento de todos los empleados que trabajen en la empresa. 6. Averiguar el salario de todos los empleados de la empresa, de forma que se aprecien las diferencias entre ellos. 7. Mostrar apellidos y oficio de los empleados del departamento 20 cuyo trabajo sea el mismo que el de cualquier empleado de ventas. 8. Mostrar los empleados que tienen mejor salario que la media de los directores, no incluyendo al presidente. 9. Mostrar el apellido, funcin, salario y cdigo de hospital de los empleados de la plantilla que siendo enfermeros o enfermeras pertenecen al hospital SAN CARLOS. 10. Visualizar los datos de los hospitales que tienen personal (Doctores) de cardiologa. 11. Visualizar el salario anual de los empleados de la plantilla del Hospital Provincial y General. 12. Mostrar el apellido de los enfermos que nacieron antes que el Seor Miller.
danilo.rodriguez@fec.uni.edu.ni
Variables Definidas en una instruccin DECLARE (Con una sola @) Valores asignados con instruccin SET o SELECT (Con una sola @) mbito global o local
Sintaxis: DECLARE @VariableLocal tipodatos,... SET @VariableLocal = expresin SELECT @VariableLocal = Nombre from Empleados WHERE Id = 5 BUCLES Nivel de instruccin:
--IF declare @n int set @n = 5 if (@n % 2)= 0 print 'PAR' else print 'IMPAR' --BUCLES Declare @n int set @n = 0 while @n < 10 begin if (@n % 2) = 0 select @n as Numero set @n = @n + 1 end
danilo.rodriguez@fec.uni.edu.ni
Nivel De fila Las expresiones a nivel de fila evaluan un resultado devuelto por la consulta y dependiendo de los valores que utilicemos lo sustituyen para mejorar la presentacin de los datos. CASE expresion WHEN valor1 THEN resultado1 ELSE resultadoN END CASE WHEN verdadero THEN resultado1 ELSE resultado2 END
--CASE DECLARE @N INT SET @N = 1 WHILE (@N<100) BEGIN SELECT @N AS 'NUMERO', CASE WHEN (@N % 2) = 1 THEN 'IMPAR' ELSE 'PAR' END AS 'TIPO' SET @N = @N + 1
danilo.rodriguez@fec.uni.edu.ni
EJEMPLO: Esto se puede utilizar tambin para inicializar variables. Es el mismo caso pero utilizando el CASE para inicializar una variable.
DECLARE @N INT,@TIPO CHAR(10),@VALOR CHAR(11) SET @N = 1 WHILE (@N < 100) BEGIN IF (@N < 50) SET @VALOR = 'MENOR DE 50' ELSE SET @VALOR = 'MAYOR DE 50' SET @TIPO = CASE (@N % 2) WHEN 1 THEN 'IMPAR' ELSE 'PAR' END SELECT @N AS 'NUMERO', @TIPO AS 'TIPO',@VALOR AS VALOR SET @N = @N + 1 END
danilo.rodriguez@fec.uni.edu.ni
CONVERT se usa para convertir el nmero a una cadena de dos caracteres y lo concatenamos con @tipo. CAST realiza lo mismo que CONVERT
DECLARE @N INT,@TIPO CHAR(10) SET @N = 5 IF (@N BETWEEN 4 AND 6) BEGIN WHILE (@N > 0) BEGIN SET @TIPO = CASE (@N % 2) WHEN 1 THEN 'IMPAR' ELSE 'PAR' END SELECT @N AS 'NUMERO', @TIPO AS 'TIPO' PRINT CONVERT (CHAR(2),@N) + @TIPO PRINT CAST (@N AS CHAR(2)) + @TIPO SET @N = @N - 1 END END
Ponemos Cast y Convert para poder concatenar un valor de tipo Int con un valor de tipo Char, sino intentara sumarlos y dara error.
danilo.rodriguez@fec.uni.edu.ni
danilo.rodriguez@fec.uni.edu.ni