Logo Studenta

9 Ejercicios subconsultas - Jair García

Esta es una vista previa del archivo. Inicie sesión para ver el archivo original

Alumno: "Los Verdes"
	Robles Filio Omar
	Yescas Benitez Alejandro
	Alonso Gracía Jair
Grupo: 2CV3
Profesor: Edgar A. Catalán Salgado
SUBCONSULTAS
En ciertas ocasiones para poder resolver una consulta necesitamos de un valor almacenado en la base de datos. 
Una subconsulta nos permite hacer esto, literalmente es una consulta metida dentro de otra, la cual se ejecuta primero 
para obtener un resultado y este resultado se usa en la consulta exterior para llegar al resultado final.
Tomemos por ejemplo la pregunta ¿Que productos cuestan mas que un DVD?, para resolver esto primero necesitariamos conocer 
el precio del DVD, podriamos obtener dicho precio mediante la siguiente consulta
SELECT precioVenta
FROM tblInventario
WHERE nombre='dvd'
Lo cual nos daria como resultado 
+------+
|Precio|
+------+
 1500
Con esa informacion ya podriamos realizar la consulta que se nos pidio, de la siguiente forma:
SELECT nombre, precioVenta
FROM tblInventario
WHERE PrecioVenta>1500
Sin embargo el precio del dvd puede cambiar, ademas si quisieramos saber que productos cuestan mas que una tele o un estereo,
tendriamos que cambiar las 2 consultas, entonces si sabemos que ese valor es el resultado de una consulta, podemos usar esa 
consulta dentro de la otra para obtener el resultado deseado de la siguiente forma:
SELECT nombre, precioVenta -- La consulta externa es en la que se muestra la informacion deseada o solicitada
FROM tblInventario
WHERE PrecioVenta>(SELECT precioVenta -- la consulta interna obtiene un dato necesario para poder resolver 
		 FROM tblInventario -- la externa, en este caso solo el precio del DVD
		 WHERE nombre='dvd')
Notese que la subconsulta esta encerrada entre parentesis, esto tiene 2 funciones la principal es que al igual que con 
operadores aritmeticos y logicos, le indica al compilador de MYSQL que lo que esta dentro de los parentesis es un codigo 
que se debe ejecutar primero. La 2da simplemente es para dar claridad a las consultas.
Algo importante a hacer notar es que si tenemos 2 productos que se llamen DVD, la cunsulta deja de funcionar, debido a que 
como resultado de la subconsulta o consulta interna tendriamos 2 valores y al sustituir el compilador tendriamos algo como:
SELECT nombre, precioVenta -- La consulta externa es en la que se muestra la informacion deseada o solicitada
FROM tblInventario
WHERE PrecioVenta>(1500,2000) -- la consulta interna devuelve 2 valores, y el operador Mayor que solo permite uno 				-- a cada lado, lo cual nos genera un error.
Por lo tanto necesitamos una forma de garantizar en este caso,que el resultado de la consulta interna unicamente regrese un 
registro, para lograr ese objetivo en lugar de usar el nombre usamos el identificador de producto
SELECT nombre, precioVenta -- La consulta externa es en la que se muestra la informacion deseada o solicitada
FROM tblInventario
WHERE PrecioVenta>(SELECT precioVenta -- la consulta interna obtiene un dato necesario para poder resolver 
		 FROM tblInventario -- la externa, en este caso solo el precio del DVD
		 WHERE IdProducto=3)
En realidad todos los resultados de una consulta pueden ser considerados como tablas, pero de acuerdo a la cantidad de datos
que regresa y el tipo de estos, podriamos clasificarlo de la siguiente forma:
TIPO 1.- Un unico dato de un tipo especifico, generado por consultas en las que en la parte del select solo existe un campo 
	 y de algun modo se garantiza que solo se regresara un registro, ya sea que se condicione mediante el identificador o 
	 usando la clausula limit, o funciones de agregado sobre toda la tabla, etc.
	select nombre
	From tblClientes
	where IdCliente=1
TIPO 2.- Un conjunto de datos del mismo tipo. Generado por consultas que en la parte del select tienen un unico campo pero 
	 en el where se regresan 2 o mas registros
	select nombre
	From tblClientes
TIPO 3.- Un conjunto de datos de tipo diferente pero que tienen una relacion entre si.
	select nombre, FechalAlta, Credito
	From tblClientes
	where IdCliente=1
TIPO 4.- Una tabla con varios datos de tipo diferente.
 
	select nombre, FechalAlta, Credito
	From tblClientes
Lo cual nos lleva a las siguientes restriciones:
En la parte del select unicamente pueden ir subconsultas del tipo 1
En la parte del from, pueden ir consultas de cualquier tipo pero se les tiene que poner un alias
En operaciones aritmeticas, solo pueden usar consultas del tipo 1
En condiciones mediante operadores comparativos, solo se pueden usar del tipo 1, aunque nos podemos ayudar de los 
 operadores IN, ALL y ANY para extender sus capacidades y poder usar consultas de los demas tipos
Where campo in (valor1, valor2, ...) pide que campo sea igual a cualquiera de los valores
where campo > all(valor1, valor2, valor3,...) pide que campo sea mayor a todos los valores
where campo > any (valor1, valor2, valor3,...) pide que campor sea mayor a cualquiera de los valores
Podemos reemplazar esta lista de valores por una subconsulta
Where campo in (subconsulta) pide que campo sea igual a cualquiera de los valores
where campo > all(subconsulta) pide que campo sea mayor a todos los valores
where campo > any (subconsulta) pide que campo sea mayor a cualquiera de los valores
Estas subconsultas pueden ser de cualquier tipo
--1. Muestra los productos que cuestan menos que una tele
	select nombre, precio_sugerido
	from productos
	where precio_sugerido < (select precio_sugerido
				 from productos
				 where nombre = 'Tele');
--2. ¿Que produtos tienen el precio mas alto respecto al precio sugerido de venta?
	select nombre, precio
	from productos
	where precio_sugerido = (select max(precio_sugerido)
			 	 from productos);
--3. ¿Que clientes tienen un credito superior al promedio?
	select nombre, credito
	from clientes
	where credito > (select sum(credito)/count(credito)
			 from clientes);
--4. ¿Quienes deben mas que edgar?
	select nombre, deuda
	from clientes
	where deuda > (select deuda
		 from clientes
		 where nombre = 'Edgar');
--5. ¿Que clientes tienen el credito mas alto otorgado?
	select nombre, credito
	from clientes
	where credito = (select max(credito)
			 from clientes);
--6 ¿Muestra a los clientes de la delegacion que tiene menos clientes?
	
--7 ¿En que delegacion compran mas (mayor cantidad de ventas)?
 
--8 ¿De que proveedor compran mas (mayor cantidad de productos vendidos)?
--9 ¿Quienes no han comprado un dvd?
--10 ¿Que clientes no han comprado?
--11 ¿De que delegacion no han comprado?
--12 ¿Que otros productos han comprado los que se han llevado un dvd?
--13 ¿Que productos se han llevado en las ventas menores a 15000 (totalventa)?
--14 ¿Que prductos se llevan las personas con un credito menor a 10000?
--15 ¿Que otros productos se han llevado las personas que se llevaron un dvd y tienen un credito mayor al promedio

Continuar navegando

Materiales relacionados