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)