Subconsultas

Select--------- select(s)

update---------select(s)

delete----------select(s)

insert----------select(s)

FUNCIONALIDAD: Sirve para intercambiar o actualizar información de varias tablas

NOTA: No se tiene una sintaxis definida

EJERCICIO

1) Calcular el valorventa de la tabla "Detalle" con un incremento del 23 % del valorunitario de la tabla articulo

ANALISIS

1) Comando para resolver el problema

    (update)

2) Cual es el campo a reemplazar y de que tabla

    valorventa----TB----detalle

3) Con quien lo va a reemplazar ----------------operación a utilizar

    valorunitario + (valorunitario * 0.23) ----TB---articulo

4) Como se relaciona

    articulo.codigo=detalle.codigo

5) Condiciones adicionales

    No hay otras condiciones

 

SOLUCIÓN

 

mysql> update detalle set valorventa=(select valorunitario+(valorunitario*0.23)
from articulo where articulo.codigo=detalle.codigo);
Query OK, 7 rows affected (0.06 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)
 
Actualizar 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)
 
 
2) Calcular las existencias según la tabla detalle de cada articulo
 
ANALISIS

1) Comando para resolver el problema

    (update)

2) Cual es el campo a reemplazar y de que tabla

    existencias----TB----articulo

3) Con quien lo va a reemplazar ----------------operación a utilizar

    cantidad -(suma(cantidad))

4) Como se relaciona

    detalle.codigo=articulo.codigo

5) Condiciones adicionales

    No hay otras condiciones

 

SOLUCIÓN

 

mysql> update articulo set existencia = cantidad - (select sum(cantidad) from de
talle where detalle.codigo=articulo.codigo);
Query OK, 5 rows affected (0.04 sec)
Rows matched: 5  Changed: 5  Warnings: 0
 
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)
 
3) Eliminar los articulos que tienen entre 3 y 5 articulos vendidos
 
mysql> delete from articulo where codigo=(select codigo from detalle where canti

 

dad between 3 and 5 and detalle.codigo=articulo.codigo group by detalle.codigo);
 
Query OK, 3 rows affected (0.05 sec)
 
mysql> select * from articulo;
+--------+------------+----------+---------------+------------+
| codigo | articulo   | cantidad | valorunitario | existencia |
+--------+------------+----------+---------------+------------+
| 300    | ventilador |       17 |        110000 |         15 |
| 350    | lavadora   |       13 |        980000 |         12 |
+--------+------------+----------+---------------+------------+
2 rows in set (0.00 sec)
 
 
4) Crear una tabla que se llame copia (duplicando la tabla detalle)
 
SOLUCIÓN
 
mysql> create table copia like detalle;
Query OK, 0 rows affected (0.06 sec)
 
mysql> describe copia;
+------------+----------+------+-----+---------+----------------+
| Field      | Type     | Null | Key | Default | Extra          |
+------------+----------+------+-----+---------+----------------+
| id         | int(11)  | NO   | PRI | NULL    | auto_increment |
| nrofactura | char(10) | NO   |     | NULL    |                |
| fecha      | date     | NO   |     | NULL    |                |
| cantidad   | int(11)  | NO   |     | NULL    |                |
| valorventa | int(11)  | NO   |     | NULL    |                |
| total      | int(11)  | NO   |     | NULL    |                |
| codigo     | char(10) | NO   |     | NULL    |                |
+------------+----------+------+-----+---------+----------------+
7 rows in set (0.06 sec)
 
mysql> select * from copia;
Empty set (0.00 sec)
 
mysql> show tables;
+------------------------+
| Tables_in_subconsultas |
+------------------------+
| articulo               |
| copia                  |
| detalle                |
+------------------------+
3 rows in set (0.00 sec)
 
mysql> describe detalle;
+------------+----------+------+-----+---------+----------------+
| Field      | Type     | Null | Key | Default | Extra          |
+------------+----------+------+-----+---------+----------------+
| id         | int(11)  | NO   | PRI | NULL    | auto_increment |
| nrofactura | char(10) | NO   |     | NULL    |                |
| fecha      | date     | NO   |     | NULL    |                |
| cantidad   | int(11)  | NO   |     | NULL    |                |
| valorventa | int(11)  | NO   |     | NULL    |                |
| total      | int(11)  | NO   |     | NULL    |                |
| codigo     | char(10) | NO   |     | NULL    |                |
+------------+----------+------+-----+---------+----------------+
7 rows in set (0.01 sec)

 

 

5) Llenar con la información de la tabla "detalle" la tabla "copia" solo con registros del mes de febrero

ANALISIS

1) ¿Que tablas se ven involucradas?

Detalla------------Copia

2) ¿Que comando usar?

    Insert (select)

3) Condiciones Adicionales (diferentes a relaciones entre tablas)

    fecha = mes, febrero = 2

4) Relacion entre las tablas

    No hay

 

SOLUCIÓN

 

mysql> insert into copia select * from detalle where month(fecha)=2;
Query OK, 2 rows affected (0.01 sec)
Records: 2  Duplicates: 0  Warnings: 0
 
mysql> select * from copia;
+----+------------+------------+----------+------------+-------+--------+
| id | nrofactura | fecha      | cantidad | valorventa | total | codigo |
+----+------------+------------+----------+------------+-------+--------+
|  2 | 1250       | 2010-02-13 |        5 |          0 |     0 | 150    |
|  3 | 1250       | 2010-02-13 |        7 |          0 |     0 | 250    |
+----+------------+------------+----------+------------+-------+--------+
2 rows in set (0.00 sec)