Subconsultas
Una subconsulta es una instrucción SELECT anidada dentro de una instrucción SELECT, SELECT...INTO, INSERT...INTO, DELETE, o UPDATE o dentro de otra subconsulta.
Puede utilizar tres formas de sintaxis para crear una subconsulta:
comparación [ANY | ALL | SOME]
(instrucción sql)
expresión [NOT] IN (instrucción sql)
[NOT] EXISTS (instrucción sql)
En donde:
Comparación: Es una expresión y un operador De comparación que compara la expresión con el resultado de la Subconsulta.
expresión: Es una expresión por la que se busca el conjunto resultante de la subconsulta.
instrucción
sql : Es una instrucción
SELECT, que sigue el mismo formato y reglas que cualquier otra
instrucción SELECT. Debe
ir entre paréntesis.
EXPLICACION DE SUBCONSULTAS
select...select(s)
update...select(s)
delete...select(s)
insert...select(s)
UPDATE TABLA SET CAMPO=VALOR WHERE CONDICION;
UPDATE TABLA SET (SUBCONSULTA),(SUBCONSULTA), COMPO=VALOR WHERE SUBCONSULTAS;
EJERCICIO #1
Restaurar la base datos subconsultas
mysql> show tables;
+------------------------+
| Tables_in_subconsultas |
+------------------------+
| articulo |
| detalle |
+------------------------+
2 rows in set (0.00 sec)
mysql> select * from articulo;
+--------+------------+----------+---------------+------------+
| codigo | articulo | cantidad | valorunitario | existencia |
+--------+------------+----------+---------------+------------+
| 150 | nevera | 25 | 950000 | 0 |
| 200 | televisor | 11 | 1200000 | 0 |
| 250 | estufa | 30 | 750000 | 0 |
| 300 | ventilador | 17 | 110000 | 0 |
| 350 | lavadora | 13 | 980000 | 0 |
+--------+------------+----------+---------------+------------+
5 rows in set (0.00 sec)
mysql> select * from detalle;
+----+------------+------------+----------+------------+-------+--------+
| id | nrofactura | fecha | cantidad | valorventa | total | codigo |
+----+------------+------------+----------+------------+-------+--------+
| 1 | 1200 | 2010-01-30 | 3 | 0 | 0 | 150 |
| 2 | 1250 | 2010-02-13 | 5 | 0 | 0 | 150 |
| 3 | 1250 | 2010-02-13 | 7 | 0 | 0 | 250 |
| 4 | 1300 | 2010-03-02 | 1 | 0 | 0 | 350 |
| 5 | 1300 | 2010-03-02 | 2 | 0 | 0 | 300 |
| 6 | 1400 | 2010-03-11 | 3 | 0 | 0 | 200 |
| 7 | 1500 | 2010-03-21 | 5 | 0 | 0 | 250 |
+----+------------+------------+----------+------------+-------+--------+
7 rows in set (0.00 sec)
1. calcular el valorventa de la tabla detalle con un incremento del 23% del valorunitario de la tabla articulo
mysql> update detalle set valorventa = (select valorunitario + (valorunitario * 0.23) from articulo where articulo.codigo = detall
e.codigo);
Query OK, 7 rows affected (0.19 sec)
Rows matched: 7 Changed: 7 Warnings: 0
mysql> select * from detalle;
+----+------------+------------+----------+------------+-------+--------+
| id | nrofactura | fecha | cantidad | valorventa | total | codigo |
+----+------------+------------+----------+------------+-------+--------+
| 1 | 1200 | 2010-01-30 | 3 | 1168500 | 0 | 150 |
| 2 | 1250 | 2010-02-13 | 5 | 1168500 | 0 | 150 |
| 3 | 1250 | 2010-02-13 | 7 | 922500 | 0 | 250 |
| 4 | 1300 | 2010-03-02 | 1 | 1205400 | 0 | 350 |
| 5 | 1300 | 2010-03-02 | 2 | 135300 | 0 | 300 |
| 6 | 1400 | 2010-03-11 | 3 | 1476000 | 0 | 200 |
| 7 | 1500 | 2010-03-21 | 5 | 922500 | 0 | 250 |
+----+------------+------------+----------+------------+-------+--------+
7 rows in set (0.00 sec)
mysql> select * from articulo;
+--------+------------+----------+---------------+------------+
| codigo | articulo | cantidad | valorunitario | existencia |
+--------+------------+----------+---------------+------------+
| 150 | nevera | 25 | 950000 | 0 |
| 200 | televisor | 11 | 1200000 | 0 |
| 250 | estufa | 30 | 750000 | 0 |
| 300 | ventilador | 17 | 110000 | 0 |
| 350 | lavadora | 13 | 980000 | 0 |
+--------+------------+----------+---------------+------------+
5 rows in set (0.00 sec)
2. calcular el total de la tabla detalle
mysql> update detalle set total = cantidad * valorventa;
Query OK, 7 rows affected (0.00 sec)
Rows matched: 7 Changed: 7 Warnings: 0
mysql> select * from detalle;
+----+------------+------------+----------+------------+---------+--------+
| id | nrofactura | fecha | cantidad | valorventa | total | codigo |
+----+------------+------------+----------+------------+---------+--------+
| 1 | 1200 | 2010-01-30 | 3 | 1168500 | 3505500 | 150 |
| 2 | 1250 | 2010-02-13 | 5 | 1168500 | 5842500 | 150 |
| 3 | 1250 | 2010-02-13 | 7 | 922500 | 6457500 | 250 |
| 4 | 1300 | 2010-03-02 | 1 | 1205400 | 1205400 | 350 |
| 5 | 1300 | 2010-03-02 | 2 | 135300 | 270600 | 300 |
| 6 | 1400 | 2010-03-11 | 3 | 1476000 | 4428000 | 200 |
| 7 | 1500 | 2010-03-21 | 5 | 922500 | 4612500 | 250 |
+----+------------+------------+----------+------------+---------+--------+
7 rows in set (0.00 sec)
3. calcular las existencias segun la tabla detalle de cada articulo
mysql> update articulo set existencia = cantidad - (select sum(cantidad) from detalle where detalle.cantidad = articulo.cantidad);
Query OK, 0 rows affected, 5 warnings (0.17 sec)
Rows matched: 5 Changed: 0 Warnings: 5
mysql> select * from articulo;
+--------+------------+----------+---------------+------------+
| codigo | articulo | cantidad | valorunitario | existencia |
+--------+------------+----------+---------------+------------+
| 150 | nevera | 25 | 950000 | 17 |
| 200 | televisor | 11 | 1200000 | 8 |
| 250 | estufa | 30 | 750000 | 18 |
| 300 | ventilador | 17 | 110000 | 15 |
| 350 | lavadora | 13 | 980000 | 12 |
+--------+------------+----------+---------------+------------+
5 rows in set (0.00 sec)
mysql> select * from detalle;
+----+------------+------------+----------+------------+---------+--------+
| id | nrofactura | fecha | cantidad | valorventa | total | codigo |
+----+------------+------------+----------+------------+---------+--------+
| 1 | 1200 | 2010-01-30 | 3 | 1168500 | 3505500 | 150 |
| 2 | 1250 | 2010-02-13 | 5 | 1168500 | 5842500 | 150 |
| 3 | 1250 | 2010-02-13 | 7 | 922500 | 6457500 | 250 |
| 4 | 1300 | 2010-03-02 | 1 | 1205400 | 1205400 | 350 |
| 5 | 1300 | 2010-03-02 | 2 | 135300 | 270600 | 300 |
| 6 | 1400 | 2010-03-11 | 3 | 1476000 | 4428000 | 200 |
| 7 | 1500 | 2010-03-21 | 5 | 922500 | 4612500 | 250 |
+----+------------+------------+----------+------------+---------+--------+
7 rows in set (0.02 sec)
4. eliminar los articulos que hayan vendido entre 3 y 5 articulos en cada venta
mysql> delete from articulo where codigo = (select codigo from detalle where cantidad between 2 and 5 and detalle.codigo = articul
o.codigo group by articulo.codigo);
Query OK, 4 rows affected (0.00 sec)
mysql> select * from articulo;
+--------+----------+----------+---------------+------------+
| codigo | articulo | cantidad | valorunitario | existencia |
+--------+----------+----------+---------------+------------+
| 350 | lavadora | 13 | 980000 | 12 |
+--------+----------+----------+---------------+------------+
1 row in set (0.00 sec)
crear una tabla copia (duplicar la tabla detalle) y llenarla con la informacion de detalle, solo los registros del mes de febrero
mysql> create table copia like detalle;
Query OK, 0 rows affected (0.03 sec)
mysql> show tables;
+------------------------+
| Tables_in_subconsultas |
+------------------------+
| articulo |
| copia |
| detalle |
+------------------------+
3 rows in set (0.02 sec)
mysql> describe copia;
+------------+----------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------+----------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| nrofactura | char(10) | NO | | | |
| fecha | date | NO | | | |
| cantidad | int(11) | NO | | | |
| valorventa | int(11) | NO | | | |
| total | int(11) | NO | | | |
| codigo | char(10) | NO | | | |
+------------+----------+------+-----+---------+----------------+
7 rows in set (0.00 sec)
mysql> select * from detalle;
+----+------------+------------+----------+------------+---------+--------+
| id | nrofactura | fecha | cantidad | valorventa | total | codigo |
+----+------------+------------+----------+------------+---------+--------+
| 1 | 1200 | 2010-01-30 | 3 | 1168500 | 3505500 | 150 |
| 2 | 1250 | 2010-02-13 | 5 | 1168500 | 5842500 | 150 |
| 3 | 1250 | 2010-02-13 | 7 | 922500 | 6457500 | 250 |
| 4 | 1300 | 2010-03-02 | 1 | 1205400 | 1205400 | 350 |
| 5 | 1300 | 2010-03-02 | 2 | 135300 | 270600 | 300 |
| 6 | 1400 | 2010-03-11 | 3 | 1476000 | 4428000 | 200 |
| 7 | 1500 | 2010-03-21 | 5 | 922500 | 4612500 | 250 |
+----+------------+------------+----------+------------+---------+--------+
7 rows in set (0.00 sec)
mysql> select * from copia;
Empty set (0.00 sec)
mysql> insert into copia select * from detalle where month(fecha)=2;
Query OK, 2 rows affected (0.19 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> select * from copia;
+----+------------+------------+----------+------------+---------+--------+
| id | nrofactura | fecha | cantidad | valorventa | total | codigo |
+----+------------+------------+----------+------------+---------+--------+
| 2 | 1250 | 2010-02-13 | 5 | 1168500 | 5842500 | 150 |
| 3 | 1250 | 2010-02-13 | 7 | 922500 | 6457500 | 250 |
+----+------------+------------+----------+------------+---------+--------+
2 rows in set (0.00 sec)
DESCARGA LA BASE DE DATOS PARA REALIZAR LOS EJERCICIOS:
EJERCICIO #1
www.dropbox.com/s/a6qzhipryr4hdry/subconsultas.sql?dl=0
EJERCICIO#2
www.dropbox.com/s/uah61jcih6g7yis/ejer_subconsultas.sql?dl=0
- calcular valorventa aumentando un 17% del valorunitario
- llevar el valorventa a valor de detallefactura segun articulo comprado
- calcular el total en la tabla detallefactura (cantidad x valor)
- calcular cuanto es el subtotal de cada factura y guardarlo en el campo respectivo
- calcular el iva (16% del subtotal), la retencion(3.5% del subtotal) y el total(subtotal + iva - retencion)
- calcular cuales son las existencias de cada articulo
- total de facturas de cada cliente
- listar el total de ventas de cada producto
- listar las facturas y el valor de cada una segun las compra de alexandra lopez
-crear una tabla detallado dentro de la bd subconsultas con los campos
id auto incremento
cedula
nrofactura
totalarticulos
valortotal
crear una subconsulta para ingresar estos datos a la tabla nueva
cedula del cliente
numero de facturas del cliente
suma de los articulos de cada factura
total pagado de cada factura
- eliminar las facturas de los clientes que hayan iniciado vinculo con la empresa antes de 2004
-Listar los clientes que no tienen facturas
ARCHIVO DE CONSULTAS:
Subconsulta Facturacion.txt (26364)