1. Base d D
B de Datos:
Lenguaje SQL
guaj Q
Profesor:
MSC.
MSC Luis Serna Jherry
Jherry.
2. Objetivos de Hoy
Introducción al SQL Basico
Sentencias DDL:
CREATE TABLE
ALTER TABLE
DROP TABLE
Sentencia DML:
SELECT
Cláusulas SELECT, FROM, INTO, WHERE
Cláusulas GROUP BY, HAVING
Cláusula ORDER BY
á
Tipos de JOIN
Subqueries
Sentencias INSERT UPDATE y DELETE
INSERT,
4. SENTENCIAS DDL
CREATE TABLE
Las tablas se definen en tres pasos:
Dar el nombre a la tabla
Definir cada columna, posiblemente incluyendo
restricciones de columna
Definir las restricciones de la tabla
5. SENTENCIAS DDL
CREATE TABLE
CREATE TABLE nombre-tabla
{campo1 (tipo ta a o / do
ca po (t po tamaño dominio) [NOT NULL],
o) [ O U ],
[campo2 (tipo tamaño / dominio) [NOT NULL]],
[PRIMARY KEY (c1, c2, ..., cn)],
[ (c , c , , c )
[FOREIGN KEY (c1) REFERENCES tabla-x],
[CHECK (P)]}
6. SENTENCIAS DDL
CREATE TABLE
Nombre-tabla: Es el nombre de la tabla que se va a crear.
Campo i: son los nombres de los campos de la tabla.
p p
Tipo: Es el tipo de datos del campo.
Tamaño:Es el tamaño del campo en caracteres
p
Dominio: es el nombre del dominio asignado al campo.
7. SENTENCIAS DDL
CREATE TABLE
Primary Key: especifica las columnas que conforman la
clave primaria de la tabla.
Foreign key: indica las columnas que constituyen clave
externa en la tabla
References: indica la tabla que provee la clave foránea.
Check (P): especifica un predicado que debe satisfacer
cada fila de la tabla
8. SENTENCIAS DDL
Ejemplos: CREATE TABLE
CREATE TABLE Clientes
(
(id-cliente char(5) not null,
( ) ,
nombre-cliente char(20),
ca e c e te
calle-cliente c a (30),
char(30),
primary key id-cliente)
9. SENTENCIAS DDL
Ejemplos: CREATE TABLE
CREATE TABLE Cuenta
(
(id-cuenta char(10) not null,
( ) ,
id-cliente char(5),
sa do
saldo integer
tege
check (saldo >= 0),
primary key id cuenta
id-cuenta
foreign key id-cliente references clientes)
10. SENTENCIAS DDL
Uso de Constraints
Una restricción es similar a un índice, aunque también se
puede utilizar para establecer una relación con otra tabla.
Puede utilizar la cláusula CONSTRAINT en las instrucciones
ALTER TABLE y CREATE TABLE para crear o eliminar
restricciones.
restricciones
Hay dos tipos de cláusulas CONSTRAINT: una para crear
una restricciones en un único campo y otra para crear una
p p
restricción en más de un campo.
11. SENTENCIAS DDL
Uso de Constraints
CONSTRAINT nombre
{
{PRIMARY KEY (p
(principal1 [,principal2 [, ...]]) |
p [,p p ]])
UNIQUE (único1 [,único2 [, ...]]) |
NOT NULL (negadonulo1 [,negadonulo2 [, ...]]) |
FOREIGN KEY (referencia1 [,referencia2 [, ...]])
REFERENCES tabla_externa [(campo_externo1
[,campo_externo2 [, ]])]}
[ campo externo2 [ ...]])]}
12. SENTENCIAS DDL
Uso de Constraints
Nombre: Es el nombre de la restricción que se va
a crear.
principal1, principal2: Son los nombres de los
campos que se van a designar como clave
principal.
p incipal
único1, único2: Son los nombres de los campos
que se van a designar como clave única
única.
13. SENTENCIAS DDL
Uso de Constraints
negadonulo1, negadonulo2: Son los nombres de
campos que se van a limitar a valores no Null.
p q
referencia1, referencia2: Son los nombres de los
campos de la clave externa a los que se hace
referencia en otra tabla.
14. SENTENCIAS DDL
Uso de Constraints
Tabla_externa: Es el nombre de la tabla externa que
contiene el campo o los campos especificados por
p p p p
campo_externo.
Campo_externo1, campo_externo2: Son los nombres de
los
l campos en tabla_externa especificados por
t bl t ifi d
referencia1, referencia2. Puede omitir esta cláusula si el
campo al que se hace referencia es la clave principal de
tabla_externa.
15. SENTENCIAS DDL
ALTER TABLE
ALTER TABLE nombre-tabla
{
{ADD | MODIFY
[COLUMN campo tipo [(tamaño)] [NOT NULL]
[CONSTRAINT nombre-constraint tipo-constraint]] |
[CONSTRAINT nombre-constraint tipo-constraint
(campo,…)]}
16. SENTENCIAS DDL
ALTER TABLE
Tabla: Es el nombre de la tabla que se va a
modificar.
modificar
Campo: Es el nombre del campo que se va a
agregar o eliminar de tabla.
tabla
Tipo: Es el tipo de datos del campo.
Tamaño:Es el tamaño del campo en caracteres
17. SENTENCIAS DDL
Ejemplos: ALTER TABLE
Adicionar un campo:
ALTER TABLE Empleados ADD COLUMN Salario
number(15,2)
Quitar el campo Salario de la tabla
Empleados:
ALTER TABLE Empleados DROP COLUMN
Salario;
18. SENTENCIAS DDL
Ejemplos: ALTER TABLE
Adicionar una clave foránea:
ALTER TABLE Pedidos ADD CONSTRAINT
PedidosEmpleados FOREIGN KEY (IdEmpleado)
REFERENCES Empleados (IdEmpleado)
Quitar la clave externa existente de la tabla
Pedidos:
ALTER TABLE Pedidos DROP CONSTRAINT
PedidosEmpleados;
19. SENTENCIAS DDL
DROP
DROP {TABLE tabla | INDEX índice ON tabla}
tabla: Es el nombre de la tabla que se va a
eliminar o la tabla de la cual se va a eliminar un
índice.
Índice: Es el nombre del índice que se va a
q
eliminar de tabla.
20. SENTENCIAS DDL
Ejemplos: DROP
Ejemplo de como se elimina el índice Mi_Indice
de la tabla Empleados:
DROP INDEX Mi_Indice ON Empleados;
Ejemplo de cómo se elimina una tabla:
DROP TABLE Practicas;
;
22. Introducción l
I t d ió al SQL - SQL DML
Sentencias de Manipulación de Datos
SELECT INSERT
UPDATE DELETE
23. Sentencia SELECT – Estructura
Básica
SELECT ..... FROM .... WHERE
SELECT corresponde a la operación Proyección (Π).
Lista los atributos deseados en el resultado de la
consulta.
FROM corresponde a la operación Producto
Cartesiano (X). Lista las relaciones que se deben
analizar.
WHERE corresponde al predicado S l ió ( ) y se
d l di d Selección (σ),
refiere a los atributos de las relaciones listadas en
FROM.
25. Cláusula SELECT
En la cláusula SELECT se especifican las
columnas que van a ser mostradas en
pantalla
SELECT [all | distinct]
{* | tabla.* | [
[tabla.]campo1 [
] p [encab1] ,
]
[tabla.]campo2 [encab2] , ...}
26. Cláusula FROM
Específica la(s) fuente(s) de donde van a ser
tomadas las columnas mostradas y/o operadas en
y/ p
la sentencia Select.
[SELECT…]
FROM expresión tabla [as] t_alias [, ...]
27. Cláusula INTO
La cláusula INTO, permite guardar los
resultados intermedios de una consulta
[SELECT ...] INTO tabla_into
] tabla into
[FROM ...]
28. Cláusula WHERE
Donde se especifican las condiciones de
búsqueda y join para las filas que conforman el
conjunto resultado.
[SELECT ...]
[FROM ...]
WHERE condiciones_de_búsqueda
Tipos de condiciones
Condiciones de comparación, de Join, o de Subquery.
29. Ejemplos de la Sentencia SELECT
SELECT distinct emp_id, fecha_nac, direccion
FROM EMPLEADO
WHERE nombre = “Juan” AND apellido = “Perez”
∏fecha_nac, direccion (σnombre = “Juan” AND apellido = “Perez” (EMPLEADO))
30. Ejemplos de la Sentencia SELECT
‘Mostrar la relación de clientes que han obtenido un préstamo
en alguna sucursal de Miraflores’
SELECT DISTINCT nombre-cliente
FROM PRESTATARIO PRS, PRESTAMO PTR
WHERE PRS.idpréstamo = PRT.numpréstamo
AND
nombre-sucursal = “Miraflores”
Miraflores
31. Condiciones de Búsqueda
Las condiciones de búsqueda pueden incluir:
Operadores de Comparación (=, <>, < y >).
(= <> >)
Porciones de cadenas de caracteres (SUBSTR)
Rangos (BETWEEN y NOT BETWEEN).
g ( )
Listas (IN, NOT IN).
Patrones de caracteres (LIKE y NOT LIKE).
Valores desconocidos (IS NULL y IS NOT NULL).
Combinaciones con conjunciones (AND, OR).
32. Condiciones de Búsqueda
Operadores de comparación:
WHERE SueldoBásico > 1000
WHERE SUBSTR(CodigoPostal, 1, 3)= “SAN”
Rangos (BETWEEN / NOT BETWEEN):
WHERE SueldoBásico BETWEEN 1000 AND 5000
Listas (IN / NOT IN):
WHERE Departamento NOT IN ('ADM', 'SIS')
Coincidencia de patrones o cadenas de caracteres (LIKE /
NOT LIKE))
WHERE NombreCompleto LIKE “LET%”
33. Comodines (Wildcards) en la
cláusula WHERE
Wildcard Significado
g
*% Cualquier cadena de cero o mas caracteres.
?, #, _ Cualquier carácter/ número único.
[-] Cualquier carácter único dentro de un rango.
[!] Cualquier carácter único que no está dentro de
un rango.
34. Operadores y Wildcards en la
cláusula WHERE
….WHERE Nombre
LIKE “Ma%” busca todos los nombres que comiencen con “Ma”
(Ej.: María, Mariana, Manuel, Martín)
LIKE “%ía” busca todos los nombres que terminen con “ía”.
(Ej.: Sofía, María, Estefanía).
LIKE “%ar%” busca todos los nombres que tengan las letras “ar”.
(Ej.:Carlos, Arturo Eleazar)
(Ej :Carlos Arturo, Eleazar).
35. Operadores y Wildcards en la
cláusula WHERE
LIKE “_va” busca todos los nombres de tres letras que
terminan en “va”. (Ej.: Eva, Iva, Ava).
( j , , )
LIKE “[CM]arlo[ns]” busca todos los nombres:
Carlon, Marlon, Carlos y Marlos.
LIKE “[B D]elia”
[B-D]elia busca todos los nombres que terminan en
“elia” y que comiencen con las letras de la
B a la D. (Ej.: Delia, Celia).
LIKE “_ _ _” busca todas las cadenas de exactamente 3
caracteres.
LIKE “_ _ _ %” busca las cadenas de al menos 3 caracteres.
36. Operadores y Wildcards en la
cláusula WHERE
CARACTERES DE ESCAPE:
Para que los patrones puedan contener los caracteres especiales
comodín, se especifica un caracter de escape.
LIKE “%ab_cd” escape “” busca todas las cadenas que
“% b d” b t d l d
terminen con “ab_cd”.
LIKE “ab_cd%” escape “” busca las cadenas que empiecen
con “ab_cd”.
37. Tablas Combinadas
Permite especificar la tabla resultante de una operación de
reunión natural en la cláusula FROM, en lugar de colocar las
, g
condiciones de JOIN en el WHERE
[SELECT]
FROM TABLA1 [INNER] JOIN TABLA2
ON TABLA1.COLUMNA1 = TABLA2.COLUMNA1
[WHERE]
38. Tablas Combinadas
SELECT DISTINCT nombre-cliente
FROM PRESTATARIO PRS [INNER] JOIN PRESTAMO PTR
On PRS.idpréstamo = PRT.numpréstamo
WHERE nombre-sucursal = “Miraflores”
39. Cláusula GROUP BY
Especifica las columnas por las que las filas
van a estar agrupadas o particionadas Los
particionadas.
resultados del query contienen un valor o
conjunto de valores para cada conjunto de
j p j
valores indicado por las
funciones_de_agregación nombradas en la
lista del Select
40. Cláusula GROUP BY
á
SELECT {{columnas_de_agrupación,…},
{función_de_agregación,…}}
{f ió d ió }}
FROM …
[WHERE …]
GROUP BY {columnas_de_agrupación,…}
{columnas de agrupación }
41. Funciones de Agregación más
g g
usadas
SUM([ALL|DISTINCT] Calcula el total de una expresión numérica
expresión) para todas las filas o sólo las distintas.
AVG([ALL|DISTINCT] Calcula el promedio de una expresión
expresión) numérica para las filas involucradas.
([ | ]
MIN([ALL|DISTINCT] Calcula el mínimo valor de una expresión
p
expresión) numérica para las filas involucradas
MAX([ALL|DISTINCT] Calcula el máximo valor de una expresión
expresión) numérica para las filas involucradas.
COUNT([ALL|DISTINCT] Número de veces que se repite el valor de la
expresión) expresión.
COUNT(*) Número
Núme o de filas seleccionadas
42. Cláusula GROUP BY
á
‘Mostrar la suma de sueldo básico de los empleados
activos, por Departamento’
SELECT Nombre_Depto, SUM(SueldoBasico)
FROM EMPLEADO EM, DEPARTAMENTO DE
EM
WHERE EM.IDDepartamento = DE.IDDepartamento
AND
EstadoEmpleado= 'ACT’
GROUP BY Nombre_Depto
43. Cláusula GROUP BY
á
“Obtener el número de titulares de cuenta de cada
sucursal
sucursal”
SELECT nombre_sucursal,
nombre sucursal, COUNT ( DISTINCT
nombre-cliente)
FROM TITULAR-CUENTA TC, CUENTA CUE
WHERE TC.numero-cuenta = CUE. numero-cuenta
GROUP BY nombre-sucursal
44. Cláusula HAVING
á
Especifica una restricción que aplica a las
funciones de agregación de los grupos Esto
grupos.
afecta a las filas que son devueltas como
resultado y no al cálculo de las funciones de
agregación.
La cláusula WHERE si condiciona el número de
filas que intervienen en el cálculo de las
funciones de agregación.
45. Cláusula HAVING
á
SELECT {{columnas_de_agrupación,…},
{función_de_agregación,…}}
{función de agregación }}
FROM …
[WHERE …] ]
GROUP BY {columnas_de_agrupación,…}
HAVING condiciones de búsqueda
condiciones_de_búsqueda
46. GROUP BY y HAVING
“Mostrar el sueldo promedio de los Departamentos con
promedio superior a 1000”
SELECT Nombre_Depto, AVG(SueldoBasico)
FROM EMPLEADO EM, DEPARTAMENTO DE
WHERE EM.IDDepartamento
EM IDDepartamento =
DE.IDDepartamento AND
EstadoEmpleado= 'ACT'
p
GROUP BY Nombre_Depto
HAVING AVG(SueldoBasico) > 1000
47. GROUP BY y HAVING
“Saldo promedio de cada cliente de Surco que tiene como mínimo
3 cuentas”
SELECT TC. Nombre-cliente, AVG (saldo)
FROM TITULAR-CUENTA TC, CUENTA CUE, CLIENTE CLI
WHERE TC.numero-cuenta = CUE
TC t CUE.numero-cuenta
t
AND
TC.nombre-cliente = C
C o b e c e te CLI.nombre-cliente AND
o b e c e te
ciudad-cliente = “Surco”
GROUP BY TC.nombre-cliente
HAVING COUNT (DISTINCT TC.numero-cuenta) >= 3
48. GROUP BY - HAVING - WHERE
Procedimiento:
Si en una misma consulta aparece una cláusula WHERE y una
cláusula HAVING, se aplica primero el predicado de la cláusula
WHERE.
Las tuplas que satisfagan la condición, se colocan en grupos
según la cláusula GROUP BY.
La cláusula HAVING se aplica luego a cada grupo. Los grupos
grupo
que no la satisfagan se eliminan.
La cláusula SELECT utiliza los grupos restantes para generar las
tuplas resultado de la consulta.
49. Cláusula ORDER BY
Ordena el resultado de los querys por los valores de las
columnas mencionadas. Solamente se puede ordenar por
las columnas especificadas en el SELECT.
ASC: Es el valor por defecto e indica que los resultados se van a
p
presentar ascendentemente.
DESC: Debe especificarse al lado de la columna cuyo orden se
desea ver en forma descendente.
Consideración: ordenar un gran número de tuplas puede
ser costoso. Es conveniente ordenar sólo cuando sea
estrictamente necesario.
50. Cláusula ORDER BY
á
SELECT {columna 1, columna 2,…}
FROM …
[WHERE …]
[GROUP BY...]
[HAVING ...]
ORDER BY columna 1 [ASC|DESC],....
51. Cláusula ORDER BY
á
SELECT Nombre 'Departamento',
AVG(SueldoBasico) 'Promedio Sueldos'
FROM EMPLEADO EM, DEPARTAMENTO DE
WHERE EM.Departamento = DE.Departamento
GROUP BY Nombre
ORDER BY AVG(SueldoBasico) DESC
52. Operador UNION
Permite manipular los resultados de dos o mas
querys,
querys combinándolos en un único conjunto de datos.
datos
Muestra las filas recuperadas por cualquiera de los
query
A diferencia del SELECT, que por omisión conserva los
duplicados, la operación de unión normalmente los
suprime.
A fin de evitar esto, es necesario colocar a
continuación del operador UNION la palabra clave ALL
53. Operador UNION
Query1 [UNION [ALL]] QueryN
[
[ORDER BY…..]
]
donde:
Query1: y QueryN
SELECT select-list
l l SELECT select-list
l t li t
[INTO] [FROM]
[
[FROM]] [
[WHERE] ]
[WHERE] [GROUP BY]
[GROUP BY] [HAVING]
[HAVING]
54. Operador UNION
Todas las select-list mencionadas con la sentencia
UNION, deben tener el mismo número de expresiones
(columnas, e p esiones aritméticas, funciones
(col mnas expresiones a itméticas f nciones de
agregación, etc.).
Las columnas que se corresponden, deben tener el
mismo tipo de dato, sino es así, debe existir una
í
conversión de datos implícita o explícita con una
función de conversión de por medio.
55. Operador UNION
“Todos los clientes que poseen una cuenta, un
préstamo o ambos
ambos”
(SELECT nombre-cliente
FROM TITULAR-CUENTA)
UNION
(SELECT nombre-cliente
FROM PRESTATARIO)
56. OUTER JOINS
Los outer joins extienden los resultados de un join simple. Retornan las
filas coincidentes y también las filas de una de las tablas que no tiene
elementos en común con la otra.
[Select]
From tabla1, tabla2
WHERE tabla1.columna1 = tabla2.columna1 (+)
[Select]
From tabla1 LEFT [OUTER] JOIN TABLA2
ON tabla1.columna1 = tabla2.columna1
…..devuelven todas las filas de la tabla1 aunque no tengan
g
coincidencias con la tabla2 en la columna1.
57. OUTER JOINS
SELECT IDPersona, NombreCompleto,
IDDepartamento, SueldoBasico
FROM PERSONA,
PERSONA EMPLEADO
WHERE IDPersona = IDEmpleado (+)
SELECT IDPersona, N b C
IDP NombreCompleto,
l t
IDDepartamento, SueldoBasico
FROM PERSONA LEFT JOIN EMPLEADO
ON
O IDPersona = IDEmpleado
l d
(Seleccionan todas las personas, aún las que no figuran en la tabla
EMPLEADO)
58. OUTER JOINS
SELECT DE.Nombre_Dpto, IDEmpleado, SueldoBasico
FROM EMPLEADO RIGHT JOIN DEPARTAMENTO
ON EMPLEADO.IDDepartamento =
DEPARTAMENTO.IDDepartamento
(Selecciona todos los departamentos, aún los que no tienen
empleados)
Un join simple descarta las filas no coincidentes.
coincidentes
Un outer join preserva filas que de otra forma serían
descartadas.
59. Uso de Subqueries
Un Subquery es una sentencia SELECT
anidada dentro de otras sentencias SQL
como SELECT, INSERT, UPDATE o DELETE,
o dentro de otro Subquery.
q y
A una sentencia SELECT, que contiene uno o
mas Subqueries, se la denomina Nested
q
Query o SELECT anidado.
60. Uso de Subqueries
Subqueries con IN / NOT IN:
El resultado, es una lista de cero o mas valores.
resultado valores
Una vez que el Subquery devuelve resultados, el
Outer query los usa, por inclusión o negación.
Con la palabra IN se puede resolver el operador
relacional de Intersección
Empleando NOT IN se resuelve el operador
Diferencia
61. Uso de Subqueries
SELECT NombreCompleto, SueldoBasico
FROM PERSONA,
PERSONA EMPLEADO
WHERE IDPersona=IDEmpleado and
IDEmpleado
IDE l d NOT IN
(SELECT IDEmpleado FROM
SANCIONES_EMPLEADO)
62. Uso de Subqueries
Subqueries con Operadores de comparación.
Son los subquerys que se introducen con algún
operador de comparación como =, <>, <, <=, >,
>=, etc.
Estos subqueries retornan un solo valor.
63. Uso de Subqueries
Operadores de comparación modificados por ANY
o ALL. Estos subqueries retornan cero o
muchos valores.
> ALL, significa que todos los valores retornados por
el subquery son menores al valor de comparación del
outer.
> ANY, significa que por lo menos un valor retornado
ANY
por el subquery es menor al valor de comparación del
outer.
64. Uso de Subqueries.
Mostrar ID, nombre y sueldo de todos los empleados cuyo
sueldo es mayor a todos los sueldos de la tabla CARGO
y
SELECT IDEmpleado, NombreCompleto,
SueldoBasico
FROM EMPLEADO, PERSONA
WHERE IDEmpleado = IDPersona
AND SueldoBasico > ALL
(SELECT Sueldo FROM CARGO)
65. Uso de Subqueries.
Mostrar ID, nombre y sueldo de todos los empleados cuyo sueldo
es mayor a alguno de los sueldos de la tabla CARGO
SELECT IDEmpleado, NombreCompleto, SueldoBasico
FROM EMPLEADO, PERSONA
WHERE IDEmpleado = IDPersona
AND SueldoBasico > ANY
(SELECT Sueldo FROM CARGO)
66. Uso de Subqueries.
Subqueries con el uso de la palabra EXISTS:
Funciona como un test de existencia. La cláusula
WHERE,
WHERE examina la existencia de filas devueltas
por el Subquery. El Subquery devuelve los
valores de TRUE o FALSE.
67. Uso de Subqueries.
“Muestra los códigos de los empleados que tienen
alguna sanción”
g
SELECT IDEmpleado
FROM EMPLEADO EM
WHERE EXISTS
(SELECT * FROM SANCIONES EMPLEADO SE
SANCIONES_EMPLEADO
WHERE EM.IDEmpleado = SE.IDEmpleado)
68. Subqueries correlativos
Aquellos queries anidados donde el Subquery
depende del outer query para devolver sus
valores.
Esto significa que el Subquery se ejecuta
repetidamente, una vez por cada fila seleccionada
por el Outer query.
69. Subqueries Correlativos
SELECT a.IDEmpleado, a.SueldoBasico
FROM EMPLEADO a
WHERE a.SueldoBasico >=
(SELECT b.SueldoBasico FROM EMPLEADO b
WHERE a.IDJefe = b.IDEmpleado )
Muestra código y sueldo de los empleados cuyos sueldos
son mayores o iguales a los sueldos de sus respectivos
jefes
70. Sentencia INSERT
INSERT es otra sentencia DML base, usada para
incorporar nuevas filas a una tabla de base de
datos.
INSERT [INTO]
{table name view-name} [(column-list)]
{table-name | view name} [(column list)]
{VALUES | (values-list) | select-statement }
71. Ejemplos de la Sentencia INSERT
Fabricantes (Nfabricante, país)
INSERT INTO FABRICANTES (Nfabricante, País)
VALUES (“Reynolds Tobacco CO.”, “EEUU”)
Marcas (marca, Nfabricante, cartón, embalaje)
INSERT INTO MARCAS
VALUES (“Camel”, “Reynolds Tobacco CO.”, 10, 20)
72. Sentencia UPDATE
Modifica los datos existentes en filas de una
tabla de Base de Datos
UPDATE {table-name | view-name}
SET{column list
SET{column-list
| variable-list
| variable_and_column-list},…..
[ WHERE { condition }]
73. Sentencia UPDATE
Cambiar aquellos cigarrillos de clase “Normal”, con filtro,
fabricados por “Tabacalera Nacional”, de modo que
p , q
ahora no tengan filtro
UPDATE CIGARRILLOS
SET filtro = “N”
N
WHERE marca in
(
(SELECT marca FROM MARCAS
WHERE Nfabricante = “Tabacalera Nacional”
And filtro = “S” and clase = “Normal”)
75. Sentencia DELETE
Eliminar todos los fabricantes que no manufacturen
cigarrillos de clase “Ultra Light”
DELETE FROM FABRICANTES
WHERE Nfabricante NOT IN
(SELECT DISTINCT Nfabricante
FROM MARCAS
WHERE marca IN
(SELECT marca FROM CIGARRILLOS
WHERE clase = “Ultra Light”))