You are on page 1of 22

Notas de Clase BD

LENGUAJES DE CONSULTA COMERCIALES Los lenguajes formales proporcionan una notacin concisa para representar consultas. Sin embargo los sistemas comerciales de BD requieren un lenguaje de consulta ms amigable para el usuario. Algunos de estos lenguajes son: SQL, QBE y Quel. QBE (Query By Example) est basado en el clculo relacional de dominios. Quel est basado en el clculo relacional de tuplas. SQL (Structured Query Languaje) usa una combinacin de construcciones del lgebra y del clculo relacional. Aunque estos lenguajes se les referencia como lenguajes de consulta, SQL, QBE y Quel tienen muchas otras capacidades adems de consultar una BD. Estas incluyen caractersticas para definir la estructura de los datos, para modificarlos y para especificar restricciones de seguridad. SQL (Structured Query Languaje) Existen numerosas versiones de SQL. La versin original fue desarrollada en un laboratorio de IBM (Sn. Jos Research Laboratory de IBM). Originalmente llamado Sequel, fue implementado como parte del proyecto System R (Sistema de BD relacional de IBM) en los primeros aos de la dcada de los setenta. El lenguaje Sequel ha evolucionado desde entonces y su nombre ha cambiado a SQL. El SQL se ha establecido claramente como el lenguaje de BD relacional estndar. El SQL tiene varias partes: - DDL (Lenguaje de definicin de datos): El SQL-DDL proporciona rdenes para definir esquemas de relaciones, eliminar relaciones, crear ndices y modificar esquemas de relaciones. Adems incluye rdenes para definir vistas y para especificar derechos de acceso a relaciones y vistas. - DML (Lenguaje de manipulacin de datos): El SQL-DML incluye un lenguaje de consultas basado en el lgebra relacional y en el clculo relacional de tuplas. Tambin incluye rdenes para insertar, suprimir y modificar tuplas de la BD. - DML inmerso: La forma inmersa de SQL est diseada para usar dentro de los lenguajes de programacin de propsito general, tales como Cobol, Pascal, C ... - Control de transacciones: SQL incluye rdenes para especificar el comienzo y el final de transacciones. - Integridad: Las versiones recientes de SQL proporcionan formas de comprobacin de integridad. SQL es usado para interactuar con una base de datos relacional, est clasificado como el lenguaje estndar para la administracin de los datos en estas bases de datos.

Jos Ignacio Botero O. Margarita Mara Hincapi V.

59

Creacin de un Script Es un archivo plano con extensin sql, en el cual se almacenan las instrucciones SQL para acceder a los datos de la base de datos. La caracterstica fundamental es que no posee formato; puede ser creado con cualquier editor de archivos planos: Editor del DOS, Word, Block de Notas, Vi. Sentencias SQL Son las instrucciones con las cuales el usuario (Administrador de datos, Administrador de la base de datos, Programador, usuario final) realiza la comunicacin entre l y la base de datos. Tipos de datos. Para SQL/plus, existen varios tipos de datos, pero trabajaremos bsicamente con 3 (Tres) tipos de datos: Varchar2, Number y Date. Varchar2: Para el almacenamiento de datos tipo Alfanumrico, su formato general es: Nombre_variable varchar2(n). Donde n = Nmero de posiciones que ocupa el dato almacenado. Ejemplo: create table personal (identificacion varchar2(15),....); Number: Almacena datos tipo numrico, incluyendo valores con punto flotante. El formato general es: Nombre_variable number(n) o Nombre_variable number(n,m) Ejemplo: create table personal (hijos number(3), sueldo number(10,2)...); Date: Almacena datos tipo fecha, el tamao del dato es fijo, no hay que definirlo. El Formato general es: Nombre_variable date. Ejemplo: create table personal ( fecha_nac date...); Operadores Aritmticos Suma + Resta - Multiplicacin * Divisin / Operadores Relacionales. Igual a Mayor que = >
2005 60

Jos Ignacio Botero O. Margarita Mara Hincapi V.

Mayor o igual a Menor que Menor o igual Diferente

>= < <= =!

Operadores Lgicos AND OR NOT Otros Operadores IN NOT BETWEEN LIKE Definicin de datos El DDL de SQL permite crear varias estructuras de datos tales como: Relaciones o tablas, ndices, vistas, secuencias. Creacin de relaciones o tablas El SQL-DDL permite la definicin no slo de un conjunto de relaciones, sino tambin informacin sobre cada relacin incluyendo: - El esquema para cada relacin. - El dominio asociado con cada atributo. - El conjunto de limitantes que se va a mantener para cada relacin. Una relacin o tabla en SQL se define usando la orden: Create table nombre_tabla (nombre_campo1 tipo_datos(Dimensin), nombre_campo2 tipo_dato(Dimensin), ); Ejemplo creacin objeto tabla: CREATE TABLE Asociados ( id number(8), nombre_a varchar2(30), telefono varchar2(10), cod_c number(3)); Una relacin recin creada est inicialmente vaca. La orden Insert puede usarse para cargar datos en la relacin. Limitantes de integridad de los datos (Constraints) Permite establecer la integridad de los datos en la base de datos. Hay varios tipos:
Jos Ignacio Botero O. Margarita Mara Hincapi V. 2005 61

- NOT NULL (NN): especifica que el campo no puede tener valor nulo. - UNIQUE (UK): indica que el campo debe tener valores nicos para todas las filas de la tabla. - PRIMARY KEY (PK): quien identifica de una manera nica cada fila de una tabla. - REFERENCES (FK): establece y refuerza la relacin existente entre una clave fornea y la clave primaria de una tabla referenciada. - CHECK (CK): especifica una condicin que debe ser verdadera. Sintaxis: Create table nombre_tabla (nombre_campo1 tipo_datos Constraint nombre_constraint tipo_constraint, nombre_campo2 tipo_dato Constraint nombre_constraint tipo_constraint ); Ejemplo de uso, corresponde al cuadro dado a continuacin: CREATE TABLE Asociados ( id number(8) CONSTRAINT id_pk PRIMARY KEY, nombre_a varchar2(30) CONTRAINT nombre_a_nn CHECK(nombre_a is not null), telefono varchar2(10), cod_c number(3) CONSTRAINT cod_c_fk REFERENCES carreras(codigo) CONTRAINT cod_c_nn CHECK(cod_c is not null)); Tabla: Asociados columnas id tipo clave PK nulos/unico tabla_de_fk col_ref_fk tipo_dato long_max NN, UK num 8 nombre_a NN char 30 char 10 telefono cod_c FK NN Carreras cdigo num 3

ALTER TABLE: Es una instruccin de DDL-SQL que puede usarse para: 1- Adicionar un campo a una tabla. Sintaxis: ALTER TABLE r ADD (nom_campo1 tipo, nom_campo2 tipo, ...) donde r es una relacin o tabla y nom_campoi es el campo a adicionar con su tipo de dato o dominio respectivo.
Jos Ignacio Botero O. Margarita Mara Hincapi V. 2005 62

Ej.: Adicionar una columna para comentarios a la tabla r. ALTER TABLE r ADD (comentario varchar2(255)) 2- Para modificar la definicin de un campo. Sintaxis: ALTER TABLE r MODIFY (nom_campo1 tipo, nom_campo2 tipo, ...) Ej.: Incrementar el tamao de la columna nombre de 20 a 30 caracteres en la tabla r. ALTER TABLE r MODIFY(nombre varchar2(30)) Si el tamao de una columna se va a cambiar a una longitud menor, la tabla debe estar vaca. 3- Adicionar y remover restricciones de los datos. Sintaxis: ALTER TABLE r ADD CONSTRAINT nom_constraint o ALTER TABLE r DROP CONSTRAINT nom_constraint Ej.: Otra forma de definir las claves primarias y forneas con la instruccin ALTER TABLE a la tabla Asociado, seria: ALTER TABLE Asociados ADD CONSTRATINT id_pk PRIMARY KEY(id); Para la clave fornea: ALTER TABLE Asociados ADD CONSTRATINT cod_c_fk FOREIGN KEY (cod_c) REFERENCES carreras(codigo); Cuando la clave primaria sea compuesta. Ej. (Supuesto) ALTER TABLE Asociados ADD CONSTRATINT id_Asoc_cod_c_carrera_pk PRIMARY KEY(id, cod_c); Ej.: Remover la restriccin anterior: ALTER TABLE Asociados DROP CONSTRAINT id_Asoc_cod_c_carrera_pk; Definicin de ndices: Los ndices son un medio para acceder rpidamente la informacin. Los ndices pueden asegurar que no se inserten valores duplicados en una columna. Este tipo de ndice es frecuentemente encontrado en la llave primaria de una tabla. Forma general: Create [unique] index nombre_indice on nombre_tabla (campo1[asc desc], campo2[asc desc], ...);
Jos Ignacio Botero O. Margarita Mara Hincapi V. 2005 63

Ejemplo creacin objeto index: Create unique index Asoc_id_inx on Asociados(id asc); Create index Asoc_id_inx on Asociados(id asc); Nota: Cuando se crea un objeto tipo ndex con parmetro unique, es equivalente a definir una clave primaria. Instruccin Drop. Permite eliminar los objetos. Sintaxis: Drop tipo_objeta nombre_objeto; Ejemplos: Para eliminar la relacin o tabla r de una BD: DROP TABLE r [cascade constraints] Esta orden no slo suprime todas las tuplas en r sino tambin el esquema de r. Para eliminar un objeto ndice se usa la orden: DROP INDEX Asoc_id_inx Sentencia SELECT La operacin ms comn en SQL es la consulta de datos para recuperar informacin. La estructura bsica de esta instruccin en SQL, est compuesta de tres clusulas: SELECT (elegir) FROM (de) y WHERE (donde). La clusula SELECT corresponde a la operacin de Proyeccin () del lgebra relacional; sirve para listar todos los atributos que se desean en el resultado de una consulta. La clusula FROM es una lista de relaciones que se van a examinar durante la ejecucin de la expresin. La clusula WHERE corresponde al predicado de la eleccin () del lgebra relacional. Se compone de un predicado que incluye atributos de las relaciones que aparecen en la clusula FROM. Una consulta en SQL tiene la forma: SELECT A1, A2, ... , An FROM r1, r2, ... , rn WHERE p Las Ai representan atributos, las ri representan relaciones y p es un predicado.
Jos Ignacio Botero O. Margarita Mara Hincapi V. 2005 64

Esta consulta es equivalente a la expresin del lgebra relacional: a1, a2, ... ,an ( (r1 x r2 x ... x rn) ) p Si se omite la clusula WHERE, el predicado p es verdadero. La relacin de atributos A1, A2, ... , An puede sustituirse por un asterisco * para elegir todos los atributos de todas las relaciones que aparecen en la clusula FROM. El SQL forma el Producto Cartesiano de las relaciones que se nombran en la clusula FROM; realiza una eleccin del lgebra relacional utilizando el predicado de la clusula WHERE y proyecta el resultado a los atributos de la clusula SELECT. El resultado de una consulta en SQL es una nueva relacin o tabla. La sintaxis completa de la instruccin SELECT es: Select [ * ] [nombre_campo] [funcin] [String] from nombre_tabla1 [Alias1], nombre_tabla2 [Alias2] [Where condicin relacion] [Group by nombre_campo] [Having by condicin] [Order by nombre_campo (Asc/Desc)]; Ejemplo: La tabla empleados tiene los siguientes registros:
ID_EMP 1011 1012 1013 1014 1015 1016 NOMBRE_EMP Pedro Juan Pedro Jorge Valentina Cristina DEPART_EMP 10 20 30 10 10 20 SALARIO 1000000 1200000 1100000 1200000 1000000 1000000

La tabla departamentos tiene los siguientes registros:


ID_DEPART 10 20 30 NOMBRE_DEPART Divisin de Sistemas Ensamble Pintura

Seleccionar todos los registros y campos de cada registro de la tabla empleados. select * from empleados; Resultado:
ID_EMP ---------NOMBRE_EMP DEPART_EMP --------------------------------- -------------------2005 65

Jos Ignacio Botero O. Margarita Mara Hincapi V.

1011 1012 1013 1014 1015 1016

Pedro Juan Pedro Jorge Valentina Cristina

10 20 30 10 10 20

Seleccionar todos los registros y algunos campos de la tabla empleados. select id_emp, nombre_emp from empleados; Resultado:
ID_EMP ---------1011 1012 1013 1014 1015 1016 NOMBRE_EMP ---------------------------------------Pedro Juan Pedro Jorge Valentina Cristina

Seleccionar cuntos registros estn almacenados en la tabla empleados. select count(*) from empleados; Resultado:
COUNT(*) ---------6

Seleccione los nmeros de departamento en los que estn adscritos los empleados SELECT Dep._emp FROM empleados Resultado:
DEPART_EMP ---------- ------------10 20 30 10 10 20

En los lenguajes de consulta formales se utiliz el concepto matemtico de que una relacin es un conjunto. Por ello no aparecen tuplas repetidas en una relacin. En la prctica, la eliminacin de duplicados toma un tiempo relativamente largo. Por tanto, el SQL permiten duplicados en las relaciones. As la consulta anterior producir una lista de todos los nmeros de departamento, cada uno tantas veces como aparezca en una tupla de la relacin empleados. Cuando se desea forzar la eliminacin de duplicados, se inserta la palabra clave distinct despus del SELECT. Por tanto, la consulta anterior quedara as: SELECT distinct depart_emp
Jos Ignacio Botero O. Margarita Mara Hincapi V. 2005 66

FROM empleados Y el resultado es:


DEPART_EMP ---------- ------------10 20 30

Sentencia Where:

Corresponde al predicado de la operacin de eleccin (?) del lgebra relacional, coloca condiciones a tuplas. Ademas como SQL no tiene una representacin directa
del producto natural y puesto que el producto natural se define en trminos de un producto cartesiano y una proyeccin, es relativamente sencillo escribir una expresin en SQL para el producto natural. Seleccionar la identificacin del empleado, el nombre del empleado y el nombre del departamento donde trabaja el empleado: select emp.id_emp, emp.nombre_emp, dep.nombre_depart from empleados emp, departamentos dep where emp.depart_emp = dep.id_depart; Resultado:
ID_EMP ---------1011 1012 1013 1014 1015 1016 NOMBRE_EMP ---------------------------------------Pedro Juan Pedro Jorge Valentina Cristina NOMBRE_DEPART ---------------------Divisin de Sistemas Ensamble Pintura Divisin de Sistemas Divisin de Sistemas Ensamble

SQL utiliza la notacin nombre_relacin.nombre_atributo para evitar ambigedad en los casos en los que un atributo aparece en el esquema de ms de una relacin, al igual que en lgebra relacional. Sentencia Gruop By y las Funciones de grupo SQL ofrece la posibilidad de calcular funciones en grupos de tuplas usando la clusula group by. El atributo dado en la clusula group by se usa para formar grupos. Las tuplas con el mismo valor en el atributo de esta clusula, se colocan en un grupo. Adems, SQL incluye funciones para calcular: Promedio (avg) Mnimo (min) Mximo (max) Total (sum) Contar (count) Las operaciones como avg, sum se llaman funciones de grupo porque operan sobre grupos de tuplas. El resultado de una funcin de grupo es un valor nico. Ej.: Seleccione cuntos empleados existen por departamento.
Jos Ignacio Botero O. Margarita Mara Hincapi V. 2005 67

Select count(emp.id_emp), dep.nombre_depart From empleados emp, departamentos dep Where emp.depart_emp = dep.Id_depart Group by dep.nombre_depart;

Resultado:
COUNT(EMP.ID_EMP) NOMBRE_DEPART ----------------- ---------------------------------------3 Divisin de Sistemas 2 Ensamble 1 Pintura

Ejs.:1- Encontrar el salario promedio de los empleados por departamento.


Select dep.nombre_depart, avg(emp.salario) From empleados emp, departamentos dep Where emp.depart_emp = dep.Id_depart Group By dep.nombre_depart; Resultado: Nombre_depart Divisin de Sistemas Ensamble Pintura avg(emp.salario) 1066666 1100000 1100000

Sentencia Having A veces es til declarar una condicin que se aplica a los grupos ms que a las tuplas. Por Ej. Podramos estar interesados nicamente en seleccionar los departamentos en los que el saldo promedio de salarios sea menor que 1100000. Esta condicin no se aplica a una tupla, sino a cada grupo construdo mediante la clusula group by. Para expresar una consulta de este tipo, se usa la clusula having de SQL. Los predicados de la clusula Having se aplican despus de la formacin de grupos, por lo que pueden utilizarse funciones de grupo. La consulta expresada en SQL, sera:
Select dep.nombre_depart, avg(emp.salario) From empleados emp, departamentos dep Where emp.depart_emp = dep.Id_depart Group By dep.nombre_depart Having avg(emp.salario) < 1100000;

Resultado.
Nombre_depart Divisin de Sistemas avg(emp.salario) 1066666

Seleccione cuntos empleados existen por departamento y en cuales departamentos hay mas de 2 empleados. select count(emp.id_emp), dep.nombre_depart from empleados emp, departamentos dep where emp.depart_emp = dep.Id_depart group by dep.nombre_depart
Jos Ignacio Botero O. Margarita Mara Hincapi V. 2005 68

having count(emp.id_emp)>1; Resultado:


COUNT(EMP.ID_EMP) -------------------------------3 2 NOMBRE_DEPART ---------------------------------------Divisin de Sistemas Ensamble

Sentencia Order By SQL ofrece al usuario cierto control sobre el orden en el que se van a presentar las tuplas en una relacin. La clusula order by hace que las tuplas en el resultado de una consulta aparezcan en un orden determinado. Seleccione cuntos empleados existen por dependencia y en cuales dependencias hay mas de 2 empleados, ordenado por nombre de departamento. Select count(emp.id_emp), dep.nombre_depart From empleados emp, departamentos dep Where emp.depart_emp = dep.Id_depart Group by nombre_depart Having count(emp.id_emp)>1 Order by dep.nombre_depart; Resultado:
COUNT(EMP.ID_EMP) -------------------------------2 3 NOMBRE_DEPART ---------------------------------------Ensamble Divisin de Sistemas

Por defecto SQL lista los elementos en orden ascendente (asc). Si queremos en orden descendente especificamos desc despus del nombre del campo. Adems el ordenamiento puede hacerse sobre mltiples atributos. Ej.: Listar la relacin empleados completa en orden descendente de salario. Si varios salarios tienen el mismo valor, ordenar en forma ascendente por nombre del empleado. SELECT * FROM empleados ORDER BY salario desc, nombre_emp asc Resultado:
ID_EMP NOMBRE_EMP DEPART_EMP SALARIO ---------- ---------------------------------- -----------------------------------------1014 Jorge 10 1200000 1012 Juan 20 1200000 1013 Pedro 30 1100000 1016 Cristina 20 1000000 1011 Pedro 10 1000000 1015 Valentina 10 1000000

Ej.: Hallar el empleado con el mayor salario.


Jos Ignacio Botero O. Margarita Mara Hincapi V. 2005 69

SELECT nombre_emp, salario FROM empleados WHERE salario = (SELECT max(salario) FROM empleados) Resultado: NOMBRE SALARIO ------------------------- ---------------Juan 100000 Pedro 100000 Luis 100000 Operadores aritmticos En los siguientes ejemplos se muestra la forma de aplicar cada uno de los operadores. Sumar 2 (Dos) veces el salario de cada empleado. Select salario+ salario from empleados; Resultado:
SALARIO+SALARIO --------------------2000000 2400000 2200000 2400000 2000000 2000000

Al salario sumado 2 (Dos) veces, restarle $100,000. Select (salario+ salario)-100000 from empleados; Resultado:
(SALARIO+SALARIO)-100000 ----------------------------------------------1900000 2300000 2100000 2300000 1900000 1900000

Multiplique el salario por 2 (Dos). Select (salario)*2 from empleados; Resultado:


Jos Ignacio Botero O. Margarita Mara Hincapi V. 2005 70

(SALARIO)*2 ------------------2000000 2400000 2200000 2400000 2000000 2000000

El salario multiplicado por 2 (Dos), divdalo entre 5. Select (salario*2)/5 from empleados; Resultado:
(SALARIO*2)/5 ---------------400000 480000 440000 480000 400000 400000

Operadores Relacionales Seleccionar todos los registros que tengan salario igual a $1,000,000. Select * from empleados where salario = 1000000; Respuesta:
ID_EMP ----------1011 1015 1016 NOMBRE_EMP ---------------------Pedro Valentina Cristina DEPART_EMP SALARIO -----------------------------------------10 1000000 10 1000000 20 1000000

Seleccionar todos los registros que tengan salario mayor que $1,000,000. Select * from empleados where salario > 1000000; Respuesta:
ID_EMP ----------1012 1013 1014 NOMBRE_EMP ---------------------Juan Pedro Jorge DEPART_EMP SUELDO_EMP -----------------------------------------20 1200000 30 1100000 10 1200000

Seleccionar todos los registros que tengan salario mayor o igual que $1,000,000. Select * from empleados where sueldo_emp >= 1000000;
Jos Ignacio Botero O. Margarita Mara Hincapi V. 2005 71

Respuesta:
ID_EMP ----------1011 1012 1013 1014 1015 1016 NOMBRE_EMP DEPART_EMP SUELDO_EMP ------------------------------- ------- -- ---------- -------------------Pedro 10 1000000 Juan 20 1200000 Pedro 30 1100000 Jorge 10 1200000 Valentina 10 1000000 Cristina 20 1000000

Operadores Lgicos Seleccionar todos los registros que tengan salario mayor que $1,000,000 y menor a $2,000,000. Select * from empleados where salario > 1000000 and salario <2000000; Resultado:
ID_EMP ----------1012 1013 1014 NOMBRE_EMP ---------------------Juan Pedro Jorge DEPART_EMP SUELDO_EMP -------------------- -------------------20 1200000 30 1100000 10 1200000

Otros Operadores IN Seleccione los empleados que pertenecen a los departamentos 10 y 20. Select * from empleados Where depart_emp in (10,20); Resultado:
ID_EMP ---------1011 1012 1014 1015 1016 NOMBRE_EMP DEPART_EMP ---------------------- -----------------Pedro 10 Juan 20 Jorge 10 Valentina 10 Cristina 20 SALARIO --------------------1000000 1200000 1200000 1000000 1000000

NOT IN Seleccione los empleados que no pertenecen a los departamentos 10 y 20. Select * from empleados
Jos Ignacio Botero O. Margarita Mara Hincapi V. 2005 72

Where depart_emp not in (10,20); Resultado:


ID_EMP NOMBRE_EMP DEPART_EMP ------------ ------------------------- ------------------1013 Pedro 30 SALARIO -------------------1100000

BETWEEN Seleccione los empleados que tienen un salario entre $1,000,000 y $1,100,000. Select * from empleados Where sueldo_emp between 1000000 and 1100000; Resultado:

ID_EMP ---------1011 1013 1015 1016

NOMBRE_EMP ----------------------Pedro Pedro Valentina Cristina

DEPART_EMP --------------------10 30 10 20

SALARIO --------------------1000000 1100000 1000000 1000000

LIKE Seleccione los empleados cuyo nombre inicie por p. Select * from empleados Where nombre_emp like (P%); Resultado:
ID_EMP NOMBRE_EMP DEPART_EMP SALARIO ------------ ---------------------- --------------------- ---------------------1011 Pedro 10 1000000 1013 Pedro 30 1100000

Utilizacin de Funciones Las funciones que se utilizan con frecuencia son: Numricas ABS() CEIL() FLOOR() MOD() Carcter CHR() INITCAP() LOWER() LPAD()
2005

Retornan valores numricos ASCII() INSTR() LENGTH()

Grupo AVG() COUNT() MAX() MIN()

Fecha ADD_MONTHS() LAST_DAY() MONTHS_BETWE EN NEW_TIME()

Otras DECODE() NVL() USER()


73

Jos Ignacio Botero O. Margarita Mara Hincapi V.

POWER() ROUND() SIGN() SQRT() TRUNC()

LTRIM() REPLACE() RPAD() RTRIM() SUBSTR() UPPER()

STDDEV() SUM() VARIANCE() TO_CHAR() TO_DATE() TO_NUMBER ()

NEXT_DAY() ROUND() SYSDATE() TRUNC()

Select Avanzados o Subconsultas Son consultas contenidas dentro de la clusula WHERE de otra consulta. Las consultas anidadas (subconsultas) pueden retornar un solo valor, mltiples valores, una o ms columnas. Sintaxis: Select col1,col2,...,col3 from nombre_table Where col= (select col from nombre_tabla where condicin); Si la subconsulta retorna: Una fila, utilizamos el conector =. Mas de una fila, utilizamos los conectores ANY, ALL, IN, NOT IN ANY: Compara un valor con cada valor que retorna la subconsulta. ALL: Compara un valor con todos los valores que retorna la subconsulta. Pertenencia a un conjunto: SQL se basa en el clculo relacional para operaciones que permiten probar la pertenencia de tuplas a una relacin. El conector IN prueba si se es miembro de un conjunto, donde el conjunto es una coleccin de valores producidos por una clusula SELECT. El conector NOT IN prueba la no pertenencia al conjunto. Para ilustrar esto, considere la consulta: Seleccionar el nombre de los empleados cuyo salario sea igual al salario de los empleados del departamento 10. Solucin: Select depart_emp,salario,nombre_emp from empleados Where salario IN (select salario from empleados Where depart_emp = 10); Resultado:
DEPART_EMP -----------------------10 10 20 Jos Ignacio Botero O. Margarita Mara Hincapi V. SALARIO NOMBRE_EMP ------------------------ ---------- --------1000000 Pedro 1000000 Valentina 1000000 Cristina 2005 74

20 10

1200000 1200000

Juan Jorge

Ejercicio: Seleccionar a todos los empleados que tienen un salario igual al salario del empleado Jorge. Comparacin de conjuntos: SQL permite emplear las comparaciones >any, <any, >=any, <=any, <>any e =any el cual es equivalente a IN. Ej.: Seleccionar los nombres de todos los empleados que tienen un salario mayor al de algn empleado del departamento 10. Select depart_emp,salario,nombre_emp From empleados Where salario >any (SELECT salario FROM empleados WHERE dept_emp = 10) Resultado:
DEPART_EMP -----------------------20 10 SALARIO NOMBRE_EMP ------------------------ ---------- --------1200000 Juan 1200000 Jorge

La subconsulta genera el conjunto de todos los valores de salario del departamento 10. La comparacin >any es verdadera si el valor de salario de la tupla es mayor que al menos un miembro del conjunto de todos los valores de salario del departamento 10. SQL tambin admite las comparaciones <all, <=all, >=all, =all, <>all. Si la consulta se modifica: Seleccionar los nombres de todas los empleados que tienen un salario mayor que todos los salarios del departamento 10. El conector >all corresponde a la frase mayor que todos: SELECT depart_emp,salario,nombre_emp FROM empleados WHERE salario >all (SELECT salario FROM empleados WHERE dept_emp = 10) Los conectores IN, =any, >all, etc. nos permiten probar un nico valor con los miembros de un conjunto completo. Nota: La(s) columna(s) retornadas por la subconsulta deben coincidir en nmero y tipo con las columnas con las cuales ellas son comparadas. Operaciones de conjuntos (Unin, Interseccin Diferencia) Para este tipo de operaciones se deben cumplir cierto tipo de restricciones sobre las consultas que ellos operan:
Jos Ignacio Botero O. Margarita Mara Hincapi V. 2005 75

Las consultas deben seleccionar (SELECT) igual nmero de columnas. Las columnas correspondientes deben ser del mismo tipo. La clusula ORDER BY slo puede se usada una (1) vez (al final) en una consulta que emplee estos operadores. Los nombres de las columnas no pueden ser especificados en la clusula ORDER BY. Estas deben ser referidos mediante nmeros, de acuerdo a la posicin que ocupen en el SELECT. Unin El operador UNION retorna sin repetir, las filas comunes y no comunes a todas las consultas. Ejemplo: Select depart_emp from empleados Union Select id_depart from departamentos; Resultado:
DEPART_EMP -----------10 20 30

Interseccin El operador INTERSECT retorna aquellas filas que sean comunes en todas las consultas. Ejemplo: Select depart_emp from empleados Intersect Select id_depart from departamentos; Resultado:
DEPART_EMP -----------10 20 30

Minus El operador MINUS retorna aquellas filas que existen en la primera consulta y que adems no existen en la segunda consulta. Ejemplo:
Jos Ignacio Botero O. Margarita Mara Hincapi V. 2005 76

En el siguiente ejemplo que ilustra el uso del operador MINUS, se observa que aunque aparentemente la primera consulta es igual a la segunda, los resultados en cada caso no se comportan igual. Select depart_emp from empleados Minus Select id_depart from departamentos; Resultado:
ninguna fila seleccionada

Select id_depart from departamentos Minus Select depart_emp from empleados; Resultado:
ID_DEPART ----------------40

Modificacin de la base de datos El DML de SQL incluye tres operaciones de modificacin: Eliminacin (Delete), Insercin (Insert), Actualizacin (Update). Eliminacin: Slo se pueden suprimir tuplas completas. Sintaxis: Delete from nombre_tabla [where condicin]; Ejemplo: Borrar los empleados que trabajan en el departamento 20. Delete from empleados where depart_emp = 20; Una orden DELETE opera sobre una sola relacin. Si queremos eliminar tuplas de varias relaciones debemos usar una orden DELETE para cada relacin. La clusula WHERE puede ser tan compleja como la de un SELECT o podemos tener una clusula WHERE vaca. Ejemplo: Borrar todos los registros de la tabla empleados. Delete from empleados; Insercin: Permite insertar registros en las tablas. Para insertar datos en una relacin, especificamos una tupla que se va a insertar o escribimos una consulta cuyo resultado es un conjunto de tuplas a insertar. Lgicamente los valores de atributos para las tuplas insertadas deben ser miembros del dominio de los atributos y deben tener el nmero correcto de atributos.
Jos Ignacio Botero O. Margarita Mara Hincapi V. 2005 77

Sintaxis: Insert into nombre_tabla [col1, col2,col3,....colN] values (valor1,valor2,valor3,...,valorN) [consulta] Ejemplos: Insertar un registro completo a la tabla empleados. Insert into empleados values(10201020,Pedro Perez,10,1100000,01Jan2000); Insertar un registro a empleados con algunos campos. Insert into empleados (id_emp,nombre_emp) values(10201020,Pedro Perez); Insertar los registros resultantes de una consulta. Insert into empleados select identif,nombre from empl where estado = 1; Update: Permite modificar la informacin almacenada en los campos de las tablas. Sintaxis: Update nombre_tabla set campo1 = valor consulta, campo2=valor exp [where condicion]; Ejemplos: Incremente el salario de los empleados del departamento 10, en un 10%. Update empleados set salario = salario + salario * .10 Where depart_emp = 10; Incrementar los salarios de los empleados en un 5%, si son menores de 1100000. UPDATE empleados SET salario = salario * 1.05 WHERE salario < 1100000 Creacin de otras estructuras de datos Vistas: Son subconjuntos lgicos de datos, procedentes de una tabla o combinacin de ellas. No contienen datos fsicamente; stos son derivados de tablas subordinadas. Se crean por seguridad y conveniencia. Sintaxis: CREATE VIEW nom_v [(alias [, alias ...] ] AS consulta WITH CHECK OPTION La clusula WITH CHECK OPTION asegura que actualizaciones e inserciones ejecutadas a travs de la vista no crearn registros por fuera del alcance de ella.
Jos Ignacio Botero O. Margarita Mara Hincapi V. 2005 78

Ej.: Crear una vista con los empleados del departamento 10. CREATE VIEW emp_10 AS SELECT * from empleados WHERE depart_emp = 10; Para ver el contenido de la vista tenemos: SELECT * FROM emp_10; as creada deja insertar y actualizar tuplas para la tabla empleados en cualquier departamento. Ej.: Crear una vista que contenga todas las columnas de la tabla empleados para el departamento 20, utilizando la clusula With check option. CREATE VIEW emp_20 AS SELECT * FROM empleados WHERE depart_emp = 20; WITH CHECK OPTION Si se intenta modificar un dato, por Ej. el salario para el empleado Jorge: UPDATE emp_20 SET salario = 1500000 WHERE nombre_emp = Jorge la actualizacin no es admitida porque la vista slo puede ver empleados del departamento 20. NOTA: Se pueden actualizar e insertar datos a una tabla a travs de una vista si sta es creada a partir de una tabla, pero no de un join de tablas. Para borrar una vista se utiliza la orden de SQL : DROP VIEW nom_vista Secuencias: Son estructuras de datos Oracle que permiten generar automticamente valores para campos secuenciales. Se pueden utilizar en la instruccin Insert para generar el siguiente valor del campo, referenciando el nombre de la secuencia. Ej.: Si para el campo id_depart en la tabla departamentos se hubiese creado una secuencia llamada s_id_depart, la insercin de un nuevo departamento se hara as: INSERT INTO departamentos (id_depart, nombre_depart) VALUES (s_id_depart.NEXTVAL, Reparacion); Para saber cul es el valor actual de una secuencia puedo averiguarlo siguiendo los siguientes pasos: 1SELECT nom_seq.NEXTVAL FROM dual 2SELECT nom_seq.CURRVAL FROM dual
2005 79

Para crear una secuencia se utiliza la siguiente orden:


Jos Ignacio Botero O. Margarita Mara Hincapi V.

CREATE SEQUENCE nom_seq [increment by n ] [start with n] [{maxvalue n | nomaxvalue }] [{cycle | nocycle}] [{cache n | nocache }] Si increment by y start with no se especifican, por defecto toman el valor de 1. nomaxvalue especifica un mximo valor de 10 elevado a la 27. Ej.: Crear una secuencia incrementos de 10 . para la tabla Departamentos comenzando en 10 con

CREATE SEQUENCE id_depart minvalue 10 maxvalue 1000 increment by 10 start with 50 nocache nocycle Para borrar una secuencia creada se utiliza la orden: DROP SEQUENCE nom_seq;

Jos Ignacio Botero O. Margarita Mara Hincapi V.

2005

80

You might also like