Sie sind auf Seite 1von 46

TABLAS UTILIZADAS EN LOS EJEMPLOS ..............................................

1
Sentencias de creacin de las tablas.............................................................................................1
Contenido de las tablas ......................................................................................................................2
SQL ........................................................................................... 3
FORMATO BSICO DE LA SENTENCIA SELECT.........................................................................................3
ELIMINACION DE FILAS REPETIDAS...........................................................................................6
EXPRESIONES ..........................................................................................................................................7
PREDICADOS.............................................................................................................................................9
Predicados Simples..............................................................................................................................9
SENTENCIAS SUBORDINADAS ....................................................................................................................11
Predicados compuestos .................................................................................................................... 12
PREDICADOS PROPIOS DE SQL ................................................................................................................. 12
Comprobacin de valor nulo. Predicado NULL........................................................................... 12
Prueba de pertenencia a un conjunto. Predicado IN.............................................................. 13
Predicados cuantificados (ALL, SOME, ANY).......................................................................... 14
Cuantificador ALL.............................................................................................................................. 15
Cuantificador SOME......................................................................................................................... 15
Cuantificador ANY ............................................................................................................................ 16
Predicado BETWEEN - AND .......................................................................................................... 16
Predicado LIKE ................................................................................................................................... 17
FUNCIONES DE COLUMNAS ............................................................................................................ 18
FUNCIONES COLECTIVAS ................................................................................................................ 18
REGLAS Y FORMATOS DE LAS FUNCIONES COLECTIVAS ................................................ 19
FORMATO 1: ....................................................................................................................................... 19
FORMATO 2:...................................................................................................................................... 20
FORMATO 3:...................................................................................................................................... 20
CONSULTAS CON AGRUPAMIENTO DE FILAS ........................................................................ 21
CLAUSULA GROUP BY ..................................................................................................................... 21
CLAUSULA HAVING........................................................................................................................ 22
HAVING SIN GROUP BY ............................................................................................................... 23
SENTENCIA SELECT CON AGRUPAMIENTO DE FILAS....................................................... 23
CONSULTAS SOBRE VARIAS TABLAS........................................................................................ 24
CALIFICACION DE NOMBRES DE COLUMNAS................................................................... 24
LA CLAUSULA FROM ...................................................................................................................... 24
OPERACION DE REUNIN (JOIN) ............................................................................................... 25
SENTENCIAS SUBORDINADAS..................................................................................................... 27
CONSULTAS CORRELACIONADAS ............................................................................................... 27
Predicado EXISTS ........................................................................................................................... 28
EJERCICIOS: ...............................................................................29
COMPOSICIN DE CONSULTAS ................................................................................................... 32
Clusula UNION [ALL] .................................................................................................................... 32
CREACIN DE VISTAS ...................................................................................................................... 34
INSERCIN, MODIFICACIN Y BORRADO DE INFORMACIN .....................35
INSERCION, MODIFICACION Y BORRADO DE INFORMACION EN VISTAS............ 37
Clusula WITH CHECK OPTION: ................................................................................................ 38
SEGURIDAD.................................................................................39
Bases de Datos. SQL. Curso 2000-2001

Sentencias GRANT y REVOKE...................................................................................................... 39


SQL EMBEBIDO. ...........................................................................40
1 INTRODUCCIN....................................................................................................................................... 40
1.a Preliminares. ................................................................................................................................. 40
2 OPERACIONES SIN CURSORES............................................................................................................... 41
3 OPERACIONES CON CURSORES ............................................................................................................. 42
3.a Situacin. ...................................................................................................................................... 42
3.b Solucin : uso de cursores. ..................................................................................................... 42

Bases de Datos. SQL. Curso 2000-2001

ii

Tablas utilizadas en los ejemplos


DEPT (DEPTNO, DNAME, LOC)
Cada fila representa un departamento, con su nmero de departamento, su nombre y la
ciudad donde est localizado.
EMP (ENO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
Cada fila representa un empleado. Sus columnas son: nmero de empleado, nombre del
empleado, empleo, nmero del empleado que es su supervisor, fecha de ingreso, salario
semanal, comisin y nmero de departamento al que est asignado.
SALGRADE (GRADE, LOSAL, HISAL)
Cada fila representa un tramo de salarios, con el salario mnimo y el mximo, para ese
tramo.

Sentencias de creacin de las tablas


-- -------------------- CREAR LA TABLA DEPT
-- ------------------CREATE TABLE DEPT (
DEPTNO
INT
DNAME
CHAR (10)
LOC
CHAR (8)
)

---NOT NULL PRIMARY KEY,


NOT NULL,
NOT NULL

-- ------------------ --- CREAR LA TABLA EMP --- ------------------ -CREATE TABLE EMP (
ENO
INT
NOT NULL PRIMARY KEY,
ENAME
CHAR (6)
NOT NULL UNIQUE,
JOB
CHAR (9)
NOT NULL,
MGR
INT
NULL,
HIREDATE
DATETIME
NOT NULL,
SAL
INT
NOT NULL,
COMM
INT
NULL,
DEPTNO
INT
NOT NULL REFERENCES DEPT
)
ALTER TABLE EMP
ADD CONSTRAINT MANAGER FOREIGN KEY (MGR) REFERENCES EMP
-- ----------------------- --- CREAR LA TABLA SALGRADE --- ----------------------- -CREATE TABLE SALGRADE (
GRADE
INT
NOT NULL PRIMARY KEY,
LOSAL
INT
NOT NULL,
HISAL
INT
NOT NULL
)

Bases de Datos. SQL. Curso 2000-2001

Contenido de las tablas

EMP
ENO
7369
7499
7521
7566
7654
7698
7782
7788
7839
7844
7876
7900
7902
7934

ENAME
SMITH
ALLEN
WARD
JONES
MARTIN
BLAKE
CLARK
SCOTT
KING
TURNER
ADAMS
JAMES
FORD
MILLER

JOB
CLERK
SALESMAN
SALESMAN
MANAGER
SALESMAN
MANAGER
MANAGER
ANALYST
PRESIDENT
SALESMAN
CLERK
CLERK
ANALYST
CLERK

MGR HIREDATE
7902 17/12/80
7698 20/02/81
7698 22/02/81
7839 02/04/81
7698 28/10/81
7839 01/05/81
7839 09/06/81
7566 09/12/82
NULL 17/11/81
7698 08/10/81
7788 12/01/83
7698 03/12/81
7566 03/12/81
7782 23/01/82

SAL
800
1600
1250
2975
1250
2850
2450
3000
5000
1500
1100
950
3000
1300

COMM DEPTNO
NULL
20
300
30
500
30
NULL
20
1400
30
NULL
30
NULL
10
NULL
20
NULL
10
0
30
NULL
20
NULL
30
NULL
20
NULL
10

DEPT
DEPTNO
10
20
30
40

DNAME
ACCOUNTING
RESEARCH
SALES
OPERATIONS

LOC
NEW YORK
DALLAS
CHICAGO
BOSTON

SALGRADE
GRADE
1
2
3
4
5

LOSAL
HISAL
700
1200
1201
1400
1401
2000
2001
3000
3001
9999

Bases de Datos. SQL. Curso 2000-2001

SQL
Las sentencias SQL se componen de clusulas, cada una de las cuales comienza con una palabra
reservada determinada.

Formato bsico de la sentencia SELECT


Clusulas SELECT, FROM, WHERE y ORDER BY.
Formato:

SELECT [DISTINCT] { expr_1 [, expr_2]... | * }


FROM nombre_tabla
[WHERE condicion]
[ORDER BY columna [ASC | DESC]]
Tras la clusula SELECT se escriben expresiones habitualmente nombres de columnas, o
expresiones en las que figuren nombres de columnas- pertenecientes a la tabla cuyo nombre
aparece en la clusula FROM. Si en lugar de nombres de columnas se pone un * equivale a
escribir los nombres de todas las columnas de la tabla.
El resultado de la ejecucin de una sentencia SELECT es siempre otra tabla. Las columnas de
la tabla resultante sern las que figuren enumeradas tras la clusula SELECT, y en el mismo
orden en el que figuran tras ella.
Ejemplo:
1. Seleccionar el n de empleado, salario, comisin, n de departamento y fecha de la
tabla EMP.
SELECT ENO, SAL, COMM, DEPTNO, HIREDATE
FROM EMP;
ENO
----------7369
7499
7521
7566
7654
7698
7782
7788
7839
7844
7876
7900
7902
7934

SAL
----------800
1600
1250
2975
1250
2850
2450
3000
5000
1500
1100
950
3000
1300

COMM
----------NULL
300
500
NULL
1400
NULL
NULL
NULL
NULL
0
NULL
NULL
NULL
NULL

DEPTNO
----------20
30
30
20
30
30
10
20
10
30
20
30
20
10

HIREDATE
---------1980-12-17
1981-02-20
1981-02-22
1981-04-02
1981-10-28
1981-05-01
1981-06-09
1982-12-09
1981-11-17
1981-10-08
1983-01-12
1981-12-03
1981-12-03
1982-01-23

Si se escribe un asterisco, las columnas sern todas las de la tabla de la clusula FROM, en el
mismo orden en el que fueron creadas en la sentencia CREATE TABLE.

Bases de Datos. SQL. Curso 2000-2001

Ejemplo:
2. Seleccionar todas las columnas de la tabla DEPT.
SELECT *
FROM DEPT;
DEPTNO
----------10
20
30
40

DNAME
---------ACCOUNTING
RESEARCH
SALES
OPERATIONS

LOC
-------NEW YORK
DALLAS
CHICAGO
BOSTON

Los nombres de las columnas de la tabla resultante sern los mismos que los de las columnas de
la tabla de la que proceden, salvo en el caso de que se usen expresiones. En este caso,
dependiendo del gestor, pueden desde no tener nombre (!) hasta tener nombres generados por
el propio gestor. Pueden salir, incluso, columnas con el mismo nombre ( !). Puede asignarse un
nombre, o cambiar el nombre de la columna escribiendo el nuevo nombre a continuacin del
nombre de la columna o de la expresin que genera la columna en la sentencia SELECT. Si el
nombre tiene espacios en blanco, debe escribirse entre comillas.
Ejemplo:
SELECT ENAME "NOMBRE DEL EMPLEADO"
FROM EMP;
NOMBRE DEL EMPLEADO
------------------ADAMS
ALLEN
BLAKE
CLARK
FORD
JAMES
JONES
KING
MARTIN
MILLER
SCOTT
SMITH
TURNER
WARD
(14 filas afectadas)
La evaluacin de la condicin expresada en la clusula WHERE puede resultar verdadera o no.
La columna especificada en la clusula ORDER BY ser, habitualmente, una de las que aparecen
en la clusula SELECT.
Si no se especifica ORDER BY, las filas se devuelven en cualquier orden. La nica manera de
obtener las filas ordenadas es solicitarlo explcitamente mediante ORDER BY.
Cuando se ordena ascendentemente por los valores de una columna las filas se presentan de tal
forma que cada valor sea menor o igual que el siguiente para esa columna. Tambin se puede
clasificar el resultado por ms de una columna, para ello se escriben sus nombres o sus
nmeros separados por comas. Si se especifica ms de una columna, se clasifica por la primera
y despus, para cada valor clasificado de la primera, por la segunda y as sucesivamente. Si

Bases de Datos. SQL. Curso 2000-2001

existen valores nulos, la posicin de stos depende del SGBDR. En DB2 se colocan al final. En
Sybase SQL Server y en Microsoft SQL Server se colocan al principio.
Ejemplo:
3. Seleccionar los nombres y los empleos de todos los empleados, ordenados por empleo.
SELECT JOB, ENAME
FROM EMP
ORDER BY JOB;
JOB
--------ANALYST
ANALYST
CLERK
CLERK
CLERK
CLERK
MANAGER
MANAGER
MANAGER
PRESIDENT
SALESMAN
SALESMAN
SALESMAN
SALESMAN

ENAME
-----SCOTT
FORD
SMITH
ADAMS
JAMES
MILLER
JONES
BLAKE
CLARK
KING
ALLEN
WARD
MARTIN
TURNER

(14 filas afectadas)


4.

Seleccionar los nombres de todos los empleados, ordenados por empleo.


SELECT ENAME
FROM EMP
ORDER BY JOB;
ENAME
-----SCOTT
FORD
SMITH
ADAMS
JAMES
MILLER
JONES
BLAKE
CLARK
KING
ALLEN
WARD
MARTIN
TURNER
(14 filas afectadas)

Se puede especificar un nmero en lugar del nombre de una columna. Si se hace as, equivale a
escribir el nombre de la columna cuya posicin en la clusula SELECT corresponde a ese
nmero. Por ejemplo, si se especifica ORDER BY 2 equivale a escribir el nombre de la segunda
columna especificada en la clusula SELECT.

Bases de Datos. SQL. Curso 2000-2001

Ejemplo:
5. Seleccionar los empleos que hay en cada departamento, ordenados por departamento.
SELECT DEPTNO, JOB
FROM EMP
ORDER BY 1;
DEPTNO
----------10
10
10
20
20
20
20
20
30
30
30
30
30
30

JOB
--------MANAGER
PRESIDENT
CLERK
CLERK
MANAGER
ANALYST
CLERK
ANALYST
SALESMAN
SALESMAN
SALESMAN
MANAGER
SALESMAN
CLERK

(14 filas afectadas)


Por omisin, la clasificacin se realiza en orden creciente. Si se desea en orden decreciente se
debe escribir DESC detrs del nombre o el nmero de la columna para la que se desea la
clasificacin decreciente.
6.

Mostrar el trabajo, el nombre y el salario de los empleados ordenados


ascendentemente por el tipo de trabajo y por salario descendente.
SELECT JOB, ENAME, SAL
FROM EMP
ORDER BY 1, 3 DESC;
JOB
--------ANALYST
ANALYST
CLERK
CLERK
CLERK
CLERK
MANAGER
MANAGER
MANAGER
PRESIDENT
SALESMAN
SALESMAN
SALESMAN
SALESMAN

ENAME
-----SCOTT
FORD
MILLER
ADAMS
JAMES
SMITH
JONES
BLAKE
CLARK
KING
ALLEN
TURNER
WARD
MARTIN

SAL
----------3000
3000
1300
1100
950
800
2975
2850
2450
5000
1600
1500
1250
1250

(14 filas afectadas)

ELIMINACION DE FILAS REPETIDAS


El resultado de la ejecucin de una sentencia SELECT devuelve todas las filas que cumplen la
condicin impuesta en la clusula WHERE, incluso las repetidas.

Bases de Datos. SQL. Curso 2000-2001

Por ejemplo:
SELECT DEPTNO
FROM EMP
DEPTNO
----------20
30
30
20
30
30
10
20
10
30
20
30
20
10
Para eliminar las filas repetidas, puede incluirse la palabra reservada DISTINCT antes del
nombre de las columnas. En este caso, dos valores nulos se consideran iguales.
Ejemplos:
7. Seleccionar los distintos departamentos que existen en la tabla EMP.
SELECT DISTINCT DEPTNO
FROM EMP;
DEPTNO
----------10
20
30

EXPRESIONES
En una sentencia para formular una consulta se pueden realizar operaciones con los datos. Por
ejemplo, se puede solicitar el resultado del producto de los valores de dos columnas, o el valor
de una columna dividido por un valor. Para ello se utilizan expresiones.
Tambin pueden utilizarse expresiones en las condiciones de bsqueda impuestas en la clusula
WHERE.
Una expresin es una combinacin de operadores, operandos y parntesis. El resultado de la
ejecucin de una expresin es un nico valor.
En el formato de la sentencia SELECT descrito anteriormente, las expresiones pueden
utilizarse en la clusula SELECT en lugar de nombres de columnas y en la clusula WHERE en la
formulacin de la condicin donde uno o ambos de los valores a comparar pueden ser el
resultado de evaluar una expresin.
Los operandos pueden ser nombres de columnas, constantes u otras expresiones. Otros tipos
de operandos, como las funciones de columna se vern ms adelante.

Bases de Datos. SQL. Curso 2000-2001

Los operadores actan sobre datos homogneos, es decir bien numricos o bien alfanumricos.
Con los datos de tipo numrico slo se pueden realizar operaciones aritmticas, cuyos
operadores son + (suma), - (resta), * (multiplicacin) y / (divisin).
Ejemplos:
8. Calcular el salario anual a percibir por cada empleado.
SELECT ENAME, SAL * 4 * 12 SAL ANUAL
FROM EMP;
ENAME
-----SMITH
ALLEN
WARD
JONES
MARTIN
BLAKE
CLARK
SCOTT
KING
TURNER
ADAMS
JAMES
FORD
MILLER
9.

SAL ANUAL
----------38400
76800
60000
142800
60000
136800
117600
144000
240000
72000
52800
45600
144000
62400

Mostrar el nombre del empleado y una columna que contenga el salario multiplicado
por la comisin cuya cabecera sea BONO.
SELECT ENAME, SAL*COMM BONO
FROM EMP;
ENAME
-----SMITH
ALLEN
WARD
JONES
MARTIN
BLAKE
CLARK
SCOTT
KING
TURNER
ADAMS
JAMES
FORD
MILLER

BONO
----------NULL
480000
625000
NULL
1750000
NULL
NULL
NULL
NULL
0
NULL
NULL
NULL
NULL

Los operadores para tipos de datos alfanumricos varan de una implementacin de SQL a otra.
En el apartado correspondiente estudiaremos algunos de los soportados por Sybase SQL
Server.

Bases de Datos. SQL. Curso 2000-2001

PREDICADOS
En las consultas vistas hasta ahora hemos visto consultas sin condiciones. Pueden especificarse
condiciones de bsqueda ms complejas que proporcionan una gran potencia de seleccin al
SQL. Estas condiciones se denominan predicados.
Un predicado expresa una condicin entre valores y el resultado de su evaluacin puede ser
"verdadero", "falso" o "desconocido"
Los predicados se expresan en la clusula WHERE y en otras que veremos ms adelante.
Slo se considera satisfecha la condicin de bsqueda expresada en un predicado cuando toma
el valor "Verdadero". Esto quiere decir que el resultado de la evaluacin de un predicado
expresado en la clusula WHERE da lugar a la recuperacin de las filas para las que toma el
valor "Verdadero" y se rechazarn las filas para las que tome el valor "Falso" o "Desconocido".
Los predicados pueden clasificarse en simples y compuestos.

Predicados Simples

Predicados bsicos:
Expresan condiciones de comparacin entre dos valores. Son =, <, > o las siguientes
combinaciones de ellos:
Predicado
x=y
x <> y
x<y
x>y
x <= y
x >= y

"Verdadero" si y slo si
x es igual a y
x no es igual a y
x es menor que y
x es mayor que y
x es menor o igual que y
x es mayor o igual que y

Si alguno o ambos de los operadores x o y es nulo, el resultado de la evaluacin del predicado


toma el valor "Desconocido". Para el resto de los casos toma el valor "Falso".
Los operadores x o y pueden ser expresiones.
Ejemplos:
10. Seleccionar aquellos empleados que sean SALESMAN.
SELECT ENAME
FROM EMP
WHERE JOB = SALESMAN;
ENAME
-----ALLEN
WARD
MARTIN
TURNER

Bases de Datos. SQL. Curso 2000-2001

11. Seleccionar aquellos empleados que no trabajen en el departamento 30.


SELECT ENAME
FROM EMP
WHERE DEPTNO <> 30;
ENAME
-----SMITH
JONES
CLARK
SCOTT
KING
ADAMS
FORD
MILLER
12. Seleccionar el nombre de aquellos empleados que ganen ms de 2000.
SELECT ENAME
FROM EMP
WHERE SAL > 2000;
ENAME
-----JONES
BLAKE
CLARK
SCOTT
KING
FORD
13. Seleccionar aquellos empleados que hayan entrado antes del 1/1/82
SELECT ENAME
FROM EMP
WHERE HIREDATE < 1/1/82;
ENAME
-----SMITH
ALLEN
WARD
JONES
MARTIN
BLAKE
CLARK
KING
TURNER
JAMES
FORD
14. Mostrar el nombre del empleado y su fecha de alta en la empresa de los empleados
que son ANALISTA.
SELECT ENAME, HIREDATE
FROM EMP
WHERE JOB = "ANALYST";

Bases de Datos. SQL. Curso 2000-2001

10

ENAME
-----SCOTT
FORD

HIREDATE
---------1982-12-09
1981-12-03

Sentencias subordinadas
El segundo operador (y) puede ser, en lugar de una expresin, el resultado de la ejecucin de
otra sentencia SELECT, que deber ir entre parntesis y devolver como resultado un nico
valor. Es decir, la tabla resultante debe tener una sola columna y una fila o ninguna. Adems no
se puede especificar en ella la clusula ORDER BY. Si el resultado de esta sentencia SELECT
es una tabla vaca, su valor se toma como "desconocido".
15. Seleccionar los empleados cuyo salario sea superior al de ADAMS.
SELECT ENAME
FROM EMP
WHERE SAL > (SELECT SAL
FROM EMP
WHERE ENAME = ADAMS);
ENAME
-----ALLEN
WARD
JONES
MARTIN
BLAKE
CLARK
SCOTT
KING
TURNER
FORD
MILLER
16. Seleccionar los empleados que trabajan en el mismo departamento que CLARK.
SELECT ENAME
FROM EMP
WHERE DEPTNO = (SELECT DEPTNO FROM EMP WHERE ENAME = CLARK);
ENAME
-----CLARK
KING
MILLER
17. Encontrar a los empleados cuyo jefe es BLAKE.
SELECT ENAME
FROM EMP
WHERE MGR = (SELECT ENO
FROM EMP WHERE ENAME = BLAKE);
ENAME
-----ALLEN
WARD
MARTIN
TURNER
JAMES

Bases de Datos. SQL. Curso 2000-2001

11

Predicados compuestos

Lo visto hasta ahora son predicados simples. Los predicados compuestos son combinaciones de
predicados, simples o compuestos con los operadores lgicos AND, OR y NOT.
AND y OR se aplican a dos operandos, mientras que NOT se aplica a uno slo. En todos los
casos, los operandos son otros predicados.
Los predicados compuestos, al igual que los simples, pueden tomar los valores "Verdadero",
"Falso" o "Desconocido".
Cuando se utiliza AND, el resultado es "Verdadero" cuando los dos predicados lo son. Cuando
se utiliza OR, el resultado es "Verdadero" cuando lo es cualquiera de sus operandos (al menos
uno). Cuando se utiliza NOT, el resultado es verdadero cuando el predicado sobre el que se
aplica es "Falso".
Ejemplos:
18. Seleccionar el nombre de los vendedores que ganen ms de 1500.
SELECT ENAME
FROM EMP
WHERE JOB = SALESMAN
AND SAL > 1500;
ENAME
-----ALLEN
19. Seleccionar el nombre de aquellos que sean CLERK o trabajen en el departamento 30.
SELECT ENAME
FROM EMP
WHERE JOB = CLERK
OR DEPTNO = 30;
ENAME
-----SMITH
ALLEN
WARD
MARTIN
BLAKE
TURNER
ADAMS
JAMES
MILLER

Predicados propios de SQL


Comprobacin de valor nulo. Predicado NULL
Formato:
nom_columna IS [NOT] NULL

Se utiliza para consular si el valor de la columna de una fila determinada es o no nulo. Si es nulo
el resultado ser "Verdadero", si no lo es "Falso". No puede tomar el valor "Desconocido".

Bases de Datos. SQL. Curso 2000-2001

12

Ejemplo:
20. Seleccionar aquellos empleados que tienen comisin.
SELECT ENAME
FROM EMP
WHERE COMM IS NOT NULL;
ENAME
-----ALLEN
WARD
MARTIN
TURNER

Prueba de pertenencia a un conjunto. Predicado IN


Formato:
expresin [NOT] IN (cte_1 [, cte_2])

Se utiliza para averiguar si el resultado de la evaluacin de una expresin est incluido en la


lista de valores especificada tras la palabra IN.
Si el resultado de la expresin es no nulo, y es igual a alguno de los valores de la lista, el
predicado es "Verdadero", si no es "Falso".
Si la expresin devuelve un valor nulo, el predicado toma el valor "Desconocido".
En lugar de una lista de valores, puede especificarse una sentencia SELECT subordinada, que
deber devolver una tabla con una sola columna y no podr contener la clusula ORDER BY.
En este caso, el formato sera:
expresin IN (subselect)
subselect es una sentencia SELECT subordinada.
Ejemplos:
21. Seleccionar aquellos que se llamen SMITH, ALLEN o SCOTT .
SELECT *
FROM EMP
WHERE ENAME IN (SMITH, ALLEN , SCOTT);
ENO
-------7369
7499
7788

ENAME
-----SMITH
ALLEN
SCOTT

JOB
MGR
HIREDATE SAL
COMM
DEPTNO
--------- -------- ---------- --------- ---------- ---------CLERK
7902
1980-12-17 800
NULL
20
SALESMAN 7698
1981-02-20 1600
300
30
ANALYST
7566
1982-12-09 3000
NULL
20

Bases de Datos. SQL. Curso 2000-2001

13

22. Seleccionar aquellos que no se llamen SMITH, ALLEN o SCOTT .


SELECT *
FROM EMP
WHERE ENAME NOT IN (SMITH, ALLEN , SCOTT );
ENO
--------7521
7566
7654
7698
7782
7839
7844
7876
7900
7902
7934

ENAME
-----WARD
JONES
MARTIN
BLAKE
CLARK
KING
TURNER
ADAMS
JAMES
FORD
MILLER

JOB
--------SALESMAN
MANAGER
SALESMAN
MANAGER
MANAGER
PRESIDENT
SALESMAN
CLERK
CLERK
ANALYST
CLERK

MGR
------7698
7839
7698
7839
7839
NULL
7698
7788
7698
7566
7782

HIREDATE
---------1981-02-22
1981-04-02
1981-10-28
1981-05-01
1981-06-09
1981-11-17
1981-10-08
1983-01-12
1981-12-03
1981-12-03
1982-01-23

SAL
---------1250
2975
1250
2850
2450
5000
1500
1100
950
3000
1300

COMM
--------500
NULL
1400
NULL
NULL
NULL
0
NULL
NULL
NULL
NULL

DEPTNO
---------30
20
30
30
10
10
30
20
30
20
10

23. Seleccionar los empleados que trabajen en CHICAGO.


SELECT ENAME
FROM EMP
WHERE DEPTNO IN (SELECT DEPTNO
FROM DEPT
WHERE LOC = CHICAGO);
ENAME
-----ALLEN
WARD
MARTIN
BLAKE
TURNER
JAMES
24. Seleccionar aquellos empleados que trabajen en el departamento 10, o en el 20.
SELECT ENAME
FROM EMP
WHERE DEPTNO IN (10, 20);
ENAME
-----SMITH
JONES
CLARK
SCOTT
KING
ADAMS
FORD
MILLER

Predicados cuantificados (ALL, SOME, ANY)

Como hemos visto, cuando se utiliza una sentencia SELECT subordinada en un predicado de
comparacin, el resultado debe ser un valor nico (una tabla con una sola fila y una sola
columna).

Bases de Datos. SQL. Curso 2000-2001

14

Pero se permite que el resultado de la sentencia SELECT subordinada tenga ms de un valor si


sta viene precedida de una de las palabras reservadas ALL, SOME, ANY (palabras
cuantificadoras). Cuando se utilizan estas palabras, los predicados en los que participan se
denominan predicados cuantificados.
En ellos, el resultado de la ejecucin de la sentencia SELECT subordinada debe ser una tabla
con una sola columna y cero o ms filas.

Cuantificador ALL

El predicado cuantificado es verdadero si la comparacin es verdadera para todos y cada uno


de los valores devueltos por la SELECT subordinada.
Si la SELECT subordinada devuelve una tabla vaca, el predicado cuantificado toma el valor
"verdadero".
Si devuelve uno o ms valores y alguno de ellos es nulo, el predicado cuantificado puede ser:

"Falso" si para alguno de los valores no nulos la comparacin toma el valor "Falso"
"Desconocido" Si la comparacin es verdadera para todos los valores no nulos.

Si devuelve uno o ms valores y ninguno de ellos es nulo, el predicado cuantificado es


"verdadero" si la comparacin lo es para todos los valores de la tabla devuelta. En otro caso es
"Falso".
25. Seleccionar el nombre de los empleados que ganen ms que todos los SALESMAN.
SELECT ENAME
FROM EMP
WHERE SAL > ALL (SELECT SAL
FROM EMP
WHERE JOB = SALESMAN);
ENAME
-----JONES
BLAKE
CLARK
SCOTT
KING
FORD

Cuantificador SOME

El predicado cuantificado es verdadero si la comparacin es verdadera para uno cualquiera de


los valores devueltos por la ejecucin de la sentencia SELECT subordinada.
Si la sentencia subordinada devuelve una tabla vaca, el predicado cuantificado toma el valor
"Falso".
Si devuelve una o ms filas y alguna de ellas es nula, el predicado cuantificado puede ser:

"Verdadero" si para alguno de los valores no nulos el resultado de la comparacin es


Verdadero
"Desconocido" si para todos los valores no nulos de la tabla el resultado de la comparacin
es "Falso"

Si devuelve una o ms filas y ninguna es nula, el predicado cuantificado es verdadero si la


comparacin es verdadera para alguno de los valores. En otro caso es "Falso"

Bases de Datos. SQL. Curso 2000-2001

15

Cuantificador ANY

Usar ANY es lo mismo que usar SOME

Ejemplo:
26. Seleccionar los empleados que ganen ms que alguno de los SALESMAN.
SELECT ENAME
FROM EMP
WHERE SAL > SOME (SELECT SAL
FROM EMP
WHERE JOB = SALESMAN);
ENAME
-----ALLEN
JONES
BLAKE
CLARK
SCOTT
KING
TURNER
FORD
MILLER

Predicado BETWEEN - AND

Formato:
expr_1 [NOT] BETWEEN expr_2 AND expr_3
Se utiliza para comprobar si un valor est comprendido entre otros dos (ambos inclusive), o no.
Si se omite NOT, el predicado es verdadero si el valor de expr_1 est comprendido entre el
valor de expr_2 y el de expr_3, ambos inclusive.
Si se especifica NOT, el predicado es verdadero si el valor de expr_1 no est en ese rango.
En el caso de V1 BETWEEN V2 AND V3:
Si ninguno de los valores de V1, V2 y V3 es nulo, el predicado es verdadero si el resultado de
V1 es mayor o igual que el de V2 y menor o igual que el de V3. En otro caso es "Falso".
Normalmente, el valor de V2 ser menor o igual que el de V3. De no ser as, el predicado ser
"Falso" para cualquier valor de V1. Salvo que V1 = V2 = V3, en cuyo caso el predicado es
verdadero.
Si alguno de los valores, V1, V2 o V3 es nulo, el predicado toma el valor desconocido.
Ejemplo:
27. Seleccionar aquellos cuyo salario est entre 2000 y 3000.
SELECT ENAME
FROM EMP
WHERE SAL BETWEEN 2000 AND 3000;
ENAME
-----JONES
BLAKE
CLARK
SCOTT
FORD

Bases de Datos. SQL. Curso 2000-2001

16

28. Seleccionar aquellos empleados que hayan entrado en 1981.


SELECT ENAME
FROM EMP
WHERE HIREDATE BETWEEN 1/1/1981 AND 31/12/1981;
ENAME
-----ALLEN
WARD
JONES
MARTIN
BLAKE
CLARK
KING
TURNER
JAMES
FORD
En el caso de V1 NOT BETWEEN V2 AND V3
Si ninguno de los valores V1, V2 o V3 es nulo, el predicado es verdadero si V1 es, o bien menor
que V2 o bien mayor que V3. En otro caso es falso.
De este modo, si V2 es igual o mayor que V3, el predicado ser verdadero para cualquier valor
de V1. Excepto cuando V1 = V2 = V3, que es falso.
Si V1 es nulo, el predicado toma el valor "desconocido"
Si V1 no es nulo:
Si V2 y V3 son nulos, el predicado es "desconocido"
Si V2 es nulo y V3 no, el predicado es verdadero si V1 es mayor que V3. En otro caso es
"Desconocido"
Si V3 es nulo y V2 no, el predicado es "verdadero" si V1 es menor que V2. En otro caso es
desconocido.
Ejemplos:

Predicado LIKE

Formato:
nom_columna [NOT] LIKE cte_alfanumrica
La columna debe ser de tipo alfanumrico.
Se utiliza para buscar combinaciones de caracteres que coincidan con un patrn especificado.
Ejemplo:
X LIKE Y
donde X es el nombre de una columna de tipo alfanumrico e Y una constante del mismo tipo
utilizada como patrn de bsqueda.
La constante alfanumrica puede contener cualquier carcter vlido, pero dos de ellos, el
carcter de subrayado (_) y el smbolo de porcentaje (%) tienen un significado especial.

Bases de Datos. SQL. Curso 2000-2001

17

A partir del valor de la cadena Y se generan otras cadenas de caracteres sustituyendo cada
carcter "_" por un nico carcter cualquiera y siempre uno, y cada "%" por una cadena
cualquiera de cualquier longitud (incluida la cadena vaca).
Los resultados pueden ser:
Si X no es nulo, el predicado es verdadero si su valor est incluido entre los que se pueden
generar a partir del patrn Y. Si no toma el valor "Falso".
Si X e Y son ambos cadenas vacas (cadenas de longitud cero), se conviene que el predicado
es verdadero.
Si X es nulo, el resultado es "Desconocido"
Evidentemente, si el valor de Y no contiene caracteres "_" o "%", el predicado X LIKE Y
equivale a X=Y.
Ejemplos:
29. Seleccionar aquellos empleados cuyo nombre empiece por A.
SELECT ENAME
FROM EMP
WHERE ENAME LIKE A%;
ENAME
-----ALLEN
ADAMS
30. Seleccionar aquellos empleados cuyo nombre tenga como segunda letra una D.
SELECT ENAME
FROM EMP
WHERE ENAME LIKE _D%;
ENAME
-----ADAMS

FUNCIONES DE COLUMNAS
Permiten obtener un solo valor como resultado de aplicar una determinada operacin a los
valores contenidos en una columna.

FUNCIONES COLECTIVAS
Son aquellas cuyo argumento es una coleccin de valores tomados de los pertenecientes a una o
ms columnas. Se llaman tambin por ello funciones de columna.
Se aplican a la coleccin de valores del argumento y producen un nico resultado a partir de
ellos.
Son:

AVG
MAX
MIN
SUM
COUNT

devuelve la media de los valores de la coleccin


devuelve el valor mximo de la coleccin
devuelve el valor mnimo
devuelve la suma
devuelve el nmero de elementos que tiene la coleccin

Bases de Datos. SQL. Curso 2000-2001

18

El argumento suele ser una expresin. Pueden utilizarse como operandos en las expresiones
utilizadas en la clusula SELECT.
Antes de aplicar las funciones se construyen uno o ms grupos de filas. La forma de construir
grupos se especifica mediante la clusula GROUP BY (que veremos ms adelante). Si no se
emplea GROUP BY se considera un solo grupo formado por todas las filas de la tabla que
cumplen el predicado de la clusula WHERE. A todas ellas se les aplican las funciones
colectivas y el resultado ser una tabla con una sola fila y con tantas columnas como
expresiones haya en la clusula SELECT.

REGLAS Y FORMATOS DE LAS FUNCIONES COLECTIVAS


Antes de aplicar una funcin colectiva a la coleccin de valores de su argumento se eliminan los
valores nulos, si existen.
Si la coleccin es vaca, la funcin COUNT devuelve un valor cero y las dems un valor nulo.
Para AVG, MAX, MIN y SUM el resultado tiene el mismo tipo de dato que el argumento. Este
debe ser numrico para AVG y SUM y puede ser de cualquier tipo para MAX y MIN.
Si el argumento es de tipo DECIMAL(p,s) el resultado de la funcin SUM es tambin de tipo
DECIMAL con la misma escala.
Por el contrario, la funcin AVG devolvera el resultado con ms decimales.
Si el argumento es de tipo INTEGER o SMALLINTEGER la funcin AVG puede perder cifras
decimales al calcular la media, al ser el resultado tambin de tipo entero.
Hay tres formatos:

FORMATO 1:

nom_funcin ( [DISTINCT] nom_columna )


nom_funcin: cualquiera
argumento: nombre de una columna. No puede ser una expresin.
La palabra DISTINCT no se considera un argumento de la funcin. Se emplea para, antes de
aplicar la funcin de columna a los valores de la coleccin, eliminar de ella los valores repetidos.
Evidentemente, el uso de DISTINCT con MAX y MIN es, aunque lcito, absurdo.
En una clusula SELECT no puede especificarse DISTINCT ms de una vez, ya sea dentro de
una funcin o detrs de la clusula SELECT.
Ejemplos:
31. Calcular el nmero de empleados que tienen comisin y la media.
SELECT COUNT(COMM), AVG(COMM)
FROM EMP;
----------- ----------4
550
32. Encontrar el salario medio de aquellos empleados cuyo trabajo sea el de ANALISTA.

Bases de Datos. SQL. Curso 2000-2001

19

SELECT AVG(SAL) SALARIO MEDIO


FROM EMP
WHERE JOB = ANALYST;
SALARIO MEDIO
------------3000
33. Encontrar el salario ms alto, el ms bajo y la diferencia entre ambos.
SELECT MAX(SAL), MIN(SAL), MAX(SAL) - MIN(SAL)
FROM EMP;
----------- ----------- ----------5000
800
4200
34. Hallar el numero de trabajos distintos que existen en el departamento 30.
SELECT COUNT (DISTINCT JOB)
FROM EMP
WHERE DEPTNO = 30;
----------3

FORMATO 2:

nom_funcin (expresin)
nom_funcin: cualquiera, excepto COUNT
argumento: expresin en la que debe haber al menos un nombre de columna y no puede haber
una funcin colectiva.
Ejemplo:
35. Calcular el salario total mensual.
SELECT SUM(SAL * 4) SUMA
FROM EMP;
SUMA
----------116100

FORMATO 3:

COUNT (*)
Slo vlido para la funcin COUNT.
Devuelve el nmero de filas que hay en el grupo sobre el que se aplica.
Ejemplo:
36. Encontrar el n de trabajadores diferentes en el departamento 30 para aquellos
empleados cuyo salario pertenezca al intervalo [1000, 1800].

Bases de Datos. SQL. Curso 2000-2001

20

SELECT COUNT(*)
FROM EMP
WHERE DEPTNO = 30
AND SAL BETWEEN 1000 AND 1800;
----------4

CONSULTAS CON AGRUPAMIENTO DE FILAS


Existe la posibilidad de formar grupos de filas de acuerdo con un determinado criterio para
aplicarles despus una funcin colectiva.

CLAUSULA GROUP BY

Clusula opcional de la sentencia SELECT que sirve para agrupar filas.


Si se especifica, debe aparecer despus de la clusula WHERE, si sta existe.
Formato:
GROUP BY col1 [, col2]...
donde col1, col2, son nombres de columnas a las que denominaremos columnas de agrupamiento.
La clusula GROUP BY indica que se han de agrupar las filas de la tabla de modo que todas las
que tengan iguales valores para las columnas de agrupamiento formen un grupo.
Pueden existir grupos de una sola fila.
Los valores nulos se consideran iguales. Se incluyen en el mismo grupo.
Una vez formados los grupos, para cada uno de ellos se evalan las expresiones de la clusula
SELECT. Por tanto, cada uno de ellos produce una nica fila en la tabla resultante.
Las columnas que participen en estas expresiones y no sean de agrupamiento slo pueden
especificarse en los argumentos de funciones colectivas.
Ejemplos:
37. Seleccionar el salario, mnimo y mximo de los empleados, agrupados por empleo.
SELECT JOB, MIN(SAL), MAX(SAL)
FROM EMP
GROUP BY JOB;
JOB
--------ANALYST
CLERK
MANAGER
PRESIDENT
SALESMAN

----------3000
800
2450
5000
1250

----------3000
1300
2975
5000
1600

Bases de Datos. SQL. Curso 2000-2001

21

38. Seleccionar el nmero de empleados que tienen comisin y la media de la misma en


cada departamento.
SELECT DEPTNO, COUNT(COMM), AVG(COMM)
FROM EMP
GROUP BY DEPTNO;
DEPTNO
----------10
20
30

----------0
0
4

----------NULL
NULL
550

Las funciones de columna no pueden utilizarse en la clusula WHERE. Si se necesita


calcular una funcin de columna para una condicin, debe anidarse una consulta:
39. Calcular el nmero de empleados por departamento que tienen un salario superior a la
media.
SELECT DEPTNO, COUNT(*)
FROM EMP
WHERE SAL > (SELECT AVG (SAL)
FROM EMP)
GROUP BY DEPTNO;
DEPTNO
----------10
20
30

----------2
3
1

40. Seleccionar el salario mnimo, mximo y medio de los empleados agrupados por
empleo.
SELECT JOB, MIN(SAL), MAX(SAL), AVG(SAL)
FROM EMP
GROUP BY JOB;
JOB
--------ANALYST
CLERK
MANAGER
PRESIDENT
SALESMAN

----------3000
800
2450
5000
1250

----------3000
1300
2975
5000
1600

----------3000
1037
2758
5000
1400

CLAUSULA HAVING

Clusula opcional de la sentencia SELECT utilizada para descartar grupos de filas.


Formato:
HAVING condicin
Indica que, despus de haber formado los grupos de filas, se descarten aquellos grupos que no
cumplan la condicin.
Como ya hemos visto, la configuracin de las filas en grupos se realiza mediante la clusula
GROUP BY o, si sta no existe, formando un solo grupo con todas las filas.
Si se especifica la clusula GROUP BY, sta debe preceder a la clusula HAVING.

Bases de Datos. SQL. Curso 2000-2001

22

La condicin es un predicado simple o compuesto en el que las columnas que participen y no


sean de agrupamiento debern figurar como argumentos de funciones colectivas.
Ejemplos:
41. Seleccionar el salario mnimo, mximo y medio de los empleados agrupados por
empleo, pero slo aquellos cuya media sea superior a 4000.
SELECT JOB, MIN(SAL), MAX(SAL), AVG(SAL)
FROM EMP
GROUP BY JOB
HAVING AVG(SAL) > 4000;
JOB
--------- ----------- ----------- ----------PRESIDENT 5000
5000
5000
42. El salario medio y mnimo de cada puesto, mostrando en el resultado aquellos cuyo
salario medio est por encima de 1500.
SELECT JOB, AVG(SAL), MIN(SAL)
FROM EMP
GROUP BY JOB
HAVING AVG(SAL) > 1500;
JOB
--------ANALYST
MANAGER
PRESIDENT

----------3000
2758
5000

----------3000
2450
5000

HAVING SIN GROUP BY

Aunque hay que particularizar su uso para cada gestor, puede utilizarse la clusula
HAVING sin un GROUP BY previo. En este caso se aplica la condicin al nico grupo de
filas formado por todas las filas de la tabla resultante.
Por ejemplo:
SELECT MAX(SAL), AVG (SAL)
FROM EMP
HAVING AVG(SAL) > 1000;

----------- ----------5000
2073
(1 filas afectadas)

SENTENCIA SELECT CON AGRUPAMIENTO DE FILAS


Se hace agrupamiento cuando, o bien se utiliza la clusula GROUP BY, o bien se utilizan
funciones colectivas en las expresiones de la clusula SELECT, o bien se dan ambos casos.
Si se especifica GROUP BY se agrupan las filas que tengan iguales valores en las columnas de
agrupamiento. Si no, se asume que todas las filas forman un nico grupo.

Bases de Datos. SQL. Curso 2000-2001

23

Una vez formados los grupos:


1.- Para cada grupo se evalan las expresiones de la clusula SELECT, dando lugar a una
fila en la tabla resultante.
2.- Las columnas que no sean de agrupamiento slo pueden usarse como participantes
en los argumentos de funciones colectivas, ya sea en las expresiones de la clusula
SELECT o en la condicin de la clusula HAVING.
La palabra DISTINCT slo puede especificarse una vez, bien en la clusula SELECT o bien
dentro de funciones colectivas en la condicin de la clusula HAVING. Este lmite no rige para
las sentencias subordinadas que pueda haber en los predicados de las clusulas WHERE o
HAVING.

CONSULTAS SOBRE VARIAS TABLAS


Es posible manejar varias tablas en una sola sentencia, para lo cual basta poner sus nombres en
la clusula FROM de la sentencia principal o de una subordinada. En el primer caso, el resultado
se obtiene combinando datos de las tablas intervinientes entre s, y es la forma de realizar en
SQL la operacin de yuncin entre tablas. En el segundo caso, se puede tambin hacer
referencia en una sentencia subordinada a datos mencionados en la principal, dando lugar a un
tipo de consultas llamadas correlacionadas.

CALIFICACION DE NOMBRES DE COLUMNAS

Como para una tabla los nombres de todas sus columnas son diferentes, en una sentencia SQL
eln la que interviene una sola tabla, basta el nombre de una columna para designarla sin
ambigedad.
Sin embargo, si interviene ms de una tabla en una misma sentencia SQL, puede ocurrir que
algn nombre de columna se repita en ms de una de ellas. En este caso, para referirnos sin
ambigedad a una columna determinada, hay que indicar a qu tabla pertenece. Para ello se
escribe el nombre de la columna precedido del de la tabla y separados por un punto.
As, por ejemplo, el nombre reservas.num_vuelo se refiere a la columna num_vuelo de la tabla
reservas, y partes.num_vuelo a la columna num_vuelo de la tabla partes.
Cuando un nombre de columna se escribe de esta forma, se dice que est calificado por el
nombre de la tabla.

LA CLAUSULA FROM

En ella se puede especificar una lista de nombres de tablas separados por comas.
De esta forma, la siguiente clusula de la sentencia se aplicar al producto cartesiano de las
tablas especificadas en la clusula FROM.
Como en las tablas puede haber nombres de columnas repetidos, si en la sentencia se hace
referencia a alguno de ellos es necesario califacarlo.
Se puede simplificar la operacin de calificacin de nombres de columnas mediante el uso de
nombres locales tambin llamados alias. Estos nombres se asignan a las tablas en una sentencia
y cuyo mbito de uso se restringe a sta. Se definen en la clusula FROM, escribiendo detrs
del nombre de cada tabla el alias que se le quiere asignar. (Cuando se asigna un alias a una
tabla, todas las referencias calificadas a sus columnas deben usar el alias.)
Una tabla puede especificarse ms de una vez en una clusula FROM. En este caso es necesario
asignarle un alias.

Bases de Datos. SQL. Curso 2000-2001

24

OPERACION DE REUNIN (JOIN)


La reunin de dos o ms relaciones se realiza escribiendo los nombres de las tablas que se
desea reunir en la clusula FROM. Si la reunin es de dos relaciones, la clusula WHERE
deber contener la condicin de reunin de las tablas. Cuando esa reunin es por igualdad de
las columnas que relacionan ambas tablas (clave ajena clave principal) es una equireunin,
reunin natural o join. En una sentencia SELECT en la que se utiliza ms de una tabla en la
clusula FROM, pueden referenciarse nombres de cualquiera de las tablas tanto en la clusula
SELECT como en la clusula WHERE.
Ejemplos:
43. Cuntos empleados trabajan en CHICAGO ?
SELECT COUNT(*)
FROM EMP, DEPT
WHERE EMP.DEPTNO = DEPT.DEPTNO
AND LOC = CHICAGO;
----------6
44. Qu empleados trabajan en DALLAS ?
SELECT ENAME
FROM EMP, DEPT
WHERE EMP.DEPTNO = DEPT.DEPTNO
AND LOC = DALLAS;
ENAME
-----SMITH
JONES
SCOTT
ADAMS
FORD

Bases de Datos. SQL. Curso 2000-2001

25

Si hay columnas con el mismo nombre, es necesario calificarlas con el nombre de la tabla para
evitar ambigedades.
45. Nombre de todos los empleados, empleo, departamento y localidad.
SELECT ENAME, JOB, EMP.DEPTNO, LOC
FROM EMP, DEPT
WHERE EMP.DEPTNO = DEPT.DEPTNO;
ENAME
-----SMITH
ALLEN
WARD
JONES
MARTIN
BLAKE
CLARK
SCOTT
KING
TURNER
ADAMS
JAMES
FORD
MILLER

JOB
--------CLERK
SALESMAN
SALESMAN
MANAGER
SALESMAN
MANAGER
MANAGER
ANALYST
PRESIDENT
SALESMAN
CLERK
CLERK
ANALYST
CLERK

DEPTNO
----------20
30
30
20
30
30
10
20
10
30
20
30
20
10

LOC
-------DALLAS
CHICAGO
CHICAGO
DALLAS
CHICAGO
CHICAGO
NEW YORK
DALLAS
NEW YORK
CHICAGO
DALLAS
CHICAGO
DALLAS
NEW YORK

46. Seleccionar el nombre de cada empleado, y el nmero y nombre de su jefe.


SELECT E1.ENAME, E1.MGR, E2.ENAME
FROM EMP E1, EMP E2
WHERE E2.ENO = E1.MGR;
ENAME
-----ADAMS
ALLEN
BLAKE
CLARK
FORD
JAMES
JONES
MARTIN
MILLER
SCOTT
SMITH
TURNER
WARD

MGR
----------7788
7698
7839
7839
7566
7698
7839
7698
7782
7566
7902
7698
7698

ENAME
-----SCOTT
BLAKE
KING
KING
JONES
BLAKE
KING
BLAKE
CLARK
JONES
FORD
BLAKE
BLAKE

Bases de Datos. SQL. Curso 2000-2001

26

47. Mostrar el nombre del empleado, su trabajo, el nombre y el cdigo del departamento
en el que trabaja.
SELECT ENAME, JOB, DNAME, DEPT.DEPTNO
FROM EMP, DEPT
WHERE EMP.DEPTNO = DEPT.DEPTNO;
ENAME
-----SMITH
ALLEN
WARD
JONES
MARTIN
BLAKE
CLARK
SCOTT
KING
TURNER
ADAMS
JAMES
FORD
MILLER

JOB
--------CLERK
SALESMAN
SALESMAN
MANAGER
SALESMAN
MANAGER
MANAGER
ANALYST
PRESIDENT
SALESMAN
CLERK
CLERK
ANALYST
CLERK

DNAME
---------RESEARCH
SALES
SALES
RESEARCH
SALES
SALES
ACCOUNTING
RESEARCH
ACCOUNTING
SALES
RESEARCH
SALES
RESEARCH
ACCOUNTING

DEPTNO
----------20
30
30
20
30
30
10
20
10
30
20
30
20
10

SENTENCIAS SUBORDINADAS
Ya se ha visto al describir el uso de predicados que dentro de una sentencia SELECT pueden
especificarse otras. Se dice entonces que stas son sentencias subordinadas a la primera.
Las sentencias subordinadas pueden especificarse en las clusulas WHERE y HAVING, como
parte de los predicados siguientes:
- Predicados bsicos
- Predicados cuantificados (ANY, SOME, ALL)
- Predicado EXISTS
- Predicado IN
Una sentencia subordinada de otra puede tener a su vez otras sentencias subordinadas a ella.
Llamamos sentencia externa a la primera de todas, la que no es subordinada de ninguna. Una
sentencia es antecedente de otra cuando esta es su subordinada directa o subordinada de sus
subordinadas a cualquier nivel.
A las sentencias subordinadas suele llamrselas anidadas. Puede haber hasta quince niveles de
anidamiento.

CONSULTAS CORRELACIONADAS
En las sentencias anidadas vistas hasta ahora, stas no hacen referencia a columnas de tablas
que no estn en su propia clusula FROM. Esto significa que el resultado de la sentencia
subordinada puede evaluarse independientemente de sus sentencias antecedentes de cualquier
nivel. El SGBDR las evala una sola vez y reemplaza los valores resultantes en el predicado
donde se encuentre.

Bases de Datos. SQL. Curso 2000-2001

27

En las sentencias correlacionadas no ocurre as. Se llaman correlacionadas las sentencias


subordinadas en las que se especifica alguna columna de una tabla mencionada en la clusula
FROM de alguna de sus sentencias antecedentes.
De este forma, una sentencia correlacionada no puede evaluarse independientemente de sus
antecedentes, pues su resultado puede cambiar, segn que filas se consideren en la evaluacin
de stas en cada momento. El SGBD, por tanto, las evaluar mltiples veces.

Predicado EXISTS

Formato:
EXISTS (subselect)

Donde subselect es una sentencia SELECT subordinada que puede tener cualquier nmero de
columnas.
Es "Verdadero" si el resultado de la sentencia SELECT subordinada es una tabla con una o ms
filas. Es "Falso" si es una tabla vaca. No puede tomar el valor "Desconocido".
Ejemplos:
El ejemplo n 23 (Nombres de los empleados que trabajan en Chicago)
SELECT ENAME
FROM EMP
WHERE DEPTNO IN (SELECT DEPTNO
FROM DEPT
WHERE LOC = CHICAGO);
ENAME
-----ALLEN
WARD
MARTIN
BLAKE
TURNER
JAMES
Resuelto mediante el uso del predicado EXISTS:
48. Nombres de los empleados que trabajan en Chicago:
SELECT ENAME
FROM EMP E
WHERE EXISTS (SELECT *
FROM DEPT D
WHERE E.DEPTNO = D.DEPTNO
AND LOC = "CHICAGO");
ENAME
-----ALLEN
WARD
MARTIN
BLAKE
TURNER
JAMES
(6 filas afectadas)

Bases de Datos. SQL. Curso 2000-2001

28

49. Visualice el nmero de los departamentos que tengan ms de tres empleados


asignados.
SELECT DISTINCT DEPTNO
FROM EMP E1
WHERE 3 < (SELECT COUNT (*)
FROM EMP E2
WHERE E1.DEPTNO = E2.DEPTNO);
DEPTNO
----------20
30
50. Listar el nombre de los empleados que ganan menos que sus supervisores.
SELECT ENAME
FROM EMP E1
WHERE SAL < (SELECT SAL
FROM EMP E2
WHERE E2.ENO = E1.MGR);
ENAME
-----SMITH
ALLEN
WARD
JONES
MARTIN
BLAKE
CLARK
TURNER
ADAMS
JAMES
MILLER

Ejercicios:
51. Seleccionar el nombre y fecha de ingreso del empleado que lleva ms tiempo.
SELECT ENAME, HIREDATE
FROM EMP
WHERE HIREDATE = (SELECT MIN (HIREDATE)
FROM EMP);
ENAME HIREDATE
------ ----------SMITH 1980-12-17
52. Mostrar el nombre, el trabajo y el salario de todos los empleados que tienen un
salario superior al salario ms bajo del departamento 30.
SELECT ENAME, JOB, SAL
FROM EMP
WHERE SAL > (SELECT MIN(SAL) FROM EMP WHERE DEPTNO = 30)
ORDER BY 3 DESC;

Bases de Datos. SQL. Curso 2000-2001

29

ENAME
-----KING
SCOTT
FORD
JONES
BLAKE
CLARK
ALLEN
TURNER
MILLER
WARD
MARTIN
ADAMS

JOB
--------PRESIDENT
ANALYST
ANALYST
MANAGER
MANAGER
MANAGER
SALESMAN
SALESMAN
CLERK
SALESMAN
SALESMAN
CLERK

SAL
----------5000
3000
3000
2975
2850
2450
1600
1500
1300
1250
1250
1100

53. Encontrar el ename, dname, job y sal de los empleados que trabajen en el mismo
departamento que TURNER y su salario sea mayor que la media del salario del
departamento 10.
SELECT ENAME, DNAME, JOB, SAL
FROM EMP, DEPT
WHERE EMP.DEPTNO = DEPT.DEPTNO
AND EMP.DEPTNO = (SELECT DEPTNO
FROM EMP
WHERE ENAME = TURNER)
AND SAL > (SELECT AVG(SAL)
FROM EMP
WHERE DEPTNO = 30);
ENAME
-----ALLEN
BLAKE

DNAME
---------SALES
SALES

JOB
--------SALESMAN
MANAGER

SAL
----------1600
2850

54. Indquese si las siguientes sentencias son correctas, si no lo son, indique en qu


consiste el error:
SELECT * FROM EMP
WHERE MGR = NULL;
SELECT * FROM DEPT
WHERE DEPTNO = 20 OR WHERE DEPTNO = 30;
SELECT * FROM EMP
WHERE NOT ENAME LIKE R%
AND SAL BETWEEN 3000 AND 5000;
SELECT * FROM EMP
WHERE SAL < 4000 AND JOB NOT = ANALYST;
SELECT * FROM DEPT
WHERE LOC = DALLAS OR CHICAGO;
55. Listar el nombre, trabajo, departamento, localidad y salario de aquellos empleados
que tengan un salario mayor de 2000 y trabajen en DALLAS o NEW YORK.
SELECT ENAME, JOB, EMP.DEPTNO, LOC, SAL
FROM EMP, DEPT
WHERE EMP.DEPTNO = DEPT.DEPTNO
AND SAL > 2000
AND LOC IN (DALLAS, NEW YORK);

Bases de Datos. SQL. Curso 2000-2001

30

ENAME
-----JONES
CLARK
SCOTT
KING
FORD

JOB
--------MANAGER
MANAGER
ANALYST
PRESIDENT
ANALYST

DEPTNO
----------20
10
20
10
20

LOC
-------DALLAS
NEW YORK
DALLAS
NEW YORK
DALLAS

SAL
----------2975
2450
3000
5000
3000

Bases de Datos. SQL. Curso 2000-2001

31

COMPOSICIN DE CONSULTAS
Clusula UNION [ALL]
La composicin de consultas consiste en fundir el resultado de varias sentencias SELECT
en una nica tabla resultante.
Formato:

SELECT...
FROM...
.
.
.
UNION [ALL]
SELECT...
FROM...
.
.
.
[UNION [ALL]
SELECT...
FROM...
.
.
.
]
Los resultados de la ejecucin de cada una de las sentencias SELECT de la unin se
mostrarn en una nica tabla resultante.
Caractersticas:
Cada una de las consultas es independiente de las dems. En una sentencia SELECT no
puede haber referencias a tablas ni a columnas de otra sentencia SELECT de la unin.
Todas las sentencias SELECT deben tener el mismo nmero de columnas y sus
dominios deben ser compatibles.
Si no se especifica la clusula ALL tras UNION, la tabla resultante no tendr filas
repetidas. Si se especifica UNION ALL, se mostrarn en la tabla resultante todas las
filas de cada una de las sentencias SELECT, incluidas las filas que ya hubieran
resultado de otra sentencia SELECT de la unin.
No pueden realizarse ordenaciones parciales para cada sentencia SELECT. De existir
una clusula ORDER BY, sta debe ser la ltima de la unin y la referencia a la(s)
columna(s) por las que se debe ordenar ha de ser obligatoriamente numrica.
No se puede agrupar la unin. Si se hacen consultas con agrupamiento, los
agrupamientos deben ser para cada consulta de la unin.

Bases de Datos. SQL. Curso 2000-2001

32

Ejemplos:
Obtener los nombres de todas las ciudades que aparecen en la tabla de vuelos, ordenados
alfabticamente.

SELECT origen
FROM vuelos
UNION
SELECT destino
FROM vuelos
ORDER BY 1
Obtener en una sola columna el nombre de todas las ciudades origen de un vuelo y el de las que
son su destino. Una misma ciudad puede aparecer como origen y como destino.

SELECT DISTINCT origen


FROM vuelos
UNION ALL
SELECT DISTINCT destino
FROM vuelos
Obtener en dos columnas, para cada ciudad que es origen, el nmero de vuelos que salen de ella
y luego para cada una que es destino, el nmero de vuelos que recibe.

SELECT origen, COUNT (*)


FROM vuelos
GROUP BY origen
UNION
SELECT destino, COUNT (*)
FROM vuelos
GROUP BY destino

Bases de Datos. SQL. Curso 2000-2001

33

CREACIN DE VISTAS
CREATE VIEW nombre_vista
AS
Sentencia SELECT sin ORDER BY
[WITH CHECK OPTION]
La ejecucin de una sentencia CREATE VIEW crea una tabla vista (una tabla virtual) cuyo
contenido ser el resultado de ejecutar la sentencia SELECT que genera la vista.

Bases de Datos. SQL. Curso 2000-2001

34

INSERCIN, MODIFICACIN Y BORRADO DE


INFORMACIN
Insercin de filas en tablas:
INSERT [INTO] { nombre_tabla | nombre_vista } [(lista columnas)]
{ VALUES (expresin [, expresin ]...) | sentencia_SELECT }
Modificacin de valores en tablas:
UPDATE { nombre_tabla | nombre_vista }
SET nombre_columna1 = { expresin1 | NULL | sentencia_SELECT }
[, nombre_columna2 = { expresin2 | NULL | sentencia_SELECT } ]...
[ WHERE condiciones_de_bsqueda ]
Borrado de filas en tablas:

DELETE [FROM] { nombre_tabla | nombre_vista }


[WHERE condiciones_de_bsqueda ]
Ejemplos:
Crear una tabla con las columnas origen, destino, num_vuelo y distancia, semejantes a las
de la tabla vuelos.

CREATE TABLE vuelos_2 (


num_vuelo char (6)
NOT NULL,
origen
char (15),
destino
char (15)
distancia real
NULL
);
Crear un ndice nico sobre la tabla creada, para la columna num_vuelo.

CREATE UNIQUE INDEX ix_vuelos_2 ON vuelos_2 (num_vuelo);


Insertar en la tabla creada todas las informaciones que hay en la tabla vuelos, de los
realizados desde 'MADRID', 'BARCELONA', 'SEVILLA', 'BILBAO' o 'MALAGA'.

INSERT INTO vuelos_2


SELECT num_vuelo, origen, destino, distancia
FROM vuelos
WHERE origen IN
('MADRID','BARCELONA','SEVILLA','BILBAO','MALAGA');
Insertar en la tabla creada el vuelo IB9999 entre Madrid y Barcelona.

INSERT INTO vuelos_2 (num_vuelo, origen, destino)


VALUES ('IB9999', 'MADRID','BARCELONA');

Bases de Datos. SQL. Curso 2000-2001

35

Modificar el destino del vuelo IB9999, que pasar a ser el del vuelo IB327.

UPDATE vuelos_2
SET destino = (SELECT destino from vuelos
WHERE num_vuelo = 'IB327')
WHERE num_vuelo = 'IB9999';
Modificar, dividiendo por 10, las distancias de los vuelos.

UPDATE vuelos_2
SET distancia = distancia / 10;
Borrar las filas cuya distancia sea mayor que la media de las distancias de los vuelos
realizados por Iberia.

DELETE vuelos_2
WHERE distancia > (SELECT AVG (distancia)
FROM vuelos_2
WHERE num_vuelo LIKE 'IB%');
Modificar la columna distancia dejndola nula para todas las filas.

UPDATE vuelos_2
SET distancia = NULL;
Borrar los vuelos con origen en Madrid.

DELETE vuelos_2
WHERE origen = 'MADRID';
Borra todas las filas.

DELETE vuelos_2;
Borrar el ndice y la tabla creados.

DROP INDEX vuelos_2.ix_vuelos_2;


DROP TABLE vuelos_2;

Bases de Datos. SQL. Curso 2000-2001

36

INSERCION, MODIFICACION Y BORRADO DE INFORMACION EN


VISTAS
Crear una tabla con las columnas origen, destino, distancia y num_vuelo semejantes a las
de la tabla vuelos, permitiendo que la distancia sea nula.

CREATE TABLE vuelos_2 (


num_vuelo
char (6)
origen
char (15)
destino
char (15)
distancia
integer
);

NOT NULL,
NOT NULL,
NOT NULL,
NULL

Crear un ndice nico sobre la tabla creada, para la columna num_vuelo.

CREATE UNIQUE INDEX ix_v2 ON vuelos_2 (num_vuelo);


Crear una vista con las columnas num_vuelo y origen de la tabla creada para los vuelos de
Iberia.

CREATE VIEW vista_1


AS
SELECT num_vuelo, origen
FROM vuelos_2
WHERE num_vuelo LIKE 'IB%';
Crear una vista con las columnas origen, num_vuelo y destino de la tabla creada para los vuelos
con origen o destino en Madrid.

CREATE VIEW vista_2


AS
SELECT num_vuelo, origen, destino
FROM vuelos_2
WHERE origen = 'MADRID' OR destino = "MADRID";
Intentar insertar una fila con cada una de las vistas creadas, dando valores a cada una de las
columnas de la vista empleada para insertar.

INSERT INTO vista_1


VALUES ('IB0000', 'MADRID');
La sentencia anterior produce un error puesto que la columna destino en la tabla vuelos_2,
sobre la que est definida la vista, no admite nulos.

INSERT INTO vista_2


VALUES ('IB0001', 'MADRID','BARCELONA');
La sentencia anterior inserta una fila en la tabla vuelos_2 (a travs de la vista vista_2). La
columna distancia queda con valor NULL

Bases de Datos. SQL. Curso 2000-2001

37

Clusula WITH CHECK OPTION:

La sentencia:

INSERT INTO vista_2


VALUES ('IB0002', 'BARCELONA', 'SEVILLA');
Inserta en la tabla vuelos_2 la fila:
('IB0002', 'BARCELONA', 'SEVILLA', NULL)
pero al consultar la vista vista_2 esa fila insertada en la vista no aparece como resultado.
La clusula WITH CHECK OPTION evita que se inserten en la vista filas que no cumplen
su definicin. Por lo tanto, si la vista vista_2 se hubiese creado con esa clusula la
sentencia anterior habra fallado.
Borrar todas las filas.

DELETE vuelos_2;
Borra todas las filas de la vista
Borrar las vistas, el ndice y la tabla.

DROP
DROP
DROP
DROP

VIEW vista_1;
VIEW vista_2;
INDEX vuelos_2.ix_v2;
TABLE vuelos_2;

Bases de Datos. SQL. Curso 2000-2001

38

SEGURIDAD
Sentencias GRANT y REVOKE
GRANT {ALL | lista_permisos}
ON {nombre_tabla [(lista_columnas)] | nombre_vista
[(lista_columnas)] }
TO {PUBLIC | lista_usuarios }
[WITH GRANT OPTION]
REVOKE {ALL | lista_permisos}
ON {nombre_tabla [(lista_columnas)] | nombre_vista
[(lista_columnas)] }
FROM {PUBLIC | lista_usuarios }
[CASCADE]
lista_permisos:

SELECT, INSERT, UPDATE, DELETE

Bases de Datos. SQL. Curso 2000-2001

39

SQL EMBEBIDO.
1 Introduccin.

Concepto de lenguaje anfitrin.

Introduccin de cdigo SQL en un programa escrito en otro lenguaje de


programacin que se denomina anfitrin.

Qu SQL se puede insertar?

Toda sentencia SQL puede utilizarse como SQL embebido, al contrario no.

Se puede intercalar DML y DDL (lo ms frecuente es DML).

1.a Preliminares.
Delimitadores:

Hay marcas de inicio y de fin que suelen ser EXEC SQL y END EXEC o
simplemente ;

EXEC SQL <Sentencia SQL> ;


Tipos de sentencias SQL embebido.

Declarativas

Preparacin del sistema para la ejecucin de cdigo SQL.

Ejecutables

Operaciones SQL.

Aparecen en cualquier lugar donde podra aparecer una sentencia ejecutable del
lenguaje anfitrin.
Referencia a variables anfitrionas

Sintaxis.

:<variable anfitriona>

Definicin:

Variables del lenguaje anfitrin declaradas en el programa anfitrin utilizadas


dentro de sentencias SQL.

Uso.

Expresiones:

Donde pueda aparecer un valor individual en una expresin SQL.

En las clusulas de SQL embebido

INTO :<variable anfitriona>


FETCH <resto de clusula fetch>
Declaraciones

Necesidad de declarar todas las tablas utilizadas

Sintaxis

DECLARE TABLE <campos de la tabla>


rea de comunicacin SGBD / programa

Concepto:
Bases de Datos. SQL. Curso 2000-2001

40

Nombre:

La ejecucin de cualquier sentencia ejecutable SQL dentro del programa origina


que en el rea de comunicacin se escriba informacin relativa al estado del
sistema tras la ejecucin de la sentencia.

Se llama SQLCA (SQL Communication Area )

Sintaxis y uso:

Necesidad de incorporacin en el programa mediante su inclusin

EXEC SQL INCLUDE SQLCA ;

Recomendacin de su consulta tras cada sentencia ejecutable SQL, la


componente SQLCODE de SQLCA informa del resultado de la operacin:

SQLCODE = 0 indica que se ejecut correctamente.

SQLCODE < 0 indica que algn error se produjo en el intento de ejecucin de


la sentencia.

SQLCODE > 0 indica alguna situacin de excepcin en le ejecucin de la


sentencia que no impidi que se terminase correctamente. Por ejemplo, tras
una SELECT, la condicin SQLCODE = 100 significa que la consulta no
devolvi ningn dato.

Tipos de datos

Hay correspondencia entre los tipos de dato SQL y los del lenguaje anfitrin.

Numricos y alfanumricos con numricos y alfanumricos.

Tipos hora y fecha de SQL con alfanumricos del lenguaje anfitrin.

No unicidad de nombres.

Las variables anfitrionas y los campos de las tablas pueden coincidir en nombre.

Divisin de las operaciones SQL.

Las sentencias ejecutables SQL son divididas en dos tipos:

Las que devuelven una sola tupla o registro: similares a SQL visto.

Las que devuelven ms de una tupla: necesitan cursores.

2 Operaciones sin cursores.


Operaciones SQL que pueden realizarse sin cursores

La siguiente lista:

SELECT con resultado de, como mucho, una tupla o registro.

UPDATE

DELETE

INSERT

Ejemplos y sintaxis

Las diferencias sintcticas con el SQL estudiado hasta el momento se subrayan


en los siguientes ejemplos

Bases de Datos. SQL. Curso 2000-2001

41

EXEC SQL
SELECT

SITUACION, CIUDAD

INTO :RANGO, :CIUDAD

FROM S
WHERE S# = :DADO
;
EXEC SQL
UPDATE S
SET SITUACION = SITUACION + :AUMENTO
WHERE CIUDAD = LONDRES
;
EXEC SQL
DELETE
FROM JSP
WHERE :CIUDAD =
(SELECT CIUDAD
FROM S
WHERE S.S# = SPJ.S#)
;
EXEC SQL
INSERT
INTO P (P#, PNOMBRE, PESO )
VALUES ( :NUMPAR, :NOMPAR, :PESOPAR)
;
3 Operaciones con cursores
3.a Situacin.

Necesidad de utilizar cursores cuando la operacin (por ejemplo consulta -SELECT)


implica ms de un registro (por ejemplo devuelve ms de una tupla) .

3.b Solucin : uso de cursores.


Concepto:

El cursor es un apuntador al registro actual, se posiciona inicialmente en el


primero y puede ser avanzado al siguiente cuando se haya terminado el tratamiento
sobre el registro al que apunta.

Uso:

Los cursores deben ser

Declarados para una operacin de las siguientes:

Select

Update

Delete

Abierto.

Usado y avanzado.

Bases de Datos. SQL. Curso 2000-2001

42

Cerrado.

Uso con select.


Declaracin

Sintaxis:

EXEC SQL
DECLARE <nombre cursor> CURSOR
FOR <sentencia SELECT>
;

Ejemplo

EXEC SQL
DECLARE X CURSOR FOR
SELECT S#, SNOMBRE, SITUACION
FROM S
WHERE CIUDAD = :Y
;
Apertura

Sintaxis

EXEC SQL OPEN <nombre cursor> ;

Ejemplo

EXEC SQL OPEN X;


Uso y avance

Sintaxis

EXEC SQL
FETCH <nombre cursor>
INTO <variables anfitrionas>
;

Ejemplo

EXEC SQL FETCH X INTO :S#, :SNOMBRE, :SITACION;


Cierre

Sintaxis:

EXEC SQL CLOSE <nombre cursor>;

Ejemplo:

EXEC SQL CLOSE X;


Uso con update , delete .
Uso

Slo se menciona la posibilidad de utilizar cursores tambin para actualizar y


borrar siempre que se declaren para ello.

Se muestra slo sintaxis y ejemplos para el uso de un cursor para actualizar o


borrar la posicin sobre la que se encuentra posicionado.

Sintaxis para update.

EXEC SQL
UPDATE <nombre tabla>
SET <pares de actualizacin>
WHERE CURRENT OF <nombre cursor> ;

Bases de Datos. SQL. Curso 2000-2001

43

Ejemplo para update.

EXEC SQL
UPDATE S
SET SITUACION = SITUACION + :AUMENTO
WHERE CURRENT OF X
;

Sintaxis para delete.

EXEC SQL
DELETE FROM <nombre tabla>
WHERE CURRENT OF <nombre cursor>
;

Ejemplo para delete.

EXEC SQL
DELETE FROM s
WHERE CURRENT OF X
;

Bases de Datos. SQL. Curso 2000-2001

44

Das könnte Ihnen auch gefallen