Sunteți pe pagina 1din 11

7- Sub consultas y vistas

Objetivos:

Elaborar sub consultas, a partir de una consulta.
Generar diferentes vistas a partir de las tablas de una base de datos.

Recursos:

Microsoft SQL Server Management Studio
Guas prcticas.
Script de bases de datos. (autos)
Script de bases de datos. (SCRUM)

Introduccin

Cuando se tiene bases de datos muy grandes con muchas tablas y relaciones es difcil
elaborar consultas que cumplan con las necesidades de informacin de una empresa, por
esta razn es importante el usar los recursos del manejo de subconsultas y la creacin de
vistas.

SUBCONSULTAS

Una subconsulta es una consulta anidada en una instruccin SELECT, INSERT, UPDATE o
DELETE, o bien en otra subconsulta. Las subconsultas se pueden utilizar en cualquier parte
en la que se permita una expresin. Se llama tambin subconsulta a una consulta o
seleccin interna, mientras que la instruccin que contiene una subconsulta tambin es
conocida como consulta o seleccin externa.

Una consulta SELECT normal, que incluye los componentes normales de la lista de
seleccin.

Una clusula normal FROM que incluye uno o varios nombres de tablas o vistas.
Una clusula opcional WHERE.
Una clusula opcional GROUP BY.
Una clusula opcional HAVING.


SUB CONSULTAS CON OPERADORES DE COMPARACION.

Las subconsultas se pueden presentar con uno de los operadores de comparacin (=, < >, >,
> =, <, ! >, ! <, or < =).

Vamos realizar un ejemplo, tomando la base de datos autos, y queremos obtener que
repuestos y de qu modelo estn arriba del precio promedio (30.7448) de los repuestos

SELECT modelos.modelo,repuestos.nombre,repuestos.precio
FROM modelos INNER JOIN repuestos
ON modelos.id_modelos = repuestos.id_modelos
WHERE repuestos.precio >
(SELECT AVG(precio)
FROM repuestos)

Esta consulta nos da la siguiente pantalla de resultado:



SUBCONSULTAS USADAS EN LUGAR DE UNA EXPRESION.

En Transact-SQL, una subconsulta se puede usar all donde se pueda usar una expresin en
las instrucciones SELECT, UPDATE, INSERT y DELETE, excepto en una lista ORDER BY.
En el ejemplo siguiente se muestra cmo se puede usar esta mejora. Esta consulta busca
los precios de todas las bicicletas de montaa, el precio medio y la diferencia entre el
precio de cada bicicleta y el precio medio.

SELECT modelos.modelo,precio,precio-((SELECT AVG(precio)
FROM modelos
WHERE id_marca = 2 group by id_marca)) as Diferencia
FROM modelos WHERE modelos.id_marca = 2

SUBCONSULTAS CON INSERT, UPDATE Y DELETE

Tambin puede realizarse subconsultas combinando estas expresiones.
SUBCONSULTAS CON EXISTS

Cuando una subconsulta se especifica con la palabra clave EXISTS, funciona como una
prueba de existencia. La clusula WHERE de la consulta externa comprueba si existen las
filas devueltas por la subconsulta. En realidad, la subconsulta no produce ningn dato,
devuelve el valor TRUE o FALSE.

VIEW - Vistas

Una vista es una alternativa para mostrar datos de varias tablas. Una vista es como una
tabla virtual que almacena una consulta. Los datos accesibles a travs de la vista no estn
almacenados en la base de datos como un objeto.

Entonces, una vista almacena una consulta como un objeto para utilizarse
posteriormente. Las tablas consultadas en una vista se llaman tablas base. En general, se
puede dar un nombre a cualquier consulta y almacenarla como una vista.

Una vista suele llamarse tambin tabla virtual porque los resultados que retorna y la
manera de referenciarlas es la misma que para una tabla.

Las vistas permiten:

Ocultar informacin: permitiendo el acceso a algunos datos y manteniendo oculto
el resto de la informacin que no se incluye en la vista. El usuario opera con los
datos de una vista como si se tratara de una tabla, pudiendo modificar tales datos.
Mejorar el rendimiento: se puede evitar tipear instrucciones repetidamente
almacenando en una vista el resultado de una consulta compleja que incluya
informacin de varias tablas.

Podemos crear vistas con: un subconjunto de registros y campos de una tabla; una unin
de varias tablas; una combinacin de varias tablas; un resumen estadstico de una tabla;
un subconjunto de otra vista, combinacin de vistas y tablas.

Una vista se define usando un "select".

La sintaxis bsica parcial para crear una vista es la siguiente:

USE SCRUM
GO

CREATE VIEW lista1_scrum
AS
SELECT personas.nombre,personas.apellido,roles.rol,pais.pais
FROM personas INNER JOIN ROLES ON personas.id_rol = roles.id_rol
INNER JOIN pais ON personas.id_pais = pais.id_pais

SELECT * FROM lista1_scrum

Se creo una nueva tabla de nombre lista1_scrum, ha esta se le podrn hacer consultas al
igual que una tabla normal.




Otra opcin es tambin unir o calcular campos, en el siguiente ejemplo, creamos una vista
donde unimos el nombre y el apellido, para crear un solo campo.

USE SCRUM
GO

CREATE VIEW vista_nueva
AS
SELECT (personas.nombre + personas.apellido) AS nomb,roles.rol,pais.pais
FROM personas INNER JOIN ROLES ON personas.id_rol = roles.id_rol
INNER JOIN pais ON personas.id_pais = pais.id_pais

SELECT * FROM vista_nueva

Esta orden creara una tabla como esta:



Los nombres para vistas deben seguir las mismas reglas que cualquier identificador. Para
distinguir una tabla de una vista podemos fijar una convencin para darle nombres, por
ejemplo, colocar el sufijo vista y luego el nombre de las tablas consultadas en ellas.

Los campos y expresiones de la consulta que define una vista deben tener un nombre. Se
debe colocar nombre de campo cuando es un campo calculado o si hay 2 campos con el
mismo nombre.

Al crear una vista, SQL Server verifica que existan las tablas a las que se hacen referencia
en ella. Se aconseja probar la sentencia "select" con la cual definiremos la vista antes de
crearla para asegurarnos que el resultado que retorna es el imaginado.

Existen algunas restricciones para el uso de "create view", a saber:

no puede incluir las clusulas "compute" ni "compute by" ni la palabra clave "into"
no se pueden crear vistas temporales ni crear vistas sobre tablas temporales.
no se pueden asociar reglas ni valores por defecto a las vistas.
no puede combinarse con otras instrucciones en un mismo lote.
Se pueden construir vistas sobre otras vistas.

USO DE DELETE, INSERT Y UPDATE EN UNA VISTA

Si quiero utilizar una expresin DELETE en una vista lo ms probable es que no me lo
permita por la combinacin de tablas que realizo y esta pueden evitar que borre los
registros, pero si la vista es de una tabla que tiene registros dependientes, realizara el
borrado de registro y tambin realizara el borrado de la tabla original.

Si trato de borrar registro de la vista: vista_nueva, pasara lo siguiente:


Si por ejemplo trato de insertar un registro me dara esta respuesta.



Ahora, por ejemplo al actualizar el pas de Japon por Nippon si me realizara el
proceso.



Actualizara la vista, y tambin actualizar la tabla base original, por tal motivo se debe
tener cuidad al actualizar los datos de una vista.





VISTAS EN FORMA GRAFICA

Tambin podemos desarrollar vistas en forma grafica y recibir la ayuda de un diseador,
donde podemos elegir las tablas y campos que deseamos utilizar.

En primer lugar en el explorador de objetos expandimos la base de datos que deseamos
utilizar en este caso SCRUM, despus presiono click derecho sobre la carpeta view.



Al seleccionarla me mostrar un cuadro con todas las bases de datos disponibles, puedo
utilizar Refresh para actualizar la lista de tablas, para nuestro ejemplo seleccionaremos
las tablas personas y roles



Al seleccionar estas tablas nos aparecer un diagrama entidad relacin, y si ya existen
relaciones las mostrara.

El siguiente paso ser seleccionar los campos a ocupar en nuestra nueva vista.



Una vez que hemos seleccionado nuestros campos a ocupar, vemos que en la parte de en
medio estn listadas todas las columnas donde puedo activar o desactivarlas adems de
arriba.

Tambien en la parte de abajo podemos ver la consulta creada por el diseador, si todo
esta bien procedemos a guardar nuestra nueva vista, daremos click derecho sobre la
pestaa del diseador.








La ventana de guardado me dar la oportunidad de guardar la nueva vista, con un nombre
personalizado, para nuestro ejemplo usamos reporte_roles.





Una vez guardada la consulta nos apararecera en la pestaa views y voy a poder ver las
columnas que contiene la vista, pero debemos recordar que no podremos editar las
columnas, solamente los datos.



Ahora ya podremos utilizar la vista en la forma que nos convenga.

Ejercicios:

Cree subconsultas con las opciones de Insert, Delete y Update.
Investiga el uso SQL CREATE OR REPLACE VIEW
Cual es el uso de la opcin WITH CHECK OPTION en una vista.

Datos ejemplo:
CREATE DATABASE autos
GO

USE autos
GO

CREATE TABLE marca
(
id_marca int identity(1,1),
marca varchar(15),
pais varchar(15),
CONSTRAINT pk_marca PRIMARY KEY(id_marca)
)

CREATE TABLE modelos
(
id_modelos int identity(1,1),
modelo varchar(15),
asientos int,
combustible varchar(10),
precio smallmoney,
year_modelo varchar(4),
id_marca int,
CONSTRAINT pk_modelos PRIMARY KEY(id_modelos),
CONSTRAINT fk_modelos FOREIGN KEY(id_marca)
REFERENCES marca(id_marca)
)

CREATE TABLE repuestos
(
id_rep int identity(1,1),
nombre varchar(40),
precio smallmoney,
descuento int,
id_modelos int,
CONSTRAINT pk_repuesto PRIMARY KEY(id_rep),
CONSTRAINT fk_repuestos FOREIGN KEY(id_modelos)
REFERENCES modelos(id_modelos)
)

INSERT INTO marca VALUES ('Toyota','Japon')
INSERT INTO marca VALUES ('Kia','Corea')
INSERT INTO marca VALUES ('Fiat','Italia')
INSERT INTO marca VALUES ('Chevrolet','USA')
INSERT INTO marca VALUES ('Mercedez','Alemania')
INSERT INTO marca VALUES ('Honda','Japon')

INSERT INTO modelos VALUES ('Civic',4,'Gasolina',10000,'2010',6)
INSERT INTO modelos VALUES ('CRX',4,'Gasolina',6800,'1995',6)
INSERT INTO modelos VALUES ('300 SL',4,'Gasolina',16800,'2004',5)
INSERT INTO modelos VALUES ('Chevy',4,'Gasolina',9800,'1999',4)
INSERT INTO modelos VALUES ('Camaro',5,'Gasolina',12800,'2001',4)
INSERT INTO modelos VALUES ('Aveo',5,'Gasolina',9300,'2000',4)
INSERT INTO modelos VALUES ('Malibu',5,'Gasolina',8000,'2007',4)
INSERT INTO modelos VALUES ('Uno',5,'Gasolina',6800,'2007',3)
INSERT INTO modelos VALUES ('Cerato',5,'Gasolina',9000,'2011',2)
INSERT INTO modelos VALUES ('Rio',5,'Gasolina',13000,'2010',2)

INSERT INTO repuestos VALUES ('Manecia',12.3,10,1)
INSERT INTO repuestos VALUES ('Empaque de Culata',21.6,10,2)
INSERT INTO repuestos VALUES ('Bomper delantero',25.7,10,9)
INSERT INTO repuestos VALUES ('Filtro de aire',10,10,1)
INSERT INTO repuestos VALUES ('Parabrisas delantero',17.8,10,3)
INSERT INTO repuestos VALUES ('Timon ajustable',58.5,10,8)
INSERT INTO repuestos VALUES ('Liquido de Frenos',3.43,10,1)
INSERT INTO repuestos VALUES ('Amortiguadores',50,10,2)
INSERT INTO repuestos VALUES ('Perno Llantas',7,10,1)
INSERT INTO repuestos VALUES ('PUerta conductor',8.98,10,1)
INSERT INTO repuestos VALUES ('Bonba de Gasolina',37.7,10,2)
INSERT INTO repuestos VALUES ('Bujillas especiales',22,10,4)
INSERT INTO repuestos VALUES ('Asiento',125,10,1)
INSERT INTO repuestos VALUES ('Chapa baul',25.8,10,3)
INSERT INTO repuestos VALUES ('Faja Distribuidor',34.3,10,1)
INSERT INTO repuestos VALUES ('Pintura carroceria',65,10,7)
INSERT INTO repuestos VALUES ('Cable alternador',14,10,2)
INSERT INTO repuestos VALUES ('Cable bateria',4.60,10,1)
INSERT INTO repuestos VALUES ('Aditivos Motor',9.7,10,1)
INSERT INTO repuestos VALUES ('Aditivos Motor',13.6,20,2)
INSERT INTO repuestos VALUES ('Prensa de Clocth',140.3,20,1)
INSERT INTO repuestos VALUES ('Prensa de Clocth',100.3,20,2)
INSERT INTO repuestos VALUES ('Disco Frenos',21.2,20,4)
INSERT INTO repuestos VALUES ('Disco Frenos',29.90,20,5)
INSERT INTO repuestos VALUES ('Pastillas',2.3,20,2)
INSERT INTO repuestos VALUES ('ROLES PILOTO',10,20,6)
INSERT INTO repuestos VALUES ('Manecia',22,20,1)
INSERT INTO repuestos VALUES ('Manecia',43.1,20,2)
INSERT INTO repuestos VALUES ('Relay de arranque',11,20,9)
INSERT INTO repuestos VALUES ('Relay de arranque',37.2,20,7)
INSERT INTO repuestos VALUES ('BUSHING DE CREMALLERA',25,30,8)
INSERT INTO repuestos VALUES ('BUSHING DE CREMALLERA',15,30,3)
INSERT INTO repuestos VALUES ('Manecia',20,30,2)
INSERT INTO repuestos VALUES ('Silvines',32,30,2)
INSERT INTO repuestos VALUES ('Silvines',56,45,7)
INSERT INTO repuestos VALUES ('Silvines',7.8,30,2)
INSERT INTO repuestos VALUES ('Platinos',21.6,30,1)
INSERT INTO repuestos VALUES ('Platinos',17.3,30,2)
INSERT INTO repuestos VALUES ('Condensador',45,30,4)
INSERT INTO repuestos VALUES ('Condensador',2.3,30,3)
INSERT INTO repuestos VALUES ('Alternadores',34.23,30,5)

S-ar putea să vă placă și