Guest User

Untitled

a guest
Apr 10th, 2018
123
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 11.95 KB | None | 0 0
  1. -- 0.- Creamos la Base de Datos
  2. CREATE DATABASE Vuelos
  3. GO
  4. USE Vuelos
  5. GO
  6.  
  7. -- 2.- Creamos la tabla AVIONES
  8. CREATE TABLE AVIONES (
  9. TIPO varchar(3),
  10. CAPACIDAD int,
  11. LONGITUD float,
  12. ENVERGADURA float,
  13. VELOCIDAD float,
  14. CONSTRAINT PK_TIPO PRIMARY KEY (TIPO)
  15. )
  16.  
  17. -- 1.- Creamos la tabla VUELOS
  18. CREATE TABLE VUELOS (
  19. NUM_VUELO varchar(10) PRIMARY KEY,
  20. ORIGEN varchar(20) NOT NULL,
  21. DESTINO varchar(20) NOT NULL,
  22. HORA_SALIDA time,
  23. TIPO_AVION varchar(3) DEFAULT '72S'
  24. CHECK (TIPO_AVION IN ('320','73S','72S','737','D9S','747')),
  25. CONSTRAINT FK_AVIONES_VUELOS FOREIGN KEY (TIPO_AVION) REFERENCES AVIONES(TIPO)
  26. )
  27.  
  28. -- 2.- Creamos la tabla RESERVAS
  29. CREATE TABLE RESERVAS (
  30. NUM_VUELO varchar(10),
  31. FECHA_SALIDA date,
  32. PLAZAS_LIBRES int,
  33. CONSTRAINT PK_NUM_VUELO PRIMARY KEY (NUM_VUELO, FECHA_SALIDA),
  34. CONSTRAINT FK_VUELOS_RESERVAS FOREIGN KEY (NUM_VUELO) REFERENCES VUELOS(NUM_VUELO)
  35. )
  36.  
  37. -- 3.- Insertamos los datos en la tabla AVIONES
  38. INSERT INTO AVIONES VALUES ('D9S','110','38.3','28.5','815')
  39. INSERT INTO AVIONES VALUES ('320','187','42.15','32.6','853')
  40. INSERT INTO AVIONES VALUES ('72S','160','36.2','25.2','820')
  41. INSERT INTO AVIONES VALUES ('73S','185','44.1','30.35','815')
  42. INSERT INTO AVIONES VALUES ('737','172','38','90.29','793')
  43.  
  44. -- 3.- Insertamos los datos en la tabla VUELOS
  45. INSERT INTO VUELOS VALUES ('IB600','Madrid','Londres','10:30:00','320')
  46. INSERT INTO VUELOS VALUES ('BA467','Madrid','Londres','20:40:00','73S')
  47. INSERT INTO VUELOS VALUES ('IB0640','Madrid','Barcelona','06:45:00','320')
  48. INSERT INTO VUELOS VALUES ('IB3742','Madrid','Barcelona','09:15:00',DEFAULT)
  49. INSERT INTO VUELOS VALUES ('LH1349','Copenhague','Francfort','10:20:00','320')
  50. INSERT INTO VUELOS VALUES ('AF577','Bilbao','París','10:10:00','737')
  51. INSERT INTO VUELOS VALUES ('IB3709','Dublín','Barcelona','14:35:00','D9S')
  52. INSERT INTO VUELOS VALUES ('IB778','Barcelona','Roma','09:45:00',DEFAULT)
  53. INSERT INTO VUELOS VALUES ('IB721','Barcelona','Sevilla','16:40:00',DEFAULT)
  54. INSERT INTO VUELOS VALUES ('IB023','Madrid','Tenerife','21:20:00',DEFAULT)
  55. INSERT INTO VUELOS VALUES ('IB368','Málaga','Barcelona','22:25:00','D9S')
  56. INSERT INTO VUELOS VALUES ('IB610','Málaga','Londres','15:05:00','73S')
  57. INSERT INTO VUELOS VALUES ('IB510','Sevilla','Madrid','07:45:00',DEFAULT)
  58. INSERT INTO VUELOS VALUES ('IB318','Sevilla','Madrid','10:45:00',DEFAULT)
  59. INSERT INTO VUELOS VALUES ('IB327','Madrid','Sevilla','18:05:00',DEFAULT)
  60.  
  61. -- 3.- Insertamos datos en la tabla RESERVAS
  62. INSERT INTO RESERVAS VALUES ('IB600','20/02/2005','46')
  63. INSERT INTO RESERVAS VALUES ('IB600','21/02/2005','80')
  64. INSERT INTO RESERVAS VALUES ('IB600','22/02/2005','91')
  65. INSERT INTO RESERVAS VALUES ('BA467','20/02/2005','32')
  66. INSERT INTO RESERVAS VALUES ('BA467','21/02/2005','89')
  67. INSERT INTO RESERVAS VALUES ('BA467','22/02/2005','79')
  68. INSERT INTO RESERVAS VALUES ('IB0640','20/02/2005','15')
  69. INSERT INTO RESERVAS VALUES ('IB0640','21/02/2005','21')
  70. INSERT INTO RESERVAS VALUES ('IB0640','22/02/2005','39')
  71. INSERT INTO RESERVAS VALUES ('IB3709','20/02/2005','60')
  72. INSERT INTO RESERVAS VALUES ('IB3709','21/02/2005','72')
  73. INSERT INTO RESERVAS VALUES ('IB3709','22/02/2005','85')
  74. INSERT INTO RESERVAS VALUES ('IB510','20/02/2005','19')
  75. INSERT INTO RESERVAS VALUES ('IB510','21/02/2005','31')
  76. INSERT INTO RESERVAS VALUES ('IB510','22/02/2005','40')
  77.  
  78. -- 4.- Obtener el tipo de avión, capacidad, longitud y destino de los
  79. -- que van a Barcelona ordenador por la capacidad del avión.
  80. SELECT a.TIPO, a.CAPACIDAD, a.LONGITUD, v.DESTINO
  81. FROM AVIONES a JOIN VUELOS v
  82. ON a.TIPO = v.TIPO_AVION
  83. WHERE v.DESTINO = 'Barcelona'
  84. ORDER BY CAPACIDAD
  85.  
  86. -- 5.- Crear el índice denominado IXVUELOS para las columnas origen y destino ascendente.
  87. CREATE INDEX IXVUELOS ON VUELOS(origen ASC, destino ASC)
  88.  
  89. -- 6.- Hallar cuantos vuelos hay en cada destino (indicando la ciudad)
  90. -- y la hora del vuelo más temprano, sin considerar orígenes de Málaga
  91. -- ni destinos a Tenerife. Sólo deben aparecer las ciudades que tienen más de un vuelo
  92. SELECT DESTINO AS Ciudad, COUNT(DESTINO) AS Vuelos, MIN(HORA_SALIDA) AS Vuelo_Mas_Pronto
  93. FROM VUELOS WHERE ORIGEN <> 'Malaga' AND DESTINO <> 'Tenerife'
  94. GROUP BY DESTINO HAVING COUNT(*) > 1
  95.  
  96. -- 7.- Insertar en una tabla denominada aviones_grandes los aviones que tengan
  97. -- una capacidad mayor o igual que 172 plazas, ordenados por la longitud del avión.
  98. -- aviones_grandes tiene los mismos atributos que aviones excepto el atributo
  99. -- denominado velocidad_crucero que no lo tiene
  100. SELECT TIPO, CAPACIDAD, LONGITUD, ENVERGADURA INTO aviones_grandes FROM AVIONES
  101. WHERE CAPACIDAD >= 172 ORDER BY LONGITUD
  102.  
  103. -- 8.- Reducir la capacidad de los aviones un 10%.+
  104. UPDATE AVIONES SET CAPACIDAD = CAPACIDAD - (CAPACIDAD * 10) / 100
  105.  
  106. -- 9.- Crear la vista vista_vuelos con las columnas v_origen, v_destino, v_fecha_salida,
  107. -- v_hora_salida,v_plazas_libres.
  108. CREATE VIEW vista_vuelos (v_origen, v_destino, v_fecha_salida, v_hora_salida, v_plazas_libres) AS
  109. SELECT origen, destino, fecha_salida, hora_salida, plazas_libres
  110. FROM VUELOS v JOIN RESERVAS r ON v.NUM_VUELO = r.NUM_VUELO
  111.  
  112. SELECT * FROM vista_vuelos
  113.  
  114. -- 10.- Dar el permiso select y update sobre plazas_libres al grupo operador_reservas
  115. -- sobre la tabla reservas. Previamente crear el grupo, dos usuarios usuario1 y
  116. -- usuario2 y hacerlos miembros del grupo. Comprobar
  117. create login Vuelos with password = 'Vuelos'
  118. create login Vuelos2 with password = 'Vuelos2'
  119. create role operador_reservas
  120. create user usuario1 from login Vuelos
  121. create user usuario2 from login Vuelos2
  122. exec sp_addrolemember 'operador_reservas',usuario1
  123. exec sp_addrolemember 'operador_reservas',usuario2
  124.  
  125. GRANT SELECT, UPDATE on reservas(plazas_libres) to operador_reservas
  126.  
  127. execute as user='usuario1'
  128. UPDATE RESERVAS SET PLAZAS_LIBRES = PLAZAS_LIBRES - 1
  129. SELECT PLAZAS_LIBRES FROM RESERVAS
  130. revert
  131.  
  132. -- 11.- Quitar el permiso update anterior. Comprobar
  133. REVOKE UPDATE on reservas(plazas_libres) to operador_reservas
  134.  
  135. execute as user='usuario1'
  136. UPDATE RESERVAS SET PLAZAS_LIBRES = PLAZAS_LIBRES - 1
  137. revert
  138.  
  139. -- 12.- Modificar el tipo de avión del vuelo Málaga-Londres de las 15:05 poniendo D9S.
  140. UPDATE VUELOS SET TIPO_AVION = 'D9S' WHERE ORIGEN = 'Málaga' AND DESTINO = 'Londres'
  141.  
  142. -- 13.- Borrar todas las reservas que tengan menos de 50 plazas libres.
  143. DELETE FROM RESERVAS WHERE PLAZAS_LIBRES < 50
  144.  
  145. -- 14.- Indicar tipo de avión y capacidad de aquellos modelos que han sido asignados
  146. -- a todos los orígenes posibles
  147.  
  148. -- 15.- ¿Cuántas plazas libres existen en los vuelos de los próximos 3 meses?
  149. SELECT PLAZAS_LIBRES FROM RESERVAS
  150. WHERE DATEDIFF(MONTH,GETDATE(),FECHA_SALIDA) BETWEEN 0 AND 3
  151.  
  152. -- 16.- Actualizar la capacidad de los aviones sumándole 6 plazas a aquellos
  153. -- cuya envergadura sea mayor de 30m.
  154. UPDATE AVIONES SET CAPACIDAD = CAPACIDAD + 6 WHERE ENVERGADURA > 30
  155.  
  156. -- 17.- Recuperar las reservas cuyo número de plazas libres es mayor que la
  157. -- media para ese mismo vuelo.
  158. SELECT * FROM RESERVAS WHERE PLAZAS_LIBRES IN (SELECT AVG(PLAZAS_LIBRES) FROM RESERVAS)
  159.  
  160. -- 18.- ¿Qué vuelos de Iberia tienen en total más de 150 plazas libres?
  161. SELECT NUM_VUELO FROM RESERVAS WHERE PLAZAS_LIBRES > 150 AND SUBSTRING(NUM_VUELO,1,2) = 'IB'
  162.  
  163. -- 19.- Modificar la tabla de reservas y añadir las columnas libres_primera
  164. -- y libres_turista de tipo smallint.
  165. ALTER TABLE RESERVAS ADD libres_primera smallint, libres_turista smallint
  166.  
  167. -- 20.- Recuperar el nº de vuelo y la hora de salida de todos los vuelos que
  168. -- hacen el trayecto Madrid-Londres.
  169. SELECT NUM_VUELO, HORA_SALIDA FROM VUELOS WHERE ORIGEN = 'Madrid' AND DESTINO = 'Londres'
  170.  
  171. -- 21.- Cargar en una nueva tabla todas las ciudades sean de origen o de destino.
  172. SELECT ORIGEN, DESTINO INTO Ciudades FROM VUELOS
  173.  
  174. -- 22.- Modificar el tipo de datos del atributo hora_salida cambiándolo
  175. -- de datetime a smalldatetime.
  176. ALTER TABLE VUELOS ALTER COLUMN HORA_SALIDA SMALLDATETIME
  177.  
  178. -- 23.- Seleccionar el total de plazas libres por cada num_vuelo
  179. -- de aquellos vuelos de Iberia.
  180. SELECT PLAZAS_LIBRES, NUM_VUELO FROM RESERVAS WHERE SUBSTRING(NUM_VUELO,1,2) = 'IB'
  181.  
  182. -- 24.- ¿Qué vuelos tienen su salida hacia Madrid las dos próximas horas?
  183. SELECT HORA_SALIDA FROM VUELOS
  184. WHERE DESTINO = 'Madrid' AND HORA_SALIDA BETWEEN GETDATE() AND DATEADD(HOUR,2,GETDATE())
  185.  
  186. -- 25.- Obtener los tipos de aviones y sus capacidades para los que tengan
  187. -- menos de 30 plazas libres
  188. SELECT TIPO, CAPACIDAD FROM AVIONES a JOIN VUELOS v ON a.TIPO = v.TIPO_AVION
  189. JOIN RESERVAS r ON v.NUM_VUELO = r.NUM_VUELO WHERE PLAZAS_LIBRES < 30
  190.  
  191. -- 26.- Se quieren recuperar los aviones que hacen su recorrido entre las
  192. -- 16 horas y 1/4 hora después como término medio.
  193. SELECT * FROM AVIONES a JOIN VUELOS v ON a.TIPO = v.TIPO_AVION
  194. WHERE HORA_SALIDA BETWEEN '16:00:00' AND '17:15:00'
  195.  
  196. -- 27.- Obtener el número de vuelo, origen y destino para aquellos vuelos cuyo horario
  197. -- de salida sea mayor que el del último vuelo con destino a Sevilla, ordenado por la ciudad de origen.
  198. SELECT DISTINCT NUM_VUELO, ORIGEN, DESTINO FROM AVIONES, VUELOS
  199. WHERE HORA_SALIDA > (SELECT MAX(HORA_SALIDA) FROM VUELOS WHERE DESTINO = 'Sevilla')
  200. ORDER BY ORIGEN
  201.  
  202. -- 28.- Recuperar las características de los aviones que no pasan por Barcelona. Usar not exists.
  203. SELECT * FROM AVIONES a WHERE NOT EXISTS
  204. (SELECT DESTINO FROM VUELOS WHERE a.TIPO=TIPO_AVION AND DESTINO = 'Barcelona')
  205.  
  206. -- 29.- Seleccionar todos los datos de aquellos vuelos cuyo tipo contenga en su denominación
  207. -- el conjunto de caracteres '9S'.
  208. SELECT * FROM VUELOS WHERE TIPO_AVION LIKE '%9S'
  209.  
  210. -- 30.- ¿Cuántas plazas libres hay en los vuelos Madrid-Londres para el 22/02/2003?
  211. SELECT PLAZAS_LIBRES FROM RESERVAS r JOIN VUELOS v ON r.NUM_VUELO = v.NUM_VUELO
  212. WHERE ORIGEN = 'Madrid' AND DESTINO = 'Londres' AND FECHA_SALIDA = '22/02/2003'
  213.  
  214. -- 31.- Obtener el tipo de avión, capacidad, longitud y destino de los que van a Barcelona,
  215. -- ordenados por la capacidad del avión.
  216. SELECT DISTINCT TIPO, CAPACIDAD, LONGITUD, DESTINO FROM AVIONES, VUELOS
  217. WHERE DESTINO = 'Barcelona' ORDER BY CAPACIDAD
  218.  
  219. -- 32.- Recuperar los aviones cuya longitud sea mayor que la envergadura de todos ellos.
  220. SELECT * FROM AVIONES WHERE LONGITUD > (SELECT SUM(ENVERGADURA) FROM AVIONES)
  221.  
  222. -- 33.- Recuperar todos los vuelos cuyo origen está en Madrid, Barcelona o Sevilla.
  223. SELECT * FROM VUELOS WHERE ORIGEN = 'Madrid' OR ORIGEN = 'Barcelona' OR ORIGEN = 'Sevilla'
  224.  
  225. -- 34.- Obtener los valores extremos de la columna velocidad_crucero.
  226. SELECT MIN(VELOCIDAD) AS Velocidad_Min, MAX(VELOCIDAD)AS Velocidad_Max FROM AVIONES
  227.  
  228. -- 35.- Seleccionar el número de vuelo, origen y destino de aquellos vuelos con origen en
  229. -- Madrid para los que quedan plazas libres. Usar exists y otra versión.
  230.  
  231.  
  232. -- 36.- ¿Cuántos destinos distintos existen?
  233. SELECT COUNT(DISTINCT DESTINO) AS DESTINOS_TOTALES FROM VUELOS
  234.  
  235. -- 37.- Recuperar los aviones cuya capacidad sea menor que el doble de alguno de los promedios de plazas libres por día.
  236. SELECT * FROM AVIONES WHERE CAPACIDAD < ANY
  237. (SELECT 2 * AVG(PLAZAS_LIBRES) FROM RESERVAS GROUP BY FECHA_SALIDA)
  238.  
  239. -- 38.- ¿Cuántas plazas libres existen en los vuelos Madrid-Londres de las 20:40h del 22/02/2003? Utilizar subconsultas.
  240.  
  241.  
  242. -- 39.- Consultar la hora de salida más temprana de los vuelos que no van a Barcelona, clasificados por origen.
  243. SELECT MIN(HORA_SALIDA) FROM VUELOS WHERE DESTINO <> 'Barcelona' GROUP BY ORIGEN
  244.  
  245. -- 40.- Listar la hora de salida más tardía y el número de vuelos clasificados por origen,
  246. -- siempre que su hora de salida sea anterior a las 4 de la tarde.
  247. SELECT MAX(HORA_SALIDA), COUNT(*) FROM VUELOS WHERE HORA_SALIDA < '16:00:00' GROUP BY ORIGEN
  248.  
  249. -- 41.- Crear el índice denominado ixreservas para las columnas num_vuelo y fecha_salida ascendente
  250. -- y que no admita duplicados.
  251. CREATE UNIQUE INDEX ixreservas ON RESERVAS (NUM_VUELO, FECHA_SALIDA ASC)
  252.  
  253. -- 42.- Denegar a Usuario1 el permiso update sobre plazas libres. Comprobar
  254. DENY UPDATE on reservas(plazas_libres) to usuario1
  255.  
  256. execute as user='usuario1'
  257. UPDATE RESERVAS SET PLAZAS_LIBRES = PLAZAS_LIBRES - 1
  258. revert
Add Comment
Please, Sign In to add comment