Sunteți pe pagina 1din 60

MOTOR DE BASE DE DATOS ORACLE

DOCENTE: DAIRO RODRIGUEZ BLANCO


ANLISIS Y PROGRAMACION DE COMPUTADORES

Asignatura: Motor de Base de Datos Oracle

Docente: Dairo Rodrguez Blanco

Estudiante:_______________________________________

Codigo:_____________

Fecha: _________________________

Motor de Base de Datos Pgina 1


Nota: Material tomado de Aulaclic.es Derechos Reservados
MOTOR DE BASE DE DATOS ORACLE
DOCENTE: DAIRO RODRIGUEZ BLANCO
ANLISIS Y PROGRAMACION DE COMPUTADORES

Introduccin al SQL. Transact-SQL


Conceptos bsicos de SQL
SQL (Structured Query Language), Lenguaje Estructurado de Consulta es el lenguaje utilizado
para definir, controlar y acceder a los datos almacenados en una base de datos relacional.
Como ejemplos de sistemas gestores de bases de datos que utilizan SQL podemos citar DB2,
SQL Server, Oracle, MySql, Sybase, PostgreSQL o Access.
El SQL es un lenguaje universal que se emplea en cualquier sistema gestor de bases de datos
relacional. Tiene un estndar definido, a partir del cual cada sistema gestor ha desarrollado su
versin propia.
En SQL Server la versin de SQL que se utiliza se llama TRANSACT-SQL.
EL SQL en principio es un lenguaje orientado nicamente a la definicin y al acceso a los datos
por lo que no se puede considerar como un lenguaje de programacin como tal ya que no
incluye funcionalidades como son estructuras condicionales, bucles, formateo de la salida, etc.
(aunque veremos que esto est evolucionando).
Se puede ejecutar directamente en modo interactivo, pero tambin se suele emplear
embebido en programas escritos en lenguajes de programacin convencionales. En estos
programas se mezclan las instrucciones del propio lenguaje (denominado anfitrin) con
llamadas a procedimientos de acceso a la base de datos que utilizan el SQL como lenguaje de
acceso. Como por ejemplo en Visual Basic, Java, C#, PHP .NET, etc.
Las instrucciones SQL se clasifican segn su propsito en tres grupos:
El DDL (Data Description Language) Lenguaje de Descripcin de Datos.
El DCL (Data Control Language) Lenguaje de Control de Datos.
El DML (Data Manipulation Language) Lenguaje de Manipulacin de Datos.
El DDL, es la parte del SQL dedicada a la definicin de la base de datos, consta de sentencias
para definir la estructura de la base de datos, permiten crear la base de datos, crear, modificar
o eliminar la estructura de las tablas, crear ndices, definir reglas de validacin de datos,
relaciones entre las tablas, etc. Permite definir gran parte del nivel interno de la base de datos.
Por este motivo estas sentencias sern utilizadas normalmente por el administrador de la
base de datos.
El DCL (Data Control Language) se compone de instrucciones que permiten:
Ejercer un control sobre los datos tal como la asignacin de privilegios de acceso a los
datos (GRANT/REVOKE).
La gestin de transacciones (COMMIT/ROLLBACK).
Una transaccin se puede definir como un conjunto de acciones que se tienen que realizar
todas o ninguna para preservar la integridad de la base de datos.
Por ejemplo supongamos que tenemos una base de datos para las reservas de avin. Cuando
un usuario pide reservar una plaza en un determinado vuelo, el sistema tiene que comprobar
que queden plazas libres, si quedan plazas reservar la que quiera el usuario generando un
nuevo billete y marcando la plaza como ocupada. Aqu tenemos un proceso que consta de dos
operaciones de actualizacin de la base de datos (crear una nueva fila en la tabla de billetes y
actualizar la plaza reservada en el vuelo, ponindola como ocupada) estas dos operaciones se
tienen que ejecutar o todas o ninguna, si despus de crear el billete no se actualiza la plaza
porque se cae el sistema, por ejemplo, la base de datos quedara en un estado inconsistente ya
que la plaza constara como libre cuando realmente habra un billete emitido para esta plaza.

Motor de Base de Datos Pgina 2


Nota: Material tomado de Aulaclic.es Derechos Reservados
MOTOR DE BASE DE DATOS ORACLE
DOCENTE: DAIRO RODRIGUEZ BLANCO
ANLISIS Y PROGRAMACION DE COMPUTADORES

En este caso el sistema tiene el mecanismo de transacciones para evitar este error. Las
operaciones se incluyen las dos en una misma transaccin y as el sistema sabe que las tiene
que ejecutar las dos, si por lo que sea no se pueden ejecutar las dos, se encarga de deshacer
los cambios que se hubiesen producido para no ejecutar ninguna.
Las instrucciones que gestionan las autorizaciones sern utilizadas normalmente por
el administrador mientras que las otras, referentes a proceso de transacciones sern utilizadas
tambin por los programadores.
No todos los sistemas disponen de ellas.
El DML se compone de las instrucciones para el manejo de los datos, para insertar nuevos
datos, modificar datos existentes, para eliminar datos y la ms utilizada, para recuperar datos
de la base de datos. Veremos que una sola instruccin de recuperacin de datos es tan
potente que permite recuperar datos de varias tablas a la vez, realizar clculos sobre estos
datos y obtener resmenes.
El DML interacta con el nivel externo de la base de datos por lo que sus instrucciones son
muy parecidas, por no decir casi idnticas, de un sistema a otro, el usuario slo indica lo que
quiere recuperar no cmo se tiene que recuperar, no influye el cmo estn almacenados los
datos.
Es el lenguaje que utilizan los programadores y los usuarios de la base de datos.
A lo largo del curso se explicarn cada una de las formas de explotacin de la base de datos.
Dependiendo de tu perfil profesional (programador o administrador) o de tu inters personal
te resultar ms til un bloque u otro.
Como hemos dicho, el sistema gestor de base de datos SQL-Server 2005 utiliza su propia
versin del lenguaje SQL, el TRANSACT-SQL.
TRANSACT-SQL es un lenguaje muy potente que nos permite definir casi cualquier tarea que
queramos efectuar sobre la base de datos. En este tema veremos que TRANSACT-SQL va ms
all de un lenguaje SQL cualquiera ya que incluye caractersticas propias de cualquier lenguaje
de programacin, caractersticas que nos permiten definir la lgica necesaria para el
tratamiento de la informacin:
Tipos de datos.
Definicin de variables.
Estructuras de control de flujo.
Gestin de excepciones.
Funciones predefinidas.
Sin embargo no permite:
Crear interfaces de usuario.
Crear aplicaciones ejecutables, sino elementos que en algn momento llegarn al
servidor de datos y sern ejecutados.
Debido a estas restricciones se emplea generalmente para crear procedimientos almacenados,
triggers y funciones de usuario.
Puede ser utilizado como cualquier SQL como lenguaje embebido en aplicaciones
desarrolladas en otros lenguajes de programacin como Visual Basic, C, Java, etc. Y por
supuesto los lenguajes incluidos en la plataforma .NET.
Tambin lo podremos ejecutar directamente de manera interactiva, por ejemplo desde el
editor de consultas de SSMS (SQL Server Management Studio) el entorno de gestin que ya
conocemos. Esta es la forma en que lo utilizaremos nosotros.
Motor de Base de Datos Pgina 3
Nota: Material tomado de Aulaclic.es Derechos Reservados
MOTOR DE BASE DE DATOS ORACLE
DOCENTE: DAIRO RODRIGUEZ BLANCO
ANLISIS Y PROGRAMACION DE COMPUTADORES

Caractersticas generales del lenguaje Transact-SQL


El lenguaje SQL se cre con la finalidad de ser un lenguaje muy potente y a la vez muy fcil de
utilizar, se ha conseguido en gran medida ya que con una sola frase (instruccin) podemos
recuperar datos complejos (por ejemplo datos que se encuentran en varias tablas,
combinndolos, calculando resmenes), y utilizando un lenguaje muy cercano al lenguaje
hablado (suponiendo que hablamos ingls, claro!).
Por ejemplo:
SELECT codigo, nombre FROM Clientes WHERE localidad=Valencia;
Esta instruccin nos permite SELECCIONAR el cdigo y nombre DE los Clientes CUYA localidad
sea Valencia.
La sencillez tambin radica en que lo que indicamos es lo que queremos obtener, no el cmo
lo tenemos que obtener, de eso se encargar el sistema automticamente.
Las sentencias SQL adems siguen todas el mismo patrn:
Empiezan por un verbo que indica la accin a realizar,
completado por el objeto sobre el cual queremos realizar la accin,
seguido de una serie de clusulas (unas obligatorias, otras opcionales) que completan
la frase, y proporcionan ms detalles acerca de lo que se quiere hacer.
Si sabemos algo de ingls nos ser ms fcil interpretar a la primera lo que quiere decir la
instruccin, y de lo contrario, como el nmero de palabras que se emplean es muy reducido,
enseguida nos las aprenderemos.
Por ejemplo en el DDL (acciones sobre la definicin de la base de datos), tenemos 3 verbos
bsicos:
CREATE (Crear)
DROP (Eliminar)
ALTER (Modificar)
Completados por el tipo de objeto sobre el que actan y el objeto concreto:
CREATE DATABASE mibase .......;
Permite crear una base de datos llamada mibase, a continuacin escribiremos las dems
clusulas que completarn la accin, en este caso dnde se almacenar la base de datos,
cunto ocupar, etc...
CREATE TABLE mitabla (.....);
Permite crear una nueva tabla llamada mitabla, entre parntesis completaremos la accin
indicando la definicin de las columnas de la tabla.
CREATE INDEX miindex...;
Lo mismo para crear un ndice (a que lo habais adivinado?).
DROP DATABASE mibase;
Permite borrar, eliminar la base de datos mibase.
DROP TABLE mitabla;
Elimina la tabla mitabla.
ALTER TABLE mitabla.....;
Permite modificar la definicin de la tabla mitabla.
En el DML (acciones sobre los datos almacenados) utilizaremos los verbos:
INSERT (Crear, es decir, insertar una nueva fila de datos)
DELETE (Eliminar filas de datos)
Motor de Base de Datos Pgina 4
Nota: Material tomado de Aulaclic.es Derechos Reservados
MOTOR DE BASE DE DATOS ORACLE
DOCENTE: DAIRO RODRIGUEZ BLANCO
ANLISIS Y PROGRAMACION DE COMPUTADORES

UPDATE (Modificar filas de datos)


SELECT (Seleccionar, obtener)
Por ejemplo:
INSERT INTO mitabla ..... Inserta nuevas filas en mitabla
DELETE FROM mitabla Eliminar filas de mitabla
UPDATE mitabla ....... Actualiza filas de mitabla
Como ejemplo de clusula dentro de una instruccin tenemos:
SELECT codigo, nombre
FROM Clientes
WHERE localidad=Valencia;
En esta sentencia nos aparecen dos clusulas, la clusula FROM que nos permite indicar de
dnde hay que coger los datos y la clusula WHERE que permite indicar una condicin de
seleccin.
Otra caracterstica de una sentencia SQL es que acaba con un punto y coma (;)
originalmente ste era obligatorio y serva para indicar el fin de la instruccin, pero ahora se
puede omitir, aunque se recomienda su uso.
En una sentencia utilizaremos palabras reservadas (las fijas del lenguaje), y nombres de
objetos y variables (identificadores).
Las palabras reservadas no se pueden utilizar para otro propsito, por ejemplo una tabla no se
puede llamar FROM, y los nombres (los identificadores) siguen las reglas detalladas en el punto
siguiente.
Nombres cualificados. En ocasiones deberemos utilizar nombres cualificados, por ejemplo
cuando se escribe un nombre de tabla, SQL presupone que se est refiriendo a una de las
tablas de la base de datos activa, si queremos hacer referencia a una tabla de otra base de
datos utilizamos su nombre cualificado nombrebasedatos.nombredeesquema.nombretabla,
utilizamos el punto para separar el nombre del objeto y el nombre de su contenedor.
O por ejemplo si en una consulta cuyo origen son dos tablas, queremos hacer referencia a un
campo y ese nombre de campo es un nombre de campo en las dos tablas, pues utilizaremos su
nombre cualificado nombretabla.nombrecampo.
El valor NULL.
Puesto que una base de datos es un modelo de una situacin del mundo real, ciertos datos
pueden inevitablemente faltar, ser desconocidos o no ser aplicables, esto se debe de indicar
de alguna manera especial para no confundirlo con un valor conocido pero que sea cero por
ejemplo, SQL tiene para tal efecto el valor NULL que indica precisamente la ausencia de valor.
Por ejemplo: no es lo mismo que el alumno no tenga nota a que tenga la nota cero, esto
afectara tambin a todos los clculos que se pueden realizar sobre la columna nota.

Motor de Base de Datos Pgina 5


Nota: Material tomado de Aulaclic.es Derechos Reservados
MOTOR DE BASE DE DATOS ORACLE
DOCENTE: DAIRO RODRIGUEZ BLANCO
ANLISIS Y PROGRAMACION DE COMPUTADORES

REGLAS DE FORMATO DE LOS IDENTIFICADORES


Los identificadores son los nombres de los objetos de la base de datos. Cualquier elemento de
Microsoft SQL Server 2005 puede tener un identificador: servidores, bases de datos, tablas,
vistas, columnas, ndices, desencadenadores, procedimientos, restricciones, reglas, etc.
Las reglas de formato de los identificadores normales dependen del nivel de compatibilidad de
la base de datos, que se estableca con el parmetro sp_dbcmptlevel pero que ahora Microsoft
aconseja no utilizar ya que desaparecer en versiones posteriores en vez de eso se tiene que
utilizar la clusula SET COMPATIBILITY_LEVEL de la instruccin ALTER TABLE. Cuando el nivel de
compatibilidad es 90, (el asignado por defecto) se aplican las reglas siguientes para los
nombres de los identificadores:
No puede ser una palabra reservada.
El nombre debe tener entre 1 y 128 caracteres, excepto para algunos tipos de objetos
en los que el nmero es ms limitado.
El nombre debe empezar por:
o Una letra, como aparece definida por el estndar Unicode 3.2. La definicin
Unicode de letras incluye los caracteres latinos de la "a" a la "z" y de la "A" a la
"Z".
o El carcter de subrayado ( _ ), arroba ( @ ) o nmero ( # ).
Ciertos smbolos al principio de un identificador tienen un significado especial en SQL
Server. Un identificador que empieza con el signo de arroba indica un parmetro o una
variable local. Un identificador que empieza con el signo de nmero indica una tabla o
procedimiento temporal. Un identificador que empieza con un signo de nmero doble
(##) indica un objeto temporal global.
Algunas funciones de Transact-SQL tienen nombres que empiezan con un doble signo
de arroba (@@). Para evitar confusiones con estas funciones, se recomienda no
utilizar nombres que empiecen con @@.
No se permiten los caracteres especiales o los espacios incrustados.
Si queremos utilizar un nombre que no siga estas reglas, normalmente para poder incluir
espacios en blanco, lo tenemos que escribir encerrado entre corchetes [ ] (tambin se pueden
utilizar las comillas pero recomendamos utilizar los corchetes).

TIPOS DE DATOS
En SQL Server 2005, cada columna, expresin, variable y parmetro est asociado a un tipo de
datos.
Un tipo de datos, realmente define el conjunto de valores vlidos para los campos definidos de
ese tipo. Indica si el campo puede contener: datos numricos, de caracteres, moneda, fecha y
hora, etc.
SQL Server proporciona un conjunto de tipos de datos del sistema que define todos los tipos
de datos que pueden utilizarse. Tambin podemos definir nuestros propios tipos de datos en
Transact-SQL o Microsoft .NET Framework.
Los tipos de datos ms utilizados son:
Los numricos: int, decimal, money
Los de fecha y hora: datetime
Y las cadenas de caracteres: varchar

Motor de Base de Datos Pgina 6


Nota: Material tomado de Aulaclic.es Derechos Reservados
MOTOR DE BASE DE DATOS ORACLE
DOCENTE: DAIRO RODRIGUEZ BLANCO
ANLISIS Y PROGRAMACION DE COMPUTADORES

LAS CONSTANTES
Una constante es un valor especfico o un smbolo que representa un valor de dato especfico.
El formato de las constantes depende del tipo de datos del valor que representan. En este
apartado veremos las ms utilizadas.
Las constantes numricas se escriben mediante una cadena de nmeros, con la
consideracin de que el separador decimal es un punto, no una coma, y que si se trata
de un valor monetario deberemos incluir la moneda al inicio de la constante. Por
ejemplo: 85.90 y85.90, el primero sera un valor decimal y el segundo un
valor money. De forma predeterminada, los valores sern positivos. Para indicar lo
contrario escribimos el signo - al principio.
Las constantes de fecha y hora van entre comillas simples y con un formato de fecha y
hora adecuado. Por ejemplo: '03/10/90'.
Y las constantes en cadenas de caracteres van entre comillas simples. Por
ejemplo: 'Juan Garca Lpez'.
Para indicar valores negativos y positivos aadimos el prefijo + o - segn sea el valor positivo o
negativo. Sin prefijo se entiende que el valor es positivo.

LAS EXPRESIONES
Una expresin es una combinacin de smbolos y operadores que el motor de base de datos
de SQL Server evala para obtener un nico valor. Una expresin simple puede ser una sola
constante, variable, columna o funcin escalar. Los operadores se pueden usar para combinar
dos o ms expresiones simples y formar una expresin compleja.

Dos expresiones pueden combinarse mediante un operador si ambas tienen tipos de datos
admitidos por el operador y se cumple al menos una de estas condiciones:
Las expresiones tienen el mismo tipo de datos.
El tipo de datos de menor prioridad se puede convertir implcitamente al tipo de datos
de mayor prioridad.
La funcin CAST puede convertir explcitamente el tipo de datos con menor prioridad
al tipo de datos con mayor prioridad o a un tipo de datos intermedio que pueda
convertirse implcitamente al tipo de datos con la mayor prioridad.
Tipos de operadores:
- Operadores numricos:
suma +
resta -
multiplicacin *
divisin /
mdulo
%
(resto de una divisin)
- Operadores bit a bit: realizan manipulaciones de bits entre dos expresiones de cualquiera de
los tipos de datos de la categora del tipo de datos entero.

Motor de Base de Datos Pgina 7


Nota: Material tomado de Aulaclic.es Derechos Reservados
MOTOR DE BASE DE DATOS ORACLE
DOCENTE: DAIRO RODRIGUEZ BLANCO
ANLISIS Y PROGRAMACION DE COMPUTADORES

AND &
OR |
OR exclusivo ^
- Operadores de comparacin:
Igual a =
Mayor que >
Menor que <
Mayor o igual que >=
Menor o igual que <=
Distinto de <>
No es igual a !=
No menor que !<
No mayor que !>
- Operadores lgicos:
Aqu slo los nombraremos ya que en el tema de consultas simples los veremos en detalle.
ALL IN
AND LIKE
ANY NOT
BETWEEN OR
EXISTS SOME
- Operadores de cadenas:
Concatenacin +
Resultados de la expresin
- Si se combinan dos expresiones mediante operadores de comparacin o lgicos, el tipo de
datos resultante es booleano y el valor es uno de los siguientes: TRUE, FALSE o UNKNOWN.
- Cuando dos expresiones se combinan mediante operadores aritmticos, bit a bit o de cadena,
el operador determina el tipo de datos resultante.
Las expresiones complejas formadas por varios smbolos y operadores se evalan como un
resultado formado por un solo valor. El tipo de datos, intercalacin, precisin y valor de la
expresin resultante se determina al combinar las expresiones componentes de dos en dos,
hasta que se alcanza un resultado final. La prioridad de los operadores de la expresin define
la secuencia en que se combinan las expresiones.

Motor de Base de Datos Pgina 8


Nota: Material tomado de Aulaclic.es Derechos Reservados
MOTOR DE BASE DE DATOS ORACLE
DOCENTE: DAIRO RODRIGUEZ BLANCO
ANLISIS Y PROGRAMACION DE COMPUTADORES

FUNCIONES
SQL Server 2005 proporciona numerosas funciones integradas y permite crear funciones
definidas por el usuario.
Existen diferentes tipos de funciones:
Funciones de conjuntos de filas: devuelven un objeto que se puede utilizar, en
instrucciones Transact-SQL, en lugar de una referencia a una tabla.
Funciones de agregado (tambin llamadas funciones de columna): Operan sobre una
coleccin de valores y devuelven un solo valor de resumen. Por ejemplo, la funcin
de suma sobre la columna importe para conocer el importe total: SUM(importe)
Funciones de categora: Devuelven un valor de categora para cada fila de un conjunto
de filas, por ejemplo devuelve el nmero de la fila, el ranking de la fila en una
determinada ordenacin, etc.
Funciones escalares: Operan sobre un valor y despus devuelven otro valor. Son las
funciones que estamos acostumbrados a utilizar. Las funciones escalares se clasifican
segn el tipo de datos de sus operandos

LAS VARIABLES
En Transact-SQL podemos definir variables, que sern de un tipo de datos determinado, como
tipos de datos podemos utilizar los propios de la base de datos SQL-SERVER, pero tambin
podemos utilizar tipos propios del lenguaje que no pueden ser utilizados en DDL. El tipo Cursor
y el tipo Table son dos de estos tipos.
Las variables se definen utilizando la instruccin DECLARE con el siguiente formato:
DECLARE @nbvariable tipo
El nombre de la variable debe empezar por el smbolo @, este smbolo hace que SQL
interprete el nombre como un nombre de variable y no un nombre de objeto de la base de
datos.
Por ejemplo: DECLARE @empleados INT
Con esto hemos definido la variable @empleados de tipo entero.
Para asignar un valor a una variable, la asignacin se realiza con la palabra SELECT y el signo
igual con el formato:
SELECT @nbvariable = valor
El valor puede ser cualquier valor constante, otro nombre de variable, una expresin vlida o
algo ms potente, parte de una sentencia SELECT de SQL.
Por ejemplo:
SELECT @empleados = 0;
SELECT @empleados = @otra * 100;
SELECT @EMPLEADOS = COUNT(numemp) FROM empleados;
El valor almacenado en la variable se puede visualizar mediante la orden PRINT. o SELECT
PRINT @nbvariable o SELECT @nbvariable
El valor almacenado en la variable se visualizar en la pestaa de resultados. Tambin se
puede usar para escribir mensajes:
PRINT 'Este es el mensaje'
Otros elementos del lenguaje

Motor de Base de Datos Pgina 9


Nota: Material tomado de Aulaclic.es Derechos Reservados
MOTOR DE BASE DE DATOS ORACLE
DOCENTE: DAIRO RODRIGUEZ BLANCO
ANLISIS Y PROGRAMACION DE COMPUTADORES

Comentarios. Como en cualquier otro lenguaje de programacin, debemos utilizar


comentarios destinados a facilitar la legibilidad del cdigo. En SQL se insertan comentarios con
los signos:
/* Esto es un comentario
/* */ Varias lneas
en varias lneas */
-- Una nica lnea -- Esto es un comentario en una nica lnea.
USE. Cambia el contexto de la base de datos al de la base de datos especificada.
USE nbBaseDeDatos
Hace que la base de datos activa pase a ser la base de datos indicada en la instruccin, las
consultas que se ejecuten a continuacin se harn sobre tablas de esa base de datos si no se
indica lo contrario. Es una instruccin til para asegurarnos de que la consulta se ejecuta sobre
la base de datos correcta.
GO
GO no es una instruccin Transact-SQL, sino un comando reconocido por las
utilidades sqlcmd y osql, as como por el Editor de cdigo de SQL Server Management Studio.
Las utilidades de SQL Server interpretan GO como una seal de que deben enviar el lote actual
de instrucciones Transact-SQL a una instancia de SQL Server. El lote actual de instrucciones
est formado por todas las instrucciones especficadas desde el ltimo comando GO o desde el
comienzo de la sesin o script si se trata del primer comando GO.
Por ejemplo si queremos crear una consulta para crear una base de datos y sus tablas, despus
del CREATE DATABASE; tenemos que poner GO antes del primer CREATE TABLE para que el
sistema efecte la primera operacin y la base de datos est creada antes de ejecutar el
primer CREATE TABLE.
BEGIN...END
Encierra un conjunto de instrucciones Transact-SQL de forma que estas instrucciones formen
un bloque de instrucciones.

Motor de Base de Datos Pgina 10


Nota: Material tomado de Aulaclic.es Derechos Reservados
MOTOR DE BASE DE DATOS ORACLE
DOCENTE: DAIRO RODRIGUEZ BLANCO
ANLISIS Y PROGRAMACION DE COMPUTADORES

CONSULTAS SIMPLES
Introduccin
Vamos a empezar por la instruccin que ms se utiliza en SQL, la sentencia SELECT. La
sentencia SELECT es, con diferencia, la ms compleja y potente de las sentencias SQL, con ella
podemos recuperar datos de una o ms tablas, seleccionar ciertos registros e incluso obtener
resmenes de los datos almacenados en la base de datos. Es tan compleja que la estudiaremos
a lo largo de varias unidades didcticas incorporando poco a poco nuevas funcionalidades.
El resultado de una SELECT es una tabla lgica que alberga las filas resultantes de la ejecucin
de la sentencia.
La sintaxis completa es la siguiente:
SELECT sentencia::=[WITH <expresion_tabla_comun> [,...n]]
<expresion_consulta>
[ORDER BY {expression_columna|posicion_columna [ASC|DESC] }
[ ,...n ]]
[COMPUTE
{{AVG|COUNT|MAX|MIN|SUM} (expression)}[ ,...n ] [BY expression[ ,...n ]]
]
[<FOR clausula_for>]
[OPTION (<query_hint>[ ,...n ])]
<expresion_consulta> ::=
{<especificacion_consulta> | ( < expresion_consulta > ) }
[ {UNION [ALL]|EXCEPT|INTERSECT}
<especificacion_consulta> | (<expresion_consulta>) [...n ]
]
<especificacion_consulta> ::=
SELECT [ALL|DISTINCT]
[TOP expresion [PERCENT] [WITH TIES] ]
<lista_seleccion>
[INTO nueva_tabla]
[FROM { <origen> } [ ,...n ] ]
[WHERE <condicion_busqueda> ]
[GROUP BY [ ALL ] expresion_agrupacion [ ,...n ]
[WITH { CUBE | ROLLUP } ]
]
[HAVING < condicion_busqueda > ]
Debido a la complejidad de la sentencia (en la sintaxis anterior no se han detallado algunos
elementos), la iremos viendo poco a poco, empezaremos por ver consultas bsicas para luego
ir aadiendo ms clusulas.
Empezaremos por ver las consultas ms simples, basadas en una sola tabla y nos limitaremos a
la siguiente sintaxis:
SELECT [ALL|DISTINCT]
[TOP expresion [PERCENT] [WITH TIES]]
<lista_seleccion>
FROM <origen>
[WHERE <condicion_busqueda> ]
Motor de Base de Datos Pgina 11
Nota: Material tomado de Aulaclic.es Derechos Reservados
MOTOR DE BASE DE DATOS ORACLE
DOCENTE: DAIRO RODRIGUEZ BLANCO
ANLISIS Y PROGRAMACION DE COMPUTADORES

[ORDER BY {expression_columna|posicion_columna [ASC|DESC]} [ ,...n ]]


Origen de datos FROM
De la sintaxis anterior, el elemento <origen> indica de dnde se va a extraer la informacin y
se indica en la clusula FROM, es la nica clusula obligatoria. En este tema veremos un origen
de datos basado en una sola tabla.
La sintaxis ser la siguiente:
<origen>::=
nb_tabla | nb_vista [[ AS ] alias_tabla ]
nb_tabla representa un nombre de tabla.
nb_vista un nombre de vista.
Tanto para las tablas como para las vistas, podemos hacer referencia a tablas que estn en
otras bases de datos (siempre que tengamos los permisos adecuados), en este caso tenemos
que cualificar el nombre de la tabla, indicando delante el nombre de la base de datos (Lgica) y
el nombre del esquema al que pertenece la tabla dentro de la base de datos.
Por ejemplo: MiBase.dbo.MiTabla se refiere a la tabla MiTabla que se encuentra en el
esquema dbo de la base de datos MiBase.
Cuando no se definen esquemas, SQL-Server crea uno por defecto en cada base de datos
denominado dbo.
Opcionalmente podemos definir un nombre de alias.
Un nombre de alias (alias_tabla) es un nombre alternativo que se le da a la tabla dentro de la
consulta.
Si se define un nombre de alias, dentro de la consulta, ser el nombre a utilizar para referirnos
a la tabla, el nombre original de la tabla ya no tendr validez.
Se utilizan los nombres de alias para simplificar los nombres de tablas a veces largos y tambin
cuando queremos combinar una tabla consigo misma; ya volveremos sobre los alias de tabla
cuando veamos consultas multitabla.
La palabra AS no aade ninguna operatividad, est ms por esttica.
Podemos escribir:
SELECT ...
FROM tabla1 Sacamos los datos de la tabla tabla1
SELECT ...
FROM tabla1 t1 Sacamos los datos de la tabla tabla1 y le asignamos un alias de tabla: t1
SELECT ...
FROM tabla1 AS t1 Es equivalente a la sentencia anterior.
Si la tabla o la vista estn en otra base de datos del mismo equipo que est ejecutando la
instancia de SQL Server, se utiliza el nombre cualificado con el
formato nbBaseDatos.nbEsquema.nbTabla.
Si la tabla o la vista estn fuera del servidor local en un servidor vinculado, se utiliza un nombre
de cuatro partes con el formatonbservidor.catalogo.nbEsquema.nbTabla. Volveremos ms
adelante sobre las conexiones remotas.

Motor de Base de Datos Pgina 12


Nota: Material tomado de Aulaclic.es Derechos Reservados
MOTOR DE BASE DE DATOS ORACLE
DOCENTE: DAIRO RODRIGUEZ BLANCO
ANLISIS Y PROGRAMACION DE COMPUTADORES

LA LISTA DE SELECCIN
En la lista de seleccin <lista_seleccion> indicamos las columnas que se tienen que visualizar
en el resultado de la consulta.
<lista_seleccion> ::=
{ *
| {nombre_tabla|nombre_vista|alias_tabla}.*
| { [{nombre_tabla|nombre_vista|alias_tabla}.]
{nb_columna|$IDENTITY|$ROWGUID}
|<expresion>
}[[AS] alias_columna]
| alias_columna = <expresion>
} [ ,...n ]

Separamos la definicin de cada columna por una coma y las columnas del resultado
aparecern en el mismo orden que en la lista de seleccin.
Para cada columna del resultado su tipo de datos, tamao, precisin y escala son los mismos
que los de la expresin que da origen a esa columna.
Podemos definir las columnas del resultado de varias formas, mediante:
Una expresin simple:
o una referencia a una funcin.
o una variable local
o una constante
o una columna del origen de datos,
Una subconsulta escalar, que es otra instruccin SELECT que devuelve un nico valor
y se evala para cada fila del origen de datos (esto no lo veremos de momento).
Una expresin compleja generada al usar operadores en una o ms expresiones
simples.
La palabra clave *.
La asignacin de variables con el formato @variable_local = expresin.
La palabra clave $IDENTITY.
La palabra clave $ROWGUID.

Columnas del origen de datos


Cuando queremos indicar en la lista de seleccin una columna del origen de datos, la
especificamos mediante su nombre simple o nombre cualificado. El nombre cualificado consiste
en el nombre de la columna precedido del nombre de la tabla donde se encuentra la columna.
Si en el origen de datos hemos utilizado una vista o un nombre de alias, deberemos utilizar ese
nombre. Es obligatorio utilizar el nombre cualificado cuando el nombre de la columna aparece
en ms de una tabla del origen de datos.
Ejemplos de consulta simple.
Listar nombres, oficinas, y fechas de contrato de todos los empleados:
SELECT nombre, oficina, contrato
FROM empleados;

El resultado sera:
nombre oficina contrato
Antonio Viguer 12 1986-10-20
Alvaro Jaumes 21 1986-12-10
Juan Rovira 12 1987-03-01
Jos Gonzlez 12 1987-05-19
Vicente Pantalla 13 1988-02-12
Luis Antonio 11 1988-06-14

Motor de Base de Datos Pgina 13


Nota: Material tomado de Aulaclic.es Derechos Reservados
MOTOR DE BASE DE DATOS ORACLE
DOCENTE: DAIRO RODRIGUEZ BLANCO
ANLISIS Y PROGRAMACION DE COMPUTADORES

Jorge Gutirrez 22 1988-11-14


Ana Bustamante 21 1989-10-12
Mara Sunta 11 1999-10-12
Juan Victor NULL 1990-01-13
Listar una tarifa de productos:
SELECT idfab, idproducto, descripcion, productos.precio
FROM productos;

Hemos cualificado la columna precio aunque no es necesario en este caso.


El resultado sera:
Idfab idproducto descripcion precio
aci 41001 arandela 0,58
aci 41002 bisagra 0,80
aci 41003 art t3 1,12
aci 41004 art t4 1,23
aci 4100x junta 0,26
aci 4100y extractor 28,88
aci 4100z mont 26,25
bic 41003 manivela 6,52
bic 41089 rodamiento 2,25

ALIAS DE COLUMNA
Por defecto, en el encabezado de cada columna del resultado, aparece el nombre de la
columna origen, pero esto se puede cambiar definiendo un alias de columna, el alias de
columna es un nombre alternativo que se le da a esa columna.
El alias de columna se indica mediante la clusula AS. Se escribe el nuevo texto tal cual sin
comillas siguiendo las reglas de los identificadores.

Ejemplo:
SELECT numclie,nombre AS nombrecliente
FROM clientes;
El resultado ser :
Numclie nombrecliente
2101 Luis Garca Antn
2102 Alvaro Rodrguez
2103 Jaime Llorens
en vez de:
Numclie Nombre
2101 Luis Garca Antn
2102 Alvaro Rodrguez
2103 Jaime Llorens

Motor de Base de Datos Pgina 14


Nota: Material tomado de Aulaclic.es Derechos Reservados
MOTOR DE BASE DE DATOS ORACLE
DOCENTE: DAIRO RODRIGUEZ BLANCO
ANLISIS Y PROGRAMACION DE COMPUTADORES

La palabra AS es opcional.
SELECT numclie,nombre nombrecliente
FROM clientes;
Sera equivalente a la consulta anterior
Si queremos incluir espacios en blanco en el nombre lo debemos encerrar entre corchetes.
SELECT numclie,nombre AS [nombre cliente]
FROM clientes;
Nota importante: Este nombre de alias se podr utilizar en la lista de seleccin y en la clusula
ORDER BY pero no en la clusula WHERE.
FUNCIONES
Existen funciones que podemos utilizar en la lista de seleccin, e incluso en otras clusulas que
veremos ms adelante, como el WHERE. Las principales funciones son las siguientes:
Funciones de fecha:
Funcin Descripcin
GETDATE Devuelve la fecha actual.
GETUTCDATE Devuelve la hora UTC.
DATEPART Devuelve un entero que corresponde a la parte de la fecha solicitada.
DAY Devuelve el da de la fecha indicada.
MONTH Devuelve el mes de la fecha indicada.
YEAR Devuelve el ao de la fecha indicada.
Devuelve una cadena de caracteres que representa el valor de la unidad
DATENAME
especificada de una fecha especificada.
Devuelve un valor datetime nuevo que resulta de sumar un intervalo de
DATEADD
tiempo a una fecha especificada.>
DATEDIFF Devuelve el n de intervalos que hay entre dos fechas.
@@DATEFIRST Devuelve el primer da de la semana establecido con SET DATEFIRST.
SET DATEFIRST Establece el primer da de la semana en un nmero del 1 al 7.

Funciones de cadena:
Funcin Descripcin
Devuelve el valor de cdigo ASCII del carcter situado ms a la izquierda de
ASCII
una expresin de caracteres.
CHAR Devuelve el carcter ASCII del entero indicado.
NCHAR Devuelve el carcter Unicode del entero indicado.
UNICODE Devuelve el entero que se corresponde al carcter Unicode indicado.
Devuelve el total de caracteres de una cadena, excluidos los espacios en
LEN
blanco finales.
LTRIM Devuelve una cadena tras quitarle los espacios en blanco iniciales.
RTRIM Devuelve una cadena tras quitarle los espacios en blanco finales.

Motor de Base de Datos Pgina 15


Nota: Material tomado de Aulaclic.es Derechos Reservados
MOTOR DE BASE DE DATOS ORACLE
DOCENTE: DAIRO RODRIGUEZ BLANCO
ANLISIS Y PROGRAMACION DE COMPUTADORES

LEFT Devuelve los N ltimos caracteres de una cadena.


RIGHT Devuelve los N primeros caracteres de una cadena.
SUBSTRING Devuelve parte de una expresin.
LOWER Devuelve la cadena convertida a minsculas.
UPPER Devuelve la cadena convertida a maysculas.
REPLACE Reemplaza una determinada cadena.
Elimina el nmero de caracteres especificado e inserta otro conjunto de
STUFF
caracteres en el punto de inicio indicado.
Devuelve una cadena Unicode con los delimitadores agregados para
QUOTENAME convertirla en un identificador delimitado vlido de Microsoft SQL Server
2005.
SPACE Devuelve una cadena de espacios repetidos.
STR Devuelve una cadena de caracteres a partir de datos numricos.
REPLICATE Repite una cadena N veces.
REVERSE Devuelve una cadena invertida.
Devuelve la posicin inicial de la expresin especificada en una cadena de
CHARINDEX
caracteres.
Devuelve la posicin inicial de la primera repeticin de un patrn en la
PATINDEX expresin especificada, o ceros si el patrn no se encuentra, en todos los
tipos de datos de texto y caracteres.
Otras funciones:
Funcin Descripcin
ROUND Redondea un valor a la longitud y precisin indicadas.
CAST y CONVERT Convierten de un tipo de datos a otro de forma explcita.
CASE Evala una lista de condiciones.
ISNULL Reemplaza el valor NULL por otro especificado.
COALESCE Devuelve la primera expresin distinta de NULL entre sus argumentos.

COLUMNAS CALCULADAS

Adems de las columnas que provienen directamente de la tabla origen, una consulta SQL
puede incluir columnas calculadas cuyos valores se evalan a partir de una expresin.
La expresin puede contener cualquier operador vlido (+, -, *, /, &), cualquier funcin
vlida, nombres de columnas del origen de datos, nombres de parmetros o constantes y para
combinar varias operaciones se pueden utilizar los parntesis.
Ejemplos de columnas calculadas:
Listar la ciudad, regin y el supervit de cada oficina. Consideraremos el supervit como el
volumen de ventas que se encuentran por encima o por debajo del objetivo de la oficina.
SELECT ciudad, region, (ventas-objetivo) AS superavit
FROM oficinas;
Motor de Base de Datos Pgina 16
Nota: Material tomado de Aulaclic.es Derechos Reservados
MOTOR DE BASE DE DATOS ORACLE
DOCENTE: DAIRO RODRIGUEZ BLANCO
ANLISIS Y PROGRAMACION DE COMPUTADORES

El resultado ser:

ciudad region superavit


Valencia este 11800,00
Alicante este -6500,00
Castellon este 1800,00
Badajoz oeste 11100,00
A Corua oeste -11400,00
Madrid centro NULL
Madrid centro -10000,00
Pamplona norte NULL
Valencia este -90000,00
De cada producto queremos saber el id de fabricante, id de producto, su descripcin y el valor
de sus existencias.
SELECT idfab,idproducto,descripcion,(existencias*precio) AS valoracion
FROM productos;
El resultado sera:
Idfab idproducto descripcion valoracion
aci 41001 arandela 160,66
aci 41002 bisagra 133,60
aci 41003 art t3 231,84
aci 41004 art t4 170,97
aci 4100x junta 9,62
aci 4100y extractor 722,00
aci 4100z mont 735,00
bic 41003 manivela 19,56
bic 41089 rodamiento 175,50

Listar el nombre, mes y ao del contrato de cada vendedor.


SELECT nombre, MONTH(contrato) AS [Mes de contrato], YEAR(contrato) AS [Ao de contrato]
FROM empleados;
El resultado ser:
Nombre Mes de contrato Ao de contrato
Antonio Viguer 10 1986
Alvaro Jaumes 12 1986
Juan Rovira 3 1987

Listar las ventas en cada oficina con el formato: 22 tiene ventas de 186,042.00
SELECT oficina, 'tiene ventas de ' AS [ ], ventas
FROM oficinas;
Motor de Base de Datos Pgina 17
Nota: Material tomado de Aulaclic.es Derechos Reservados
MOTOR DE BASE DE DATOS ORACLE
DOCENTE: DAIRO RODRIGUEZ BLANCO
ANLISIS Y PROGRAMACION DE COMPUTADORES

El resultado sera:
oficina ventas
11 tiene ventas de 69300,00
12 tiene ventas de 73500,00
13 tiene ventas de 36800,00
21 tiene ventas de 83600,00
22 tiene ventas de 18600,00
23 tiene ventas de NULL
24 tiene ventas de 15000,00
26 tiene ventas de NULL
28 tiene ventas de 0,00
El incluir una constante como columna en la lista de seleccin puede parecer intil (se repetir
el mismo valor en todas las filas) pero veremos ms adelante que tiene utilidad en ciertos
casos.
Tambin podemos utilizar la sintaxis:
alias_columna = <expresion>
Ejemplo:
SELECT oficina, superavit = ventas-objetivo
Esto tiene el mismo efecto que
SELECT oficina, ventas-objetivo AS supervit

UTILIZACIN DEL ASTERISCO *


Si queremos visualizar todas las columnas del origen de datos, en lugar de indicar todas las
columnas una a una se puede utilizar el carcter de sustitucin *.
Mostrar todos los datos de la tabla oficinas.
SELECT *
FROM oficinas;
Obtener todos los datos y el supervit de cada oficina.
SELECT *, (ventas-objetivo) AS superavit
FROM oficinas;
Tambin podemos cualificar el * con un nombre de tabla, de vista o un alias de tabla:
SELECT oficinas.*
FROM oficinas;
oficinas.* se interpreta como: todas las columnas de la tabla oficinas.
Esta forma se utiliza normalmente cuando el origen est basado en varias tablas y queremos
indicar todas las columnas no del origen completo sino de una tabla concreta.

LAS PALABRAS CLAVE $IDENTITY Y $ROWGUID


La palabra clave $IDENTITY se interpreta como la columna de la tabla que tiene la propiedad
IDENTITY (la columna de identidad que vimos en un tema anterior).
Por ejemplo, si en la columna codigo de la tabla usuarios (BD Biblio) se ha definido la
propiedad IDENTITY.
SELECT $IDENTITY, nombre, apellidos
FROM usuarios;
Es equivalente a:
SELECT codigo, nombre, apellidos
FROM usuarios;

Motor de Base de Datos Pgina 18


Nota: Material tomado de Aulaclic.es Derechos Reservados
MOTOR DE BASE DE DATOS ORACLE
DOCENTE: DAIRO RODRIGUEZ BLANCO
ANLISIS Y PROGRAMACION DE COMPUTADORES

La palabra clave $ROWGUID se interpreta como la columna de la tabla que tiene la


propiedad ROWGUIDCOL y se puede utilizar de la misma forma que $IDENTITY.

Motor de Base de Datos Pgina 19


Nota: Material tomado de Aulaclic.es Derechos Reservados
MOTOR DE BASE DE DATOS ORACLE
DOCENTE: DAIRO RODRIGUEZ BLANCO
ANLISIS Y PROGRAMACION DE COMPUTADORES

ORDENACIN DE LAS FILAS DEL RESULTADO ORDER BY


Si queremos que las filas del resultado de la consulta aparezcan ordenadas, lo podemos indicar
mediante la clusula ORDER BY.
ORDER BY {expression_columna|posicion_columna [ASC|DESC]}[ ,...n ]
Podemos indicar una columna o varias separadas por una coma, la columna de ordenacin se
especifica mediante el nombre de columna en el origen de datos o su posicin dentro de la
lista de seleccin. Si utilizamos el nombre de columna, no hace falta que la columna aparezca
en la lista de seleccin. Si utilizamos la posicin es la posicin de la columna dentro de la lista
de seleccin empezando en 1.
Por defecto la filas se ordenarn en modo ascendente (ASC), de menor a mayor; si queremos
invertir ese orden aadimos detrs de la columna la palabra DESC.
Si la columna de ordenacin es alfanumrica, las filas se ordenarn por orden
alfabtico.
Si la columna de ordenacin es numrica, las filas se ordenarn de menor a mayor.
Si la columna de ordenacin es de tipo fecha, las filas se ordenarn de ms antigua a
ms reciente o futura.
Ejemplos:
Mostrar las ventas de cada oficina, ordenadas por orden alfabtico de regin y dentro de cada
regin por ciudad.
SELECT oficina, region, ciudad, ventas
FROM oficinas
ORDER BY region, ciudad;
Da como resultado:
Oficina region ciudad ventas
24 centro Aranjuez 15000,00
23 centro Madrid NULL
12 este Alicante 73500,00
13 este Castelln 36800,00
11 este Valencia 69300,00
28 este Valencia 0,00
26 norte Pamplona NULL
22 oeste A Corua 18600,00
21 oeste Badajoz 83600,00
Listar las oficinas de manera que las oficinas de mayores ventas aparezcan en primer lugar.
SELECT ciudad, region, ventas
FROM oficinas
ORDER BY ventas DESC;
ciudad region ventas
Badajoz oeste 83600,00
Alicante este 73500,00
Valencia este 69300,00
Castellon este 36800,00
A Corua oeste 18600,00
Aranjuez centro 15000,00
Valencia este 0,00

Motor de Base de Datos Pgina 20


Nota: Material tomado de Aulaclic.es Derechos Reservados
MOTOR DE BASE DE DATOS ORACLE
DOCENTE: DAIRO RODRIGUEZ BLANCO
ANLISIS Y PROGRAMACION DE COMPUTADORES

Pamplona norte NULL


Madrid centro NULL
Listar las oficinas clasificadas en orden descendente de rendimiento de ventas, de modo que
las de mayor rendimiento aparezcan las primeras.
SELECT ciudad, region, ventas-objetivo
FROM oficinas
ORDER BY 3 DESC;
Lo mismo que el anterior pero agrupadas por regin.
SELECT region, ciudad, (ventas-objetivo) AS superavit
FROM oficinas
ORDER BY region, superavit DESC;
Resultado:
Region ciudad superavit
centro Aranjuez -10000,00
centro Madrid NULL
este Valencia 11800,00
este Castelln 1800,00
este Alicante -6500,00
este Valencia -90000,00
norte Pamplona NULL
oeste Badajoz 11100,00
oeste A Corua -11400,00
En este caso hemos utilizado el alias de columna para hacer referencia a la columna calculada y
tambin se puede observar que las filas aparecen ordenadas por regin ascendente (no hemos
incluido nada despus del nombre de la columna) y dentro de cada regin por supervit y
descendente.

ELIMINAR FILAS DUPLICADAS DISTINCT/ALL


SQL no elimina las filas duplicadas en el resultado de la consulta, si nosotros no queremos que
se repitan las filas, tenemos la clusula DISTINCT.
Al incluir la clusula DISTINCT en la SELECT, se eliminar del resultado las repeticiones de filas
de resultado. Si por el contrario queremos que aparezcan todas las filas seleccionadas
podemos incluir la clusula ALL o nada, ya que ALL es el valor por defecto.
Listar los n de empleado de los directores de las oficinas.
SELECT dir
FROM oficinas;
dir
106
104
105
108
108
108
108
NULL

Motor de Base de Datos Pgina 21


Nota: Material tomado de Aulaclic.es Derechos Reservados
MOTOR DE BASE DE DATOS ORACLE
DOCENTE: DAIRO RODRIGUEZ BLANCO
ANLISIS Y PROGRAMACION DE COMPUTADORES

NULL
Si un mismo empleado dirige varias oficinas (por ejemplo el 108), su cdigo aparece repetido
en el resultado. Para evitarlo modificamos la consulta:
SELECT DISTINCT dir
FROM oficinas;
dir
NULL
104
105
106
108
Han desaparecido los valores duplicados.
Los que se eliminan son valores duplicados de filas del resultado, por ejemplo:
SELECT DISTINCT dir, region
FROM oficinas;
dir region
NULL este
NULL norte
104 este
105 este
106 este
108 centro
108 oeste
Ahora el 108 aparece dos veces porque las dos filas donde aparece no son iguales (porque
tienen distinta regin).
NOTA: La clusula DISTINCT hace que la consulta tarde algo ms en ejecutarse debido al
proceso adicional de buscar y eliminar las repeticiones, por lo que se aconseja utilizarla
nicamente cuando sea imprescindible.

LA CLUSULA TOP

[TOP <expresin> [PERCENT] [WITH TIES]]

La clusula TOP indica que en el resultado no deben aparecer todas las filas resultantes sino un
cierto nmero de registros, las n primeras. Si la consulta incluye la clusula ORDER BY, se
realiza la ordenacin antes de extraer los n primeros registros.

La expresin representa ese nmero n y debe devolver un nmero entero sin signo.

Por ejemplo tenemos la siguiente tabla:

SELECT * FROM productos:

Motor de Base de Datos Pgina 22


Nota: Material tomado de Aulaclic.es Derechos Reservados
MOTOR DE BASE DE DATOS ORACLE
DOCENTE: DAIRO RODRIGUEZ BLANCO
ANLISIS Y PROGRAMACION DE COMPUTADORES

Si ordenamos por ventas:

SELECT * FROM productos

ORDER BY ventas;

Obtenemos el siguiente resultado:

Si aadimos la clusula TOP:

SELECT TOP 3 * FROM productos

ORDER BY ventas

Obtenemos los 3 primeros registros:

Si existen ms registros con las mismas ventas que el ltimo valor de la lista, stos no saldrn
en el resultado de la consulta.

En el ejemplo el registro con cod = 2 no sale en el resultado y tiene las mismas ventas que cod
= 3.

Si queremos que salgan aadimos la clusula WITH TIES. La clusula WITH TIES slo se puede
emplear si la SELECT incluye un ORDER BY, de lo contrario dar error.

Si aadimos la clusula WITH TIES:

SELECT TOP 3 WITH TIES *


Motor de Base de Datos Pgina 23
Nota: Material tomado de Aulaclic.es Derechos Reservados
MOTOR DE BASE DE DATOS ORACLE
DOCENTE: DAIRO RODRIGUEZ BLANCO
ANLISIS Y PROGRAMACION DE COMPUTADORES

FROM productos

ORDER BY ventas

Obtenemos:

Se incluyen en el resultado todos los registros que tienen ventas iguales al ltimo registro.

Otro ejemplo:

SELECT TOP 10 oficina, ciudad, ventas

FROM oficinas

ORDER BY ventas;

Devuelve las 10 peores oficinas en cuanto a ventas: ordenamos las oficinas por ventas de
menor a mayor y sacamos las 10 primeras.

Si incluimos la palabra PERCENT, entonces n no indica el nmero de registros a recuperar sino


el porcentaje de registros a recuperar del total de filas recuperadas despus de ejecutar la
clusula WHERE.

SELECT TOP 50 PERCENT *

FROM productos

ORDER BY ventas

Devuelve:

Si el porcentaje no da exacto, siempre redondea al alza.

Motor de Base de Datos Pgina 24


Nota: Material tomado de Aulaclic.es Derechos Reservados
MOTOR DE BASE DE DATOS ORACLE
DOCENTE: DAIRO RODRIGUEZ BLANCO
ANLISIS Y PROGRAMACION DE COMPUTADORES

SELECCIN DE FILAS WHERE

La clusula WHERE se emplea para especificar las filas que se desean recuperar del origen de
datos.

WHERE <condicion_bsqueda>

<condicion_bsqueda> ::=

{ [NOT]<predicado>

|(<condicion_bsqueda>)

[{AND|OR} [NOT] {<predicado>|(<condicion_bsqueda>)}]

[ ...n ]

En el resultado de la consulta slo aparecern las filas que cumplan que la condicin de
bsqueda sea TRUE, los valores NULL no se incluyen, por lo tanto, en las filas del resultado. La
condicin de bsqueda puede ser una condicin simple o una condicin compuesta por varias
condiciones (predicados) unidas por operadores AND y OR, no hay lmite en cuanto al nmero
de predicados que se pueden incluir. En las condiciones compuestas se pueden utilizar
parntesis para delimitar predicados y se aconseja su uso cuando se incluyen operadores AND
y OR en la misma condicin de bsqueda.

Predicados

En SQL tenemos 7 tipos de predicados, condiciones bsicas de bsqueda:

Comparacin estndar

Pertenencia a un intervalo (BETWEEN)

Pertenencia a un conjunto (IN)

Test de valor nulo (IS NULL).

Coincidencia con patrn (LIKE)

Si contiene (CONTAINS)

FREETEXT

Comparacin estndar.

Compara el valor de una expresin con el valor de otra. Para la comparacin se pueden
emplear = , <> , !=, < , <= , !<, > , >= ,!>

Sintaxis:

Motor de Base de Datos Pgina 25


Nota: Material tomado de Aulaclic.es Derechos Reservados
MOTOR DE BASE DE DATOS ORACLE
DOCENTE: DAIRO RODRIGUEZ BLANCO
ANLISIS Y PROGRAMACION DE COMPUTADORES

<expresion> {=|<>|!=|>|>=|!>|<|<=|!<} <expresion>

<expresion> Puede ser:

Un nombre de columna,

una constante,

una funcin (inclusive la funcin CASE),

una variable,

una subconsulta escalar o

cualquier combinacin de nombres de columna, constantes y funciones conectados


mediante uno o varios operadores o una subconsulta.

Ejemplo:

Listar los "buenos" vendedores (los que han rebasado su cuota).

SELECT numemp, nombre, ventas, cuota

FROM empleados

WHERE ventas > cuota

numemp nombre ventas cuota

101 Antonio Viguer 30500,00 30000,00

102 Alvaro Jaumes 47400,00 35000,00

103 Juan Rovira 28600,00 27500,00

105 Vicente Pantalla 36800,00 35000,00

106 Luis Antonio 29900,00 27500,00

108 Ana Bustamante 36100,00 35000,00

109 Mara Sunta 39200,00 3000,00

Las columnas que aparecen en el WHERE no tienen por qu aparecer en la lista de seleccin,
esta instruccin es igual de vlida:

SELECT numemp, nombre

FROM empleados

WHERE ventas > cuota;

Motor de Base de Datos Pgina 26


Nota: Material tomado de Aulaclic.es Derechos Reservados
MOTOR DE BASE DE DATOS ORACLE
DOCENTE: DAIRO RODRIGUEZ BLANCO
ANLISIS Y PROGRAMACION DE COMPUTADORES

Hallar vendedores contratados antes de 1988.

SELECT numemp, nombre, contrato

FROM empleados

WHERE contrato < '01/01/1988';

numemp nombre contrato

101 Antonio Viguer 1986-10-20

102 Alvaro Jaumes 1986-12-10

103 Juan Rovira 1987-03-01

104 Jos Gonzlez 1987-05-19

Tambin podemos utilizar funciones, sta es equivalente a la anterior:

SELECT numemp, nombre

FROM empleados

WHERE YEAR(contrato) < 1988;

La funcin YEAR(fecha) devuelve el ao de una fecha.

Hallar oficinas cuyas ventas estn por debajo del 80% de su objetivo:

SELECT oficina

FROM oficinas

WHERE ventas < (.8 * objetivo);

Hallar las oficinas dirigidas por el empleado 108:

SELECT oficina

FROM oficinas

WHERE dir = 108;

PERTENENCIA A UN INTERVALO. BETWEEN

<expresion> [NOT] BETWEEN <expresion2> AND <expresion3>

Motor de Base de Datos Pgina 27


Nota: Material tomado de Aulaclic.es Derechos Reservados
MOTOR DE BASE DE DATOS ORACLE
DOCENTE: DAIRO RODRIGUEZ BLANCO
ANLISIS Y PROGRAMACION DE COMPUTADORES

Examina si el valor de la expresin de test est en el rango delimitado por los valores
resultantes de expresion1 y expresion2, estos valores no tienen porqu estar ordenados en
ANSI/ISO; expresion1 debe ser menor o igual a expresion2.

Hallar vendedores cuyas ventas estn entre 20.000 euros y 50.000.

SELECT numemp, nombre, ventas

FROM empleados

WHERE ventas BETWEEN 20000 AND 100000;

numemp nombre ventas

101 Antonio Viguer 30500,00

102 Alvaro Jaumes 47400,00

103 Juan Rovira 28600,00

105 Vicente Pantalla 36800,00

106 Luis Antonio 29900,00

108 Ana Bustamante 36100,00

109 Mara Sunta 39200,00

La instruccin anterior es equivalente a:

SELECT numemp, nombre, ventas

FROM empleados

WHERE ventas >= 20000 AND ventas <=100000;

Parece que con BETWEEN se lee mejor.

Observa que no hemos utilizado separadores de millares (100.000), porque se habra


interpretado por una coma decimal.

Test de pertenencia a conjunto IN

<expresion> IN ( <exp_valor> [ ,...n ] )

Examina si el valor de la expresion es uno de los valores incluidos en la lista de valores


indicados entre parntesis. Se pueden expresar los valores mediante cualquier expresin, la
nica condicin es que todas las exp_valor devuelvan el mismo tipo de datos.

Ejemplo:

Motor de Base de Datos Pgina 28


Nota: Material tomado de Aulaclic.es Derechos Reservados
MOTOR DE BASE DE DATOS ORACLE
DOCENTE: DAIRO RODRIGUEZ BLANCO
ANLISIS Y PROGRAMACION DE COMPUTADORES

Obtener los empleados que trabajan en las oficinas 11, 20 o 22:

SELECT oficina, numemp, nombre

FROM empleados

WHERE oficina IN (11,20,22);

Oficina numemp nombre

11 106 Luis Antonio

22 107 Jorge Gutirrez

11 109 Mara Sunta

Test de valor nulo IS NULL

<expression> IS [NOT] NULL

Una condicin de bsqueda puede ser TRUE, FALSE o NULL/UNKNOW, este ltimo caso se
produce cuando algn campo que interviene en la condicin tiene valor NULL.
A veces es til comprobar explcitamente los valores NULL en una condicin de bsqueda ya
que estas filas puede que queramos darles un tratamiento especial, para ello tenemos el
predicado IS NULL.

Este test produce un valor TRUE o FALSE, por lo que se podr combinar con otras condiciones.
El valor NULL no es en s un valor por eso no lo podemos utilizar en una igualdad.

SELECT numemp,nombre

FROM empleados

WHERE oficina = NULL;

Esta instruccin no da error pero no obtiene lo que en principio parece que quiere obtener. No
obtenemos los empleados cuya oficina sea un valor nulo (es decir los empleados que no tienen
oficina), no obtenemos nada, en cambio los obtendremos utilizando el test de valor nulo:

SELECT numemp,nombre, oficina

FROM empleados

WHERE oficina IS NULL;

Resultado:

numemp nombre oficina

Motor de Base de Datos Pgina 29


Nota: Material tomado de Aulaclic.es Derechos Reservados
MOTOR DE BASE DE DATOS ORACLE
DOCENTE: DAIRO RODRIGUEZ BLANCO
ANLISIS Y PROGRAMACION DE COMPUTADORES

110 Juan Victor NULL

Juan Victor es el nico empleado que no tiene oficina asignada.

Listar los vendedores asignados a alguna oficina.

SELECT numemp, nombre, oficina

FROM empleados

WHERE oficina IS NOT NULL;

numemp nombre oficina

101 Antonio Viguer 12

102 Alvaro Jaumes 21

103 Juan Rovira 12

104 Jos Gonzlez 12

105 Vicente Pantalla 13

106 Luis Antonio 11

107 Jorge Gutirrez 22

108 Ana Bustamante 21

109 Mara Sunta 11

TEST DE CORRESPONDENCIA CON PATRN LIKE

Se utiliza cuando queremos comparar el valor de una columna con un patrn en el que se
utilice caracteres comodines.

<expression> [NOT] LIKE <patron> [ESCAPE 'car_escape']

Con expresin indicamos el valor a comparar (normalmente ser el nombre de una columna) y
patrn es la cadena que se busca. El patrn es de tipo texto y tiene que escribirse entre
comillas simples. Dentro del patrn podemos utilizar los siguientes comodines:

% representa cualquier cadena de cero o ms caracteres.

SELECT numemp,nombre

FROM empleados
Motor de Base de Datos Pgina 30
Nota: Material tomado de Aulaclic.es Derechos Reservados
MOTOR DE BASE DE DATOS ORACLE
DOCENTE: DAIRO RODRIGUEZ BLANCO
ANLISIS Y PROGRAMACION DE COMPUTADORES

WHERE nombre LIKE An%;

numemp nombre

101 Antonio Viguer

108 Ana Bustamante

Obtiene todos los nombres que empiecen por An.

SELECT numemp,nombre

FROM empleados

WHERE nombre LIKE %z;

numemp nombre

104 Jos Gonzlez

107 Jos Gonzlez

Obtiene los nombres que acaban en z.

SELECT numemp,nombre

FROM empleados

WHERE nombre LIKE %on%;

numemp nombre

101 Antonio Viguer

104 Jos Gonzlez

106 Luis Antonio

Obtiene los nombres que contienen on.

_ representa cualquier carcter (slo uno).

SELECT numemp,nombre

FROM empleados

WHERE nombre LIKE '__a%';

numemp nombre

Motor de Base de Datos Pgina 31


Nota: Material tomado de Aulaclic.es Derechos Reservados
MOTOR DE BASE DE DATOS ORACLE
DOCENTE: DAIRO RODRIGUEZ BLANCO
ANLISIS Y PROGRAMACION DE COMPUTADORES

103 Juan Rovira

108 Ana Bustamante

110 Juan Victor

Obtiene los nombres cuya tercera letra sea una a (en el patrn tenemos dos caracteres
subrayado).

[ ] sirve para indicar un carcter cualquiera perteneciente al conjunto indicando.


El conjunto se indica enumerando los caracteres o indicando un intervalo.

SELECT numemp,nombre

FROM empleados

WHERE nombre LIKE '[a-d]%';

Obtiene los nombres que empiezan por cualquier letra de la a a la d.

Es equivalente a escribir:

SELECT numemp,nombre

FROM empleados

WHERE nombre LIKE '[abcd]%';

[^] significa cualquier carcter individual que no se encuentre en el conjunto.

SELECT numemp,nombre

FROM empleados

WHERE nombre LIKE '[^abcd]%';

SELECT numemp,nombre

FROM empleados

WHERE nombre LIKE '[^a-d]%';

Obtienen los nombres que no empiecen por a, b, c ni d.

Es importante tener en cuenta que dentro del patrn el espacio en blanco es considerado
como un carcter ms, si colocamos dos espacios en el patrn, se buscarn dos espacios en el
campo.

Motor de Base de Datos Pgina 32


Nota: Material tomado de Aulaclic.es Derechos Reservados
MOTOR DE BASE DE DATOS ORACLE
DOCENTE: DAIRO RODRIGUEZ BLANCO
ANLISIS Y PROGRAMACION DE COMPUTADORES

Si queremos incluir en el patrn uno de los caracteres comodines y que no sea interpretado
como un comodn, sino como un carcter normal, lo tenemos que encerrar entre corchetes o
utilizar un carcter de escape.

[ESCAPE 'car_escape']

La clusula ESCAPE es opcional y permite definir un carcter de escape.

Un carcter de escape es un carcter que se coloca delante de un carcter comodn para


indicar que el comodn no debe interpretarse como tal, sino como un carcter normal.

Por ejemplo queremos buscar los nombres compuestos que incluyen un subrayado. En este
caso tenemos que poner el carcter _ como un carcter normal no como un comodn, as que
lo escribiremos as:

SELECT numemp,nombre

FROM empleados

WHERE nombre LIKE '%[_]%';

O bien,

SELECT numemp,nombre

FROM empleados

WHERE nombre LIKE '%!_%' ESCAPE '!';

CONDICIONES DE BSQUEDA COMPUESTAS


En una clusula WHERE podemos incluir una condicin de bsqueda simple (formada por un
solo predicado) o compuesta (formada por la combinacin de predicados unidos por los
operadores lgicos NOT, AND, OR).
Cuando la condicin incluye varios operadores lgicos, el orden de prioridad de estos
operadores es:
NOT (el ms alto),
seguido de AND y OR (estos dos al mismo nivel).
Como siempre, se pueden utilizar parntesis para alterar esta prioridad en una condicin de
bsqueda.
El orden de evaluacin de los operadores lgicos puede variar dependiendo de las opciones
elegidas por el optimizador de consultas.
Los operadores lgicos pueden devolver tres valores distintos: TRUE, FALSE, NULL
(UNKNOWN).
Tablas de verdad de los operadores:
AND Combina dos condiciones y se evala como TRUE cuando ambas condiciones son TRUE.
AND TRUE FALSE NULL
TRUE TRUE FALSE NULL
FALSE FALSE FALSE FALSE
NULL NULL FALSE NULL

Motor de Base de Datos Pgina 33


Nota: Material tomado de Aulaclic.es Derechos Reservados
MOTOR DE BASE DE DATOS ORACLE
DOCENTE: DAIRO RODRIGUEZ BLANCO
ANLISIS Y PROGRAMACION DE COMPUTADORES

OR Combina dos condiciones y se evala como TRUE cuando alguna de las condiciones es
TRUE.
OR TRUE FALSE NULL
TRUE TRUE TRUE TRUE
FALSE TRUE FALSE NULL
NULL TRUE NULL NULL
NOT Niega la expresin booleana que especifica el predicado
NOT TRUE FALSE NULL
FALSE TRUE NULL
Hallar los vendedores que estn por debajo de su cuota y tienen ventas inferiores a 30.000.
SELECT nombre
FROM empleados
WHERE ventas < cuota AND ventas < 30000;
Hallar los vendedores que estn debajo de su cuota, pero cuyas ventas no sean inferiores a
150.000.
SELECT nombre
FROM empleados
WHERE ventas < cuota AND ventas < 150000;
Hallar las oficinas no dirigidas por el empleado 108
SELECT oficina
FROM oficinas
WHERE NOT dir = 108;
O
SELECT oficina
FROM oficinas
WHERE dir <> 108;
Devuelven:
Oficina
11
12
13
Las oficinas sin director no aparecen, para que aparezcan deben aadir otro predicado:
SELECT oficina, dir
FROM oficinas
WHERE NOT dir = 108 or dir is null;
Oficina dir
11 106
12 104
13 105
26 NULL
28 NULL

Motor de Base de Datos Pgina 34


Nota: Material tomado de Aulaclic.es Derechos Reservados
MOTOR DE BASE DE DATOS ORACLE
DOCENTE: DAIRO RODRIGUEZ BLANCO
ANLISIS Y PROGRAMACION DE COMPUTADORES

CONSULTAS MULTITABLA
Introduccin
Hasta ahora hemos visto consultas que obtienen los datos de una sola tabla, en este tema
veremos cmo obtener datos de diferentes tablas.
En esta parte ampliaremos la clusula FROM y descubriremos nuevas palabras reservadas
(UNION, EXCEPT e INTERSECT) que corresponden a operaciones relacionales.
Para obtener datos de varias tablas tenemos que combinar estas tablas mediante alguna
operacin basada en el lgebra relacional.
El lgebra relacional define una serie de operaciones cuyos operandos son tablas y cuyo
resultado es tambin una tabla.
Las operaciones de lgebra relacional implementadas en Transact-Sql son:
La unin UNION
La diferencia EXCEPT
La interseccin INTERSECT
El producto cartesiano CROSS JOIN
La composicin interna INNER JOIN
La composicin externa LEFT JOIN, RIGHT JOIN Y FULL JOIN
En todo el tema cuando hablemos de tablas nos referiremos tanto a las tablas que fsicamente
estn almacenadas en la base de datos como a las tablas temporales y a las resultantes de una
consulta o vista.
La unin de tablas UNION
La unin de tablas consiste en coger dos tablas y obtener una tabla con las filas de las dos
tablas, en el resultado aparecern las filas de una tabla y, a continuacin, las filas de la otra
tabla.
Para poder realizar la operacin, las dos tablas tienen que tener el mismo esquema (mismo
nmero de columnas y tipos compatibles) y la tabla resultante hereda los encabezados de la
primera tabla.
La sintaxis es la siguiente:
{< consulta >|(< consulta >)}
UNION [ALL]
{< consulta >|(< consulta >)}
[{UNION [ALL] {< consulta >|(< consulta >)}}[ ...n ] ]
[ORDER BY {expression_columna|posicion_columna [ASC|DESC]}
[ ,...n ]]
< consulta > representa la especificacin de la consulta que nos devolver la tabla a combinar.
Puede ser cualquier especificacin de consulta con la limitacin de que no admite la clusula
ORDER BY, los alias de campo se pueden definir pero slo tienen efecto cuando se indican en
la primera consulta ya que el resultado toma los nombres de columna de esta.
Ejemplo: Suponemos que tenemos una tabla Valencia con las nuevas oficinas de Valencia y
otra tabla Madrid con las nuevas oficinas de Madrid y queremos obtener una tabla con las
nuevas oficinas de las dos ciudades:
SELECT oficina as OFI, ciudad FROM Valencia
UNION ALL
SELECT oficina, ciudad FROM Madrid;
El resultado sera:
OFI Ciudad
11 Valencia
28 Valencia
23 Madrid

Motor de Base de Datos Pgina 35


Nota: Material tomado de Aulaclic.es Derechos Reservados
MOTOR DE BASE DE DATOS ORACLE
DOCENTE: DAIRO RODRIGUEZ BLANCO
ANLISIS Y PROGRAMACION DE COMPUTADORES

El resultado coge los nombres de columna de la primera consulta y aparecen primero las filas
de la primera consulta y despus las de la segunda.
Si queremos que el resultado aparezca ordenado podemos incluir la clusula ORDER BY, pero
despus de la ltima especificacin de consulta, y expresion_columna ser cualquier columna
vlida de la primera consulta.
SELECT oficina as OFI, ciudad FROM Valencia
UNION
SELECT oficina, ciudad FROM Madrid
ORDER BY ofi;
OFI Ciudad
11 Valencia
23 Madrid
28 Valencia
Ahora las filas aparecen ordenadas por el nmero de oficina y hemos utilizado el nombre de
columna de la primera consulta.
Cuando aparezcan en el resultado varias filas iguales, el sistema por defecto elimina las
repeticiones.
Si se especifica ALL, el sistema devuelve todas las filas resultante de la unin incluidas las
repetidas
El empleo de ALL tambin hace que la consulta se ejecute ms rpidamente ya que el sistema
no tiene que eliminar las repeticiones.
Se pueden combinar varias tablas con el operador UNION. Por ejemplo supongamos que
tenemos otra tabla Pamplona con las oficinas nuevas de Pamplona:
SELECT oficina, ciudad FROM Valencia
UNION
SELECT oficina, ciudad FROM Madrid
UNION
SELECT oficina, ciudad FROM Pamplona;
Combinamos las tres tablas.
Otro ejemplo:
Obtener todos los productos cuyo precio exceda de 20 o que se haya vendido ms de 300
euros del producto en algn pedido.
SELECT idfab, idproducto
FROM productos
WHERE precio > 20
UNION
SELECT fab, producto
FROM pedidos
WHERE importe > 300;

Motor de Base de Datos Pgina 36


Nota: Material tomado de Aulaclic.es Derechos Reservados
MOTOR DE BASE DE DATOS ORACLE
DOCENTE: DAIRO RODRIGUEZ BLANCO
ANLISIS Y PROGRAMACION DE COMPUTADORES

LA DIFERENCIA EXCEPT
Aparecen en la tabla resultante las filas de la primera consulta que no aparecen en la segunda.
Las condiciones son las mismas que las de la unin.
{<consulta>|(<consulta>)}
EXCEPT
{<consulta>|(<consulta>)}
[{EXCEPT {<consulta>|(<consulta>)}}[ ...n ] ]
[ORDER BY {expression_columna|posicion_columna [ASC|DESC]}
[ ,...n ]]
Por ejemplo tenemos las tablas T1 y T2.
T1 T2
Cod
Codigo
1
2
2
3
4
4
5
5
6
SELECT cod FROM T1
EXCEPT
SELECT codigo FROM T2;
Devuelve:
Cod
1
6
Ejemplo:
Listar los productos que no aparezcan en ningn pedido.
SELECT idfab, idproducto
FROM productos
EXCEPT
SELECT DISTINCT fab, producto
FROM pedidos;

LA INTERSECCIN INTERSECT
Tiene una sintaxis parecida a las anteriores pero en el resultado de la interseccin aparecen las
filas que estn simultneamente en las dos consultas.
Las condiciones son las mismas que las de la unin.
{ <consulta>|(<consulta>)}
INTERSECT
{<especificacion_consulta>|(<especificacion_consulta>)}
[{INTERSECT {<consulta>|(<consulta>)}} [ ...n ] ]
[ORDER BY {expression_columna|posicion_columna [ASC|DESC]}
[ ,...n ]]
Retomando el ejemplo anterior:
SELECT cod FROM T1
INTERSECT
SELECT cod FROM T2;
Devuelve:

Motor de Base de Datos Pgina 37


Nota: Material tomado de Aulaclic.es Derechos Reservados
MOTOR DE BASE DE DATOS ORACLE
DOCENTE: DAIRO RODRIGUEZ BLANCO
ANLISIS Y PROGRAMACION DE COMPUTADORES

Cod
2
4
5
Ejemplo: Obtener todos los productos que valen ms de 20 euros y que adems se haya
vendido en un pedido ms de 300 euros de ese producto.
SELECT idfab, idproducto
FROM productos
WHERE precio > 20
INTERSECT
SELECT fab, producto
FROM pedidos
WHERE importe > 300;

LA COMPOSICIN DE TABLAS
Hasta ahora hemos operado con tablas que tenan el mismo esquema, pero muchas veces lo
que necesitamos es obtener una tabla que tenga en una misma fila datos de varias tablas, por
ejemplo, obtener las facturas y que en la misma fila de factura aparezca el nombre y direccin
del cliente. Pues en lo que queda del tema estudiaremos este tipo de consultas basadas en la
composicin de tablas. La composicin de tablas consiste en obtener a partir de dos tablas
cualesquiera una nueva tabla fusionando las filas de una con las filas de la otra, concatenando
los esquemas de ambas tablas. Consiste en formar parejas de filas.
La sentencia SELECT permite realizar esta composicin, incluyendo dos o ms tablas en la
clusula FROM.
Es hora de ampliar la clusula FROM que vimos en el tema anterior.
Empezaremos por estudiar la operacin a partir de la cual estn definidas las dems
operaciones de composicin de tabla, el producto cartesiano.
El producto cartesiano CROSS JOIN
El producto cartesiano obtiene todas las posibles concatenaciones de filas de la primera tabla
con filas de la segunda tabla.
Se indica escribiendo en la clusula FROM los nombres de las tablas separados por una coma o
utilizando el operador CROSS JOIN.
FROM {<tabla_origen>} [ ,...n ]
|<tabla_origen> CROSS JOIN <tabla_origen>
Tabla_origen puede ser un nombre de tabla o de vista o una tabla derivada (resultado de una
SELECT), en este ltimo caso la SELECT tiene que aparecer entre parntesis y la tabla derivada
debe llevar asociado obligatoriamente un alias de tabla. Tambin puede ser una composicin
de tablas.
Se pueden utilizar hasta 256 orgenes de tabla en una instruccin, aunque el lmite vara en
funcin de la memoria disponible y de la complejidad del resto de las expresiones de la
consulta. Tambin se puede especificar una variable table como un origen de tabla.
Ejemplo:
SELECT *
FROM empleados, oficinas;
Si ejecutamos esta consulta veremos que las filas del resultado estn formadas por las
columnas de empleados y las columnas de oficinas. En las filas aparece cada empleado
combinado con la primera oficina, luego los mismos empleados combinados con la segunda
oficina y as hasta combinar todos los empleados con todas las oficinas.
Si ejecutamos:
SELECT *
Motor de Base de Datos Pgina 38
Nota: Material tomado de Aulaclic.es Derechos Reservados
MOTOR DE BASE DE DATOS ORACLE
DOCENTE: DAIRO RODRIGUEZ BLANCO
ANLISIS Y PROGRAMACION DE COMPUTADORES

FROM empleados CROSS JOIN oficinas;


Obtenemos lo mismo.
Este tipo de operacin no es la que se utiliza ms a menudo, lo ms frecuente sera combinar
cada empleado con los datos de SU oficina. Lo podramos obtener aadiendo a la consulta un
WHERE para filtrar los registros correctos:
SELECT *
FROM empleados, oficinas
WHERE empleados.oficina=oficinas.oficina;
Aqu nos ha aparecido la necesidad de cualificar los campos ya que el nombre oficina es un
campo de empleados y de oficinas por lo que si no lo cualificamos, el sistema nos da error.
Hemos utilizado en la lista de seleccin *, esto nos recupera todas las columnas de las dos
tablas.
SELECT empleados.*,ciudad, region
FROM empleados, oficinas
WHERE empleados.oficina=oficinas.oficina;
Recupera todas las columnas de empleados y las columnas ciudad y regin de oficinas.
Tambin podemos combinar una tabla consigo misma, pero en este caso hay que definir un
alias de tabla, en al menos una, sino el sistema da error ya que no puede nombrar los campos.
SELECT *
FROM oficinas, oficinas as ofi2;
No insistiremos ms sobre el producto cartesiano porque no es la operacin ms utilizada, ya
que normalmente cuando queramos componer dos tablas lo haremos con una condicin de
seleccin basada en campos de combinacin y para este caso es ms eficiente el JOIN que
veremos a continuacin.

LA COMPOSICIN INTERNA INNER JOIN


Una composicin interna es aquella en la que los valores de las columnas que se estn
combinando se comparan mediante un operador de comparacin.
Es otra forma, mejor, de expresar un producto cartesiano con una condicin.
Es la operacin que ms emplearemos ya que lo ms frecuente es querer juntar los registros
de una tabla relacionada con los registros correspondientes en la tabla de referencia (aadir a
cada factura los datos de su cliente, aadir a cada lnea de pedido los datos de su producto,
etc..,).
FROM
<tabla_origen> INNER JOIN <tabla_origen> ON <condicion_combi>
tabla_origen tiene el mismo significado que en el producto cartesiano.
condicion_combi es cualquier condicin que permite seleccionar las parejas de filas que
aparecen en el resultado. Normalmente ser una condicin de igualdad.
SELECT *
FROM empleados INNER JOIN oficinas
ON empleados.oficina=oficinas.oficina;
Obtiene los empleados combinados con los datos de su oficina.
SELECT *
FROM pedidos INNER JOIN productos
ON producto = idproducto AND fab = idfab;
Obtiene los pedidos combinados con los productos correspondientes.
Normalmente la condicin de combinacin ser una igualdad pero se puede utilizar cualquier
operador de comparacin (<>, >).
Es fcil ver la utilidad de esta instruccin y de hecho se utilizar muy a menudo, pero hay algn
caso que no resuelve. En las consultas anteriores, no aparecen las filas que no tienen fila
correspondiente en la otra tabla.

Motor de Base de Datos Pgina 39


Nota: Material tomado de Aulaclic.es Derechos Reservados
MOTOR DE BASE DE DATOS ORACLE
DOCENTE: DAIRO RODRIGUEZ BLANCO
ANLISIS Y PROGRAMACION DE COMPUTADORES

SELECT numemp,nombre,empleados.oficina, ciudad


FROM empleados INNER JOIN oficinas
ON empleados.oficina=oficinas.oficina;
numemp Nombre oficina ciudad
101 Antonio Viguer 12 Alicante
102 Alvaro Jaumes 21 Badajoz
103 Juan Rovira 12 Alicante
104 Jos Gonzlez 12 Alicante
105 Vicente Pantalla 13 Castelln
106 Luis Antonio 11 Valencia
107 Jorge Gutirrez 22 A Corua
108 Ana Bustamante 21 Badajoz
109 Mara Sunta 11 Valencia
No aparecen los empleados que no tienen oficina, ni las oficinas que no tienen empleados,
porque para que salga la fila, debe de existir una fila de la otra tabla que cumpla la condicin.
Para resolver este problema debemos utilizar otro tipo de composicin, la composicin
externa.

LA COMPOSICIN EXTERNA LEFT, RIGHT Y FULL OUTER JOIN


La composicin externa se escribe de manera similar al INNER JOIN indicando una condicin de
combinacin pero en el resultado se aaden filas que no cumplen la condicin de
combinacin.
Sintaxis
FROM
<tabla_origen> {LEFT|RIGHT|FULL} [OUTER] JOIN <tabla_origen>
ON <condicion_combi>
La palabra OUTER es opcional y no aade ninguna funcin.
Las palabras LEFT, RIGHT y FULL indican la tabla de la cual se van a aadir las filas sin
correspondencia.
SELECT numemp,nombre,empleados.oficina, ciudad
FROM empleados LEFT JOIN oficinas
ON empleados.oficina=oficinas.oficina;
numemp Nombre oficina ciudad
101 Antonio Viguer 12 Alicante
102 Alvaro Jaumes 21 Badajoz
103 Juan Rovira 12 Alicante
104 Jos Gonzlez 12 Alicante
105 Vicente Pantalla 13 Castelln
106 Luis Antonio 11 Valencia
107 Jorge Gutirrez 22 A Corua
108 Ana Bustamante 21 Badajoz
109 Mara Sunta 11 Valencia
110 Juan Victor NULL NULL
Ahora s aparece el empleado 110 que no tiene oficina

Motor de Base de Datos Pgina 40


Nota: Material tomado de Aulaclic.es Derechos Reservados
MOTOR DE BASE DE DATOS ORACLE
DOCENTE: DAIRO RODRIGUEZ BLANCO
ANLISIS Y PROGRAMACION DE COMPUTADORES

Obtiene los empleados con su oficina y los empleados (tabla a la izquierda LEFT del JOIN) que
no tienen oficina aparecern tambin en el resultado con los campos de la
tabla oficinas rellenados a NULL.
SELECT numemp,nombre,empleados.oficina, ciudad, oficinas.oficina
FROM empleados RIGHT JOIN oficinas
ON empleados.oficina=oficinas.oficina;
numemp Nombre oficina ciudad oficina
106 Luis Antonio 11 Valencia 11
109 Mara Sunta 11 Valencia 11
101 Antonio Viguer 12 Alicante 12
103 Juan Rovira 12 Alicante 12
104 Jos Gonzlez 12 Alicante 12
105 Vicente Pantalla 13 Castelln 13
102 Alvaro Jaumes 21 Badajoz 21
108 Ana Bustamante 21 Badajoz 21
107 Jorge Gutirrez 22 A Corua 22
NULL NULL NULL Madrid 23
NULL NULL NULL Aranjuez 24
NULL NULL NULL Pamplona 26
NULL NULL NULL Valencia 28
Las oficinas 23,24,26 y 28 no tienen empleados.
Obtiene los empleados con su oficina y las oficinas (tabla a la derecha RIGHT del JOIN) que no
tienen empleados aparecern tambin en el resultado con los campos de la
tabla empleados rellenados a NULL.
SELECT numemp,nombre,empleados.oficina, ciudad, oficinas.oficina
FROM empleados FULL JOIN oficinas
ON empleados.oficina=oficinas.oficina;
numemp Nombre oficina ciudad oficina
101 Antonio Viguer 12 Alicante 12
102 Alvaro Jaumes 21 Badajoz 21
103 Juan Rovira 12 Alicante 12
104 Jos Gonzlez 12 Alicante 12
105 Vicente Pantalla 13 Castelln 13
106 Luis Antonio 11 Valencia 11
107 Jorge Gutirrez 22 A Corua 22
108 Ana Bustamante 21 Badajoz 21
109 Mara Sunta 11 Valencia 11
110 Juan Victor NULL NULL NULL
NULL NULL NULL Madrid 23
NULL NULL NULL Aranjuez 24
NULL NULL NULL Pamplona 26
NULL NULL NULL Valencia 28
Aparecen tanto los empleados sin oficina como las oficinas sin empleados.
Motor de Base de Datos Pgina 41
Nota: Material tomado de Aulaclic.es Derechos Reservados
MOTOR DE BASE DE DATOS ORACLE
DOCENTE: DAIRO RODRIGUEZ BLANCO
ANLISIS Y PROGRAMACION DE COMPUTADORES

SELECT numemp,nombre,empleados.oficina, ciudad, oficinas.oficina


FROM empleados FULL OUTER JOIN oficinas
ON empleados.oficina=oficinas.oficina;
Es equivalente, la palabra OUTER como hemos dicho no aade ninguna funcionalidad y se
utiliza si se quiere por cuestiones de estilo.
NOTA: Cuando necesitamos obtener filas con datos de dos tablas con una condicin de
combinacin utilizaremos un JOIN, os aconsejo empezar por escribir el JOIN con la condicin
que sea necesaria para combinar las filas, y luego plantearos si la composicin debe de ser
interna o externa. Para este segundo paso sta sera la norma a seguir:
Empezamos con INNER JOIN.
Si pueden haber filas de la primera tabla que no estn relacionadas con filas de la
segunda tabla y nos interesa que salgan en el resultado, entonces cambiamos a LEFT
JOIN.
Si pueden haber filas de la segunda tabla que no estn relacionadas con filas de la
primera tabla y nos interesa que salgan en el resultado, entonces cambiamos a RIGHT
JOIN.
Si necesitamos LEFT y RIGHT entonces utilizamos FULL JOIN.
Siguiendo el ejemplo anterior nos preguntaramos:
Pueden haber empleados que no tengan oficina y nos interesan?, si es que s, necesitamos un
LEFT JOIN.
Seguiramos preguntando:
Pueden haber oficinas que no tengan empleados y nos interesan?, si es que s, necesitamos
un RIGHT JOIN.
Si al final necesitamos LEFT y tambin RIGHT entonces utilizamos FULL JOIN.

COMBINAR VARIAS OPERACIONES


En las operaciones anteriores tabla_origen puede ser a su vez una composicin de tablas, en
este caso aunque slo sea obligatorio cuando queramos cambiar el orden de ejecucin de las
composiciones, es recomendable utilizar parntesis para delimitar las composiciones.
Por ejemplo:
SELECT numemp, nombre, empleados.oficina, ciudad, oficinas.oficina, pedidos.*
FROM (oficinas RIGHT JOIN empleados
ON empleados.oficina = oficinas.oficina)
INNER JOIN pedidos on rep=numemp;
O bien:
SELECT numemp, nombre, empleados.oficina, ciudad, oficinas.oficina, pedidos.*
FROM oficinas RIGHT JOIN (empleados INNER JOIN pedidos on rep = numemp)
ON empleados.oficina = oficinas.oficina);

Motor de Base de Datos Pgina 42


Nota: Material tomado de Aulaclic.es Derechos Reservados
MOTOR DE BASE DE DATOS ORACLE
DOCENTE: DAIRO RODRIGUEZ BLANCO
ANLISIS Y PROGRAMACION DE COMPUTADORES

CONSULTAS DE RESUMEN
Introduccin
Una de las funcionalidades de la sentencia SELECT es el permitir obtener resmenes de los
datos contenidos en las columnas de las tablas.
Para poder llevarlo a cabo la sentencia SELECT consta de una serie de clusulas especficas
(GROUP BY, HAVING), y Transact-SQL tiene definidas unas funciones para poder realizar estos
clculos, las funciones de agregado (tambin llamadas funciones de columna).
La diferencia entre una consulta de resumen y una consulta de las que hemos visto hasta
ahora es que en las consultas normales las filas del resultado se obtienen directamente de las
filas del origen de datos y cada dato que aparece en el resultado tiene su dato correspondiente
en el origen de la consulta mientras que las filas generadas por las consultas de resumen no
representan datos del origen sino un total calculado sobre estos datos. Esta diferencia har
que las consultas de resumen tengan algunas limitaciones que veremos a lo largo del tema.
Un ejemplo sera:

A la izquierda tenemos una consulta simple que nos saca las oficinas con sus ventas ordenadas
por regin, y a la derecha una consulta de resumen que obtiene la suma de las ventas de las
oficinas de cada regin
Las funciones de agregado
Una funcin de agregado SQL acepta un grupo de datos (normalmente una columna de datos)
como argumento, y produce un nico dato que resume el grupo. Por ejemplo la funcin AVG()
acepta una columna de datos numricos y devuelve la media aritmtica (average) de los
valores contenidos en la columna.
El mero hecho de utilizar una funcin de agregado en una consulta, convierte sta en una
consulta de resumen.
Todas las funciones de agregado tienen una estructura muy parecida:
Funcin ([ALL|DISTINCT] expression)

El grupo de valores sobre el que acta la funcin lo determina el resultado de la expresin que
ser un nombre de columna o una expresin basada en una columna o varias del origen de
datos. En la expresin nunca puede aparecer una funcin de agregado ni una subconsulta.
La palabra ALL indica que se tiene que tomar en cuenta todos los valores de la columna. Es el
valor por defecto.
La palabra DISTINCT hace que se consideren todas las repeticiones del mismo valor como uno
slo (considera valores distintos).

Motor de Base de Datos Pgina 43


Nota: Material tomado de Aulaclic.es Derechos Reservados
MOTOR DE BASE DE DATOS ORACLE
DOCENTE: DAIRO RODRIGUEZ BLANCO
ANLISIS Y PROGRAMACION DE COMPUTADORES

Todas las funciones de agregado se aplican a las filas del origen de datos una vez ejecutada la
clusula WHERE (si la hubiera).
Si exceptuamos la funcin COUNT, todas las funciones de agregado ignoran los valores NULL.
Una funcin de agregado puede aparecer en la lista de seleccin en cualquier lugar en el que
puede aparecer un nombre de columna. Puede, por ejemplo, formar parte de una expresin
pero no se pueden anidar funciones de agregado.
Tampoco se pueden mezclar funciones de columna con nombres de columna ordinarios. Hay
excepciones a esta regla pero cuando definimos agrupaciones y subconsultas que veremos
ms adelante.

La funcin COUNT
COUNT ({[ALL|DISTINCT] expresion | * } )
Expresion puede ser de cualquier tipo excepto text, image o ntext. No se permite utilizar
funciones de agregado ni subconsultas. El tipo de dato devuelto es int.
Si el nmero de valores devueltos por expresion es superior a 231-1, COUNT genera un error,
en ese caso hay que utilizar la funcin COUNT_BIG.
La funcin cuenta los valores distintos de NULL que hay en la columna. La palabra ALL indica
que se tienen que tomar todos los valores de la columna, mientras que DISTINCT hace que se
consideren todas las repeticiones del mismo valor como uno solo. Estos parmetros son
opcionales, por defecto se considera ALL.
Por ejemplo:
SELECT COUNT(region) FROM oficinas;
Devuelve 9 porque tenemos nueve valores no nulos en la columna region. A la hora de
interpretar un COUNT es conveniente no olvidar que cuenta valores no nulos, por ejemplo si
interpretramos la sentencia tal cual se lee, cuntas regiones tenemos en oficinas sera
errneo, realmente estamos obteniendo cuntas oficinas tienen una regin asignada.

SELECT COUNT(DISTINCT region) FROM oficinas;


Devuelve 4 porque tenemos cuatro valores distintos, no nulos, en la columna regin, los
valores repetidos los considera slo una vez. Ahora s nos devuelve cuntas regiones tenemos
en oficinas.
Si utilizamos * en vez de expresin, devuelve el nmero de filas del origen que nos quedan
despus de ejecutar la clusula WHERE.

COUNT(*) no acepta parmetros y no se puede utilizar con DISTINCT. COUNT(*) no requiere un


parmetro expression porque, por definicin, no utiliza informacin sobre ninguna columna
especfica. En el recuento se incluyen las filas que contienen valores NULL.
SELECT COUNT(*) FROM empleados WHERE oficina=12;
Obtiene el nmero de empleados asignados a la oficina 12.
Si tenemos un COUNT(columna) y columna no contiene valores nulos, se obtiene el mismo
resultado que COUNT(*) pero el COUNT(*) es ms rpido por lo que en este caso hay que
utilizarlo en vez de COUNT(columna).
Por ejemplo:
SELECT COUNT(*) FROM empleados WHERE oficina IS NOT NULL;
Es mejor que:
SELECT COUNT(oficina) FROM empleados WHERE oficina IS NOT NULL;
Las dos nos devuelven el nmero de empleados que tienen una oficina asignada pero la
primera es mejor porque se calcula ms rpidamente.

La funcin COUNT_BIG

Motor de Base de Datos Pgina 44


Nota: Material tomado de Aulaclic.es Derechos Reservados
MOTOR DE BASE DE DATOS ORACLE
DOCENTE: DAIRO RODRIGUEZ BLANCO
ANLISIS Y PROGRAMACION DE COMPUTADORES

Funciona igual que la funcin COUNT. La nica diferencia entre ambas funciones est en los
valores devueltos, COUNT_BIG siempre devuelve un valor de tipo bigint y por lo tanto admite
ms valores de entrada, no est limitado a 231-1 valores de entrada como COUNT.
La funcin MAX
MAX ([ALL|DISTINCT] expression)
Devuelve el valor mximo de la expresin sin considerar los nulos.
MAX se puede usar con columnas numricas, de caracteres y de datetime, pero no con
columnas de bit. No se permiten funciones de agregado ni subconsultas.
Utilizar DISTINCT no tiene ningn sentido con MAX (el valor mximo ser el mismo si
consideramos las repeticiones o no) y slo se incluye para la compatibilidad con SQL-92.
Por ejemplo:
SELECT SUM(ventas) AS VentasTotales, MAX(objetivo) AS MayorObjetivo
FROM oficinas;
Devuelve 9 porque tenemos nueve valores no nulos en la columna region. A la hora de
interpretar un COUNT es conveniente no olvidar que cuenta valores no nulos, por ejemplo si
interpretramos la sentencia tal cual se lee, cuntas regiones tenemos en oficinas sera
errneo, realmente estamos obteniendo cuntas oficinas tienen una regin asignada.

La funcin MIN
MIN ([ALL|DISTINCT] expression)
Devuelve el valor mnimo de la expresin sin considerar los nulos.
MIN se puede usar con columnas numricas, de caracteres y de datetime, pero no con
columnas de bit. No se permiten funciones de agregado ni subconsultas.
Utilizar DISTINCT no tiene ningn sentido con MIN (el valor mnimo ser el mismo si
consideramos las repeticiones o no) y slo se incluye para la compatibilidad con SQL-92.

La funcin SUM
SUM ([ALL|DISTINCT] expresion )
Devuelve la suma de los valores devueltos por la expresin.
Slo puede utilizarse con columnas numricas.
El resultado ser del mismo tipo aunque puede tener una precisin mayor.
SELECT SUM(importe) FROM pedidos;
Obtiene el importe total vendido en todos los pedidos.
SELECT SUM(ventas) AS VentasTotales, MAX(objetivo) AS MayorObjetivo
FROM oficinas;
Devuelve la suma de las ventas de todas las oficinas y de los objetivos de todas las oficinas, el
de mayor importe.
La funcin AVG
AVG ([ALL|DISTINCT] expresion )
Devuelve el promedio de los valores de un grupo, para calcular el promedio se omiten los
valores nulos.
El grupo de valores lo determina el resultado de la expresin que ser un nombre de columna
o una expresin basada en una columna o varias del origen de datos.
La funcin se aplica tambin a campos numricos, y en este caso el tipo de dato del resultado
puede cambiar segn las necesidades del sistema para representar el valor del resultado.
La funcin VAR
VAR ([ALL|DISTINCT] expresion )
Devuelve la varianza estadstica de todos los valores de la expresin especificada.
VAR slo se puede utilizar con columnas numricas. Los valores NULL se pasan por alto.
La funcin VARP
VARP ([ALL|DISTINCT] expresion )

Motor de Base de Datos Pgina 45


Nota: Material tomado de Aulaclic.es Derechos Reservados
MOTOR DE BASE DE DATOS ORACLE
DOCENTE: DAIRO RODRIGUEZ BLANCO
ANLISIS Y PROGRAMACION DE COMPUTADORES

Devuelve la varianza estadstica de la poblacin para todos los valores de la expresin


especificada.
Slo se puede utilizar con columnas numricas. Los valores NULL se pasan por alto.

La funcin STDEV
STDEV ([ALL|DISTINCT] expresion )
Devuelve la desviacin tpica estadstica de todos los valores de la expresin especificada.
Slo se puede utilizar con columnas numricas. Los valores NULL se pasan por alto.
La funcin STDEVP
STDEVP ([ALL|DISTINCT] expresion )
Devuelve la desviacin estadstica estndar para la poblacin de todos los valores de la
expresin especificada.
Slo se puede utilizar con columnas numricas. Los valores NULL se pasan por alto.
La funcin GROUPING
GROUPING (nb_columna)
Es una funcin de agregado que genera como salida una columna adicional con el valor 1 si la
fila se agrega mediante el operador CUBE o ROLLUP, o el valor 0 cuando la fila no es el
resultado de CUBE o ROLLUP.
Nb_columna tiene que ser una de las columnas de agrupacin y la clusula GROUP BY debe
contener el operador CUBE o ROLLUP.
En el siguiente punto, cuando veamos las clusulas CUBE y ROLLUP quedar ms claro.

AGRUPAMIENTO DE FILAS (CLUSULA GROUP BY).


Hasta ahora las consultas sumarias que hemos visto obtienen totales de todas las filas del
origen y producen una nica fila de resultado.
Muchas veces cuando calculamos resmenes nos interesan totales parciales, por ejemplo
saber de cada empleado cunto ha vendido, y cul ha sido su pedido mximo, de cada cliente
cundo fue la ltima vez que nos compr, etc.
En todos estos casos en vez de obtener una fila nica de resultados necesitamos una fila por
cada empleado, cliente, etc.
Podemos obtener estos subtotales con la clusula GROUP BY.
GROUP BY [ ALL ] expresion_agrupacion [ ,...n ]
[ WITH { CUBE | ROLLUP } ]
Una consulta con una clusula GROUP BY agrupa los datos de la tabla origen y produce una
nica fila resultado por cada grupo formado. Las columnas indicadas en el GROUP BY se
llaman columnas de agrupacin o agrupamiento .
Cuando queremos realizar una agrupacin mltiple, por varias columnas, stas se indican en la
clusula GROUP BY en el orden de mayor a menor agrupacin igual que con la clusula ORDER
BY.
expresion_agrupacion puede ser una columna o una expresin no agregada que haga
referencia a una columna devuelta por la clusula FROM. Un alias de columna que est
definido en la lista de seleccin no puede utilizarse para especificar una columna de
agrupamiento.
No se pueden utilizar columnas de tipo text, ntext e image en expresion_agrupacion.
En las clusulas GROUP BY que no contengan CUBE o ROLLUP, el nmero de columnas de
agrupacin est limitado por los tamaos de columna de GROUP BY, las columnas de agregado
y los valores de agregado que participan en la consulta. Este lmite procede del lmite de 8.060
bytes de la tabla de trabajo intermedia que se necesita para contener los resultados
intermedios de la consulta. Se permite un mximo de 10 expresiones de agrupamiento cuando
se especifica CUBE o ROLLUP.

Motor de Base de Datos Pgina 46


Nota: Material tomado de Aulaclic.es Derechos Reservados
MOTOR DE BASE DE DATOS ORACLE
DOCENTE: DAIRO RODRIGUEZ BLANCO
ANLISIS Y PROGRAMACION DE COMPUTADORES

Si en la columna de agrupacin existen valores nulos, se generar una fila de resumen para
este valor, en este caso se considera el valor nulo como otro valor cualquiera.
Ejemplo:
SELECT oficina, count(numemp) AS [Nmero de empleados]
FROM empleados
GROUP BY oficina;
Resultado:
oficina Nmero de empleados
NULL 2
11 2
12 3
13 1
21 2
22 1
Hay empleados sin oficinas (con oficina a nulo), estos forman un grupo con el valor NULL en
oficina, en este caso hay dos empleados as.
Podemos indicar varias columnas de agrupacin.
Ejemplo:
SELECT rep, clie, count(numpedido) AS [Nmero de pedidos], MAX(importe) AS [Importe
mximo]
FROM pedidos
WHERE YEAR(fechapedido) = 1997
GROUP BY rep, clie
ORDER BY rep, clie;
Resultado:
Nmero Importe
rep clie
de pedidos mximo
101 2113 1 225,00
102 2106 2 21,30
102 2120 1 37,50
103 2111 2 21,00
105 2103 4 275,00
105 2111 1 37,45
106 2101 1 14,58
107 2109 1 313,50
107 2124 2 24,30
108 2112 1 29,25
108 2114 1 71,00
108 2118 3 14,20
De cada representante obtenemos el nmero de pedidos y el importe mximo vendido a cada
cliente, de las ventas de 1997. La clusula ORDER BY se ha incluido para que las filas aparezcan
ordenadas y quede ms claro.

Motor de Base de Datos Pgina 47


Nota: Material tomado de Aulaclic.es Derechos Reservados
MOTOR DE BASE DE DATOS ORACLE
DOCENTE: DAIRO RODRIGUEZ BLANCO
ANLISIS Y PROGRAMACION DE COMPUTADORES

Hemos dicho que los resmenes se calculan sobre todas las filas del origen despus de haber
ejecutado el WHERE, pues ALL permite obtener un resumen de las filas que no cumplen el
WHERE.
ALL Incluye todos los grupos y conjuntos de resultados, incluso aquellos en los que no hay filas
que cumplan la condicin de bsqueda especificada en la clusula WHERE. Cuando se
especifica ALL, se devuelven valores NULL para las columnas de resumen de los grupos que no
cumplen la condicin de bsqueda. No se puede especificar ALL con los operadores CUBE y
ROLLUP.
GROUP BY ALL no se admite en consultas que tienen acceso a tablas remotas si tambin hay
una clusula WHERE en la consulta.
Por ejemplo, vamos a modificar la consulta anterior:
SELECT rep, clie, count(numpedido) AS [Nmero de pedidos], MAX(importe) AS [Importe
mximo]
FROM pedidos
WHERE YEAR(fechapedido) = 1997
GROUP BY ALL rep, clie
ORDER BY rep, clie;
Resultado:
Nmero Importe
rep clie
de pedidos mximo
101 2102 0 NULL
101 2108 0 NULL
101 2113 1 225,00
102 2106 2 21,30
102 2120 1 37,50
103 2111 2 21,00
105 2103 4 275,00
105 2111 1 37,45
106 2101 1 14,58
106 2117 0 NULL
107 2109 1 313,50
107 2124 2 24,30
108 2112 1 29,25
108 2114 1 71,00
108 2118 3 14,20
Cul ha sido el efecto de aadir ALL? Se han aadido filas para las filas del origen que no
cumplen la condicin del WHERE pero sin que intervengan en el clculo de las funciones de
agregado.
Por ejemplo el representante 101 tiene pedidos con el cliente 2102 pero estos pedidos no son
del ao 1997, por eso aparece la primera fila (no estaba en el resultado de la otra consulta)
pero con 0 y NULL como resultados de las funciones de agregado.
ROLLUP especifica que, adems de las filas que normalmente proporciona GROUP BY, se
incluyen filas de resumen en el conjunto de resultados. Los grupos se resumen en un orden
jerrquico, desde el nivel inferior del grupo hasta el superior. La jerarqua del grupo se
determina por el orden en que se especifican las columnas de agrupamiento. Cambiar el orden
de las columnas de agrupamiento puede afectar al nmero de filas generadas en el conjunto

Motor de Base de Datos Pgina 48


Nota: Material tomado de Aulaclic.es Derechos Reservados
MOTOR DE BASE DE DATOS ORACLE
DOCENTE: DAIRO RODRIGUEZ BLANCO
ANLISIS Y PROGRAMACION DE COMPUTADORES

de resultados.
Por ejemplo:
SELECT rep, clie, count(numpedido) AS [Nmero de pedidos], MAX(importe) AS [Importe
mximo]
FROM pedidos
WHERE YEAR(fechapedido) = 1997
GROUP BY rep, clie WITH ROLLUP;
Resultado:
Nmero Importe
rep clie
de pedidos mximo
101 2113 1 225,00
101 NULL 1 225,00
102 2106 1 21,30
102 2120 1 37,50
102 NULL 3 37,50
103 2111 2 21,00
103 NULL 2 21,00
105 2103 4 275,00
105 2111 1 37,45
105 NULL 5 275,00
106 2101 1 14,28
106 NULL 1 14,28
107 2109 1 313,50
107 2124 2 24,30
107 NULL 3 313,50
108 2112 1 29,25
108 2114 1 71,00
108 2118 3 14,20
108 NULL 5 71,00
... ... ... ...
NULL NULL 23 450,00
Efecto: Se han aadido automticamente subtotales por cada nivel de agrupamiento y una
lnea de totales generales al final. En este caso no hemos incluido ORDER BY porque las filas
salen ya ordenadas.

CUBE especifica que, adems de las filas que normalmente proporciona GROUP BY, deben
incluirse filas de resumen en el conjunto de resultados. Se devuelve una fila de resumen
GROUP BY por cada posible combinacin de grupo y subgrupo del conjunto de resultados. En
el resultado se muestra una fila de resumen GROUP BY como NULL, pero se utiliza para indicar
todos los valores.
Por ejemplo:
SELECT rep, clie, count(numpedido) AS [Nmero de pedidos], MAX(importe) AS [Importe
mximo]
FROM pedidos
WHERE YEAR(fechapedido) = 1997
Motor de Base de Datos Pgina 49
Nota: Material tomado de Aulaclic.es Derechos Reservados
MOTOR DE BASE DE DATOS ORACLE
DOCENTE: DAIRO RODRIGUEZ BLANCO
ANLISIS Y PROGRAMACION DE COMPUTADORES

GROUP BY rep, clie WITH CUBE;


Resultado:
Nmero Importe
rep clie
de pedidos mximo
101 2113 1 225,00
101 NULL 1 225,00
102 2106 1 21,30
102 2120 1 37,50
102 NULL 3 37,50
103 2111 2 21,00
103 NULL 2 21,00
105 2103 4 275,00
105 2111 1 37,45
105 NULL 5 275,00
106 2101 1 14,28
106 NULL 1 14,28
107 2109 1 313,50
107 2124 2 24,30
107 NULL 3 313,50
108 2112 1 29,25
108 2114 1 71,00
108 2118 3 14,20
108 NULL 5 71,00
... ... ... ...
NULL NULL 23 450,00
NULL 2101 1 14,58
NULL 2103 4 275,00
NULL 2106 2 21,30
NULL 2107 1 6,32
NULL 2108 1 56,25
NULL 2109 1 313,50
NULL 2111 3 37,45
NULL 2112 2 450,00
NULL 2113 1 225,00
NULL 2114 1 71,00
NULL 2118 3 14,20
NULL 2120 1 37,50
NULL 2124 2 24,30
Efecto: Obtenemos adems de los resultados obtenidos con ROLLUP (los totales por cada
representante), los totales por el otro criterio (los totales por cada cliente).
El nmero de filas de resumen del conjunto de resultados se determina mediante el nmero

Motor de Base de Datos Pgina 50


Nota: Material tomado de Aulaclic.es Derechos Reservados
MOTOR DE BASE DE DATOS ORACLE
DOCENTE: DAIRO RODRIGUEZ BLANCO
ANLISIS Y PROGRAMACION DE COMPUTADORES

de columnas que contiene la clusula GROUP BY. Cada operando (columna) de la clusula
GROUP BY se enlaza segn el agrupamiento NULL y se aplica el agrupamiento al resto de los
operandos (columnas). CUBE devuelve todas las combinaciones posibles de grupo y subgrupo.
Tanto si utilizamos CUBE como ROLLUP, nos ser til la funcin de agregado GROUPING.
Si cogemos por ejemplo la primera fila remarcada (101 NULL ) el valor NULL, no sabemos si
se refiere a una fila de subtotal o a que el representante 101 ha realizado un pedido sin
nmero de cliente. Para poder salvar este problema se utiliza la funcin de agregado
GROUPING.
SELECT rep, clie, count(numpedido) AS [Nmero de pedidos], MAX(importe) AS [Importe
mximo], GROUPING(clie) AS [Fila resumen]
FROM pedidos
WHERE YEAR(fechapedido) = 1997
GROUP BY rep, clie WITH ROLLUP;
Nmero Importe Fila
rep clie
de pedidos mximo Resumen
101 2113 1 225,00 0
101 NULL 1 225,00 1
102 2106 2 21,30 0
102 2120 1 37,50 0
102 NULL 3 37,50 1
103 2111 2 21,00 0
Las filas que corresponden a subtotales aparecen con un 1 y las normales con un cero.
Ahora que estamos ms familiarizados con las columnas de agrupamiento debemos comentar
una regla a no olvidar:
EN LA LISTA DE SELECCIN DE UNA CONSULTA DE RESUMEN UN NOMBRE DE COLUMNA NO
PUEDE APARECER FUERA DE UNA FUNCIN DE AGREGADO SI NO ES UNA COLUMNA DE
AGRUPACIN.

Seleccin sobre grupos de filas, la clusula HAVING


Cuando queremos incluir una clusula de seleccin sobre las filas del origen, utilizamos la
clusula WHERE, pero cuando estamos definiendo una consulta de resumen, no podemos
utilizar esta clusula para seleccionar filas del resultado ya que cada una de stas representa
un grupo de filas de la tabla original. Para seleccionar filas del resumen tenemos la clusula
HAVING.
HAVING condicin de bsqueda
HAVING funciona igual que la clusula WHERE pero en vez de actuar sobre las filas del origen
de datos, acta sobre las filas del resultado, selecciona grupos de filas por lo que la condicin
de bsqueda sufrir alguna limitacin, la misma que para la lista de seleccin:
Ejemplo:
SELECT oficina, count(numemp) AS [Nmero de empleados]
FROM empleados
GROUP BY oficina
HAVING COUNT(numemp)<2;
Resultado:
oficina Nmero de empleados
13 1
22 1

Motor de Base de Datos Pgina 51


Nota: Material tomado de Aulaclic.es Derechos Reservados
MOTOR DE BASE DE DATOS ORACLE
DOCENTE: DAIRO RODRIGUEZ BLANCO
ANLISIS Y PROGRAMACION DE COMPUTADORES

Esta SELECT es la misma que la del primer ejemplo del apartado sobre la clusula GROUP BY, la
diferencia es que le hemos aadido la clusula HAVING, que hace que del resultado slo se
visualicen los grupos que cumplan la condicin. Es decir slo aparecen las oficinas que tienen
menos de 2 empleados.
Siempre que en una condicin de seleccin haya una funcin de columna, la condicin deber
incluirse en la clusula HAVING, adems, como HAVING filtra filas del resultado, slo puede
contener expresiones (nombres de columnas, expresiones, funciones) que tambin pueden
aparecer en la lista de seleccin, por lo que tambin se aplica la misma regla a no olvidar:
EN LA CLUSULA HAVING UN NOMBRE DE COLUMNA NO PUEDE APARECER FUERA DE UNA
FUNCIN DE AGREGADO SI NO ES UNA COLUMNA DE AGRUPACIN.
Las expresiones que pongamos en HAVING no tienen porqu aparecer en la lista de seleccin,
por ejemplo en la SELECT anterior se poda haber escrito:
HAVING SUM(ventas)=10000

Motor de Base de Datos Pgina 52


Nota: Material tomado de Aulaclic.es Derechos Reservados
MOTOR DE BASE DE DATOS ORACLE
DOCENTE: DAIRO RODRIGUEZ BLANCO
ANLISIS Y PROGRAMACION DE COMPUTADORES

ACTUALIZACIN DE DATOS
Introduccin
Hasta ahora hemos trabajado con tablas que tenan datos introducidos y cuando nos ha hecho
falta hemos aadido nuevos datos en las mismas y hemos modificado algn dato directamente
desde el entorno de SSMS, en este tema veremos cmo hacerlo con instrucciones de Transact-
SQL.
Seguimos en el DML porque las instrucciones que veremos actan sobre los datos de la base
de datos no sobre su definicin y tenemos tres tipos de operaciones posibles:
Insertar nuevas filas en una tabla.
Modificar datos ya almacenados.
Eliminar filas de una tabla.
Insertar creando una nueva tabla
Una forma de insertar datos es crear una tabla que incluya los datos de otra. Esta es la
sentencia SELECT... INTO.
SELECT ...
INTO nb_NuevaTabla
FROM ...

nb_NuevaTabla es el nombre de la tabla que se va a crear, si en la base de datos ya hay una


tabla con ese nombre, el sistema genera un error y no se ejecuta la sentencia.
En la nueva tabla las columnas tendrn el mismo tipo y tamao que las columnas del resultado
de la SELECT, se llamarn con el nombre de alias de la columna o en su defecto con el nombre
de la columna, pero no se transfiere ninguna otra propiedad del campo o de la tabla como por
ejemplo las claves e ndices.
Si retomamos el ejemplo del punto anterior:
CREATE TABLE trabajo (col1 INT, col2 VARCHAR(20), col3 MONEY);
INSERT INTO trabajo SELECT oficina, ciudad, ventas
FROM oficinas
WHERE region = 'Centro';
Se podra obtener el mismo resultado con una sola instruccin:
SELECT oficina AS col1, ciudad AS col2, ventas AS col3
INTO trabajo
FROM oficinas
WHERE region = 'Centro'
Si se tiene poca experiencia en esta instruccin, lo mejor es primero escribir la SELECT que
permite obtener las filas a insertar y una vez la tenemos aadir la clusula INTO destino
delante de FROM.

Insertar en una tabla existente INSERT INTO


La insercin de nuevos datos en una tabla, se realiza aadiendo filas enteras a la tabla, la
sentencia SQL que lo permite es la orden INSERT (o tambin denominada INSERT INTO).
De la sentencia INSERT completa, nosotros estudiaremos la sintaxis ms utilizada y estndar:
INSERT [INTO] <destino>
{
[(lista_columnas)]
{VALUES ({DEFAULT|NULL|expresion}[ ,...n ])
|tabla_derivada
}
}
|DEFAULT VALUES
[;]

Motor de Base de Datos Pgina 53


Nota: Material tomado de Aulaclic.es Derechos Reservados
MOTOR DE BASE DE DATOS ORACLE
DOCENTE: DAIRO RODRIGUEZ BLANCO
ANLISIS Y PROGRAMACION DE COMPUTADORES

<destino> ::=
{
[nbBaseDatos.nbEsquema. | nbEsquema.]nbTablaVista
}
Con esta instruccin podemos insertar una fila de valores determinados o un conjunto de filas
derivadas de otra consulta.

INSERTAR UNA FILA DE VALORES


Para insertar una fila de valores utilizamos la sintaxis:
INSERT [INTO] <destino> [(lista_columnas)]
VALUES ({DEFAULT|NULL|expresion}[ ,...n ]) [;]
La palabra reservada INTO es opcional y no aade funcionalidad a la instruccin, originalmente
era obligatoria.
Despus de indicar que queremos insertar, debemos indicar dnde, mediante <destino>.
<destino> es el nombre de la tabla donde queremos insertar, puede ser un nombre de tabla o
un nombre de vista.
Si utilizamos una vista, y sta tiene un origen basado en varias tablas, en su lista de seleccin
debern aparecer columnas de una sola tabla (no podemos insertar datos en varias tablas a la
vez).
Con la clusula VALUES indicamos entre parntesis los valores a insertar, separados por comas.
Cada valor se puede indicar mediante:
una expresin que normalmente ser una constante,
mediante la palabra reservada DEFAULT que indica valor por defecto en este caso la
columna se rellenar con el valor predeterminado de la columna, si la columna no
tiene DEFAULT se sustituir por el valor nulo NULL.
Mediante la palabra reservada NULL valor nulo.
Delante de VALUES, de forma opcional podemos indicar una lista de columnas entre
parntesis. Las columnas son columnas del destino.

Cuando indicamos nombres de columnas, esas columnas sern las que reciban los valores a
insertar, la asignacin de valores se realiza por posicin, la primera columna recibe el primer
valor, la segunda columna el segundo, y as sucesivamente.
En la lista, las columnas pueden estar en cualquier orden y tambin se pueden omitir algunas
columnas.
Una columna que no aparezca en la lista de columnas se rellenar de acuerdo a su definicin:
con su valor por defecto si est definida con la clusula DEFAULT
con el valor de identidad incremental siguiente si tiene la propiedad IDENTITY.
con el valor calculado si es una columna calculada.
con el valor NULL , en cualquier otro caso y si la columna lo admite.
Cuando no se indica una lista de columnas el sistema asume por defecto todas las columnas de
la tabla y en el mismo orden que aparecen en la definicin de la tabla, en este caso, los valores
se tienen que especificar en el mismo orden que las columnas en la definicin de la tabla, y se
tiene que especificar un valor por cada columna ya que los valores se rellenan por posicin, la
primera columna recibe el primer valor, la segunda columna el segundo, y as sucesivamente.
En cualquier caso, el nmero de valores debe coincidir con el nmero de columnas y los tipos
de dato de los valores deben ser compatibles con las columnas.
Aunque pueda parecer ms engorroso escribir la lista de columnas, es un hbito
recomendable, hace que la sentencia sea ms fcil de leer y mantener (cuando leemos la
sentencia sabemos en qu columnas asignamos los valores sin necesidad de consultar la

Motor de Base de Datos Pgina 54


Nota: Material tomado de Aulaclic.es Derechos Reservados
MOTOR DE BASE DE DATOS ORACLE
DOCENTE: DAIRO RODRIGUEZ BLANCO
ANLISIS Y PROGRAMACION DE COMPUTADORES

definicin de la tabla) y evita que se tenga que cambiar la sentencia si se modifica el esquema
de la tabla (si el orden de las columnas dentro de la tabla cambia).
Los registros se agregan al final de la tabla.
Cuando se insertan nuevas filas en una tabla, el sistema comprobar que la nueva fila no
infrinja ninguna regla de integridad, por ejemplo no podremos asignar a una columna
PRIMARY KEY un valor nulo o que ya exista en la tabla, a una columna UNIQUE un valor que ya
exista en la tabla, a una columna NOT NULL un valor NULL, a una clave ajena (FOREIGN KEY) un
valor que no exista en la tabla de referencia.
De producirse alguna de las situaciones anterior, la instruccin genera un mensaje de error y la
fila no se inserta.
Ejemplos.
INSERT INTO oficinas (oficina, ciudad) VALUES (26, 'Elx');
En este caso hemos indicado slo dos columnas y dos valores, las dems columnas se rellenan
con el valor por defecto si lo tiene (DEFAULT) o con NULL. Si alguna columna no nombrada no
admite nulos ni tiene clusula DEFAULT definida, la instruccin dar error.
INSERT INTO oficinas
VALUES (27,'Mstoles','Centro',default ,null, default)
Aqu no hemos indicado una lista de columnas luego los valores se tienen que indicar en el
mismo orden que las columnas dentro de la tabla, si nos equivocamos de orden, el valor se
guardar en una columna errnea (si los tipos son compatibles) o generar un mensaje de
error y la fila no se insertar (si los tipos no son compatibles).

INSERCIN DE VARIAS FILAS


Si los valores que queremos insertar los tenemos en otras tablas, podemos insertar varias filas
a la vez indicando una consulta que genere las filas de valores a insertar. En este caso
utilizamos la sintaxis:
INSERT [INTO] <destino> [(lista_columnas)]
tabla_derivada [;]
<destino> y lista_columnas funcionan igual que en el punto anterior.
Tabla_derivada es cualquier instruccin SELECT vlida que devuelva filas con los datos que se
van a cargar en el destino.
Cada fila devuelta por la SELECT es una lista de valores que se intentar insertar como con la
clusula VALUES, por lo que las columnas devueltas por la SELECT debern cumplir las mismas
reglas que los valores de la lista de valores anteriores.
Ejemplo:
CREATE TABLE trabajo (col1 INT, col2 VARCHAR(20), col3 MONEY);
Creamos una tabla trabajo de 3 columnas
INSERT INTO trabajo SELECT oficina, ciudad, ventas
FROM oficinas
WHERE region = 'Centro';
Insertamos en trabajo el resultado de la SELECT (el nmero de oficina, ciudad y ventas de las
oficinas del Centro).
En este caso no hemos incluido una lista de columnas, por lo que en la SELECT tenemos que
generar los valores en el mismo orden que en trabajo.
Si hubiesemos escrito:
INSERT INTO trabajo SELECT ciudad, oficina, ventas
FROM oficinas
WHERE region = 'Centro';
Hubiese dado error porque la columna col1 es INT y el valor a asignar es texto (el nombre de la
ciudad de la oficina).
INSERT INTO trabajo (col2, col1)

Motor de Base de Datos Pgina 55


Nota: Material tomado de Aulaclic.es Derechos Reservados
MOTOR DE BASE DE DATOS ORACLE
DOCENTE: DAIRO RODRIGUEZ BLANCO
ANLISIS Y PROGRAMACION DE COMPUTADORES

SELECT ciudad, oficina


FROM oficinas
WHERE region = 'Este';
En este caso hemos incluido una lista de columnas, la SELECT debe generar los valores
correspondientes, y col3 que no se rellena explcitamente se rellenar con NULL porque la
columna col3 no est definida como columna calculada, ni con DEFAULT, ni IDENTITY y adems
admite nulos.
Insertar una fila de valores por defecto
TRANSACT-SQL nos permite insertar una fila de valores por defecto utilizando la sintaxis:
INSERT [INTO] <destino> DEFAULT VALUES
[;]
Hace que la nueva fila contenga los valores predeterminados definidos para cada columna.
Hay que tener en cuenta una serie de aspectos al utilizar esta instruccin:
Puede generar filas duplicadas en la tabla si los valores que se generan son siempre los
mismos.
Si la tabla tiene una clave principal, esta tendr que estar basada en una columna con la
propiedad IDENTITY para que se generen valores diferentes automticamente.
Si una columna est definida como NOT NULL tendr que incluir un DEFAULT o ser una
columna calculada con una expresin compatible.

MODIFICAR DATOS ALMACENADOS - UPDATE


La sentencia UPDATE modifica los valores de una o ms columnas en las filas seleccionadas de
una nica tabla.
Para modificar los datos de una tabla es necesario disponer del privilegio UPDATE sobre dicha
tabla.
UPDATE
[ TOP ( expression ) [ PERCENT ] ]
<destino>
SET { nbcolumna = { expresion | DEFAULT | NULL }
} [ ,...n ]
[ FROM{ <origen> }]
[ WHERE <condicion> ]
[;]
<destino> ::=
{
[nbBaseDatos.[nbEsquema.]| nbEsquema.]nbTablaVista
}
Con <destino> indicamos la tabla que se va a actualizar.
La clusula SET especifica qu columnas van a modificarse y con qu valor, el valor se puede
expresar mediante una expresin, la palabra DEFAULT que equivale al valor predeterminado
de la columna, o el valor nulo NULL.
Las columnas de identidad no se pueden actualizar.
Expresin en cada asignacin debe generar un valor del tipo de dato apropiado para la
columna indicada. La expresin debe ser calculable basada en los valores de la fila actualmente
en actualizacin. Si para el clculo se utiliza una columna que tambin se modifica, el valor que
se utilizar es el de antes de la modificacin, lo mismo para la condicin del WHERE.
Expresin tambin puede ser una subconsulta siempre y cuanto devuelva un nico valor y
cumpla las condiciones anteriormente expuestas.
Por ejemplo:
UPDATE oficinas SET ventas = 0;

Motor de Base de Datos Pgina 56


Nota: Material tomado de Aulaclic.es Derechos Reservados
MOTOR DE BASE DE DATOS ORACLE
DOCENTE: DAIRO RODRIGUEZ BLANCO
ANLISIS Y PROGRAMACION DE COMPUTADORES

Actualiza todas las filas de la tabla oficinas dejando el campo ventas con el valor cero.
Si el campo ventas est definido con un valor predeterminado 0, la sentencia anterior equivale
a:
UPDATE oficinas SET ventas = DEFAULT;
Si lo que queremos es dejar el campo a nulo:
UPDATE oficinas SET ventas = NULL;
En una misma sentencia podemos actualizar varias columnas, slo tenemos que indicar las
distintas asignaciones separadas por comas:
UPDATE oficinas SET ventas = 0, objetivo = 0;
Los nombres de columna pueden especificarse en cualquier orden.
Si no queremos actualizar todas las filas de la tabla sino unas cuantas, utilizaremos la clusula
TOP, o unas determinadas, utilizaremos la clusula WHERE.
TOP ( expresion ) [ PERCENT ]
Especifica el nmero o porcentaje de filas aleatorias que se van a modificar.
expression debe generar un valor numrico e indica el nmero de filas a modificar empezando
por el principio. Como en la SELECT, si aadimos la palabra PERCENT, el nmero representado
por expresin se refiere al porcentaje de filas a modificar sobre el total. La clusula TOP
funciona casi igual que en la SELECT pero en este caso, las filas no se ordenan, y la expresin
debe ir entre parntesis.
Por ejemplo:
UPDATE TOP (10) PERCENT oficinas
SET ventas = 0;
Actualiza el 10% de filas de la tabla oficinas.
[ WHERE <condicion> ]
Utilizamos la clusula WHERE para filtrar las filas a actualizar. Se actualizarn todas las filas que
cumplan la condicin. Por ejemplo si queremos actualizar slo las oficinas del Este:
UPDATE oficinas
SET ventas = 0
WHERE region = 'Este';
Cuando para la condicin de la clusula WHERE necesitamos un dato de otra tabla podemos
utilizar una subconsulta:
UPDATE empleados SET ventas = 0
WHERE oficina IN (SELECT oficina
FROM oficinas
WHERE region = 'Este');
Cuando el campo de la otra tabla se utiliza para la clusula SET, entonces debemos utilizar la
clusula FROM.
La clusula FROM permite definir un origen de datos basado en varias tablas, y ese origen ser
el utilizado para realizar la actualizacin.
Por ejemplo queremos actualizar el importe de los pedidos con el precio de la tabla productos.
UPDATE pedidos SET importe = cant * precio
FROM pedidos INNER JOIN productos
ON fab = idfab AND producto = idproducto;
Modificamos la tabla pedidos dejando en la columna importe el resultado de multiplicar
la cantidad del pedido por el precio del producto que se encuentra en la tabla productos.
Si la actualizacin de una fila infringe una restriccin o una regla, infringe la configuracin de
valores NULL de la columna o si el nuevo valor es de un tipo de datos incompatible con la
columna, se cancela la instruccin, se devuelve un error y no se actualiza ningn registro.
Cuando una instruccin UPDATE encuentra un error aritmtico (error de desbordamiento,
divisin por cero o de dominio) durante la evaluacin de la expresin, la actualizacin no se
lleva a cabo. El resto del lote no se ejecuta y se devuelve un mensaje de error.

Motor de Base de Datos Pgina 57


Nota: Material tomado de Aulaclic.es Derechos Reservados
MOTOR DE BASE DE DATOS ORACLE
DOCENTE: DAIRO RODRIGUEZ BLANCO
ANLISIS Y PROGRAMACION DE COMPUTADORES

Adems del permiso de UPDATE, se requieren permisos SELECT para la tabla que se actualiza si
la instruccin UPDATE contiene una clusula WHERE o en el caso de que el
argumento expression de la clusula SET utilice una columna de la tabla, y permisos SELECT
para la tabla del origen si utilizamos una clusula FROM o un WHERE con subconsulta.

ELIMINAR FILAS - DELETE


La sentencia DELETE elimina filas de una tabla. Si se borran todas las filas, o se borra la nica
fila de una tabla, la definicin de la tabla no desaparece, slo que la tabla se queda vaca.
DELETE
[ TOP ( expression ) [ PERCENT ] ] [ FROM ] <destino>
[ FROM <origen>]
[ WHERE < condicion>]
[; ]
<destino> ::=
{
[nbBaseDatos. nbEsquema. | nbEsquema.]nbTablaVista
}
Con esta instruccin podemos eliminar una o varias filas de una tabla.
La palabra FROM (la primera) es opcional (originalmente era obligatorio) y no aade
funcionalidad slo sirve para introducir el destino.
<destino> es el nombre de la tabla de donde queremos eliminar las filas, puede ser un nombre
de tabla o un nombre de vista (de momento basada en una slo tabla).
La segunda clusula FROM sirve para indicar un origen que permita una condicin de WHERE
sobre una tabla diferente de destino.
La instruccin bsica sera pues:
DELETE oficinas;
Equivalente a:
DELETE FROM oficinas;
Con esta instruccin eliminamos todas las filas de la tabla oficinas.
La clusula WHERE permite eliminar determinadas filas, indica una condicin que deben
cumplir las filas que se eliminan.
Por ejemplo:
DELETE oficinas
WHERE region = Este;
Elimina las oficinas del Este.
TOP ( expresion ) [ PERCENT ]
Especifica el nmero o porcentaje de filas aleatorias que se van a eliminar.
expression debe generar un valor numrico e indica el nmero de filas a eliminar empezando
por el principio. Como en la SELECT, si aadimos la palabra PERCENT, el nmero representado
por expresin se refiere al porcentaje de filas a eliminar sobre el total. La clusula TOP
funciona casi igual que en la SELECT pero en este caso, las filas no se ordenan, y la expresin
debe ir entre parntesis.
Por ejemplo:
DELETE TOP (10) PERCENT
FROM oficinas;
Elimina el 10% de filas de la tabla oficinas.
Originalmente slo se poda indicar una tabla en la clusula FROM, pero ahora podemos
indicar un origen basado en varias tablas.
Si utilizamos un origen basado en varias tablas, se debe de utilizar una extensin de
TRANSACT-SQL que consiste en escribir dos clusulas FROM, una indica la tabla de donde

Motor de Base de Datos Pgina 58


Nota: Material tomado de Aulaclic.es Derechos Reservados
MOTOR DE BASE DE DATOS ORACLE
DOCENTE: DAIRO RODRIGUEZ BLANCO
ANLISIS Y PROGRAMACION DE COMPUTADORES

eliminamos las filas y la otra el origen que utilizamos para eliminar.


Este caso se produce cuando las filas a eliminar dependen de un valor que est en otra tabla.
Por ejemplo queremos eliminar los empleados de las oficinas del Este. Como la regin de la
oficina no est en empleados, habra que aadir al origen la tabla oficinas para poder formular
la condicin del WHERE:
DELETE FROM empleados
FROM empleados INNER JOIN oficinas
ON empleados.oficina = oficinas.oficina
WHERE region = 'Este';
En el origen tenemos las dos tablas y en la primera FROM indicamos de qu tabla queremos
borrar.
Esto se poda haber resuelto, como toda la vida, mediante una subconsulta:
DELETE FROM empleados
WHERE oficina IN (SELECT oficina
FROM oficinas
WHERE region = 'Este');
Para finalizar no debemos olvidar que para poder ejecutar un DELETE se requieren permisos
DELETE en la tabla de donde vamos a eliminar, y tambin se requieren los permisos para
utilizar SELECT si la instruccin contiene una clusula WHERE.
Muy importante siempre que actualicemos datos en nuestras tablas, no debemos olvidar
tampoco las reglas de integridad referencial. Si la tabla afectada interviene como tabla
principal en una relacin con otra tabla, no se podrn eliminar sus filas que estn relacionadas
con registros de la otra tabla (no se pueden eliminar padres que tengan hijos ). Si se van a
eliminar varias filas y al menos una no se puede eliminar por infringir las reglas de integridad,
entonces la operacin abortar y no se eliminar ninguna fila.
En el ejemplo anterior, si un empleado asignado a una oficina del Este tiene pedidos, no se
podr eliminar y entonces no se eliminar ningn empleado.

BORRADO MASIVO - TRUNCATE


Si queremos eliminar todas las filas de una tabla podemos utilizar tambin la instruccin
TRUNCATE TABLE.
TRUNCATE TABLE
[nbBaseDatos.[nbEsquema.]| nbEsquema.]nbTabla [; ]
Esta sentencia quita todas las filas de una tabla sin registrar las eliminaciones individuales de
filas. Desde un punto de vista funcional, TRUNCATE TABLE es equivalente a la instruccin
DELETE sin una clusula WHERE; no obstante, TRUNCATE TABLE es ms rpida y utiliza menos
recursos de registros de transacciones y de sistema.
En comparacin con la instruccin DELETE, TRUNCATE TABLE ofrece las siguientes ventajas:
Se utiliza menos espacio del registro de transacciones.
La instruccin DELETE quita una a una las filas y graba una entrada en el registro de
transacciones por cada fila eliminada.
TRUNCATE TABLE quita los datos al cancelar la asignacin de las pginas de datos
utilizadas para almacenar los datos de la tabla y slo graba en el registro de
transacciones las cancelaciones de asignacin de pginas.
Por regla general, se utilizan menos bloqueos.
Si se ejecuta la instruccin DELETE con un bloqueo de fila, se bloquea cada fila de la
tabla para su eliminacin. TRUNCATE TABLE siempre bloquea la tabla y la pgina, pero
no cada fila.
Las pginas cero se conservan en la tabla sin excepciones.
Despus de ejecutar una instruccin DELETE, la tabla puede seguir conteniendo
pginas vacas. Por ejemplo, no se puede cancelar la asignacin de las pginas vacas

Motor de Base de Datos Pgina 59


Nota: Material tomado de Aulaclic.es Derechos Reservados
MOTOR DE BASE DE DATOS ORACLE
DOCENTE: DAIRO RODRIGUEZ BLANCO
ANLISIS Y PROGRAMACION DE COMPUTADORES

de un montn sin un bloqueo de tabla exclusivo como mnimo. Si en la operacin de


eliminacin no se utiliza un bloqueo de tabla, la tabla contiene muchas pginas vacas.
En el caso de los ndices, la operacin de eliminacin puede dejar pginas vacas,
aunque la asignacin de estas pginas se puede cancelar rpidamente mediante un
proceso de limpieza en segundo plano.
Si la tabla contiene una columna de identidad, el contador para dicha columna se restablece al
valor de inicializacin definido para ella. Si no se define ningn valor de inicializacin, se utiliza
el valor predeterminado 1. Para conservar el contador de identidad, se utiliza DELETE.
Pero no todo son ventajas, no se puede utilizar TRUNCATE TABLE en las siguientes tablas:
Tablas a las que se hace referencia mediante una restriccin FOREIGN KEY (las tablas
que entran como principales en una relacin).
Tablas que participan en una vista indizada.

Motor de Base de Datos Pgina 60


Nota: Material tomado de Aulaclic.es Derechos Reservados

S-ar putea să vă placă și