Manual 2 SQL 2012 (Programación 1)
Manual 2 SQL 2012 (Programación 1)
SQL
Bien, ahora nos toca insertar datos en las tablas. La sintaxis SQL de insercin "para datos
fijos o ingresados de forma manual" la podemos clasificar en 3 formas:
Tabla DEPT
Tabla DOCTOR
Manual SQL Server | Sentencias SQL
Tabla EMP
Tabla ENFERMO
Manual SQL Server | Sentencias SQL
Tabla HOSPITAL
Tabla PLANTILLA
Tabla SALA
Manual SQL Server | Sentencias SQL
2. Mostrar el apellido, oficio, salario, salario anual, con las dos extras para aquellos
empleados con comisin mayor de 100000.
3. Idntico del anterior, pero para aquellos empleados que su salario anual con extras
supere los 2200000
4. Idntico del anterior, pero para aquellos empleados que sumen entre salario anual con
extras y comisin los 3 millones.
5. Mostrar todos los datos de empleados ordenados por departamento y dentro de este
por oficio para tener una visin jerrquica.
8. Igual que el anterior, para los nacidos antes de 1970 ordenados por nmero de
inscripcin descendente
9. Listar todos los datos de la plantilla del hospital del turno de maana
11. Visualizar los empleados de la plantilla del turno de maana que tengan un salario
entre 200000 y 225000.
12. Visualizar los empleados de la tabla emp que no se dieron de alta entre el 01/01/80 y
el 12/12/82.
1 SELECT * FROM EMP WHERE FECHA_ALT NOT BETWEEN '01/01/1980' AND '31/12/1982'
Manual SQL Server | Sentencias SQL
14. Mostrar aquellos empleados con fecha de alta posterior al 1 de Julio de 1985.
15. Lo mismo que en el ejercicio 14 pero con salario entre 150000 y 400000.
16. Igual que en el ejercicio 15, pero tambin incluimos aquellos que no siendo analista
pertenecen al departamento 20.
17. Mostrar aquellos empleados cuyo apellido termine en Z ordenados por departamento,
y dentro de este por antigedad.
18. De los empleados del ejercicio 17 quitar aquellos que superen los 200000 mensuales.
20. Igual que el ejercicio 19, pero mostrndolos de forma que se aprecien las diferencias
de salario dentro de cada oficio.
21. Del ejercicio 20, nos quedamos solo con aquellos cuyo nmero de empleado no este
entre 7600 y 7900.
24. Mostrar que personal No Interino existe en cada sala de cada hospital, ordenado por
hospital y sala.
Manual SQL Server | Sentencias SQL
2 FROM PLANTILLA
26. Seleccionar los distintos valores del sexo que tienen los enfermos.
2 FROM ENFERMO
27. Indicar los distintos turnos de la plantilla del hospital, ordenados por turno y por
apellido.
?
Manual SQL Server | Sentencias SQL
2 FROM PLANTILLA
28. Seleccionar las distintas especialidades que ejercen los mdicos, ordenados por
especialidad y apellido.
2 FROM DOCTOR
EJEMPLO: LIKE %een Muestra todos los caracteres que acaben con een
EJEMPLO: LIKE %een% Muestra todos los caracteres que contengan een en ese orden
EJEMPLO: LIKE _en Muestra todos los caracteres que contenga tres letras y acaben en en
EJEMPLO: LIKE [CK% ] Muestra todos los caracteres que empiecen por C o K
EJEMPLO: LIKE [S-V]ing Nombre de 4 letras cuya primera letra estuviera entre S o V y acabe en
ing
EJEMPLO: LIKE M[^c]% Todos los que empiecen por M y segunda letra no sea una c. No hay limite
de caracteres.
4. Mostrar todos los empleados cuyo nombre sea de 4 letras y su apellido termine con la letra a
5. Mostrar todos los empleados cuyo apellido comience entre las letras E y F.
6. Mostrar todos los empleados cuyo apellido comience por la letra A, contenga dentro de su
apellido de la letra A a la M y que terminen en O.
7. Mostrar todos los empleados cuyo apellido comience por la letra M y la segunda letra no sea
una A.
8. Mostrar todos los empleados cuyo apellido sea de 5 letras y su tercera letra sea entra la A y la S
terminando en Z.
9. Mostrar todos los empleados cuyo apellido sea de 6 letras y no comience entre la A y la D.
10. Mostrar todos los que empiecen por la A y cuya cuarta letra no est comprendida entre A G
Las funciones de agregado son funciones que se utilizan para calcular valores en las
tablas. Si queremos usarlas combinndolas junto con otros campos debemos
utilizar Group by y agrupar los datos que no son funciones.
Con la sentencia group by no se utiliza la clausula where, se utilizara una clausula propia
de la expresin: HAVING. Equivalente a where
AVG: Realiza la media sobre la expresin dada, debe ser un tipo de dato Int.
?
1 select avg(salario) from emp
1. Encontrar el salario medio de los analistas, mostrando el nmero de los empleados con
oficio analista.
?
1 SELECT COUNT(*) AS [NUMERO DE EMPLEADOS], OFICIO,
2. Encontrar el salario mas alto, mas bajo y la diferencia entre ambos de todos los
empleados con oficio EMPLEADO.
?
1 SELECT OFICIO, MAX(SALARIO) AS [SALARIO MAS ALTO]
?
1 SELECT OFICIO, MAX(SALARIO) AS [SALARIO MXIMO] FROM EMP GROUP BY OFICIO
?
1 SELECT DEPT_NO AS [N DE DEPARTAMENTO],
4 ORDER BY 1
Manual SQL Server | Sentencias SQL
?
1 SELECT DEPT_NO AS [N DE DEPARTAMENTO]
?
1 SELECT COUNT(*) AS [NUMERO EMPLEADOS], DEPT_NO FROM EMP
3 GROUP BY DEPT_NO
Manual SQL Server | Sentencias SQL
?
1 SELECT COUNT(*) AS [N DE PERSONAS], FUNCION FROM PLANTILLA
2 GROUP BY FUNCION
4 ORDER BY FUNCION
Manual SQL Server | Sentencias SQL
9. Calcular el salario medio, Diferencia, Mximo y Mnimo de cada oficio. Indicando el oficio y el
nmero de empleados de cada oficio.
10. Calcular el valor medio de las camas que existen para cada nombre de sala. Indicar el nombre
de cada sala y el nmero de cada una de ellas.
11. Calcular el salario medio de la plantilla de la sala 6, segn la funcin que realizan. Indicar la
funcin y el nmero de empleados.
12. Averiguar los ltimos empleados que se dieron de alta en la empresa en cada uno de los
oficios, ordenados por la fecha.
2 GROUP BY OFICIO
3 ORDER BY 1
13. Mostrar el nmero de hombres y el nmero de mujeres que hay entre los enfermos.
14. Mostrar la suma total del salario que cobran los empleados de la plantilla para cada funcin y
turno.
2 GROUP BY HOSPITAL_COD
Manual SQL Server | Sentencias SQL
2 WHERE FUNCION='ENFERMERA'
4 ORDER BY 1
Manual SQL Server | Sentencias SQL
JOIN
Se usa para combinar resultados entre varias tablas. Microsoft recomienda usar Join ya
que consume menos recursos.
Consultas Internas
Combina las tablas comparando los valores comunes de los campos indicados mediante
combinaciones cruzadas.
Sintaxis:
From TablaPrincipal
On
- Inner Join: Indica que combine los campos con resultados comunes
- Full Join: Indica que combine todos los campos aunque los resultados sean diferentes.
Ejemplos :
1 SELECT APELLIDO,OFICIO,DNOMBRE
2 FROM EMP
4 ON EMP.DEPT_NO=DEPT.DEPT_NO
ORDER BY DEPT.DNOMBRE
5
La combinacin Full Join muestra las coincidencias de la tabla Dept con Emp, ms los
valores que no coincidan, como el departamento Produccin, que no tiene empleados.
1 SELECT APELLIDO,OFICIO,DNOMBRE
Manual SQL Server | Sentencias SQL
2 FROM EMP
ON EMP.DEPT_NO=DEPT.DEPT_NO
4
ORDER BY DEPT.DNOMBRE
5
Se podra decir que es como la suma de utilizar left join y right join.
Manual SQL Server | Sentencias SQL
Consultas Externas
Al igual que las consultas de combinacin internas, combina los valores comunes de los
campos indicados y adems de la tabla que queramos, devuelve tambin el resto de
valores aunque no coincidan. Para ello usaremos las siguientes opciones combinadas con
join:
Sintaxis:
From tablaprincipal
on condicin
- Left Join: Indica que muestre todos los resultados de la columna de la izquierda
- Right Join: Indica que muestre todos los resultados de la columna de la derecha
- Cross Join: Muestra un producto cartesiano combinando todos los resultados de las dos
tablas.
Ejemplos 1:
?
SELECT APELLIDO,OFICIO,DNOMBRE
1
FROM EMP
2
LEFT OUTER JOIN DEPT
3
ON EMP.DEPT_NO=DEPT.DEPT_NO
Manual SQL Server | Sentencias SQL
4 ORDER BY DEPT.DNOMBRE
Ejemplo 2:
1 SELECT APELLIDO,OFICIO,DNOMBRE
Manual SQL Server | Sentencias SQL
2 FROM EMP
ON EMP.DEPT_NO=DEPT.DEPT_NO
4
ORDER BY DEPT.DNOMBRE
5
En esta consulta el departamento de produccin tiene valores null porque le hemos dicho
que seleccione la tabla de la derecha como principal (dept), con lo cual selecciona
todos los campos de la tabla departamentos con coincidencias con emp o sin ellas.
Ejemplo 3:
?
Manual SQL Server | Sentencias SQL
1 SELECT APELLIDO,OFICIO,DNOMBRE
2 FROM EMP
Realiza un producto cartesiano combinando todos los empleados con todos los
departamentos.
Manual SQL Server | Sentencias SQL
Manual SQL Server | Sentencias SQL
Ya hemos visto como combinar 2 tablas con inner join, el siguiente ejemplo muestra como
combinar las 3 tablas que tenemos en la base de datos. Podremos combinar tantas tablas
como queramos usando inner join o full join.
1
SELECT P.APELLIDO AS [APELLIDO]
2
,S.NOMBRE AS [SALA]
3 ,H.NOMBRE AS [HOSPITAL],
4 S.NUM_CAMA AS [N DE CAMAS]
6 ON P.HOSPITAL_COD = S.HOSPITAL_COD
Podremos usar tantos inner join como queramos en nuestras consultas, pero habr que
tener cuidado a la hora de realizar las combinaciones para que no salgan productos
cartesianos en la consulta.
Esta consulta devuelve el nombre del empleado, el nombre de la sala donde trabaja, el
nombre del hospital y el nmero de camas.
Para ello crearemos dos copias de la misma tabla ponindole un alas, para
posteriormente combinar los resultados de ambas copias.
1
SELECT A.EMP_NO AS [PRIMER EMPLEADO]
2 ,A.APELLIDO,A.DEPT_NO
4 B.APELLIDO
ON A.EMP_NO = B.EMP_NO
6
ORDER BY B.EMP_NO
7
Manual SQL Server | Sentencias SQL
Manual SQL Server | Sentencias SQL
Para poder realizar los ejercicios de consultas, con tablas combinadas mediante las
instrucciones JOIN, tanto internas como externas, necesitaremos de la base de datos
Pubs. La cual comparto tanto en diagrama como el script de la creacin e insercin de
datos. Descargenlo al final de esta publicacin o desde el indice, es necesario si deseas
seguir esta serie de ejercicios. Puedes hacer clic en la imagen para agrandarla.
Manual SQL Server | Sentencias SQL
Manual SQL Server | Sentencias SQL
1) Realizar una consulta que muestre los nombres de los autores y editores ubicados en
la misma ciudad
1
USE PUBS
2 SELECT A.AU_FNAME AS [NOMBRE]
3 ,A.AU_LNAME AS [APELLIDO]
4 ,P.PUB_NAME AS [EDITOR]
5 FROM AUTHORS AS A
ON
7
A.CITY = P.CITY
8
2) Obtener todos los nombres y editores de todos los libros cuyos anticipos pagados son
superiores a 7500
Manual SQL Server | Sentencias SQL
1
USE PUBS
2
SELECT T.TITLE AS [TITULO]
3 ,P.PUB_NAME AS [EDITOR]
4 ,T.ADVANCE AS [ANTICIPO]
5 FROM TITLES AS T
7 ON
T.PUB_ID=P.PUB_ID
8
WHERE
9
T.ADVANCE>7500
10
3) Seleccionar todos los titulos, nombre y apellidos del autor de todos los libros de cocina
tradicional.
?
SELECT A.AU_LNAME AS [NOMBRE]
1
,A.AU_FNAME AS [APELLIDO]
2
,T.TITLE AS [TITULO]
3
FROM AUTHORS AS A
Manual SQL Server | Sentencias SQL
5 ON
A.AU_ID=TA.AU_ID
6
INNER JOIN TITLES AS T
7
ON
8
TA.TITLE_ID=T.TITLE_ID
9
WHERE T.TYPE= 'TRAD_COOK'
10
11
?
SELECT A.AU_LNAME AS [NOMBRE]
1
,A.AU_FNAME AS [APELLIDO]
2
,P.PUB_NAME AS [EDITOR]
3
FROM AUTHORS AS A
4
LEFT JOIN PUBLISHERS AS P
5
ON
Manual SQL Server | Sentencias SQL
6 A.CITY=P.CITY
5) Recuperar los ttulos y el ndice del almacn de todos los libros que vendieron ms de
25 unidades.
2 ,T.TITLE AS [TITULO]
Manual SQL Server | Sentencias SQL
3 FROM TITLES AS T
ON
5
T.TITLE_ID = S.TITLE_ID
6
WHERE
7
S.QTY>25
8
6) Modificacin al ejercicio anterior: incluir tambin los ttulos de aquellos libros que no
superaron las 25 unidades en sus ventas
2 ,T.TITLE AS [TITULO]
3 FROM TITLES AS T
5 ON
7) Realizar una consulta que devuelva el titulo, editorial y autor de cada libro.
,A.AU_LNAME AS [AUTOR]
2
,P.PUB_NAME AS [EDITOR]
3
FROM PUBLISHERS AS P
4
INNER JOIN TITLES AS T
5
ON
6
T.PUB_ID = P.PUB_ID
7 INNER JOIN TITLEAUTHOR AS TA
8 ON
Manual SQL Server | Sentencias SQL
9 TA.TITLE_ID = T.TITLE_ID
ON
11
TA.AU_ID = A.AU_ID
12
13
Manual SQL Server | Sentencias SQL
1
SELECT E.APELLIDO
2
,E.OFICIO
3 ,E.SALARIO
4 ,D.DEPT_NO AS [N DEPT]
5 ,DNOMBRE AS [DEPARTAMENTO]
6 FROM EMP AS E
2. Mostrar todos los nombres de Hospital con sus nombres de salas correspondientes.
Manual SQL Server | Sentencias SQL
4 S.HOSPITAL_COD = H.HOSPITAL_COD
2 ,D.LOC AS [CIUDAD]
3 FROM EMP AS E
5 ON D.DEPT_NO = E.DEPT_NO
GROUP BY D.LOC
6
Manual SQL Server | Sentencias SQL
4. Visualizar cuantas personas realizan cada oficio en cada departamento mostrando el nombre
del departamento.
1
SELECT D.DNOMBRE AS [N DEPARTAMENTO]
2 ,COUNT(*) AS [N DE PERSONAS]
3 ,E.OFICIO
4 FROM EMP E
ON E.DEPT_NO = D.DEPT_NO
6
GROUP BY E.DEPT_NO, E.OFICIO,D.DNOMBRE
7
Manual SQL Server | Sentencias SQL
5. Contar cuantas salas hay en cada hospital, mostrando el nombre de las salas y el nombre del
hospital.
1
SELECT COUNT(S.NOMBRE) AS [NUMERO DE SALAS]
2 ,S.NOMBRE AS [SALA]
3 ,H.NOMBRE AS [HOSPITAL]
4 FROM SALA AS S
ON H.HOSPITAL_COD = S.HOSPITAL_COD
6
GROUP BY S.NOMBRE,H.NOMBRE
7
2 ,D.DNOMBRE AS [DEPARTAMENTO]
Manual SQL Server | Sentencias SQL
3 FROM EMP E
ON D.DEPT_NO = E.DEPT_NO
5
GROUP BY D.DNOMBRE
6
1
SELECT D.DNOMBRE AS [DEPARTAMENTO]
2 ,COUNT(*) AS [N DE PERSONAS]
3 FROM EMP E
5 ON E.DEPT_NO = D.DEPT_NO
GROUP BY D.DEPT_NO,D.DNOMBRE
6
HAVING COUNT(*) >= 4
7
Manual SQL Server | Sentencias SQL
8. Calcular el valor medio de las camas que existen para cada nombre de sala. Indicar el nombre de
cada sala y el codigo de cada una de ellas.
2 ,NOMBRE
3 ,SALA_COD
4 FROM SALA
GROUP BY NOMBRE,SALA_COD
5
4 ON D.DEPT_NO = E.DEPT_NO
GROUP BY D.LOC
5
Manual SQL Server | Sentencias SQL
10. Mostrar los doctores junto con el nombre de hospital en el que ejercen, la direccin y el
telfono del mismo.
1
SELECT D.APELLIDO
2 ,H.NOMBRE
3 ,H.DIRECCION
4 ,H.TELEFONO
5 FROM DOCTOR D
11. Mostrar los nombres de los hospitales junto con el mejor salario de los empleados de cada
hospital.
3 FROM PLANTILLA P
5 ON P.HOSPITAL_COD = H.HOSPITAL_COD
GROUP BY H.NOMBRE
6
12. Visualizar el nombre de los empleados de la plantilla junto con el nombre de la sala, el nombre
del hospital y el nmero de camas libres de cada una de ellas.
ON H.HOSPITAL_COD = P.HOSPITAL_COD
8
13. Visualizar el mximo salario, mnimo salario de los empleados dependiendo de la ciudad en la
que trabajen. Indicando el nmero total de trabajadores por ciudad.
1
SELECT COUNT(E.EMP_NO) AS [N DE TRABAJADORES]
2 ,D.LOC AS [CIUDAD]
5 FROM EMP E
ON E.DEPT_NO = D.DEPT_NO
7
GROUP BY D.LOC
8
Manual SQL Server | Sentencias SQL
14. Averiguar la combinacin de que salas podra haber por cada uno de los hospitales.
3 FROM SALA AS S
15. Mostrar el Numero de empleado, apellido, oficio y Nombre del departamento de los
empleados, junto al Nmero de empleado, apellido, oficio y Nombre del departamento de sus
subordinados respectivamente, para obtener una visin jerarquica de la empresa.
1
SELECT A.EMP_NO AS [N DE EMPLEADO]
2
,A.APELLIDO AS [JEFE], A.OFICIO
3
,D.DNOMBRE AS [DEPARTAMENTO]
4
,B.EMP_NO AS [N EMPLEADO]
5 ,B.APELLIDO AS [SUBORDINADO]
6 ,B.OFICIO
7 ,D.DNOMBRE AS [DEPARTAMENTO]
8 FROM EMP AS A
ON B.DIR = A.EMP_NO
10
INNER JOIN DEPT AS D
11
ON A.DEPT_NO = D.DEPT_NO
12
AND B.DEPT_NO = D.DEPT_NO
13
ORDER BY B.DIR
14
Manual SQL Server | Sentencias SQL
Ejemplo:
1
SELECT APELLIDO,
2 OFICIO AS
3 'OFICIO/FUNCION'
5 UNION
6 SELECT APELLIDO,
2 ,E.APELLIDO
2 ,APELLIDO
Manual SQL Server | Sentencias SQL
3 ,SALARIO
AS DIFERENCIA
5
FROM EMP
6
WHERE OFICIO = 'EMPLEADO'
7
2 FROM EMP AS E
3 WHERE 20 <
Se debe utilizar antes una combinacin que una subconsulta, la combinacin sera asi, dando los
mismos resultados:
3 ON E1.OFICIO = E2.OFICIO
2 FROM EMP AS E1
Esta es la consulta utilizando el HAVING, que es la que deberamos utilizar antes que una
subconsulta de simulacin HAVING:
2 FROM EMP AS E1
4 ON E1.OFICIO = E2.OFICIO
2 FROM DEPT AS D
Recomendaciones:
Manual SQL Server | Sentencias SQL
Saludos seguidores del manual SQL Server. A continuacin los ejercicios de subconsultas
utilizando la Base de Datos Hospital. Descarguen el script de la BD en el ndice si an no
la tienen.
?
1 SELECT EMP_NO,APELLIDO,
?
1 SELECT EMP_NO,APELLIDO,
3. Visualizar el apellido y el oficio de los empleados con el mismo oficio que Jimnez.
?
1 SELECT APELLIDO, OFICIO FROM EMP WHERE
?
1 SELECT APELLIDO, OFICIO, SALARIO, DEPT_NO FROM EMP WHERE SALARIO >
2 (SELECT
?
Manual SQL Server | Sentencias SQL
1
SELECT E.APELLIDO, E.OFICIO AS [CARGO EN EMPRESA], D.DNOMBRE AS [OFICINA]
2
FROM EMP AS E
3
INNER JOIN DEPT AS D
4
ON E.DEPT_NO = D.DEPT_NO<
5
UNION
6 SELECT P.APELLIDO, P.FUNCION, S.NOMBRE
7 FROM PLANTILLA AS P
9 ON P.HOSPITAL_COD = S.HOSPITAL_COD
UNION
11
SELECT D.APELLIDO, D.ESPECIALIDAD, H.NOMBRE
12
FROM DOCTOR AS D
13
INNER JOIN HOSPITAL AS H
14
ON D.HOSPITAL_COD = H.HOSPITAL_COD
15
ORDER BY 3
16
Manual SQL Server | Sentencias SQL
?
Manual SQL Server | Sentencias SQL
2 UNION
4 ORDER BY 2 DESC
7. Mostrar apellidos y oficio de los empleados del departamento 20 cuyo trabajo sea el
mismo que el de cualquier empleado de ventas.
?
Manual SQL Server | Sentencias SQL
4 ORDER BY 2
8. Mostrar los empleados que tienen mejor salario que la media de los directores, no
incluyendo al presidente.
?
1 SELECT * FROM EMP WHERE SALARIO >
?
1 SELECT APELLIDO, FUNCION, SALARIO, HOSPITAL_COD FROM PLANTILLA WHERE
2 (FUNCION
10. Visualizar los datos de los hospitales que tienen personal (Doctores) de cardiologa.
?
1 SELECT * FROM HOSPITAL WHERE HOSPITAL_COD IN (SELECT HOSPITAL_COD FROM
11. Visualizar el salario anual de los empleados de la plantilla del Hospital Provincial y
General.
?
1 SELECT APELLIDO, FUNCION, SALARIO * 12 AS [SALARIO ANUAL] FROM PLANTILLA
3 NOMBRE =
12. Mostrar el apellido de los enfermos que nacieron antes que el Seor Miller.
?
1 SELECT APELLIDO FROM ENFERMO WHERE FECHA_NAC < (SELECT FECHA_NAC
2 FROM
Variables
Definidas en una instruccin DECLARE (Con una sola @)
Valores asignados con instruccin SET o SELECT (Con una sola @)
mbito global o local
Sintaxis:
Bucles
Nivel de instruccin:
Bloques BEGIN......END
Bloques IF.............ELSE
Construcciones WHILE
Ejemplos:
1
--IF
2 DECLARE @N INT
3 SET @N = 5
4 IF (@N % 2)= 0
5 PRINT 'PAR'
ELSE
6
PRINT 'IMPAR'
7
1
--BUCLES
2
DECLARE @N INT
3 SET @N = 1
4 WHILE @N < 10
5 BEGIN
6 IF (@N % 2) = 0
SELECT @N AS NUMERO
7
SET @N = @N + 1
8
END
9
Manual SQL Server | Sentencias SQL
Las expresiones a nivel de fila evalan un resultado devuelto por la consulta y dependiendo de los
valores que utilicemos lo sustituyen para mejorar la presentacin de los datos.
1
CASE expresion
2 WHEN valor1 THEN resultado1
3 ELSE resultadoN
4 END
5 CASE
ELSE resultado2
7
END
8
Manual SQL Server | Sentencias SQL
1
--CASE
2
DECLARE @N INT
3
SET @N = 1
4
WHILE (@N<100)
5 BEGIN
8 'IMPAR'
ELSE
9
'PAR'
10
END AS 'TIPO'
11
SET @N = @N + 1
12
END
13
Manual SQL Server | Sentencias SQL
EJEMPLO:
Esto se puede utilizar tambin para inicializar variables. Es el mismo caso pero utilizando el CASE
para inicializar una variable.
15
CONVERT se usa para convertir el numero a una cadena de dos caracteres y lo concatenamos con
@tipo.
1
DECLARE @N INT,@TIPO CHAR(10)
2
SET @N = 5
3
IF (@N BETWEEN 4 AND 6)
4
BEGIN
5
WHILE (@N > 0)
6 BEGIN
9 ELSE 'PAR'
10 END
3 ELSE
4 'SE MANTIENE'
5 END
2. Debemos hacer recortes de salario en la empresa, para ello debemos saber a que personas
recortaremos el sueldo, cuales se mantendrn y cuales subiremos el puesto. Utilizar todos los
empleados de la empresa(Plantilla y Empleados)
Cuando el salario sea menor de 100000, Subiremos sueldo, cuando est entre 100000 y 250000 lo
mantendremos y cuando sea superior, lo bajaremos.
?
Manual SQL Server | Sentencias SQL
1
SELECT APELLIDO, SALARIO, 'ACCION' = CASE
2
WHEN SALARIO < 100000 THEN 'SUBIR SUELDO'
3
WHEN SALARIO BETWEEN 150000 AND 250000 THEN 'MANTENER SUELDO'
4
ELSE
5
'BAJAR SUELDO'
6 END
7 FROM EMP
8 UNION
3. Queremos saber que empleados de la plantilla trabajan en turno de tarde, noche o en otros,
para ello mostraremos Tarde o Noche dependiendo de sus valores.
5 END
6 FROM PLANTILLA
4. Queremos cambiar de localidad en Barcelona, para ello tenemos que saber qu empleados
cambiarian de localidad y cales no. Combinar tablas y mostrar el nombre del departamento junto
a los datos del empleado.
1
SELECT D.DNOMBRE AS [DEPARTAMENTO]
2 ,E.APELLIDO,'CAMBIAR DE LOCALIDAD' = CASE
4 ELSE
6 END
1
SELECT COUNT(E.EMP_NO) AS [N DE TRABAJADORES],
2 D.LOC AS [CIUDAD],'CAMBIAR' = CASE
5 END
ON D.DEPT_NO = E.DEPT_NO
7
GROUP BY D.LOC
8
Manual SQL Server | Sentencias SQL
17 'HOMBRE'
18 END
FROM ENFERMO
19
ORDER BY FECHA_NAC,S
20
21
22
7. Mostrar el apellido, el salario, el oficio y el nombre del departamento de todos los empleados
aunque no tengan departamento. Si no tienen departamento mostrar que no tienen
departamento. Mostrar adems si tienen comisin o si no tienen comisin.
SELECT E.APELLIDO,E.OFICIO,E.SALARIO
1
,DEPARTAMENTO =
2
ISNULL(D.DNOMBRE,'SIN DEPARTAMENTO')
3
,COMISION = CASE COMISION
4
WHEN 0 THEN 'SIN COMISION'
5
ELSE
Manual SQL Server | Sentencias SQL
6 'CON COMISION'
7 END
FROM EMP E
8
LEFT JOIN DEPT D
9
ON E.DEPT_NO = D.DEPT_NO
10
ORDER BY D.DNOMBRE
11
12
8. Mostrar todas las camas que existen para cada hospital y cada sala. Mostrar el nombre del
hospital, las salas y su nmero de camas. Si no hubiese camas para algn hospital las dejar a 0.
Tambin mostrar que son muchas camas cuando sean ms de 90, buen nmero cuando sean
mayores de 40 y pocas camas para las dems.
?
Manual SQL Server | Sentencias SQL
1
SELECT H.NOMBRE AS [HOSPITAL]
2
,ISNULL(S.NUM_CAMA,0) AS [N DE CAMAS]
3
,S.NOMBRE AS [SALAS]
4
,CAMAS = CASE
5 WHEN S.NUM_CAMA > 90 THEN'DEMASIADAS CAMAS'
7 ELSE
8 'POCAS CAMAS'
9 END
FROM SALA AS S
10
FULL JOIN HOSPITAL AS H
11
ON H.HOSPITAL_COD = S.HOSPITAL_COD
12
GROUP BY H.NOMBRE,S.NUM_CAMA,S.NOMBRE
13
ORDER BY H.NOMBRE,S.NUM_CAMA
14
Manual SQL Server | Sentencias SQL
9. Seleccionar qu empleados estn dentro de la media y cuales estn por debajo de la media,
mostrando el apellido, oficio, salario, comisin y el nombre de los departamentos. No dejar ningn
campo a NULL.
1
DECLARE @MEDIA INT
2
SELECT @MEDIA = AVG(SALARIO) FROM EMP<
3
SELECT E.APELLIDO,E.OFICIO,E.SALARIO,E.COMISION
4
,MEDIA = CASE
5 WHEN SALARIO > @MEDIA THEN 'DENTRO DE LA MEDIA'
6 ELSE
8 END
FROM EMP AS E
10
LEFT JOIN DEPT D
11
ON E.DEPT_NO = D.DEPT_NO
12
GROUP BY E.APELLIDO,E.OFICIO,E.SALARIO,E.COMISION,D.DNOMBRE
13
ORDER BY MEDIA
14
Manual SQL Server | Sentencias SQL
Manual SQL Server | Sentencias SQL
year yy , yyyy
quarter qq , q
month mm , m
dayofyear dy , y
day dd , d
week wk , ww
weekday dw
hour hh
minute mi, n
second ss , s
millisecond ms
microsecond mcs
nanosecond ns
TZoffset tz
GetDate
Funcion que recupera la fecha actual del sistema.
1 select getdate()
Manual SQL Server | Sentencias SQL
Convert, Cast
Convierten explcitamente una expresin de un tipo de datos en otro. CAST y CONVERT
proporcionan funciones similares.
Convert(Tipodedatosdestino, Origen, Estilo)
Ejemplo:
SET @N = 1
2
SET @PALABRA ='NMERO'
3
PRINT CONVERT(NVARCHAR(2),@N) + ' ' + @PALABRA
4
PRINT CAST(@N AS NVARCHAR(2)) + ' ' + @PALABRA
5
WHILE (@N<11)
6
BEGIN
7 PRINT CONVERT(NVARCHAR(2),@N) + ' ' + @PALABRA
9 SET @N = @N + 1
10 END
11
DateName
Devuelve una cadena de caracteres que representa la parte de la fecha especificada de la
fecha especificada Los calculos para las horas no son exactos cuando se trata de
SmallDateTime, por lo que devuelve 0.
?
1 SELECT DATENAME(MONTH,FECHA_ALT) AS 'NOMBRE MES SIN ABREVIATURA'
Manual SQL Server | Sentencias SQL
2 FROM EMP
4
SELECT DATENAME(M,FECHA_ALT) AS 'NOMBRE MES CON ABREVIATURA'
5
FROM EMP
6
WHERE EMP_NO = 7876
7
8
SELECT DATENAME(WEEK,FECHA_ALT) AS 'NUMERO SEMANA SIN ABREVIATURA'
9
FROM EMP
10
WHERE EMP_NO = 7876
11
13 FROM EMP
15
FROM EMP
17
WHERE EMP_NO=7876
18
19
SELECT DATENAME(DW,FECHA_ALT) AS 'DIA SEMANA CON ABREVIATURA'
20
FROM EMP
21
WHERE EMP_NO=7876
22
23
Manual SQL Server | Sentencias SQL
Horas:
?
SELECT DATENAME(MI,FECHA_ALT) AS 'MINUTOS CON ABREVIATURA'
1
FROM EMP
2
WHERE EMP_NO = 7876
3
4
SELECT DATENAME(MINUTE,GETDATE()) AS 'MINUTOS SIN ABREVIATURA'
5
6
SELECT DATENAME(MI,GETDATE()) AS 'MINUTOS CON ABREVIATURA'
7
8
SELECT DATENAME(HH,FECHA_ALT) AS 'HORA CON ABREVIATURA'
9
FROM EMP
10 WHERE EMP_NO = 7876
Manual SQL Server | Sentencias SQL
11
13
15
DatePart
Devuelve la parte de la fecha u hora indicada.
?
1 SELECT DATEPART(MM,FECHA_ALT) AS 'MES',APELLIDO FROM EMP
4
Manual SQL Server | Sentencias SQL
Nombres de Fechas:
Day(fecha)
?
Manual SQL Server | Sentencias SQL
1
SELECT DAY(GETDATE()) AS DIA
2
9 SELECT YEAR(GETDATE()) AS AO
10
11 SELECT YEAR(FECHA_ALT) AS AO
FROM EMP
12
WHERE EMP_NO = 7876
13
Manual SQL Server | Sentencias SQL
DateAdd
Aade un nmero a la fecha puesta
DateDiff
Devuelve la diferencia entre dos fechas en el intervalo que le indiquemos.
Sintaxis:
1 SELECT DATEDIFF(YYYY,FECHA_ALT,GETDATE())
3 FROM EMP
ABS
Obtiene el valor Absoluto
CEILING
Devuelve el entero ms pequeo mayor o igual que la expresin numrica dada.
FLOOR
Devuelve el entero ms grande menor o igual que la expresin numrica dada.
POWER
Devuelve el valor de la expresin indicada elevada a la potencia especificada.
RAND
Devuelve un valor float aleatorio de 0 a 1.
Las llamadas repetitivas de RAND() en una nica consulta producirn el mismo valor.
ROUND
Devuelve una expresin numrica, redondeada a la longitud o precisin especificada.
ROUND siempre devuelve un valor. Si length es un valor negativo y mayor que el nmero de
dgitos anteriores al separador decimal, ROUND devuelve 0.
1 SELECT ROUND(123.4567,2)
3 SELECT ROUND(123.4567,-2)
5 SELECT ROUND(123.4567,0)
7 SELECT ROUND(123.4567,-3)
Manual SQL Server | Sentencias SQL
SIGN
Devuelve el signo positivo (+1), cero (0) o negativo (-1) de la expresin especificada.
Dice el valor negativo, positivo o neutro (0) del valor especificado
1 SELECT SIGN(-3)
3 SELECT SIGN(3)
5 SELECT SIGN(0)
SQUARE
Devuelve el cuadrado de la expresin especificada.
SQRT
Devuelve la raz cuadrada de la expresin especificada.
ASCII
Devuelve el cdigo ASCII del carcter ms a la izquierda de una expresin de caracteres.
CHAR
Una funcin de cadena que convierte un cdigo ASCII int en un carcter.
CHARINDEX
Devuelve la posicin inicial de la expresin especificada en una cadena de caracteres.
Argumentos:
expression1
Es una expresin que contiene la secuencia de caracteres que se desea
buscar. Expression1 es una expresin del tipo de cadenas cortas de caracteres.
Expression2
Es una expresin, normalmente una columna,
en la que se busca la cadena especificada. Expression2 es de la categora del tipo de
datos cadena de caracteres.
start_location
Es la posicin del carcter de expression2 en el que se empieza la
bsqueda de expression1.
?
Manual SQL Server | Sentencias SQL
LEFT
Devuelve la parte de una cadena de caracteres que comienza en un nmero de
caracteres especificado a partir de la izquierda
1 SELECT LEFT('murcielago',5)
RIGHT
Devuelve la parte de una cadena de caracteres que comienza en el nmero de caracteres
especificado en integer_expression a partir de la derecha.
Manual SQL Server | Sentencias SQL
LEN
Cuenta el nmero de caracteres que se incluyen en la cadena.
1 SELECT LEN('murcielago')
LOWER
Convierte a Minsculas la cadena especificada
UPPER
Convierte a Maysculas la cadena especificada
RTRIM y LTRIM
Elimina los espacios que existen a la izquierda y a la derecha respectivamente.
REPLACE
Reemplaza por una tercera expresin todas las apariciones de la segunda expresin de
cadena proporcionada en la primera expresin de cadena
SPACE
Coloca el nmero de espacios que se le indiquen para entre una cadena de caracteres.
SUBSTRING
Devuelve parte de una expresin de caracteres, binaria, de texto o de imagen.
Sintaxis:
Manual SQL Server | Sentencias SQL
Argumentos:
expression
Es una cadena de caracteres, cadena binaria, texto, imagen,
columna o expresin que incluye una columna.
No deben usarse expresiones que incluyan funciones de agregado.
start
Es un entero que especifica el punto en que comienza la subcadena.
length
Es un entero que especifica la longitud de la subcadena (el nmero de caracteres o bytes
que se devuelven).
REVERSE
Devuelve invertida una expresin de carcter.
?
Manual SQL Server | Sentencias SQL
1 SELECT REVERSE('hola')
REPLICATE
Repite una expresin de caracteres un nmero especificado de veces.
STUFF
Elimina el nmero de caracteres especificado e inserta otro conjunto de caracteres en un
punto de inicio indicado.
ParteNombre es un valor de tipo Int que coge unos determinados valores del
NombreObjeto:
1 Objeto.
2 Propietario
3 Base de Datos
4 Servidor
SYSTEM_USER
Manual SQL Server | Sentencias SQL
USER_NAME()
1 SELECT USER_NAME()
Si el Salario es nulo devolver la comisin, y si los dos son nulos, devolver un campo
null.
Manual SQL Server | Sentencias SQL
Referencia Bibliogrfica
http://www.ingenieriasystems.com/2014/01/Manual-de-Microsoft-SQL-Server-Full-Transact-
SQL.html