Anda di halaman 1dari 19

Lenguaje SQL

Santiago Faci
santi@rastafurbi.org

6 de Enero de 2004

Contents
1 Introducción a SQL 3
1.1 Introducción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.2 Tipos de consultas SQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.3 Tipos de datos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3

2 Creación, Supresión y Modificación de tablas 4


2.1 Creación de tablas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
2.2 Restricciones en CREATE TABLE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
2.3 Supresión de tablas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.4 Modificación de tablas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
2.4.1 Adición de restricciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
2.4.2 Borrado de restricciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9

3 Creación y uso de vistas 10


3.1 Creación de vistas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
3.2 Borrado de vistas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
3.3 Operaciones sobre vistas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11

4 Manipulación de datos, INSERT, UPDATE Y DELETE 11


4.1 Inserción de datos. Orden INSERT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
4.2 Modificación. UPDATE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
4.3 Eliminación de filas. DELETE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
4.4 ROLLBACK, COMMIT y AUTOCOMMIT . . . . . . . . . . . . . . . . . . . . . . . . 12

5 Consulta de los datos 13


5.1 Sentencia SELECT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
5.2 Operadores aritméticos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
5.3 Operadores de comparación de cadenas de caracteres . . . . . . . . . . . . . . . . . . . 14
5.4 NULL Y NOT NULL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
5.5 Comprobaciones con conjuntos de valores . . . . . . . . . . . . . . . . . . . . . . . . . 15

1
CONTENTS 2

6 Funciones 16
6.1 Introducción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
6.2 Funciones aritméticas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
6.3 Funciones de cadenas de caracteres . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16

7 Cláusulas avanzadas de selección 17


7.1 Agrupación de elementos, GROUP BY y HAVING . . . . . . . . . . . . . . . . . . . . 17
7.2 Combinación externa (OUTER JOINS) . . . . . . . . . . . . . . . . . . . . . . . . . . 17
7.3 Union, intersect y minus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
1 INTRODUCCIÓN A SQL 3

1 Introducción a SQL
1.1 Introducción
El lenguaje SQL (Structured Query Language) permite la comunicaci ón con el sistema de gestión de la
base de datos. Actualmente es el lenguaje estándar para la gestión de bases de datos relacionales para
ANSI (American National Standard Institute) e ISO (International Standarization Organization). Entre
las principales caracterı́sticas de este lenguaje destaca que es un lenguaje para todo tipo de usuarios
ya que el usuario que lo emplea especifica qué quiere, pero no dónde ni cómo, de manera que permite
realizar cualquier consulta de datos.

1.2 Tipos de consultas SQL


Dependiendo de las tareas que realizan, podemos clasificar las sentencias SQL en dos tipos:

• Sentencias DDL (Data Description Language : Lenguaje de Descripci ón de Datos). Se trata del
lenguaje con el que se crea y mantiene la estructura de nuestra base de datos. Con él se pueden
realizar las siguientes tareas:

– Crear un objeto en la base de datos (CREATE).


– Eliminar un objeto de la base de datos (DROP).
– Modificar un objeto de la base de datos (ALTER).
– Conceder privilegios sobre un objeto de la base de datos (GRANT).
– Eliminar privilegios sobre un objeto de la base de datos (REVOKE).

• Sentencias DML (Data Manipulation Language : Lenguaje de Manipulaci ón de Datos). Sirve para
manipular los datos contenidos en la base de datos.

– Insertar datos en una tabla (INSERT).


– Eliminar datos de una tabla (DELETE).
– Actualizar datos de una tabla (UPDATE).
– Recuperar datos de una tabla (SELECT).

1.3 Tipos de datos


Tipo CHAR, VARCHAR2
Este tipo de datos permite almacenar cadenas de caracteres. El tipo CHAR almacena caracteres de lon-
gitud fija entre 1 y 255 caracteres. La longitud de la cadena se define entre paréntesis. Por ejemplo
CADENA CHAR(15). El tipo VARCHAR2 almacena cadenas de caracteres de longitud variable. La
longitud máxima que se puede definir es de 2.000 caracteres. Se declara de la misma manera que el tipo
CHAR. La principal diferencia entre el tipo CHAR y el tipo VARCHAR2 es que si se declara una cadena de
caracteres del primer tipo y no se emplean toda la longitud definida, se rellenará con blancos a la derecha
hasta llegar a la longitud definida. Por el contrario, si se declara de tipo VARCHAR2 no se rellenar á con
blancos a la derecha en el caso de que la variable almacenada sea de menor longitud que la definida. En
ambos casos no es posible introducir cadenas de mayor longitud que la definida.
2 CREACIÓN, SUPRESIÓN Y MODIFICACIÓN DE TABLAS 4

Tipo NUMBER
Con este tipo se almacenan datos numéricos, enteros y decimales, con o sin signo. Entre paréntesis se
indicará los dı́gitos de precisión que se desee para el número declarado y el número de dı́gitos a la derecha
del punto decimal. Por ejemplo SALARIO NUMBER(10,2) declara un tipo NUMBER de 10 dı́gitos de
precisión de los cuales 2 irán a la derecha del punto decimal.

Tipo LONG
Este tipo almacena cadenas de caracteres de longitud variable de hasta 2 gigabytes de informaci ón. Se
usa para almacenar textos muy grandes. Existen una serie de restricciones asociadas a este tipo de dato:

• Sólo se puede definir una columna LONG por tabla.

• No puede aparecer restricciones.

• No se permite su utilización en ciertas cláusulas.

Ejemplo: TEXTO LONG

Tipo DATE
Este tipo se usa para almacenar información de fechas y horas. Cada tipo DATE almacena la siguiente
información: Siglo/Año/Mes/Dı́a/Hora/Minutos/Segundos. Por defecto, el formato utilizado por este tipo
de dato es: DD/MM/YY.
Ejemplo: FECHA DATE

2 Creación, Supresión y Modificación de tablas


2.1 Creación de tablas
Para crear una tabla utilizamos la orden CREATE TABLE, cuyo formato es:

CREATE TABLE <nombre_tabla>


{
<columna1> <tipo_dato> [NOT NULL],
<columna2> <tipo_dato> [NOT NULL],
........................
}

Donde:

• nombre tabla será el nombre de la tabla.

• columna1, columna2, . . . son los nombres de las columnas que contendrá cada fila.

• tipo dato indica el tipo de dato (VARCHAR, NUMBER, . . .) de cada columna.

Ejemplo:
2 CREACIÓN, SUPRESIÓN Y MODIFICACIÓN DE TABLAS 5

CREATE TABLE ALUMNOS


{
NUMERO_MATRICULA NUMBER(6) NOT NULL,
NOMBRE VARCHAR(15) NOT NULL,
FECHA_NACIMIENTO DATE,
DIRECCION VARCHAR(10),
LOCALIDAD VARCHAR(10)
}

2.2 Restricciones en CREATE TABLE


La orden CREATE TABLE permite definir diferentes tipos de restricciones sobre una tabla: claves pri-
marias, claves ajenas, obligatoriedad, valores por defecto y verificaci ón de condiciones. Para definir estas
restricciones se utiliza la cláusula CONSTRAINT. Una sola cláusula CONSTRAINT puede restringir una
sola columna o grupos de columnas de una misma tabla. Y existen dos formas de definir las restricciones:
como parte de la definición de las columnas o al final, una vez especificadas todas las columnas. El for-
mato de la cláusula CONSTRAINT en la orden CREATE TABLE es como sigue:

CREATE TABLE <nombre_tabla>


{
<columna1> <tipo_dato>
[CONSTRAINT <nombre_restricción>]
[NOT NULL]
[UNIQUE]
[PRIMARY KEY]
[DEFAULT <valor>]
[REFERENCES <nombre_tabla> [(<columna1>[,<columna2>])]
[ON DELETE CASCADE]]
[CHECK <condición>],
<columna2> <tipo_dato>
.......................
}

Ejemplo:

CREATE TABLE EMPLEADO


{
NOMBRE VARCHAR(25) PRIMARY KEY,
EDAD NUMBER CHECK (EDAD BETWEEN 18 AND 35),
COD_PROVINCIA NUMBER(2) REFERENCES PROVINCIAS
ON DELETE CASCADE
}

CREATE TABLE EMPLEADO


{
NOMBRE VARCHAR(25),
EDAD NUMBER,
COD_PROVINCIA NUMBER(2),
2 CREACIÓN, SUPRESIÓN Y MODIFICACIÓN DE TABLAS 6

CONSTRAINT PK_EMPLEADO PRIMARY KEY (NOMBRE),


CONSTRAINT CK_EDAD CHECK (EDAD BETWEEN 18 AND 35),
CONSTRAINT FK_EMPLEADO FOREIGN KEY (COD_PROVINCIA)
REFERENCES PROVINCIAS ON DELETE CASCADE
}

*Nota* : El nombre de las restricciones es opcional.

Clave primaria. La restricción PRIMARY KEY


Una clave primaria dentro de una tabla es una columna o conjunto de columnas cuyo valor identifica
unı́vocamente a cada fila. Debe ser única, no nula y obligatoria. Como máximo podemos definir una
clave primaria por tabla. Para definir una clave primaria en una tabla usamos la restricci ón PRIMARY
KEY.

Claves ajenas. La restricción FOREIGN KEY


Una clave ajena está formada por una o varias columnas que están asociadas a una clave primaria de otra
o de la misma tabla. Se pueden definir tantas claves ajenas como sea preciso. El valor de la columna o
columnas que son clave ajena debe ser: NULL o el valor de la clave primaria de la tabla a la que son
referenciadas (integridad referencial). A la hora de crear la tabla, mediante la cláusula REFERENCES
indicamos la tabla a la cual remite la clave ajena y de forma que se cree antes la tabla a la cual se hace
referencia ya que sino se producirá un error al no existir todavı́a la clave a la cual intentamos hacer refer-
encia. Al eliminar, deberemos borrar primero la tabla EMPLEADO y, después, la tabla PROVINCIAS. En
caso contrario, nos darı́a un error ya que las claves ajenas de EMPLEADO estarı́an haciendo referencia a
algún campo de la tabla PROVINCIAS. Si se desea eliminar alguna provincia de la tabla PROVINCIAS
y que las filas correspondientes de la tabla EMPLEADO con esa provincia sean eliminadas, se a ñadirá la
cláusula ON DELETE CASCADE en la opción REFERENCES.

Obligatoriedad. La restricción NOT NULL


Esta restricción asociada a una columna indica que no puede tener valores nulos, es decir, que debe tener
obligatoriamente algún valor. En caso contrario, se produce un error.

Valores por defecto. La restricción DEFAULT


En el momento de crear una tabla, podemos asignar valores por defecto a las columnas de la misma. Ası́,
no aparecerán los errores asociados a la violación de una restricción NOT NULL.
Ejemplo:

..................
FECHA DATE DEFAULT SYSDATE,
NOMBRE VARCHAR(20) DEFAULT ’No definido’,
.......................
2 CREACIÓN, SUPRESIÓN Y MODIFICACIÓN DE TABLAS 7

Verificación de condiciones. La restricción CHECK


Muchas columnas de tablas requieren valores limitados dentro de un rango o el cumplimiento de ciertas
condiciones. Con una restricción de verificación de condiciones se puede expresar una condici ón que ha
de cumplir para todas y cada una de las filas de la tabla.
Ejemplo:

....................
NOMBRE VARCHAR(20),
EDAD NUMBER,
CURSO NUMBER,
CONSTRAINTS COMP_EDAD CHECK (EDAD BETWEEN 5 AND 20),
CONSTRAINTS NOMBRE_MAYUS CHECK (NOMBRE=UPPER(NOMBRE)),
CONSTRAINTS COMP_CURSO CHECK (CURSO IN (1,2,3))
...................

Nota: La restricción NOT NULL es similar a: CHECK (<nombre columna> IS NOT NULL).

Valor único. La restricción UNIQUE


La restricción UNIQUE evita valores repetidos en una misma columna. Puede contener una o varias
columnas. Es similar a una restricción PRIMARY KEY, salvo que son posibles varias columnas UNIQUE
definidas en una tabla. Admite valores NULL al igual que en PRIMARY KEY, cuando se define una
restricción UNIQUE se crea un ı́ndice automáticamente.
Ejemplo:

....................
NOMBRE VARCHAR(20) UNIQUE,
...................

Ejemplo II:

...................
NOMBRE VARCHAR(20),
CONSTRAINTS NOMBRE_UNI UNIQUE (NOMBRE),
...................

2.3 Supresión de tablas


La orden DROP TABLE suprime una tabla de la base de datos. Cada usuario puede borrar sus propias
tablas. El formato de dicha orden es:

DROP TABLE <nombre_tabla> [CASCADE CONSTRAINTS]

Tendremos que tener cuidado con intentar borrar tablas cuyas claves principales est én referenciadas
como claves ajenas en otras tablas, tal y como ocurrı́a con la tabla EMPLEADO y PROVINCIAS en
un ejemplo anterior. Si intentásemos suprimir la tabla PROVINCIAS nos darı́a un error debido a que
podrı́an existir claves ajenas haciendo referencia a esas claves primarias, es decir, existe una restricci ón
de clave ajena en la tabla EMPLEADO que referencia a la clave primaria de la tabla PROVINCIAS.
2 CREACIÓN, SUPRESIÓN Y MODIFICACIÓN DE TABLAS 8

Entonces, para borrar esta tabla hay que usar la opción CASCADE CONSTRAINTS, que suprimirá todas
las restricciones de integridad que se refieran a claves de la tabla borrada.
Ejemplo:

DROP TABLE PROVINCIAS CASCADE CONSTRAINTS

2.4 Modificación de tablas


Se modifican las tablas de dos formas: cambiando las definici ón de una columna (MODIFY) o añadiendo
una columna a una tabla existente (ADD). La orden con la que se modifica una tabla es ALTER TABLE,
cuyo formato es:

ALTER TABLE <nombre_tabla>


[ ADD (<columna1> [,<columna2> . . .)] ]
[ MODIFY (<columna1> [,<columna2> . . .)] ]
[ ADD CONSTRAINTS <restricción> ]
[ DROP CONSTRAINTS <restricción> ]

• ADD añade una columna o más al final de una tabla.

• MODIFY modifica una tabla o más columnas existentes en la tabla.

• ADD CONSTRAINTS añade una restricción a la definición de la tabla.

• DROP CONSTRAINTS elimina una restricción de la tabla.

Ejemplo:
Podemos suponer una tabla ALUMNO con unas determinadas columnas, y que a dicha tabla quere-
mos añadir nuevas columnas. Previamente a esto y una vez creada la tabla ALUMNO podemos visualizar
su descripción 1 antes y después de la modificación para ver lo sucedido. Añadimos dos columnas EDAD
y CURSO a la tabla ya existente ALUMNO.

ALTER TABLE ALUMNO ADD ( EDAD NUMBER, CURSO NUMBER)

Ahora queremos añadir la restricción NOT NULL a la columna CURSO:

ALTER TABLE ALUMNO MODIFY ( CURSO NUMBER NOT NULL )

Pero a la hora de añadir columnas a una tabla hay que tener en cuenta diversos factores:

• Si la columna no está definida como NOT NULL, se le puede añadir en cualquier momento.

• Si la columna está definida como NOT NULL, se puede añadir la columna sin la restricción NOT
NULL, después se da valor a la columna para todas sus filas 2 y finalmente se modifica la columna
a NOT NULL.

También podemos encontrarnos con el caso de que queramos modificar la longitud de la columna
NOMBRE de la tabla ALUMNO. Queremos cambiar su tamaño de 10 a 3, por ejemplo:
1
DESC ALUMNO
2
UPDATE ALUMNO SET CURSO=0
2 CREACIÓN, SUPRESIÓN Y MODIFICACIÓN DE TABLAS 9

ALTER TABLE ALUMNO MODIFY ( NOMBRE VARCHAR(3) )

En este caso nos encontramos con un error ya que no es posible disminuir la longitud de una columna
a no ser que este vacı́a. En el caso de que queramos aumentar su longitud no nos encontraremos con ese
problema. En general, al modificar una columna de una tabla se han de tener en cuenta varios aspectos:

• Se puede aumentar la longitud de una columna en cualquier momento.

• Si la columna es NULL en todas sus filas se puede disminuir la longitud y modificar el tipo de
dato.

• La opción MODIFY . . . NOT NULL sólo será posible cuando la tabla no contenga ninguna
fila con valor nulo en la columna que se modifica.

2.4.1 Adición de restricciones


Con la orden ALTER TABLE se añaden restricciones a una tabla:

ALTER TABLE <nombre_tabla>


ADD CONSTRAINT <nombre_restricción> . . .

Ejemplo:

ALTER TABLE ALUMNO ADD CONSTRAINT NOMBRE_UNICO UNIQUE ( NOMBRE )

En general, a la hora de modificar restricciones, nos podemos encontrar con casos parecidos a los
que nos encontrábamos al modificar las columnas de las tablas ya creadas. Por ejemplo, si quiero a ñadir
una restricción a una columna de la manera siguiente:

ALTER TABLE EMPLEADO ADD CONSTRAINT SUELDO_ALTO CHECK ( SUELDO > 100000 )

Podemos encontrarnos con un error si existe alguna fila de la tabla EMPLEADO en la que el valor de
la columna SUELDO no cumpla esa nueva restricción. Si quisiéramos añadir la restricción deberı́amos
hacer a todos los valores de la columna SUELDO mayores del valor que se indique en la restricci ón en
este caso.

2.4.2 Borrado de restricciones


De la misma forma que se pueden añadir restricciones a una tabla, también es posible eliminarlas. Se
realiza con la clausula DROP CONSTRAINT de la orden ALTER TABLE cuyo formato es:

ALTER TABLE <nombre_tabla>


DROP CONSTRAINT <nombre_restricción>

Ejemplo:

ALTER TABLE ALUMNO DROP CONSTRAINT NOMBRE_UNICO


3 CREACIÓN Y USO DE VISTAS 10

3 Creación y uso de vistas


3.1 Creación de vistas
A veces, para obtener datos de varias tablas hemos de construir una sentencia SELECT compleja y, si
en otro momento necesitamos realizar esa misma consulta, tenemos que construir de nuevo la sentencia
SELECT anterior. Serı́a bastante cómodo obtener los datos de una consulta compleja con una simple
sentencia SELECT. La vistas solucionan ese problema. Mediante una consulta simple de una vista cabe
la posibilidad de obtener datos de una consulta compleja. Una vista es una tabla l ógica que permite
acceder a la información de una o varias tablas. No contiene información por si misma, sino que su
información está basada en la que contiene una o varias tablas, llamadas tablas base. Si se suprime una
tabla, su vista asociada se invalida. Las vistas tienen la misma estructura que una tabla: filas y columnas
y se tratan de forma muy semejante. El formato para crear una vista es el siguiente:

CREATE VIEW <nombre_vista>


[( columna1 [,( <columna2) ]]
AS <consulta>

Donde:
• nombre vista es el nombre de la vista.
• columna1, columna2, . . . son los nombres de las columnas que contendrá la vista. Si no se ponen,
se asumirán los nombres de las columnas que devuelva la consulta.
• AS consulta determinará las columnas y tablas que contendrá la vista.
Ejemplo: Vamos a crear por ejemplo una vista que contenga parte de las columnas de una tabla
EMPLEADO:

CREATE VIEW DEP_30


AS SELECT APELLIDO, OFICIO, SALARIO FROM EMPLEADO WHERE NRO_DEPT=30

De esta manera, obtenemos una vista que contendrá los datos de las columnas APELLIDO, OFICIO
y SALARIO de las filas cuyo NRO DEPT sea igual a 30.
Podrı́amos haberla creado dando otros nombres a las columnas:

CREATE VIEW DEP_30 (APELL, OFIC, SAL)


AS SELECT APELLIDO, OFICIO, SALARIO FROM EMPLEADO WHERE NRO_DEPT=30

Podemos visualizar los nombres de las vistas creadas con sus textos de la siguiente manera:

SELECT VIEW_NAME, TEXT FROM USER_VIEWS

3.2 Borrado de vistas


Es posible borrar las vistas con la orden DROP VIEW:

DROP VIEW <nombre_vista>

Ejemplo:

DROP VIEW DEP_30


4 MANIPULACIÓN DE DATOS, INSERT, UPDATE Y DELETE 11

3.3 Operaciones sobre vistas


Las operaciones que se pueden realizar sobre vistas son las mismas que las que se pueden llevar a cabo
sobre las tablas. Aquı́ sólo trataremos las consultas sobre vistas.

• Consulta Se realiza del mismo modo que la consulta de una tabla.

SELECT <columna1>, <columna2>, . . .


FROM <nombre_vista> WHERE <condición>

Ejemplo: Podemos consultar los apellidos de los ENCARGADOS de la vista DEP 30 creada anteri-
ormente de la siguiente manera:

SELECT APELL
FROM DEP_30
WHERE OFIC=’ENCARGADO’

4 Manipulación de datos, INSERT, UPDATE Y DELETE


4.1 Inserción de datos. Orden INSERT
Con la orden INSERT se insertan filas de datos en una tabla. El formato es el siguiente:

INSERT INTO <nombre_tabla> [ ( <columna1>, <columna2> , . . . ) ]


VALUES ( <valor1>, <valor2>, . . . )

Donde:

• nombre tabla es el nombre de la tabla donde se insertarán los datos.

• columna1, columna2, . . . son los nombres de las columnas donde se introducen los valores. Si no
se especifica ninguna columna, se consideran todas las columnas de la tabla.

• valor1, valor2, . . . son los valores que se asignarán a cada una de las columnas. Dichos valores
deberán coincidir con el tipo de dato de la columna que le corresponda. Si no se especifica la
columna, ésta tomará valor NULL siempre que sea posible. En caso de que no se especifique lista
de columnas se deberá dar valor a todas.

Ejemplo:

PROFESORES(COD_CENTRO, DNI, APELLIDOS, ESPECIALIDAD)

INSERT INTO PROFESORES (APELLIDOS, ESPECIALIDAD, COD_CENTRO)


VALUES (’apellido1 apellido2, nombre’, ’INFORMATICA’, 23)
4 MANIPULACIÓN DE DATOS, INSERT, UPDATE Y DELETE 12

4.2 Modificación. UPDATE


Una vez introducidos los valores de las columnas en una tabla determinada, podemos actualizar los
mismos con la orden UPDATE. Su formato es el siguiente:

UPDATE <nombre_tabla>
SET <columna1> = <valor1>, <columna2> = <valor2> . . .
WHERE <condición>

Donde:

• nombre tabla es la tabla donde voy a actualizar.


• SET indica que columnas se van a actualizar y con que valores.
• WHERE selecciona las filas que se actualizarán. Si no se indica, la actualización afectará a todas
las filas de la tabla.

Ejemplo:
UPDATE PROFESORES
SET COD_CENTRO=24
WHERE APELLIDOS=’apellido1 apellido2, nombre’

4.3 Eliminación de filas. DELETE


Para eliminar una o varias filas se usa la orden DELETE. En este caso, la cláusula WHERE es fundamental
para eliminar sólo aquellas filas que deseemos. Si no se especifica ninguna cláusula WHERE, se borrarán
todas las filas de la tabla. Su formato es el siguiente:

DELETE [ FROM ] <nombre_tabla> WHERE <condición>

Ejemplo:
DELETE PROFESORES WHERE COD_CENTRO=24

DELETE FROM PROFESORES <--> DELETE PROFESORES

4.4 ROLLBACK, COMMIT y AUTOCOMMIT


Mediante la orden ROLLBACK, podemos dar marcha atrás a una tarea realizada en el caso de que
hayamos metido la pata (Querı́amos eliminar alguna fila pero nos olvidamos de la cláusula WHERE y
acabamos borrando todas), siempre y cuando no la hayamos validado mediante la orden COMMIT. Mien-
tras trabajamos con nuestra base de datos, insertando, actualizando o borrando datos de nuestras tablas,
los cambios que realicemos no se aplicarán sobre la base de datos hasta que no hagamos un COMMIT.
Es decir, con esta orden validamos todos los cambios realizados hasta el momento. Existe una forma de
validación automática de manera que no se hace necesario validar las tareas:
SHOW AUTOCOMMIT
autocommit ON | OFF

SET AUTOCOMMIT ON | OFF


5 CONSULTA DE LOS DATOS 13

5 Consulta de los datos


Para recuperar la información o, lo que es lo mismo, realizar consultas a la base de datos, utilizaremos
la sentencia SELECT. El usuario puede emplear esta sentencia con el nivel de complejidad que desee
indicando qué es lo que desea obtener pero no como. A través de esta sentencia de consulta se puede
obtener cualquier unidad de datos, todos los datos, cualquier subconjunto de datos o cualquier conjunto
de subconjuntos de datos.

5.1 Sentencia SELECT


El formato de la sentencia SELECT es el siguiente:

SELECT [ ALL | DISTINCT ]


[ <expr_columna1>, <expr_columna2>,. . . | * ]
FROM [ <nombre_tabla1>, <nombre_tabla2>, . . . ]
[ WHERE <condición> ]
[ ORDER BY <expr_columna> [ DESC | ASC ] . . .]

Donde expr columna puede ser una columna de una tabla, una constante, una expresi ón aritmética,
una función o varias funciones anidadas.

FROM
Especifica la tabla o lista de tablas de las que se recuperan los datos.
Ejemplo: Queremos consultar los nombres de alumnos y su nota de la tabla ALUMNOS:

SELECT NOMBRE, NOTA FROM ALUMNOS

Es posible asociar un nombre diferente a las tablas mediante lo que se conoce como alias.
Ejemplo: Damos el nombre A a la tabla ALUMNOS

SELECT A.NOMBRE, A.NOTA FROM ALUMNOS A

Esto nos podrá ser de gran utilidad cuando trabajemos con consultas de tablas diferentes en las que
coincidan los nombres de algunas columnas entre ellas.

WHERE
Obtiene las filas que cumplen la expresión que se indica. La complejidad de la expresión que acompaña
a esta cláusula es prácticamente ilimitada, existen multitud de combinaciones diferentes. El forma de
la condición es: <expresión> <operador> <expresión> Las expresiones pueden ser una
constante, una expresión aritmética, un valor nulo o un nombre de columna. Los operadores de com-
paración puede ser los siguientes: =, >, <, >=, <=, !=, <>, IN, NOT IN, BETWEEN,
NOT BETWEEN, LIKE. Además, se puede construir condiciones múltiples usando los operadores
lógicos AND, OR Y NOT. Se pueden usar paréntesis si se desea forzar algún orden de evaluación:
Ejemplos:

WHERE NOTA = 5
WHERE (NOTA = 10) AND (CURSO = 1)
WHERE (NOTA IS NULL) AND (UPPER (NOMBRE) = ’PEDRO’)
5 CONSULTA DE LOS DATOS 14

ORDER BY
Especifica el criterio de clasificación del resultado de la consulta. ASC especifica ordenaci ón ascendente
y DESC descendente. Es posible anidar los criterios de manera que el de la izquierda ser á el principal:
SELECT *
FROM ALUMNOS
ORDER BY NOMBRE DESC, CURSO DESC

ALL
Recupera todas las filas, aunque estén repetidas.

DISTINCT
Sólo recupera las filas que son distintas.
Ejemplo: Queremos listar todos los nombres diferentes que tienen nuestros alumnos (Obviamente
siempre habrá alguien con el mismo nombre, de manera que queremos ver la variedad, no queremos ver
los repetidos).
SELECT DISTINCT NOMBRE FROM ALUMNOS

5.2 Operadores aritméticos


Los operadores aritméticos sirven para construir expresiones con constantes, valores de columnas o fun-
ciones de valores de columnas. Son los siguientes: +, -, * y /

5.3 Operadores de comparación de cadenas de caracteres


Para comparar cadenas de caracteres podemos, por ejemplo, emplear el operador =, tal y como hacı́amos
en un ejemplo de este manual:
SELECT APELLIDO FROM EMPLEADO WHERE OFICIO = ’ENCARGADO’
Pero este operador se nos queda corto cuando queremos hacer comparaciones del tipo : ”Obtener los
datos de los alumnos cuyo nombre empieza por S” u ”Obtener los datos de los alumnos cuyo nombre
contenga la palabra Pérez”. Para este tipo de comparaciones existe el operador LIKE, que permite utilizar
los siguiente caracteres especiales en las cadenas de comparaci ón:
• ’%’ Es el comodı́n. Representa cualquier cadena de 0 ó más caracteres.
• ’ ’ Es un marcador de posición. Representa un carácter cualquiera.
Este operador se utilizará en la cláusula WHERE de la siguiente manera:
WHERE <columna> LIKE <cadena_comparación>
Ejemplo:
LIKE ’DIRECTOR’ La cadena ’Director’
LIKE ’M%’ Cualquier cadena que empiece por M
LIKE ’%A%’ Cualquier cadena que contenga la letra A
LIKE ’__Z’ Cualquier cadena de 3 caracteres que acabe en Z
LIKE ’_A%’ Cualquier cadena cuyo segunda caracter es una A
5 CONSULTA DE LOS DATOS 15

5.4 NULL Y NOT NULL


Se dice que una columna de una fila es NULL cuando está completamente vacı́a. Para comprobar si el
valor de una columna es nulo empleamos la expresión: <columna> IS NULL. Si queremos saber si
el valor de la columna no es nulo emplearemos <columna> IS NOT NULL.
Ejemplo:

SELECT NOMBRE
FROM ALUMNOS
WHERE CURSO IS NULL

5.5 Comprobaciones con conjuntos de valores


Hasta este momento todas las comprobaciones que se han visto comparaban una columna con una ex-
presión o valor. Pero también podemos comparar una columna o una expresi ón con una lista de valores
utilizando los operadores IN y BETWEEN.

IN
El operador IN nos permite comprobar si una expresión pertenece o no a un conjunto de valores, haciendo
ası́ posible la realización de comparaciones con múltiples valores. Su formato es el siguiente:

<expresión> [NOT] IN (lista de valores separados por comas)

Ejemplo:
Consultar los apellidos de los empleados cuyo número de departamento sea 10 ó 30.

SELECT APELLIDO
FROM EMPLEADOS
WHERE DPTO_NO IN (10,30)

Consultar los apellidos de los empleados cuyo número de departamento sea ni 10 ni 30.

SELECT APELLIDO
FROM EMPLEADOS
WHERE DPTO_NO NOT IN (10,30)

BETWEEN
El operador BETWEEN comprueba si un valor está comprendido o no dentro e un rango de valores, desde
un valor inicial a un valor final. Su formato es el siguiente:

<expresión> [NOT] BETWEEN <valor_inicial> AND <valor_final>

Ejemplo:
Obtener el apellido de los empleados cuyo salario está comprendido entre 150000 y 200000:

SELECT APELLIDO, SALARIO


FROM EMPLEADOS
WHERE SALARIO BETWEEN 150000 AND 200000
6 FUNCIONES 16

6 Funciones
6.1 Introducción
Las funciones se usan dentro de expresiones y actúan con los valores de las columnas, variables o con-
stantes. Por ejemplo, poner en mayúscula una cadena, contar el número de datos de una columna, etc . .
. Se utilizan en cláusulas SELECT, WHERE, ORDER BY. Es posible el anidamiento de funciones.

6.2 Funciones aritméticas


• ABS(n) Devuelve el valor absoluto de n.

• POWER(n,exp) Devuelve la potencia de un número.

• AVG(n) Calcula el valor medio de n, ignorando los valores nulos.

SELECT AVG(EDAD) FROM EMPLEADOS

• COUNT(* — expresión) Cuenta el número de veces que ’expresión’ evalúa algún dato.

SELECT COUNT(*) FROM EMPLEADOS

• MAX(expresión) Calcula el valor máximo de ’expresión’.

SELECT MAX(SALARIO) FROM EMPLEADOS

• MIN(expresión) Calcula el valor mı́nimo de ’expresión’.

SELECT MIN(SALARIO) FROM EMPLEADOS

• SUM(expresión) Calcula la suma de valores de ’expresión’.

SELECT SUM(SALARIO) FROM EMPLEADOS

• DISTINCT En las funciones de grupo se pueden indicar DISTINCT y ALL como argumentos.
Su uso más normal es en COUNT

SELECT COUNT(OFICIO) FROM EMPLEADOS


SELECT COUNT(DISTINCT OFICIO) FROM EMPLEADOS
SELECT SUM

6.3 Funciones de cadenas de caracteres


• CONCAT(cadena1,cadena2) Devuelve una cadena resultante de concatenar ’cadena1’ y ’ca-
dena2’.

• LOWER(ch) Devuelve la cadena ’ch’ con todas sus letras convertidas a min úsculas.

• UPPER(ch) Devuelve la cadena ’ch’ con todas sus letras convertidas a may úsculas.
7 CLÁUSULAS AVANZADAS DE SELECCIÓN 17

7 Cláusulas avanzadas de selección


7.1 Agrupación de elementos, GROUP BY y HAVING
La sentencia GROUP BY permite llevar a cabo un agrupamiento por las columnas especificadas y en el
orden especificado. Este es el formato:

SELECT . . .
FROM . . .
GROUP BY <columna1>, <columna2>, <columna3> . . .
HAVING <condición>
ORDER BY . . .

Los datos seleccionados en la sentencia SELECT que lleva el GROUP BY deben ser una constante,
una función de grupo (SUM, COUNT, AVG . . .) o una columna expresada en el GROUP BY. Adem ás,
si se selecciona más de un conjunto de filas, GROUP BY controlas que las filas de la tabla original sean
agrupadas en una temporal. De la misma manera que existen condiciones de b úsqueda con la cláusula
WHERE para filas individuales, podemos imponer condiciones de b úsqueda para grupos de filas con
HAVING. La cláusula HAVING se emplea para controlar que conjuntos de filas visualizar. Se eval úa
sobre la tabla devuelta por GROUP BY y no puede existir sin la cláusula anterior. HAVING es como la
cláusula WHERE pero trabaja con grupos de filas, es decir, pregunta a los resultados de las funciones de
grupo lo cual WHERE no puede hacer.
Ejemplo:
i. Queremos visualizar el número de empleados que hay en cada departamento de la tabla EMPLEADOS.
ii. Queremos visualizar los departamentos con más de 4 empleados.

i) SELECT NRO_DEPT, COUNT(*)


FROM EMPLEADOS
GROUP BY NRO_DEPT

ii) SELECT NRO_DEPT, COUNT(*)


FROM EMPLEADOS
GROUP BY NRO_DEPT
HAVING COUNT(*) > 4

En los ejemplos anteriores, si además queremos ordenar la salida por número de empleados podemos
utilizar una orden ORDER BY de la siguiente manera:

SELECT NRO_DEPT, COUNT(*)


FROM EMPLEADOS
GROUP BY NRO_DEPT
HAVING COUNT(*) > 4
ORDER BY COUNT(*) DESC

7.2 Combinación externa (OUTER JOINS)


En puntos anteriores se ha visto el concepto de combinaci ón de tablas. A veces nos puede interesar
seleccionar algunas filas de una tabla aunque éstas no tengan ninguna correspondencia con las filas de la
otra tabla con la que se combina. Esto es lo que se llama OUTER JOIN. Su formato es el siguiente:
7 CLÁUSULAS AVANZADAS DE SELECCIÓN 18

SELECT tabla1.colum1, tabla1.colum2, tabla2.colum1, tabla2.colum2


FROM tabla1, tabla2
WHERE tabla1.colum1 = tabla2.colum1(+)

Ası́, se seleccionarán todas las filas de la tabla1 aunque no tenga correspondencia con las filas de
la tabla2. Se denota con el sı́mbolo (+), tal y como se puede observar, detrás de la columna de la tabla
tabla2 en la cláusula WHERE.

7.3 Union, intersect y minus


Los operadores UNION, INTERSECT y MINUS son operadores de conjuntos. Los conjuntos ser án
las filas resultantes de cualquier sentencia SELECT válida. Para entender el uso de estos operadores
supongamos un ejemplo: Tenemos dos listas de centros de estudio a los que tenemos que entregar un
pedido de libros. Dependiendo de lo que queramos hacer, podremos enviar el pedido a todos los centros
de las dos listas (UNION), a los centros que están en las dos listas (INTERSECT) o a los que están en una
lista pero no en la otra (MINUS). El formato de una sentencia SELECT que incluye a estos operadores
es el siguiente:

SELECT . . .
FROM . . .
WHERE . . .

<operador>

SELECT . . .
FROM . . .
WHERE . . .

• UNION combina los resultados de las dos consultas. Si existen filas duplicadas, s ólo aparecerán
una vez.

• UNION ALL combina los resultados de las dos consultas. Usando este operador aparecer án las
filas duplicadas.

• INTERSECT devuelve las filas que coinciden en las dos consultas. Las filas duplicadas se elimi-
nan.

• MINUS devuelve las filas que están en la primera consulta y no están en la segunda. Las filas
duplicadas de la primera consulta se eliminarán antes de comenzar con la comparación con la otra
consulta.

Existen una serie de reglas para estos operadores que conviene conocer:

• Las columnas de las dos consultas se relacionan en orden, de izquierda a derecha.

• Los nombres de las columnas de la primera consulta no tienen porque coincidir con los de la
segunda consulta.

• Los SELECT tienen que tener el mismo número de columnas.


7 CLÁUSULAS AVANZADAS DE SELECCIÓN 19

• Los tipos de datos deben coincidir, aunque no la longitud de los mismos.

Por último, añadir que estos operadores se pueden encadenar de la siguiente manera:

(SELECT NOMBRE FROM ALUMNOS UNION SELECT NOMBRE FROM ANTIGUOS)


MINUS SELECT NOMBRE FROM NUEVOS