Introducción al    lenguaje SQLManual del Alumno
INNOVA Desarrollos Informáticos, SLPaseo Mallorca, 34 Entlo. C07012 Palma de MallorcaTel. 971 721404http://www.balearsinn...
INTRODUCCIÓNPrólogo  El lenguaje SQL (Structured Query Language) permite a losdesarrolladores la generación de las estruct...
ÍNDICEINTRODUCCIÓN ................................................................. 3Prólogo................................
Introducción al lenguaje SQL                                                                                              ...
FICHA INFORMATIVA DEL                       MÓDULO.Nombre  Introducción al lenguaje SQLMeta  Que el alumno adquiera los co...
1   UNIDAD 2: DDL LENGUAJE      DE DEFINICIÓN DE DATOSObjetivo general de la unidad  Aprender a crear bases de datos enten...
Cuaderno de notasINNOVA Desarrollos Informáticos, SL   Pág. 8
Introducción al lenguaje SQL                           Unidad 2: DDL Lenguaje de definición de datosINNOVA Desarrollos In...
Actividades  Seguir las sesiones teóricas y realizar los ejercicios de la Unidadcorrespondientes a la teoría dada.INNOVA ...
1.1    Creación de tablas1.1.1   Sintaxis          Cuando se diseña una base de datos relacional, es necesario conocer    ...
Introducción al lenguaje SQL                                 Unidad 3: DML Lenguaje de manipulación de datos1.1.2   Tipos ...
Introducción al lenguaje SQL                                 Unidad 3: DML Lenguaje de manipulación de datos1.1.3   Defini...
Introducción al lenguaje SQL                         Unidad 3: DML Lenguaje de manipulación de datosITEMDESIRED que conten...
Introducción al lenguaje SQL                               Unidad 3: DML Lenguaje de manipulación de datos1.2   Cambios en...
Introducción al lenguaje SQL                               Unidad 3: DML Lenguaje de manipulación de datos1.4   Creación d...
Introducción al lenguaje SQL                               Unidad 3: DML Lenguaje de manipulación de datos1.5   Borrado de...
Introducción al lenguaje SQL                               Unidad 3: DML Lenguaje de manipulación de datos        CREATE S...
Introducción al lenguaje SQL                                Unidad 3: DML Lenguaje de manipulación de datos         <NOM_O...
Introducción al lenguaje SQL                                Unidad 3: DML Lenguaje de manipulación de datos         Este e...
Introducción al lenguaje SQL                         Unidad 3: DML Lenguaje de manipulación de datos 2    UNIDAD 3: DML LE...
Cuaderno de notasINNOVA Desarrollos Informáticos, SL   Pág. 22
Introducción al lenguaje SQL                         Unidad 3: DML Lenguaje de manipulación de datosINNOVA Desarrollos In...
Actividades  Seguir las sesiones prácticas y realizar los ejercicios correspondientes alos conceptos de la unidad.INNOVA ...
2.1   Introducción        Acabamos de ver las sentencias básicas necesarias para crear bases de      datos relacionales. A...
Introducción al lenguaje SQL        La sentencia anterior borra todas la filas de la tabla ANTIQUES que      cumplan la co...
Introducción al lenguaje SQL2.5   Consultas         En las bases de datos relacionales, los datos se guardan en tablas com...
Introducción al lenguaje SQL  Si quisiéramos consultar todas las columnas de una tabla, bastaría conutilizar la siguiente ...
Introducción al lenguaje SQL  Una condición o filtro de una consulta es un conjunto de sentenciaslógicas unidas mediante o...
Introducción al lenguaje SQL  A continuación veremos una tabla de evaluación en dónde estáninvolucrados valores a NULL:   ...
Introducción al lenguaje SQL Obviamente, es posible combinar AND y OR en una misma consulta.Veamos un ejemplo:  SELECT EMP...
Introducción al lenguaje SQL        Por último, el operador NOT, niega el contenido de la condición,      como en el sigui...
Introducción al lenguaje SQL                                       OrdersOwnerID                                   ItemDes...
Introducción al lenguaje SQL  Para consultar los nombres de los que han comprado una silla,realizaremos la siguiente sente...
Introducción al lenguaje SQL  Además, podemos definir alias tanto para las columnas como para lastablas. Por ejemplo:  SEL...
Introducción al lenguaje SQL       SELECT   DISTINCT                     SELLERID,   OWNERLASTNAME,      OWNERFIRSTNAME   ...
Introducción al lenguaje SQL  Esta sentencia retorna lo siguiente:  Last Name               Item Ordered  Smith           ...
Introducción al lenguaje SQL      actualizamos varias, la subconsulta retornará el mismo número de      columnas, en el or...
Introducción al lenguaje SQL 2.9   Las Cáusulas GROUP BY y HAVING          Si en una consulta queremos agrupar (aplicar un...
Introducción al lenguaje SQL         SELECT BUYERID         FROM ANTIQUES         WHERE PRICE >         (SELECT AVG(PRICE)...
Introducción al lenguaje SQL         SELECT OWNERFIRSTNAME, OWNERLASTNAME         FROM ANTIQUEOWNERS         WHERE EXISTS ...
Introducción al lenguaje SQL         SELECT BUYERID         FROM ANTIQUES         UNION         SELECT OWNERID         FRO...
Introducción al lenguaje SQLconseguir los identificadores de los propietarios que están en ORDERS yque cuya clave foránea ...
Introducción al lenguaje SQL         fijamos en las tablas anteriores, el departamento 40 no tiene empleados,         por ...
Introducción al lenguaje SQL           Ejemplo: SELECT MOD(11,4) FROM DUAL;           Resultado: 3           -   POWER(m,n...
Introducción al lenguaje SQL  -   LOWER(<string>): Convierte la cadena a minúsculas.  Ejemplo: SELECT LOWER(‘MR. SCOTT MCM...
Introducción al lenguaje SQL2.14.3   Funciones de caracteres que retornan         números           -   LENGTH(<string>): ...
Introducción al lenguaje SQL                  Formato                     Significado                     DAY             ...
Introducción al lenguaje SQL           Ejemplo: SELECT TO_CHAR(‘FM0099’,297) FROM DUAL;           Resultado: 0297         ...
Introducción al lenguaje SQL2.15   Acceso a secuencias         El acceso a una secuencia se realiza mediante una consulta ...
Introducción al lenguaje SQL         Para crear una vista es necesario tener los privilegios de inserción,       actualiza...
Introducción al lenguaje SQL  El bloqueo de una tabla es causa directa de la posibilidad decompartición de datos. Puede oc...
Introducción al lenguaje SQL  LOCK TABLE emp IN EXCLUSIVE MODE NOWAIT;  Bloquea la tabla emp en modo exclusivo, pero no es...
Introducción al lenguaje SQL               3   UNIDAD 4: EJERCICIOSObjetivo general de la unidad  Tener ejemplos resueltos...
Cuaderno de notasINNOVA Desarrollos Informáticos, SL   Pág. 55
Introducción al lenguaje SQL                                       Unidad 4: EjerciciosINNOVA Desarrollos Informáticos, S...
Actividades  Realizar los ejercicios en función de la teoría dada y corregirlos enclase.INNOVA Desarrollos Informáticos, ...
3.1   Ejercicios sobre DDL        1.- Supongamos que tenemos una tabla con la siguiente estructura:        Nombre: proj   ...
Introducción al lenguaje SQL                                                        Unidad 4: Ejercicios  5.- Veamos el si...
Introducción al lenguaje SQL                                                               Unidad 4: Ejercicios       8.- ...
Introducción al lenguaje SQL                                                        Unidad 4: Ejercicios  18.- Consultar e...
Introducción al lenguaje SQL                                                       Unidad 4: Ejercicios  28.- Empleando un...
Introducción al lenguaje SQL                                                         Unidad 4: Ejercicios  39.- Calcular e...
Introduccion a sql
Introduccion a sql
Introduccion a sql
Introduccion a sql
Upcoming SlideShare
Loading in …5
×

Introduccion a sql

1,382 views

Published on

El archivo contiene sobre la creacion de tablas, insercion de datos y filtros.

Published in: Education
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
1,382
On SlideShare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
68
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Introduccion a sql

  1. 1. Introducción al lenguaje SQLManual del Alumno
  2. 2. INNOVA Desarrollos Informáticos, SLPaseo Mallorca, 34 Entlo. C07012 Palma de MallorcaTel. 971 721404http://www.balearsinnovacio.comTítulo: Introducción al lenguaje SQLFecha Edición: 22 de Junio de 2004Autores: Javier Jofre González-Granda
  3. 3. INTRODUCCIÓNPrólogo El lenguaje SQL (Structured Query Language) permite a losdesarrolladores la generación de las estructuras de información y elacceso a los datos en los sistemas gestores de bases de datos relacionales,como Oracle, Informix, Sybase, Microsoft SQL Server, Access y otros.Nos permite, por tanto, describir la estructura de los datos, ymanipularlos. La descripción de la estructura de datos es la propiadefinición de la base de datos, mientras que la manipulación de estosincluye la inserción, borrado, actualización y, por supuesto, consulta. A grandes rasgos, podríamos decir que SQL posee dos sublenguajes: elsublenguaje de SQL que permite la creación de bases de datos es lo quese llama DDL (Data Description Language). La manipulación de datos,por otra parte, es lo que se llama DML (Data Manipulation Language). Aquí describiremos algunos aspectos relacionados con la definición delas bases de datos (DDL), y nos centraremos más profundamente en elsublenguaje de manipulación de datos (DML).Metodología del módulo La metodología que se va a utilizar para la impartición del curso sebasa en: • Ejercicios prácticos de seguimiento del módulo.Evaluación del módulo Un examen final con varios ejercicios y apartados a corregir.INNOVA Desarrollos Informáticos, SL Pág. 3
  4. 4. ÍNDICEINTRODUCCIÓN ................................................................. 3Prólogo............................................................................................................... 3Metodología del módulo.................................................................................. 3Evaluación del módulo .................................................................................... 3ÍNDICE .............................................................................. 4FICHA INFORMATIVA DEL MÓDULO. .................................. 6Nombre .............................................................................................................. 6Meta .................................................................................................................... 6Responsable del diseño del módulo y de la elaboración del Manual ........ 6Bibliografía......................................................................................................... 61 UNIDAD 2: DDL LENGUAJE DE DEFINICIÓN DE DATOS .. 7Objetivo general de la unidad ......................................................................... 7Objetivos específicos........................................................................................ 7Contenidos......................................................................................................... 7Cuaderno de notas............................................................................................ 8Actividades....................................................................................................... 101.1 Creación de tablas...................................................................................... 111.2 Cambios en la estructura de una tabla .................................................... 151.3 Borrado de tablas ....................................................................................... 151.4 Creación de índices.................................................................................... 161.5 Borrado de índices..................................................................................... 171.6 Creación de secuencias.............................................................................. 171.7 Borrado de secuencias............................................................................... 181.8 Dando privilegios de acceso..................................................................... 181.9 Quitando privilegios de acceso ................................................................ 191.10 Creación de sinónimos ............................................................................ 191.11 Borrado de sinónimos ............................................................................. 201.12 Vaciar una tabla ........................................................................................ 202 UNIDAD 3: DML LENGUAJE DE MANIPULACIÓN DEDATOS ............................................................................. 21Objetivo general de la unidad ....................................................................... 21INNOVA Desarrollos Informáticos, SL Pág. 4
  5. 5. Introducción al lenguaje SQL ÍndiceObjetivos específicos...................................................................................... 21Contenidos....................................................................................................... 21Cuaderno de notas.......................................................................................... 22Actividades....................................................................................................... 242.1 Introducción............................................................................................... 252.2 Inserción de datos...................................................................................... 252.3 Borrar datos................................................................................................ 252.4 Actualización de datos .............................................................................. 262.5 Consultas..................................................................................................... 272.6 Enlaces ........................................................................................................ 322.7 Subconsultas ............................................................................................... 362.8 Fuciones de agrupación ............................................................................ 382.9 Las Cáusulas GROUP BY y HAVING ................................................. 392.10 Combinación con Subconsultas............................................................. 392.11 Las Cláusulas EXISTS, ALL y ANY..................................................... 402.12 Unión, intersección y resta entre consultas .......................................... 412.13 Outer Joins................................................................................................ 422.14 Funciones de SQL ................................................................................... 442.15 Acceso a secuencias ................................................................................. 502.16 Optimización en las consultas................................................................ 502.17 Vistas.......................................................................................................... 502.18 Sentencias de control de transacciones................................................. 513 UNIDAD 4: EJERCICIOS .................................................. 54Objetivo general de la unidad ....................................................................... 54Objetivos específicos...................................................................................... 54Contenidos....................................................................................................... 54Cuaderno de notas.......................................................................................... 55Actividades....................................................................................................... 573.1 Ejercicios sobre DDL ............................................................................... 593.2 Ejercicios sobre DML............................................................................... 61INNOVA Desarrollos Informáticos, SL Pág. 5
  6. 6. FICHA INFORMATIVA DEL MÓDULO.Nombre Introducción al lenguaje SQLMeta Que el alumno adquiera los conocimientos básicos del lenguaje SQLde Oracle para formar parte de cualquier grupo de desarrollo comodesarrollador junior.Responsable del diseño del módulo y dela elaboración del Manual Javier Jofre González-GrandaBibliografía Manual de referencia de SQL de Oracle y varios cursos deintroducción a SQL de internet.INNOVA Desarrollos Informáticos, SL Pág. 6
  7. 7. 1 UNIDAD 2: DDL LENGUAJE DE DEFINICIÓN DE DATOSObjetivo general de la unidad Aprender a crear bases de datos entendiendo los conceptos deimplantación y relacionándolos con el modelo relacional de bases dedatos.Objetivos específicos Crear tablas, restricciones, índices, secuencias, sinónimos, aprender aotorgar privilegios y demás funciones básicas del DDL.Contenidos Creación de tablas, cambio en la estructura de las tablas, borrado detablas, índices (creación y borrado), secuencias (creación y borrado),otorgar y quitar privilegios sobre objetos, creación y borrado desinónimos.INNOVA Desarrollos Informáticos, SL Pág. 7
  8. 8. Cuaderno de notasINNOVA Desarrollos Informáticos, SL Pág. 8
  9. 9. Introducción al lenguaje SQL Unidad 2: DDL Lenguaje de definición de datosINNOVA Desarrollos Informáticos, SL Pág. 9
  10. 10. Actividades Seguir las sesiones teóricas y realizar los ejercicios de la Unidadcorrespondientes a la teoría dada.INNOVA Desarrollos Informáticos, SL Pág. 10
  11. 11. 1.1 Creación de tablas1.1.1 Sintaxis Cuando se diseña una base de datos relacional, es necesario conocer cómo implementar dicha filosofía en un sistema gestor de base de datos. SQL nos permite crear tablas con claves primarias, campos y relaciones a través de las claves extranjeras o foráneas. La definición de una tabla permite crear la estructura que soportará los verdaderos datos. Una tabla, en general, se crea sobre un esquema (usuario) y, además de múltiples parámetros relacionados con el mantenimiento de la estructura por parte del sistema gestor de base de datos, es necesario definir los campos (atributos) y tipos de datos de cada uno. Paralelamente es necesario describir las restricciones (constraints) asociadas a la definición propia de la tabla (constraints de clave primaria, foránea, única o de tipo check). SQL posee la siguiente sintaxis (resumida) para la definición de nuevas tablas: CREATE TABLE <TABLE NAME> (<COLUMN_1 NAME> <DATA TYPE> [(<SIZE>)] <COLUMN_1 CONSTRAINT>, <COLUMN_2 NAME> <DATA TYPE> [(<SIZE>)] <COLUMN_2 CONSTRAINT>, ...); Dónde <TABLE NAME> es el nombre de la tabla, <COLUMN_1 NAME> es el nombre de la primera columna (campo o atributo), <COLUMN_2 NAME> es el nombre de la segunda columna, etc. <DATA TYPE> es el tipo de datos que contendrá la columna. <COLUMN_1 CONSTRAINT> es una parte de la sentencia que nos permite definir las constraints asociadas a la columna 1, y así sucesivamente para el resto de columnas. INNOVA Desarrollos Informáticos, SL Pág. 11
  12. 12. Introducción al lenguaje SQL Unidad 3: DML Lenguaje de manipulación de datos1.1.2 Tipos de datos Oracle Los tipos de datos dependen del sistema gestor de bases de datos. En el caso de Oracle tenemos los siguientes (entre otros): a)VARCHAR2(SIZE): Una columna de este tipo contendrá caracteres. Este tipo de datos requere del atributo SIZE especificado en la sintaxis de la sentencia CREATE TABLE. Si una columna es de tipo VARCHAR2(100), podrá contener hasta 100 caracteres, aunque en la base de datos, no se reservan 100 espacios de ocupación, sino que sólo se ocupan los que se usan por los datos. En Oracle 7 sólo es posible crear tablas con columnas de tipo VARCHAR2 con un máximo de 2000 caracteres. En Oracle 8 se ha incrementado hasta 4000 caracteres. b)CHAR(X): La columna contendrá una cadena de caracteres de un número de bytes igual a la longitud especificada en X. c)NUMBER (X,Y): Especifica columnas que contendrán números reales. X indica la longitud máxima en dígitos de la parte entera del número real, mientras que Y indica la longitud máxima de la parte decimal. Por ejemplo, una columna de tipo NUMBER(4,2) podrá contener, como máximo el número 99.99 d)DATE: Para Oracle, es un número especial que puede ser visualizado en varios formatos. En su momento veremos los formatos de fechas y las funciones de cambio de tipo de datos entre caracteres, números y fechas. e)LONG : Desaparecerá en Oracle 8.x y es sustituido por BLOB. Sirve para que la columna pueda contener una cadena de caracteres de hasta 2 gigabytes. f) RAW(X): Contendrá una cadena binaria de cómo máximo X bytes. X no puede ser mayor que 255. g)LONG RAW: La columna contendrá una cadena binaria no superior a 2 gigabytes. INNOVA Desarrollos Informáticos, SL Pág. 12
  13. 13. Introducción al lenguaje SQL Unidad 3: DML Lenguaje de manipulación de datos1.1.3 Definición de restricciones La definición de las restricciones de una columna, incluye las siguientes posibilidades: 1.- CONSTRAINT <NOMBRE_CONSTRAINT> NULL | NOT NULL: La cláusula NOT NULL significa que la columna debe tener un valor en cada registro, esto es, no puede estar vacía en ningún registro, mientras que la cláusula NULL significa que puede estar vacía en cualquier registro. <NOMBRE_CONSTRAINT> será el nombre de la restricción y es opcional en cualquier restricción que se especifique de esta manera. 2.- CONSTRAINT <NOMBRE_CONSTRAINT> UNIQUE: Fuerza a que no existan dos registros con valores iguales en dicha columna. 3.- CONSTRAINT <NOMBRE_CONSTRAINT> PRIMARY KEY: Obliga a que la columna sea la única que es clave primaria en la tabla. 4.- CONSTRAINT <NOMBRE_CONSTRAINT> CHECK (CONDICION): Obliga a que se chequee una condición determinada en el momento en que se inserte o actualice un valor en la columna. Por ejemplo: CHECK (PRECIO > 0) obliga al sistema a comprobar que la columna PRECIO sea mayor que 0 antes de insertar o actualizar su valor en un registro. 5.- DEFAULT <VALOR>: Inserta el valor especificado en la columna cuando se crea un nuevo registro y no se inserta un valor específico en dicha columna. 6.-CONSTRAINT <NOMBRE_CONSTRAINT> FOREIGN KEY REFERENCES <TABLE NAME> (<COLUMN NAME>): Es similar a PRIMARY KEY, pero obliga a que la columna sea clave extranjera y provenga de la clave primaria de otra tabla. Un ejemplo de esta sentencia podría ser el siguiente: CREATE TABLE ORDERS (OWNERID INTEGER NOT NULL, ITEMDESIRED VARCHAR2(40) NOT NULL); Este ejemplo crea una tabla con el nombre de ORDERS y con dos campos; OWNERID que contendrá valores enteros y no vacíos, y INNOVA Desarrollos Informáticos, SL Pág. 13
  14. 14. Introducción al lenguaje SQL Unidad 3: DML Lenguaje de manipulación de datosITEMDESIRED que contendrá una cadena de caracteres de cómomáximo 40 y no vacíos. Otro ejemplo más complicado podría ser el siguiente: CREATE TABLE PADRON (PID NUMBER(6) COSNTRAINT PK_PATRON PRIMARY KEY, NAME VARCHAR2(30) NOT NULL, GENDER VARCHAR2(1)); En este caso, hemos creado una tabla llamada PADRON quecontendrá una clave primaria asociada al campo PID, una columnallamada NAME que contendrá una cadena de caractéres (como máximo30) y no podrá estar vacía, y GENDER que contendrá un único carácter,y podrá estar vacía. PK_PATRON es el nombre de la constraint de claveprimaria. Si no se especifica nombre, como en el caso de la constraint detipo NOT NULL, en la columna NAME, su nombre es definido pordefecto por el sistema gestor de base de datos. En el caso en que una restricción de tipo clave primaria o foránea,involucre a varias columnas, la sintaxis de la sentencia cambia, y obliga aespecificar el conjunto de columnas al final de la sentencia. Veamos unpar de ejemplos: CREATE TABLE REQUEST (CALLNO VARCHAR2(10) CONSTRAINT FK_CALLNO REFERENCES BOOK (CALLNO), PID NUMBER(6) CONSTRAINT FK_PID REFERENCES PATRON (PID), RDATE DATE, CONSTRAINT PK_REQUEST PRIMARY KEY (CALLNO, PID));INNOVA Desarrollos Informáticos, SL Pág. 14
  15. 15. Introducción al lenguaje SQL Unidad 3: DML Lenguaje de manipulación de datos1.2 Cambios en la estructura de una tabla Para modificar la estructura de una tabla, es necesario utilizar la siguiente sentencia (con sintaxis resumida): ALTER TABLE <TABLE NAME> ADD <COLUMN_A NAME> <DATA TYPE> [(<SIZE>)] <COLUMN_1 CONSTRAINT>| ADD <CONSTRAINT_1 NAME>| MODIFY <COLUMN_B NAME> <COLUMN_C NAME> <DATATYPE>[(<SIZE>)] <COLUMN_BCONSTRAINT>| DROP PRIMARY KEY| DROP UNIQUE <COLUMN_D NAME>| DROP CONSTRAINT <CONSTRAINT_2 NAME>; Permite añadir nuevas columnas y constraints, modificar los tipos de datos de las columnas o constraints existentes, y borrar las constraints existentes. Oracle 7 no permitía borrar una columna una vez estuviera creada, pero Oracle 8 ya lo permite (aunque no entraremos en detalle de como hacerlo). Veamos un par de ejemplos: ALTER TABLE PATRON DROP CONSTRAINT PK_PATRON; Borra la clave primaria de la tabla PATRON. ALTER TABLE ANTIQUES ADD (PRICE NUMBER(8,2) NULL); Crea una nueva columna PRICE de tipo NUMBER en la tabla ANTIQUES que puede estar vacía en algún registro.1.3 Borrado de tablas Para borrar una tabla de la base de datos es necesario ejecutar una sentencia con la siguiente sintaxis: DROP TABLE <TABLE NAME>; Por ejemplo, la siguiente sentencia borra la tabla ANTIQUES de la base de datos: DROP TABLE ANTIQUES; INNOVA Desarrollos Informáticos, SL Pág. 15
  16. 16. Introducción al lenguaje SQL Unidad 3: DML Lenguaje de manipulación de datos1.4 Creación de índices Los índices permiten al sistema gestor de base de datos acceder a los datos de una manera más rápida, por lo que ayuda a disminuir el tiempo de respuesta de las consultas. El sistema crea una estructura de datos interna que retorna las filas de una consulta más rápidamente cuando dicha consulta se basa en las mismas columnas que el índice. El índice retorna al sistema gestor de base de datos el lugar exacto en su estructura de información en donde está almacenada una cierta fila dada, según las columnas de la consulta. Se parece mucho al sistema de glosario que utilizan los libros para localizar las palabras en las páginas que aparecen. La sintaxis de la sentencia SQL de creación de índices es la siguiente: CREATE [UNIQUE] INDEX <INDEX NAME> ON <TABLE NAME> (<COLUMN LIST>); Veamos un par de ejemplos de creación de índices en SQL: CREATE INDEX OID_IDX ON ANTIQUEOWNERS (OWNERID); CREATE INDEX NAME_IDX ON ANTIQUEOWNERS (OWNERLASTNAME, OWNERFIRSTNAME) ; En el primer ejemplo, hemos creado un índice llamado OID_IDX en la tabla ANTIQUEOWNERS y sobre la columna OWNERID. Al hacer una consulta en la base de datos sobre la columna OWNERID, el índice permitirá que dicha consulta se ejecute más rápidamente. En el segundo caso hemos creado un índice sobre una tabla diferente, pero esta vez sobre dos columnas, OWNERLASTNAME y OWNERFIRSTNAME. El orden de las columnas en la definición del índice es esencial para que este funcione correctamente. Algunos consejos para la creación de índices podrían ser: a) Si una tabla posee un tamaño de algunos cientos de filas o más, es preferible indexarla. Una tabla grande con índices mejorará el tiempo de respuesta en las consultas. b) Es mejor no crear más de dos o tres índices en una tabla. El exceso de índices incrementa el espacio de almacenamiento en disco y el tiempo de respuesta en las inserciones, el borrado y las actualizaciones de filas en la tabla. c) Hay que indexar las columnas más utilizadas en las condiciones de consulta, no las que se consultan. INNOVA Desarrollos Informáticos, SL Pág. 16
  17. 17. Introducción al lenguaje SQL Unidad 3: DML Lenguaje de manipulación de datos1.5 Borrado de índices Para borrar un índece se utiliza la siguiente sintaxis: DROP INDEX <INDEX NAME>; Así, por ejemplo: DROP INDEX OID_IDX; Borra el índice OID_IDX1.6 Creación de secuencias Una secuencia es un conjunto de números generados automáticamente. El contenido de una secuencia en cierto momento es un numérico que cambia según ciertos parámetros expuestos en su definición y que, según Oracle, es accesible en cierto momento por una sola sesión, y además, por cada acceso el valor de la secuencia cambia. Así, es lo que se podría llamar un autonumérico, esto es, un objeto que por cada acceso retorna un número diferente. La sentencia SQL que define una secuencia es: CREATE SEQUENCE <NOM_SEQUENCE> [INCREMENT BY <integer>] [START WITH <integer 2>] [MAXVALUE <integer 3> | NOMAXVALUE] [MINVALUE <integer 4> | NOMINVALUE] [CYCLE |NOCYCLE] [CACHE <integer 5> | NOCACHE] [ORDER | NOORDER] Dónde <NOM_SEQUENCE> es el nombre de la secuencia nueva, <integer> es la razón del incremento del autonumérico (decremento si es negativo), <integer 2> el valor inicial, <integer 3> el valor máximo a alcanzar, <integer 4> el valor mínimo posible, CYCLE permite que, una vez alcanzado el valor máximo o mínimo, se vuelva a empezar, <integer 5> especifica el número de valores a guardar en la caché de la secuencia (con el fin de acceder a ellos más rápidamente), y ORDER implica un orden en la demanda de los números de la secuencia. Un ejemplo podría ser: INNOVA Desarrollos Informáticos, SL Pág. 17
  18. 18. Introducción al lenguaje SQL Unidad 3: DML Lenguaje de manipulación de datos CREATE SEQUENCE cod_empresa INCREMENT BY 1 START WITH 1 MAXVALUE 100000 MINVALUE 1 NOCYCLE NOCACHE ORDER; Crea una secuencia que retornará un número que empieza po 1 y como máximo llegará hasta 100000 (ordenadamente). El acceso a una secuencia se explica en la siguiente unidad.1.7 Borrado de secuencias El borrado de una secuencia se realiza mediante la siguiente sentencia SQL: DROP SEQUENCE <NOM_SEQUENCE>; Por ejemplo, la siguiente sentencia borra una secuencia llamada cod_empresa: DROP SEQUENCE cod_empresa;1.8 Dando privilegios de acceso Una tabla en Oracle es un objeto del repositorio. A medida que nos vayamos adentrando en la filosofía de gestión de bases de datos Oracle, nos daremos cuenta de que existen muchos tipos de objetos. Por ejemplo, un índice o una secuencia, son objetos de Oracle. Podría ocurrir que en cierto esquema tuviéramos una serie de objetos (propiedad del propietario del esquema), que queremos compartir. La compartición de un objeto se realiza dando privilegios de acceso sobre ese objeto a otro esquema, o incluso a un rol de Oracle. A continuación vamos a ver la sintaxis resumen de la sentencia SQL que permite asignar privilegios de acceso a objetos: GRANT <LISTA_PRIV> ON <NOM_OBJ> TO <USUARIO>; Dónde <LISTA_PRIV> es la lista de privilegios, serparados por comas. Podemos dar privilegios de acceso de consulta (SELECT), inserción (INSERT), actualización (UPDATE), y borrado (DELETE) sonbre una tabla, y de INDEX para indexar sobre una tabla. ALL da todos los privilegios sobre la tabla. INNOVA Desarrollos Informáticos, SL Pág. 18
  19. 19. Introducción al lenguaje SQL Unidad 3: DML Lenguaje de manipulación de datos <NOM_OBJ> es el nombre del objeto sobre el que damos los privilegios, y <USUARIO> es el esquema al que se lo damos. PUBLIC crea privilegios del objeto sobre todos los usuarios de la base de datos. Veamos un ejemplo: GRANT SELECT,INSERT,UPDATE ON TABLA1 TO USU1; La sentencia anterior, supuestamente ejecutada en el usuario propietario de la tabla TABLA1, da privilegios de lectura, inserción y actualización de datos en TABLA1 al esquema USU1. 1.9 Quitando privilegios de acceso Igual que damos privilegios de acceso, los podemos quitar (siempre sonbre objetos propiedad del que otorga o deniega el privilegio). La sintaxis resumida es la siguiente: REVOKE <LISTA_PRIV> ON <NOM_OBJ> FROM <USUARIO>; Dónde <LISTA_PRIV> es la lista de privilegios, serparados por comas. En este caso ocurre lo mismo que antes, esto es, podemos quitar privilegios de acceso de consulta (SELECT), inserción (INSERT), actualización (UPDATE), y borrado (DELETE) sonbre una tabla, y de INDEX sobre un índice. <NOM_OBJ> es el nombre del objeto sobre el que quitamos los privilegios, y <USUARIO> es el esquema al que se lo quitamos. Por ejemplo: REVOKE INSERT,UPDATE ON TABLA1 FROM USU1; La sentencia anterior, supuestamente ejecutada en el usuario propietario de la tabla TABLA1, quita los privilegios de inserción y actualización de datos en TABLA1 al esquema USU1.1.10 Creación de sinónimos Un sinónimo es un nombre alternativo para un objeto, por ejemplo una tabla. Un sinónimo es otro objeto en sí, por lo que podríamos crear un sinónimo de otro sinónimo. Para crear un sinónimo, existe la siguiente sentencia SQL: CREATE SYNONYM <NOM_SYN> FOR <NOM_OBJ>; Dónde <NOM_SYN> es el nombre del sinónimo, y <NOM_OBJ> es el nombre del objeto sobre el que estoy creando del sinónimo. Veamos un ejemplo: CREATE SYNONYM TABLA1 FOR USU0.TABLA1; INNOVA Desarrollos Informáticos, SL Pág. 19
  20. 20. Introducción al lenguaje SQL Unidad 3: DML Lenguaje de manipulación de datos Este ejemplo, crea un sinónimo TABLA1 sobre la TABLA1 del esquema USU0, en el esquema que ejecuta la sentencia. En Oracle, la identificación de un objeto se realiza mediante la siguiente sintaxis: SCHEMA.OBJECT @ DBLINK Dónde SCHEMA es el nombre del esquema (usuario), OBJECT es el nombre del objeto (el nombre de una tabla, por ejemplo), y DBLINK (conocido como Database Link) es el nombre de un enlace a una base de datos remota. Por ejemplo, supongamos que la base de datos ORCL, contiene la tabla EJEMPLO, en el esquema JAVI. La manera de referenciarla es: JAVI.EJEMPLO @ ORCL Así, supongamos que ejecutamos en el esquema JAVI la siguiente sentencia: GRANT SELECT ON EJEMPLO TO LUIS; Esta sentencia permitirá al esquema LUIS consultar los registros de la tabla EJEMPLO de JAVI. Entonces, para referenciar la tabla EJEMPLO desde LUIS, debemos emplear el nombre JAVI.EJEMPLO. Sin embargo, si quisiéramos emplear otro nombre (sólo EJEMPLO, en vez de JAVI.EJEMPLO) deberíamos crear el siguiente sinónimo: CREATE SYNONYM EJEMPLO FOR JAVI.EJEMPLO;1.11 Borrado de sinónimos Podemos borrar un sinónimo con la siguiente sentencia SQL: DROP SYNONYM <NOM_SYN>; Por ejemplo: DROP SYNONYM EJEMPLO; Borra el sinónimo EJEMPLO del repositorio.1.12 Vaciar una tabla Podemos vaciar una tabla con la sentencia siguiente: TRUNCATE TABLE <NOM_TAB>; Por ejemplo: TRUNCATE TABLE EMP; INNOVA Desarrollos Informáticos, SL Pág. 20
  21. 21. Introducción al lenguaje SQL Unidad 3: DML Lenguaje de manipulación de datos 2 UNIDAD 3: DML LENGUAJE DE MANIPULACIÓN DE DATOSObjetivo general de la unidad Aprender a insertar, borrar, actualizar y consultar datos de tablas.Objetivos específicos Hacer énfasis en las consultas de datos y los métodos de desarrollo deconsultas.Contenidos Inserción, actualización, borrado y consulta (con todas susposibilidades) de datos en las tablas.INNOVA Desarrollos Informáticos, SL Pág. 21
  22. 22. Cuaderno de notasINNOVA Desarrollos Informáticos, SL Pág. 22
  23. 23. Introducción al lenguaje SQL Unidad 3: DML Lenguaje de manipulación de datosINNOVA Desarrollos Informáticos, SL Pág. 23
  24. 24. Actividades Seguir las sesiones prácticas y realizar los ejercicios correspondientes alos conceptos de la unidad.INNOVA Desarrollos Informáticos, SL Pág. 24
  25. 25. 2.1 Introducción Acabamos de ver las sentencias básicas necesarias para crear bases de datos relacionales. A continuación, veremos cómo es posible, insertar, borrar, actualizar y consultar datos de las tablas creadas mediante sentencias SQL.2.2 Inserción de datos La sentencia SQL para insertar datos en una tabla tiene la siguiente sintaxis: INSERT INTO <TABLE NAME> [(<COLUMN LIST>)] VALUES (<VALUE LIST>); Dónde <TABLE NAME> es el nombre de la tabla en dónde queremos insertar los datos, <COLUMN LIST> es la lista, separada por comas, de las columnas de la tabla que queremos insertar, y <VALUE LIST> es la lista, también separada por comas, de los valores a introducir en las columnas especificadas. Los valores se insertarán en las columnas según el orden de <COLUMN LIST>. Veamos un ejemplo: INSERT INTO ANTIQUES VALUES (21, 01, Ottoman, 200.00); Al no especificar la lista de columnas, el intérprete de SQL toma por defecto todas las columnas de la tabla y en el orden de éstas (por lo general el orden de creación de las columnas en la tabla). INSERT INTO ANTIQUES (BUYERID, SELLERID, ITEM) VALUES (01, 21, Ottoman); En este ejemplo, podemos ver como es fácil insertar datos en una tabla en el orden que queramos, siempre que especifiquemos dicho orden en la lista de columnas a insertar.2.3 Borrar datos La sentencia SQL que borra filas de una tabla tiene la siguiente sintaxis: DELETE FROM <TABLE NAME> WHERE <CONDITION>; Dónde <TABLE NAME> es el nombre de la tabla de la cuál queremos borrar filas y <CONDITION> es la condición que cumplirán todas las filas que queremos borrar. Veamos un ejemplo: DELETE FROM ANTIQUES WHERE ITEM = Ottoman; INNOVA Desarrollos Informáticos, SL Pág. 25
  26. 26. Introducción al lenguaje SQL La sentencia anterior borra todas la filas de la tabla ANTIQUES que cumplan la condición de que en la columna ITEM tengan exactamente el valor ‘Ottoman’. Veamos otro ejemplo: DELETE FROM ANTIQUES WHERE ITEM = Ottoman AND BUYERID = 01 AND SELLERID = 21; En este caso, borraremos sólo las filas de la tabla que cumplan que la columna ITEM sea exactamente ‘Ottoman’, y que la columna BUYERID sea 01 y que la columna SELLERID sea 21.2.4 Actualización de datos La siguiente sentencia SQL permite actualizar los datos de una o varias filas, dependiendo de la condición de actualización: UPDATE <TABLE NAME> SET <COLUMN_1 NAME> = <VALUE_1>, <COLUMN_2 NAME> = <VALUE_2>, ... [WHERE <CONDITION>]; <TABLE NAME> es el nombre de la tabla en donde están los datos que queremos actualizar, <COLUMN_1 NAME> es el nombre de la primera columna que queremos actualizar y <VALUE_1> el nuevo valor que queremos actualizar. Es posible actualizar todas las columnas de una tabla en una misma sentencia. Por otra parte, para actualizar las filas de una tabla, es necesario especificar mediante una condición cuales, de entre todas las de la tabla, van a ser actualizadas, por lo que si es necesario, habrá que añadir una condición como se ve en <CONDITION>. Veamos un ejemplo: UPDATE ANTIQUES SET PRICE=500.00 WHERE ITEM = Chair; La sentencia anterior actualiza, de la tabla ANTIQUES, la columna PRICE a 500.00, de todas las filas en las que la columna ITEM sea ‘Chair’. INNOVA Desarrollos Informáticos, SL Pág. 26
  27. 27. Introducción al lenguaje SQL2.5 Consultas En las bases de datos relacionales, los datos se guardan en tablas como la siguiente: EmployeeAaddressTable SSN FirstName LastName Address City State 512687458 Joe Smith 83 First Street Howard Ohio 758420012 Mary Scott 842 Vine Ave Losantiville Ohio 102254896 Sam Jones 33 Elm St Paris New York 876512563 Sarah Ackerman 440 U.S. 110 Upton Michigan La sintaxis de una sentencia de consulta podría resumirse en: SELECT [DISTINCT|ALL] <LIST OF COLUMNS, FUNCTIONS, CONSTANTS, ETC.> FROM <LIST OF TABLES OR VIEWS> [WHERE <CONDITION(S)>] [GROUP BY <GROUPING COLUMN(S)>] [HAVING <CONDITION>] [ORDER BY <ORDERING COLUMN(S)> [ASC|DESC]]; Veamos un ejemplo para comprender las consultas: SELECT FirstName, LastName, Address, City, State FROM EmployeeAddressTable; El ejemplo anterior nos retornaría una porción de la tabla de ejemplo, de la siguiente manera: FirstName LastName Address City State Joe Smith 83 First Street Howard Ohio Mary Scott 842 Vine Ave Losantiville Ohio Sam Jones 33 Elm St Paris New York Sarah Ackerman 440 U.S. 110 Upton Michigan Acabamos de consultar la tabla EmployeeAddressTable, solicitando todas las filas, pero únicamente, por cada fila, las columnas FirstName, LastName, Address, City y State. INNOVA Desarrollos Informáticos, SL Pág. 27
  28. 28. Introducción al lenguaje SQL Si quisiéramos consultar todas las columnas de una tabla, bastaría conutilizar la siguiente sintaxis: SELECT * FROM <TABLE NAME>; Supongamos ahora que tenemos la siguiente tabla: EmployeeStatisticsTableEmployeeIDNo Salary Benefits Position010 75000 15000 Manager105 65000 15000 Manager152 60000 15000 Manager215 60000 12500 Manager244 50000 12000 Staff300 45000 10000 Staff335 40000 10000 Staff400 32000 7500 Entry-Level441 28000 7500 Entry-Level Y veamos el siguiente ejemplo de consulta: SELECT EMPLOYEEIDNO FROM EMPLOYEESTATISTICSTABLE WHERE SALARY >= 50000; El resultado de la consulta nos devolverá el contenido de la columnaEMPLOYEEIDNO de todas las filas que cumplan la condiciónsiguiente: que el contenido de la columna SALARY sea mayor o igual a50000. El resultado de la consulta será el siguiente: EMPLOYEEIDNO 010 105 152 215 244INNOVA Desarrollos Informáticos, SL Pág. 28
  29. 29. Introducción al lenguaje SQL Una condición o filtro de una consulta es un conjunto de sentenciaslógicas unidas mediante operadores lógicos y/o relacionales. Losoperadores relacionales que permite SQL en su sintaxis son:= Igual¡= ó <> Diferente< Menor que> Mayor que<= Menor o igual que>= Mayor o igual queBETWEEN ... AND ... Entre ... y ...IS NULL Es nuloIN(lista) EN (lista)LIKE Como Veamos el siguiente ejemplo: SELECT EMPLOYEEIDNO FROM EMPLOYEESTATISTICSTABLE WHERE POSITION = Manager; Este ejemplo retorna el contenido de la columna EMPLOYEEIDNOde todas aquellas filas de la tabla del ejemplo que contengan en lacolumna POSITION el valor ‘Manager’. Veamos otro ejemplo: SELECT EMPLOYEEIDNO FROM EMPLOYEESTATISTICSTABLE WHERE POSITION IS NULL; La consulta retornará aquellas filas que contengan la columnaPOSITION de la tabla EMPLOYEESTATISTICSTABLE vacía.INNOVA Desarrollos Informáticos, SL Pág. 29
  30. 30. Introducción al lenguaje SQL A continuación veremos una tabla de evaluación en dónde estáninvolucrados valores a NULL: Si A es: Condición: Resultado:10 A IS NULL FALSE10 A IS NOT NULL TRUENULL A IS NULL TRUENULL A IS NOT NULL FALSE10 A = NULL UNKNOWN10 A ¡= NULL UNKNOWNNULL A = NULL UNKNOWNNULL A ¡= NULL UNKNOWNNULL A = 10 UNKNOWNNULL A ¡= 10 UNKNOWN Por otra parte, existen tres operadores lógicos que unen lascondiciones, que son AND (y), OR (o) y NOT (negación). El operadorAND une varias condiciones y en una consulta retorna el número defilas que cumplen todas las condiciones. Por ejemplo: SELECT EMPLOYEEIDNO FROM EMPLOYEESTATISTICSTABLE WHERE SALARY > 40000 AND POSITION = Staff; Retorna el contenido de la columna EMPLOYEEIDNO de las filascuya columna SALARY es mayor de 40000 y además cuya columnaPOSITION es igual a ‘Staff’. El operador lógico OR une varias condiciones, pero en una consultaretorna aquellas filas que cumplen cualquiera de las condiciones unidas.Por ejemplo: SELECT EMPLOYEEIDNO FROM EMPLOYEESTATISTICSTABLE WHERE SALARY < 40000 OR BENEFITS < 10000; En este caso, la consulta retornará el contenido de la columnaEMPLOYEEIDNO de las filas que, o bien la columna SALARY seamenor que 40000, o bien la columna BENEFITS sea menor que 10000.INNOVA Desarrollos Informáticos, SL Pág. 30
  31. 31. Introducción al lenguaje SQL Obviamente, es posible combinar AND y OR en una misma consulta.Veamos un ejemplo: SELECT EMPLOYEEIDNO FROM EMPLOYEESTATISTICSTABLE WHERE (POSITION = Manager AND SALARY > 60000) OR BENEFITS > 12000; La consulta retorna el valor de la columna EMPLOYEEIDNO de lasfilas que cumplan, o bien que la columna POSITION es ‘Manager’ y queSALARY es mayor que 60000, o bien que la columna BENEFITS esmayor que 12000. Veamos ahora el siguiente ejemplo: SELECT EMPLOYEEIDNO FROM EMPLOYEESTATISTICSTABLE WHERE POSITION = Manager AND (SALARY > 60000 OR BENEFITS > 12000); La consulta retorna el valor de la columna EMPLOYEEIDNO de lasfilas que cumplan que la columna POSITION es ‘Manager’ y que, o bienSALARY es mayor que 60000, o bien que la columna BENEFITS esmayor que 12000. Fijémonos en que ambas consultas podríandevolvernos diferentes resultados, ya que el orden de ejecución (quedepende de los paréntesis) condiciona totalmente los resultados. Un ejemplo de consulta utilizando el operador IN podría ser elsiguiente: SELECT EMPLOYEEIDNO FROM EMPLOYEESTATISTICSTABLE WHERE POSITION IN (Manager, Staff); La consulta retornará los valores de las filas que cumplan que lacolumna POSITION sea o bien ‘Manager’, o bien ‘Staff’. Este operadorse comporta más como lógico que como relacional. Sin embargo, eloperador BETWEEN aplica una mezcla entre ambos tipos deoperadores: SELECT EMPLOYEEIDNO FROM EMPLOYEESTATISTICSTABLE WHERE SALARY BETWEEN 30000 AND 50000; Retorna los valores de las filas que cumplen que la columna SALARYestá entre 30000 y 50000.INNOVA Desarrollos Informáticos, SL Pág. 31
  32. 32. Introducción al lenguaje SQL Por último, el operador NOT, niega el contenido de la condición, como en el siguiente ejemplo: SELECT EMPLOYEEIDNO FROM EMPLOYEESTATISTICSTABLE WHERE SALARY NOT (BETWEEN 30000 AND 50000); En donde las filas seleccionadas son aquellas que no cumplen que la columna SALARY contengá valores entre 30000 y 50000. El operador relacional LIKE permite seleccionar las filas cuyo campo en la condición no coincida exactamente, sino en parte con una cadena constante. Por ejemplo: SELECT EMPLOYEEIDNO FROM EMPLOYEESTATISTICSTABLE WHERE LASTNAME LIKE L%; La consulta retornará aquellas filas cuya columna LASTNAME contenga una cadena que se inicie con ‘L’. El símbolo % se usa como comodín, para indicar que no importa el resto de la cadena. Una condición del tipo LASTNAME LIKE ‘%L’ retoraría aquellas filas cuya columna LASTNAME acabara en ‘L’. Incluso la condición LASTNAME=’%L%’ es posible, y retornaría aquellas filas cuya columna LASTNAME contuviera una ‘L’. El carácter _ sustituye a un carácter comodín en lugar de a una cadena.2.6 Enlaces Supongamos que en nuestra base de datos tenemos las siguientes tablas llenas de la siguiente manera. AntiqueOwners OwnerID OwnerLastName OwnerFirstName 01 Jones Bill 02 Smith Bob 15 Lawson Patricia 21 Akins Jane 50 Fowler Sam INNOVA Desarrollos Informáticos, SL Pág. 32
  33. 33. Introducción al lenguaje SQL OrdersOwnerID ItemDesired02 Table02 Desk21 Chair15 Mirror AntiquesSellerID BuyerID Item01 50 Bed02 15 Table15 02 Chair21 50 Mirror50 01 Desk01 21 Cabinet02 21 Coffee Table15 50 Chair01 15 Jewelry Box02 21 Pottery21 02 Bookcase50 01 Plant Stand En las tablas anteriores podemos ver como OwnerID es clave foráneade la tabla ORDERS (un propietario puede tener varios pedidos).Además, en la tabla ANTIQUES, SellerID y BuyerID son clavesforáneas referenciadas desde la columna OwnerID de la tablaANTIQUEOWNERS. A continuación veremos ejemplos de cómo crear enlaces entre valoresde columnas de diferentes tablas (enlaces de claves foráneas o integridadreferencial).INNOVA Desarrollos Informáticos, SL Pág. 33
  34. 34. Introducción al lenguaje SQL Para consultar los nombres de los que han comprado una silla,realizaremos la siguiente sentencia: SELECT OWNERLASTNAME, OWNERFIRSTNAME FROM ANTIQUEOWNERS, ANTIQUES WHERE BUYERID = OWNERID AND ITEM = Chair; Hay que fijarse en que el truco se basa en crear una condición en laque se igualan las dos claves de las tablas que están unidas por unarelación. Por otra parte, al estar utilizando dos columnas de diferentestablas, es necesario que ambas tablas estén incluidas en la consulta. El resultado de la consulta es: OWNERLASTNAME OWNERFIRSTNAME Smith Bob Fowler Sam ¿Qué pasa si ambas columnas se llaman de la misma manera?. Porejemplo, supongamos el caso en que quisiéramos consultar los nombresy apellidos de aquellos propietarios que tuvieran algún pedido: SELECT OWNERLASTNAME, OWNERFIRSTNAME FROM ANTIQUEOWNERS, ORDERS WHERE OWNERID = OWNERID; Esta sentencia está mal escrita ya que posee una ambigüedad en lascolumnas y no se garantiza que devuelva lo que queremos. Así, podemosreferenciar las columnas de una tabla escribiendo<NOMBRE_TABLA>.<NOMBRE_COLUMNA>. El ejemplo anterior quedaría de la siguiente manera: SELECT ANTIQUEOWNERS.OWNERLASTNAME, ANTIQUEOWNERS.OWNERFIRSTNAME FROM ANTIQUEOWNERS, ORDERS WHERE ANTIQUEOWNERS.OWNERID = ORDERS.OWNERID;INNOVA Desarrollos Informáticos, SL Pág. 34
  35. 35. Introducción al lenguaje SQL Además, podemos definir alias tanto para las columnas como para lastablas. Por ejemplo: SELECT OWNERLASTNAME apellido, OWNERFIRSTNAME nombre FROM ANTIQUEOWNERS tab1, ORDERS tab2 WHERE tab1.OWNERID=tab2.OWNERID; El resultado de esta consulta devolverá un conjunto de filas ypodremos referenciar cada columna mediante el alias (apellido y nombre,respectivamente). El resultado de la anterior consulta nos queda, portanto: apellido nombre Smith Bob Smith Bob Akins Jane Lawson Patricia Como se puede apreciar en el ejemplo, al hacer ciertas consultas conenlaces derivados de relaciones, es posible que se retornen filasduplicadas. Para evitarlo, podemos utilizar la clausula DISTINCT, comoen el ejemplo: SELECT DISTINCT OWNERLASTNAME apellido,OWNERFIRSTNAME nombre FROM ANTIQUEOWNERS tab1, ORDERS tab2 WHERE tab1.OWNERID=tab2.OWNERID; Supongamos además, un ejemplo en donde queremos que las filas nossean retornadas de la base de datos ordenadas según cierto criterio. Unbuen ejemplo sería la consulta de identificador, nombre y apellidos de losvendedores de anticüedades, que no sólo se repiten y lo que queremos esque no se repitan, sino que además, queremos que las filas de la consultaestén ordenadas por apellido y nombre. Para ello, hay que utilizar lacláusula ORDER BY <LISTA_COLUMNAS> DESC|ASC al final dela sentencia SELECT. <LISTA_COLUMNAS> es el nombre de lascolumnas (o aliases de columnas) separadas por comas, por los quequeremos que ordene las filas. Esta clausula admite que el orden seadescendente (DESC) o ascendente ASC. Si no especificamos el tipo deorden, se presupone ascendente:INNOVA Desarrollos Informáticos, SL Pág. 35
  36. 36. Introducción al lenguaje SQL SELECT DISTINCT SELLERID, OWNERLASTNAME, OWNERFIRSTNAME FROM ANTIQUES, ANTIQUEOWNERS WHERE SELLERID = OWNERID ORDER BY OWNERLASTNAME, OWNERFIRSTNAME;2.7 Subconsultas Una subconsulta es una sentencia de consulta incluida dentro de otra. Como ya hemos visto antes, las clausulas SELECT, permiten restringir las filas de la consulta con un operador relacional que permite ver si el valor de cierta columna está incluido en cierto conjunto de valores. Estamos hablando del operador IN, y su utilización puede verse mediante el siguiente ejemplo: SELECT OWNERLASTNAME FROM ANTIQUEOWNERS t1, ORDERS t2 WHERE t1.OWNERID=t2.OWNERID AND ITEMDESIRED IN (‘Chair’,’Mirror’); Esta consulta retorna aquellas apellidos de los ANTIQUEOWNERS que tengan algún ORDER y cuyo ITEMDESIRED esté en el conjunto especificado (‘Chair’,’Mirror’). Esta sentencia se puede reescribir mediante el operador lógico OR. Sin embargo, puede haber ocasiones en que sea necesario especificar un conjunto de valores que son el resultado de otra consulta. En estos casos, en vez de escribir entre paréntesis la lista de los valores posibles, es posible poner una sentencia SELECT (la subconsulta de la que hablábamos). Por ejemplo: SELECT OWN.OWNERLASTNAME Last Name, ORD.ITEMDESIRED Item Ordered FROM ORDERS ORD, ANTIQUEOWNERS OWN WHERE ORD.OWNERID = OWN.OWNERID AND ORD.ITEMDESIRED IN (SELECT ITEM FROM ANTIQUES); INNOVA Desarrollos Informáticos, SL Pág. 36
  37. 37. Introducción al lenguaje SQL Esta sentencia retorna lo siguiente: Last Name Item Ordered Smith Table Smith Desk Akins Chair Lawson Mirror Debemos destacar: 1.- Hemos creado aliases especiales para identificar mejor el resultadode las columnas en cada fila. 2.- Hemos creado también aliases para los nombres de las tablas, conel fin de eliminar la ambigüedad. 3.- Al ejecutarse la subconsulta, el operador IN (equivalente a unmontón de condiciones OR) permite que la consulta geeral retorne todoslos items deseeados por los propietarios, sea el que sea, ya que lasubconsulta nos asegura que el item pertenecerá a la tabla deantigüedades. 4.- No es posible crear una subconsulta que retorne más de unacolumna, o una columna que no sea del mismo tipo de la que precede aloperador IN. Ya que acabamos de ver las subconsultas, saber que: a) Podemos utilizar una subconsulta dentro de una consulta, no sólo através del operador IN, también es posible hacerlo a través de otrosoperadores (incluso algunos los veremos más adelante), como =, aunqueen este caso la subconsulta debe retornar un único valor (no varias filas). b) Es posible crear una tabla nueva (en columnas y contenido)mediante la sentencia CREATE TABLE tabla AS SELECT ...; donde lasubconsulta determinará tanto las columnas de la nueva tabla como lasfilas que contendrá ésta. Fijémonos que una consulta puede implicar avarias tablas, por lo que podemos crear tablas especiales mezclandocolumnas de varias tablas. c) Es posible insertar masivamente filas de una tabla a través delcomando INSERT INTO tabla(col1,col2,...) SELECT ...; donde lascolumnas de la subconsulta deben coincidir en número, orden y tipo concol1,col2,... del comando INSERT. d) Es posible realizar una actualización de una o varias columnas deuna tabla mediante el comando UPDATE tabla SET col1=(SELECT ...)WHERE ...;, o bien mediante UPDATE tabla SET (col1,col2,...)=(SELECT ...) WHERE ...;, dónde si sólo actualiamos una columna,la subconsulta ha de retornar una sola columna, mientras que siINNOVA Desarrollos Informáticos, SL Pág. 37
  38. 38. Introducción al lenguaje SQL actualizamos varias, la subconsulta retornará el mismo número de columnas, en el orden adecuado y del tipo adecuado.2.8 Fuciones de agrupación Una función de agrupación es una función que se aplica sobre un parámetro (por lo general una columna de una consulta) y que permite agrupar el valor de la columna aplicando una función, y retorna un único registro en vez de un conjunto de registros. En Oracle existen varias funciones de agrupación, y estudiaremos las siguientes: a) SUM (COLUMN): Retorna la suma total del valor de la columna COLUMN en todas las filas de la consulta. Obviamente el valor de la columna debe ser numérico. b) AVG (COLUMN): Retorna la media de los valores de la columna COLUMN de todas las filas de la consulta. c) MAX (COLUMN): Retorna el valor máximo de la columna COLUMN de todas las filas de la consulta. d) MIN (COLUMN): Retorna el valor mínimo de la columna COLUMN de todas las filas de la consulta. e) COUNT(‘x’): Retorna el número de filas de la consulta. Veamos algunos ejemplos: SELECT SUM(SALARY), AVG(SALARY) FROM EMPLOYEESTATISTICSTABLE; Esta consulta retorna el total de todos los salarios de la tabla EMPLOYEESTATISTICSTABLE y el salario medio de todas las filas. SELECT MIN(BENEFITS) FROM EMPLOYEESTATISTICSTABLE WHERE POSITION = Manager; Esta consulta retorna el mínimo beneficio que ha obtenido un empleado del tipo ‘Manager’. SELECT COUNT(‘x’) FROM EMPLOYEESTATISTICSTABLE WHERE POSITION = Staff; Esta consulta retorna el número de empleados cuya posición es ‘Staff’. INNOVA Desarrollos Informáticos, SL Pág. 38
  39. 39. Introducción al lenguaje SQL 2.9 Las Cáusulas GROUP BY y HAVING Si en una consulta queremos agrupar (aplicar una función de agrupación como podría ser COUNT), a un determinado conjunto de filas de una consulta (no a todas) y somos capaces de identificar de manera diferente a cada grupo, podemos emplear la cláusula GROUP BY. Supongamos, por ejemplo, que queremos saber el precio de la antigüedad más cara que ha comprado cada propietario (BUYERID). Un propietario puede haber comprado varias, pero queremos saber la más cara de cada uno: SELECT BUYERID, MAX(PRICE) FROM ANTIQUES GROUP BY BUYERID; Supongamos que queremos añadir una condición especial a la consulta, de manera que además de agrupar, queremos condicionar las filas en función de la propia columna agrupada. En ese caso utilizaremos la cláusula HAVING como en el siguiente ejemplo: SELECT BUYERID, MAX(PRICE) FROM ANTIQUES GROUP BY BUYERID HAVING PRICE > 1000; El resultado de la consulta es el mismo que la del anterior ejemplo, pero sólo sacará aquellas filas cuyo precio sea superior a 1000. Obviamente, Oracle permite combinar las cáusulas WHERE y HAVING dentro de una misma sentencia SELECT. En este caso, Oracle procede de la siguiente manera: 1º).- Aplica WHERE a las filas seleccionadas. 2º).- Forma los grupos y calcula las funciones de grupo. 3º).- Aplica la cláusula HAVING a los grupos seleccionados.2.10 Combinación con Subconsultas Podemos combinar subconsultas con funciones de agrupación, como en el siguiente ejemplo, que listamos todos aquellos compradores, cuyo precio de las antigüedades supere estrictamente en 100 unidades monetarias la media del precio de todas las antigüedades: INNOVA Desarrollos Informáticos, SL Pág. 39
  40. 40. Introducción al lenguaje SQL SELECT BUYERID FROM ANTIQUES WHERE PRICE > (SELECT AVG(PRICE) + 100 FROM ANTIQUES); El siguiente ejemplo, combina una consulta con una subconsulta con una cláusula DISTINCT. Concretamente lista los apellidos de los propietarios de las antigüedades que son compradores de alguna en la tabla ANTIQUES: SELECT OWNERLASTNAME FROM ANTIQUEOWNERS WHERE OWNERID IN (SELECT DISTINCT BUYERID FROM ANTIQUES); Recordemos que es posible utilizar de la misma forma, sentencias SELECT (como subconsultas) en la sentencia de actualización. En el siguiente ejemplo, actualizaremos el nombre de la persona que ha comprado una antigüedad de tipo ‘Bookcase’: UPDATE ANTIQUEOWNERS SET OWNERFIRSTNAME = John WHERE OWNERID = (SELECT BUYERID FROM ANTIQUES WHERE ITEM = Bookcase); Tan sólo hacer énfasis en que si tenemos una subconsulta incluida en la parte del WHERE de una consulta, la sentencia SELECT de la subconsulta debe coincidir en número y tipo de datos con las columnas que se pretenden asociar a la subconsulta en la parte del WHERE.2.11 Las Cláusulas EXISTS, ALL y ANY La cláusula EXISTS utiliza una subconsulta como condición, dónde la condición es cierta si la subconsulta retorna alguna fila, y falsa si no retorna ninguna. En el siguiente ejemplo, visualizaremos los nombres y apellidos de las personas que hayan comprado una antigüedad de tipo ‘Chair’: INNOVA Desarrollos Informáticos, SL Pág. 40
  41. 41. Introducción al lenguaje SQL SELECT OWNERFIRSTNAME, OWNERLASTNAME FROM ANTIQUEOWNERS WHERE EXISTS (SELECT * FROM ANTIQUES WHERE ITEM = Chair); La cláusula ALL es más fácil de explicar con un ejemplo. Supongamos que tenemos la siguiente consulta: SELECT BUYERID, ITEM FROM ANTIQUES WHERE PRICE >= ALL (SELECT PRICE FROM ANTIQUES); El resultado de la consulta devolverá la fila o filas (identificador del comprador y antigüedad) que sea o sean más caras. La subconsulta retorna todos los precios de las antigüedades y la consulta general (mediante la cláusula WHERE) va mirando que se cumpla para cada una de las antigüedades, que su precio sea mayor o igual que cada uno de los precios que retorna la subconsulta. Si cumple que el precio es mayor o igual para todos los casos que devuelva la subconsulta, entonces retorna la fila, sino excluye la fila. Un ejemplo con la cláusula ANY, podría ser el siguiente: SELECT * FROM EMP WHERE SAL=ANY (SELECT SAL FROM EMP WHERE DEPTNO=30); Retorna todos los datos de los empleados cuyo salario es igual a alguno de los salarios de los empleados del departamento número 30. En este caso, no se debe cumplir la subconsulta para cada fila retornada por ésta, sino que basta que se cumpla para una fila cualquiera.2.12 Unión, intersección y resta entre consultas Hay ocasiones en que puede ser útil realizar la unión, intersección o resta de las filas derivadas de una serie de consultas. SQL nos permite realizar estas operaciones mediante UNION, INTERSECT y MINUS. Veamos a continuación un ejemplo de cada una: INNOVA Desarrollos Informáticos, SL Pág. 41
  42. 42. Introducción al lenguaje SQL SELECT BUYERID FROM ANTIQUES UNION SELECT OWNERID FROM ORDERS; Une los valores de las columnas BUYERID de ANTIQUES y OWNERID de ORDERS en una sola consulta. El número de columnas de dos sentencias de consulta unidas debe ser el mismo, además de que en el orden deben coincidir en el tipo. En el ejemplo anterior, BUYERID y OWNERID son del mismo tipo. La cláusula UNION elimina automáticamente los duplicados, como debería ser en una unión lógica de conjuntos de filas. En el caso de querer mantener filas duplicadas, utilizaríamos UNION ALL. La intersección y la resta se usan de manera similar, usando INTERSECT y MINUS, respectivamente.2.13 Outer Joins Para entender el concepto de Outer Join, empezaremos explicando el siguiente ejemplo de consulta: SELECT OWNERID, is in both Orders & Antiques FROM ORDERS, ANTIQUES WHERE OWNERID = BUYERID UNION SELECT BUYERID, is in Antiques only FROM ANTIQUES WHERE BUYERID NOT IN (SELECT OWNERID FROM ORDERS); La primera consulta retorna los valores de la columna OWNERID de la tabla ORDERS que cumplen la condición de estar además en ANTIQUES (son compradores). La unión nos permite añadir a la lista las filas de la segunda consulta, que retorna la lista de los compradores que no están en la tabla ORDERS. Hay casos de consultas en que, sin utilizar UNION, ni consultas poco óptimas para el motor de base de datos, es posible retornar un conjunto de filas similar al del ejemplo, es decir, realizando una “join” para INNOVA Desarrollos Informáticos, SL Pág. 42
  43. 43. Introducción al lenguaje SQLconseguir los identificadores de los propietarios que están en ORDERS yque cuya clave foránea puede ser nula en la tabla ANTIQUES. Supongamos ahora el caso de la típica relación maestro-detalle, endonde un vendedor puede tener cero o varios clientes. Si listamos la listade vendedores partiendo de la lista de clientes, habrá vendedores que noaparecerán. Por ejemplo: SELECT NOMCLI,APECLI,NOMVEN,APEVEN FROM CLIENTES,VENDEDORES WHERE CLIENTES.IDVEN=VENDEDORES.IDVEN; Está claro que los vendedores que no tienen clientes no saldríanlistados. Una “outer join” se utiliza para que la consulta retorne toda la lista devendedores, incluso los que no tienen clientes, poniendo un nulo en ellugar de su nombre y apellido. La sintaxis de Oracle se ve en el anteriorejemplo resuelto: SELECT NOMCLI,APECLI,NOMVEN,APEVEN FROM VENDEDORES,CLIENTES WHERE CLIENTES.IDVEN(+)=VENDEDORES.IDVEN; Veamos un ejemplo más. Supongamos la siguiente tabla de empleadosEMPLOYEE:Name Department 1 10 2 10 3 20 4 30 5 30 Y supongamos la tabla de departamentos DEPARTMENT:Department 10 20 30 40 Supongamos ahora que queremos enlazar las tablas, lanzando unaconsulta de todos los empleados y todos los departamentos. Si nosINNOVA Desarrollos Informáticos, SL Pág. 43
  44. 44. Introducción al lenguaje SQL fijamos en las tablas anteriores, el departamento 40 no tiene empleados, por lo que queremos que aparezca sin empleados (vacío). Para ello, tendremos que incluir una “outer join”: SELECT E.NAME, D.DEPARTMENT FROM DEPARTMENT D, EMPLOYEE E WHERE E.DEPARTMENT(+) = D.DEPARTMENT; Obteniendo el siguiente resultado: Name Department 1 10 2 10 3 20 4 30 5 30 40 2.14 Funciones de SQL En las consultas, podemos aplicar directamente funciones especiales de tratamiento de valores, con el fin de obtener directamente resultados apropiados. Existen funciones matemáticas que se aplican a valores numéricos, funciones aplicadas a cadenas de caracteres que retornan cadenas o números, funciones de fechas,y funciones de conversión entre tipos de datos Oracle. Veremos algunas de ellas.2.14.1 Funciones Matemáticas - ABS(n): Retorna el valor absoluto de n. Ejemplo: SELECT ABS(-15) FROM DUAL; Resultado: 15 - CEIL(n): Retorna el entero más pequeño mayor o igual que n Ejemplo: SELECT CEIL(15.7) FROM DUAL; Resultado: 16 - FLOOR(n): Retorna el entero más grande menor o igual a n. Ejemplo: SELECT FLOOR(15.7) FROM DUAL; Resultado: 15 - MOD(m,n): Retorna el resto de dividir m entre n. Retorna m si n es cero. INNOVA Desarrollos Informáticos, SL Pág. 44
  45. 45. Introducción al lenguaje SQL Ejemplo: SELECT MOD(11,4) FROM DUAL; Resultado: 3 - POWER(m,n): Retorna m elevado a n (m y n pueden ser reales, pero si m es negativo, n debe ser entero). Ejemplo: SELECT POWER(3,2) FROM DUAL; Resultado: 9 - ROUND(n[,m]): Retorna n redondeado m veces contando desde el primer número después de la coma. n es un real, pero m debe ser un entero, y en el caso de ser negativo se redonceará a partir de la izquierda de la coma. Ejemplo 1: SELECT ROUND(15.193,1) FROM DUAL; Resultado 1: 15.2 Ejemplo 2: SELECT ROUND(15.193,-1) FROM DUAL; Resultado 2: 20 - SIGN(n): Si n es menor que cero, retorna –1, si n es igual a cero, retorna 0, y si es mayor que cero, retorna 1. Ejemplo: SELECT SIGN(-15) FROM DUAL; Resultado: -1 - SQRT(n): Retorna la raíz cuadrada de n (que no puede ser negativo). Ejemplo: SELECT SQRT(26) FROM DUAL; Resultado: 5.09901951 - TRUNC(n[,m]): Retorna n truncado m lugares decimales. m puede ser negativo si queremos truncar hacia la izquierda de la coma. Ejemplo 1: SELECT TRUNC(15.79,1) FROM DUAL; Resultado 1: 15.7 Ejemplo 2: SELECT TRUNC(15.79,-1) FROM DUAL; Resultado 2: 102.14.2 Funciones de caracteres que retornan caracteres - UPPER(<string>): Convierte la cadena a mayúsculas. Ejemplo: SELECT UPPER(‘Large’) FROM DUAL; Resultado: LARGE INNOVA Desarrollos Informáticos, SL Pág. 45
  46. 46. Introducción al lenguaje SQL - LOWER(<string>): Convierte la cadena a minúsculas. Ejemplo: SELECT LOWER(‘MR. SCOTT MCMILLAN’) FROM DUAL; Resultado: mr. Scott mcmillan - INITCAP(<string>): Convierte la cadena a letras capitales. Ejemplo: SELECT INITCAP(‘the soap’) FROM DUAL; Resultado: The Soap - Concatenación <string>||<string>: Concatena cadenas. Ejemplo: SELECT ‘Soy ‘||’un ‘||’melón’ FROM DUAL; Resultado: Soy un melón - LPAD(<string>,X,<string 2>): Añade a la parte izquierda de la cadena <string>, la cadena <string 2> tantas veces como sea necesario con el fin de que el resultado sean X caracteres. Ejemplo: SELECT LPAD(‘Page 1’,15,’*.’) FROM DUAL; Resultado: *.*.*.*.*Page 1 - RPAD(<string>,X,<string 2>): Añade a la parte derecha de la cadena <string>, la cadena <string 2> tantas veces como sea necesario con el fin de que el resultado sean X caracteres. Ejemplo: SELECT RPAD(‘MORRISON’,12,’ab’) FROM DUAL; Resultado: MORRISONabab - SUBSTR(<string>,n,m): Retorna la cadena que comprende <string>, pero a partir del carácter n-esimo y m caracteres de longitud. Ejemplo: SELECT SUBSTR(‘ABCDEF’,4,4) FROM DUAL; Resultado: DEF - REPLACE(<string>,<string 2>,<string 3>): Reemplaza en la cadena <string> la cadena <string2> por la cadena <string 3>. Ejemplo: SELECT REPLACE(‘JACK and JUE’,’J’,’BL’) FROM DUAL; Resultado: BLACK and BLUEINNOVA Desarrollos Informáticos, SL Pág. 46
  47. 47. Introducción al lenguaje SQL2.14.3 Funciones de caracteres que retornan números - LENGTH(<string>): Retorna la longitud de la cadena (en número de caracteres). Ejemplo: SELECT LENGTH(‘Candide’) FROM DUAL; Resultado: 7 - INSTR(<string>,<string2>[,n[,m]]): Busca en la cadena <string>, a partir del carácter n-ésimo, la m-ésima ocurrencia de la cadena <string2>, y retorna la posición. Ejemplo: SELECT INSTR(‘CORPORATE FLOOR’,’OR’,3,2) FROM DUAL; Resultado: 142.14.4 Funciones de fechas - SYSDATE: Es una variable de Oracle que retorna el momento exacto en el que estamos. Ejemplo: SELECT SYSDATE FROM DUAL; Resultado: 26-03-2000 12:07:48 - LAST_DAY(<date>): Retorna la fecha del último día del mes de <date>. Ejemplo: SELECT LAST_DAY(SYSDATE) FROM DUAL; Resultado: 31-03-2000 - TRUNC(<date>): Trunca la fecha <date>, restándole las horas, minutos y segundos. Ejemplo: SELECT TRUNC(SYSDATE) FROM DUAL; Resultado: 26-03-20002.14.5 Funciones de conversión - TO_CHAR (<date>[,<format>,[ ‘<nls_params>’ ]]): Retorna una cadena de caracteres según <format> de la fecha <date> y aplicando los parámetros de conversión de <nls_param>. Podemos ver la lista de formatos posibles en la siguiente tabla: INNOVA Desarrollos Informáticos, SL Pág. 47
  48. 48. Introducción al lenguaje SQL Formato Significado DAY Nombre del día D Día de la semana DD Día del mes DDD Día del año HH24 Hora del día MI Minuto de la hora MM Número de mes MONTH Nombre del mes SS Segundo del minuto SSSSS Segundos transcurridos desde la medianoche YYYY Año <nls_params> será ‘NLS_DATE_LANGUAGE= lenguaje’, donde el lenguaje escogido será en el que deseemos convertir la fecha. Ejemplo: SELECT TO_CHAR(SYSDATE,’MONTH DD, YYYY’) FROM DUAL; Resultado: MARCH 27, 2000 - TO_CHAR(<number>,[<format>,[ ’<nls_params>’ ]]): Convierte un número en una cadena de caracteres. El formato a emplear para la conversión puede verse en la siguiente tabla:Elemento Ejemplo Descripción 9 9999 Retorna el valor según el número de dígitos especificados, teniendo en cuenta que si el número es negativo estará precedido por un “-“ y si es positivo estará precedido por un blanco. 0 0999 Retorna el valor según el número de dígitos especificados, de manera que si el número tiene menos cifras, pone ceros según el número de ceros. S S9999 Retorna “+” o “-“ en lugar de la S si el número es positivo o negativo, respectivamente. FM FM9999 Retorna el número en el formato adecuado, pero sin insertar blancos delante ni detrás.INNOVA Desarrollos Informáticos, SL Pág. 48
  49. 49. Introducción al lenguaje SQL Ejemplo: SELECT TO_CHAR(‘FM0099’,297) FROM DUAL; Resultado: 0297 - TO_DATE(<string>,[<format>,[ ’<nls_params>’ ]]): Convierte la cadena <string> en una fecha de Oracle, teniendo en cuenta los parámetros de <format> de fechas y <nls_params>. Ejemplo: SELECT TO_DATE(‘26-03-2000’,’DD-MM-YYYY’) FROM DUAL; Resultado: 26-03-2000 00:00:00 - TO_NUMBER(<string>,[<format>,[ ‘<nls_params>’ ]]): Convierte la cadena <string> a un numérico de Oracle según <format> numérico y <nls_params>. Ejemplo: SELECT TO_NUMBER(‘0123’,’FM0999’) FROM DUAL; Resultado: 1232.14.6 Otras funciones - NVL(<column>,<value>): Retorna <column> si <column> no es nulo, sino retorna <value>. Ejemplo 1: SELECT NVL(NULL,’Melón’) FROM DUAL; Resultado 1: Melón Ejemplo 2: SELECT NVL(‘Sandía’,’Melón’) FROM DUAL; Resultado 2: Sandía - USERENV(‘<option>’): Retorna un valor diferente según la opción: ‘LANGUAGE’: Retorna el código del lenguaje actual de uso. ‘TERMINAL’: Retorna el sistema operativo del cliente que tiene abierta la sesión. ‘SESSIONID’: Retorna el número de sesión (número único por acceso). ‘INSTANCE’: Retorna el número de identificación de la instancia. Ejemplo: SELECT USERENV(‘SESSIONID’) FROM DUAL; Resultado: 6732 INNOVA Desarrollos Informáticos, SL Pág. 49
  50. 50. Introducción al lenguaje SQL2.15 Acceso a secuencias El acceso a una secuencia se realiza mediante una consulta a una serie de campos de la secuencia: - CURRVAL: Retorna el valor actual de la secuencia. - NEXTVAL: Incrementa la secuencia y retorna el valor siguiente. Por ejemplo, para acceder al valor actual de la secuencia cod_empresa: SELECT cod_empresa.CURRVAL FROM DUAL; Podemos también insertar un valor nuevo en la tabla empresa mediante la secuencia cod_empresa: INSERT INTO empresa(codigo,nombre) VALUES(cod_empresa.NEXTVAL,’Nueva empresa’);2.16 Optimización en las consultas a) Hay que evitar siempre que sea posible la aplicación directa de funciones matemáticas y de otro tipo directamente en las columnas de una sentencia de consulta, ya que rompe los índices e incrementan el tiempo necesario del optimizador de las consultas, parte del motor de base de datos encargado de encontrar la mejor manera para acceder a los datos de la consulta. b) Minimizar el número de columnas involucradas en la cláusula GROUP BY. c) Las columnas involucradas en las “joins” (claves primarias y claves foráneas), deberían estar indexadas en ambas tablas. d) En las consultas en las que es necesario contar los registros es más óptimo utilizar COUNT(‘x’) en lugar de COUNT(*) o COUNT(<column>).2.17 Vistas Una vista es un objeto de la base de datos similar a un filtro. Una vista es una consulta a la que podemos referenciar como si se tratara de una tabla (en modo lectura). De hecho, la sintaxis de creación de una vista es: CREATE VIEW <VIEW NAME> AS <QUERY>; Dónde <VIEW NAME> es el nombre de la vista y <QUERY> es una sentencia SQL de consulta. Veamos un ejemplo: CREATE VIEW files_text AS SELECT filno,filname FROM files WHERE filext=’TXT’; INNOVA Desarrollos Informáticos, SL Pág. 50
  51. 51. Introducción al lenguaje SQL Para crear una vista es necesario tener los privilegios de inserción, actualización, borrado y consulta de todas las tablas o vistas en las que está basada la nueva vista a crear. En el ejemplo anterior, deberíamos tener dichos privilegios sobre la tabla FILES. Para borrar una vista, hay que utilizar la siguiente sentencia SQL: DROP VIEW <VIEW NAME>; Por ejemplo: DROP VIEW luis.files_text;2.18 Sentencias de control de transacciones Al realizar ciertas sentencias sobre la base de datos, la sentencia ocurre localmente, es decir, para la sesión en curso. Por ejemplo, al insertar ciertos datos en una tabla mediante la sentencia INSERT, es posible consultar la tabla y ver que los datos existen, siempre que la consulta se realice desde la misma sesión que la que lanzó la sentencia INSERT. Sin embargo, tras ejecutar la inserción, los datos no existen si la consulta de esto se realiza desde otras sesiones. Para validar en la base de datos que una sentencia de este tipo tiene lugar de manera definitiva, para cualquier sesión actual o futura, es necesario utilizar la sentencia de control de transacciones COMMIT; Si al realizar una transacción quisiéramos volver al estado anterior, es decir, deshacer los cambios, sería necesario, en lugar de validar, volver a atrás mediante el comando ROLLBACK; El uso de los comandos COMMIT y ROLLBACK nos permite utilizar el verdadero concepto de transacción en las bases de datos, ya que una sesión puede realizar un conjunto de operaciones en serie, y al validarlas, el sistema gestor de base de datos tomará a dicho conjunto de operaciones como la transacción y garantizará su validación total y no por operaciones realizadas como parte de la transacción. Oracle nos proporciona un conjunto de primitivas especiales para el control de la integridad de datos, no sólo implementando el concepto de transacción mediante los comandos citados, sino que es capaz de romper automáticamente deadlocks y además nos permite el tratamiento de bloqueos. Un bloqueo de datos puede realizarse a nivel de tabla o de conjunto de registros. Para bloquear una tabla por un usuario hay que utilizar la siguiente sentencia SQL: LOCK TABLE <TABLE NAME> IN <MODETYPE> MODE [NOWAIT]; INNOVA Desarrollos Informáticos, SL Pág. 51
  52. 52. Introducción al lenguaje SQL El bloqueo de una tabla es causa directa de la posibilidad decompartición de datos. Puede ocurrir que en cierta ocasión sea necesarioque otras sesiones de la base de datos puedan realizar operaciones sobrecierta o ciertas tablas o vistas. En ciertos casos, será necesario utilizar lasentencia anterior (para mantener la integridad de datos), teniendo encuenta que <TABLE NAME> es el nombre de la tabla o vista abloquear, <MODETYPE> es el tipo de modo de bloqueo, que puedeser ROW SHARE, ROW EXCLUSIVE, SHARE UPDATE, SHARE,SHARE ROW EXCLUSIVE y EXCLUSIVE. Oracle garantiza que sólouna de las sesiones ejecutará antes una sentencia LOCK TABLE, demanera que sólo una será la primera en coger en el modo especificado elacceso a la tabla. En el caso en que el resto de sesiones no deseen esperara que la sesión que ha conseguido el poder del bloqueo, libere la tabla,hay que incluir la cláusula NOWAIT en la sentencia. La liberación deuna tabla se realiza mediante el comando COMMIT. Los tipos de modos se describen según la siguiente tabla:Tipo DescripciónROW SHARE Permite acceso concurrente a la tabla bloqueada, pero impide que otros usuarios bloqueen toda la tabla de manera exclusivaROW EXCLUSIVE Permite acceso concurrente a la tabla bloqueada, pero impide que otros usuarios bloqueen toda la tabla de manera exclusiva o también de manera compartida.SHARE UPDATE Es lo mismo que ROW SHARE.SHARE Permite el acceso concurrente a la tabla, pero impide que se actualicen datos en ésta.SHARE ROW EXCLUSIVE Permite el acceso concurrente a la tabla, pero impide que se actualicen datos en ésta y que ésta sea bloqueada en modo exclusivo o compartido.EXCLUSIVE Permite el acceso a la tabla mediante consulta, pero nada más. Veamos un ejemplo:INNOVA Desarrollos Informáticos, SL Pág. 52
  53. 53. Introducción al lenguaje SQL LOCK TABLE emp IN EXCLUSIVE MODE NOWAIT; Bloquea la tabla emp en modo exclusivo, pero no espera a que otrousuario la libere si la ha bloqueado antes, con el fin de tomar el controlde ésta. Para bloquear un conjunto de registros seleccionados de maneraexclusiva, hay que utilizar la sentencia SELECT, añadiendo al final deésta la cláusula FOR UPDATE OF. Por ejemplo: SELECT * FROM emp WHERE deptno=30 FOR UPDATE OF SAL,COMM; El ejemplo bloquea todas las filas de la tabla emp que cumplen que lacolumna deptno es igual a 30. Es obligatorio, tras ejecutar elSELECT...FOR UPDATE c1,c2,...cn; realizar una sentencia UPDATEque modifique los campos c1,c2,...,cn, esto es: UPDATE emp SET sal=1.1*sal,comm=NULL WHERE deptno=30; COMMIT; En el momento de realizar el UPDATE, se realiza un bloqueoexclusivo de toda la tabla.INNOVA Desarrollos Informáticos, SL Pág. 53
  54. 54. Introducción al lenguaje SQL 3 UNIDAD 4: EJERCICIOSObjetivo general de la unidad Tener ejemplos resueltos de ejercicios sobre el cursoObjetivos específicos Conseguir que el alumno asimile la filosofía SQL y su sintaxis.Contenidos Enunciados de ejercicios a resolver en clase y de apoyo al resto deunidades.INNOVA Desarrollos Informáticos, SL Pág. 54
  55. 55. Cuaderno de notasINNOVA Desarrollos Informáticos, SL Pág. 55
  56. 56. Introducción al lenguaje SQL Unidad 4: EjerciciosINNOVA Desarrollos Informáticos, SL Pág. 56
  57. 57. Actividades Realizar los ejercicios en función de la teoría dada y corregirlos enclase.INNOVA Desarrollos Informáticos, SL Pág. 57
  58. 58. 3.1 Ejercicios sobre DDL 1.- Supongamos que tenemos una tabla con la siguiente estructura: Nombre: proj Columnas: projno (numérico y no nulo), pname (carácter de, obligatoriamente, 10 dígitos), budget (numérico con, como máximo 8 dígitos enteros y dos decimales). No hay clave primaria ni extrangeras. Se pide: Implementar mediante SQL la tabla en una base de datos Oracle. 2.- Tras una serie de revisiones del análisis, se toma la decisión de que la columna budget puede llegar hasta nueve dígitos en su parte entera, pero la tabla ya ha sido creada en la base de datos. Se pide: Modificar la tabla para que cumpla estas nuevas características, sin borrarla, por supuesto y razonar lo que pasaría si ésta ya contuviera datos. 3.- Tras otra serie de revisiones, se decide tomar a la columna projno como un numérico de nueve dígitos enteros y dos decimales, pero como NO obligatoria. Se pide: Modificar la tabla para que dicha columna NO sea obligatoria con los cambios asociados al tipo de datos de dicha columna. Razonar la respuesta sobre las consecuencias de la modificación. 4.- Supongamos que tenemos una tabla (de nombre emp) a la que queremos añadir una columna (llamada projno1) de tipo numérico. Se pide: Implementar en SQL la sentencia necesaria para realizar dicha modificación en la tabala emp (que ya existe). ¿Qué pasaría si quisiéramos que dicha columna tuviera la restricción de no vacía?. Razonar la respuesta. INNOVA Desarrollos Informáticos, SL Pág. 59
  59. 59. Introducción al lenguaje SQL Unidad 4: Ejercicios 5.- Veamos el siguiente esquema relacional: EMP SALGRADE DUMMY DEPT DEPT (depaartamentos) es una tabla con las columnas: deptno que esun entero de, como máximo dos dígitos, dname que contendrá unacadena de, como máximo 14 caracteres, loc que contendrá una cadenade, como máximo 13 caracteres. La columna depto es la clave primariade la tabla. EMP (empleados) es una tabla que contiene las siguientes columnas:empno que es un número de, como máximo cuatro dígitos, y que es laclave primaria de la tabla, ename (nombre del empleado) que contendráuna cadena de cómo máximo 10 caracteres, job que será similar, perocomo máxnimo contendrá 9 caracteres, mgr (jefe) que será un númerode empleado (clave foránea de emp), hiredate que será de tipo fecha, sal(salario) que será un numérico de siete dígitos enteros y dos decimales,comm (comisión), similar a sal, y deptno que será la clave extranjera de latabla DEPT. SALGRADE contendrá tres columnas (grade, losal, hisal) quecontendrán valores numéricos. DUMMY que contendrá una columna (dummy) de tipo numérica. Se pide: Utilizando únicamente sentencias CREATE TABLE,implementar la base de datos definida en Oracle. 6.- Conceder al esquema ADAMS de la instancia DESA el privilegiode consulta sobre la tabla DEPT. 7.- Conceder (usando una única sentencia SQL) los privilegios deconsulta e inserción sobre la tabla EMP a los usuarios ADAMS (de lainstancia DESA) y ANDREW de la instancia FILIAL.INNOVA Desarrollos Informáticos, SL Pág. 60
  60. 60. Introducción al lenguaje SQL Unidad 4: Ejercicios 8.- Conceder todos los privilegios de la tabla DEPT al usuario ADAMS de nuestra misma instancia. 9.- Conceder el privilegio de consulta sobre la tabla DEPT a todos los usuarios de la base de datos. 10.- Quitarle todos los privilegios de la tabla DEPT al usuario ADAMS de nuestra base de datos. 11.- Crear un índice para columna ENAME de la tabla EMP.3.2 Ejercicios sobre DML 12.- Supongamos que tenemos las tablas EMP y DEPT. Se pide: Generar un fichero, al que hay que llamar “emp_dept.txt”, que contenga todas las filas de la tabla EMP y todas las filas de la tabla DEPT. 13.- Consultar los posibles trabajos de un empleado. 14.- Consultar el nombre, salario y número de departamento de los empleados cuyo trabajo sea SALESMAN, el departamento sea el número 30 y el salario sea mayor que 1300. 15.- Consultar todos los datos de un empleado que no trabaje ni como MANAGER ni como CLERK y que sean del departamento 10. 16.- Consultar el nombre, trabajo y salario de los empleados cuyo salario no esté entre 1200 y 1300. 17.- Consultar el nombre, trabajo y departamento de los empleados que no trabaje ni como MANAGER ni como CLERK, ni como SALESMAN (sin utilizar los operadores lógicos AND y OR). INNOVA Desarrollos Informáticos, SL Pág. 61
  61. 61. Introducción al lenguaje SQL Unidad 4: Ejercicios 18.- Consultar el nombre del empleado, el trabajo y el departamentocuyo nombre empiece por ‘M’. 19.- Consultar el nombre, trabajo y salario de la base de datos deempleados, teniendo en cuenta que el resultado debe estar ordenado enorden descendente por trabajo y salario. 20.- Consultar el nombre y localidad del departamento de losempleados cuyo nombre sea ALLEN. 21.- Consultar todos los campos del departamento y el nombre delempleado y trabajo, ordenado por el número de departamento y cuyonúmero de departamento sea 20 o 30. 22.- Consultar el grado, trabajo, nombre y salario de un empleado,ordenado por grado y trabajo, cuyo salario esté entre el salario más alto yel más bajo definido en el sistema. 23.- Consultar el código y nombre de departamento, el trabajo y elnombre del empleado, ordenados por código de departamento, y queaparezcan deparamentos que no tengan empleados, pero en caso detener empleados listar sólo los del departamento 30 o 40. 24.- Lista de los departamentos que no tienen empleados asociados. 25.- Listar los nombres y salarios de todos los empleados junto con losde sus jefes, siempre y cuando el salario del empleado sea mayor que eldel jefe. 26.- En una única sentencia consultar el nombre, salario, comisión ytotal a cobrar por todos los empleados cuyo trabajo sea SALESMAN. 27.- Consultar, mediante una única sentencia, el nombre, salario ycomisión de los empleados, cuya comisión sea mayor que el 25% delsalario.INNOVA Desarrollos Informáticos, SL Pág. 62
  62. 62. Introducción al lenguaje SQL Unidad 4: Ejercicios 28.- Empleando una sola sentencia de consulta, listar el nombre delempleado, el coeficiente de comisión(=comisión/salario), la comisión yel salario en donde el trabajo sea SALESMAN y esté ordenado por elcoeficiente de comisión (de mayor a menor). 29.- Consultar el nombre del empleado, salario, el salario divididoentre 22, el salario dividido entre 22 (redondeado con cero dígitosdecimales), el salario dividido entre 22 (redondeado con 2 dígitosdecimales) dónde el departamento del empleado es 30. 30.- Consultar el promedio del salario de los empleados cuyo trabajoes CLERK. 31.- Consultar el total a pagar en salarios y comisiones a todos losempleados que trabajan como SALESMAN. 32.- Sacar la media anual de salarios(con comisiones incluidas) de losempleados que trabajen como SALESMAN. 33.- Consultar el salario máximo, el mínimo y la diferencia entreambos de los empleados. 34.- Consultar el número de empleados que tienen comisión. 35.- Consultar el número de tipos de trabajo que existen en eldepartamento 30. 36.- Consultar el número de empleados que hay en el departamento30. 37.- Retornar el nombre, el trabajo y el salario del empleado que tengael salario más alto. 38.- Calcular el salario medio de cada departamento (con una únicaconsulta).INNOVA Desarrollos Informáticos, SL Pág. 63
  63. 63. Introducción al lenguaje SQL Unidad 4: Ejercicios 39.- Calcular el salario promedio anual de cada departamento,excluyendo a los directivos (MANAGER y PRESIDENT). 40.- Calcular la media anual del salario y el número de empleados portipo de trabajo dentro de cada departamento. 41.- Listar el salario promedio anual para todos los tipos de trabajo demás de dos empleados. 42.- Listar todos los departamentos con, por lo menos dos empleadoscuyo tipo de trabajo sea CLERK. 43.- Listar los tipos de trabajo cuyo salario promedio mensual seamayor que el de los del tipo MANAGER. 44.- Listar el nombre, tipo de trabajo, salario, comisión y total a cobrarde los empleados del departamento 30. 45.- Consultar todos los nombres y tipos de trabajo de los empleadoscon el mismo tipo de trabajo que JONES. 46.- Consultar el salario, trabajo, nombre y departamento de losempleados cuyo salario es mayor que cualquiera de los salarios deldepartamento 30. 47.- Consultar el salario, trabajo, nombre y departamento de losempleados cuyo salario es mayor que todos los salarios del departamento30. 48.- Consultar el nombre y trabajo de los empleados del departamento10 que tengan el mismo trabajo que algún empleado del departamento30. 49.- Listar los nombres y trabajos de los empleados del departamento10 que tienen un trabajo que no existe en el departamento 30.INNOVA Desarrollos Informáticos, SL Pág. 64

×