Professional Documents
Culture Documents
lenguaje SQL
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).
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
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
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.
Bibliografía
Manual de referencia de SQL de Oracle y varios cursos de
introducción a SQL de internet.
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.
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.
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.
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
= 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
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.
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
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
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
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:
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);
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.
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.
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
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
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’;
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:
3 UNIDAD 4: EJERCICIOS
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.
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.
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.
EMP SALGRADE
DUMMY
DEPT
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.
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.
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.
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.
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.
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.