Introduccion a sql

67
Introducción al lenguaje SQL Manual del Alumno

description

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

Transcript of Introduccion a sql

Page 1: Introduccion a sql

Introducción al lenguaje SQL

Manual del Alumno

Page 2: Introduccion a sql

INNOVA Desarrollos Informáticos, SL

Paseo Mallorca, 34 Entlo. C 07012 Palma de Mallorca Tel. 971 721404 http://www.balearsinnovacio.com

Título: Introducción al lenguaje SQL Fecha Edición: 22 de Junio de 2004 Autores: Javier Jofre González-Granda

Page 3: Introduccion a sql

INNOVA Desarrollos Informáticos, SL Pág. 3

INTRODUCCIÓN

Prólogo El lenguaje SQL (Structured Query Language) permite a los

desarrolladores la generación de las estructuras de información y el acceso 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, y manipularlos. La descripción de la estructura de datos es la propia definición de la base de datos, mientras que la manipulación de estos incluye la inserción, borrado, actualización y, por supuesto, consulta.

A grandes rasgos, podríamos decir que SQL posee dos sublenguajes: el sublenguaje de SQL que permite la creación de bases de datos es lo que se 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 de las bases de datos (DDL), y nos centraremos más profundamente en el sublenguaje 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 se

basa en:

• Ejercicios prácticos de seguimiento del módulo.

Evaluación del módulo Un examen final con varios ejercicios y apartados a corregir.

Page 4: Introduccion a sql

INNOVA Desarrollos Informáticos, SL Pág. 4

ÍNDICE

INTRODUCCIÓN................................................................. 3 Prólogo............................................................................................................... 3 Metodología del módulo.................................................................................. 3 Evaluación del módulo .................................................................................... 3

ÍNDICE .............................................................................. 4

FICHA INFORMATIVA DEL MÓDULO. .................................. 6 Nombre .............................................................................................................. 6 Meta .................................................................................................................... 6 Responsable del diseño del módulo y de la elaboración del Manual ........ 6 Bibliografía......................................................................................................... 6

1 UNIDAD 2: DDL LENGUAJE DE DEFINICIÓN DE DATOS .. 7 Objetivo general de la unidad ......................................................................... 7 Objetivos específicos........................................................................................ 7 Contenidos......................................................................................................... 7 Cuaderno de notas............................................................................................ 8 Actividades....................................................................................................... 10 1.1 Creación de tablas...................................................................................... 11 1.2 Cambios en la estructura de una tabla .................................................... 15 1.3 Borrado de tablas ....................................................................................... 15 1.4 Creación de índices.................................................................................... 16 1.5 Borrado de índices..................................................................................... 17 1.6 Creación de secuencias.............................................................................. 17 1.7 Borrado de secuencias............................................................................... 18 1.8 Dando privilegios de acceso..................................................................... 18 1.9 Quitando privilegios de acceso ................................................................ 19 1.10 Creación de sinónimos ............................................................................ 19 1.11 Borrado de sinónimos ............................................................................. 20 1.12 Vaciar una tabla ........................................................................................ 20

2 UNIDAD 3: DML LENGUAJE DE MANIPULACIÓN DE

DATOS ............................................................................. 21 Objetivo general de la unidad ....................................................................... 21

Page 5: Introduccion a sql

Introducción al lenguaje SQL Índice

INNOVA Desarrollos Informáticos, SL Pág. 5

Objetivos específicos...................................................................................... 21 Contenidos....................................................................................................... 21 Cuaderno de notas.......................................................................................... 22 Actividades....................................................................................................... 24 2.1 Introducción............................................................................................... 25 2.2 Inserción de datos...................................................................................... 25 2.3 Borrar datos ................................................................................................ 25 2.4 Actualización de datos .............................................................................. 26 2.5 Consultas..................................................................................................... 27 2.6 Enlaces ........................................................................................................ 32 2.7 Subconsultas ............................................................................................... 36 2.8 Fuciones de agrupación ............................................................................ 38 2.9 Las Cáusulas GROUP BY y HAVING ................................................. 39 2.10 Combinación con Subconsultas............................................................. 39 2.11 Las Cláusulas EXISTS, ALL y ANY..................................................... 40 2.12 Unión, intersección y resta entre consultas .......................................... 41 2.13 Outer Joins................................................................................................ 42 2.14 Funciones de SQL ................................................................................... 44 2.15 Acceso a secuencias ................................................................................. 50 2.16 Optimización en las consultas................................................................ 50 2.17 Vistas.......................................................................................................... 50 2.18 Sentencias de control de transacciones................................................. 51

3 UNIDAD 4: EJERCICIOS .................................................. 54 Objetivo general de la unidad ....................................................................... 54 Objetivos específicos...................................................................................... 54 Contenidos....................................................................................................... 54 Cuaderno de notas.......................................................................................... 55 Actividades....................................................................................................... 57 3.1 Ejercicios sobre DDL ............................................................................... 59 3.2 Ejercicios sobre DML............................................................................... 61

Page 6: Introduccion a sql

INNOVA Desarrollos Informáticos, SL Pág. 6

FICHA INFORMATIVA DEL

MÓDULO.

Nombre Introducción al lenguaje SQL

Meta Que el alumno adquiera los conocimientos básicos del lenguaje SQL

de Oracle para formar parte de cualquier grupo de desarrollo como desarrollador junior.

Responsable del diseño del módulo y de la elaboración del Manual

Javier Jofre González-Granda

Bibliografía Manual de referencia de SQL de Oracle y varios cursos de

introducción a SQL de internet.

Page 7: Introduccion a sql

INNOVA Desarrollos Informáticos, SL Pág. 7

1 UNIDAD 2: DDL LENGUAJE

DE DEFINICIÓN DE DATOS

Objetivo general de la unidad Aprender a crear bases de datos entendiendo los conceptos de

implantación y relacionándolos con el modelo relacional de bases de datos.

Objetivos específicos Crear tablas, restricciones, índices, secuencias, sinónimos, aprender a

otorgar privilegios y demás funciones básicas del DDL.

Contenidos Creación de tablas, cambio en la estructura de las tablas, borrado de

tablas, índices (creación y borrado), secuencias (creación y borrado), otorgar y quitar privilegios sobre objetos, creación y borrado de sinónimos.

Page 8: Introduccion a sql

INNOVA Desarrollos Informáticos, SL Pág. 8

Cuaderno de notas

Page 9: Introduccion a sql

Introducción al lenguaje SQL Unidad 2: DDL Lenguaje de definición de datos

INNOVA Desarrollos Informáticos, SL Pág. 9

Page 10: Introduccion a sql

INNOVA Desarrollos Informáticos, SL Pág. 10

Actividades Seguir las sesiones teóricas y realizar los ejercicios de la Unidad

correspondientes a la teoría dada.

Page 11: Introduccion a sql

INNOVA Desarrollos Informáticos, SL Pág. 11

1.1 Creación de tablas

1.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.

Page 12: Introduccion a sql

Introducción al lenguaje SQL Unidad 3: DML Lenguaje de manipulación de datos

INNOVA Desarrollos Informáticos, SL Pág. 12

1.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.

Page 13: Introduccion a sql

Introducción al lenguaje SQL Unidad 3: DML Lenguaje de manipulación de datos

INNOVA Desarrollos Informáticos, SL Pág. 13

1.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

Page 14: Introduccion a sql

Introducción al lenguaje SQL Unidad 3: DML Lenguaje de manipulación de datos

INNOVA Desarrollos Informáticos, SL Pág. 14

ITEMDESIRED que contendrá una cadena de caracteres de cómo má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 que contendrá una clave primaria asociada al campo PID, una columna llamada NAME que contendrá una cadena de caractéres (como máximo 30) 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 clave primaria. Si no se especifica nombre, como en el caso de la constraint de tipo NOT NULL, en la columna NAME, su nombre es definido por defecto 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 a especificar el conjunto de columnas al final de la sentencia. Veamos un par 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));

Page 15: Introduccion a sql

Introducción al lenguaje SQL Unidad 3: DML Lenguaje de manipulación de datos

INNOVA Desarrollos Informáticos, SL Pág. 15

1.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;

Page 16: Introduccion a sql

Introducción al lenguaje SQL Unidad 3: DML Lenguaje de manipulación de datos

INNOVA Desarrollos Informáticos, SL Pág. 16

1.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.

Page 17: Introduccion a sql

Introducción al lenguaje SQL Unidad 3: DML Lenguaje de manipulación de datos

INNOVA Desarrollos Informáticos, SL Pág. 17

1.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_IDX

1.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:

Page 18: Introduccion a sql

Introducción al lenguaje SQL Unidad 3: DML Lenguaje de manipulación de datos

INNOVA Desarrollos Informáticos, SL Pág. 18

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.

Page 19: Introduccion a sql

Introducción al lenguaje SQL Unidad 3: DML Lenguaje de manipulación de datos

INNOVA Desarrollos Informáticos, SL Pág. 19

<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;

Page 20: Introduccion a sql

Introducción al lenguaje SQL Unidad 3: DML Lenguaje de manipulación de datos

INNOVA Desarrollos Informáticos, SL Pág. 20

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;

Page 21: Introduccion a sql

Introducción al lenguaje SQL Unidad 3: DML Lenguaje de manipulación de datos

INNOVA Desarrollos Informáticos, SL Pág. 21

2 UNIDAD 3: DML LENGUAJE

DE MANIPULACIÓN DE

DATOS

Objetivo 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 de

consultas.

Contenidos Inserción, actualización, borrado y consulta (con todas sus

posibilidades) de datos en las tablas.

Page 22: Introduccion a sql

INNOVA Desarrollos Informáticos, SL Pág. 22

Cuaderno de notas

Page 23: Introduccion a sql

Introducción al lenguaje SQL Unidad 3: DML Lenguaje de manipulación de datos

INNOVA Desarrollos Informáticos, SL Pág. 23

Page 24: Introduccion a sql

INNOVA Desarrollos Informáticos, SL Pág. 24

Actividades Seguir las sesiones prácticas y realizar los ejercicios correspondientes a

los conceptos de la unidad.

Page 25: Introduccion a sql

INNOVA Desarrollos Informáticos, SL Pág. 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';

Page 26: Introduccion a sql

Introducción al lenguaje SQL

INNOVA Desarrollos Informáticos, SL Pág. 26

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’.

Page 27: Introduccion a sql

Introducción al lenguaje SQL

INNOVA Desarrollos Informáticos, SL Pág. 27

2.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.

Page 28: Introduccion a sql

Introducción al lenguaje SQL

INNOVA Desarrollos Informáticos, SL Pág. 28

Si quisiéramos consultar todas las columnas de una tabla, bastaría con utilizar la siguiente sintaxis:

SELECT * FROM <TABLE NAME>;

Supongamos ahora que tenemos la siguiente tabla:

EmployeeStatisticsTable

EmployeeIDNo Salary Benefits Position

010 75000 15000 Manager

105 65000 15000 Manager

152 60000 15000 Manager

215 60000 12500 Manager

244 50000 12000 Staff

300 45000 10000 Staff

335 40000 10000 Staff

400 32000 7500 Entry-Level

441 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 columna EMPLOYEEIDNO de todas las filas que cumplan la condición siguiente: que el contenido de la columna SALARY sea mayor o igual a 50000.

El resultado de la consulta será el siguiente:

EMPLOYEEIDNO

010

105

152

215

244

Page 29: Introduccion a sql

Introducción al lenguaje SQL

INNOVA Desarrollos Informáticos, SL Pág. 29

Una condición o filtro de una consulta es un conjunto de sentencias lógicas unidas mediante operadores lógicos y/o relacionales. Los operadores relacionales que permite SQL en su sintaxis son:

= Igual

¡= ó <> Diferente

< Menor que

> Mayor que

<= Menor o igual que

>= Mayor o igual que

BETWEEN ... AND ... Entre ... y ...

IS NULL Es nulo

IN(lista) EN (lista)

LIKE Como

Veamos el siguiente ejemplo:

SELECT EMPLOYEEIDNO

FROM EMPLOYEESTATISTICSTABLE

WHERE POSITION = 'Manager';

Este ejemplo retorna el contenido de la columna EMPLOYEEIDNO de todas aquellas filas de la tabla del ejemplo que contengan en la columna POSITION el valor ‘Manager’.

Veamos otro ejemplo:

SELECT EMPLOYEEIDNO

FROM EMPLOYEESTATISTICSTABLE

WHERE POSITION IS NULL;

La consulta retornará aquellas filas que contengan la columna POSITION de la tabla EMPLOYEESTATISTICSTABLE vacía.

Page 30: Introduccion a sql

Introducción al lenguaje SQL

INNOVA Desarrollos Informáticos, SL Pág. 30

A continuación veremos una tabla de evaluación en dónde están involucrados valores a NULL:

Si A es: Condición: Resultado:

10 A IS NULL FALSE

10 A IS NOT NULL TRUE

NULL A IS NULL TRUE

NULL A IS NOT NULL FALSE

10 A = NULL UNKNOWN

10 A ¡= NULL UNKNOWN

NULL A = NULL UNKNOWN

NULL A ¡= NULL UNKNOWN

NULL A = 10 UNKNOWN

NULL A ¡= 10 UNKNOWN

Por otra parte, existen tres operadores lógicos que unen las condiciones, que son AND (y), OR (o) y NOT (negación). El operador AND une varias condiciones y en una consulta retorna el número de filas 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 filas cuya columna SALARY es mayor de 40000 y además cuya columna POSITION es igual a ‘Staff’.

El operador lógico OR une varias condiciones, pero en una consulta retorna 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 columna EMPLOYEEIDNO de las filas que, o bien la columna SALARY sea menor que 40000, o bien la columna BENEFITS sea menor que 10000.

Page 31: Introduccion a sql

Introducción al lenguaje SQL

INNOVA Desarrollos Informáticos, SL Pág. 31

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 las filas que cumplan, o bien que la columna POSITION es ‘Manager’ y que SALARY es mayor que 60000, o bien que la columna BENEFITS es mayor 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 las filas que cumplan que la columna POSITION es ‘Manager’ y que, o bien SALARY es mayor que 60000, o bien que la columna BENEFITS es mayor que 12000. Fijémonos en que ambas consultas podrían devolvernos diferentes resultados, ya que el orden de ejecución (que depende de los paréntesis) condiciona totalmente los resultados.

Un ejemplo de consulta utilizando el operador IN podría ser el siguiente:

SELECT EMPLOYEEIDNO

FROM EMPLOYEESTATISTICSTABLE

WHERE POSITION IN ('Manager', 'Staff');

La consulta retornará los valores de las filas que cumplan que la columna POSITION sea o bien ‘Manager’, o bien ‘Staff’. Este operador se comporta más como lógico que como relacional. Sin embargo, el operador BETWEEN aplica una mezcla entre ambos tipos de operadores:

SELECT EMPLOYEEIDNO

FROM EMPLOYEESTATISTICSTABLE

WHERE SALARY BETWEEN 30000 AND 50000;

Retorna los valores de las filas que cumplen que la columna SALARY está entre 30000 y 50000.

Page 32: Introduccion a sql

Introducción al lenguaje SQL

INNOVA Desarrollos Informáticos, SL Pág. 32

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

Page 33: Introduccion a sql

Introducción al lenguaje SQL

INNOVA Desarrollos Informáticos, SL Pág. 33

Orders

OwnerID ItemDesired

02 Table

02 Desk

21 Chair

15 Mirror

Antiques

SellerID BuyerID Item

01 50 Bed

02 15 Table

15 02 Chair

21 50 Mirror

50 01 Desk

01 21 Cabinet

02 21 Coffee Table

15 50 Chair

01 15 Jewelry Box

02 21 Pottery

21 02 Bookcase

50 01 Plant Stand

En las tablas anteriores podemos ver como OwnerID es clave foránea de la tabla ORDERS (un propietario puede tener varios pedidos). Además, en la tabla ANTIQUES, SellerID y BuyerID son claves foráneas referenciadas desde la columna OwnerID de la tabla ANTIQUEOWNERS.

A continuación veremos ejemplos de cómo crear enlaces entre valores de columnas de diferentes tablas (enlaces de claves foráneas o integridad referencial).

Page 34: Introduccion a sql

Introducción al lenguaje SQL

INNOVA Desarrollos Informáticos, SL Pág. 34

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 la que se igualan las dos claves de las tablas que están unidas por una relación. Por otra parte, al estar utilizando dos columnas de diferentes tablas, 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?. Por ejemplo, supongamos el caso en que quisiéramos consultar los nombres y 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 las columnas y no se garantiza que devuelva lo que queremos. Así, podemos referenciar 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;

Page 35: Introduccion a sql

Introducción al lenguaje SQL

INNOVA Desarrollos Informáticos, SL Pág. 35

Además, podemos definir alias tanto para las columnas como para las tablas. 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 y podremos referenciar cada columna mediante el alias (apellido y nombre, respectivamente). El resultado de la anterior consulta nos queda, por tanto:

apellido nombre

Smith Bob

Smith Bob

Akins Jane

Lawson Patricia

Como se puede apreciar en el ejemplo, al hacer ciertas consultas con enlaces derivados de relaciones, es posible que se retornen filas duplicadas. Para evitarlo, podemos utilizar la clausula DISTINCT, como en 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 nos sean retornadas de la base de datos ordenadas según cierto criterio. Un buen ejemplo sería la consulta de identificador, nombre y apellidos de los vendedores de anticüedades, que no sólo se repiten y lo que queremos es que no se repitan, sino que además, queremos que las filas de la consulta estén ordenadas por apellido y nombre. Para ello, hay que utilizar la cláusula ORDER BY <LISTA_COLUMNAS> DESC|ASC al final de la sentencia SELECT. <LISTA_COLUMNAS> es el nombre de las columnas (o aliases de columnas) separadas por comas, por los que queremos que ordene las filas. Esta clausula admite que el orden sea descendente (DESC) o ascendente ASC. Si no especificamos el tipo de orden, se presupone ascendente:

Page 36: Introduccion a sql

Introducción al lenguaje SQL

INNOVA Desarrollos Informáticos, SL Pág. 36

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);

Page 37: Introduccion a sql

Introducción al lenguaje SQL

INNOVA Desarrollos Informáticos, SL Pág. 37

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 resultado de las columnas en cada fila.

2.- Hemos creado también aliases para los nombres de las tablas, con el fin de eliminar la ambigüedad.

3.- Al ejecutarse la subconsulta, el operador IN (equivalente a un montón de condiciones OR) permite que la consulta geeral retorne todos los items deseeados por los propietarios, sea el que sea, ya que la subconsulta nos asegura que el item pertenecerá a la tabla de antigüedades.

4.- No es posible crear una subconsulta que retorne más de una columna, o una columna que no sea del mismo tipo de la que precede al operador IN.

Ya que acabamos de ver las subconsultas, saber que:

a) Podemos utilizar una subconsulta dentro de una consulta, no sólo a través del operador IN, también es posible hacerlo a través de otros operadores (incluso algunos los veremos más adelante), como =, aunque en 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 la subconsulta determinará tanto las columnas de la nueva tabla como las filas que contendrá ésta. Fijémonos que una consulta puede implicar a varias tablas, por lo que podemos crear tablas especiales mezclando columnas de varias tablas.

c) Es posible insertar masivamente filas de una tabla a través del comando INSERT INTO tabla(col1,col2,...) SELECT ...; donde las columnas de la subconsulta deben coincidir en número, orden y tipo con col1,col2,... del comando INSERT.

d) Es posible realizar una actualización de una o varias columnas de una 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

Page 38: Introduccion a sql

Introducción al lenguaje SQL

INNOVA Desarrollos Informáticos, SL Pág. 38

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’.

Page 39: Introduccion a sql

Introducción al lenguaje SQL

INNOVA Desarrollos Informáticos, SL Pág. 39

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:

Page 40: Introduccion a sql

Introducción al lenguaje SQL

INNOVA Desarrollos Informáticos, SL Pág. 40

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’:

Page 41: Introduccion a sql

Introducción al lenguaje SQL

INNOVA Desarrollos Informáticos, SL Pág. 41

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:

Page 42: Introduccion a sql

Introducción al lenguaje SQL

INNOVA Desarrollos Informáticos, SL Pág. 42

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

Page 43: Introduccion a sql

Introducción al lenguaje SQL

INNOVA Desarrollos Informáticos, SL Pág. 43

conseguir los identificadores de los propietarios que están en ORDERS y que cuya clave foránea puede ser nula en la tabla ANTIQUES.

Supongamos ahora el caso de la típica relación maestro-detalle, en donde un vendedor puede tener cero o varios clientes. Si listamos la lista de vendedores partiendo de la lista de clientes, habrá vendedores que no aparecerá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ían listados.

Una “outer join” se utiliza para que la consulta retorne toda la lista de vendedores, incluso los que no tienen clientes, poniendo un nulo en el lugar de su nombre y apellido. La sintaxis de Oracle se ve en el anterior ejemplo resuelto:

SELECT NOMCLI,APECLI,NOMVEN,APEVEN

FROM VENDEDORES,CLIENTES

WHERE CLIENTES.IDVEN(+)=VENDEDORES.IDVEN;

Veamos un ejemplo más. Supongamos la siguiente tabla de empleados EMPLOYEE:

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 una consulta de todos los empleados y todos los departamentos. Si nos

Page 44: Introduccion a sql

Introducción al lenguaje SQL

INNOVA Desarrollos Informáticos, SL Pág. 44

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.

Page 45: Introduccion a sql

Introducción al lenguaje SQL

INNOVA Desarrollos Informáticos, SL Pág. 45

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: 10

2.14.2 Funciones de caracteres que retornan caracteres

- UPPER(<string>): Convierte la cadena a mayúsculas.

Ejemplo: SELECT UPPER(‘Large’) FROM DUAL;

Resultado: LARGE

Page 46: Introduccion a sql

Introducción al lenguaje SQL

INNOVA Desarrollos Informáticos, SL Pág. 46

- 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

Page 47: Introduccion a sql

Introducción al lenguaje SQL

INNOVA Desarrollos Informáticos, SL Pág. 47

2.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: 14

2.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-2000

2.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:

Page 48: Introduccion a sql

Introducción al lenguaje SQL

INNOVA Desarrollos Informáticos, SL Pág. 48

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.

Page 49: Introduccion a sql

Introducción al lenguaje SQL

INNOVA Desarrollos Informáticos, SL Pág. 49

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: 123

2.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

Page 50: Introduccion a sql

Introducción al lenguaje SQL

INNOVA Desarrollos Informáticos, SL Pág. 50

2.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’;

Page 51: Introduccion a sql

Introducción al lenguaje SQL

INNOVA Desarrollos Informáticos, SL Pág. 51

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];

Page 52: Introduccion a sql

Introducción al lenguaje SQL

INNOVA Desarrollos Informáticos, SL Pág. 52

El bloqueo de una tabla es causa directa de la posibilidad de compartición de datos. Puede ocurrir que en cierta ocasión sea necesario que otras sesiones de la base de datos puedan realizar operaciones sobre cierta o ciertas tablas o vistas. En ciertos casos, será necesario utilizar la sentencia anterior (para mantener la integridad de datos), teniendo en cuenta que <TABLE NAME> es el nombre de la tabla o vista a bloquear, <MODETYPE> es el tipo de modo de bloqueo, que puede ser ROW SHARE, ROW EXCLUSIVE, SHARE UPDATE, SHARE, SHARE ROW EXCLUSIVE y EXCLUSIVE. Oracle garantiza que sólo una de las sesiones ejecutará antes una sentencia LOCK TABLE, de manera que sólo una será la primera en coger en el modo especificado el acceso a la tabla. En el caso en que el resto de sesiones no deseen esperar a 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 de una tabla se realiza mediante el comando COMMIT.

Los tipos de modos se describen según la siguiente tabla:

Tipo Descripción

ROW SHARE Permite acceso concurrente a la tabla bloqueada, pero impide que otros usuarios bloqueen toda la tabla de manera exclusiva

ROW 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:

Page 53: Introduccion a sql

Introducción al lenguaje SQL

INNOVA Desarrollos Informáticos, SL Pág. 53

LOCK TABLE emp IN EXCLUSIVE MODE NOWAIT;

Bloquea la tabla emp en modo exclusivo, pero no espera a que otro usuario la libere si la ha bloqueado antes, con el fin de tomar el control de ésta.

Para bloquear un conjunto de registros seleccionados de manera exclusiva, 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 la columna deptno es igual a 30. Es obligatorio, tras ejecutar el SELECT...FOR UPDATE c1,c2,...cn; realizar una sentencia UPDATE que 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 bloqueo exclusivo de toda la tabla.

Page 54: Introduccion a sql

Introducción al lenguaje SQL

INNOVA Desarrollos Informáticos, SL Pág. 54

3 UNIDAD 4: EJERCICIOS

Objetivo general de la unidad Tener ejemplos resueltos de ejercicios sobre el curso

Objetivos 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 de

unidades.

Page 55: Introduccion a sql

INNOVA Desarrollos Informáticos, SL Pág. 55

Cuaderno de notas

Page 56: Introduccion a sql

Introducción al lenguaje SQL Unidad 4: Ejercicios

INNOVA Desarrollos Informáticos, SL Pág. 56

Page 57: Introduccion a sql

INNOVA Desarrollos Informáticos, SL Pág. 57

Actividades Realizar los ejercicios en función de la teoría dada y corregirlos en

clase.

Page 58: Introduccion a sql
Page 59: Introduccion a sql

INNOVA Desarrollos Informáticos, SL Pág. 59

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.

Page 60: Introduccion a sql

Introducción al lenguaje SQL Unidad 4: Ejercicios

INNOVA Desarrollos Informáticos, SL Pág. 60

5.- Veamos el siguiente esquema relacional:

DEPT (depaartamentos) es una tabla con las columnas: deptno que es un entero de, como máximo dos dígitos, dname que contendrá una cadena de, como máximo 14 caracteres, loc que contendrá una cadena de, como máximo 13 caracteres. La columna depto es la clave primaria de 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 la clave primaria de la tabla, ename (nombre del empleado) que contendrá una cadena de cómo máximo 10 caracteres, job que será similar, pero como máxnimo contendrá 9 caracteres, mgr (jefe) que será un número de 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 la tabla DEPT.

SALGRADE contendrá tres columnas (grade, losal, hisal) que contendrá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 privilegio de consulta sobre la tabla DEPT.

7.- Conceder (usando una única sentencia SQL) los privilegios de consulta e inserción sobre la tabla EMP a los usuarios ADAMS (de la instancia DESA) y ANDREW de la instancia FILIAL.

EMP

DEPT

SALGRADE

DUMMY

Page 61: Introduccion a sql

Introducción al lenguaje SQL Unidad 4: Ejercicios

INNOVA Desarrollos Informáticos, SL Pág. 61

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).

Page 62: Introduccion a sql

Introducción al lenguaje SQL Unidad 4: Ejercicios

INNOVA Desarrollos Informáticos, SL Pág. 62

18.- Consultar el nombre del empleado, el trabajo y el departamento cuyo nombre empiece por ‘M’.

19.- Consultar el nombre, trabajo y salario de la base de datos de empleados, teniendo en cuenta que el resultado debe estar ordenado en orden descendente por trabajo y salario.

20.- Consultar el nombre y localidad del departamento de los empleados cuyo nombre sea ALLEN.

21.- Consultar todos los campos del departamento y el nombre del empleado y trabajo, ordenado por el número de departamento y cuyo nú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 y el más bajo definido en el sistema.

23.- Consultar el código y nombre de departamento, el trabajo y el nombre del empleado, ordenados por código de departamento, y que aparezcan deparamentos que no tengan empleados, pero en caso de tener 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 los de sus jefes, siempre y cuando el salario del empleado sea mayor que el del jefe.

26.- En una única sentencia consultar el nombre, salario, comisión y total a cobrar por todos los empleados cuyo trabajo sea SALESMAN.

27.- Consultar, mediante una única sentencia, el nombre, salario y comisión de los empleados, cuya comisión sea mayor que el 25% del salario.

Page 63: Introduccion a sql

Introducción al lenguaje SQL Unidad 4: Ejercicios

INNOVA Desarrollos Informáticos, SL Pág. 63

28.- Empleando una sola sentencia de consulta, listar el nombre del empleado, el coeficiente de comisión(=comisión/salario), la comisión y el salario en donde el trabajo sea SALESMAN y esté ordenado por el coeficiente de comisión (de mayor a menor).

29.- Consultar el nombre del empleado, salario, el salario dividido entre 22, el salario dividido entre 22 (redondeado con cero dígitos decimales), el salario dividido entre 22 (redondeado con 2 dígitos decimales) dónde el departamento del empleado es 30.

30.- Consultar el promedio del salario de los empleados cuyo trabajo es CLERK.

31.- Consultar el total a pagar en salarios y comisiones a todos los empleados que trabajan como SALESMAN.

32.- Sacar la media anual de salarios(con comisiones incluidas) de los empleados que trabajen como SALESMAN.

33.- Consultar el salario máximo, el mínimo y la diferencia entre ambos 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 el departamento 30.

36.- Consultar el número de empleados que hay en el departamento 30.

37.- Retornar el nombre, el trabajo y el salario del empleado que tenga el salario más alto.

38.- Calcular el salario medio de cada departamento (con una única consulta).

Page 64: Introduccion a sql

Introducción al lenguaje SQL Unidad 4: Ejercicios

INNOVA Desarrollos Informáticos, SL Pág. 64

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 por tipo de trabajo dentro de cada departamento.

41.- Listar el salario promedio anual para todos los tipos de trabajo de más de dos empleados.

42.- Listar todos los departamentos con, por lo menos dos empleados cuyo tipo de trabajo sea CLERK.

43.- Listar los tipos de trabajo cuyo salario promedio mensual sea mayor que el de los del tipo MANAGER.

44.- Listar el nombre, tipo de trabajo, salario, comisión y total a cobrar de los empleados del departamento 30.

45.- Consultar todos los nombres y tipos de trabajo de los empleados con el mismo tipo de trabajo que JONES.

46.- Consultar el salario, trabajo, nombre y departamento de los empleados cuyo salario es mayor que cualquiera de los salarios del departamento 30.

47.- Consultar el salario, trabajo, nombre y departamento de los empleados cuyo salario es mayor que todos los salarios del departamento 30.

48.- Consultar el nombre y trabajo de los empleados del departamento 10 que tengan el mismo trabajo que algún empleado del departamento 30.

49.- Listar los nombres y trabajos de los empleados del departamento 10 que tienen un trabajo que no existe en el departamento 30.

Page 65: Introduccion a sql

Introducción al lenguaje SQL Unidad 4: Ejercicios

INNOVA Desarrollos Informáticos, SL Pág. 65

50.- Consultar el nombre, trabajo y salario de los empleados cuyo tipo de trabajo y salario sean exactamente iguales que el empleado FORD.

51.- Obtener la lista de empleados con el mismo trabajo que JONES, o un salario mayor o igual que el de FORD, ordenado por trabajo y salario.

52.- Obtener la lista de los nombres y trabajos de los empleados del departamento 10 con el mismo trabajo que alguno del departamento con el nombre SALES.

53.- Listar los nombres, trabajos y salarios de los empleados cuyos salarios sean igual al de SCOTT o al de WARD (sin utilizar la cláusula OR).

54.- Encontrar los nombres y trabajos de los empleados cuyo trabajo es el mismo que los que trabajan en CHICAGO.

55.- Consultar el departamento, nombre y salario de los empleados cuyo salario es mayor del promedio de su propio departamento, ordenados por número de departamento.

56.- Consultar el trabajo, nombre, número de empleado y de departamento de los empleados que tengan jefe, ordenados por número de empleado.

57.- Insertar en la tabla emp los valores 7954, CARTER, SALESMAN, 7698, 7-ABR-2000, 1500, Vacío y 30 según el orden preestablecido en la creación de la tabla.

58.- Insertar las columnas empno, ename, hiredate, deptno, sal de la tabla emp con los valores 7955, WILSON, 22-ABR-84, 30 y 1500, respectivamente.

59.- Insertar las columnas de la tabla emp con los valores 7657, MASON, ANALYST, 4/24/84, 3400, Vacío, y 20 según el orden establecido en la creación de la tabla, utilizando la función de cambio de tipo.

Page 66: Introduccion a sql

Introducción al lenguaje SQL Unidad 4: Ejercicios

INNOVA Desarrollos Informáticos, SL Pág. 66

60.- Insertar las columnas de la tabla emp con los valores 7658, CHAN, ANALYST, 3-MAY-84 9:30, 3400, Vacío, y 20 según el orden establecido en la creación de la tabla, utilizando la función de cambio de tipo.

61.- La tabla Bonu, contiene los campos ename, job, sal y comm (similares en tipo y longitud a los de la tabla emp). Se trata de, en una única sentencia, insertar todos los empleados cuyo trabajo sea MANAGER o que su comisión sea mayor que el 25% de su salario.

62.- Actualizar el trabajo a SALESMAN, hiredate a la fecha actual e incrementar el salario un 10% al empleado WILSON.

63.- Incrementar el salario un 15% a los que trabajan como ANALYST y a los CLERK del departamento 20.

64.- Aumentar un 5% el salario de cada empleado en la tabla emp, que aparezca en la tabla bonu.

65.- Aumentar el salario de todos los SALESMAN un 10% del salario promedio de todos los empleados del mismo tipo.

66.- Borrar todos los empleados con el mismo trabajo que JONES de la tabla bonu.

67.- Crear una vista con el nombre de emp10 que contenga los números, nombres y trabajos de los empleados del departamento 10.

68.- Consultar el nombre y trabajo de la vista emp10 de los empleados cuyo número sea mayor que 7800.

69.- Cambiar el trabajo a CLERK del empleado MILLER, utilizando la vista emp10.

Page 67: Introduccion a sql

Introducción al lenguaje SQL Unidad 4: Ejercicios

INNOVA Desarrollos Informáticos, SL Pág. 67

70.- Crear una vista (con nombre pay) que posea los siguientes campos: name (nombre del empleado), monthly_sal (salario), annual_sal (salario anual del empleado), deptno (número de departamento).

71.- Crear la vista dept_comp que posee los campos deptno (número de departamento), losal (salario mínimo de los empleados), medsal (salario medio de los empleados), hisal (salario máximo de los empleados), totsal (total de los salarios de los empleados) de cada departamento.

72.- Crear una vista pub_emp qye excluya los campos sal y comm de la tabla emp y otorgar privilegios de consulta a todos los esquemas.

73.- Crear una vista que retorne a cada MANAGER de cada departamento los datos de sus empleados, dando privilegios de consulta sobre la vista a todos los usuarios (suponer que el nombre del esquema coincide con el nombre del empleado y que la variable global USER contiene el nombre del esquema).