4. sql (autoguardado)

39
4 LENGUAJE ESTRUCTURADO DE CONSULTA –SQL

Transcript of 4. sql (autoguardado)

Page 1: 4. sql (autoguardado)

4 LENGUAJE ESTRUCTURADO DE CONSULTA –SQL

Page 2: 4. sql (autoguardado)

4.1 INTRODUCCION

SQL, sigla proveniente de Structured Query

Language, es una interfase interactiva que

proporciona acceso en linea a la base de datos. Esta

diseñado para usarse en consultas, manejo, creación

y control de datos. Es una herramienta para

organizar, gestionar y recuperar datos almacenados

en una base de datos.

SQL fue el resultado del proyecto de investigación

System R de IBM. Al final de los setenta, SQL pasó a

formar parte del /dominio público y estuvo primero

disponible como lenguaje para un sistema comercial

de Oracle Corporation. SQL-92 es una mejora

significativa de las primeras versiones del estándar

SQL.

No es en sí mismo un sistema de gestión de base de

datos, ni un producto autónomo. Es parte integral de

un sistema de gestión de base de datos, un lenguaje

y una herramienta para comunicarse con el DBMS

(Database Management System) típico. Es un

sublenguaje de base de datos, consistente en unas

treinta sentencias especializadas para tareas de

gestión de base de datos.

50

Page 3: 4. sql (autoguardado)

Existe un estandar SQL, lo que permite portabilidad

hasta cierto punto, pero no garantiza la portabilidad

una portabilidad completa. Diferencias como códigos

de error, tipos de datos, tablas del sistema, SQL

interactivo, interfaz de programa, SQL dinámico,

diferencias semánticas, secuencias de ordenamiento

y estructura de la base de datos, que son

significativas obligan a ubicarse en el sistema en

particular.

SQL-92, a diferencia de las versiones anteriores,

permite a los usuarios definir esquemas múltiples. Los

esquemas múltiples se pueden agrupar en catálogos

(colecciones de esquemas), los cuales van muy

vinculados con cada usuario.

Podemos tomar varios grupos de sentencias SQL,

algunas relacionadas con el Lenguaje de Definición de

Datos (DDL) y otras con el Lenguaje de Manipulación

de Datos (DML).

El DDL consta de instrucciones como CREATE, DROP

y ALTER, para crear estructura y objetos, eliminarlos

y modificarlos.

51

Page 4: 4. sql (autoguardado)

Las proposiciones de DML permiten la consulta de la

base de datos SELECT, adición de datos INSERT,

supresión de datos DELETE y actualización de la base

de datos UPDATE.

El lenguaje SQL define un panorama general de la

seguridad de la base de datos. El esquema de

seguridad SQL se basa en tres conceptos principales:

Los usuarios, los objetos de las bases de datos y los

privilegios. Las sentencias usadas son GRANT y

REVOKE y en ocasiones se les agrupa dentro de un

sublenguaje de datos conocido como DCL (Data

Control Language).

Entre los tipos de datos definidos por SQL-92 se

encuentran los siguientes:

Integer: para números enteros

Small integer: enteros pequeños

Numeric(p,e): numéricos con p dígitos en total, de

los cuales e dígitos son están a la derecha del punto

decimal.

Decimal(p,e)

Real

Double precision

Float

52

Page 5: 4. sql (autoguardado)

Caracter(n): cadenas de caracteres de longitud n

Date: tipo fecha

Time: tipo hora

4.2 DEFINICIÓN DE DATOS

SQL-92 permite la definición de un esquema, de la

siguiente manera:

CREATE SCHEMA BIBLIOTECA

AUTHORIZATION LUZ_MARINA

Definición de dominios

Definición de tablas

Definición de vistas ...

SQL-92 permite la creación de dominios como por

ejemplo:

CREATE DOMAIN IDENTIFICADOR NUMERIC (3)

DEFAULT 0

CHECK (VALUE IS NOT NULL)

Lo anterior quiere decir que el dominio

IDENTIFICADOR corresponde a un tipo de datos

numérico de tres dígitos, su valor por defecto es cero

y no puede ser nulo. Después de definido, una

53

Page 6: 4. sql (autoguardado)

columna puede definirse con este dominio en lugar de

usar un tipo de dato convencional.

En algunos productos comerciales, los esquemas

pueden ser creados implícitamente, cada vez que se

crea un usuario, y todo lo que este cree, pertenece a

su propio esquema.

Las tablas se definen dando el nombre de la tabla,

definiendo cada columna, posiblemente incluyendo

restricciones sobre ella y definiendo las restricciones

sobre la tabla.

4.2.1 Esquema y tablas de un caso

Para crear un esquema para una tienda de video,

consistente de las tablas Almacén, Unidad (de

producto de video), Producto (el identificado en el

mercado), Título, Categoría y Actores, se puede

proceder de la siguiente manera:

CREATE SCHEMA DISTRIBUIDORA_VIDEO

AUTHORIZATION JGARCIA

Definiciones de dominios...

CREATE TABLE ALMACEN (COD_ALMACEN NUMERIC(2,0) PRIMARY KEY

54

Page 7: 4. sql (autoguardado)

NOMBRE CARACTER(12))

CREATE TABLE CATEGORÍA (CLASIFICACION CARACTER(3) PRIMARY KEY,DESCRIPCIÓN CARACTER(12))

CREATE TABLE TITULO (COD_TITULO CARACTER(4) PRIMARY KEY, DESC_TITULO CARACTER(30),CLASIFICACION CARACTER(3),COLOR_S_N CARACTER(1) DEFAULT ‘S’

CHECK COLOR_S_N=’S’ OR COLOR_S_N=’N’,DURACIÓN NUMERIC(3)FOREIGN KEY CLASIFICACION REFERENCES CATEGORIA)

CREATE TABLE PRODUCTO (COD_PRODUCTO CARACTER(6) PRIMARY KEY,PRECIO NUMERIC(6,0),CANT NUMERIC(2,0),COD_TITULO CARACTER(4),FOREIGN KEY COD_TITULO REFERENCES TITULO)

CREATE TABLE UNIDAD (NUM_UNIDAD NUMERIC(4) PRIMERY KEY, COD_PRODUCTO CARACTER(6),COD_ALMACEN NUMERIC(2,0),FOREIGN KEY COD_PRODUCTO REFERENCES PRODUCTO,FOREIGN KEY COD_ALMACEN REFERENCES ALMACEN)

CREATE TABLE ACTORES (NOMBRE CARACTER(20) PRIMARY KEY,COD_TITULO CARACTER(4),FOREIGN KEY COD_TITULO REFERENCES TITULO)

La instrucción CREATE TABLE identifica el nombre de

la tabla, que debe ser única dentro del esquema.

Después de CREATE TABLE van entre paréntesis y

separadas por coma las instrucciones que definen las

columnas y las restricciones sobre la tabla.

55

Page 8: 4. sql (autoguardado)

Cada columna se define dando su nombre, su tipo de

dato, opcionalmente su valor por defecto y algunas

restricciones propias de la columna, tales como NOT

NULL (atributo con valor diferente de nulo), PRIMARY

KEY para llave primaria o restricciones CHECK para

limitar los posibles valores que pueden asignarse a la

columna.

La cláusula FOREIGN KEY sirve para identificar llaves

foráneas, las cuales permiten establecer relaciones

con otras tablas.

Junto con la instrucción CREATE TABLE para definir

una nueva tabla, SQL-92 ofrece también instrucciones

para modificar la estructura de una tabla tal como

ALTER TABLE para adicionar una columna, modificar

la definición de una columna o eliminar una columna

de una tabla. DROP TABLE es otra instrucción DDL

que permite borrar la estructura de una tabla

completamente.

4.2.2 Las vistas

Una vista es una consulta almacenada que se

convierte en una tabla virtual. Sus beneficios son:

56

Page 9: 4. sql (autoguardado)

Fácil de usar: Algunas consultas resultan

complicadas, luego de ser almacenada en una vista el

usuario obtiene los resultados deseados sin

preocuparse por los mecanismos.

Fácil de compartir: Diferentes usuarios pueden tener

diferentes resultados en una consulta a una misma

tabla. Es una ventana de acceso a los datos.

Independencia de datos: Todos los cambios en los

datos son automáticamente reflejados en la vista.

Para evitar mostrar el precio de los productos,

creamos una vista sobre la tabla producto

proyectando todos sus atributos a excepción del

atributo precio, así:

CREATE VIEW v_producto AS

SELECT cod_producto, cant, cod_titulo

FROM producto

TABLA producto

COD_PRODUCT

O

CANTIDA

D

COD_TITULO PRECIO

P428-V 3 P428 30.000

P428-B 1 P428 20.000

P781-C 1 P781 32.000

57

Page 10: 4. sql (autoguardado)

VISTA v_producto

La instrucción SELECT cod_producto, cant, cod_titulo

FROM producto, genera una proyección de estas

columnas sobre la tabla producto. (la instrucción

SELECT se verá en la siguiente sección).

En general, el formato para crear una vista es de la

siguiente manera:

CREATE VIEW nombre_vista AS

SELECT columna1, ..., columnan

FROM tabla1, ..., tablam

WHERE condiciones.

El proceso de selección (SELECT) se analizará en

detalle en la siguiente sección.

4.3 MANIPULACIÓN DE DATOS

La manipulación de datos abarca tanto la consulta

como la actualización. SQL-92 soporta las operaciones

de selección, proyección y producto de una manera

elemental e implementa directamente las

operaciones del álgebra relacional como la unión, la

58

Page 11: 4. sql (autoguardado)

intersección, la diferencia y el join. La división, de

acuerdo con Hansen y Hansen, es soportada de una

manera engorrosa.

Datos ilustrativos para las consultas

ALMACEN (COD_ALMACEN, NOMBRE)10 VISION12 CINEASTA

UNIDAD (NUM_UNIDAD, COD_PRODUCTO, COD_ALMACEN) 1 P428-V 10

2 P428-V 103 P428-V 124 P428-B 125 P781-C 12

PRODUCTO (COD_PRODUCTO, PRECIO, CANT, COD_TITULO)P428-V 30.000 3 P428P428-B 20.000 1 P428

5 P781-C 32.000 1 P781

TITULO (COD_TITULO,DESC_TITULO,CLASIF,COLOR_S_N, DURACIÓN )

P428 LA Z... FIC S 95P781 EL AMOR… ROM N 120

CATEGORÍA (CLASIFICACION, DESCRIPCIÓN) FIC FICCIÓN ROM ROMÁNTICA

ACTORES (NOMBRE, COD_TITULO)ANNA... P428HENRY... P428JIM... P781

4.3.1 Consultas simples

Lças consultas en SQL se hacen con el comando

SELECT. La forma general del comando SELECT es:

59

Page 12: 4. sql (autoguardado)

SELECT lista-del-select FROM nombres-tablas

[WHERE condición]

[GROUP BY lista-columnas] [HAVING condición]

[ORDER BY nombre-columna]

[INTO TEMP nombre-tabla]

Sólo son obligatorias las cláusulas SELECT y FROM. Si

se usan otras cláusulas ellas deben aparecer en el

orden que se muestra.

La cláusula INTO TEMP es usada para crear una tabla

temporal que puede ser usada en queries posteriores.

La tabla temporal puede ser juntada a las

permanentes de la base de datos. la tabla es borrada

automáticamente del disco cuando se hace salida del

RDBMS.

Una consulta simple es una consulta sobre una única

tabla de la base de datos. Ejemplos:

Obtener los nombres de todos los almacenes:

SELECT nombre FROM almacen

Resultado:

NOMBRE

VISIONCINEASTA

60

Page 13: 4. sql (autoguardado)

Si se requiere la consulta de registros bajo

condiciones especiales, es posible mediante la

cláusula WHERE, por ejemplo:

Obtener los títulos de las películas en blanco y negro:

SELECT desc_titulo FROM titulo

WHERE color_s_n = ‘N’

Resultado:

DESC_TITULO

EL AMOR…

Se debe tener presente que para las tablas que

contienen un gran número de filas, cualquier

instrucción que tiene una cláusula WHERE será más

eficiente si la columna en la cláusula WHERE es

indexada.

Las condiciones pueden ser de igualdad (=),

desigualdad (<>), mayor que (>), menor que (<),

mayor o igual a (>=) o menor o igual a (<=).

Para múltiples condiciones se pueden usar los

operadores lógicos AND, OR, IN (incluidos) y NOT. Se

sigue las reglas del álgebra booleana:

Listar los números de unidad de los almacenes 10 y

12:

61

Page 14: 4. sql (autoguardado)

SELECT num_unidad FROM unidad

WHERE cod_almacen = 10 OR cod_almacen =

12

Resultado:

NUM_UNIDAD12345

También se puede consultar así:

SELECT num_unidad FROM unidad

WHERE cod_almacen IN (10,12)

Es posible usar el comodín asterisco (*), para

significar que todas las columnas deben desplegarse.

Ejemplo: Obtener toda la información sobre unidades

de video:

SELECT * FROM unidad

Resultado:

NUM_UNIDAD COD_P COD_A1 P428-V 102 P428-V 103 P428-V 124 P428-B 125 P781-C 12

62

Page 15: 4. sql (autoguardado)

Dentro del SELECT se puede hacer uso de

expresiones, por ejemplo para calcular el precio total

de cada producto en existencia. Además podemos

ordenarlo ascendentemente por código de producto:

SELECT cod_producto, precio*cant FROM

producto

ORDER BY cod_producto

Resultado:

COD_PRODUCTO PRECIO*CANT P428-B 20.000 P428-V 90.000 P781-C 32.000

El ORDER BY ordena por defecto en forma

ascendente. La sintaxis para el ordenamiento es:

SELECT ...

ORDER BY columna o expresión [ASC/DESC]

Para obtener resultados entre rangos se permite el

operador BETWEEN, y se puede usar de la siguiente

manera para obtener los números de unidad entre el

2 y el 4:

SELECT * FROM unidad

WHERE num_unidad BETWEEN 2 AND 4

Resultado:

NUM_UNIDAD COD_P COD_ALM

63

Page 16: 4. sql (autoguardado)

2 P428-V 103 P428-V 124 P428-B 12

En general se puede usar así:

WHERE columna o expresión BETWEEN mínimo AND

máximo.

También se permite usar el operador NOT BETWEEN.

Se pueden usar caracteres comodines que son

símbolos especiales que valen lo que cualquier

cadena no especificada de caracteres, usando la

cláusula LIKE. El comodín % se usa para cero o más

caracteres mientras el comodín _ se utiliza para

exactamente un carácter.

Encontrar los títulos de películas que comienzan por

la partícula ‘LA’:

SELECT desc_titulo FROM titulo

WHERE desc_titulo LIKE ‘LA%’

Encontrar los títulos y duraciones de las películas que

comienzan por A y terminan en R pero sólo tienen

cuatro letras.

SELECT desc_titulo, duracion FROM titulo

64

Page 17: 4. sql (autoguardado)

WHERE desc_titulo LIKE ‘A_ _R’

Para algunos casos es probable que el valor de una

columna sea innecesario o desconocido, el valor NULL

puede ser asignado. El valor NULL no es igual a cero.

La comparación se usa de la siguiente forma:

SELECT …

WHERE columna ó expression IS [NOT] NULL

La cláusula DISTINCT facilita la supresión de valores

duplicados en una columna seleccionada para la

salida:

SELECT DISTINCT cod_titulo FROM producto

Resultado:

COD_TITULO

P428P781

4.3.2 Funciones integradas

Existen diversas funciones tanto estadísticas como de

manejo de cadenas de caracteres para dar mayor

flexibilidad al manejo de SQL.

65

Page 18: 4. sql (autoguardado)

En ocasiones se requiere de examinar un conjunto de

filas en una tabla y producir un valor. Para esto se

requiere de uso de funciones como SUM, AVG,

COUNT, MAX y MIN.

SUM sirve para calcular la sumatoria de los valores de

una columna o una expresión basada en columnas.

Así, podemos calcular la cantidad de películas en

existencia:

SELECT SUM(cant) FROM producto

Resultado:

SUM(cant)5

También podemos calcular el valor total de las

películas en existencia:

SELECT SUM(precio*cant) FROM producto

Resultado:

SUM(precio*cant)142.000

AVG sirve para calcular el valor promedio sobre una

columna.

MAX encuentra el valor máximo de una columna.

MIN encuentra el valor mínimo de una columna.

COUNT sirve para contar, pero tiene las siguientes

connotaciones:

66

Page 19: 4. sql (autoguardado)

COUNT (*): Cuenta el número de filas, incluyendo

nulos.

COUNT (columna): Cuenta los valores no nulos en

una simple columna.

COUNT (DISTINCT columna): Cuenta los valores

distintos no nulos de una simple columna.

Ejemplo: Contar el número de unidades de video del

almacén número 12.

SELECT COUNT(*) FROM unidad

WHERE cod_almacen = 12

Resultado:

COUNT(*)3

En las expresiones pueden aparecer los operadores

aritméticos convencionales: +, *, -, /

Entre las funciones que manejan cadenas de

caracteres se encuentran las siguientes:

cad1||cad2: Concatena las cadenas de caracteres. Los

nombres de columnas son cadenas validas.

LENGTH (cadena): Encuentra la longitud de la

cadena.

67

Page 20: 4. sql (autoguardado)

SUBSTR (cad,posic_inicial [,long]): Encuentra la

subcadena de "long" caracteres, empezando en

"posic_inicial".

UPPER (cadena): Cambia los caracteres minúsculas

por mayúsculas.

LOWER (cadena): Cambia los caracteres mayúsculas

por minúsculas.

TO_NUMBER (cadena): Convierte los datos carácter

(compuestos por números) en valore numéricos.

TO_CHAR (cadena): Convierte un campo numérico en

tipo carácter.

LPAD (cadena,long_n [,carac]): Rellena la izquierda

de la cadena con el "carac" especificado (por

defecto blancos), hasta que la longitud de la cadena

nueva sea "long_n".

RPAD (cad,long_n [,caract]): Rellena la derecha de la

cadena con el "carac" especificado (por defecto

blancos), hasta que la longitud de la cadena nueva

sea "long_n".

NVL (cad1,cad2): Si cad1 es nulo retorna cad2. En

otro caso retorna cad1.

DECODE (cadena,caso1,rcad1, .,defecto): La salida es

el resultado "rcad1" donde la cadena iguale la

ocurrencia de caso1 y asi sucesivamente. El último

argumento es el valor por defecto.

INITCAP(cadena): Vuelve mayúscula la letra inicial de

la cadena.

68

Page 21: 4. sql (autoguardado)

LTRIM(cadena,grupo): Va removiendo de izquierda a

derecha los caracteres que se encuentran en el

grupo.

RTRIM(cadena,grupo): Va removiendo de derecha a

izquierda los caracteres que se encuentran en el

grupo.

TO_CHAR (fecha,formato): Convierte una fecha a

cadena de caracteres para poder imprimirse.

TO_DATE (fecha,formato): Convierte cadena de

caracteres a fechas.

4.3.3 Manejo de grupos: GROUP BY y HAVING

La cláusula GROUP BY nos entrega resúmenes de

datos. Un registro de información resumida es

retornado para cada valor distinto encontrado en la

columna sobre la cual se hizo la agrupación:

Un grupo es un conjunto de filas que contienen el

mismo valor en una columna dada.

Cuando se agrupen datos, sólo las columnas incluidas

en la cláusula GROUP BY o las funciones agregadas

pueden aparecer en la lista del SELECT. Sinembargo

una columna en la lista del GROUP BY no necesita

estar en la lista del SELECT.

69

Page 22: 4. sql (autoguardado)

La cláusula HAVING se usa para restringir los grupos

que son seleccionados para la salida después de que

los datos han sido agrupados mediante GROUP BY.

Ejemplo: Contar el número de unidades de video de

cada almacén. Para resolver este problema, se deben

dividir las unidades en grupos, en las que en cada

grupo estén las unidades que tengan el mismo código

de almacén (cod_almacen). Luego se determina el

número de registros en cada grupo. Esto se hace en

SQL de la siguiente manera:

SELECT cod_almacén, COUNT(*) FROM unidad

GROUP BY cod_almacen

Resultado:

Cod_almacen COUNT(*)10 312 2

Ejemplo: Contar el número de unidades de video de

cada almacén pero teniendo en cuenta aquellos

almacenes que tengan por lo menos tres unidades.

SELECT cod_almacén, COUNT(*) FROM unidad

GROUP BY cod_almacen

HAVING COUNT(*) >= 3

Resultado:

70

Page 23: 4. sql (autoguardado)

Cod_almacen COUNT(*)10 3

También se puede involucrar la cláusula WHERE, la

cual verifica la restricción antes de proceder a

agrupar. Así por ejemplo: Calcular la cantidad de

unidades de video, en formato VHS, de cada almacén

para aquellos almacenes que tengan por lo menos

dos de éstas unidades. Se asume que las de formato

VHS son las que tienen una V como último caracter en

el código.

SELECT cod_almacén, COUNT(*) FROM unidad

WHERE cod_producto LIKE ‘%V’

GROUP BY cod_almacen

HAVING COUNT(*) >= 2

Resultado:

Cod_almacen COUNT(*)10 2

La diferencia entre la cláusula WHERE y la cláusula

HAVING es que la cláusula WHERE se aplica a las filas,

mientreas que la cláusula HAVING se aplica a los

grupos.

4.3.4 Consultas multi-tablas

71

Page 24: 4. sql (autoguardado)

En el álgebra relacional la conexión entre tablas se

logra mediante el uso del JOIN. En SQL se debe

verificar, igual que en álgebra relacional, que existan

campos relacionadores entre las tablas objeto de la

consulta.

Ejemplo: Seleccionar el número de unidad y el nombre del almacén de todas las películas.

SELECT num_unidad, nombreFROM almacen, unidadWHERE almacen.cod_almacen =

unidad.cod_almacen

Resultado:

NUM_UNIDAD NOMBRE1 VISION2 VISION3 CINEASTA4 CINEASTA5 CINEASTA

La condición de la cláusula WHERE constituye el Join:

almacen.cod_almacen = unidad.cod_almacen. La

columna sobre la cual se hace el join no

necesariamente debe ser seleccionada.

¿Cómo se procesa la instrucción del join? Como es

usual, la cláusula FROM se ejecuta primero. Pero

como hay dos tablas en la cláusula, el sistema crea

un producto cartesiano entre las filas de las tablas

72

Page 25: 4. sql (autoguardado)

almacén y unidad. En este caso como hay cinco filas

de la tabla unidad y dos filas de la tabla almacén, se

genera una tabla de diez filas (el producto entre las

cardinalidades). Y como hay tres columnas en unidad

y dos columnas en almacén, el número de columnas

es de cinco.

Después de crear la tabla resultante del producto

cartesiano, se aplica la restricción de la cláusula

WHERE, descartando las filas que no satisfacen la

condición. Finalmente se seleccionan las columnas

relacionadas en la cláusula SELECT.

Un alias es un nombre alternativo que se da a una

relación con el fin de evitar escribir repetidamente los

nombre de las tablas y abreviar la escritura de la

instrucción. Se pueden dar a los nombres de las

tablas alias en la cláusula FROM. Debe entonces

usarse el nombre del alias en todas las cláusulas del

comando SELECT.

Ejemplo: Obtener el número de unidad y título para todas las películas blanco y negro

SELECT num_unidad, desc_tituloFROM unidad u, producto p, titulo tWHERE u.cod_producto=p.cod_productoAND p.cod_titulo=t.cod_tituloAND color_s_n='N'

73

Page 26: 4. sql (autoguardado)

En el ejemplo anterior, en la cláusula WHERE, la

columna color_s_n no necesita alias ya que no

presenta ambigüedad, pues es claro que pertenece a

la tabla título. Obsérvese también que de las tres

condiciones de la cláusula WHERE, las dos primeras

corresponden al join mientras que la tercera es una

restricción propia del problema: las películas que no

son de color (color_s_n=’N’).

El Join sobre una misma tabla (self-join) se forma con

base en columnas que tengan el mismo tipo de

información.

Finalmente, por razones de desempeño, cuando los

joins afectan el rendimiento, las columnas del join

deben ser indexadas.

4.3.5 Subconsultas

Una subconsulta es una consulta dentro de otra

consulta también conocida como consulta anidada.

Puede ponerse dentro de la cláusula WHERE de una

consulta y es encerrada entre paréntesis. Esta es

evaluada primero.

El formato general de una subconsulta puede ser:

74

Page 27: 4. sql (autoguardado)

SELECT colum1, ..., column FROM tabla1, ...,

tablam

WHERE columi = (SELECT colum1,… column FROM

tabla

WHERE criterio de selección)

AND join sobre tabla1,... tablam o restricción

consulta

Las consultas internas pueden retornar un simple

resultado y este es usado como una constante en la

consulta externa.

Las subconsultas pueden retornar una lista de

valores. En tales casos los operadores IN y NOT IN

deberán ser usados para encadenar la consulta

externa con la lista de valores resultado de la

subconsulta.

Las consultas pueden ser enlazadas por más de una

columna. Se requiere que el orden de la columnas

nombradas en la cláusula WHERE de la consulta

externa corresponda al orden de las columnas

seleccionadas por la consulta interna. Se encadenan

con IN y NOT IN.

75

Page 28: 4. sql (autoguardado)

Seleccionar la descripción de la categoría de la

película titulada ‘EL AMOR...’:

SELECT descripcion FROM categoría

WHERE clasificacion=(SELECT clasificacion

FROM titulo

WHERE desc_titulo=’EL

AMOR...’)

De acuerdo con los datos ilustrativos del comienzo y

teniendo en cuenta que la consulta interna se ejecuta

primero arrojando el valor ‘ROM’, la subconsulta se

convierte, durante su ejecución, en la siguiente

consulta simple:

SELECT descripcion FROM categoría

WHERE clasificacion=’ROM’

El resultado final es ‘ROMANTICA’.

Veamos un ejemplo de subconsulta donde se

involucra un join y además un operador relacional

diferente de la igualdad:

Listar número de producto, título, en formato VHS, de las películas que cuestan menos de 50.000 y que duran menos que la película GHOSTBUSTERS

76

Page 29: 4. sql (autoguardado)

SELECT p.cod_producto, desc_tituloFROM producto p, titulo tWHERE p.cod_titulo=t.cod_tituloAND p.cod_producto LIKE '%V'AND precio < 50000AND duracion < (SELECT duracion FROM titulo

WHERE desc_titulo='Ghostbusters')

4.3.6 Comandos Adicionales del DML

Además del SELECT hay otros tres comandos del

Lenguje de Manipulación de Datos y junto con sus

opciones se listan a continuación. Estos comandos

son usados para ingresar, borrar, y modificar los

datos almacenados.

Para ingresar una fila en una tabla:

INSERT INTO nombre-tabla [(lista-columnas)]

VALUES (lista-valores)

Ejemplo:

INSERT INTO almacen (cod_almacen, nombre)

VALUES (15, ‘VIDEOCLUB’)

Como en la instrucción anterior se insertaron valores

para todas las columnas, se puede omitir la lista de

77

Page 30: 4. sql (autoguardado)

columnas y la instrucción se puede convertir en la

siguiente:

INSERT INTO almacen

VALUES (15, ‘VIDEOCLUB’)

Cuando sólo se genera una fila incompleta, se debe

especificar la lista de columnas en las que se

insertarán datos. En este caso las demás columnas

asumirán valores nulos.

Para modificar un subconjunto de columnas de un

subconjunto de filas de una tabla:

UPDATE nombre-tabla

SET nombre-columna=expresión

[WHERE condición]

Ejemplo:

UPDATE almacen

SET nombre=’CENTRO CULTURAL’

WHERE cod_almacen=15;

Si se omite la cláusula WHERE, modificaría el nombre

en todos los registros. Por otra parte, si la fila

especificada en la cláusula del WHERE no existe, no

78

Page 31: 4. sql (autoguardado)

se modifica ningún dato pero tampoco se genera

error alguno.

Para eliminar un subconjunto de filas de una tabla:

DELETE FROM nombre-tabla

[WHERE condición]

Ejemplo:

DELETE FROM almacen

WHERE cod_almacen=15;

De manera similar a la instrucción UPDATE, si se

omite la cláusula WHERE, el DELETE eliminaría todos

los registros de la tabla almacén. Por otra parte, si la

fila especificada en la cláusula del WHERE no existe,

no se elimina ningún registro y tampoco se generaría.

4.4 EJERCICIOS PROPUESTOS

1. Cantidad de ejemplares por cada película de

ficción

2. La cantidad de unidades por cada categoría

3. Listado de actores de las películas del almacén

número 1

79

Page 32: 4. sql (autoguardado)

4. Títulos de películas que cuestan más del precio

promedio de las películas en formato Beta

5. Todos los actores, sin repetir, ordenados

alfabéticamente en forma descendente

6. Títulos de películas románticas ordenadas

alfabéticamente

7. Títulos de los que no hay existencias en la tienda 2

8. Listado de títulos (descripciones) distribuidos por

el almacén “LE CINEMA”

9. La cantidad de unidades por cada almacén

10. La película con mayor duración por cada

categoría

11. El valor total a cargo de cada almacén

12. Los códigos de producto que tienen existencias

superiores al promedio de cintas por producto

13. Nombres de los almacenes donde hay películas

del actor BEN MURPHY

80