Sie sind auf Seite 1von 96

SQL

Lic. Gustavo Rei

A N AL I S T AS D E S I S T E M AS

S ISTEMAS

DE

P RO CESAMI ENTO

DE

D ATOS 3

L ENGUAJES 2
MATERIAS:
Sistemas de Procesamiento de Datos 3
Lenguajes 2
DADO POR: Licenciado en Informtica Gustavo Vctor Rei
APUNTE GENERAL DE LA MATERIA (SQL)
Versin : 01

SQL
Nota del Autor
La presente edicin representa una revisin mayor de los apuntes anteriores como as tambin de sus auxiliares didctico relacionados.
Este apunte esta diseado como material auxiliar de la ctedra, no debe ser tomado como nico material de estudio, sino simplemente como base de gua de los temas expuestos en clase.
Todo lo trascripto en este apunte es recopilacin de varios libros, ms apuntes personales del autor y otros colaboradores.
Todos los libros utilizados son mencionados en Bibliografa a la cual el alumno deber remitirse para ampliar los temas aqu tratados.

AO 2003

Pgina 1 de 96

SQL

Lic. Gustavo Rei

Base De Datos Y Modelos De Datos:


Una base de datos est generalmente definida como un conjunto integrado de datos que modelizan un universo dado. Este universo est compuesto por objetos interrelacionados, los objetos de un mismo tipo constituyen una entidad y el lazo habido entre entidades
se le denomina asociacin.
El proceso de descripcin de asociaciones y entidades se llama modelizacin y se hace con la ayuda de un modelo de datos,
existen actualmente cuatro modelos de datos diferentes:

Modelo jerrquico.
Modelo en red
Modelo objeto
Modelo relacional: el principio bsico de este modelo consiste en representar tanto las entidades como las asociaciones con la
ayuda de relaciones denominadas tambin tablas. Una tabla est compuesta por lneas y columnas, cada lnea representa un objeto (proveedor-articulo) las columnas representan los atributos de dicho objeto. Una tabla es una estructura.

OBJETIVOS DE LOS SISTEMAS DE GESTIN DE BASE DE DATOS:

Las funciones de los S.G.B.D. son:


Debe permitir la definicin de todos los datos
Debe permitir manipular datos
Debe establecer controles para la seguridad de estos datos
Debe permitir los accesos concurrentes.

SUBLENGUAJES DEL SQL.:


L.D.D. Lenguaje de descripcin de datos.
L.M.D. Lenguaje de manipulacin de datos
L.C.M. Lenguaje de control de datos.

OBJETIVOS S.G.B.D.:

Definicin de datos: (modifica la estructura o aade campos). La misin del L.D.D. es describir y definir todos los esquemas que
participen en la base de datos. Esto consiste en la descripcin de los objetos que vamos a representar. La descripcin de todas
las estructuras que formen nuestra base de datos. Definicin de vista: es una visin parcial de la tabla. cuando en una tabla alguna parte de esta no quiero que tenga derecho a manipularla nadie

Manipulacin de datos: L.M.D. recoge todas las operaciones de intercambio de datos entre las tablas, estas operaciones pueden
ser de consulta o de puesta al da (insercin, modificacin, supresin) estas operaciones se realizan con la ayuda del denominado
L.M.D.
Seguridad de los datos: consiste en garantizar que slo los usuarios autorizados puedan efectuar operaciones correctas sobre la
Base de Datos para ello se dispone de 2 tipos.

o
o

Control sobre la base de datos


Control sobre las tablas

GESTIN DE LOS ACCESOS CONCURRENTES:


El principal objetivo de la implantacin de una base de datos es poner a disposicin de un gran nmero de usuarios en conjunto
integrado de datos, estos datos podrn ser manipulados por los diferentes usuarios y es ahora cuando se debe garantizar la coherencia de
los datos despus de las diversas manipulaciones. Esto se garantiza con la ayuda del concepto de transaccin se define como transaccin
a una unidad lgica de tratamiento que aplicada a un estado coherente de una base de datos restituye un nuevo estado coherente de la
base de datos pero con estos modificados, nicamente puede ser modificada completamente anulado.

Concepcin de una base de datos:

El ciclo de vida de una base de datos puede descomponerse en 3 etapas:


Concepcin: la fase de concepcin consiste en reproducir en el mundo real con ayuda de uno de los modelos de datos conocidos
(relacional). El resultado de esta fase en un esquema escrito segn un formalismo cualquiera no interpretable por el S.G.B.D.
Creacin de la B.D. vaca: La 2 fase consiste en traducir este esquema en rdenes comprensibles para el S.G.B.D. como resultado se obtiene la estructura de la base de datos desprovista de cualquier tipo de informacin.
Explotacin: Es en esta fase donde los registros sern manipulados con la ayuda de los lenguajes de programacin. Es ahora
cuando los usuarios pueden consultar los datos y ponerlos a punto durante el resto de la vida de la base de datos.

Problemas adquiridos por una mala concepcin de una base de datos:


AO 2003

Pgina 2 de 96

SQL

Lic. Gustavo Rei


En las tablas hay que procurar que no haya duplicidad de datos:
Redundancia de datos: si un cliente ha realizado ms de un pedido todos los datos de este cliente estarn repetidos tantas veces
como pedidos haya, lo mismo sucede para los artculos esto es opuesto al principal objetivo de una base de datos que consiste en
evitar la repeticin de los mismos.
Puestas al da mltiple: Para poder asegurar la coherencia de los datos es necesario efectuar puestas a da mltiples. Cuando un
cliente cambia de direccin
Incoherencia de los datos: S una operacin de puesta al da mltiple no se ha realizado completamente el estado de la base de
datos queda incoherente y puede producir errores importantes.
Prdida de datos: La supresin de una lnea en la tabla de pedidos entraa la prdida de todos los datos relativos a un cliente si
no ha efectuado ningn otro pedido. Esto es cierto tambin para un artculo que no ha sido pedido por ningn otro cliente. Estas
anormalidades constituyen lo que se ha convenido en llamar comportamiento anormal de las tablas, para evitar esto existe un
proceso llamado normalizacin que entre otras cosas intenta esclarecer los conceptos de dependencia funcional y estado de las
tablas.
Dependencia funcional: Este concepto se aplica a las columnas y consiste en hacer corresponder un nico valor a aquella columna o columnas que consideremos ms significativas.
Estado de la tabla: Se dice que una tabla esta en estado de 1 forma normal si toda columna de esta tabla no puede tener ms
que valores atmicos, un valor es atmica si l no es divisible.

Estructura bsica del lenguaje de programacin SQL.:

Base de datos: Esta compuesta de un conjunto de tablas del sistema creadas implcitamente por l y por un conjunto de tablas y
vistas creadas por el usuario.
Tablas: En informix, SQL server, Oracle, DB2, etc. el universo est descrito con la ayuda de tablas, cada una representa a una entidad o a una asociacin entre entidades. Las tablas estn compuestas de columnas o de lneas o filas llamadas convencionalmente campos y registros. Una columna representa un atributo de la entidad y para describirla es necesario especificar un nombre
y un tipo de datos, una particularidad de las columnas es que pueden permitir o no valores nulos.
o
Fila: Es una combinacin de los diferentes atributos del objeto (registro).
o
Vistas: Es una tabla virtual definida sobre las tablas bases descritas por el usuario su objeto es permitir a los usuarios
manipular un subconjunto de datos.
o
Usuarios: uno de los objetivos de un sistema de gestin de base de datos es el de afianzar la seguridad de los datos,
para hacer esto el lenguaje de programacin genera todos los usuarios y sus permisos de acceso para acceder a una
base de datos, cada usuario debe disponer de su autorizacin correspondiente y es el propietario de la base de datos el
que debe dar y retirar permisos de acceso.
o
ndices: Se utilizan para aumentar el rendimiento del sistema y asegurar la integridad de los datos. A cada tabla que se
crea se la asocia automticamente una tabla ndice que contiene la posicin del registro segn la columna especificada
como ndice.

Qu es el SQL?
Antes de empezar debes tener unas nociones bsicas de bases de datos relacionales, si quieres repasarlas recurr a tus apuntes
de clases de bases de datos
El SQL (Structured query language), lenguaje de consulta estructurado, es un lenguaje surgido de un proyecto de investigacin
de IBM para el acceso a bases de datos relacionales. Actualmente se ha convertido en un estndar de lenguaje de bases de datos, y la
mayora de los sistemas de bases de datos lo soportan, desde sistemas para ordenadores personales, hasta grandes ordenadores.
Como su nombre indica, el SQL nos permite realizar consultas a la base de datos. Pero el nombre se queda corto ya que SQL
adems realiza funciones de definicin, control y gestin de la base de datos. Las sentencias SQL se clasifican segn su finalidad
dando origen a tres lenguajes o mejor dicho sublenguajes:

El DDL (Data Description Language), lenguaje de definicin de datos, incluye rdenes para definir, modificar o borrar las tablas en
las que se almacenan los datos y de las relaciones entre estas. (Es el que ms varia de un sistema a otro)

El DCL (Data Control Language), lenguaje de control de datos, contiene elementos tiles para trabajar en un entorno multiusuario,
en el que es importante la proteccin de los datos, la seguridad de las tablas y el establecimiento de restricciones en el acceso, as como
elementos para coordinar la comparticin de datos por parte de usuarios concurrentes, asegurando que no interfieren unos con otros.

El DML (Data Manipulation Language), lenguaje de manipulacin de datos, nos permite recuperar los datos almacenados en la
base de datos y tambin incluye rdenes para permitir al usuario actualizar la base de datos aadiendo nuevos datos, suprimiendo datos
antiguos o modificando datos previamente almacenados.

Caractersticas del lenguaje


Una sentencia SQL es como una frase (escrita en ingls) con la que decimos lo que queremos obtener y de donde obtenerlo.
Todas las sentencias empiezan con un verbo (palabra reservada que indica la accin a realizar), seguido del resto de clusulas,
algunas obligatorias y otras opcionales que completan la frase. Todas las sentencias siguen una sintaxis para que se puedan ejecutar correctamente, para describir esa sintaxis utilizaremos un diagrama sintctico como el que se muestra a continuacin.

Existe un solo SQL?


AO 2003

Pgina 3 de 96

SQL

Lic. Gustavo Rei

Es muy comn creer que existe un nico SQL, pero debemos tener en cuenta que existen tantos SQL como DBMS lo utilicen, dado que cada fabricante le realiza agregados o le brinda distintos potenciales segn las caractersticas propias de cada Soft.
Ante estas circunstancias, se deber tener en claro, que es imposible dar en el transcurso de la presente ctedra la totalidad de
las variantes de SQL que existen, pese a que todos se basan en SQL 92, un Standard del mercado.
Para clarificar lo presente podemos dar como ejemplos las variaciones de SQL ms conocidas del mercado:

SQL86 - Estndar inicial de SQL. Conjunto limitado de caractersticas. Apenas con alguna restriccin de integridad.

SQL89 - Revisin mnima del estndar del 86. Aade cierta integridad referencial.

SQL92 (SQL2)- Revisin completa del lenguaje (sper conjunto del SQL89). Sobre todo se aade ms potencia semntica en la
definicin de datos (restricciones de integridad, dominios, ms tipos de datos). Mejora el lenguaje de consulta (Ej. productos natural y externo) y elimina problemas de ortogonalidad. Estandariza el SQL inmerso.

SQL3 Siguiente revisin del SQL en proceso de estandarizacin.

SQL propio de ORACLE1

SQL de INFORMIX (sobre UNX)

SQL de SQL Server (MS)2

SQL de Access (y sus diferentes versiones)


Ante esta posiblididad y a los efectos de clarificar el contenido de la materia nos ajustaremos al SQL propio del SQL Server, y
SQL de Access. (El primero por ser el que obra en los laboratorios del Instituto y el segundo por pertenecer a un software apto para todos
los usuarios.

Composicin del Lenguaje


El lenguaje SQL est compuesto por comandos, clusulas, operadores y funciones de agregado. Estos elementos se combinan
en las instrucciones para crear, actualizar y manipular las bases de datos.

1
2

AO 2003

Oracle 7 Manual de Referencia, Koch, George., Osborne/McGraw-Hill, 1994


http://www.microsoft.com/sql/
Pgina 4 de 96

SQL

Lic. Gustavo Rei

Una sentencia SQL es como una frase (escrita en ingls) con la que decimos lo que queremos obtener y de donde obtenerlo.
Todas las sentencias empiezan con un verbo (palabra reservada que indica la accin a realizar), seguido del resto de clusulas,
algunas obligatorias y otras opcionales que completan la frase. Todas las sentencias siguen una sintaxis para que se puedan ejecutar
correctamente, para describir esa sintaxis utilizaremos un diagrama sintctico como el que se muestra a continuacin.

Primeros comandos
Consultas Simples
SELECT
Empezaremos por estudiar la sentencia SELECT, que permite recuperar datos de una o varias tablas. La sentencia SELECT es
con mucho la ms compleja y potente de las sentencias SQL. Empezaremos por ver las consultas ms simples, basadas en una sola tabla.
Esta sentencia forma parte del DML (lenguaje de manipulacin de datos), en este tema veremos cmo seleccionar columnas de
una tabla, cmo seleccionar filas y cmo obtener las filas ordenadas por el criterio que queramos.
El resultado de la consulta es una tabla lgica, porque no se guarda en el disco sino que est en memoria y cada vez que ejecutamos la consulta se vuelve a calcular.
Cuando ejecutamos la consulta se visualiza el resultado en forma de tabla con columnas y filas, pues en la SELECT tenemos que
indicar qu columnas queremos que tenga el resultado y qu filas queremos seleccionar de la tabla origen.
FROM
Con la clusula FROM indicamos en qu tabla tiene que buscar la informacin. En este captulo de consultas simples el resultado se obtiene de una nica tabla. La sintaxis de la clusula es:

FROM ESPECIFICACIN DE TABLA


Una especificacin de tabla puede ser el nombre de una consulta guardada (las que aparecen en la ventana de base de datos), o

el nombre de una tabla que a su vez puede tener el siguiente formato:

ALIAS DE TABLA
Aliastabla es un nombre de alias, es como un segundo nombre que asignamos a la tabla, si en una consulta definimos un alias
para la tabla, esta se deber nombrar utilizando ese nombre y no su nombre real, adems ese nombre slo es vlido en la consulta
donde se define. El alias se suele emplear en consultas basadas en ms de una tabla que veremos en el tema siguiente. La palabra AS que
se puede poner delante del nombre de alias es opcional y es el valor por defecto por lo que no tienen ningn efecto.
Ejemplo: SELECT ......FROM oficinas ofi ; equivalente a SELECT ......FROM oficinas AS ofi esta sentencia me indica que se
van a buscar los datos en la tabla oficinas que queda renombrada en esta consulta con ofi.

AO 2003

Pgina 5 de 96

SQL

Lic. Gustavo Rei

IN
En una SELECT podemos utilizar tablas que no estn definidas en la base de datos (siempre que tengamos los permisos adecuados claro), si la tabla no est en la base de datos activa, debemos indicar en qu base de datos se encuentra con la clusula IN.
En la clusula IN el nombre de la base de datos debe incluir el camino completo, la extensin (.mdb)3, y estar entre comillas
simples.
Supongamos que la tabla empleados estuviese en otra base de datos llamada otra en la carpeta c:\mis documentos\, habra que
indicarlo as:
SELECT * FROM empleados IN 'c:\mis documentos\otra.mdb'4
Generalmente tenemos las tablas en la misma base de datos y no hay que utilizar la clusula IN.

COLUMNAS (CAMPOS)
La lista de columnas que queremos que aparezcan en el resultado es lo que llamamos lista de seleccin y se especifica delante
de la clusula FROM.

ASTERISCO
Se utiliza el asterisco * en la lista de seleccin para indicar 'todas las columnas de la tabla'.
Tiene dos ventajas:
Evitar nombrar las columnas una a una (es ms corto).
Si aadimos una columna nueva en la tabla, esta nueva columna saldr sin tener que modificar la consulta.
Se puede combinar el * con el nombre de una tabla (Ej. oficinas.*), pero esto se utiliza ms cuando el origen de la consulta son
dos tablas.

ALIAS DE COLUMNA.
Cuando se visualiza el resultado de la consulta, normalmente las columnas toman el nombre que tiene la columna en la tabla, si
queremos cambiar ese nombre lo podemos hacer definiendo un alias de columna mediante la clusula AS ser el nombre que aparecer
como ttulo de la columna.

COLUMNAS CALCULADAS.
Adems de las columnas que provienen directamente de la tabla origen, una consulta SQL puede incluir columnas calculadas
cuyos valores se calculan a partir de los valores de los datos almacenados.
Para solicitar una columna calculada, se especifica en la lista de seleccin una expresin en vez de un nombre de columna. La
expresin puede contener sumas, restas, multiplicaciones y divisiones, concatenacin &5 , parntesis y tambin funciones predefinidas).

FORMAR EXPRESIONES.
Una expresin se forma combinando un operador con uno o generalmente dos operandos.

OPERADORES.
ACCESS
operador +, se utiliza para sumar dos nmeros.
operador -, se utiliza para hallar la diferencia entre dos nmeros.
operador *, se utiliza para multiplicar dos nmeros.
operador ^, se utiliza para elevar un nmero a la potencia del exponente ( nmero ^ exponente )
operador / , se utiliza para dividir dos nmeros y obtener un resultado de signo flotante.
operador \, se utiliza para dividir dos nmeros y obtener un resultado entero.
operador Mod, divide dos nmeros y devuelve slo el resto.
El operador &, se utiliza para concatenar dos expresiones de tipo texto.

AO 2003

Este comando se refiere a MS Acces, vara segn el DBMS

Este comando se refiere a MS Access.

El carcter de concatenacin vara segn el DBMS, &: acces, % sql92, etc.

Pgina 6 de 96

SQL

Lic. Gustavo Rei


Tambin se puede utilizar el operador de suma + cuando los dos operandos son de tipo texto, para concatenarlos.
Un operando puede ser un nombre de columna, una expresin, un valor concreto o una funcin predefinida.

SQL SERVER
Operadores aritmticos
Operador

Significado

+ (suma)

Suma.

- (resta)

Resta.

* (multiplicacin)

Multiplicacin.

/ (divisin)

Divisin.

% (mdulo)

Devuelve el resto entero de una divisin. Por ejemplo, 12 % 5 = 2 porque el resto de 12 dividido
entre 5 es 2.

Operadores BIT a BIT


Los operadores BIT a BIT realizan tratamientos de bits entre dos expresiones de cualquiera de los tipos de datos de la categora
del tipo de datos enteros.
Operador

Significado

& (operador bit a bit AND)

Operador bit a bit AND (dos operandos).

| (operador bit a bit OR)

Operador bit a bit OR (dos operandos).

^ (operador bit a bit OR exclusivo)

Operador bit a bit OR-exclusivo (dos operandos).

Los operandos para los operadores BIT a BIT pueden ser de cualquiera de los tipos de datos de las categoras entero o cadena
binaria (excepto el tipo de datos image), con la excepcin de que ambos operandos no pueden ser de cualquiera de los tipos de datos de la
categora cadena binaria. La siguiente tabla muestra los tipos de datos de operando admitidos.
Operando izquierdo

Operando derecho

binary

int, smallint o tinyint

bit

int, smallint, tinyint o bit

int

int, smallint, tinyint, binary o varbinary

smallint

int, smallint, tinyint, binary o varbinary

tinyint

int, smallint, tinyint, binary o varbinary

varbinary

int, smallint o tinyint

Operadores de comparacin
Los operadores de comparacin comprueban si dos expresiones son iguales o no. Se pueden utilizar en todas las expresiones
excepto en las de los tipos de datos text, ntext o image.

AO 2003

Operador

Significado

= (igual al)

Igual a

> (mayor que)

Mayor que

< (menor que)

Menor que

>= (mayor que o igual


que)

Mayor que o igual a

<= (menor que o igual


que)

Menor que o igual a

<> (no es igual a)

No es igual a
Pgina 7 de 96

SQL

Lic. Gustavo Rei


Operador

Significado

!= (no es igual a)

No es igual a (no es del estndar SQL-92)

!< (no es menor que)

No es menor que (no es del estndar


SQL-92)

!> (no es mayor que)

No es mayor que (no es del estndar


SQL-92)

Operadores lgicos
Los operadores lgicos comprueban la veracidad de alguna condicin. stos, como los operadores de comparacin, devuelven el
tipo de datos Boolean con valor TRUE o FALSE.
Operador

Significado

ALL

TRUE si el conjunto completo de comparaciones es TRUE.

AND

TRUE si ambas expresiones booleanas son TRUE.

ANY

TRUE si una cualquier miembro del conjunto de comparaciones es


TRUE.

BETWEEN

TRUE si el operando est dentro de un intervalo.

EXISTS

TRUE si una subconsulta contiene a cualquiera de las filas.

IN

TRUE si el operando es igual a uno de la lista de expresiones.

LIKE

TRUE si el operando coincide con un patrn.

NOT

Invierte el valor de cualquier otro operador booleano.

OR

TRUE si cualquiera de las dos expresiones booleanas es TRUE.

SOME

TRUE si alguna de las comparaciones de un conjunto es TRUE.

FUNCIONES
Access
DATE () devuelve el da en que estamos
NOW () devuelve el da y la hora actual
YEAR (fecha) devuelve el ao de la fecha
MONTH (fecha) devuelve el mes de la fecha
DATEVALUE (literal) convierte el literal en un valor de fecha.
SQL Server

Funciones de agregado
El lenguaje de programacin Transact-SQL proporciona estas funciones de agregado:
AVG

MAX

BINARY_CHECKSUM

MIN

CHECKSUM

SUM

CHECKSUM_AGG

STDEV

COUNT

STDEVP

COUNT_BIG

VAR

GROUPING

VARP

Funciones de fecha y hora


Estas funciones escalares realizan una operacin sobre un valor de fecha y hora de entrada, y devuelven un valor de cadena,
numrico o de fecha y hora.
Esta tabla presenta las funciones de fecha y hora y su propiedad determinista. Para obtener ms informacin acerca del determinismo de funciones.
AO 2003

Pgina 8 de 96

SQL

Lic. Gustavo Rei

Funcin

Determinismo

DATEADD

Determinista

DATEDIFF

Determinista

DATENAME

No determinista

DATEPART

Determinista excepto cuando se utiliza como DATEPART (dw, date). La parte de la fecha correspondiente al da de la semana
(dw) depende del valor establecido por SET DATEFIRST, que indica el primer da de la semana.

DAY

Determinista

GETDATE

No determinista

GETUTCDATE

No determinista

MONTH

Determinista

YEAR

Determinista

Funciones matemticas
Estas funciones escalares realizan un clculo, normalmente basado en valores de entrada proporcionados como argumentos, y
devuelven un valor numrico.
ABS

DEGREES RAND

ACOS

EXP

ROUND

ASIN

FLOOR

SIGN

ATAN

LOG

SIN

ATN2

LOG10

SQUARE

CEILING

PI

SQRT

COS

POWER

TAN

COT

RADIANS

Funciones de cadena
Estas funciones escalares realizan una operacin sobre una cadena de entrada y devuelven un valor de cadena o un valor numrico.
ASCII

NCHAR

SOUNDEX

CHAR

PATINDEX

SPACE

CHARINDEX

REPLACE

STR

DIFFERENCE QUOTENAME

STUFF

LEFT

REPLICATE

SUBSTRING

LEN

REVERSE

UNICODE

LOWER

RIGHT

UPPER

LTRIM

RTRIM

Observaciones:
Se aclara que se ampliarn las funciones y operaciones en el transcurso de la clase.

Ordenacin de las filas - ORDER by


Para ordenar las filas del resultado de la consulta, tenemos la clusula ORDER by.
Con esta clusula se altera el orden de visualizacin de las filas de la tabla pero en ningn caso se modifica el orden de las filas
dentro de la tabla. La tabla no se modifica.

Ejemplos de Select:
Todos estos ejemplos son en base a los conceptos adquiridos en el presente captulo:
SELECT * FROM empleados IN 'c:\mis documentos\otra.mdb'
AO 2003

Seleccionar datos en una base de datos externa (AcPgina 9 de 96

SQL

Lic. Gustavo Rei


cess)
Lista todos los datos de las oficinas

SELECT * FROM oficinas


o bien
SELECT oficinas.* FROM oficinas
SELECT nombre, oficina, contrato FROM ofiventas
SELECT idfab, idproducto, descripcion, precio
FROM productos
SELECT idfab AS fabricante, idproducto, descripcion
FROM productos
SELECT ciudad, regin, (ventas-objetivo) AS superavit
FROM oficinas
SELECT idfab, idproducto, descripcion, (existencias * precio) AS
valoracin FROM productos
SELECT nombre, MONTH(contrato), YEAR(contrato)
FROM repventas
SELECT nombre, numemp, oficinarep
FROM empleados
ORDER BY nombre
SELECT nombre, numemp, contrato
FROM empleados
ORDER BY contrato DESC

Lista el nombre, oficina, y fecha de contrato de todos los


empleados
Lista una tarifa de productos
Como ttulo de la primera columna aparecer fabricante
en vez de idfab
Lista la ciudad, regin y el superavit de cada oficina.
De cada producto obtiene su fabricante, idproducto, su
descripcin y el valor del inventario
Lista el nombre, mes y ao del contrato de cada vendedor.
La funcin MONTH() devuelve el mes de una fecha
La funcin YEAR() devuelve el ao de una fecha
Obtiene un listado alfabtico de los empleados
Obtiene un listado de los empleados por orden de antigedad en la empresa empezando por los ms recientemente incorporados.

Seleccin de filas Las clusulas DISTINCT / ALL


Al incluir la clusula DISTINCT en la SELECT, se eliminan del resultado las repeticiones de filas. Si por el contrario queremos
que aparezcan todas las filas incluidas las duplicadas, podemos incluir la clusula ALL o nada, ya que ALL es el valor que SQL asume
por defecto.
Por ejemplo queremos saber los cdigos de los directores de oficina.
SELECT dir FROM oficinas

SELECT ALL dir FROM oficinas


SELECT DISTINCT dir FROM oficinas

La clusula TOP
La clusula TOP permite sacar las n primeras filas de la tabla origen. No elige entre valores iguales, si pido los 25 primeros valores pero el que hace 26 es el mismo valor que el 25, entonces devolver 26 registros en vez de 25 (o los que sean). Siempre se gua por la
columna de ordenacin, la que aparece en la clusula ORDER BY o en su defecto la clave principal de la tabla.
Por ejemplo queremos saber los dos empleados ms antiguos de la empresa.
SELECT TOP 2 numemp, nombre
Lista el cdigo y nombre de los empleados ordenndolos por fecha de conFROM empleado
trato, sacando nicamente los dos primeros (sern los dos ms antiguos).
ORDER BY contrato

SELECT TOP 3 numemp, nombre


FROM empleado
ORDER BY contrato

En este caso tiene que sacar los tres primeros, pero si nos fijamos en las
fechas de contrato tenemos 20/10/86, 10/12/86, 01/03/87, 01/03/87, la tercera fecha es igual que la cuarta, en este caso sacar estas cuatro filas en vez
de tres, y sacara todas las filas que tuviesen el mismo valor que la tercera
fecha de contrato.

El nmero de filas que queremos visualizar se puede expresar con un nmero entero o como un porcentaje sobre el nmero total de filas que se recuperaran sin la clusula TOP. En este ltimo caso utilizaremos la clusula TOP n PERCENT (porcentaje en ingls).
SELECT TOP 20 PERCENT nombre Lista el nombre de los empleados ordenndolos por fecha de contrato, sacando nicamente un
FROM empleado
20% del total de empleados. Como tenemos 10 empleados, sacar los dos primeros, si tuvisemos
ORDER BY contrato
100 empleados sacara los 20 primeros.

La clusula WHERE
La clusula WHERE selecciona nicamente las filas que cumplan la condicin de seleccin especificada.
En la consulta slo aparecern las filas para las cuales la condicin es verdadera (TRUE), los valores nulos (NULL) no se incluyen por lo
tanto en las filas del resultado. La condicin de seleccin puede ser cualquier condicin vlida o combinacin de condiciones utilizanAO 2003

Pgina 10 de 96

SQL

Lic. Gustavo Rei

do los operadores NOT (no) AND (y) y OR (). En ACCESS2000 una clusula WHERE puede contener hasta 40 expresiones vinculadas
por operadores lgicos AND y OR.
Los operadores lgicos sirven para combinar condiciones. En Access2000 una condicin puede tomar tres valores TRUE (verdadero), FALSE (falso) o NULL (nulo), por lo tanto el resultado de los operadores lgicos tambin ser true, false o null.
Para ver cmo funcionan los operadores lgicos utilizaremos las tablas de verdad de estos operadores.

OPERADOR AND
Para que el resultado sea verdadero las dos condiciones deben ser verdaderas.
AND

TRUE

FALSE NULL

TRUE TRUE

FALSE NULL

FALSE FALSE FALSE FALSE


NULL

NULL

FALSE NULL

OPERADOR OR.
El resultado es verdadero si al menos una de las dos condiciones es verdadera.
OR

TRUE FALSE NULL

TRUE TRUE TRUE

TRUE

FALSE TRUE FALSE NULL


NULL

TRUE NULL

NULL

OPERADOR NOT.
El resultado es invertido.
NOT TRUE

FALSE NULL

FALSE TRUE

NULL

Condiciones de seleccin
En SQL tenemos cinco condiciones bsicas:
El test de comparacin
El test de rango
El test de pertenencia a un conjunto
El test de valor nulo
El test de correspondencia con patrn.

EL TEST DE COMPARACIN.
Compara el valor de una expresin con el valor de otra.
La sintaxis es la siguiente:
= igual que
<> distinto de
< menor que
<= menor o
igual
> mayor que
>= mayor o
igual

TEST DE RANGO (BETWEEN).


Examina si el
Tiene la siguiente sintaxis:

valor

de

la

expresin

est

comprendido

entre

los

dos

valores

definidos

por

exp1

exp2.

TEST DE PERTENENCIA A CONJUNTO (IN)


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

TEST DE VALOR NULO (IS NULL)


Una condicin de seleccin puede dar como resultado el valor verdadero TRUE, falso FALSE o nulo NULL.

AO 2003

Pgina 11 de 96

SQL

Lic. Gustavo Rei

Cuando una columna que interviene en una condicin de seleccin contiene el valor nulo, el resultado de la condicin no es verdadero ni falso, sino nulo, sea cual sea el test que se haya utilizado. Por eso si queremos listar las filas que tienen valor en una determinada
columna, no podemos utilizar el test de comparacin, la condicin oficina = null devuelve el valor nulo sea cual sea el valor contenido en
oficina. Si queremos preguntar si una columna contiene el valor nulo debemos utilizar un test especial, el test de valor nulo.

TEST DE CORRESPONDENCIA CON PATRN (LIKE)


Se utiliza cuando queremos utilizar caracteres comodines para formar el valor con el comparar.
Tiene la siguiente sintaxis:

Los comodines ms usados son los siguientes:


? Representa un carcter cualquiera (Access)
* representa cero o ms caracteres (Access)
# representa un dgito cualquiera (0-9) (Access)
% Cualquier cadena de cero o ms caracteres. (SQL Server)
_ Cualquier carcter individual (SQL Server)
[ ] Cualquier carcter individual del intervalo (por ejemplo, [a-f]) o conjunto (por ejemplo, [abcdef]) especificado. (SQL Server)
[^] Cualquier carcter individual fuera del intervalo (por ejemplo, [^a - f]) o conjunto (por ejemplo, [^abcdef]) especificado. (SQL Server)
Ejemplos
SELECT numemp, nombre
FROM empleados
WHERE nombre LIKE 'Luis*'

SELECT numemp, nombre


FROM empleados
WHERE nombre LIKE '??a*'

SELECT numemp, nombre


FROM empleados
WHERE nombre LIKE '*Luis*'

SELECT phone
FROM pubs.dbo.authors
WHERE phone LIKE '415%'

Select * From clientes Where poblacion Like 'madrid' And Not nombre Like 'Pepe'

RESUMEN OPERADORES
Operador
=

!=, ^=, <>, =

<, >

<=, >=

IN

AO 2003

Propsito
Igualdad.

Ejemplo

SELECT *
FROM emp
WHERE sal = 1500;
Desigualdad.
SELECT *
FROM emp
WHERE sal != 1500;
Mayor, menor.
SELECT * FROM emp
WHERE sal > 1500;
SELECT * FROM emp
WHERE sal < 1500;
Mayor, menor o igual.
SELECT * FROM emp
WHERE sal >= 1500;
SELECT * FROM emp
WHERE sal <= 1500;
Igual a cualquier miembro a probar, igual SELECT * FROM emp
a =ANY.
WHERE job IN
(CLERK,ANALYST);
SELECT * FROM emp
WHERE sal IN
(SELECT sal FROM emp
Pgina 12 de 96

SQL

Lic. Gustavo Rei


Operador
NOT IN

ANY SOME

ALL

[NOT] BETWEEN X AND Y

EXISTS

X [NOT] LIKE Y [ESCAPE


z]

IS [NOT] NULL

NOT IN

Propsito

Ejemplo

WHERE deptno = 30);


SELECT * FROM emp
WHERE sal NOT IN
(SELECT sal FROM emp
WHERE deptno = 30);
SELECT * FROM emp
WHERE job NOT IN
(CLERK, ANALYST);
Compara un valor a cada valor en una
SELECT * FROM emp
lista, precedido por =, !=, >, <, <=, >=.
WHERE sal = ANY
(SELECT sal FROM emp
WHERE deptno = 30);
Similar al anterior.
SELECT * FROM emp
WHERE sal >=
ALL ( 1400, 3000);
Entre X e Y.
SELECT * FROM emp
WHERE sal
BETWEEN 2000 AND
3000;
Verdadero si una subquery entrega al
SELECT ename, deptno
menos una fila.
FROM dept
WHERE EXISTS
(SELECT * FROM emp
WHERE dept.deptno
= emp.deptno);
Verdadero si x est en un patrn y.
SELECT * FROM tab1
Dentro de y el carcter % calza con
WHERE col1 LIKE
cualquier carcter menos NULL. _ calza
A_C/%E% ESCAPE
con cualquier carcter simple.
/;
Prueba si hay [o no] NULL
SELECT ename, deptno
FROM emp
WHERE comm IS NULL;
Igual a !=
SELECT TRUE
FROM emp
Igual a !=ANY.

WHERE deptno NOT IN


(5,15,null);

Igual a:
deptno != 5 AND
deptno != 15 AND
deptno != null

AO 2003

Pgina 13 de 96

SQL

Lic. Gustavo Rei

En este tema vamos a estudiar las consultas multitabla llamadas as porque estn basadas en ms de una tabla. Por ello estudiaremos bsicamente:
- la unin de tablas
- la composicin de tablas

Conceptos Generales
LA UNIN DE TABLAS
Esta operacin se utiliza cuando tenemos dos tablas con las mismas columnas y queremos obtener una nueva tabla con las filas
de la primera y las filas de la segunda. En este caso la tabla resultante tiene las mismas columnas que la primera tabla (que son las mismas
que las de la segunda tabla).
Por ejemplo tenemos una tabla de libros nuevos y una tabla de libros antiguos y queremos una lista con todos los libros que tenemos. En este caso las dos tablas tienen las mismas columnas, lo nico que vara son las filas, adems queremos obtener una lista de
libros (las columnas de una de las tablas) con las filas que estn tanto en libros nuevos como las que estn en libros antiguos, en este caso
utilizaremos este tipo de operacin.
Cuando hablamos de tablas pueden ser tablas reales almacenadas en la base de datos o tablas lgicas (resultados de una consulta), esto nos permite utilizar la operacin con ms frecuencia ya que pocas veces tenemos en una base de datos tablas idnticas en
cuanto a columnas. El resultado es siempre una tabla lgica.
Por ejemplo queremos en un slo listado los productos cuyas existencias sean iguales a cero y tambin los productos que aparecen en pedidos del ao 90. En este caso tenemos unos productos en la tabla de productos y los otros en la tabla de pedidos, las tablas no
tienen las mismas columnas no se puede hacer una unin de ellas pero lo que interesa realmente es el identificador del producto (idfab,
idproducto), luego por una parte sacamos los cdigos de los productos con existencias cero (con una consulta), por otra parte los cdigos
de los productos que aparecen en pedidos del ao 90 (con otra consulta), y luego unimos estas dos tablas lgicas.
El operador que permite realizar esta operacin es el operador UNION.

Ejemplo:
SELECT * FROM TableA
UNION
SELECT * FROM TableB
UNION
SELECT * FROM TableC
UNION
SELECT * FROM TableD

LA COMPOSICIN DE TABLAS
La composicin de tablas consiste en concatenar filas de una tabla con filas de otra. En este caso obtenemos una tabla con las
columnas de la primera tabla unidas a las columnas de la segunda tabla, y las filas de la tabla resultante son concatenaciones de filas de la
primera tabla con filas de la segunda tabla.
AO 2003

Pgina 14 de 96

SQL

Lic. Gustavo Rei

El ejemplo anterior quedara de la siguiente forma con la composicin:


A diferencia de la unin la composicin permite obtener una fila con datos de las dos tablas, esto es muy til cuando queremos visualizar filas cuyos datos se encuentran en dos tablas.
Por ejemplo queremos listar los pedidos con el nombre del representante que ha hecho el pedido, pues los datos del pedido los
tenemos en la tabla de pedidos pero el nombre del representante est en la tabla de empleados y adems queremos que aparezcan en la
misma lnea; en este caso necesitamos componer las dos tablas (Nota: en el ejemplo expuesto a continuacin, hemos seleccionado las filas
que nos interesan).

Existen distintos tipos de composicin, aprenderemos a utilizarlos todos y a elegir el tipo ms apropiado a cada caso.
Los tipos de composicin de tablas son:
El producto cartesiano
El INNER JOIN
El LEFT / RIGHT JOIN

Aplicacin de los conceptos Generales


EL OPERADOR UNION
Como ya hemos visto en la pgina anterior, el operador UNION sirve para obtener a partir de dos tablas con las mismas columnas, una nueva tabla con las filas de la primera y las filas de la segunda.
La sintaxis es la siguiente:

Consulta puede ser un nombre de tabla, un nombre de consulta (en estos dos casos el nombre debe estar precedido de la palabra TABLE6), o una sentencia SELECT completa (en este caso no se puede poner TABLE). La sentencia SELECT puede ser cualquier
sentencia SELECT con la nica restriccin de que no puede contener la clusula ORDER BY.
Despus de la primera consulta viene la palabra UNION y a continuacin la segunda consulta. La segunda consulta sigue las
mismas reglas que la primera consulta.

AO 2003

Table no lo reconoce SQL Server

Pgina 15 de 96

SQL

Lic. Gustavo Rei

Las dos consultas deben tener el mismo nmero de columnas pero las columnas pueden llamarse de diferente forma y ser de tipos de datos distintos.
Las columnas del resultado se llaman como las de la primera consulta.
Por defecto la unin no incluye filas repetidas, si alguna fila est en las dos tablas, slo aparece una vez en el resultado.
Si queremos que aparezcan todas las filas incluso las repeticiones de filas, incluimos la palabra ALL (todo en ingls).
El empleo de ALL tienen una ventaja, la consulta se ejecutar ms rpidamente. Puede que la diferencia no se note con tablas
pequeas, pero si tenemos tablas con muchos registros (filas) la diferencia puede ser notable.
Se puede unir ms de dos tablas, para ello despus de la segunda consulta repetimos la palabra UNION... y as sucesivamente.
Tambin podemos indicar que queremos el resultado ordenado por algn criterio, en este caso se incluye la clusula ORDER BY
que ya vimos en el tema anterior. La clusula ORDER BY se escribe despus de la ltima consulta, al final de la sentencia; para indicar las
columnas de ordenacin podemos utilizar su nmero de orden o el nombre de la columna, en este ltimo caso se deben de utilizar los
nombres de columna de la primera consulta ya que son los que se van a utilizar para nombrar las columnas del resultado.
Para ilustrar la operacin vamos a realizar el ejercicio visto en la pgina anterior, vamos a obtener los cdigos de los productos
que tienen existencias iguales a cero o que aparezcan en pedidos del ao 90.
SELECT idfab, idproducto
FROM productos
WHERE existencias = 0
UNION ALL
SELECT fab,producto
FROM pedidos
WHERE year(fechapedido) = 1990
ORDER BY idproducto
O bien
TABLE [existencias cero]
UNION ALL
TABLE [pedidos 90]
ORDER BY idproducto
Se ha incluido la clusula ALL porque no nos importa que salgan filas repetidas.
Se ha incluido ORDER BY para que el resultado salga ordenado por idproducto, observar que hemos utilizado el nombre de la columna de la primera SELECT, tambin podamos haber puesto ORDER BY 2 pero no ORDER BY producto (es el nombre de la columna de
la segunda tabla).
Para el 2 caso hemos creado una consulta llamada existencias cero con la primera SELECT, y una consulta llamada pedidos 90
con la segunda SELECT. Observar que los nombres de las consultas estn entre corchetes porque contienen espacios en blanco, y que en
este caso hay que utilizar TABLE7.

EL PRODUCTO CARTESIANO

El producto cartesiano es un tipo de composicin de tablas, aplicando el producto cartesiano a dos tablas se obtiene una tabla
con las columnas de la primera tabla unidas a las columnas de la segunda tabla, y las filas de la tabla resultante son todas las posibles
concatenaciones de filas de la primera tabla con filas de la segunda tabla.
La sintaxis es la siguiente:
El producto cartesiano se indica poniendo en la FROM las tablas que queremos componer separadas por comas, podemos obtener as el producto cartesiano de dos, tres, o ms tablas.
Nbtabla puede ser un nombre de tabla o un nombre de consulta. Si todas las tablas estn en una base de datos externa, aadiremos la clusula IN basedatosexterna despus de la ltima tabla. Pero para mejorar el rendimiento y facilitar el uso, se recomienda utilizar
una tabla vinculada en lugar de la clusula IN.

AO 2003

Table no lo reconoce SQL Server

Pgina 16 de 96

SQL

Lic. Gustavo Rei

Hay que tener en cuenta que el producto cartesiano obtiene todas las posibles combinaciones de filas por lo tanto si tenemos dos
tablas de 100 registros cada una, el resultado tendr 100x100 filas, si el producto lo hacemos de estas dos tablas con una tercera de 20
filas, el resultado tendr 200.000 filas (100x100x20) y estamos hablando de tablas pequeas. Se ve claramente que el producto cartesiano
es una operacin costosa sobre todo si operamos con ms de dos tablas o con tablas voluminosas.
Se puede componer una tabla consigo misma, en este caso es obligatorio utilizar un nombre de alias por lo menos para una de
las dos.
Por ejemplo: SELECT * FROM empleados, empleados emp
En este ejemplo obtenemos el producto cartesiano de la tabla de empleados con ella misma. Todas las posibles combinaciones
de empleados con empleados.
Para ver cmo funciona el producto cartesiano cogemos las consultas [existencias cero] y [pedidos 90] creadas en la pgina anterior, y creamos una consulta que halle el producto cartesiano de las dos.
SELECT *
FROM [existencias cero], [pedidos 90]
Obtenemos la siguiente tabla

Se observa que tenemos las dos filas de la primera consulta combinadas con las dos filas de la segunda.
Esta operacin no es de las ms utilizadas, normalmente cuando queremos componer dos tablas es para aadir a las filas de
una tabla, una fila de la otra tabla, por ejemplo aadir a los pedidos los datos del cliente correspondiente, o los datos del representante, esto
equivaldra a un producto cartesiano con una seleccin de filas:
SELECT *
FROM pedidos, clientes
WHERE pedidos.clie =clientes.numclie
Combinamos todos los pedidos con todos los clientes pero luego seleccionamos los que cumplan que el cdigo de cliente de la
tabla de pedidos sea igual al cdigo de cliente de la tabla de clientes, por lo tanto nos quedamos con los pedidos combinados con los datos
del cliente correspondiente.
Las columnas que aparecen en la clusula WHERE de nuestra consulta anterior se denominan columnas de emparejamiento ya
que permiten emparejar las filas de las dos tablas. Las columnas de emparejamiento no tienen por qu estar incluidas en la lista de seleccin.
Normalmente emparejamos tablas que estn relacionadas entre s y una de las columnas de emparejamiento es clave principal,
pues en este caso, cuando una de las columnas de emparejamiento tienen un ndice definido es ms eficiente utilizar otro tipo de composicin, el INNER JOIN.

AO 2003

Pgina 17 de 96

SQL

Lic. Gustavo Rei

El INNER JOIN
El INNER JOIN es otro tipo de composicin de tablas, permite emparejar filas de distintas tablas de forma ms eficiente que con
el producto cartesiano cuando una de las columnas de emparejamiento est indexada. Ya que en vez de hacer el producto cartesiano
completo y luego seleccionar la filas que cumplen la condicin de emparejamiento, para cada fila de una de las tablas busca directamente
en la otra tabla las filas que cumplen la condicin, con lo cual se emparejan slo las filas que luego aparecen en el resultado.
La sintaxis es la siguiente:

Ejemplo:
SELECT *
FROM pedidos INNER JOIN clientes ON pedidos. clie = clientes.numclie
Tabla1 y tabla2 son especificaciones de tabla (nombre de tabla con alias o no, nombre de consulta guardada), de las tablas cuyos
registros se van a combinar.
Pueden ser las dos la misma tabla, en este caso es obligatorio definir al menos un alias de tabla.
col1, col2 son las columnas de emparejamiento.
Observar que dentro de la clusula ON los nombres de columna deben ser nombres cualificados (Llevan delante el nombre de la
tabla y un punto).
Las columnas de emparejamiento deben contener la misma clase de datos, las dos de tipo texto, de tipo fecha etc. los campos
numricos deben ser de tipos similares. Por ejemplo, se puede combinar campos Auto Numricos y Long puesto que son tipos similares, sin
embargo, no se puede combinar campos de tipo Simple y Doble. Adems las columnas no pueden ser de tipo Memo ni OLE.
Comp representa cualquier operador de comparacin (=, <, >, <=, >=, o <>) y se utiliza para establecer la condicin de emparejamiento.
Se pueden definir varias condiciones de emparejamiento unidas por los operadores AND y OR poniendo cada condicin entre parntesis. Ejemplo:
SELECT *
FROM pedidos INNER JOIN productos ON (pedidos.fab = productos.idfab) AND (pedidos.producto = productos.idproducto)
Se pueden combinar ms de dos tablas. En este caso hay que sustituir en la sintaxis una tabla por un INNER JOIN completo.
Por ejemplo:
SELECT *
FROM (pedidos INNER JOIN clientes ON pedidos.clie = clientes.numclie) INNER JOIN empleados ON pedidos.rep = empleados.numemp
En vez de tabla1 hemos escrito un INNER JOIN completo, tambin podemos escribir:
SELECT *
FROM clientes INNER JOIN (pedidos INNER JOIN empleados ON pedidos.rep = empleados.numemp) ON pedidos.clie = clientes.numclie
En este caso hemos sustituido tabla2 por un INNER JOIN completo

El LEFT JOIN y RIGHT JOIN


El LEFT JOIN y RIGHT JOIN son otro tipo de composicin de tablas, tambin denominada composicin externa. Son una extensin del INNER JOIN.
Las composiciones vistas hasta ahora (el producto cartesiano y el INNER JOIN) son composiciones internas ya que todos los valores de las filas del resultado son valores que estn en las tablas que se combinan.

AO 2003

Pgina 18 de 96

SQL

Lic. Gustavo Rei

Con una composicin interna slo se obtienen las filas que tienen al menos una fila de la otra tabla que cumpla la condicin, veamos un ejemplo:
Queremos combinar los empleados con las oficinas para saber la ciudad de la oficina donde trabaja cada empleado, si utilizamos
un producto cartesiano tenemos:
SELECT empleados.*, ciudad
FROM empleados, oficinas
WHERE empleados.oficina = oficinas.oficina
Observar que hemos cualificado el nombre de columna oficina ya que ese nombre aparece en las dos tablas de la FROM.
Con esta sentencia los empleados que no tienen una oficina asignada (un valor nulo en el campo oficina de la tabla empleados)
no aparecen en el resultado ya que la condicin empleados.oficina = oficinas.oficina ser siempre nula para esos empleados.
Si utilizamos el INNER JOIN:
SELECT empleados.*, ciudad
FROM empleados INNER JOIN oficinas ON empleados.oficina = oficinas.oficina
Nos pasa lo mismo, el empleado 110 tiene un valor nulo en el campo oficina y no aparecer en el resultado.
Pues en los casos en que queremos que tambin aparezcan las filas que no tienen una fila coincidente en la otra tabla, utilizaremos el LEFT o RIGHT JOIN.
La sintaxis del LEFT JOIN es la siguiente:

La descripcin de la sintaxis es la misma que la del INNER JOIN (ver anterior), lo nico que cambia es la palabra INNER por
LEFT (izquierda en ingls).
Esta operacin consiste en aadir al resultado del INNER JOIN las filas de la tabla de la izquierda que no tienen correspondencia
en la otra tabla, y rellenar en esas filas los campos de la tabla de la derecha con valores nulos.
Ejemplo:
SELECT *
FROM empleados LEFT JOIN oficinas ON empleados.oficina = oficinas.oficina
Con el ejemplo anterior obtenemos una lista de los empleados con los datos de su oficina, y el empleado 110 que no tiene oficina
aparece con sus datos normales y los datos de su oficina a nulos.
La sintaxis del Right JOIN es la siguiente:

La sintaxis es la misma que la del INNER JOIN (ver anterior), lo nico que cambia es la palabra INNER por RIGHT (derecha en
ingls).
Esta operacin consiste en aadir al resultado del INNER JOIN las filas de la tabla de la derecha que no tienen correspondencia
en la otra tabla, y rellenar en esas filas los campos de la tabla de la izquierda con valores nulos.
Ejemplo:
SELECT *
FROM empleados RIGHT JOIN oficinas ON empleados.oficina = oficinas.oficina
Con el ejemplo anterior obtenemos una lista de los empleados con los datos de su oficina, y adems aparece una fila por cada
oficina que no est asignada a ningn empleado con los datos del empleado a nulos.
Una operacin LEFT JOIN o RIGHT JOIN se puede anidar dentro de una operacin INNER JOIN, pero una operacin INNER
JOIN no se puede anidar dentro de LEFT JOIN o RIGHT JOIN. Los anidamientos de JOIN de distinta naturaleza no funcionan siempre, a
veces depende del orden en que colocamos las tablas, en estos casos lo mejor es probar y si no permite el anudamiento, cambiar el orden
de las tablas (y por tanto de los JOINs) dentro de la clusula FROM.
Por ejemplo podemos tener:
SELECT *
FROM clientes INNER JOIN (empleados LEFT JOIN oficinas ON empleados.oficina = oficinas.oficina) ON clientes.repclie = empleados.numclie
AO 2003

Pgina 19 de 96

SQL

Lic. Gustavo Rei

Combinamos empleados con oficinas para obtener los datos de la oficina de cada empleado, y luego aadimos los clientes de cada representante, as obtenemos los clientes que tienen un representante asignado y los datos de la oficina del representante asignado.
Si hubiramos puesto INNER en vez de LEFT no saldran los clientes que tienen el empleado 110 (porque no tiene oficina y por
tanto no aparece en el resultado del LEFT JOIN y por tanto no entrar en el clculo del INNER JOIN con clientes).
Para saber en cada caso qu tipo de operacin se debe utilizar, a continuacin tienes un grfico que indica qu preguntas se tienen que hacer y segn la respuesta, qu operacin utilizar.
Para resumir hemos llamado T1 y T2 las tablas de las que queremos sacar los datos y R la tabla lgica que representa el resultado de consulta. T1 y T2 podran ser tablas guardadas o consultas.
En la ltima parte cuando se pregunta "En T1 hay filas que no tienen pareja en T2", la pregunta se debe de interpretar como "en
alguna de las tablas hay filas que no tienen pareja".

Explicacin de SQL Server


COLUMNAS DE COMBINACIN
El operador JOIN hace coincidir filas mediante la comparacin de valores de una tabla con valores de otra tabla. El usuario decide
las columnas de cada tabla que deben hacerse coincidir. Hay varias opciones:

COLUMNAS RELACIONADAS
Normalmente, se combinan tablas haciendo coincidir valores en columnas para las que existe una relacin de clave externa. Por
ejemplo, puede combinar descuentos (discounts) y almacenes (stores) haciendo coincidir los valores de id_alma (stor_id) en las tablas
respectivas. El cdigo SQL resultante sera parecido a este:
SELECT *
FROM discounts INNER JOIN stores ON stores.stor_id = discounts.stor_id
AO 2003

Pgina 20 de 96

SQL

Lic. Gustavo Rei

COLUMNAS NO RELACIONADAS
Tambin puede combinar tablas haciendo coincidir valores en columnas para las que no existe una relacin de clave externa. Por
ejemplo, puede combinar editores y autores haciendo coincidir los valores de estado (state) en las tablas respectivas. Una combinacin de
este tipo proporciona un conjunto de resultados en el que cada fila describe un par autor-editor ubicado en el mismo estado.
SELECT au_lname, au_fname, pub_name, authors.state
FROM authors INNER JOIN publishers ON authors.state = publishers.state
Tambin conviene observar que puede utilizar varias columnas para hacer coincidir filas de las tablas combinadas. Por ejemplo,
para buscar los pares autor-editor en los que el autor y el editor estn ubicados en la misma ciudad, puede utilizar una operacin de combinacin que haga coincidir las columnas respectivas de estado y las columnas respectivas de ciudad de las dos tablas. Es necesario hacer
coincidir tanto la ciudad como el estado porque puede que estados diferentes tengan ciudades con el mismo nombre (por ejemplo, Springfield en Illinois y Springfield en Massachusetts).

TIPOS DE COMBINACIONES
Cuando se combinan tablas, el tipo de combinacin que se crea determina las filas que aparecen en el conjunto de resultados.
Puede crear los siguientes tipos de combinaciones:
COMBINACIN INTERNA
Combinacin que slo muestra las filas que tienen un elemento coincidente en las dos tablas combinadas. ste es el tipo de combinacin predeterminado en el Diseador de consultas. Por ejemplo, puede combinar las tablas titles y publishers para crear un conjunto de
resultados que muestre el nombre del editor para cada ttulo. En una combinacin interna, los ttulos para los que no existe informacin del
editor no se incluyen en el conjunto de resultados, ni tampoco los editores sin ttulos. La instruccin SQL resultante para una combinacin
de este tipo sera parecida a esta8:
SELECT title, pub_name
FROM
titles INNER JOIN
publishers ON titles.pub_id = publishers.pub_id
Para obtener ms informacin sobre cmo crear una combinacin interna, consulte Combinar tablas automticamente.

COMBINACIN EXTERNA
Combinacin que incluye filas aunque stas no tengan filas relacionadas en la tabla combinada. Puede crear tres variaciones de
una combinacin externa para especificar las filas no coincidentes que desea incluir:
Combinacin externa izquierda
Se incluyen todas las filas de la tabla nombrada en primer lugar (la tabla "izquierda", que aparece totalmente a la izquierda en la
clusula JOIN). Las filas que no coinciden de la tabla derecha no aparecen. Por ejemplo, la siguiente instruccin SQL ilustra una combinacin exterior izquierda entre las tablas titles y publishers para incluir todos los ttulos, incluso los que no tienen informacin de editor:
SELECT titles.title_id, titles.title, publishers.pub_name
FROM titles LEFT OUTER JOIN publishers ON titles.pub_id = publishers.pub_id
Combinacin externa derecha
Se incluyen todas las filas de la tabla nombrada en segundo lugar (la tabla "derecha", que aparece totalmente a la derecha en la
clusula JOIN). No se incluyen las filas que no coinciden de la tabla de la izquierda. Por ejemplo, una combinacin externa derecha entre
las tablas titles y publishers incluirn todos los editores, incluso los que no tengan ttulos en la tabla titles. El cdigo SQL resultante sera
parecido a este:
SELECT titles.title_id, titles.title, publishers.pub_name
FROM titles RIGHT OUTER JOIN publishers ON titles.pub_id = publishers.pub_id

Las columnas que contienen NULL no coinciden con ningn valor cuando se crea una combinacin interna y, por tanto, se excluyen del conjunto de resultados. Los valores

nulos no coinciden con otros valores nulos.

AO 2003

Pgina 21 de 96

SQL

Lic. Gustavo Rei

Combinacin externa completa


Se incluyen todas las filas de todas las tablas combinadas, tanto si tienen elementos coincidentes como si no. Por ejemplo, una
combinacin externa completa entre titles y publishers muestra todos los ttulos y todos los editores, incluso los que no coincidan en la otra
tabla.
SELECT titles.title_id, titles.title, publishers.pub_name
FROM titles FULL OUTER JOIN publishers ON titles.pub_id = publishers.pub_id
Combinacin cruzada
Combinacin cuyo conjunto de resultados incluye una fila para cada posible emparejamiento de filas de las dos tablas. Por ejemplo, la sentencia CROSS JOIN aplicada a autores y editores proporciona un conjunto de resultados con una fila para cada posible combinacin de autores y editores. El cdigo SQL resultante sera parecido a este:
SELECT *
FROM authors CROSS JOIN publishers

OPERADORES DE COMPARACIN JOIN


El operador JOIN hace coincidir filas mediante la comparacin de valores de una tabla con valores de otra tabla. Puede decidir
exactamente qu elemento constituye una coincidencia. Las posibles opciones se engloban en dos amplias categoras:
Coincidencia en igualdad
Normalmente, se hacen coincidir filas cuando los valores de las respectivas columnas son iguales. Por ejemplo, para crear un
conjunto de resultados en el que cada fila contenga una descripcin completa de cada editor, (es decir, con columnas de la tabla publishers
y de la tabla pub_info), utilice una combinacin que haga coincidir filas en las que los valores de pub_id de las tablas respectivas sean
iguales. El cdigo SQL resultante sera parecido a este:
SELECT *
FROM publishers INNER JOIN pub_info ON publishers.pub_id = pub_info.pub_id
Otros
Puede hacer coincidir filas utilizando una condicin distinta de la de igualdad. Por ejemplo, para buscar los empleados y los puestos de trabajo para los que no tienen la calificacin apropiada, puede combinar empleados con puestos, haciendo coincidir filas en las que el
nivel mnimo requerido del puesto de trabajo supere el nivel del puesto de trabajo del empleado. El cdigo SQL resultante sera parecido a
este:
SELECT fname, minit, lname, job_desc, job_lvl, min_lvl
FROM employee INNER JOIN jobs ON employee.job_lvl < jobs.min_lvl

COMBINAR TRES O MS TABLAS


Cada operacin JOIN combina dos tablas. Sin embargo, puede utilizar varias operaciones JOIN en una consulta para reunir datos
de cualquier nmero de tablas. Dado que el resultado de cada operacin JOIN es efectivamente una tabla, puede utilizar ese resultado
como un operando en una operacin JOIN posterior. Por ejemplo, para crear un conjunto de resultados en el que cada fila contenga un
ttulo de libro, un autor y el porcentaje de derechos que recibe el autor por dicho libro, debe combinar datos de las tres tablas: authors
(autores), titles (ttulos) y titleauthor (ttuloautor). El cdigo SQL resultante sera parecido a este:
SELECT title, au_fname, au_lname, royaltyper
FROM authors INNER JOIN titleauthor
ON authors.au_id = titleauthor.au_id INNER JOIN titles
ON titleauthor.title_id = titles.title_id

UTILIZAR UNA TABLA SLO PARA COMBINAR OTRAS TABLAS


Puede incluir una tabla en una combinacin aunque no desee incluir ninguna de las columnas de dicha tabla en un conjunto de
resultados. Por ejemplo, para establecer un conjunto de resultados en el que cada fila describa un par ttulo-almacn en el que dicho almacn venda ese ttulo, puede incluir columnas de dos tablas: titles (ttulos) y stores (almacenes). Pero, para determinar los almacenes y los
ttulos que estos han vendido, debe utilizar una tercera tabla, sales (ventas). El cdigo SQL resultante sera parecido a este:
SELECT title, stor_name
FROM titles INNER JOIN sales
AO 2003

Pgina 22 de 96

SQL

Lic. Gustavo Rei


ON titles.title_id = sales.title_id INNER JOIN stores
ON sales.stor_id = stores.stor_id
Conviene observar que la tabla sales (ventas) no contribuye con columnas al conjunto de resultados.

UTILIZAR UNA TABLA DOS VECES EN UNA CONSULTA


Puede utilizar la misma tabla dos o ms veces en una nica consulta.

UTILIZAR OTRO ELEMENTO EN LUGAR DE UNA TABLA


En lugar de una tabla, puede utilizar una consulta, una vista o una funcin definida por el usuario que devuelva una tabla.

AO 2003

Pgina 23 de 96

SQL

Lic. Gustavo Rei

Introduccin
En SQL la mayora de los motores de bases de datos relacionales, pueden definir un tipo de consultas cuyas filas resultantes son
un resumen de las filas de la tabla origen, por eso las denominamos consultas de resumen, tambin se conocen como consultas sumarias.
Es importante entender que las filas del resultado de una consulta de resumen tienen una naturaleza distinta a las filas de las dems tablas resultantes de consultas, ya que corresponden a varias filas de la tabla origen. Para simplificar, veamos el caso de una consulta
basada en una sola tabla, una fila de una consulta 'no resumen' corresponde a una fila de la tabla origen, contiene datos que se encuentran
en una sola fila del origen, mientras que una fila de una consulta de resumen corresponde a un resumen de varias filas de la tabla origen,
esta diferencia es lo que va a originar una serie de restricciones que sufren las consultas de resumen y que veremos a lo largo del tema.
En el ejemplo que viene a continuacin tienes un ejemplo de consulta normal en la que se visualizan las filas de la tabla oficinas
ordenadas por regin, en este caso cada fila del resultado se corresponde con una sola fila de la tabla oficinas, mientras que la segunda
consulta es una consulta resumen, cada fila del resultado se corresponde con una o varias filas de la tabla oficinas.

Las consultas de resumen introducen dos nuevas clusulas a la sentencia SELECT, la clusula GROUP BY y la clusula
HAVING, son clusulas que slo se pueden utilizar en una consulta de resumen, se tienen que escribir entre la clusula WHERE y la clusula ORDER BY y tienen la siguiente sintaxis:

Las detallaremos en la pgina siguiente del tema, primero vamos a introducir otro concepto relacionado con las consultas de resumen, las funciones de columna.

Funciones de columna
En la lista de seleccin de una consulta de resumen aparecen funciones de columna tambin denominadas funciones de dominio
agregadas. Una funcin de columna se aplica a una columna y obtiene un valor que resume el contenido de la columna.
Tenemos las siguientes funciones de columna:
AO 2003

Pgina 24 de 96

SQL

Lic. Gustavo Rei

El argumento de la funcin indica con qu valores se tiene que operar, por eso expresin suele ser un nombre de columna, columna que contiene los valores a resumir, pero tambin puede ser cualquier expresin vlida que devuelva una lista de valores.
La funcin SUM() calcula la suma de los valores indicados en el argumento. Los datos que se suman deben ser de tipo numrico
(entero, decimal, coma flotante o monetario...). El resultado ser del mismo tipo aunque puede tener una precisin mayor
SELECT SUM(ventas)
FROM oficinas

Obtiene una sola fila con el resultado de sumar todos los valores de la columna ventas de la tabla oficinas

La funcin AVG() calcula el promedio (la media arimtica) de los valores indicados en el argumento, tambin se aplica a datos
numricos, y en este caso el tipo de dato del resultado puede cambiar segn las necesidades del sistema para representar el valor del
resultado.
StDev() y StDevP() calculan la desviacin estndar de una poblacin o de una muestra de la poblacin representada por los valores contenidos en la columna indicada en el argumento. Si la consulta base (el origen) tiene menos de dos registros, el resultado es nulo.
Es interesante destacar que el valor nulo no equivale al valor 0, las funciones de columna no consideran los valores nulos mientras que consideran el valor 0 como un valor, por lo tanto en las funciones AVG(), STDEV(), STDEVP() los resultados no sern los mismos
con valores 0 que con valores nulos. Vemoslo con un ejemplo:
Si tenemos esta tabla:
En este caso los ceros entran en la
La consulta
media por lo que sale igual a 4
SELECT AVG(col1) AS media
(10+5+0+3+6+0)/6 = 4
devuelve:
FROM tabla1

Con esta otra tabla:

SELECT AVG(col1) AS media


FROM tabla2
devuelve:

En este caso los ceros se han sustituido


por valores nulos y no entran en el clculo por lo que la media sale igual a 6
(10+5+3+6)/4 = 4

Las funciones MIN() y MAX() determinan los valores menores y mayores respectivamente. Los valores de la columna pueden ser
de tipo numrico, texto o fecha. El resultado de la funcin tendr el mismo tipo de dato que la columna. Si la columna es de tipo numrico
MIN() devuelve el valor menor contenido en la columna, si la columna es de tipo texto MIN() devuelve el primer valor en orden alfabtico, y
si la columna es de tipo fecha, MIN() devuelve la fecha ms antigua y MAX() la fecha ms reciente.
La funcin COUNT(nb columna) cuenta el nmero de valores que hay en la columna, los datos de la columna pueden ser de
cualquier tipo, y la funcin siempre devuelve un nmero entero. Si la columna contiene valores nulos esos valores no se cuentan, si en la
columna aparece un valor repetido, lo cuenta varias veces.
COUNT(*) permite contar filas en vez de valores. Si la columna no contiene ningn valor nulo, COUNT(nbcolumna) y COUNT(*)
devuelven el mismo resultado, mientras que si hay valores nulos en la columna, COUNT(*) cuenta tambin esos valores mientras que
COUNT(nb columna) no los cuenta.
Ejemplo:
Cuntos empleados tenemos?
AO 2003

Pgina 25 de 96

SQL

Lic. Gustavo Rei

SELECT COUNT(numemp)
FROM empleados
o bien
SELECT COUNT(*)
FROM empleados
En este caso las dos sentencias devuelen el mismo resultado ya que la columna numemp no contiene valores nulos (es la clave
principal de la tabla empleados).
Cuntos empleados tienen una oficina asignada?
SELECT COUNT(oficina)
FROM empleados
Esta sentencia por el contrario, nos devuelve el nmero de valores no nulos que se encuentran en la columna oficina de la tabla
empleados, por lo tanto nos dice cuntos empleados tienen una oficina asignada.
Se pueden combinar varias funciones de columna en una expresin pero no se pueden anidar funciones de columna, es decir:
SELECT (AVG(ventas) * 3) + SUM(cuota)
FROM ...
es correcto
SELECT AVG(SUM(ventas))
FROM ...
NO es correcto, no se puede incluir una funcin de columna dentro de una funcin de columna

SELECCIN EN EL ORIGEN DE DATOS.


Si queremos eliminar del origen de datos algunas filas, basta incluir la clusula WHERE que ya conocemos despus de la clusula FROM.
Ejemplo: Queremos saber el acumulado de ventas de los empleados de la oficina 12.
SELECT SUM(ventas)
FROM empleados
WHERE oficina = 12

ORIGEN MLTIPLE.
Si los datos que necesitamos utilizar para obtener nuestro resumen se encuentran en varias tablas, formamos el origen de datos
adecuado en la clusula FROM como si fuera una consulta multitabla normal.
Ejemplo: Queremos obtener el importe total de ventas de todos los empleados y el mayor objetivo de las oficinas asignadas a los
empleados:
SELECT SUM(empleados.ventas), MAX(objetivo)
FROM empleados LEFT JOIN oficinas ON empleados.oficina=oficinas.oficina
NOTA: combinamos empleados con oficinas por un LEFT JOIN para que aparezcan en el origen de datos todos los empleados
incluso los que no tengan una oficina asignada, as el origen de datos estar formado por una tabla con tantas filas como empleados hayan
en la tabla empleados, con los datos de cada empleado y de la oficina a la que est asignado. De esta tabla sacamos la suma del campo
ventas (importe total de ventas de todos los empleados) y el objetivo mximo. Observar que el origen de datos no incluye las oficinas que
no tienen empleados asignados, por lo que esas oficinas no entran a la hora de calcular el valor mximo del objetivo.

AO 2003

Pgina 26 de 96

SQL

Lic. Gustavo Rei

La clusula GROUP BY

Hasta ahora las consultas de resumen que hemos visto utilizan todas las filas de la tabla y producen una nica fila resultado.
Se pueden obtener subtotales con la clusula GROUP BY. Una consulta con una clusula GROUP BY se denomina consulta
agrupada ya que agrupa los datos de la tabla origen y produce una nica fila resumen por cada grupo formado. Las columnas indicadas en
el GROUP BY se llaman columnas de agrupacin.
Ejemplo:
Obtiene la suma de las ventas de todos los empleados
SELECT SUM(ventas)
FROM repventas
Se forma un grupo para cada oficina, con las filas de la oficina, y la suma se calcula sobre las filas de cada grupo. El ejemplo anterior obtiene una lista con la suma de las ventas de los empleados de cada oficina.
SELECT SUM(ventas)
FROM repventas
GROUP BY oficina
La consulta quedara mejor incluyendo en la lista de seleccin la oficina para saber a qu oficina corresponde la suma de ventas:
SELECT oficina,SUM(ventas)
FROM repventas
GROUP BY oficina
Un columna de agrupacin no puede ser de tipo memo u OLE.
La columna de agrupacin se puede indicar mediante un nombre de columna o cualquier expresin vlida basada en una columna pero no se pueden utilizar los alias de campo.
Ejemplo:
SELECT importe/cant , SUM(importe)
FROM pedidos
GROUP BY importe/cant
Est permitido, equivaldra a agrupar las lneas de pedido por precio unitario y sacar de cada precio unitario el importe total vendido
SELECT importe/cant AS precio, SUM(importe)
FROM pedidos
GROUP BY precio
No est permitido, no se puede utilizar un alias campo
En la lista de seleccin slo pueden aparecer :
valores constantes
funciones de columna
columnas de agrupacin (columnas que aparecen en la clusula GROUP BY)
cualquier expresin basada en las anteriores.
SELECT SUM(importe),rep*10
AO 2003

Pgina 27 de 96

SQL

Lic. Gustavo Rei


FROM pedidos
GROUP BY rep*10
Est permitido

SELECT SUM(importe),rep
FROM pedidos
GROUP BY rep*10
No est permitido, rep es una columna simple que no est encerrrada en una funcin de columna, ni est en la lista de columnas
de agrupacin.
Se pueden agrupar las filas por varias columnas, en este caso se indican las columnas separadas por una coma y en el orden de
mayor a menor agrupacin. Se permite incluir en la lista de agrupacin hasta 10 columnas.
Ejemplo: Queremos obtener la suma de las ventas de las oficinas agrupadas por region y ciudad:
SELECT SUM(ventas)
FROM oficinas
GROUP BY region,ciudad
Se agrupa primero por regin, y dentro de cada regin por ciudad.
Todas las filas que tienen valor nulo en el campo de agrupacin, pasan a formar un nico grupo. Es decir, considera el valor nulo
como un valor cualquiera a efectos de agrupacin.
Ejemplo:
SELECT oficina,SUM(ventas) AS ventas_totales
FROM repventas
GROUP BY oficina
En el resultado aparece una fila con el campo oficina sin valor y a continuacin una cantidad en el campo ventas_totales, esta
cantidad corresponde a la suma de las ventas de los empleados que no tienen oficina asignada (campo oficina igual a nulo).

La clusula HAVING
La clusula HAVING nos permite seleccionar filas de la tabla resultante de una consulta de resumen.
Para la condicin de seleccin se pueden utilizar los mismos tests de comparacin descritos en la clusula WHERE, tambin se
pueden escribir condiciones compuestas (unidas por los operadores OR, AND, NOT), pero existe una restriccin.
En la condicin de seleccin slo pueden aparecer :
valores constantes
funciones de columna
columnas de agrupacin (columnas que aparecen en la clusula GROUP BY)
cualquier expresin basada en las anteriores.
Ejemplo: Queremos saber las oficinas con un promedio de ventas de sus empleados mayor que 500.000 $
SELECT oficina
FROM empleados
GROUP BY oficina
HAVING AVG(ventas) > 500000
NOTA: Para obtener lo que se pide hay que calcular el promedio de ventas de los empleados de cada oficina, por lo que hay que
utilizar la tabla empleados.Tenemos que agrupar los empleados por oficina y calcular el promedio para cada oficina, por ltimo nos queda
seleccionar del resultado las filas que tengan un promedio superior a 500.000 $.

Resumen del tema


AO 2003

Pgina 28 de 96

SQL

Lic. Gustavo Rei

Cmo se ejecuta internamente una consulta de resumen?


Primero se forma la tabla origen de datos segn la clusula FROM,
se seleccionan del origen de datos las filas segn la clusula WHERE,
se forman los grupos de filas segn la clusula GROUP BY,
por cada grupo se obtiene una fila en la tabla resultante con los valores que aparecen en las clusulas GROUP BY, HAVING y en
la lista de seleccin,
se seleccionan de la tabla resultante las filas segn la clusula HAVING,
se eliminan de la tabla resultante las columnas que no aparecen en la lista de seleccin,
se ordenan las filas de la tabla resultante segn la clusula ORDER BY
Una consulta se convierte en consulta de resumen en cuanto aparece GROUP BY, HAVING o una funcin de columna.
En una consulta de resumen, la lista de seleccin y la clusula HAVING slo pueden contener:
valores constantes
funciones de columna
columnas de agrupacin (columnas que aparecen en la clusula GROUP BY)
cualquier expresin basada en las anteriores.

AO 2003

Pgina 29 de 96

SQL

Lic. Gustavo Rei

Definiciones
Una subconsulta es una sentencia SELECT que aparece dentro de otra sentencia SELECT que llamaremos consulta principal.
Se puede encontrar en la lista de seleccin, en la clusula WHERE o en la clusula HAVING de la consulta principal.
Una subconsulta tiene la misma sintaxis que una sentencia SELECT normal exceptuando que aparece encerrada entre parntesis, no puede contener la clusula ORDER BY, ni puede ser la UNION de varias sentencias SELECT, adems tiene algunas restricciones
en cuanto a nmero de columnas segn el lugar donde aparece en la consulta principal. Estas restricciones las ire-mos describiendo en
cada caso.
Cuando se ejecuta una consulta que contiene una subconsulta, la subconsulta se ejecuta por cada fila de la consulta prin-cipal.
Se aconseja no utilizar campos calculados en las subconsultas, ralentizan la consulta.
Las consultas que utilizan subconsultas suelen ser ms fciles de interpretar por el usuario.

Referencias externas
A menudo, es necesario, dentro del cuerpo de una subconsulta, hacer referencia al valor de una columna en la fila actual de la
consulta principal, ese nombre de columna se denomina referencia externa.
Una referencia externa es un nombre de columna que estando en la subconsulta, no se refiere a ninguna columna de las ta-blas
designadas en la FROM de la subconsulta sino a una columna de las tablas designadas en la FROM de la consulta prin-cipal. Como la
subconsulta se ejecuta por cada fila de la consulta principal, el valor de la referencia externa ir cambiando.
Ejemplo:
SELECT numemp, nombre, (SELECT MIN(fechapedido) FROM pedidos WHERE rep = numemp)
FROM empleados;
En este ejemplo la consulta principal es SELECT... FROM empleados.
La subconsulta es ( SELECT MIN(fechapedido) FROM pedidos WHERE rep = numemp ).
En esta subconsulta tenemos una referencia externa ( numemp ) es un campo de la tabla empleados (origen de la consulta principal).

QU PASA CUANDO SE EJECUTA LA CONSULTA PRINCIPAL?


se elije el primer empleado y se calcula la subconsulta sustituyendo numemp por el valor que tiene en el primer em-pleado. La
subconsulta obtiene la fecha ms antigua en los pedidos del rep = 101
se elije el segundo empleado y se calcula la subconsulta con numemp = 102 (numemp del segundo empleado)... y as sucesivamente hasta llegar al ltimo empleado.
Al final obtenemos una lista con el nmero, nombre y fecha del primer pedido de cada empleado.
Si quitamos la clusula WHERE de la subconsulta obtenemos la fecha del primer pedido de todos los pedidos no del empleado
correspondiente.

Anidar subconsultas
Las subconsultas pueden anidarse de forma que una subconsulta aparezca en la clusula WHERE (por ejemplo) de otra subconsulta que a su vez forma parte de otra consulta principal. En la prctica, una consulta consume mucho ms tiempo y me-moria cuando se
incrementa el nmero de niveles de anidamiento. La consulta resulta tambin ms difcil de leer , comprender y mantener cuando contiene
ms de uno o dos niveles de subconsultas.
Ejemplo:
SELECT numemp, nombre
FROM empleados
WHERE numemp = (SELECT rep FROM pedidos WHERE clie = (SELECT numclie FROM clientes WHERE nombre = 'Julia Antequera'))
AO 2003

Pgina 30 de 96

SQL

Lic. Gustavo Rei

En este ejemplo, por cada linea de pedido se calcula la subconsulta de clientes, y esto se repite por cada empleado, en el caso de
tener 10 filas de empleados y 200 filas de pedidos (tablas realmente pequeas), la subconsulta ms interna se ejecutara 2000 veces (10 x
200).

Subconsulta en la lista de seleccin


Cuando la subconsulta aparece en la lista de seleccin de la consulta principal, en este caso la subconsulta, no puede devol-ver
varias filas ni varias columnas, de lo contrario se da un mensaje de error.
Muchos SQLs no permiten que una subconsulta aparezca en la lista de seleccin de la consulta principal pero eso no es ningn
problema ya que normalmente se puede obtener lo mismo utilizando como origen de datos las dos tablas. El ejemplo anterior se puede
obtener de la siguiente forma:
SELECT numemp, nombre, MIN(fechapedido)
FROM empleados LEFT JOIN pedidos ON empleados.numemp = pedidos.rep
GROUP BY numemp, nombre

En la clusula FROM
En la clusula FROM se puede encontrar una sentencia SELECT encerrada entre parntesis pero ms que subconsulta sera una
consulta ya que no se ejecuta para cada fila de la tabla origen sino que se ejecuta una sola vez al principio, su resultado se combina con las
filas de la otra tabla para formar las filas origen de la SELECT primera y no admite referencias externas.
En la clusula FROM vimos que se poda poner un nombre de tabla o un nombre de consulta, pues en vez de poner un nombre
de consulta se puede poner directamente la sentencia SELECT correspondiente a esa consulta encerrada entre parntesis.

Subconsulta en las clusulas WHERE y HAVING


Se suele utilizar subconsultas en las clusulas WHERE o HAVING cuando los datos que queremos visualizar estn en una tabla
pero para seleccionar las filas de esa tabla necesitamos un dato que est en otra tabla.
Ejemplo:
SELECT numemp, nombre
FROM empleados
WHERE contrato = (SELECT MIN(fechapedido) FROM pedidos)
En este ejemplo listamos el nmero y nombre de los empleados cuya fecha de contrato sea igual a la primera fecha de todos los
pedidos de la empresa.
En una clusula WHERE / HAVING tenemos siempre una condicin y la subconsulta acta de operando dentro de esa condi-cin.
En el ejemplo anterior se compara contrato con el resultado de la subconsulta. Hasta ahora las condiciones estudiadas tenan como operandos valores simples (el valor contenido en una columna de una fila de la tabla, el resultado de una operacin aritmti-ca...) ahora
la subconsulta puede devolver una columna entera por lo que es necesario definir otro tipo de condiciones especia-les para cuando se
utilizan con subconsultas.

Condiciones de seleccin con subconsultas


Las condiciones de seleccin son las condiciones que pueden aparecer en la clusula WHERE o HAVING. La mayora se han visto en el tema 2 pero ahora incluiremos las condiciones que utilizan una subconsulta como operando.
En SQL tenemos cuatro nuevas condiciones:
el test de comparacin con subconsulta
el test de comparacin cuantificada
el test de pertenencia a un conjunto
el test de existencia

AO 2003

Pgina 31 de 96

SQL

Lic. Gustavo Rei

En todos los tests estudiados a continuacin expresion puede ser cualquier nombre de columna de la consulta principal o una expresin vlida como ya vimos .

EL TEST DE COMPARACIN CON SUBCONSULTA.


Es el equivalente al test de comparacin simple. Se utiliza para comparar un valor de la fila que se est examinado con un nico
valor producido por la subconsulta. La subconsulta debe devolver una nica columna, sino se produce un error.
Si la subconsulta no produce ninguna fila o devuelve el valor nulo, el test devuelve el valor nulo, si la subconsulta produce va-rias
filas, SQL devuelve una condicin de error.

LA SINTAXIS ES LA SIGUIENTE:

Lista las oficinas cuyo objetivo sea superior a la suma de las ventas de sus empleados.
En este caso la subconsulta devuelve una nica columna y una nica fila (es un consulta de resumen sin GROUP BY)
SELECT oficina, ciudad
FROM oficinas
WHERE objetivo > (SELECT SUM(ventas) FROM empleados WHERE empleados.oficina = ofici-nas.oficina)

EL TEST DE COMPARACIN CUANTIFICADA.


Este test es una extensin del test de comparacin y del test de conjunto. Compara el valor de la expresin con cada uno de los
valores producidos por la subconsulta. La subconsulta debe devolver una nica columna sino se produce un error.
Tenemos el test ANY (algn, alguno en ingls) y el test ALL (todos en ingls).
La sintaxis es la siguiente:

El test ANY.
La subconsulta debe devolver una nica columna sino se produce un error.
Se evala la comparacin con cada valor devuelto por la subconsulta.
Si alguna de las comparaciones individuales produce el resultado verdadero, el test ANY devuelve el resultado verdadero.
Si la subconsulta no devuelve ningn valor, el test ANY devuelve falso.
Si el test de comparacin es falso para todos los valores de la columna, ANY devuelve falso.
Si el test de comparacin no es verdadero para ningn valor de la columna, y es nulo para al menos alguno de los valores, ANY
devuelve nulo.
SELECT oficina, ciudad
FROM oficinas
WHERE objetivo > ANY (SELECT SUM(cuota) FROM empleados GROUP BY oficina)
En este caso la subconsulta devuelve una nica columna con las sumas de las cuotas de los empleados de cada oficina.
Lista las oficinas cuyo objetivo sea superior a alguna de las sumas ob-tenidas.
El test ALL.
La subconsulta debe devolver una nica columna sino se produce un error.
Se evala la comparacin con cada valor devuelto por la subconsulta.
AO 2003

Pgina 32 de 96

SQL

Lic. Gustavo Rei

Si todas las comparaciones individuales, producen un resultado verdadero, el test devuelve el valor verdadero.
Si la subconsulta no devuelve ningn valor el test ALL devuelve el valor verdadero. (Ojo con esto!)
Si el test de comparacin es falso para algn valor de la columna, el resultado es falso.
Si el test de comparacin no es falso para ningn valor de la columna, pero es nulo para alguno de esos valores, el test ALL devuelve valor nulo.
SELECT oficina, ciudad
FROM oficinas
WHERE objetivo > ALL (SELECT SUM(cuota) FROM empleados GROUP BY oficina)
En este caso se listan las oficinas cuyo objetivo sea superior a todas las sumas.
Test de pertenencia a conjunto (IN).
Examina si el valor de la expresin es uno de los valores incluidos en la lista de valores producida por la subconsulta.
La subconsulta debe generar una nica columna y las filas que sean.
Si la subconsulta no produce ninguna fila, el test da falso.
Tiene la siguiente sintaxis

SELECT numemp, nombre, oficina


FROM empleados
WHERE oficina IN (SELECT oficina FROM oficinas WHERE region = 'este')
Con la subconsulta se obtiene la lista de los nmeros de oficina del es-te y la consulta principal obtiene los empleados cuyo nmero de oficina sea uno de los nmeros de oficina del este.
Por lo tanto lista los empleados de las oficinas del este.
El test de existencia EXISTS.
Examina si la subconsulta produce alguna fila de resultados.
Si la subconsulta contiene filas, el test adopta el valor verdadero, si la subconsulta no contiene ninguna fila, el test toma el va-lor
falso, nunca puede tomar el valor nulo.
Con este test la subconsulta puede tener varias columnas, no importa ya que el test se fija no en los valores devueltos sino en si
hay o no fila en la tabla resultado de la subconsulta.
Cuando se utiliza el test de existencia en la mayora de los casos habr que utilizar una referencia externa. Si no se utiliza una referencia externa la subconsulta devuelta siempre ser la misma para todas las filas de la consulta principal y en este caso se se-leccionan
todas las filas de la consulta principal (si la subconsulta genera filas) o ninguna (si la subconsulta no devuelve ninguna fila)
La sintaxis es la siguiente:

SELECT numemp, nombre, oficina


FROM empleados
WHERE EXISTS (SELECT * FROM oficinas WHE-RE region = 'este' AND empleados.oficina = ofici-nas.oficina)
Este ejemplo obtiene lo mismo que el ejemplo del test IN.
Observa que delante de EXISTS no va ningn nombre de columna.
En la subconsulta se pueden poner las columnas que queramos en la lista de seleccin (hemos utilizado el *).
Hemos aadido una condicin adicional al WHERE, la de la referencia externa para que la oficina que se compare sea la oficina
del empleado
NOTA. Cuando se trabaja con tablas muy voluminosas el test EXISTS suele dar mejor rendimiento que el test IN

RESUMEN DEL TEMA


Una subconsulta es una sentencia SELECT que aparece en la lista de seleccin, o en las clusulas WHERE o HAVING de otra
sentencia SELECT.
La subconsulta se ejecuta por cada fila de la consulta principal.
Dentro de una consulta se puede utilizar una columna del origen de la consulta principal, una referencia externa.
Aunque se puedan anidar subconsultas no es aconsejado ms de un nivel de anidamiento.
La subconsulta sufre una serie de restricciones segn el lugar donde se encuentre.
Las condiciones asociadas a las subconsultas son las siguientes:
AO 2003

Pgina 33 de 96

SQL

Lic. Gustavo Rei


el test de comparacin con subconsulta
el test ANY
el test ALL
el test IN
el test EXISTS

AO 2003

Pgina 34 de 96

SQL

Lic. Gustavo Rei

Introduccin
Hasta ahora hemos estudiado cmo recuperar datos almacenados en las tablas de nuestra base de datos. En este tema vamos a
tratar el de la actualizacin de esos datos, es decir insertar nuevas filas, borrar filas o cambiar el contenido de las filas de una tabla. Estas
operaciones modifican los datos almacenados en las tablas pero no su estructura, ni su definicin.

Para Access
INSERTAR UNA FILA INSERT INTO...VALUES
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 INTO.
La insercin se puede realizar de una fila o de varias filas de golpe, veremos las dos opciones por separado y empezaremos por
la insercin de una fila.
La sintaxis es la siguiente:

Esta sintaxis se utiliza para insertar una sola fila cuyos valores indicamos despus de la palabra reservada VALUES. En castellano la sentencia se leera: INSERTA EN destino...VALORES ....
Los registros se agregan siempre al final de la tabla.
Destino es el nombre de la tabla donde vamos a insertar la fila tambin se puede utilizar un nombre de consulta, consulta que
tenga como origen de datos una nica tabla. Al nombre de la tabla se le puede aadir la clusula IN si la tabla se encuentra en otra base de
datos (en una base de datos externa).
La palabra reservada VALUES se puede sustituir por la palabra SELECT ( en otros SQLs se emplea nicamente VALUES).
A continuacin de la palabra VALUES, entre parntesis se escriben los valores que queremos aadir. Estos valores se tienen que
escribir de acuerdo al tipo de dato de la columna donde se van a insertar (encerrados entre comillas simples ' ' para valores de tipo texto,
entre # # para valores de fecha...) la asignacin de valores se realiza por posicin, el primer valor lo asigna a la primera columna, el segundo valor a la segunda columna, as sucesivamente...
Cuando la tabla tiene una columna de tipo contador (AutoNumber9 identity10), lo normal es no asignar valor a esa columna para
que el sistema le asigne el valor que le toque segn el contador, si por el contrario queremos que la columna tenga un valor concreto, lo
indicamos en la lista de valores.
Cuando no se indica ninguna lista de columnas despus del destino, se asume por defecto todas las columnas de la ta-bla, en este caso, los valores se tienen que especificar en el mismo orden en que aparecen las columnas en la ventana de diseo de dicha tabla, y se
tiene que utilizar el valor NULL para rellenar las columnas de las cuales no tenemos valores.
Ejemplo (Para Access):
INSERT INTO empleados VALUES (200, 'Juan Lpez', 30, NULL, 'rep ventas', #06/23/01#, NULL, 350000, 0)
Observar en el ejemplo que los valores de tipo texto se encierran entre comillas simples ' ' (tambin se pueden emplear las comillas dobles " ") y que la fecha de contrato se encierra entre almohadillas # # con el formato mes/da/ao. Como no tenemos valor para los
campos oficina y director (a este nuevo empleado todava no se le ha asignado director ni oficina) utilizamos la palabra reservada NULL.
Los valores numricos se escriben tal cual, para separar la parte entera de la parte decimal hay que utilizar siempre el punto independientemente de la configuracin que tengamos.
Cuando indicamos nombres de columnas, estos corresponden a nombres de columna de la tabla, pero no tienen por qu estar en
el orden en que aparecen en la ventana diseo de la tabla, tambin se pueden omitir algunas columnas, la columnas que no se nombran
tendrn por defecto el valor NULL o el valor predeterminado indicado en la ventana de diseo de tabla.
El ejemplo anterior se podra escribir de la siguiente forma:
INSERT INTO empleados (numemp,oficina, nombre, titulo,cuota, contrato, ventas)
VALUES (200, 30, 'Juan Lpez', 'rep ventas',350000, #06/23/01#,0)

Para Access

10

AO 2003

Para SQL Server

Pgina 35 de 96

SQL

Lic. Gustavo Rei

Observar que ahora hemos variado el orden de los valores y los nombres de columna no siguen el mismo orden que en la tabla
origen, no importa, lo importante es poner los valores en el mismo orden que las columnas que enunciamos. Como no enunciamos las
columnas oficina y director se rellenarn con el valor nulo (porque es el valor que tienen esas columnas como valor predeterminado).
El utilizar la opcin de poner una lista de columnas podra parecer peor ya que se tiene que escribir ms pero realmente tiene
ventajas sobre todo cuando la sentencia la vamos a almacenar y reutilizar:
la sentencia queda ms fcil de interpretar leyndola vemos qu valor asignamos a qu columna,
de paso nos aseguramos que el valor lo asignamos a la columna que queremos,
si por lo que sea cambia el orden de las columnas en la tabla en el diseo, no pasara nada mientras que de la otra forma intentara asignar los valores a otra columna, esto producira errores de 'tipo no corresponde' y lo que es peor podra asignar valores errneos sin
que nos demos cuenta,
otra ventaja es que si se aade una nueva columna a la tabla en el diseo, la primera sentencia INSERT dara error ya que el
nmero de valores no corresponde con el nmero de columnas de la tabla, mientras que la segunda INSERT no dara error y en la nueva
columna se insertara el valor predeterminado.

ERRORES QUE SE PUEDEN PRODUCIR CUANDO SE EJECUTA LA SENTENCIA INSERT INTO(CON ACCESS):
Si la tabla de destino tiene clave principal y en ese campo intentamos no asignar valor, asignar el valor nulo o un valor que ya
existe en la tabla, el motor de base de datos Microsoft Jet no aade la fila y da un mensaje de error de 'infracciones de clave'.
Si tenemos definido un ndice nico (sin duplicados) e intentamos asignar un valor que ya existe en la tabla tambin devuelve el
mismo error.
Si la tabla est relacionada con otra, se seguirn las reglas de integridad referencial. Aqu puedes repasar las reglas de integridad
referencial

Para SQL Server


AGREGAR FILAS CON INSERT
La instruccin INSERT agrega una o ms filas nuevas a una tabla. Tratada de forma simplificada, INSERT tiene la siguiente forma:
INSERT [INTO] table_or_view [(column_list)] data_values
La instruccin hace que data_values se inserte como una o ms filas en la tabla o vista que se nombra. El argumento column_list
es una lista separada por comas de los nombres de tablas que se pueden utilizar para especificar las columnas para las que se suministran
datos. Si no se especifica column_list, todas las columnas de la tabla o vista reciben datos.
Cuando una column_list no enumera todas las columnas de la tabla o vista, se inserta un valor de NULL (o el valor predeterminado si se ha definido alguno para la columna) en aquellas columnas que no se hayan enumerado en la lista. Todas las columnas no especificadas en la lista de columnas deben permitir valores NULL o tener un valor predeterminado asignado.
Las instrucciones INSERT no especifican valores para los siguientes tipos de columna porque Microsoft SQL Server genera
los valores de las columnas de estos tipos:
Columnas con una propiedad IDENTITY que genera los valores para la columna.
Columnas que tengan un valor predeterminado que utilice la funcin NEWID para generar un valor GUID exclusivo.
Columnas calculadas.
Se trata de columnas virtuales que se definieron como una expresin calculada a partir de una o varias columnas en la instruccin
CREATE TABLE, como:
CREATE TABLE TestTable
(ColA INT PRIMARY KEY,
ColB INT NOT NULL,
ColC AS (ColA + ColB) * 2)
Los valores de datos suministrados deben coincidir con la lista de columnas. El nmero de valores de datos debe ser el mismo
que el nmero de columnas y el tipo de datos, precisin y escala de cada valor de datos debe coincidir con los de la columna correspondiente. Hay dos maneras de especificar los valores de datos:
Utilizar una clusula VALUES para especificar los valores de datos para una fila:
INSERT INTO MyTable (PriKey, Description)
AO 2003

Pgina 36 de 96

SQL

Lic. Gustavo Rei


VALUES (123, 'A description of part 123.')
Utilizar una subconsulta SELECT para especificar los valores de datos para una o ms filas.
INSERT INTO MyTable (PriKey, Description)
SELECT ForeignKey, Description
FROM SomeView

Insertar varias filas INSERT INTO...SELECT


Podemos insertar en una tabla varias filas con una sola sentencia SELECT INTO si los valores a insertar se pueden obtener como
resultado de una consulta, en este caso sustituimos la clusula VALUES lista de valores por una sentencia SELECT como las que hemos
visto hasta ahora. Cada fila resultado de la SELECT forma una lista de valores que son los que se insertan en una nueva fila de la tabla
destino. Es como si tuviesemos una INSERT...VALUES por cada fila resultado de la sentencia SELECT.
La sintaxis es la siguiente:

El origen de la SELECT puede ser el nombre de una consulta guardada, un nombre de tabla o una composicin de va-rias tablas (
mediante INNER JOIN, LEFT JOIN, RIGHT JOIN o producto cartesiano).
Cada fila devuelta por la SELECT acta como la lista de valores que vimos con la INSERT...VALUES por lo que tiene las mismas
restricciones en cuanto a tipo de dato, etc. La asignacin de valores se realiza por posicin por lo que la SELECT debe devolver el mismo
nmero de columnas que las de la tabla destino y en el mismo orden, o el mismo nmero de columnas que indicamos en la lista de columnas despus de destino.
Las columnas de la SELECT no tienen porque llamarse igual que en la tabla destino ya que el sistema slo se fija en los valores
devueltos por la SELECT.
Si no queremos asignar valores a todas las columnas entonces tenemos que indicar entre parntesis la lista de columnas a rellenar despus del nombre del destino.
El estndar ANSI/ISO especifica varias restricciones sobre la consulta que aparece dentro de la sentencia INSERT:
la consulta no puede tener una clusula ORDER BY,
la tabla destino de la sentencia INSERT no puede aparecer en la clusula FROM de la consulta o de ninguna subconsulta que sta tenga. Esto prohibe insertar parte de una tabla en s misma,
la consulta no puede ser la UNION de varias sentencias SELECT diferentes,
el resultado de la consulta debe contener el mismo nmero de columnas que las indicadas para insertar y los tipos de datos deben ser compatibles columna a columna.
Sin embargo en SQL de Microsoft Jet,
se puede incluir la clusula ORDER BY aunque no tiene mucho sentido.
se puede poner en la clusula FROM de la consulta, la tabla en la que vamos a insertar,
pero no podemos utilizar una UNION.
Ejemplo: Supongamos que tenemos una tabla llamada repres con la misma estructura que la tabla empleados, y queremos insertar en esa tabla los empleados que tengan como titulo rep ventas
INSERT INTO repres SELECT * FROM empleados WHERE titulo = 'rep ventas'
Con SELECT obtenemos las filas correspondientes a los empleados con ttulo rep ventas,y las insertamos en la tabla repres. Como las tablas tienen la misma estructura no hace falta poner la lista de columnas y podemos emplear * en la lista de seleccin de la SELECT.
Ejemplo: Supongamos ahora que la tabla repres tuviese las siguientes columnas numemp, oficinarep, nombrerep. En este caso
no podramos utilizar el asterisco, tendramos que poner:
INSERT INTO repres SELECT numemp, oficina, nombre FROM empleados WHERE titulo = 'rep ventas'
O bien:
AO 2003

Pgina 37 de 96

SQL

Lic. Gustavo Rei


INSERT INTO repres (numemp, oficinarep, nombrerep)
SELECT numemp, oficina, nombre FROM empleados WHERE titulo = 'rep ventas'

Insertar filas en una nueva tabla SELECT ... INTO


Esta sentencia inserta filas creando en ese momento la tabla donde se insertan las filas. Se suele utilizar para guardar en una tabla el resultado de una SELECT.
La sintaxis es la siguiente:

Las columnas de la nueva tabla tendrn el mismo tipo y tamao que las columnas origen, y se llamarn con el nombre de alias de
la columna origen o en su defecto con el nombre de la columna origen, pero no se transfiere ninguna otra propiedad del campo o de la tabla
como por ejemplo las claves e ndices.
La sentencia SELECT puede ser cualquier sentencia SELECT sin ninguna restriccin, puede ser una consulta multitabla, una
consulta de resumen, una UNION ...
Ejemplo:
SELECT * INTO t2 FROM t1
Esta sentencia genera una nueva tabla t2 con todas las filas de la tabla t1. Las columnas se llamarn igual que en t1 pero t2 no
ser una copia exacta de t1 ya no tendr clave principal ni relaciones con las otras tablas, ni ndices si los tuviese t1 etc...
Si en la base de datos hay ya una tabla del mismo nombre, el sistema nos avisa y nos pregunta si la queremos borrar. Si le contestamos que no, la SELECT no se ejecuta.
Para formar una sentencia SELECT INTO lo mejor es escribir la SELECT que permite generar los datos que queremos guardar
en la nueva tabla, y despus aadir delante de la clusula FROM la clusula INTO nuevatabla.
La sentencia SELECT INTO se suele utilizar para crear tablas de trabajo, o tablas intermedias, las creamos para una determinada tarea y cuando hemos terminado esa tarea las borramos. Tambin puede ser til para sacar datos en una tabla para enviarlos a
alguien.
Por ejemplo: Queremos enviarle a un representante una tabla con todos los datos personales de sus clientes para que les pueda
enviar cartas etc...
SELECT numclie AS codigo, nombre, direccion, telefono INTO susclientes FROM clientes WHERE repclie = '103';
Vamos a suponer que hemos aadido a nuestra tabla de clientes los campos direccion y telefono. En el ejemplo anterior la nue-va
tabla tendr cuatro columnas llamadas codigo, nombre, direccion, telefono y contendr las filas correspondientes a los clientes del representante 103

Modificar el contenido de las filas ( UPDATE )


La sentencia UPDATE modifica los valores de una o ms columnas en las filas seleccionadas de una o varias tablas.
La sintaxis es la siguiente:

Origen puede ser un nombre de tabla, un nombre de consulta o una composicin de tablas, tambin puede incluir la clusula IN si
la tabla a modificar se encuentra en una base de datos externa.
AO 2003

Pgina 38 de 96

SQL

Lic. Gustavo Rei

La clusula SET especifica qu columnas van a modificarse y qu valores asignar a esas columnas.
nbcolumna, es el nombre de la columna a la cual queremos asignar un nuevo valor por lo tanto debe ser una columna de la tabla
origen. El SQL estndar exige nombres sin cualificar pero algunas implementaciones (como por ejemplo el SQL de Microsoft Jet que estamos estudiando) s lo permiten.
La expresin en cada asignacin debe generar un valor del tipo de dato apropiado para la columna indicada. La expresin debe
ser calculable a partir de los valores de la fila que se est actualizando. Expresin no puede ser una subconsulta.
Ejemplo:
UPDATE oficinas INNER JOIN empleados
ON oficinas.oficina = empleados.oficina
SET cuota=objetivo*0.01;
En este ejemplo queremos actualizar las cuotas de nuestros empleados de tal forma que la cuota de un empleado sea el 1% del
objetivo de su oficina. La columna a actualizar es la cuota del empleado y el valor a asignar es el 1% del objetivo de la oficina del empleado,
luego la clusula SET ser SET cuota = objetivo*0.01 o SET cuota = objetivo/100. El origen debe contener la cuota del empleado y el objetivo de su oficina, luego el origen ser el INNER JOIN de empleados con oficinas.
La clusula WHERE indica qu filas van a ser modificadas. Si se omite la clusula WHERE se actualizan todas las filas.
En la condicin del WHERE se puede incluir una subconsulta. En SQL standard la tabla que aparece en la FROM de la subconsulta no puede ser la misma que la tabla que aparece como origen, pero en el SQL de Microsoft Jet s se puede.
Ejemplo: Queremos poner a cero las ventas de los empleados de la oficina 12
UPDATE empleados SET ventas = 0 WHERE oficina = 12;
Ejemplo: Queremos poner a cero el limite de credito de los clientes asignados a empleados de la oficina 12.
UPDATE clientes SET limitecredito = 0
WHERE repclie IN (SELECT numemp FROM empleados WHERE oficina = 12);
Si para el clculo de expresion se utiliza una columna que tambin se modifica, el valor que se utiliza es el antes de la modificacin, lo mismo para la condicin de bsqueda.
Cuando se ejecuta una sentencia UPDATE primero se genera el origen y se seleccionan las filas segn la clusula WHERE. A
continuacin se coge una fila de la seleccin y se le aplica la clusula SET, se actualizan todas las columnas in-cluidas en la clusula SET a
la vez por lo que los nombres de columna pueden especificarse en cualquier orden. Despus se coge la siguiente fila de la seleccin y se le
aplica del mismo modo la clusula SET, as sucesivamente con todas las filas de la selec-cin.
Ejemplo:
UPDATE oficinas SET ventas=0, objetivo=ventas;
O bien:
UPDATE oficinas SET objetivo=ventas, ventas=0;
Los dos ejemplos anteriores son equivalentes ya que el valor de ventas que se asigna a objetivo es el valor antes de la actualizacin, se deja como objetivo las ventas que ha tenido la oficina hasta el momento y se pone a cero la columna ventas.
Si actualizamos una columna definida como clave fornea, esta columna se podr actualizar o no siguiendo las reglas de integridad referencial. El valor que se le asigna debe existir en la tabla de referencia.
Si actualizamos una columna definida como columna principal de una relacin entre dos tablas, esta columna se podr actualizar
o no siguiendo las reglas de integridad referencial. Aqu puedes repasar las reglas de integridad referencial

LA INSTRUCCIN UPDATE TIENE ESTAS CLUSULAS PRINCIPALES:


SET
Contiene una lista separada por comas de las columnas que deben actualizarse y el nuevo valor de cada columna, con el formato
column_name = expression. El valor suministrado por las expresiones incluye elementos tales como constantes, valores seleccionados de
una columna de otra tabla o vista, o valores calculados por una expresin compleja.

FROM
Identifica las tablas o vistas que suministran los valores de las expresiones de la clusula SET, y las condiciones de combinacin
opcional entre las tablas o vistas de origen.

WHERE
Especifica la condicin de bsqueda que define las filas de las tablas y vistas de origen que estn calificadas para proporcionar
valores para las expresiones de la clusula SET.

AO 2003

Pgina 39 de 96

SQL

Lic. Gustavo Rei


Esta instruccin de actualizacin aumenta el precio de todos los productos de Northwind de la categora 2 en un 10 por ciento:
UPDATE Northwind.dbo.Products
SET UnitPrice = UnitPrice * 1.1
WHERE CategoryID = 2

Nota UPDATE se registra; si est cambiando grandes bloques de datos text o image, considere la posibilidad de utilizar la instruccin UPDATETEXT o WRITETEXT que, de forma predeterminada, no se registra.

UTILIZAR UNA INSTRUCCIN UPDATE SIMPLE


En estos ejemplos se muestra cmo se pueden ver afectadas todas las filas si se elimina una clusula WHERE de una instruccin
UPDATE.
En este ejemplo se muestra cmo se puede actualizar la tabla publishers si todas las editoriales de la tabla trasladan su sede central a Atlanta, Georgia.
UPDATE publishers
SET city = 'Atlanta', state = 'GA'
En este ejemplo se cambian los nombres de todas las editoriales a NULL.
UPDATE publishers
SET pub_name = NULL
Tambin se pueden utilizar valores calculados en una actualizacin. En este ejemplo se duplican todos los precios de la tabla titles.
UPDATE titles
SET price = price * 2
La clusula WHERE especifica las filas que se van a actualizar. Por ejemplo, imaginemos que el norte de California cambiara su
nombre por el de Pacifica (abreviado como PC) y los ciudadanos de Oakland decidieran cambiar el nombre de la localidad por el de Bay
City. En este ejemplo se muestra cmo actualizar la tabla authors para todos los residentes de la antigua Oakland, cuyas direcciones han
quedado desfasadas.
UPDATE authors
SET state = 'PC', city = 'Bay City'
WHERE state = 'CA' AND city = 'Oakland'

UTILIZAR LA INSTRUCCIN UPDATE CON INFORMACIN DE OTRA TABLA


En este ejemplo, se modifica la columna ytd_sales de la tabla titles para reflejar las ventas ms recientes registradas en la tabla
sales.
UPDATE titles
SET ytd_sales = titles.ytd_sales + sales.qty
FROM titles, sales
WHERE titles.title_id = sales.title_id
AND sales.ord_date = (SELECT MAX(sales.ord_date) FROM sales)
En este ejemplo se asume que slo se registra un conjunto de ventas para un determinado ttulo en una fecha determinada y que
las actualizaciones son recientes. Si no es as (si se puede registrar ms de una venta de un ttulo determinado en el mismo da), el ejemplo
que se muestra aqu no funcionar correctamente. Se ejecuta sin errores, pero cada ttulo se actualiza con una sola venta, independientemente de cuntas ventas reales se realicen en el da. Esto es debido a que una sola instruccin UPDATE nunca actualiza dos veces la
misma fila.

AO 2003

Pgina 40 de 96

SQL

Lic. Gustavo Rei

En una situacin en la que pueda haber ms de una venta de un ttulo en el mismo da, todas las ventas para cada ttulo se debern agregar dentro de la instruccin UPDATE, tal como se muestra en este ejemplo:
UPDATE titles
SET ytd_sales =
(SELECT SUM(qty)
FROM sales
WHERE sales.title_id = titles.title_id
AND sales.ord_date IN (SELECT MAX(ord_date) FROM sales))
FROM titles, sales

UTILIZAR UPDATE CON LA CLUSULA TOP EN UNA INSTRUCCIN SELECT


En este ejemplo se actualiza la columna state para los 10 primeros autores de la tabla authors.
UPDATE authors
SET state = 'ZZ'
FROM (SELECT TOP 10 * FROM authors ORDER BY au_lname) AS t1
WHERE authors.au_id = t1.au_id

Borrar filas (DELETE)


La sentencia DELETE elimina filas de una tabla.
La sintaxis es la siguiente:

Origen es el nombre de la tabla de donde vamos a borrar, podemos indicar un nombre de tabla, incluir la clusula IN si la tabla se
encuentra en una base de datos externa, tambin podemos escribir una composicin de tablas.
La opcin tabla.* se utiliza cuando el origen est basado en varias tablas, y sirve para indicar en qu tabla vamos a borrar.
La opcin * es opcional y es la que se asume por defecto y se puede poner unicamente cuando el origen es una sola tabla.
La clusula WHERE sirve para especificar qu filas queremos borrar. Se eliminaran de la tabla todas las filas que cumplan la condicin. Si no se indica la clusula WHERE, se borran TODAS las filas de la tabla.
En la condicin de bsqueda de la sentencia DELETE, se puede utilizar una subconsulta. En SQL standard la tabla que aparece
en la FROM de la subconsulta no puede ser la misma que la tabla que aparece en la FROM de la DELETE pero en el SQL de Microsoft Jet
s se puede hacer.
Una vez borrados, los registros no se pueden recuperar.
Si la tabla donde borramos est relacionada con otras tablas se podrn borrar o no los registros siguiendo las reglas de integridad
referencial definidas en las relaciones.
Ejemplo:
DELETE * FROM pedidos WHERE clie IN (SELECT numclie FROM clientes WHERE nombre = 'Julian Lpez');
O bien:
DELETE pedidos.* FROM pedidos INNER JOIN clientes ON pedidos.clie = clientes.numclie WHERE nombre = 'Julian Lpez';
Las dos sentencias borran los pedidos del cliente Julian Lpez. En la segunda estamos obligados a poner pedidos.* porque el origen est basado en varias tablas.
DELETE * FROM pedidos; o DELETE FROM pedidos; Borra todas las filas de pedidos.

RESUMEN DEL TEMA


Si queremos aadir en una tabla una fila con valores conocidos utilizamos la sentencia INSERT INTO tabla VALUES (lista de valores).
Si los valores a insertar se encuentran en una o varias tablas utilizamos INSERT INTO tabla SELECT ...
AO 2003

Pgina 41 de 96

SQL

Lic. Gustavo Rei

Para crear una nueva tabla con el resultado de una consulta con la sentencia SELECT...INTO tabla FROM...
Para cambiar los datos contenidos en una tabla, tenemos que actualizar las filas de dicha tabla con la sentencia UPDATE tabla
SET asignacin de nuevos valores.
Para eliminar filas de una tabla se utiliza la sentencia DELETE FROM tabla.
Con la clusula WHERE podemos indicar a qu filas afecta la actualizacin o el borrado.

EJEMPLOS DE SQL SERVER


Eliminar filas con DELETE
La instruccin DELETE quita una o varias filas de una tabla o vista. Una forma simplificada de la sintaxis de DELETE es:
DELETE table_or_view FROM table_sources WHERE search_condition
table_or_view nombra la tabla o vista de la que se van a eliminar las filas. Se eliminan todas las filas de table_or_view que renan
los requisitos de la condicin de bsqueda de la clusula WHERE. Si no se especifica una clusula WHERE, se eliminan todas las filas de
table_or_view. La clusula FROM especifica tablas o vistas adicionales y condiciones de combinacin que pueden ser utilizadas por los
predicados de la condicin de bsqueda de la clusula WHERE para calificar las filas que deben ser eliminadas de table_or_view. Las filas
no se eliminan de las tablas mencionadas en la clusula FROM, slo de la tabla mencionada en table_or_view.
Cualquier tabla de la que se hayan quitado todas las filas sigue permaneciendo en la base de datos. La instruccin DELETE slo
elimina filas de la tabla, y sta se debe quitar de la base de datos mediante la instruccin DROP TABLE.
Esta secuencia de comandos muestra las tres instrucciones DELETE necesarias para eliminar las filas asociadas con los productos suministrados por la empresa llamada Lyngbysild de la base de datos Northwind. No sera una operacin empresarial tpica porque
conlleva la eliminacin de lneas de pedidos existentes, pero muestra una serie de eliminaciones de distinta complejidad.
USE Northwind
GO
DELETE [Order Details]
FROM Suppliers, Products
WHERE Products.SupplierID = Suppliers.SupplierID
AND Suppliers.CompanyName = 'Lyngbysild'
AND [Order Details].ProductID = Products.ProductID
GO
DELETE Products
FROM Suppliers
WHERE Products.SupplierID = Suppliers.SupplierID
AND Suppliers.CompanyName = 'Lyngbysild'
GO
DELETE Suppliers
WHERE CompanyName = 'Lyngbysild'
GO

UTILIZAR DELETE SIN PARMETROS


Este ejemplo elimina todas las filas de la tabla authors.
USE pubs
DELETE authors

UTILIZAR DELETE EN UN CONJUNTO DE FILAS


Debido a que au_lname puede no ser nico, este ejemplo elimina todas las filas en que au_lname es McBadden.
USE pubs
DELETE FROM authors
WHERE au_lname = 'McBadden'
AO 2003

Pgina 42 de 96

SQL

Lic. Gustavo Rei

UTILIZAR DELETE EN LA FILA ACTUAL DE UN CURSOR


Este ejemplo muestra una eliminacin realizada contra un cursor denominado complex_join_cursor. Slo afecta a la nica fila que
se recupera actualmente del cursor.
USE pubs
DELETE FROM authors
WHERE CURRENT OF complex_join_cursor

UTILIZAR LA INSTRUCCIN DELETE BASADA EN UNA SUBCONSULTA O UTILIZAR LA EXTENSIN DE TRANSACT-SQL


Este ejemplo muestra la extensin de Transact-SQL que se utiliza para eliminar registros de una tabla base que se basa en una
combinacin o subconsulta correlacionada. La primera instruccin DELETE muestra la solucin de subconsulta compatible con SQL-92 y la
segunda instruccin DELETE muestra la extensin de Transact-SQL. Ambas consultas quitan filas de la tabla titleauthors sobre la base de
los ttulos almacenados en la tabla titles.
/* SQL-92-Standard subquery */
USE pubs
DELETE FROM titleauthor
WHERE title_id IN
(SELECT title_id
FROM titles
WHERE title LIKE '%computers%')
/* Transact-SQL extension */
USE pubs
DELETE titleauthor
FROM titleauthor INNER JOIN titles
ON titleauthor.title_id = titles.title_id
WHERE titles.title LIKE '%computers%'

UTILIZAR DELETE Y SELECT CON LA CLUSULA TOP


Debido a que la instruccin SELECT se puede especificar en una instruccin DELETE, tambin se puede utilizar la clusula TOP
en la instruccin SELECT. En este ejemplo se eliminan los 10 primeros autores de la tabla authors.
DELETE authors
FROM (SELECT TOP 10 * FROM authors) AS t1
WHERE authors.au_id = t1.au_id

AO 2003

Pgina 43 de 96

SQL

Lic. Gustavo Rei

Hasta ahora hemos estudiado las sentencias que forman parte del DML (Data Management Language) lenguaje de manipulacin
de datos, todas esas sentencias sirven para recuperar, insertar, borrar, modificar los datos almacenados en la base de datos; lo que veremos en este tema son las sentencias que afectan a la estructura de los datos.
El DDL (Data Definition Language) lenguaje de definicin de datos es la parte del SQL que ms vara de un sistema a otro ya que
esa rea tiene que ver con cmo se organizan internamente los datos y eso, cada sistema lo hace de una manera u otra.
As como el DML de Microsoft Jet incluye todas las sentencias DML que nos podemos encontrar en otros SQLs (o casi todas), el
DDL de Microsoft Jet en cambio contiene menos instrucciones que otros sistemas.

CREATE DATABASE
Crea una nueva base de datos y los archivos que se utilizan para almacenar la base de datos o adjunta una base de datos desde
los archivos de una base de datos creada anteriormente.
Sintaxis
CREATE DATABASE database_name
[ ON
[ < filespec > [ ,...n ] ]
[ , < filegroup > [ ,...n ] ]
]
[ LOG ON { < filespec > [ ,...n ] } ]
[ COLLATE collation_name ]
[ FOR LOAD | FOR ATTACH ]
< filespec > ::=

[ PRIMARY ]
( [ NAME = logical_file_name , ]
FILENAME = 'os_file_name'
[ , SIZE = size ]
[ , MAXSIZE = { max_size | UNLIMITED } ]
[ , FILEGROWTH = growth_increment ] ) [ ,...n ]
< filegroup > ::=
FILEGROUP filegroup_name < filespec > [ ,...n ]

Observaciones
Puede utilizar una instruccin CREATE DATABASE para crear una base de datos y los archivos que almacenan la base de datos.
SQL Server implementa la instruccin CREATE DATABASE en dos pasos:
SQL Server utiliza una copia de la base de datos model para inicializar la base de datos y sus metadatos.
SQL Server rellena el resto de la base de datos con pginas vacas, excepto las pginas que tengan datos internos que registren
cmo se emplea el espacio en la base de datos.
Cuando se especifica una instruccin individual CREATE DATABASE database_name sin parmetros adicionales, la base de datos se crea con el mismo tamao que la base de datos model.
Todas las bases de datos tienen al menos un grupo de archivos principal. Todas las tablas del sistema se encuentran en el grupo
de archivos principal. Una base de datos puede tener tambin grupos de archivos definidos por el usuario. Si se crea un objeto con una
clusula ON filegroup que especifica un grupo de archivos definido por el usuario, todas las pginas del objeto se asignan desde el grupo de
archivos especificado. Las pginas de todos los objetos de usuario creados sin una clusula ON filegroup, o con una clusula ON DEFAULT, se asignan desde el grupo de archivos predeterminado. Cuando se crea una base de datos por primera vez, el grupo de archivos
principal es el grupo de archivos predeterminado. Con ALTER DATABASE, se puede especificar que un grupo de archivos definido por el
usuario sea el grupo de archivos predeterminado:
ALTER DATABASE database_name MODIFY FILEGROUP filegroup_name DEFAULT
Cada base de datos tiene un propietario con capacidad para realizar actividades especiales en la base de datos. El propietario es
el usuario que crea la base de datos. El propietario de la base de datos se puede cambiar mediante sp_changedbowner.
Para mostrar un informe de una base de datos o de todas las bases de datos de una instancia de SQL Server, ejecute sp_helpdb.
Para obtener un informe acerca del espacio utilizado en una base de datos, emplee sp_spaceused. Para obtener un informe de los grupos
de archivos de una base de datos, utilice sp_helpfilegroup, y utilice sp_helpfile para obtener el informe de los archivos de la base de datos.
Las versiones anteriores de SQL Server utilizaban las instrucciones DISK INIT para crear los archivos de la base de datos antes
de que se ejecutara la instruccin CREATE DATABASE. Por motivos de compatibilidad con versiones anteriores de SQL Server, la instruccin CREATE DATABASE puede crear tambin una base de datos nueva con los archivos o dispositivos creados con la instruccin DISK
INIT. Para obtener ms informacin, consulte Detalles de compatibilidad con versiones anteriores de SQL Server.
AO 2003

Pgina 44 de 96

SQL

Lic. Gustavo Rei

Ejemplos
Crear una base de datos que especifica los archivos de datos y de registro de transacciones
Este ejemplo crea una base de datos llamada Sales. Debido a que no se utiliza la palabra clave PRIMARY, el primer archivo (Sales_dat) se convierte en el archivo principal. Como no se especifican MB ni KB en el parmetro SIZE del archivo Sales_dat, de forma predeterminada utiliza MB y el tamao se asigna en megabytes. El tamao del archivo Sales_log se asigna en megabytes porque se ha indicado
explcitamente el sufijo MB en el parmetro SIZE.
USE master
GO
CREATE DATABASE Sales
ON
( NAME = Sales_dat,
FILENAME = 'c:\program
server\mssql\data\saledat.mdf',
SIZE = 10,
MAXSIZE = 50,

files\microsoft

sql

FILEGROWTH = 5 )
LOG ON
( NAME = 'Sales_log',
FILENAME = 'c:\program
server\mssql\data\salelog.ldf',
SIZE = 5MB,
MAXSIZE = 25MB,
FILEGROWTH = 5MB )
GO

files\microsoft

sql

Crear una base de datos mediante la especificacin de mltiples archivos de datos y de registro de transacciones
Este ejemplo crea una base de datos llamada Archive con tres archivos de datos de 100 MB y dos archivos de registro de transacciones de 100 MB. El archivo principal es el primer archivo de la lista y se especifica explcitamente con la palabra clave PRIMARY. Los
archivos de registro de transacciones se especifican a continuacin de las palabras clave LOG ON. Observe las extensiones que se emplean para los archivos de la opcin FILENAME: .MDF se utiliza para los archivos de datos principales, .NDF para los archivos de datos
secundarios y .LDF para los archivos de registro de transacciones.
SIZE = 100MB,
USE master
MAXSIZE = 200,
GO
FILEGROWTH = 20)
CREATE DATABASE Archive
LOG ON
ON
( NAME = Archlog1,
PRIMARY ( NAME = Arch1,
FILENAME = 'c:\program files\microsoft sql
FILENAME = 'c:\program files\microsoft sql
server\mssql\data\archlog1.ldf',
server\mssql\data\archdat1.mdf',
SIZE = 100MB,
SIZE = 100MB,
MAXSIZE = 200,
MAXSIZE = 200,
FILEGROWTH = 20),
FILEGROWTH = 20),
( NAME = Archlog2,
( NAME = Arch2,
FILENAME = 'c:\program files\microsoft sql
FILENAME = 'c:\program files\microsoft sql
server\mssql\data\archlog2.ldf',
server\mssql\data\archdat2.ndf',
SIZE = 100MB,
SIZE = 100MB,
MAXSIZE = 200,
MAXSIZE = 200,
FILEGROWTH = 20)
FILEGROWTH = 20),
GO
( NAME = Arch3,
FILENAME = 'c:\program files\microsoft sql
server\mssql\data\archdat3.ndf',
Crear una base de datos individual
En este ejemplo se crea una base de datos llamada Products y se especifica un nico archivo. El archivo especificado se convierte en el archivo principal y se crea automticamente un archivo de registro de transacciones de 1 MB. Como no se especifican MB ni KB en
el parmetro SIZE del archivo principal, se asigna en megabytes. Ya que no existe <filespec> para el archivo de registro de transacciones,
ste no tiene MAXSIZE y puede crecer hasta llenar todo el espacio disponible en el disco.
USE master
GO
CREATE DATABASE Products
ON
( NAME = prods_dat,
AO 2003

FILENAME = 'c:\program
server\mssql\data\prods.mdf',
SIZE = 4,
MAXSIZE = 10,
FILEGROWTH = 1 )
GO

files\microsoft

sql

Pgina 45 de 96

SQL

Lic. Gustavo Rei

Crear una base de datos sin especificar los archivos


Este ejemplo crea una base de datos llamada mytest y crea los archivos principal y de registro de transacciones correspondientes. Debido a que la instruccin no tiene elementos <filespec>, el archivo principal de la base de datos tiene el tamao del archivo principal
de la base de datos model. El registro de transacciones tiene el tamao del archivo del registro de transacciones de la base de datos model.
Como no se ha especificado MAXSIZE, los archivos pueden crecer hasta llenar todo el espacio disponible en el disco.
CREATE DATABASE mytest
Crear una base de datos sin especificar SIZE
Este ejemplo crea una base de datos llamada products2. El archivo prods2_dat se convierte en el archivo principal, con un tamao igual al tamao del archivo principal de la base de datos model. El archivo de registro de transacciones se crea automticamente y es un
25 por ciento del tamao del archivo principal, o 512 KB, el que sea mayor. Como no se ha especificado MAXSIZE, los archivos pueden
crecer hasta llenar todo el espacio disponible en el disco.
USE master
GO
CREATE DATABASE Products2
ON
( NAME = prods2_dat,
FILENAME = 'c:\program files\microsoft sql server\mssql\data\prods2.mdf' )
GO
Crear una base de datos con grupos de archivos
Este ejemplo crea una base de datos llamada sales con tres grupos de archivos:

CREATE TABLE
La sentencia CREATE TABLE sirve para crear la estructura de una tabla no para rellenarla con datos, nos permite definir las columnas que tiene y ciertas restricciones que deben cumplir esas columnas.
La sintaxis es la siguiente:

nbtabla: nombre de la tabla que estamos definiendo


nbcol: nombre de la columna que estamos definiendo
tipo: tipo de dato de la columna, todos los datos almacenados en la columna debern ser de ese tipo. Para ver qu tipos de da-tos
se pueden emplear haz clic aqu
Una restriccin consiste en la definicin de una caracterstica adicional que tiene una columna o una combinacin de columnas,
suelen ser caractersticas como valores no nulos (campo requerido), definicin de ndice sin duplicados, definicin de clave principal y definicin de clave fornea (clave ajena o externa, campo que sirve para relacionar dos tablas entre s).
restriccin1: una restriccin de tipo 1 es una restriccin que aparece dentro de la definicin de la columna despus del tipo de dato y afecta a una columna, la que se est definiendo.
restriccin2: una restriccin de tipo 2 es una restriccin que se define despus de definir todas las columnas de la tabla y afecta a
una columna o a una combinacin de columnas.
Para escribir una sentencia CREATE TABLE se empieza por indicar el nombre de la tabla que queremos crear y a continuacin
entre parntesis indicamos separadas por comas las definiciones de cada columna de la tabla, la definicin de una columna consta de su
nombre, el tipo de dato que tiene y podemos aadir si queremos una serie de especificaciones que debern cumplir los datos almacenados
en la columna, despus de definir cada una de las columnas que compone la tabla se pueden aadir una serie de restricciones, esas restricciones son las mismas que se pueden indicar para cada columna pero ahora pueden afectar a ms de una columna por eso tienen una
sintaxis ligeramente diferente.
Una restriccin de tipo 1 se utiliza para indicar una caracterstica de la columna que estamos definiendo, tiene la siguiente sin-

AO 2003

Pgina 46 de 96

SQL

Lic. Gustavo Rei

taxis:
La clusula NOT NULL indica que la columna no podr contener un valor nulo, es decir que se deber rellenar obligatoria-mente y
con un valor vlido (equivale a la propiedad requerido S de las propiedades del campo).
La clusula CONSTRAINT sirve para definir una restriccin que se podr eliminar cuando queramos sin tener que borrar la columna. A cada restriccin se le asigna un nombre que se utiliza para identificarla y para poder eliminarla cuando se quiera.
Como restricciones tenemos la de clave primaria (clave principal), la de ndice nico (sin duplicados), la de valor no nulo, y la de
clave fornea.
La clusula PRIMARY KEY se utiliza para definir la columna como clave principal de la tabla. Esto supone que la columna no
puede contener valores nulos ni pueden haber valores duplicados en esa columna, es decir que dos filas no pueden tener el mismo valor en
esa columna.
En una tabla no pueden haber varias claves principales, por lo que no podemos incluir la clusula PRIMARY KEY ms de una
vez, en caso contrario la sentencia da un error. No hay que confundir la definicin de varias claves principales con la definicin de una clave
principal compuesta por varias columnas, esto ltimo s est permitido y se define con una restriccin de tipo 2.
La clusula UNIQUE sirve para definir un ndice nico sobre la columna. Un ndice nico es un ndice que no permite valores duplicados, es decir que si una columna tiene definida un restriccin de UNIQUE no podrn haber dos filas con el mismo valor en esa columna. Se suele emplear para que el sistema compruebe el mismo que no se aaden valores que ya existen, por ejemplo si en una tabla de
clientes queremos asegurarnos que dos clientes no puedan tener el mismo D.N.I. y la tabla tiene como clave prin-cipal un cdigo de cliente,
definiremos la columna dni con la restriccin de UNIQUE.
La clusula NOT NULL indica que la columna no puede contener valores nulos, cuando queremos indicar que una columna no
puede contener el valor nulo lo podemos hacer sin poner la clusula CONSTRAINT, o utilizando una clusula CONSTRAINT.
La ltima restriccin que podemos definir sobre una columna es la de clave fornea, una clave fornea es una columna o conjunto de columnas que contiene un valor que hace referencia a una fila de otra tabla, en una restriccin de tipo 1 se puede definir con la
clusula REFERENCES, despus de la palabra reservada indicamos a qu tabla hace referencia, opcionalmente podemos indicar entre
parntesis el nombre de la columna donde tiene que buscar el valor de referencia, por defecto coge la clave principal de la tabla2, si el valor
que tiene que buscar se encuentra en otra columna de tabla2, entonces debemos indicar el nombre de esta columna entre parntesis,
adems slo podemos utilizar una columna que est definida con una restriccin de UNIQUE, si la columna2 que indicamos no est definida sin duplicados, la sentencia CREATE nos dar un error. Si quieres repasar conceptos de clave fornea e integridad referencial haz clic
aqu
Ejemplo:
CREATE TABLE tab1 (
col1 INTEGER CONSTRAINT pk PRIMARY KEY,
col2 CHAR(25) NOT NULL,
col3 CHAR(10) CONSTRAINT uni1 UNIQUE,
col4 INTEGER,
col5 INT CONSTRAINT fk5 REFERENCES tab2 );
Con este ejemplo estamos creando la tabla tab1 compuesta por: una columna llamada col1 de tipo entero definida como clave
principal, una columna col2 que puede almacenar hasta 25 caracteres alfanumricos y no puede contener valores nulos, una columna col3
de hasta 10 caracteres que no podr contener valores repetidos, una columna col4 de tipo entero sin ninguna restriccin, y una columna
col5 de tipo entero clave fornea que hace referencia a valores de la clave principal de la tabla tab2.
Una restriccin de tipo 2 se utiliza para definir una caracterstica que afecta a una columna o a una combinacin de columnas
de la tabla que estamos definiendo, se escribe despus de haber definido todas las columnas de la tabla.
Tiene la siguiente sintaxis:

AO 2003

Pgina 47 de 96

SQL

Lic. Gustavo Rei

La sintaxis de una restriccin de tipo 2 es muy similar a la CONSTRAINT de una restriccin 1 la diferencia es que ahora tene-mos
que indicar sobre qu columnas queremos definir la restriccin. Se utilizan obligatoriamente las restricciones de tipo 2 cuando la restriccin
afecta a un grupo de columnas o cuando queremos definir ms de una CONSTRAINT para una columna (slo se puede definir una restriccin1 en cada columna).
La clusula PRIMARY KEY se utiliza para definir la clave principal de la tabla. Despus de las palabras PRIMARY KEY se indica
entre parntesis el nombre de la columna o las columnas que forman la clave principal. Las columnas que forman la clave principal no
pueden contener valores nulos ni pueden haber valores duplicados de la combinacin de columnas, por ejemplo la ta-bla pedidos de nuestros ejemplos tiene una clave principal formada por idfab e idproducto, pues no pueden haber dos filas con la misma combinacin de idfab
con idproducto (aci,0001 por ejemplo) pero s pueden haber dos filas con el valor aci en la columna idfab si tienen valores diferentes en la
columna idproducto, y pueden haber dos filas con el mismo idproducto pero distinto idfab.
En una tabla no pueden haber varias claves principales, por lo que no podemos indicar la clusula PRIMARY KEY ms de una
vez, en caso contrario la sentencia da un error.
La clusula UNIQUE sirve para definir un ndice nico sobre una columna o sobre una combinacin de columnas. Un ndice nico
es un ndice que no permite valores duplicados. Si el ndice es sobre varias columnas no se puede repetir la misma com-binacin de valores
en dos o ms filas. Se suele emplear para que el sistema compruebe el mismo que no se aaden valores que ya existen.
La clusula FOREIGN KEY sirve para definir una clave fornea sobre una columna o una combinacin de columnas. Una clave
fornea es una columna o conjunto de columnas que contiene un valor que hace referencia a una fila de otra tabla, en una restriccin 1 se
puede definir con la clusula REFERENCES. Para definir una clave fornea en una restriccin de tipo 2 debemos empezar por las palabras
FOREIGN KEY despus indicamos entre parntesis la/s columna/s que es clave fornea, a continuacin la palabra reservada REFERENCES seguida del nombre de la tabla a la que hace referencia, opcionalmente podemos indicar entre parntesis el nombre de la/s columna/s
donde tiene que buscar el valor de referencia, por defecto coge la clave principal de la tabla2, si el valor que tiene que buscar se encuentra
en otra/s columna/s de tabla2, entonces debemos escribir el nombre de esta/s columna/s entre parntesis, adems slo podemos utilizar
una columna (o combinacin de columnas) que est definida con una restriccin de UNIQUE, de lo contrario la sentencia CREATE TABLE
nos dar un error.
Ejemplo:
CREATE TABLE tab1 (
col1 INTEGER,
col2 CHAR(25) NOT NULL,
col3 CHAR(10),
col4 INTEGER,
col5 INT,
CONSTRAINT pk PRIMARY KEY (col1),
CONSTRAINT uni1 UNIQUE (col3),
CONSTRAINT fk5 FOREIGN KEY (col5) REFERENCES tab2 );
Con este ejemplo estamos creando la misma tabla tab1 del ejemplo de la pgina anterior pero ahora hemos definido las restricciones utilizando restricciones de tipo 2.

RESTRICCIONES PRIMARY KEY


Una tabla puede contener una sola restriccin PRIMARY KEY.
El ndice generado por una restriccin PRIMARY KEY no puede hacer que el nmero de ndices de la tabla exceda de 249 ndices
no agrupados y 1 ndice agrupado.
Si no se especifica CLUSTERED o NONCLUSTERED para una restriccin PRIMARY KEY, se utiliza CLUSTERED si no hay ndices agrupados especificados para las restricciones UNIQUE.
Todas las columnas definidas en una restriccin PRIMARY KEY deben establecerse como NOT NULL. Si no se especifica la posibilidad de aceptar NULL, todas las columnas que participan en una restriccin PRIMARY KEY tienen su posibilidad de aceptar NULL
establecida en NOT NULL.

RESTRICCIONES UNIQUE
Si no se especifica CLUSTERED o NONCLUSTERED para una restriccin UNIQUE, de forma predeterminada se utiliza NONCLUSTERED.
Cada restriccin UNIQUE genera un ndice. El nmero de restricciones UNIQUE no puede hacer que el nmero de ndices de la
tabla exceda de 249 ndices no agrupados y 1 ndice agrupado.

AO 2003

Pgina 48 de 96

SQL

Lic. Gustavo Rei

RESTRICCIONES FOREIGN KEY


Cuando en la columna de una restriccin FOREIGN KEY se introduce un valor distinto de NULL, el valor debe existir en la columna a la que se hace referencia; de lo contrario, se devuelve un mensaje de error de infraccin de clave externa.
Las restricciones FOREIGN KEY se aplican a la columna anterior a menos que se especifiquen columnas de origen.
Las restricciones FOREIGN KEY slo pueden hacer referencia a las tablas de la misma base de datos en el mismo servidor. La
integridad referencial de las bases de datos cruzadas debe implementarse a travs de desencadenadores.
Las restricciones FOREIGN KEY pueden hacer referencia a otras columnas de la misma tabla (una auto-referencia).
La clusula REFERENCES de una restriccin FOREIGN KEY en el nivel de columna puede enumerar slo una columna de referencia, que debe tener el mismo tipo de datos que la columna en la que se define la restriccin.
La clusula REFERENCES de una restriccin FOREIGN KEY en el nivel de tabla debe tener el mismo nmero de columnas de
referencia que el nmero de columnas de la lista de columnas de restriccin. El tipo de datos de cada columna de referencia debe ser tambin el mismo que la columna correspondiente de la lista de columnas.
Es posible que no se pueda especificar CASCADE si una columna del tipo timestamp forma parte de la clave externa o de la clave
a la que se hace referencia.
Se puede combinar CASCADE y NO ACTION en tablas que tengan relaciones referenciales entre s. Si SQL Server encuentra
NO ACTION, termina y deshace las acciones CASCADE relacionadas. Cuando una instruccin DELETE hace que se combinen acciones
CASCADE y NO ACTION, todas las acciones CASCADE se aplican antes de que SQL Server compruebe si hay clusulas NO ACTION.
Una tabla puede contener un mximo de 253 restricciones FOREIGN KEY.
Una tabla puede hacer referencia a un mximo de 253 tablas distintas en sus restricciones FOREIGN KEY.

EJEMPLOS
UTILIZAR RESTRICCIONES PRIMARY KEY
El ejemplo siguiente muestra la definicin de columna de una restriccin PRIMARY KEY con un ndice agrupado sobre la columna
job_id de la tabla jobs (que permite al sistema suministrar el nombre de la restriccin) en la base de datos de ejemplo pubs.
job_id smallint
PRIMARY KEY CLUSTERED
Este ejemplo muestra cmo se puede suministrar un nombre para la restriccin PRIMARY KEY. Esta restriccin se utiliza en la
columna emp_id de la tabla employee. Esta columna se basa en un tipo de datos definido por el usuario.
emp_id empid
CONSTRAINT PK_emp_id PRIMARY KEY NONCLUSTERED

UTILIZAR RESTRICCIONES FOREIGN KEY


Una restriccin FOREIGN KEY se utiliza para hacer referencia a otra tabla. Las claves externas pueden ser claves de una nica
columna o de varias columnas. El ejemplo siguiente muestra una restriccin FOREIGN KEY de una nica columna sobre la tabla employee
que hace referencia a la tabla jobs. Slo se requiere la clusula REFERENCES para una restriccin FOREIGN KEY de una nica columna.
job_id smallint
NOT NULL
DEFAULT 1
REFERENCES jobs(job_id)
Tambin puede utilizar la clusula FOREIGN KEY de forma explcita y volver a formular el atributo de columna. Observe que no
es necesario que el nombre de la columna sea el mismo en ambas tablas.
FOREIGN KEY (job_id) REFERENCES jobs(job_id)
Las restricciones de claves de varias columnas se crean como restricciones de tabla. En la base de datos pubs, la tabla sales incluye una restriccin PRIMARY KEY multicolumna. Este ejemplo muestra cmo hacer referencia a esta clave desde otra tabla; el nombre
explcito de restriccin es opcional.
CONSTRAINT FK_sales_backorder FOREIGN KEY (stor_id, ord_num, title_id)
REFERENCES sales (stor_id, ord_num, title_id)

AO 2003

Pgina 49 de 96

SQL

Lic. Gustavo Rei

UTILIZAR RESTRICCIONES UNIQUE


Las restricciones UNIQUE se utilizan para exigir la unicidad en las columnas de claves no principales. Una columna de restriccin
PRIMARY KEY incluye automticamente una restriccin de unicidad; sin embargo, una restriccin UNIQUE puede aceptar valores NULL.
Este ejemplo muestra una columna llamada pseudonym de la tabla authors. Exige la restriccin de que los pseudnimos de los autores
sean nicos.
pseudonym varchar(30) NULL
UNIQUE NONCLUSTERED
El ejemplo siguiente muestra una restriccin UNIQUE creada en las columnas stor_name y city de la tabla stores, donde stor_id
es actualmente la restriccin PRIMARY KEY; no debe haber dos almacenes iguales en la misma ciudad.
CONSTRAINT U_store UNIQUE NONCLUSTERED (stor_name, city)

UTILIZAR RESTRICCIONES CHECK


Este ejemplo muestra las restricciones realizadas a los valores introducidos en las columnas min_lvl y max_lvl de la tabla jobs.
Estas dos restricciones no tienen nombre:
CHECK (min_lvl >= 10)
y
CHECK (max_lvl <= 250)
Este ejemplo muestra una restriccin con nombre con una restriccin de patrn sobre los datos de caracteres introducidos en la
columna emp_id de la tabla employee.
CONSTRAINT CK_emp_id CHECK (emp_id LIKE '[A-Z][A-Z][A-Z][1-9][0-9][0-9][0-9][0-9][FM]'
OR emp_id LIKE '[A-Z]-[A-Z][1-9][0-9][0-9][0-9][0-9][FM]')
Este ejemplo especifica que pub_id debe estar en una lista especfica o seguir un modelo dado. Esta restriccin afecta a la columna pub_id de la tabla publishers.
CHECK (pub_id IN ('1389', '0736', '0877', '1622', '1756')
OR pub_id LIKE '99[0-9][0-9]')

DEFINICIONES DE TABLAS COMPLETAS


El ejemplo siguiente muestra definiciones completas de tablas con las definiciones de restricciones de tres tablas (jobs, employee
y publishers) creadas en la base de datos pubs.
/* ************************** jobs table ************************** */
CREATE TABLE jobs
(
job_id smallint
IDENTITY(1,1)
PRIMARY KEY CLUSTERED,
job_desc
varchar(50) NOT NULL
DEFAULT 'New Position - title not formalized yet',
min_lvl tinyint NOT NULL
CHECK (min_lvl >= 10),
max_lvl tinyint NOT NULL
CHECK (max_lvl <= 250)
)
/* ************************* employee table ************************* */
CREATE TABLE employee
(
emp_id empid
CONSTRAINT PK_emp_id PRIMARY KEY NONCLUSTERED
AO 2003

Pgina 50 de 96

SQL

Lic. Gustavo Rei


CONSTRAINT CK_emp_id CHECK (emp_id LIKE
'[A-Z][A-Z][A-Z][1-9][0-9][0-9][0-9][0-9][FM]' or
emp_id LIKE '[A-Z]-[A-Z][1-9][0-9][0-9][0-9][0-9][FM]'),

/* Each employee ID consists of three characters that represent the employee's initials, followed by a five digit number ranging
from 10000 through 99999 and then the employee's gender (M or F). A (hyphen) - is acceptable for the middle initial. */
fname varchar(20) NOT NULL,
minit char(1) NULL,
lname varchar(30) NOT NULL,
job_id smallint
NOT NULL
DEFAULT 1
/* Entry job_id for new hires. */
REFERENCES jobs(job_id),
job_lvl tinyint
DEFAULT 10,
/* Entry job_lvl for new hires. */
pub_id char(4) NOT NULL
DEFAULT ('9952')
REFERENCES publishers(pub_id),
/* By default, the Parent Company Publisher is the company to whom each employee reports. */
hire_date
datetime
NOT NULL
DEFAULT (getdate())
/* By default, the current system date is entered. */
)
/* ***************** publishers table ******************** */
CREATE TABLE publishers
(
pub_id char(4) NOT NULL
CONSTRAINT UPKCL_pubind PRIMARY KEY CLUSTERED CHECK (pub_id IN ('1389', '0736', '0877', '1622', '1756')
OR pub_id LIKE '99[0-9][0-9]'),
pub_name
varchar(40) NULL,
city
varchar(20) NULL,
state
char(2) NULL,
country
varchar(30) NULL DEFAULT('USA')
)

UTILIZAR UNA EXPRESIN PARA UNA COLUMNA CALCULADA


Este ejemplo ilustra el uso de una expresin ((low + high)/2) para calcular la columna calculada myavg.
CREATE TABLE mytable
(
low int,
high int,
myavg AS (low + high)/2
)
Las restricciones FOREIGN KEY slo pueden hacer referencia a las columnas de las restricciones PRIMARY KEY o UNIQUE de
la tabla de referencia o a las columnas en UNIQUE INDEX de la tabla de referencia.

RESTRICCIONES CHECK
Una columna puede tener cualquier nmero de restricciones CHECK y la condicin puede incluir varias expresiones lgicas combinadas con AND y OR. Varias restricciones CHECK para una columna se validan en el orden en que se crean.
La condicin de bsqueda debe dar como resultado una expresin booleana y no puede hacer referencia a otra tabla.
AO 2003

Pgina 51 de 96

SQL

Lic. Gustavo Rei

Una restriccin CHECK en el nivel de columna slo puede hacer referencia a la columna restringida, y una restriccin CHECK en
el nivel de tabla slo puede hacer referencia a columnas de la misma tabla.
Las restricciones CHECK y las reglas sirven para la misma funcin de validacin de los datos durante las instrucciones INSERT y
DELETE.
Cuando hay una regla y una o ms restricciones CHECK para una columna o columnas, se evalan todas las restricciones

Alter table
La sentencia ALTER TABLE sirve para modificar la estructura de una tabla que ya existe. Mediante esta instruccin pode-mos
aadir columnas nuevas, eliminar columnas. Ten cuenta que cuando eliminamos una columna se pierden todos los datos al-macenados en
ella.
Tambin nos permite crear nuevas restricciones o borrar algunas existentes. La sintaxis puede parecer algo complicada pero sabiendo el significado de las palabras reservadas la sentencia se aclara bastante; ADD (aade), ALTER (modifica), DROP (elimi-na), COLUMN (columna), CONSTRAINT (restriccin).
La sintaxis es la siguiente:

La sintaxis de restriccion1 es idntica a la restriccin1 de la sentencia CREATE TABLE, te la describimos a continuacin, si tienes
alguna duda repasa la sentencia CREATE TABLE.

La sintaxis de restriccion2 es idntica a la restriccin2 de la sentencia CREATE TABLE, te la describimos a continuacin, si tienes
alguna duda repasa la sentencia CREATE TABLE.

La clusula ADD COLUMN (la palabra COLUMN es opcional) permite aadir una columna nueva a la tabla. Como en la creacin
de tabla, hay que definir la columna indicando su nombre, tipo de datos que puede contener, y si lo queremos alguna res-triccin de valor no
nulo, clave primaria, clave fornea, e ndice nico, restriccion1 es opcional e indica una restriccin de tipo 1 que afecta a la columna que
estamos definiendo.
Ejemplo:
ALTER TABLE tab1 ADD COLUMN col3 integer NOT NULL CONSTRAINT c1 UNIQUE
AO 2003

Pgina 52 de 96

SQL

Lic. Gustavo Rei

Con este ejemplo estamos aadiendo a la tabla tab1 una columna llamada col3 de tipo entero, requerida (no admite nulos) y con
un ndice sin duplicados llamado c1.
Cuando aadimos una columna lo mnimo que se puede poner sera:
ALTER TABLE tab1 ADD col3 integer
En este caso la nueva columna admite valores nulos y duplicados.
Para aadir una nueva restriccin en la tabla podemos utilizar la clusula ADD restriccion2 (ADD CONSTRAINT...).
Ejemplo:
ALTER TABLE tab1 ADD CONSTRAINT c1 UNIQUE (col3)
Con este ejemplo estamos aadiendo a la tabla tab1 un ndice nico (sin duplicados) llamado c1 sobre la columna col3.
Para borrar una columna basta con utilizar la clusula DROP COLUMN (COLUMN es opcional) y el nombre de la columna que
queremos borrar, se perdern todos los datos almacenados en la columna.
Ejemplo:
ALTER TABLE tab1 DROP COLUMN col3
Tambin podemos escribir:
ALTER TABLE tab1 DROP col3
El resultado es el mismo, la columna col3 desaparece de la tabla tab1.
Para borrar una restriccin basta con utilizar la clusula DROP CONSTRAINT y el nombre de la restriccin que queremos borrar,
en este caso slo se elimina la definicin de la restriccin pero los datos almacenados no se modifican ni se pierden.
Ejemplo:
ALTER TABLE tab1 DROP CONSTRAINT c1
Con esta sentencia borramos el ndice c1 creado anteriormente pero los datos de la columna col3 no se ven afectados por el
cambio.

DROP TABLE
La sentencia DROP TABLE sirve para eliminar una tabla. No se puede eliminar una tabla si est abierta, tampoco la podemos
eliminar si el borrado infringe las reglas de integridad referencial (si interviene como tabla padre en una relacin y tiene registros relacionados).
La sintaxis es la siguiente:

Ejemplo:
DROP TABLE tab1
Elimina de la base de datos la tabla tab1.

CREATE INDEX
La sentencia CREATE INDEX sirve para crear un ndice sobre una o varias columnas de una tabla.

La sintaxis es la siguiente:
nbindi: nombre del ndice que estamos definiendo. En una tabla no pueden haber dos ndices con el mismo nombre de lo contrario
da error.
nbtabla: nombre de la tabla donde definimos el ndice. A continuacin entre parntesis se indica la composicin del ndice (las columnas que lo forman).
nbcol: nombre de la columna que indexamos. Despus del nombre de la columna podemos indicar cmo queremos que se ordenen las filas segn el ndice mediante las clusulas ASC/DESC.
ASC: la clusula ASC es la que se asume por defecto e indica que el orden elegido para el ndice es ascendente (en orden alfabtico si la columna es de tipo texto, de menor a mayor si es de tipo numrico, en orden cronolgico si es de tipo fecha).
DESC: indica orden descendente, es decir el orden inverso al ascendente.
AO 2003

Pgina 53 de 96

SQL

Lic. Gustavo Rei

Podemos formar un ndice basado en varias columnas, en este caso despus de indicar la primera columna con su orden, se escribe una coma y la segunda columna tambin con su orden, as sucesivamente hasta indicar todas las columnas que forman el ndice.
Opcionalmente se pueden indicar las clusulas:
WITH PRIMARY indica que el ndice define la clave principal de la tabla, si la tabla ya tiene una clave principal, la sentencia
CREATE INDEX dar error.
WITH DISALLOW NULL indica que no permite valores nulos en las columnas que forman el ndice.
WITH IGNORE NULL indica que las filas que tengan valores nulos en las columnas que forman el ndice se ignoran, no aparecen
cuando recuperamos las filas de la tabla utilizando ese ndice.
Ejemplo:
CREATE UNIQUE INDEX ind1 ON clientes (provincia, poblacion ASC, fecha_nacimiento DESC)
Crea un ndice llamado ind1 sobre la tabla clientes formado por las columnas provincia, poblacin y fecha_nacimiento. Este ndice permite tener ordenadas las filas de la tabla clientes de forma que aparezcan los clientes ordenados por provincia, dentro de la misma
provincia por poblacin y dentro de la misma poblacin por edad y del ms joven al ms mayor.
Al aadir la clusula UNIQUE el ndice no permitir duplicados por lo que no podra tener dos clientes con la misma fecha de nacimiento en la misma poblacin y misma provincia, para evitar el poblema sera mejor utilizar:
CREATE INDEX ind1 ON clientes (provincia, poblacion ASC, fecha_nacimiento DESC)

DROP INDEX
La sentencia DROP INDEX sirve para eliminar un ndice de una tabla. Se elimina el ndice pero no las columnas que lo for-man.
La sintaxis es la siguiente:

Ejemplo:
DROP INDEX ind1 ON clientes
Elimina el ndice que habamos creado en el ejemplo anterior.

AO 2003

Pgina 54 de 96

SQL

Lic. Gustavo Rei

En el presente captulo se ampliarn temas ya explicados, incorporando nuevas sentencias, bibliografas, ejemplos y ejercicios.

Clustered | nonclustered:
Son palabras clave que indican que se ha creado un ndice agrupado o no agrupado para la restriccin PRIMARY KEY o UNIQUE. De forma predeterminada, el valor de las restricciones PRIMARY KEY es CLUSTERED, y el de las restricciones UNIQUE es NONCLUSTERED. Slo se puede especificar CLUSTERED para una nica restriccin de una instruccin CREATE TABLE. Si especifica CLUSTERED para una restriccin UNIQUE y especifica tambin una restriccin PRIMARY KEY, el valor predeterminado de PRIMARY KEY es
NONCLUSTERED.

Funciones11 de fecha
Las funciones de fecha se utilizan para mostrar informacin acerca de fechas y horas. Se usan para el tratamiento de valores datetime y smalldatetime y para realizar operaciones aritmticas en los mismos. Las funciones de fecha se pueden usar en cualquier parte
donde se pueda usar una expresin.
SQL Server reconoce una amplia variedad de formatos de entrada de datos datetime. Puede usar la instruccin SET DATEFORMAT para establecer el orden de las partes de la fecha (mes, da y ao) para introducir datos datetime o smalldatetime. Cuando escriba
valores datetime o smalldatetime, inclyalos entre comillas simples.
Estas funciones escalares realizan una operacin sobre un valor de fecha y hora de entrada, y devuelven un valor de cadena,
numrico o de fecha y hora.
Esta tabla presenta las funciones de fecha y hora y su propiedad determinista12.
Funcin

Determinismo

DATEADD

Determinista

DATEDIFF

Determinista

DATENAME

No determinista

DATEPART

Determinista excepto cuando se utiliza como DATEPART (dw, date). La parte de la fecha correspondiente
al da de la semana (dw) depende del valor establecido por SET DATEFIRST, que indica el primer da de
la semana.

DAY

Determinista

GETDATE

No determinista

GETUTCDATE

No determinista

MONTH

Determinista

YEAR

Determinista

DATEADD
Devuelve un valor datetime nuevo que se basa en la suma de un intervalo a la fecha especificada.
Sintaxis
DATEADD ( datepart , number, date )

11

Funciones : El lenguaje de programacin Transact-SQL proporciona tres tipos de funciones: Funciones de conjunto de filas Se pueden utilizar como referencias a tablas

en una instruccin SQL. Funciones de agregado Operan sobre una coleccin de valores y devuelven un solo valor de resumen. Funciones escalares Operan sobre un valor y despus
devuelven otro valor. Las funciones escalares se pueden utilizar donde la expresin sea vlida. Esta tabla clasifica las funciones escalares.
12

Funciones deterministas y no deterministas : Todas las funciones son deterministas o no deterministas: Las funciones deterministas siempre devuelven el mismo resultado

cada vez que son llamadas con un conjunto especfico de valores de entrada. Las funciones no deterministas podran devolver resultados diferentes cada vez que son llamadas con un
conjunto especfico de valores de entrada. El determinismo de una funcin consiste en si la funcin es determinista o no determinista. Por ejemplo, la funcin integrada DATEADD es
determinista porque siempre devuelve el mismo resultado a cualquier conjunto dado de valores de argumento para sus tres parmetros. GETDATE no es determinista porque siempre se
invoca con el mismo argumento, aunque el valor que devuelve vara cada vez que se ejecuta. Las versiones anteriores de Microsoft SQL Server no tenan ninguna funcionalidad que
dependiese del determinismo de las funciones. En Microsoft SQL Server 2000, las funciones no deterministas no pueden especificarse en dos tipos de expresiones Transact-SQL: No se
puede crear un ndice en una columna calculada si computed_column_expression hace referencia a alguna funcin no determinista. No se puede crear un ndice agrupado en una vista si
sta hace referencia a funciones no deterministas. Una de las propiedades que SQL Server registra para las funciones definidas por el usuario es si la funcin es determinista o no. Una
funcin no determinista definida por el usuario no se puede invocar mediante una vista o una columna calculada, si lo que se desea es crear un ndice en la vista o en la columna calculada.

AO 2003

Pgina 55 de 96

SQL

Lic. Gustavo Rei


Parte de la
fecha

Abreviaturas

Year

yy, yyyy

quarter

qq, q

Month

mm, m

dayofyear

dy, y

Day

dd, d

Week

wk, ww

Hour

hh

minute

mi, n

second

ss, s

millisecond

ms

Tipos devueltos
Devuelve datetime, o smalldatetime si el argumento date es smalldatetime.
Ejemplos
En este ejemplo se imprime una lista de un marco de tiempo de los ttulos de la base de datos pubs. Este marco de tiempo representa la fecha de la publicacin ms 21 das.
SELECT DATEADD(day, 21, pubdate) AS timeframe FROM titles
El siguiente es el conjunto de resultados:
timeframe
--------------------------Jul 3 1991 12:00AM
Jun 30 1991 12:00AM
Jul 21 1991 12:00AM
Jul 13 1991 12:00AM
Jun 30 1991 12:00AM

DATEDIFF
Devuelve el nmero de lmites de fecha y hora que hay entre dos fechas especificadas.
Sintaxis
DATEDIFF ( datepart , startdate , enddate )
Startdate : Es la fecha de comienzo para el clculo. startdate es una expresin que devuelve un valor datetime o smalldatetime, o
una cadena de caracteres con formato de fecha.
Enddate : Es la fecha final para el clculo. enddate es una expresin que devuelve un valor datetime o smalldatetime, o una cadena de caracteres con formato de fecha.
Tipos devueltos integer
Observaciones : startdate se resta de enddate. Si startdate es posterior a enddate, se devuelve un valor negativo.
DATEDIFF produce un error si el resultado est fuera del intervalo de valores enteros. Para los milisegundos, el nmero mximo
es de 24 das, 20 horas, 31 minutos y 23,647 segundos. Para los segundos, el nmero mximo es 68 aos.
El mtodo para contar los lmites que hay, tales como minutos, segundos, y milisegundos, hace que el resultado dado por DATEDIFF sea coherente en todos los tipos de datos. El resultado es un valor entero con signo igual al nmero de lmites datepart que hay entre
la primera y la segunda fecha. Por ejemplo, el nmero de semanas que hay entre el domingo 4 de enero y el sbado 11 de enero es 1.
Ejemplos
AO 2003

Pgina 56 de 96

SQL

Lic. Gustavo Rei


En este ejemplo se determina la diferencia en das entre la fecha actual y la fecha de publicacin de los ttulos de la base de datos

pubs.
SELECT DATEDIFF(day, pubdate, getdate()) AS no_of_days
FROM titles

DATENAME
Devuelve una cadena de caracteres que representa la parte de la fecha especificada de la fecha especificada.
Sintaxis : DATENAME ( datepart , date )
Tipos devueltos :nvarchar
Observaciones: SQL Server convierte automticamente entre valores carcter y datetime cuando es necesario; por ejemplo,
cuando compara un valor carcter con un valor datetime.
Ejemplos
En este ejemplo se extrae el nombre del mes de la fecha devuelta por GETDATE.
SELECT DATENAME(month, getdate()) AS 'Month Name'
El siguiente es el conjunto de resultados:
Month Name
February

DATEPART
Devuelve un entero que representa la parte de la fecha especificada de la fecha indicada.
Sintaxis : DATEPART ( datepart , date )
Observaciones : Las funciones DAY, MONTH y YEAR son sinnimos de DATEPART(dd, date), DATEPART(mm, date) y DATEPART(yy, date), respectivamente.
Ejemplos
La funcin GETDATE devuelve la fecha actual; sin embargo, la fecha completa no es siempre la informacin que se necesita para
la comparacin (a menudo, slo se compara una parte de la fecha). En este ejemplo se muestra la salida de GETDATE y la de DATEPART.
SELECT GETDATE() AS 'Current Date'
GO
El siguiente es el conjunto de resultados:
Current Date
--------------------------Feb 18 1998 11:46PM
SELECT DATEPART(month, GETDATE()) AS 'Month Number'
GO
El siguiente es el conjunto de resultados:
Month Number -----------2
En este ejemplo se supone que la fecha es el 29 de mayo.
SELECT DATEPART(month, GETDATE())
El siguiente es el conjunto de resultados:

AO 2003

Pgina 57 de 96

SQL

Lic. Gustavo Rei


----------- 5
(1 row(s) affected)
En este ejemplo, la fecha se especifica como un nmero. Observe que SQL interpreta 0 como el 1 de enero de 1900.
SELECT DATEPART(m, 0), DATEPART(d, 0), DATEPART(yy, 0)
El siguiente es el conjunto de resultados:
----- ------ -----1 1
1900

DAY
Devuelve un entero que representa la parte del da de la fecha especificada.
Sintaxis : DAY ( date )
Ejemplos
En este ejemplo se devuelve el nmero del da de la fecha 12/03/1998.
SELECT DAY('03/12/1998') AS 'Day Number'
GO
El siguiente es el conjunto de resultados:
Day Number
-----------12
En este ejemplo, la fecha se especifica como un nmero. Observe que Microsoft SQL Server interpreta el 0 como el 1 de enero de 1900.
SELECT MONTH(0), DAY(0), YEAR(0)
ste es el conjunto de resultados:
----- ------ -----1 1
1900

SUBSTRING
Devuelve parte de una expresin de caracteres, binaria, de texto o de imagen.

SINTAXIS
SUBSTRING ( expression , start , length )

ARGUMENTOS
expression
Es una cadena de caracteres, cadena binaria, texto, imagen, columna o expresin que incluye una columna. No deben usarse expresiones que incluyan funciones de agregado.
start
Es un entero que especifica el punto en que comienza la subcadena.
length
AO 2003

Pgina 58 de 96

SQL

Lic. Gustavo Rei


Es un entero que especifica la longitud de la subcadena (el nmero de caracteres o bytes que se devuelven).

Nota Debido a que start y length especifican el nmero de bytes cuando SUBSTRING se utiliza con datos de tipo text, los datos
DBCS, por ejemplo los de Kanji, pueden causar que haya caracteres divididos al comienzo o al final del resultado. Este comportamiento es
coherente con la forma en que READTEXT controla DBCS. Sin embargo, debido al resultado poco habitual, es aconsejable utilizar ntext en
lugar de text para los caracteres DBCS.

EJEMPLOS
UTILIZAR SUBSTRING CON UNA CADENA DE CARACTERES
En el ejemplo siguiente se muestra cmo obtener parte de una cadena de caracteres. En la tabla authors, esta consulta obtiene
los apellidos en una columna y slo la primera inicial en la segunda columna.
SELECT au_lname, SUBSTRING(au_fname, 1, 1)
FROM authors
ORDER BY au_lname
El siguiente es el conjunto de resultados:
au_lname
---------------------------------------- Bennet
A
Blotchet-Halls
R
Carson
C
DeFrance
M
del Castillo
I
...
Yokomoto
A
(23 row(s) affected)
He aqu cmo mostrar el segundo, tercer y cuarto caracteres de la constante de cadena abcdef.
SELECT x = SUBSTRING('abcdef', 2, 3)
El siguiente es el conjunto de resultados:
x
---------bcd
(1 row(s) affected)

UTILIZAR SUBSTRING CON DATOS DE TIPO TEXT, NTEXT E IMAGE


El ejemplo siguiente muestra cmo obtener los primeros 200 caracteres a partir de cada columna de datos de tipo text e image en
la tabla publishers de la base de datos pubs. Los datos de tipo text se obtienen como varchar y los de tipo image como varbinary.
SELECT pub_id, SUBSTRING(logo, 1, 10) AS logo, SUBSTRING(pr_info, 1, 10) AS pr_info
FROM pub_info
WHERE pub_id = '1756'
El siguiente es el conjunto de resultados:
pub_id logo
pr_info
------ ---------------------- ---------1756 0x474946383961E3002500 This is sa
(1 row(s) affected)

AO 2003

Pgina 59 de 96

SQL

Lic. Gustavo Rei

El ejemplo siguiente muestra el efecto de SUBSTRING en los datos de tipo text y ntext. En primer lugar se crea una nueva tabla
en la base de datos pubs con el nombre npr_info. A continuacin, se crea la columna pr_info en la tabla npr_info con los 80 primeros caracteres de la columna pub_info.pr_info y se agrega un como primer carcter. Por ltimo, INNER JOIN obtiene todos los nmeros de identificacin de las editoriales y una SUBSTRING con las columnas de tipo text y ntext con la informacin de la editorial.
SELECT table_name FROM INFORMATION_SCHEMA.TABLES
WHERE table_name = 'npub_info'
DROP TABLE npub_info
-- Create npub_info table in pubs database. Borrowed from instpubs.sql.
CREATE TABLE npub_info
(
pub_id
char(4)
NOT NULL
REFERENCES publishers(pub_id)
CONSTRAINT UPKCL_npubinfo PRIMARY KEY CLUSTERED,
pr_info
ntext
NULL
)
-- Fill the pr_info column in npub_info with international data.
RAISERROR('Now at the inserts to pub_info...',0,1)
INSERT npub_info VALUES('0736', N'This is sample text data for New Moon Books, publisher 0736 in the pubs database')
INSERT npub_info values('0877', N'This is sample text data for Binnet & Hardley, publisher 0877 in the pubs databa')
INSERT npub_info values('1389', N'This is sample text data for Algodata Infosystems, publisher 1389 in the pubs da')
INSERT npub_info values('9952', N'This is sample text data for Scootney Books, publisher 9952 in the pubs database')
INSERT npub_info values('1622', N'This is sample text data for Five Lakes Publishing, publisher 1622 in the pubs d')
INSERT npub_info values('1756', N'This is sample text data for Ramona Publishers, publisher 1756 in the pubs datab')
INSERT npub_info values('9901', N'This is sample text data for GGG&G, publisher 9901 in the pubs database. GGG&G i')
INSERT npub_info values('9999', N'This is sample text data for Lucerne Publishing, publisher 9999 in the pubs data')
-- Join between npub_info and pub_info on pub_id.
SELECT pr.pub_id, SUBSTRING(pr.pr_info, 1, 35) AS pr_info,
SUBSTRING(npr.pr_info, 1, 35) AS npr_info
FROM pub_info pr INNER JOIN npub_info npr
ON pr.pub_id = npr.pub_id
ORDER BY pr.pub_id ASC

Conversin de tipos de datos


En Transact-SQL, hay dos niveles posibles de conversin de tipos de datos:
Cuando los datos de un objeto se mueven a, se comparan o se combinan con los datos de otro objeto, puede que sea necesario
convertir los datos desde el tipo de datos de un objeto al tipo de datos del otro.
Cuando los datos de una columna de resultados, un cdigo de retorno o un parmetro de salida de Transact-SQL se mueven a
una variable de programa, deben ser convertidos desde el tipo de datos de Microsoft SQL Server al tipo de datos de la variable.
Hay dos categoras de conversiones de tipo de datos:
Las conversiones implcitas son invisibles para el usuario.
SQL Server convierte automticamente los datos desde un tipo de datos al otro. Por ejemplo, si un smallint se compara con un int,
el smallint se convierte implcitamente a int antes de realizarse la comparacin.
Las conversiones explcitas utilizan las funciones CAST o CONVERT.
Las funciones CAST y CONVERT convierten un valor (una variable local, una columna u otra expresin) de un tipo de datos a
otro. Por ejemplo, la siguiente funcin CAST convierte el valor numrico $157.27 a una cadena de caracteres '$157.27':
CAST ( $157.27 AS VARCHAR(10) )
CAST se basa en el estndar SQL-92 y se prefiere antes que CONVERT.

AO 2003

Pgina 60 de 96

SQL

Lic. Gustavo Rei

Cuando se realizan conversiones desde el tipo de datos de un objeto SQL Server a otro, no se admiten algunas conversiones implcitas y explcitas de tipos de datos. Por ejemplo, un valor nchar no se puede convertir de ninguna forma a un valor image. Un nchar slo
se puede convertir a binary con una conversin explcita, mientras que la conversin implcita a binary no se admite. Un nchar puede ser
convertido a nvarchar explcita o implcitamente.
Cuando trata tipos de datos sql_variant, SQL Server admite conversiones implcitas de objetos con otros tipos de datos al tipo
sql_variant. No obstante, SQL Server no admite conversiones implcitas de datos sql_variant a un objeto con otro tipo de datos.
Para obtener ms informacin acerca de las conversiones admitidas entre objetos de SQL Server, consulte CAST y CONVERT.
Cuando se realiza una conversin entre una variable de aplicacin y una columna de conjunto de resultados, cdigo de retorno,
parmetro o marcador de parmetro de SQL Server, la interfaz de programacin de aplicaciones de base de datos define cules son las
conversiones de tipos de datos admitidas.

CAST Y CONVERT
Convierten explcitamente una expresin de un tipo de datos en otro. CAST y CONVERT proporcionan funciones similares.
Sintaxis
Uso de CAST:
CAST ( expression AS data_type )
Uso de CONVERT:
CONVERT ( data_type [ ( length ) ] , expression [ , style ] )
Argumentos
data_type
Es el tipo de datos de destino proporcionado por el sistema, incluido bigint y sql_variant. No se pueden utilizar tipos de datos definidos por el usuario. Para obtener ms informacin acerca de los tipos de datos disponibles, consulte Tipos de datos.
length
Es un parmetro opcional de los tipos de datos nchar, nvarchar, char, varchar, binary o varbinary.
style
Es el estilo del formato de fecha que se utiliza para convertir datos datetime o smalldatetime en datos de cadenas de caracteres
(tipos de datos nchar, nvarchar, char, varchar, nchar o nvarchar), o el formato de cadena cuando se convierten datos float, real, money o
smallmoney en datos de cadenas de caracteres (tipos de datos nchar, nvarchar, char, varchar, nchar o nvarchar).
SQL Server acepta el formato de fecha en estilo rabe, utilizando el algoritmo kuwait.
En la siguiente tabla, las dos columnas de la izquierda representan los valores de style para la conversin de datetime o smalldatetime en cadenas de caracteres. Agregue 100 al valor de style para obtener el ao con cuatro cifras, incluido el siglo (yyyy).
SELECT SUBSTRING(title, 1, 25) AS Title, CAST(ytd_sales AS char(2))
FROM titles
WHERE type = 'trad_cook'
El siguiente es el conjunto de resultados:
Title
------------------------- -Onions, Leeks, and Garlic *
Fifty Years in Buckingham *
Sushi, Anyone?
*
(3 row(s) affected)
Cuando se convierten tipos de datos que tienen un nmero diferente de posiciones decimales, el valor queda recortado hasta la
cifra de mayor precisin. Por ejemplo, el resultado de SELECT CAST(10,6496 AS int) es 10.
Cuando se realiza una conversin entre tipos de datos donde el tipo de datos destino tiene menos posiciones decimales que el tipo de datos origen, el valor se redondea. Por ejemplo, el resultado de CAST(10,3496847 AS money) es $10,3497.
AO 2003

Pgina 61 de 96

SQL

Lic. Gustavo Rei

SQL Server devuelve un mensaje de error cuando los datos no numricos char, nchar, varchar o nvarchar se convierten a int,
float, numeric o decimal. SQL Server tambin devuelve un error cuando se convierte una cadena vaca (" ") a numeric o decimal.
Usar datos de cadenas Binary
Cuando se convierten datos binary o varbinary en datos de cadena de caracteres y se especifica un nmero impar de valores a
continuacin de la x, SQL Server agrega un 0 (cero) despus de la x para tener un nmero par de valores.
Los datos de tipo binary se componen de los caracteres del 0 al 9 y de la A a la F (o de la a a la f), en grupos de dos caracteres
cada uno. Las cadenas de tipo binary tienen que estar precedidas por 0x. Por ejemplo, para representar FF, escriba 0xFF. El valor mximo
es un valor de tipo binary de 8000 bytes, cada uno de los cuales es FF. Los tipos de datos binary no slo se utilizan para guardar datos
hexadecimales, sino tambin para almacenar patrones de bits. Puede que las conversiones y clculos de nmeros hexadecimales almacenados como datos de tipo binary no sean confiables.
Cuando se especifica la longitud de un tipo de datos binary, cada dos caracteres cuentan como uno. La longitud 10 significa que
hay 10 grupos de dos caracteres.
Las cadenas de tipo binary vacas, representadas como 0x, se pueden almacenar como datos de tipo binary.

EJEMPLOS
Utilizar CAST y CONVERT
Los dos ejemplos devuelven los ttulos de aquellos libros que tienen un 3 en la primera cifra de las ventas anuales y convierten
ytd_sales en char(20).
-- Use CAST.
SELECT SUBSTRING(title, 1, 30) AS Title, ytd_sales
FROM titles
WHERE CAST(ytd_sales AS char(20)) LIKE '3%'
-- Use CONVERT.
SELECT SUBSTRING(title, 1, 30) AS Title, ytd_sales
FROM titles
WHERE CONVERT(char(20), ytd_sales) LIKE '3%'

Title
ytd_sales
------------------------------ ----------Cooking with Computers: Surrep 3876
Computer Phobic AND Non-Phobic 375
Emotional Security: A New Algo 3336
Onions, Leeks, and Garlic: Coo 375
(4 row(s) affected)

ste es el conjunto de resultados (de las consultas):


Utilizar CAST con operadores aritmticos
Este ejemplo calcula una nica columna (Copies) dividiendo las ventas anuales totales (ytd_sales) por el precio individual del libro
(price). El resultado se convierte en el tipo de datos int despus de redondearlo al nmero entero ms prximo.
SELECT CAST(ROUND(ytd_sales/price, 0) AS int) AS 'Copies'
FROM titles
El siguiente es el conjunto de resultados:
Copies
-----205
324
6262
205
102
7440
NULL
383
205

NULL
17
187
16
204
418
18
1263
273
(18 row(s) affected)
Utilizar CAST para concatenar
Este ejemplo concatena expresiones que no son de texto ni tipo binary mediante la funcin de conversin de tipos de datos

CAST.
AO 2003

Pgina 62 de 96

SQL

Lic. Gustavo Rei

SELECT 'The price is ' + CAST(price AS varchar(12))


FROM titles
WHERE price > 10.00
El siguiente es el conjunto de resultados:
-----------------The price is 19.99
The price is 11.95
The price is 19.99
The price is 19.99
The price is 22.95
The price is 20.00

The price is 21.59


The price is 10.95
The price is 19.99
The price is 20.95
The price is 11.95
The price is 14.99
(12 row(s) affected)

Utilizar CAST para obtener texto ms legible


Este ejemplo utiliza CAST en la lista seleccionada para convertir la columna title en una columna de tipo char(50), para que los
resultados sean ms legibles.
SELECT CAST(title AS char(50)), ytd_sales
FROM titles
WHERE type = 'trad_cook'
El siguiente es el conjunto de resultados:
ytd_sales
-------------------------------------------------- --------Onions, Leeks, and Garlic: Cooking Secrets of the
375
Fifty Years in Buckingham Palace Kitchens
15096
Sushi, Anyone?
4095
(3 row(s) affected)
Utilizar CAST con una clusula LIKE
Este ejemplo convierte una columna de tipo int (la columna ytd_sales) en una columna de tipo char(20) para poder utilizarla en
una clusula LIKE.
SELECT title, ytd_sales
FROM titles
WHERE CAST(ytd_sales AS char(20)) LIKE '15%'
AND type = 'trad_cook'
El siguiente es el conjunto de resultados:
title
ytd_sales
------------------------------------------------------------ ----------Fifty Years in Buckingham Palace Kitchens
15096
(1 row(s) affected)

CASE
Evala una lista de condiciones y devuelve como resultado una de las distintas expresiones posibles.
CASE tiene dos formatos:
La funcin CASE sencilla compara una expresin con un conjunto de expresiones sencillas para determinar el resultado.
La funcin CASE de bsqueda evala un conjunto de expresiones booleanas para determinar el resultado.
AO 2003

Pgina 63 de 96

SQL

Lic. Gustavo Rei


Ambos formatos aceptan el argumento ELSE opcional.
Funcin CASE sencilla:
Evala input_expression y despus, en el orden especificado, evala input_expression = when_expression por cada clusula

WHEN.
Devuelve el valor de la expresin result_expression de la primera comparacin (input_expression = when_expression) cuyo resultado sea TRUE.
Si ninguna comparacin input_expression = when_expression da como resultado TRUE, SQL Server devuelve el valor de la expresin else_result_expression, si es que se especific la clusula ELSE, o un valor NULL en caso contrario.
Funcin CASE de bsqueda:
Se evala, en el orden especificado, la expresin Boolean_expression de cada clusula WHEN.
Devuelve el valor de la expresin result_expression de la primera expresin Boolean_expression cuya evaluacin d como resultado TRUE.
Si ninguna Boolean_expression es TRUE, SQL Server devuelve else_result_expression, si se especifica la clusula ELSE, o un
valor NULL si no se especifica la clusula ELSE.

EJEMPLOS
Utilizar una instruccin SELECT con una funcin CASE sencilla
En una instruccin SELECT, una funcin CASE sencilla slo permite una comprobacin de igualdad; no se pueden hacer otras
comparaciones. Este ejemplo utiliza la funcin CASE para modificar la presentacin de una clasificacin de libros con el fin de hacerla ms
comprensible.
SELECT Category =
CASE type
WHEN 'popular_comp' THEN 'Popular Computing'
WHEN 'mod_cook' THEN 'Modern Cooking'
WHEN 'business' THEN 'Business'
WHEN 'psychology' THEN 'Psychology'
WHEN 'trad_cook' THEN 'Traditional Cooking'
ELSE 'Not yet categorized'
END,
CAST(title AS varchar(25)) AS 'Shortened Title',
price AS Price
FROM titles
WHERE price IS NOT NULL
ORDER BY type, price
COMPUTE AVG(price) BY type
El siguiente es el conjunto de resultados:
Category
Shortened Title
Price
------------------- ------------------------- -------------------------Business
You Can Combat Computer S 2.99
Business
Cooking with Computers: S 11.95
Business
The Busy Executive's Data 19.99
Business
Straight Talk About Compu 19.99
avg
==========================
13.73
Category
Shortened Title
Price
------------------- ------------------------- -------------------------Modern Cooking
The Gourmet Microwave 2.99
Modern Cooking
Silicon Valley Gastronomi 19.99
avg
==========================
11.49
AO 2003

Category
Shortened Title
Price
------------------- ------------------------- -------------------------Popular Computing Secrets of Silicon Valley 20.00
Popular Computing But Is It User Friendly? 22.95
avg
==========================
21.48
Category
Shortened Title
Price
------------------- ------------------------- -------------------------Psychology
Life Without Fear
7.00
Psychology
Emotional Security: A New 7.99
Psychology
Is Anger the Enemy?
10.95
Psychology
Prolonged Data Deprivatio 19.99
Psychology
Computer Phobic AND Non-P 21.59
avg
==========================
Pgina 64 de 96

SQL

Lic. Gustavo Rei


13.50

avg
==========================
Category
Shortened Title
Price
15.96
------------------- ------------------------- -------------------------Traditional Cooking Fifty Years in Buckingham 11.95
(21 row(s) affected)
Traditional Cooking Sushi, Anyone?
14.99
Traditional Cooking Onions, Leeks, and Garlic 20.95
Utilizar una instruccin SELECT con una funcin CASE sencilla y otra de bsqueda
En una instruccin SELECT, la funcin CASE de bsqueda permite sustituir valores en el conjunto de resultados basndose en
los valores de comparacin. Este ejemplo presenta el precio (una columna money) como comentario basado en el intervalo de precios de
cada libro.
USE pubs
GO
SELECT 'Price Category' =
CASE
WHEN price IS NULL THEN 'Not yet priced'
WHEN price < 10 THEN 'Very Reasonable Title'
WHEN price >= 10 and price < 20 THEN 'Coffee Table Title'
ELSE 'Expensive book!'
END,
CAST(title AS varchar(20)) AS 'Shortened Title'
FROM titles
ORDER BY price
GO
El siguiente es el conjunto de resultados:
Price Category
Shortened Title
--------------------- -------------------Not yet priced
Net Etiquette
Not yet priced
The Psychology of Co
Very Reasonable Title The Gourmet Microwav
Very Reasonable Title You Can Combat Compu
Very Reasonable Title Life Without Fear
Very Reasonable Title Emotional Security:
Coffee Table Title Is Anger the Enemy?
Coffee Table Title Cooking with Compute
Coffee Table Title Fifty Years in Bucki

Coffee Table Title


Coffee Table Title
Coffee Table Title
Coffee Table Title
Coffee Table Title
Expensive book!
Expensive book!
Expensive book!
Expensive book!

Sushi, Anyone?
Prolonged Data Depri
Silicon Valley Gastr
Straight Talk About
The Busy Executive's
Secrets of Silicon V
Onions, Leeks, and G
Computer Phobic And
But Is It User Frien

(18 row(s) affected)

Utilizar CASE con SUBSTRING y SELECT


Este ejemplo utiliza CASE y THEN para generar una lista de autores, los nmeros de identificacin de los libros y los tipos de libros que cada autor ha escrito.
USE pubs
SELECT SUBSTRING((RTRIM(a.au_fname) + ' '+
RTRIM(a.au_lname) + ' '), 1, 25) AS Name, a.au_id, ta.title_id,
Type =
CASE
WHEN SUBSTRING(ta.title_id, 1, 2) = 'BU' THEN 'Business'
WHEN SUBSTRING(ta.title_id, 1, 2) = 'MC' THEN 'Modern Cooking'
WHEN SUBSTRING(ta.title_id, 1, 2) = 'PC' THEN 'Popular Computing'
WHEN SUBSTRING(ta.title_id, 1, 2) = 'PS' THEN 'Psychology'
WHEN SUBSTRING(ta.title_id, 1, 2) = 'TC' THEN 'Traditional Cooking'
END
FROM titleauthor ta JOIN authors a ON ta.au_id = a.au_id
AO 2003

Pgina 65 de 96

SQL

Lic. Gustavo Rei

El siguiente es el conjunto de resultados:


Name
au_id
title_id Type
------------------------- ----------- -------- ------------------Johnson White
172-32-1176 PS3333 Psychology
Marjorie Green
213-46-8915 BU1032 Business
Marjorie Green
213-46-8915 BU2075 Business
Cheryl Carson
238-95-7766 PC1035 Popular Computing
Michael O'Leary
267-41-2394 BU1111 Business
Michael O'Leary
267-41-2394 TC7777 Traditional Cooking
Dean Straight
274-80-9391 BU7832 Business
Abraham Bennet
409-56-7008 BU1032 Business
Ann Dull
427-17-2319 PC8888 Popular Computing
Burt Gringlesby
472-27-2349 TC7777 Traditional Cooking
Charlene Locksley
486-29-1786 PC9999 Popular Computing

Charlene Locksley
486-29-1786 PS7777 Psychology
Reginald Blotchet-Halls
648-92-1872 TC4203
Traditional
Cooking
Akiko Yokomoto
672-71-3249 TC7777 Traditional Cooking
Innes del Castillo
712-45-1867 MC2222 Modern Cooking
Michel DeFrance
722-51-5454 MC3021 Modern Cooking
Stearns MacFeather
724-80-9391 BU1111 Business
Stearns MacFeather
724-80-9391 PS1372 Psychology
Livia Karsen
756-30-7391 PS1372 Psychology
Sylvia Panteley
807-91-6654 TC3218 Traditional Cooking
Sheryl Hunter
846-92-7186 PC8888 Popular Computing
Anne Ringer
899-46-2035 MC3021 Modern Cooking
Anne Ringer
899-46-2035 PS2091 Psychology
Albert Ringer
998-72-3567 PS2091 Psychology
Albert Ringer
998-72-3567 PS2106 Psychology
(25 row(s) affected)

REVERSE
Devuelve invertida una expresin de carcter.
Ejemplos
En este ejemplo se devuelve el nombre de todos los autores con los caracteres invertidos.
SELECT REVERSE(au_fname)
FROM authors
ORDER BY au_fname
El siguiente es el conjunto de resultados:
-------------------maharbA
okikA
naeD
kriD
rehtaeH
sennI
nosnhoJ

RIGHT
Devuelve la parte de una cadena de caracteres que comienza en el nmero de caracteres especificado en integer_expression a
partir de la derecha.
Ejemplos
En este ejemplo se devuelven los cinco caracteres que se encuentran ms a la derecha del nombre de cada autor.
SELECT RIGHT(au_fname, 5)
FROM authors
ORDER BY au_fname
El siguiente es el conjunto de resultados:
-----------------raham
Akiko
lbert
AO 2003

Pgina 66 de 96

SQL

Lic. Gustavo Rei

RTRIM
Devuelve una cadena de caracteres despus de truncar todos los espacios en blanco a la derecha
Sintaxis
RTRIM ( character_expression )
Argumentos
character_expression
Es una expresin de datos de tipo carcter. character_expression puede ser una constante, una variable o una columna de datos
de tipo carcter o binarios.

LTRIM
Devuelve una expresin de caracteres despus de quitar los espacios en blanco a la izquierda.
Sintaxis
LTRIM ( character_expression )

LOWER
Devuelve una expresin de caracteres despus de convertir a minsculas los datos de caracteres que estn en maysculas.
Sintaxis
LOWER ( character_expression )

LEFT
Devuelve la parte de una cadena de caracteres que comienza en un nmero de caracteres especificado a partir de la izquierda.
Sintaxis
LEFT ( character_expression , integer_expression )
Utilizar LEFT con una columna
Este ejemplo devuelve los cinco caracteres situados ms a la izquierda de cada ttulo de libro.
SELECT LEFT(title, 5)
FROM titles
ORDER BY title_id
El siguiente es el conjunto de resultados:
----The B
Cooki
You C
Strai

Utilizar LEFT con una cadena de caracteres


Este ejemplo utiliza LEFT para obtener los dos caracteres situados ms a la izquierda de la cadena de caracteres abcdefg.
SELECT LEFT('abcdefg',2)
El siguiente es el conjunto de resultados:
-ab
AO 2003

Pgina 67 de 96

SQL

Lic. Gustavo Rei

ATN2
Devuelve el ngulo, en radianes, cuya tangente es un valor entre las dos expresiones float dadas (denominado tambin arcotangente).
Sintaxis
ATN2 ( float_expression , float_expression )

UPPER
Devuelve una expresin de tipo carcter con datos de carcter en minscula convertidos a mayscula.
Sintaxis
UPPER ( character_expression )

REPLICATE
Repite una expresin de caracteres un nmero especificado de veces.
Sintaxis
REPLICATE ( character_expression , integer_expression )
Ejemplos
Utilizar REPLICATE
En este ejemplo se duplica el nombre de cada autor dos veces.
SELECT REPLICATE(au_fname, 2)
FROM authors
ORDER BY au_fname
El siguiente es el conjunto de resultados:
---------------------AbrahamAbraham
AkikoAkiko
AlbertAlbert
AnnAnn
AnneAnne
BurtBurt

Compute / Compute by
Las clusulas COMPUTE y COMPUTE BY se proporcionan por razones de compatibilidad con versiones anteriores. En su lugar,
utilice estos componentes:
Una clusula COMPUTE BY permite ver las filas de detalle y de resumen con una instruccin SELECT. Puede calcular valores de
resumen para subgrupos, o un valor de resumen para el conjunto completo de resultados.
La clusula COMPUTE toma la siguiente informacin:
La palabra clave opcional BY que calcula el agregado de fila especificado en funcin de cada columna.
Un nombre de funcin de agregado de fila; por ejemplo, SUM, AVG, MIN, MAX o COUNT.
Una columna en la que realizar la funcin de agregado de fila.

CONJUNTOS DE RESULTADOS GENERADOS POR COMPUTE


Los valores de resumen generados por COMPUTE aparecen como conjuntos separados de resultados en los resultados de la
consulta. Los resultados de una consulta que incluya una clusula COMPUTE son como un informe de ruptura de control, que es un informe
AO 2003

Pgina 68 de 96

SQL

Lic. Gustavo Rei

cuyos valores de resumen se controlan mediante las agrupaciones, o rupturas, que se especifique. Puede producir valores de resumen para
grupos, y puede calcular ms de una funcin de agregado para el mismo grupo.
Cuando se especifica COMPUTE con la clusula opcional BY, hay dos conjuntos de resultados por cada grupo que califica la instruccin SELECT:

El primer conjunto de resultados de cada grupo tiene el conjunto de filas de detalles que contienen la informacin de la
lista de seleccin para ese grupo.

El segundo conjunto de resultados de cada grupo tiene una fila que contiene los subtotales de las funciones de agregado especificadas en la clusula COMPUTE para ese grupo.
Cuando se especifica COMPUTE sin la clusula opcional BY, hay dos conjuntos de resultados para la instruccin SELECT:

El primer conjunto de resultados de cada grupo tiene todas las filas de detalles que contienen informacin de la lista de
seleccin.

El segundo conjunto de resultados tiene una fila que contiene los totales de las funciones de agregado especificadas en
la clusula COMPUTE.

EJEMPLOS DE COMPUTE
La instruccin SELECT siguiente usa una clusula COMPUTE simple para producir el total de la suma del precio y los adelantos
de la tabla titles:
SELECT type, price, advance
FROM titles
ORDER BY type
COMPUTE SUM(price), SUM(advance)
En esta consulta se agrega la palabra clave opcional BY a la clusula COMPUTE para producir subtotales para cada grupo:
SELECT type, price, advance
FROM titles
ORDER BY type
COMPUTE SUM(price), SUM(advance) BY type
Los resultados de esta instruccin SELECT se devuelven en 12 conjuntos de resultados, 2 conjuntos de resultados por cada uno
de los 6 grupos. El primer conjunto de resultados de cada grupo tiene un conjunto de filas que contienen la informacin derivada de la lista
de seleccin. El segundo conjunto de resultados de cada grupo contiene los subtotales de las dos funciones SUM de la clusula COMPUTE.

COMPARAR COMPUTE CON GROUP BY


Para resumir las diferencias entre COMPUTE y GROUP BY:
GROUP BY produce un conjunto individual de resultados. Hay una fila por cada grupo que contiene slo las columnas de agrupamiento y las funciones de agregado que muestran el subagregado de ese grupo. La lista de seleccin slo contiene las columnas de
agrupamiento y las funciones de agregado.
COMPUTE produce varios conjuntos de resultados. Un tipo de conjunto de resultados contiene las filas de detalle de cada grupo
que contiene las expresiones de la lista de seleccin. El otro tipo de conjunto de resultados contiene el subagregado de un grupo o el agregado total de la instruccin SELECT. La lista de seleccin puede contener expresiones que no sean las columnas de agrupacin o las
funciones de agregado. Las funciones de agregado se especifican en la clusula COMPUTE, no en la lista de seleccin.
En esta consulta se usa GROUP BY y funciones de agregado y se devuelve un conjunto de resultados que tiene una fila por grupo que contiene los subtotales agregados para ese grupo:
SELECT type, SUM(price), SUM(advance)
FROM titles
GROUP BY type
Nota No puede incluir tipos de datos ntext, text o image en una clusula COMPUTE o COMPUTE BY.

AO 2003

Pgina 69 de 96

SQL

Lic. Gustavo Rei

ELSE (IF...ELSE)
Impone condiciones en la ejecucin de una instruccin Transact-SQL. La instruccin Transact-SQL (sql_statement) que sigue a
Boolean_expression se ejecuta si Boolean_expression da como resultado TRUE. La palabra clave opcional ELSE es una instruccin Transact-SQL alternativa que se ejecuta cuando Boolean_expression da como resultado FALSE o NULL.
Ejemplos
El ejemplo siguiente obtiene una lista de libros de cocina tradicionales, con un precio entre 10 $ y 20 $, cuando al menos un libro
cumpla las condiciones que se indican. De lo contrario, SQL Server imprime un mensaje que indica que no hay ningn libro que cumpla la
condicin y genera una lista de libros de cocina que cuestan menos de 10 $.
USE pubs
GO
DECLARE @msg varchar(255)
IF (SELECT COUNT(price)
FROM titles
WHERE title_id LIKE 'TC%' AND price BETWEEN 10 AND 20) > 0
BEGIN
SET NOCOUNT ON
SET @msg = 'There are several books that are a good value between $10 and $20. These books are: '
PRINT @msg
SELECT title
FROM titles
WHERE title_id LIKE 'TC%' AND price BETWEEN 10 AND 20
END
ELSE
BEGIN
SET NOCOUNT ON
SET @msg = 'There are no books between $10 and $20. You might consider the following books that are under $10.'
PRINT @msg
SELECT title
FROM titles
WHERE title_id LIKE 'TC%' AND price < 10
END

IF...ELSE
Impone condiciones en la ejecucin de una instruccin Transact-SQL. La instruccin Transact-SQL que sigue a una palabra clave
IF y a su condicin se ejecuta si la condicin se satisface (cuando la expresin booleana devuelve TRUE). La palabra clave opcional ELSE
introduce una instruccin Transact-SQL alternativa que se ejecuta cuando la condicin IF no se satisface (cuando la expresin booleana
devuelve FALSE).
Observaciones
Se pueden utilizar construcciones IF...ELSE en lotes, en procedimientos almacenados (en los que se utilizan a menudo estas
construcciones para probar la existencia de algn parmetro) y en consultas ad hoc.
Las pruebas IF pueden estar anidadas despus de otro IF o a continuacin de un ELSE. No hay lmite en el nmero de niveles
anidados.
Ejemplos

UTILIZAR UN BLOQUE IF...ELSE


En este ejemplo se muestra una condicin IF con un bloque de instrucciones. Si el precio promedio del ttulo no es menor de 15 $,
se imprime el texto: "Average title price is more than $15" (el precio promedio del ttulo es mayor que 15 $).
USE pubs
IF (SELECT AVG(price) FROM titles WHERE type = 'mod_cook') < $15
BEGIN
AO 2003

Pgina 70 de 96

SQL

Lic. Gustavo Rei


PRINT 'The following titles are excellent mod_cook books:'
PRINT ' '
SELECT SUBSTRING(title, 1, 35) AS Title
FROM titles
WHERE type = 'mod_cook'
END
ELSE
PRINT 'Average title price is more than $15.'
El siguiente es el conjunto de resultados:
The following titles are excellent mod_cook books:
Title
----------------------------------Silicon Valley Gastronomic Treats
The Gourmet Microwave
(2 row(s) affected)

UTILIZAR MS DE UN BLOQUE IF...ELSE


En este ejemplo se utilizan dos bloques IF. Si el precio promedio del ttulo no es menor de 15 $, se imprime el texto: "El precio
promedio del ttulo es mayor que 15 $". Si el precio promedio de los libros de cocina moderna es mayor que 15 $, se ejecuta la instruccin
que imprime el mensaje que indica que los libros de cocina moderna son caros.
USE pubs
IF (SELECT AVG(price) FROM titles WHERE type = 'mod_cook') < $15
BEGIN
PRINT 'The following titles are excellent mod_cook books:'
PRINT ' '
SELECT SUBSTRING(title, 1, 35) AS Title
FROM titles
WHERE type = 'mod_cook'
END
ELSE
IF (SELECT AVG(price) FROM titles WHERE type = 'mod_cook') > $15
BEGIN
PRINT 'The following titles are expensive mod_cook books:'
PRINT ' '
SELECT SUBSTRING(title, 1, 35) AS Title
FROM titles
WHERE type = 'mod_cook'
END

END (BEGIN...END)
Incluye un conjunto de instrucciones Transact-SQL que se ejecutarn como un grupo. Los bloques BEGIN...END pueden anidarse.
Ejemplos
El ejemplo siguiente genera una lista de libros de empresa con un precio inferior a 20 $ cuando al menos un libro cumpla las siguientes condiciones. De lo contrario, SQL Server imprime un mensaje que indica que no hay ningn libro que cumpla las condiciones y
genera una lista con todos los libros que cuesten menos de 20 $.
SET NOCOUNT OFF
AO 2003

Pgina 71 de 96

SQL

Lic. Gustavo Rei


GO
USE pubs
GO
SET NOCOUNT ON
GO
DECLARE @msg varchar(255)
IF (SELECT COUNT(price)
FROM titles
WHERE title_id LIKE 'BU%' AND price < 20) > 0
BEGIN
SET @msg = 'There are several books that are a good value at under $20. These books are: '
PRINT @msg
SET NOCOUNT OFF
SELECT title
FROM titles
WHERE price < 20
END
ELSE
BEGIN
SET @msg = 'There are no books under $20. '
PRINT @msg
SELECT title
FROM titles
WHERE title_id
LIKE 'BU%'
AND
PRICE <10
END

WHILE
Establece una condicin para la ejecucin repetida de una instruccin o bloque de instrucciones de SQL. Las instrucciones se
ejecutan repetidamente mientras la condicin especificada sea verdadera. Se puede controlar la ejecucin de instrucciones en el bucle
WHILE con las palabras clave BREAK y CONTINUE.
Ejemplos

UTILIZAR BREAK Y CONTINUE CON IF...ELSE Y WHILE ANIDADOS


En este ejemplo, si el promedio de precio es menor de 30 $, el bucle WHILE dobla los precios y, a continuacin, selecciona el
precio mximo. Si el precio mximo es menor o igual que 50 $, el bucle WHILE se reinicia y dobla los precios de nuevo. Este bucle contina
la duplicacin de precios hasta que el precio mximo sea mayor que 50 $ y, a continuacin, sale del bucle WHILE e imprime un mensaje.
USE pubs
GO
WHILE (SELECT AVG(price) FROM titles) < $30
BEGIN
UPDATE titles
SET price = price * 2
SELECT MAX(price) FROM titles
IF (SELECT MAX(price) FROM titles) > $50
BREAK
ELSE
CONTINUE
END
PRINT 'Too much for the market to bear'
AO 2003

Pgina 72 de 96

SQL

Lic. Gustavo Rei

UTILIZAR WHILE EN UN PROCEDIMIENTO CON CURSORES


La construccin WHILE siguiente es una seccin de un procedimiento llamado count_all_rows. Para este ejemplo, esta construccin WHILE prueba el valor devuelto de @@FETCH_STATUS, una funcin que se utiliza con cursores. Debido a que @@FETCH_STATUS
puede devolver -2, -1 0, se deben probar los tres casos. Si se elimin una fila de los resultados del cursor desde el momento en que se
ejecut este procedimiento almacenado, se omite esa fila. Una recuperacin correcta (0) hace que se ejecute la instruccin SELECT del
bucle BEGIN...END.
USE pubs
DECLARE tnames_cursor CURSOR
FOR
SELECT TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
OPEN tnames_cursor
DECLARE @tablename sysname
--SET @tablename = 'authors'
FETCH NEXT FROM tnames_cursor INTO @tablename
WHILE (@@FETCH_STATUS <> -1)
BEGIN
IF (@@FETCH_STATUS <> -2)
BEGIN
SELECT @tablename = RTRIM(@tablename)
EXEC ('SELECT ''' + @tablename + ''' = count(*) FROM '
+ @tablename )
PRINT ' '
END
FETCH NEXT FROM tnames_cursor INTO @tablename
END
CLOSE tnames_cursor
DEALLOCATE tnames_cursor

GROUPING
Es una funcin de agregado que genera una columna adicional en el resultado con el valor 1 si la fila se agrega mediante el operador CUBE o ROLLUP, 0 cuando la fila no es el resultado de CUBE o ROLLUP.
El agrupamiento slo se permite en la lista de seleccin asociada a una clusula GROUP BY que contenga el operador CUBE o
ROLLUP.
USE pubs
SELECT royalty, SUM(advance) 'total advance',
GROUPING(royalty) 'grp'
FROM titles
GROUP BY royalty WITH ROLLUP

ROLLUP
El operador ROLLUP resulta til para generar informes que contienen subtotales y totales. El operador ROLLUP genera un conjunto de resultados que es similar a los conjuntos de resultados generados por el operador CUBE
Las diferencias entre CUBE y ROLLUP son:

CUBE genera un conjunto de resultados que muestra agregados para todas las combinaciones de valores de las columnas seleccionadas.

ROLLUP genera un conjunto de resultados que muestra agregados para una jerarqua de valores de las columnas seleccionadas. Por ejemplo, una tabla simple Inventory contiene:
Item
Color
Quantity
-------------------- -------------------- -------------------------Table
Blue
124
AO 2003

Pgina 73 de 96

SQL

Lic. Gustavo Rei


Table
Chair
Chair

Red
Blue
Red

223
101
210

Esta consulta genera un informe de subtotales:


SELECT CASE WHEN (GROUPING(Item) = 1) THEN 'ALL'
ELSE ISNULL(Item, 'UNKNOWN')
END AS Item,
CASE WHEN (GROUPING(Color) = 1) THEN 'ALL'
ELSE ISNULL(Color, 'UNKNOWN')
END AS Color,
SUM(Quantity) AS QtySum
FROM Inventory
GROUP BY Item, Color WITH ROLLUP
Item
Color
QtySum
-------------------- -------------------- -------------------------Chair
Blue
101.00
Chair
Red
210.00
Chair
ALL
311.00
Table
Blue
124.00
Table
Red
223.00
Table
ALL
347.00
ALL
ALL
658.00
(7 row(s) affected)
Si la palabra clave ROLLUP de la consulta se cambia por CUBE, el conjunto de resultados de CUBE es el mismo, excepto que al
final se devuelven estas dos filas adicionales:
ALL
ALL

Blue
Red

225.00
433.00

La operacin CUBE gener filas para las posibles combinaciones de valores de Item y Color. Por ejemplo, CUBE no slo informa
de todas las combinaciones posibles de valores de Color combinados con el valor Chair de Item (Red, Blue y Red + Blue), sino que tambin
informa de todas las combinaciones posibles de los valores de Item combinados con el valor Red de Color (Chair, Table y Chair + Table).
Por cada valor de las columnas de la derecha de la clusula GROUP BY, la operacin ROLLUP no informa de todas las combinaciones posibles de valores de la columna (o columnas) de la izquierda. Por ejemplo, ROLLUP no informa de todas las combinaciones posibles de valores de Item por cada valor de Color.
El conjunto de resultados de una operacin ROLLUP tiene una funcionalidad parecida a la que devuelve COMPUTE BY; sin embargo, ROLLUP tiene estas ventajas:
ROLLUP devuelve un nico conjunto de resultados; COMPUTE BY devuelve varios conjuntos de resultados que aumentan la
complejidad del cdigo de la aplicacin.
ROLLUP se puede utilizar en un cursor de servidor; COMPUTE BY no se puede.
En ocasiones, el optimizador de consultas puede generar planes de ejecucin ms eficientes para ROLLUP que para COMPUTE
BY.

CUBE
El operador CUBE genera un conjunto de resultados que es un cubo multidimensional. Un cubo multidimensional es una expansin de datos de hechos o datos que registran sucesos individuales. La expansin se basa en columnas que el usuario desea analizar.
Estas columnas se llaman dimensiones. El cubo es un conjunto de resultados que contiene una tabla cruzada de todas las combinaciones
posibles de dimensiones.

AO 2003

Pgina 74 de 96

SQL

Lic. Gustavo Rei

El operador CUBE se especifica en la clusula GROUP BY de una instruccin SELECT. La lista de seleccin contiene las columnas de dimensin y las expresiones de funciones de agregado. GROUP BY especifica las columnas de dimensin y las palabras clave
WITH CUBE. El conjunto de resultados contiene todas las combinaciones posibles de los valores de las columnas de dimensiones, junto
con los valores de agregado de las filas subyacentes que coinciden con esa combinacin de valores de dimensin.
Por ejemplo, una tabla simple Inventory contiene:
Item
Color
Quantity
-------------------- -------------------- -------------------------Table
Blue
124
Table
Red
223
Chair
Blue
101
Chair
Red
210
Esta consulta devuelve un conjunto de resultados que contiene el subtotal Quantity de todas las combinaciones posibles de Item y
Color:
SELECT Item, Color, SUM(Quantity) AS QtySum
FROM Inventory
GROUP BY Item, Color WITH CUBE
El siguiente es el conjunto de resultados:
Item
Color
QtySum
-------------------- -------------------- -------------------------Chair
Blue
101.00
Chair
Red
210.00
Chair
(null)
311.00
Table
Blue
124.00
Table
Red
223.00
Table
(null)
347.00
(null)
(null)
658.00
(null)
Blue
225.00
(null)
Red
433.00
Las filas siguientes del conjunto de resultados tienen especial inters:
Chair

(null)

311.00

Esta fila informa del subtotal de todas las filas que tengan el valor Chair en la dimensin Item. Se devuelve el valor NULL para la
dimensin Color para indicar que el agregado indicado por la fila incluye las filas con cualquier valor de la dimensin Color.
Table

(null)

347.00

Esta fila es parecida, aunque indica el subtotal de todas las filas que tengan Table en la dimensin Item.
(null)

(null)

658.00

Esta fila indica el total del cubo. Ambas dimensiones Item y Color tienen el valor NULL para indicar que la fila resume todos los
valores de ambas dimensiones.
(null)
(null)

Blue
Red

225.00
433.00

Estas dos filas indican los subtotales de la dimensin Color. Ambas tienen NULL en la dimensin Item para indicar que los datos
de agregado proceden de filas que tienen cualquier valor en esta dimensin
AO 2003

Pgina 75 de 96

SQL

Lic. Gustavo Rei

CUBOS MULTIDIMENSIONALES
El operador CUBE se puede usar para generar cubos n-dimensionales, o cubos con cualquier nmero de dimensiones. Un cubo
de una nica dimensin se puede utilizar para generar un total, por ejemplo:
SELECT CASE WHEN (GROUPING(Item) = 1) THEN 'ALL'
ELSE ISNULL(Item, 'UNKNOWN')
END AS Item,
SUM(Quantity) AS QtySum
FROM Inventory
GROUP BY Item WITH CUBE
GO
Esta instruccin SELECT devuelve un conjunto de resultados que muestra los subtotales de cada valor de Item y el total de todos
los valores de Item:
Item
QtySum
-------------------- -------------------------Chair
311.00
Table
347.00
ALL
658.00
Las instrucciones SELECT que contiene un operador CUBE con muchas dimensiones pueden generar conjuntos de resultados
grandes, porque estas instrucciones generan filas para todas las combinaciones de los valores de todas las dimensiones. Estos conjuntos
grandes de resultados pueden contener demasiados datos como para que resulten fciles de leer y entender. Una solucin a este problema
es colocar la instruccin SELECT en una vista:
CREATE VIEW InvCube AS
SELECT CASE WHEN (GROUPING(Item) = 1) THEN 'ALL'
ELSE ISNULL(Item, 'UNKNOWN')
END AS Item,
CASE WHEN (GROUPING(Color) = 1) THEN 'ALL'
ELSE ISNULL(Color, 'UNKNOWN')
END AS Color,
SUM(Quantity) AS QtySum
FROM Inventory
GROUP BY Item, Color WITH CUBE
A continuacin, la vista se puede utilizar para consultar slo los valores de dimensin que resulten de inters:
SELECT *
FROM InvCube
WHERE Item = 'Chair'
AND Color = 'ALL'
Item
Color
QtySum
-------------------- -------------------- -------------------------Chair
ALL
311.00
(1 row(s) affected)

Informes de tablas de referencias cruzadas


Algunas veces es necesario hacer girar los resultados, de forma que las columnas se presenten horizontalmente y las filas se
presenten verticalmente. Esto se conoce como crear PivotTable, crear un informe de tabla de referencia cruzada o girar datos.
Suponga que hay una tabla Pivot que tiene una fila por trimestre. Un SELECT de Pivot informa de los trimestres verticalmente:
AO 2003

Pgina 76 de 96

SQL

Lic. Gustavo Rei


Year
Quarter
Amount
--------------1990
1
1.1
1990
2
1.2
1990
3
1.3
1990
4
1.4
1991
1
2.1
1991
2
2.2
1991
3
2.3
1991
4
2.4

Debe crearse un informe con una tabla que contenga una fila por cada ao, con los valores de cada trimestre en una columna separada, como en:

Year

Q1

Q2

Q3

Q4

1990

1.1

1.2

1.3

1.4

1991

2.1

2.2

2.3

2.4

stas son las instrucciones que se utilizan para crear la tabla Pivot y rellenarla con los datos de la primera tabla:
USE Northwind
GO
CREATE TABLE Pivot
( Year
SMALLINT,
Quarter TINYINT,
Amount
DECIMAL(2,1) )
GO
INSERT INTO Pivot VALUES (1990, 1, 1.1)
INSERT INTO Pivot VALUES (1990, 2, 1.2)
INSERT INTO Pivot VALUES (1990, 3, 1.3)
INSERT INTO Pivot VALUES (1990, 4, 1.4)
INSERT INTO Pivot VALUES (1991, 1, 2.1)
INSERT INTO Pivot VALUES (1991, 2, 2.2)
INSERT INTO Pivot VALUES (1991, 3, 2.3)
INSERT INTO Pivot VALUES (1991, 4, 2.4)
GO
sta es la instruccin SELECT que se utiliza para crear resultados girados:
SELECT Year,
SUM(CASE Quarter WHEN 1 THEN Amount ELSE 0 END) AS Q1,
SUM(CASE Quarter WHEN 2 THEN Amount ELSE 0 END) AS Q2,
SUM(CASE Quarter WHEN 3 THEN Amount ELSE 0 END) AS Q3,
SUM(CASE Quarter WHEN 4 THEN Amount ELSE 0 END) AS Q4
FROM Northwind.dbo.Pivot
GROUP BY Year
GO
Esta instruccin SELECT realiza tambin el tratamiento de una tabla en la que hay varias filas por cada trimestre. La clusula
GROUP BY combina todas las filas de Pivot de un ao determinado en una nica fila del resultado. Cuando se realiza la operacin de
agrupamiento, las funciones CASE de los agregados SUM se aplican de tal forma que los valores Amount de cada trimestre se agregan a la
columna adecuada del conjunto de resultados, y se agrega 0 a las columnas del conjunto de resultados del resto de los trimestres.

AO 2003

Pgina 77 de 96

SQL

Lic. Gustavo Rei

Si los resultados de esta instruccin SELECT se usan como entrada de una hoja de clculo, es fcil para la hoja de clculo calcular un total para cada ao. Cuando se usa SELECT desde una aplicacin, puede ser ms fcil mejorar la instruccin SELECT para calcular
el total anual. Por ejemplo:
SELECT P1.*, (P1.Q1 + P1.Q2 + P1.Q3 + P1.Q4) AS YearTotal
FROM (SELECT Year,
SUM(CASE P.Quarter WHEN 1 THEN P.Amount ELSE 0 END) AS Q1,
SUM(CASE P.Quarter WHEN 2 THEN P.Amount ELSE 0 END) AS Q2,
SUM(CASE P.Quarter WHEN 3 THEN P.Amount ELSE 0 END) AS Q3,
SUM(CASE P.Quarter WHEN 4 THEN P.Amount ELSE 0 END) AS Q4
FROM Pivot AS P
GROUP BY P.Year) AS P1
GO
GROUP BY con CUBE y GROUP BY con ROLLUP calculan la misma clase de informacin, como se muestra en el ejemplo, pero
con un formato un poco diferente.

AO 2003

Pgina 78 de 96

SQL

Lic. Gustavo Rei

Observaciones de todos los tp(s) tenga en cuenta que dependiendo la versin de sql server o de acces los datos pueden variar .
Hay ejercicios muy similares. Hay ejercicios que no se pueden realizar en un solo paso

TRABAJO PRCTICO SQL (1)


Contenido: Base de datos neptuno (simplificada o completa) (a los efectos de la ejercitacin con SQL, no se observan los errores
de diseo que tiene la BD en cuestin)
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.

Listar los id de los clientes


Listar los id de los clientes y sus nombres completos
Listar los id de los clientes , sus nombres completos y direcciones
Listar toda la informacin de los empleados
Listar toda la informacin de los empleados cuyo jefe sea Fuller, Andrew
Listar toda la informacin de los empleados cuyo pas sea Estados Unidos
Listar toda la informacin de los empleados que sean del sexo femenino
Listar toda la informacin de los empleados que sean nacidos antes de 8 de diciembre de 1968
Listar todos pedidos tomados por el empleado Leverling, Janet, ordenado por cliente y fecha de pedido
Listar todos los pedidos del cliente Rattlesnake Canyon Grocery tomados por empleado Davolio, Nancy ordenados por
cargo y fecha de pedido en forma descendente
Listar todos productos cuyo stock sea menor a 10
Listar todos productos que no estemos esperando ningn pedido
Listar todos productos que su venta este suspendida
Listar todos productos que su venta este no suspendida
Listar todos productos que su precio sea mayor a $ 20
Listado de los vendedores que tomaron pedidos el da 13-01-1998 y el da 31-12-1997
Listar las empresas con cargo superior a 5 y su Pas de destino sea Alemania
Listar el nombre de cada empleado y el de su director.
Listar detalles de pedidos que no hayan tenido descuento .
Listar detalles de pedidos que hayan tenido descuento
Listar detalles de pedidos cuyo monto sea superior a $ 200

TRABAJO PRCTICO SQL (2)


1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.

AO 2003

Listar Todos los productos utilizar un alias


Listar las cuatro lneas de pedido ms caras (las de mayor importe).
De cada pedido queremos saber su nmero de pedido y cliente
De cada pedido queremos saber su nmero de pedido, cantidad, precio unitario e importe total sin descuento
Listar de cada empleado su datos, n de das que lleva trabajando en la empresa
Obtener una lista de todos los productos indicando para cada uno su id, descripcin, precio y precio con I.V.A. incluido
(es el precio anterior aumentado en un 21%).
Obtener la lista de los clientes ordenados por pas
Obtener los pedidos ordenados por fecha de pedido.
Obtener los proveedores ordenados por contacto
Obtener las mismas columnas que en el ejercicio 4 pero sacando nicamente las 5 lneas de pedido de menor precio
unitario
Listar toda la informacin de los pedidos de marzo
Listar los nmeros de los empleados que tienen regin
Listar los empleados que no tienen jefe
Listar los empleados de nombre Laura
Listar los empleados que trabajen con alguna relacin en ventas
Listar los productos cuyo nombre de producto contenga una Q
Listar los empleados que en su cdigo postal tengan un 8
Listar la totalidad de los descuentos aplicados en pesos por detalle de pedido
Listar: La totalidad de los pedidos, dnde figure:
a. Pedido
Pgina 79 de 96

SQL

Lic. Gustavo Rei


b. Producto
c. Precio unitario
d. Cantidad pedida
e. Descuento
f.
Precio total a pagar sin descuento
g. Descuento
h. Neto a cobrar
i.
Monto a cobrar con iva
20. Listar Todos los productos
a. Cuya venta no este suspendida
b. Que tenga unidades en existencia
c. Que la cantidad de unidades en existencia sea mayor que 20
21. Todos los productos
a. Que vengan en caja
b. Que no este suspendido
c. Que nivel de nuevo pedido no sea 0
13

TRABAJO PRCTICO SQL (3)


1.

2.
3.
4.

5.
6.

7.
8.
9.
10.
11.
12.

13.
14.

15.

13

AO 2003

Necesito TODOS los clientes que tengan una a en su id y su nombre tenga una s
a. Luego a 1. agregarle que los contactos de los proveedores tengan una c en su nombre o que el cargo del
contacto tenga la palabra venta.
b. Ordenados por el tercer campo
Realice una unin de 3 tablas
Realice el producto cartesiano de una tabla consigo mismo.
Seleccione la tabla empleados y cree un alias de la misma tabla (tiene que seleccionar dos veces la misma tabla).
a. Muestre los campos apellido, nombre y jefe de la segunda tabla
b. Muestre los campos apellido, nombre y jefe de la primera tabla
c. Restrinja los campos mostrados, de tal forma que me muestre el jefe de cada empleado Use la opcin a.
d. Restrinja los campos mostrados, de tal forma que me muestre el jefe de cada empleado Use la opcin b.
e. Qu pas? Dnde esta la diferencia?Por qu?
Necesito conocer todos los proveedores que me proveen productos
Necesito conocer todos los empleados que hayan vendido
a. Solucinelo sin inner y con inner
b. Si cambia el = en los campos de emparejamiento, qu le muestra?
c. Si cambia el orden de las tablas que le muestra
Listar los empleados de WA que hayan recibido pedidos y que su forma de envo sea Speedy Express
Listar los pedidos que fueron recibidos por Davolio, Nancy
Se desea tener en una nica vista todos los campos de las tablas proveedores y productos
Realice un inner join de 3 tablas
Realice el producto cartesiano de una tabla consigo mismo.
Seleccione la tabla empleados y cree un alias de la misma tabla (tiene que seleccionar dos veces la misma tabla.
a. Muestre los campos apellido, nombre y jefe de la segunda tabla
b. Muestre los campos apellido, nombre y jefe de la primera tabla
c. Restrinja los campos mostrados, de tal forma que me muestre el jefe de cada empleado Use la opcin a.
d. Restrinja los campos mostrados, de tal forma que me muestre el jefe de cada empleado Use la opcin b.
e. Qu pas? Dnde esta la diferencia?Por qu?
Necesito conocer todos los proveedores que me proveen productos
Necesito conocer todos los empleados que hayan vendido
a. Solucinelo sin inner y con inner
b. Si cambia el = en los campos de emparejamiento, qu le muestra?
c. Si cambia el orden de las tablas que le muestra, qu le muestra?
d. Si cambia inner por rigth y left que pasa
Listar los empleados de WA que hayan recibido pedidos y que su forma de envo sea Speedy Express

Los Ejercicos de Table, solamente los puede realizar si Utiliza Access

Pgina 80 de 96

SQL

Lic. Gustavo Rei


16. Listar los pedidos que fueron recibidos por Davolio, Nancy De cuantas formas puede hacerlo?
17. Listar los pedidos superiores a 400 , incluyendo el nombre del empleado que tom el pedido y el nombre del cliente que
lo solicit.
18. Hallar los empleados que realizaron su primer pedido el mismo da en que fueron contratados.
19. Todos los productos que fueron pedidos y que hayan sido provistos por algn proveedor y que las unidades en existencia sean mayores que 30
20. Se necesita listar el nombre de cliente, la fecha de pedido, los productos y la cantidad adquirida de productos, dnde los
pedidos sean posteriores al ao 1997 y los productos adquiridos sean superiores a 20, ordenados por fecha de pedido

TRABAJO PRCTICO SQL (4) COMPENDIO CON PROBLEMAS


Para completar el presente debe realizar:
Intentar hacer los ejercicios con la base de datos sin corregir, de no poder obtener resultados
Corregir (de ser necesaria) la base de datos lgicamente
Crear la Base de datos en SQL server en forma automtica
Carga de datos
Realizar las consultas
Ejercicio 1.- Sea la siguiente BD:
PROVEEDORES (nro_p, nom_p, categoria, ciud_p)
ITEMS (nro_i, descripcion_i, ciud_i)
PEDIDOS (nro_p, nro_c, nro_i, cantidad, precio)
CLIENTES (nro_c, nom_c, ciud_c)
1.
2.
3.
4.
5.
6.
7.
8.

Listar los proveedores de Crdoba


Listar los proveedores que proveen el tem 1
Listar los clientes que solicitan tems provistos por el proveedor 1
Listar los clientes que solicitan algn tem provistos por proveedores con categora mayor que 4
Listar los tems pedidos por clientes de Rosario.
Listar los pedidos en los cuales un cliente de rosarios solicita artculos fabricados en Mendoza.
Listar los pedidos en los que el cliente 23 solicita tems no solicitados por el cliente 30
Listar las ciudades en la forma (ciudad1, ciudad2) tales que un proveedor en la ciudad1 provea tems solicitados por
clientes en ciudad2
9. Listar los nmeros de proveedores cuya categora sea mayor que la de todos los proveedores que proveen el tem
"cuaderno"
10. Listar los clientes que han pedido dos o ms tems distintos.
11. Listar los proveedores que proveen a todos los clientes de Crdoba una cantidad mayor que el promedio de las cantidades pedidas por los clientes de Rosario.
Ejercicio 2.- Una oficina gubernamental desea construir un complejo habitacional, para lo cual elaboro la siguiente Base de Datos:
TRAMO (c_ciudadA, c_ciudadB, Distancia)
CIUDADES (c_ciudad, nombre, cant_escuelas, cant_fabricas)
Para decidir donde instalarlo, desea conocer los siguientes datos:
1.
2.
3.

Las ciudades alcanzables desde la ciudad con mayor cantidad de fabricas, recorriendo no ms de dos tramos, c/u de
los cuales no puede tener mas de 10km de longitud.
Las ciudades con mas de 10 fabricas que estn conectadas con todas las dems en forma directa, siempre que ningn
tramo supere los 50km.
Los pares de ciudades, de la forma (ciudad1, ciudad2), que son alcanzables a travs de, a lo sumo, otra ciudad, llmese a esta, ciudad3 (esto es, encontrar los caminos ciudad1-ciudad3-ciudad2).

Ejercicio 3.- Dada la BD:

AO 2003

Pgina 81 de 96

SQL

Lic. Gustavo Rei


FRECUENTA (nombre-pers, nombre-bar)
SIRVE (nombre-bar, nombre-cerveza)
GUSTA (nombre-pers, nombre-cerveza)
1.
2.
3.
4.
5.

Encontrar las personas que frecuentan un bar que sirven una cerveza que les gusta.
Encontrar a las personas que beben en el mismo bar que las personas a las que les gusta la cerveza Quilmes
Encontrar las personas que beben en el mismo bar que aquellas a las que le gusta una marca de cerveza que sirva dicho bar y que le guste a Juan Prez.
Encontrar las personas que frecuentan solamente bares que sirven alguna cerveza que les gusta (asumir que cada persona frecuenta al menos un bar y le gusta al menos una cerveza)
Encontrar las personas que no frecuentan ningn bar que sirven cerveza que les gusta.

Ejercicio 4.- Sea la BD:


PERSONAS (tipo_doc, num_doc, nomyap, dir, tel, fnac, sexo)
PROGENITOR (tipo_doc, num_doc, tipo_doc_hijo, num_doc_hijo)
1.
2.
3.
4.
5.
6.

Listar para cada Juan Prez los tipo y numero de documento, nombre y apellido y telfono de todos sus hijos.
Idem a, de:
Todos sus hermanos (los hijos de su madre y/o su padre)
su madre
su abuelo materno
todos sus nietos

TRABAJO PRCTICO SQL (5)


1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.

Cuntos empleados tengo


Cuantos clientes tengo.
Cuntos pedidos tengo
Cuantos productos T Dharamsala fueron pedidos . Use primero un select simple a una nica tabla. Use luego un Inner
, hay diferencia?
Cuantos (registros)detalles de pedido del ejercicio anterior tengo
Cul es el promedio de ventas en general
Cul es el promedio de cantidades de todos los productos vendidos
Se necesita saber, el total de productos vendidos, la cantidad de productos vendidos y la media de productos vendidos
Se necesita saber el total de dinero ingresado de los productos provistos por la empresa exotic liquids (piense este ejercicio tiene que usar tres tablas para resolverlo en forma correcta)
Como calcula lo mismo de todos los otros proveedores.
Se necesita saber todo lo que pag el cliente Ana Trujillo Emparedados y helados
Se necesita saber la cantidad total de dinero facturado y el total del cargo por envo de todos los clientes
Se necesita saber la cantidad total de dinero facturado y el total del cargo por envo de los clientes Ana Trujillo Emparedados y helados y Alfreds Futterkiste
Se necesita conocer cual fue el monto de la venta mxima realizada
Se necesita conocer cual fue el monto de la venta mnima realizada

TRABAJO PRCTICO SQL (6)


1.
2.
3.
4.
5.
6.
7.
AO 2003

Hallar en qu fecha se realiz el primer pedido (suponiendo que en la tabla de pedidos tenemos todos los pedidos realizados hasta la fecha).
Se necesita tener un listado de todos los productos provistos por cada proveedor, debiendo verse el nombre del producto y el nombre de la compaa proveedora.
Agrupe: Todos los pedidos por Empleados, se debe ver el empleado y la cantidad de pedidos que recibi.
Se necesitan saber todos los pedidos que hicieron cada cliente
Se necesitan saber todos los pedidos realizados a cada producto
Se necesita saber cual es el producto ms pedido y el producto menos pedido
Se necesitan saber los pedidos recibidos por mes.
Pgina 82 de 96

SQL

Lic. Gustavo Rei


8. Se necesitan saber los pedidos realizados por ao
9. Se necesita saber cual es el producto ms caro, cual el ms barato y cual e promedio de costo
10. Se necesita saber la cantidad total de dinero facturado por envo de todos los clientes (Ojo con el clculo tiene que incluir el descuento de tenerlo)
11. Listar cuntos empleados estn asignados a cada cada Jefe.
a. Para hacerlo, en primer trmino use un producto cartesiano
b. Luego un Inner join
c. Qu pas?, Porqu?
12. Agrupar todos los pedidos realizados por los clientes a todos los empleados, definiendo la cantidad total que cada empleado le cobr a cada cliente., ordenados por nombre de cliente, se tiene que ver el nombre del cliente, el apellido del
empleado y el monto cobrado .
13. Se necesita conocer el promedio de venta de cada empleado que haya tenido una venta mayor a 1000 por cliente. Se
debe mostrar: apellido del empleado, promedio del empleado por cliente, total del empleado por cliente.

TRABAJO PRCTICO SQL (7)


1.
2.

Crear la tabla empleados y definir su clave principal en la misma instruccin de creacin.


Crear la tabla oficinas con su clave principal y su clave fornea ( la columna dir contiene el cdigo de empleado del director de la oficina luego es un campo que hace referencia a un empleado luego es clave fornea y hace referencia a la
tabla empleados).
3. Crear la tabla productos con su clave principal.
4. Crear la tabla clientes tambin con todas sus claves y sin la columna limitecredito.
5. Crear la tabla pedidos sin clave principal, con la clave fornea que hace referencia a los productos, la que hace referencia a clientes y la que indica el representante (empleado) que ha realizado el pedido.
6. Aadir a la definicin de clientes la columna limitecredito.
7. Aadir a la tabla empleados las claves forneas que le faltan. (Si no tienes claro cuales son te lo decimos ahora: la columna oficina indica la oficina donde trabaja el empleado y la columna director indica quin dirige al empleado, su jefe
inmediato).
8. Hacer que no puedan haber dos empleados con el mismo nombre.
9. Aadir a la tabla de pedidos la definicin de clave principal.
10. Definir un ndice sobre la columna region de la tabla de oficinas.
11. Eliminar el ndice creado.

TRABAJO PRCTICO SQL (8) COMPENDIO CON PROBLEMAS- SEGUNDA PARTE


Ejercicio 1: Seguros
Consideremos la siguiente estructura de tablas:
EMPLEADO (DNI, NombreEmpleado, Salario)
VENDEDOR (NVendedor, Zona, DNI)
POLIZA (NPoliza, Importe, Beneficiario, NVendedor, Fecha)
EMPLEADO-JEFE (DNI, DNIJefe)
Construir las sentencias de consulta SQL siguientes:
a) Nombre de los vendedores de la zona Norte
b) Nombre del jefe del vendedor con nmero de vendedor 113.654
c) N de pliza e importe de pliza de las vendidas este ao por los vendedores cuyo jefe es Pablo Collado.
Ejercicio 2: Empresa2
Consideremos la siguiente estructura de tablas:
DEPARTAMENTO (NombreDepartamento, NEmpleados)
EDIFICIO (IdEdificio, Nombre, NDespachos, IdPoligono)
POLGONO (IdPoligono, Nombre, Ciudad)
DEPARTAMENTO-EDIFICIO (NombreDepartamento, IdEdificio, NDespachos)

AO 2003

Pgina 83 de 96

SQL

Lic. Gustavo Rei


Construir las sentencias de consulta SQL siguientes:
a) Nombre de los edificios, en los que el departamento de Contabilidad tiene ms de 5 despachos asignados.
b) Nombre de los departamentos y nmero de despachos de cada uno que estn ubicados en el edificio La Campana.
c) Nombre de los departamentos con representacin en Logroo.
d) Nombre edificio y nmero de despachos de los edificios de los polgonos Cantabria, y La Portalada.

Ejercicio 3: Ros de Espaa


Consideremos la siguiente estructura de tablas:
COMUNIDADAUTONOMA(NombreAutonomia, NHabitantes)
CIUDAD (IdCiudad, Nombre, NHabitantes, NombreAutonomia)
RIO (NombreRio, Caudal, Longitud)
COMUNIDADAUTONOMA-RIO (NombreAutonomia, NombreRio, NKilometros)
RIO-CIUDAD (NombreRio, IdCiudad)
Construir las sentencias de consulta SQL siguientes:
a) Nombre y nmero de habitantes de las ciudades de La Rioja.
b) Nombre y longitud de los rios que pasan por la Comunidad de Aragn.
c) Nombre de los rios que pasan parte por Castilla-La Mancha y parte por Andaluca.
d) Suma de los caudales de los rios que pasan por Navarra.

Ejercicio 4: Vehculos
Consideremos la siguiente estructura de tablas:
CONDUCTOR (DNI, Nonbre, Apellido, NAos)
VEHICULO (Matricula, Marca)
COCHE (Matricula, N Puertas)
MOTO (Matricula)
CAMION (Matricula, Tara)
CONDUCTOR-VEHICULO (DNI, Matricula)
Construir las sentencias de consulta SQL siguientes:
1. DNI de los conductores de motos
2. Marca de los vehculos que conduce Pepe Prez.
3. Marca y tara del camin conducido por la persona cuyo DNI sea 111111111. Incluir tambin el nmero de aos con el carnet de conducir.
Ejercicio 5: Autobuses
Consideremos la siguiente estructura de tablas:
AUTOBUS (NLinea, NAsientos)
CONDUCTOR (DNI, Nombre, Apellido, NAos,NLinea)
PARADA (IDParada, Calle, Numero, Marquesina?)
AUTOBUS-PARADA (NLinea, IDParada, 1HoraLlegada, Frecuencia)
Construir las sentencias de consulta SQL siguientes:
1. Lineas que tienen parada en Vara de Rey
2. N asientos del autobs que conduce Pepe Prez.
3. Todas las paradas de la lnea 30 poseen marquesina?. Para responder a la pregunta se decide contar las paradas de la linea 30 que no tengan marquesina. Si ese nmero es <> 0, entonces la respuesta a la pregunta es NO, en otro caso ser SI.
4. Lneas que tienen parada en Vara de Rey 2 y Vara de Rey 40

Ejercicio 6: Seguros2
AO 2003

Pgina 84 de 96

SQL

Lic. Gustavo Rei

Consideremos la siguiente estructura de tablas:


PERSONA (DNI, Nombre, Apellido1, Apellido2)
PISO (IDPiso, Calle, Numero, Ciudad, Nm2, DNIPropietario)
SEGURO (NPoliza, Tipo, CuotaBasica, DNIAsegurado, IDPiso, CantidadAsegurada)
Construir las sentencias de consulta SQL siguientes:
1.
2.
3.
4.
5.

Datos personales de aquellas personas cuyo primer apellido es Garca.


Direccin completa de los pisos de ms de 90 metros cuadrados.
N de las plizas contratadas por Pepe Prez.
N de pliza y cantidad asegurada, de los seguros de los pisos cuyo propietario es Pepe Prez.
N de pliza y cantidad asegurada, de los seguros de hogar en los que el contratante del seguro coincide con el propietario
del piso.

Ejercicio 7: Horarios
Consideremos la siguiente estructura de tablas:
ASIGNATURA (Nombre, Cuatrimestre, NAula)
PROFESOR (Nombre, Departamento)
AULA (NAula, Capacidad)
PIZARRA (NAula, Ancho, Alto)
AULA-NO-INFORMATICA (NAula)
AULA-DE-INFORMATICA (NAula, NOrdenadores)
ASIGNATURA-PROFESOR (NombreAsignatura, NombreProfesor)
Construir las sentencias de consulta SQL siguientes:
1.

2.
3.
4.

Nombre de las asignaturas que se imparten en el aula 108 durante el 1er Cuatrimestre. Ntese que se asume que el tipo de
datos del campo Cuatrimestre en la tabla Asignatura es un campo de tipo numrico, de ah que se convierte la informacin proporcionada en el enunciado al tipo de datos tal y como se almacena en la tabla.
Nombre y cuatrimestre de las asignaturas que se imparten en aulas de informtica con capacidad mayor de una veintena de
alumnos
Numero y capacidad de las aulas sin pizarra
Nombres de los profesores del departamento de Matemticas y Computacin que den clase en aulas de informtica. Para
cada uno de ellos, incluir el nombre de la asignatura, el nmero de ordenadores y la capacidad del aula.

Ejercicio 8: Prensa
Consideremos la siguiente estructura de tablas:
PERIODICO(nombre)
ARTICULO(id-articulo, tipo, titulo, texto completo, resumen)
AUTOR(id-autor, nombre)
PERIODISTA(id-autor)
NOPERIODISTA(id-autor, profesion)
PERIODICO-ARTICULO(nombre-periodico, id-articulo, fecha, seccion)
ARTICULO-AUTOR(id-articulo, id-autor)
PERIODISTA-PERIODICO(id-autor, nombre-periodico, cargo)
1. Listado de artculos (mostrando ttulo y tipo) publicados el 13 de marzo de 2001 en el diario La Rioja.
2. Mostrar por orden alfabtico los nombres de peridicos en los que algn empresario haya publicado artculos (1 o ms) en la
seccin de opinin.
3. Verificar si todos los autores son periodistas o no periodistas.
4. Nombres de peridicos en los que haya al menos 6 empleados. Mostrar tambin el nmero de empleados.
5. Mostrar los ttulos de los artculos que hayan sido publicados simultneamente (en la misma fecha) en La Rioja y El Correo.

Ejercicio 9: Vinos
AO 2003

Pgina 85 de 96

SQL

Lic. Gustavo Rei


Consideremos la siguiente estructura de tablas:
VINO(id-vino, marca, tipo-vino, ao, graduacion, nombre-bodega)
BODEGA(nombre-bodega)
EMPRESA(nombre propietario, nombre-bodega)
COOPERATIVA(n cooperativistas, nombre-bodega)
CATADOR(nombre-catador, medio)
UVA(tipo-uva)
VINO-UVA(id-vino, tipo-uva)
VINO-CATADOR(id-vino, nombre-catador, calificacion)
VINO-BODEGA(id-vino, nombre-bodega)
1.
2.
3.
4.

Nombres de las bodegas de particulares.


Marca y graduacin de vinos del ao que se hayan elaborado con uva garnacha o tempranillo.
Marca, tipo de vino, ao de cosecha, graduacin y nombre del catador de los vinos de la bodega Magnfica.
Marcas de vinos (marca, tipo y ao de cosecha) en los que para su elaboracin se hayan utilizado uva garnacha juntamente
con uva tempranillo (las dos).

Ejercicio 10: Museos


Consideremos la siguiente estructura de tablas:
AUTOR(id_autor, nombre-autor, nacionalidad)
OBRADEARTE(titulo, nombre-museo, ciudad)
PINTURA(ancho, alto, tipo, titulo)
ESCULTURA(material, estilo, titulo)
SALA(id-sala, nombre-sala, nombre-museo, ciudad)
MUSEO(nombre-museo, calle, n, ciudad, pais)
OBRADEARTE-AUTOR(titulo, id-autor)
OBRADEARTE-SALA(titulo, id-sala)
1.
2.
3.
4.
5.
6.

Relacin de los ttulos de las pinturas junto con el nombre del museo donde se localizan.
Nombres de los autores que hayan realizado al menos una pintura y una escultura.
Ttulos de las obras de arte registradas en Espaa junto con el museo en el que se encuentran.
Nombre del autor y nombre del museo en que se encuentran las pinturas al leo.
Ttulo, autor, nombre de la sala y museo de las obras de arte que se encuentran en Madrid.
Relacin de las salas que tienen el mismo nombre en el museo del Prado y en el Louvre.

Ejercicio 11: Publicidad


Consideremos la siguiente estructura de tablas:
CAMPAAPUBLICITARIA(tema, presupuesto, id-anunciante)
ANUNCIO(slogan, tema-campaa)
ANUNCIOTELEVISIVO(minutos, slogan)
CUARADIOFONICA(minutos, slogan)
ANUNCIOIMPRESO(ancho, alto, imagenes?, slogan)
ANUNCIANTE(id-anunciante, nombre)
INSTITUCION(id-anunciante)
EMPRESA(id-anunciante)
MEDIOAUDIOVISUAL(nombre)
CADENATELEVISIVA(nombre)
EMISORADERADIO(nombre)
PUBLICACION(nombre, tirada)
PERIODICO(nombre)
REVISTA(nombre, periodicidad)
MEDIOAUDIOVISUAL-EMPRESA(nombre medio audiovisual, id-anunciante)
ANUNCIO-CADENATELEVISIVA(slogan, nombre-cadena, n veces)
CUA-EMISORARADIO(slogan, nombre-emisora, n veces)
ANUNCIO-PUBLICACION(slogan, nombre-publicacion, n pagina)
AO 2003

Pgina 86 de 96

SQL

Lic. Gustavo Rei

1.
2.
3.
4.
5.
6.
7.

Slogan, tema y minutos de duracin de los anuncios de televisin y las cuas radiofnicas.
Slogan y formato de los anuncios sin imgenes publicados en "La Rioja" o "El Correo"
Nombre de las emisoras de radio que no se anuncien.
Nombre de anunciantes con anuncios de televisin de ms de 2 minutos de duracin.
Dar una consulta que permita verificar si todo anunciante es o bien institucin o bien empresa.
Mayores tiradas de revistas, especificando su periodicidad.
Slogan y minutos de duracin de los anuncios de televisin que hayan sido emitidos el mismo nmero de veces por todas las
cadenas de televisin.

Ejercicio 12: Aeropuerto


Consideremos la siguiente estructura de tablas:
PASAJERO(DNI, Nombre, Apellidos, Edad, Id-vuelo, N asiento)
VUELO(TipoAvin, Compaia, Id-vuelo)
VUELO-DE-SALIDA(HoraSalida, PuertaEmbarque, Id-vuelo, Ciudad, Aeropuerto)
VUELO-DE-LLEGADA(HoraLlegada, PuertaSalida, Id-vuelo, Ciudad, Aeropuerto)
LUGAR(Ciudad, Pais, Aeropuerto)
1. Hora de salida y puerta de embarque del pasajero Andrs Prez Garca.
2. Nmero de vuelos realizados por la compaa Iberia.
3. Relacin de compaas de aviones que utilizan el aeropuerto junto con el nmero de vuelos de salida y el nmero de vuelos
de llegada que han realizado.
4. Nombre y apellidos de los pasajeros que viajan a Pars ordenados alfabticamente.
5. Compaas que hayan realizado vuelos con mas de 100 pasajeros.

Ejercicio 13: Ciclismo


Consideremos la siguiente estructura de tablas:
CICLISTA (IDCiclista, Nombre, Edad, Altura, Peso, Pulsaciones, NombreSponsor)
EQUIPO (NombreSponsor)
SPONSOR (NombreSponsor)
PRUEBA (NombrePrueba, Ao1Edicion)
CLASICA (NombrePrueba, KmsRecorrido)
ETAPAS (NombrePrueba)
ORGANIZADOR (NombreOrganizador)
CICLISTA-PRUEBA (IDCiclista, NombrePrueba, NVeces)
EQUIPO-ETAPA (NombreSponsor,NombrePrueba, NVeces)
PRUEBA-ORGANIZADOR (NombrePrueba, NombreOrganizador)
SPONSOR-ORGANIZADOR (NombreSponsor, NombreOrganizador)
Construir las sentencias de consulta SQL siguientes:
1. Nombre y edad de los ciclistas ganadoresdel Tour de Francia ms de una vez.
2. Nombre de los ciclistas del grupo Kelme que han ganado alguna clsica
3. Nombre de los ciclistas que han ganado el Tour de Francia y Vuelta a Espaa.
4. Nombre de los sponsor de los equipos que han ganado (clasificacin general por equipos) alguna prueba por etapas
organizadas por dichos sponsor.
Ntese que al construir la sentencia, se asume que un equipo puede ganar tanto pruebas clsicas como pruebas por etapas. Del
modelo relacional no se concluye por los nombres de campos utilizados lo que del diagrama E-R, donde se indica que un equipo solo puede
vencer en pruebas por etapas. Si se asume esta misma consideracin no sera necesaria ni la tabla ETAPAS ni la primera condicin de la
clusula WHERE. Esta condicin se incluye nicamente para asegurar que la prueba vencida es una prueba por etapas.
Ejercicio 14: Cine
Consideremos la siguiente estructura de tablas:
PELICULA (IDPelicula, Titulo, Ao, Nacionalidad, OscarPelicula?, NombreDirector, OscarDirector?, TituloGuion, OscarGuion?)
GUION (Titulo)
PERSONA (Nombre, Edad, Nacionalidad)
GUIONISTA (Nombre)
AO 2003

Pgina 87 de 96

SQL

Lic. Gustavo Rei


DIRECTOR (Nombre)
INTERPRETE (Nombre)
REMAKE (IDPeliculaOriginal, IDPeliculaRemake)
PELICULA-INTERPRETE (IDPelicula, NombreInterprete, Oscar?)
ESCRITOR-GUION (NombreGuionista, TituloGuion)
Construir las sentencias de consulta SQL siguientes:
1. Id y Ttulo de las pelculas interpretadaspor Ingrid Bergman.
2. Titulo y Nombre del Director, de las pelculas en cuyo reparto se incluye a ste ltimo
3. Titulo de las pelculas que ganaron el Oscar a la mejor pelcula y al mejor guion.
4. Titulo de las pelculas interpretadas por Spencer Tracy y Catherine Hepburn.
5. Titulo de las pelculas y sus remakes que hayan sido dirigidas por el mismo director. Incuye el nombre del director

Ejercicio 15: Grupos Musicales


Consideremos la siguiente estructura de tablas:
MUSICO (Nombre, Sexo, Edad, NombreGrupo, AoIncorporacion)
LETRISTA (Nombre)
INSTRUMENTISTA (Nombre, Instrumento)
GRUPO (Nombre, AoFundacion)
CANCIN (IDCancion, Titulo, Duracin, NombreCompaia)
COMPAA (NombreCompaia, NombreGrupoEstrella)
GRUPO-CANCION (NombreGrupo, IDCancion, Superventas?)
LETRISTA-CANCION (NombreLetrista, IDCancion)
Construir las sentencias de consulta SQL siguientes:
1. Relacin de los nombres de los componentes de los grupos musicales surgidos en los aos 80.
2. Nombre del bajo del grupo estrella de la EMI
3. Nombre de la compaa con los derechos de las canciones que han sido superventas, tocadas por el grupo Oasis.
4. Nombre de los msicos fundadores de los Rolling Stones.
5. Titulo de las canciones superventas de The Beatles escritas por George Harrison
6. Titulo y grupo de las canciones superventas escritas por algn componente de dicho grupo (The Beatles)
7. Identificador de las canciones tocadas por los Beatles y los Rolling Stones

AO 2003

Pgina 88 de 96

SQL

Lic. Gustavo Rei

Tipos de datos SQL Server


En Microsoft SQL Server, cada columna, variable local, expresin y parmetro dispone de un tipo de datos relacionado, que
es un atributo que especifica el tipo de datos (integer, character, money, etc) que el objeto puede contener. SQL Server suministra un
conjunto de tipos de datos del sistema que define todos los tipos de datos que pueden utilizarse con SQL Server. El conjunto de tipos de
datos suministrados por el sistema se muestra debajo.
Tambin se pueden utilizar tipos de datos definidos por el usuario, que son en realidad alias de los tipos de datos suministrados
por el sistema.
SQL Server proporciona sinnimos de tipos de datos para la compatibilidad con SQL-92.
Nombre14
Descripcin
biginit
Datos enteros (nmeros enteros) comprendidos entre -2^63 (-9223372036854775808) y 2^63 -1
(9223372036854775807).
int
Datos enteros (nmeros enteros) comprendidos entre -2^31 (-2.147.483.648) y 2^31 - 1 (2.147.483.647).
Smallint
tinyint
bit
decimal

Datos enteros comprendidos entre 215 (-32.768) y 215 - 1 (32.767).


Datos enteros comprendidos 0 y 255.
Datos enteros con valor 1 0
Datos de precisin y escala numrica fijas comprendidos entre -1038 +1 y 1038 1.

numric
Money

Funcionalmente equivalente a decimal.


Valores de moneda comprendidos entre -263 (-922.337.203.685.477,5808) y 263 - 1
(+922.337.203.685.477,5807), con una precisin de una diezmilsima de la unidad monetaria.
Valores de moneda comprendidos entre -214.748,3648 y +214.748,3647, con una precisin de una
diezmilsima de la unidad monetaria.
Nmeros con precisin de coma flotante comprendidos entre -1,79E + 308 y 1,79E + 308.
Nmeros con precisin de coma flotante comprendidos entre -3,40E + 38 y 3,40E + 38.
Datos de fecha y hora comprendidos entre el 1 de enero de 1753 y el 31 de diciembre de 9999, con una
precisin de 3,33 milisegundos.
Datos de fecha y hora comprendidos entre el 1 de enero de 1900 y el 6 de junio de 2079, con una precisin de un minuto.
Datos de caracteres no Unicode de longitud fija con una longitud mxima de 8.000 caracteres.
Datos no Unicode de longitud variable con un mximo de 8.000 caracteres.
Datos no Unicode de longitud variable con una longitud mxima de 231 - 1 (2.147.483.647) caracteres.
Datos Unicode de longitud variable con una longitud mxima de 4.000 caracteres.
Datos Unicode de longitud variable con una longitud mxima de 4.000 caracteres. sysname es el tipo de
datos suministrado por el sistema y definido por el usuario que es funcionalmente equivalente a nvarchar(128) y que se utiliza para hacer referencia a nombres de objetos de bases de datos.
Datos Unicode de longitud variable con una longitud mxima de 230 - 1 (1.073.741.823) caracteres.
Datos binarios de longitud fija con una longitud mxima de 8.000 bytes.
Datos binarios de longitud variable con una longitud mxima de 8.000 bytes.
Datos binarios de longitud variable con una longitud mxima de 231 - 1 (2.147.483.647) bytes.
Una referencia a un cursor.
Un tipo de datos que almacena valores de varios tipos de datos aceptados en SQL Server, excepto text,
ntext, timestamp y sql_variant.
Un tipo de datos especial que se utiliza para almacenar un conjunto de resultados para un proceso posterior.
Un nmero nico para toda la base de datos que se actualiza cada vez que se actualiza una fila.
Un identificador exclusivo global (GUID).

Smallmoney
Float
Real
Datetime
Smalldatetime
Char
Varchar
Text
Nchar
Nvarchar
Ntext
Binary
Varbinary
Image
Cursor
Sql_ variant
Table
Timestamp
uniqueidentifier

Sinnimos de tipos de datos con SQL 92.

14

AO 2003

Sinnimo

Tipo de datos asignado al sistema

Binary varying

Varbinary

char varying

Varchar

character

Char

character

char(1)

character(n)

char(n)

Todos los tipos de datos tienen acepciones diferentes segn el DBMS, esta es una tabla que nicamente sirve como gua genrica.

Pgina 89 de 96

SQL

Lic. Gustavo Rei


Sinnimo

Tipo de datos asignado al sistema

character varying(n)

varchar(n)

Dec

decimal

Double precision

float

float[(n)] para n = 1-7

real

float[(n)] para n = 8-15

float

integer

int

national character(n)

nchar(n)

national char(n)

nchar(n)

national character varying(n)

nvarchar(n)

national char varying(n)

nvarchar(n)

national text

ntext

rowversion

timestamp

Tipos de datos Oracle15


CHAR
NUMBER
INTEGER
DATE
LONG
RAW
LONGRAW

Mximo de 255. Por defecto 1.


Mximo de 105 dgitos. Por defecto 44.
Numrico sin decimal. Por defecto 38.
Hasta el 31 de diciembre de 4712.
Tipo caracter con tamao variable hasta 65535 bytes. Permite una sola columna LONG
por tabla. No se puede usar en subconsultas, funciones o ndices.
Dato en binario puro (imgenes y sonido) con un ancho mximo de 255.
Igual que LONG, pero para almacenar datos en binario puro.

Tipos de datos informix


CHAR (N):Definen una cadena de caracteres desde una posicin. A-32767
SMALLINT: Para un numero entero corto cuyo valor debe estar comprendido entre (+,-)32767
INTEGER: Define un numero entero largo, su valor esta comprendido entre(+,-) 2.150.000.000
DECIMAL (M,N): Permiten nmeros con fracciones decimales, el valor mximo de (M) que indica las posiciones del campo
es de 32 y (n) que indica posiciones decimales debe ser menor o igual que (M).
SMALLFLOAT: Para un numero corto en coma flotante, es equivalente a DECIMAL (8).
FLOAT: Para un numero en coma flotante largo. Es equivalente a DECIMAL(16).
SERIAL [(N)]: Indica un numero entero nico y secuencial que se incrementa de forma automtica por defecto. El valor
inicial es 1 a no ser que se le indique lo contrario. Slo puede haber uno por tabla.
MONEY (M,N): Albergan nmeros de tipo decimal con dos cifras despus de la coma para expresar una moneda (siempre
que no digamos lo contrario).
MONEY: Es equivalente a datos decimales. Money (8) decimal l (8 posiciones, 2 decimales).
DATE: Sirve para indicar un campo de fecha con el formato (dd-mm-AAAA).

Tipos de datos Acces16


Tipo de datos
BINARY

Tamao de almacenamiento
1 byte por carcter

BIT

1 byte

TINYINT

1 byte

AO 2003

Descripcin
Se puede almacenar cualquier tipo de datos en un campo de este
tipo. Los datos no se traducen (por ejemplo, a texto). La forma en
que se introducen los datos en un campo binario indica cmo aparecern al mostrarlos.
Valores S y No, y campos que contienen solamente uno de dos
valores.
Un nmero entero entre 0 y 255.

15

Oracle 7 Manual de Referencia, Koch, George., Osborne/McGraw-Hill, 1994

16

La presente corresponde a Acces 2000

Pgina 90 de 96

SQL
Tipo de datos
MONEY

Lic. Gustavo Rei


Tamao de almacenamiento
8 bytes

DATETIME
8 bytes
(Vea DOUBLE)
UNIQUEIDENTIFIER 128 bits
REAL

FLOAT

SMALLINT
INTEGER
DECIMAL

TEXT
IMAGE
CHARACTER

AO 2003

Descripcin
Un nmero entero comprendido entre
922.337.203.685.477,5808 y 922.337.203.685.477,5807.
Una valor de fecha u hora entre los aos 100 y 9999

Un nmero de identificacin nico utilizado con llamadas a procedimientos remotos.


4 bytes
Un valor de coma flotante de precisin simple con un intervalo comprendido entre 3,402823E38 y 1,401298E-45 para valores negativos, y desde 1,401298E-45 a 3,402823E38 para valores positivos,
y 0.
8 bytes
Un valor de coma flotante de precisin doble con un intervalo comprendido entre 1,79769313486232E308 y 4,94065645841247E324 para valores negativos, y desde 4,94065645841247E-324 a
1,79769313486232E308 para valores positivos, y 0.
2 bytes
Un entero de tipo Short (corto) entre 32.768 y 32.767. (Consulte
las notas).
4 bytes
Un entero de tipo Long (largo) entre 2.147.483.648 y
2.147.483.647. (Consulte las notas).
17 bytes
Un tipo de datos numrico exacto con valores comprendidos entre
1028 - 1 y - 1028 - 1. Puede definir la precisin (1 - 28) y la escala (0
- precisin definida). La precisin y la escala predeterminadas son
18 y 0, respectivamente.
2 bytes por carcter. (Consulte Desde cero hasta un mximo de 2.14 gigabytes.
las notas).
Lo que se requiera
Desde cero hasta un mximo de 2.14 gigabytes. Se utiliza para
objetos OLE.
2 bytes por carcter. (Consulte Desde cero a 255 caracteres.
las notas).

Pgina 91 de 96

SQL

Lic. Gustavo Rei

NOTA DEL AUTOR............................................................................................................................................................................................ 1


CAPITULO 1 CONCEPTOS GENERALES .................................................................................................................................................. 2
BASE DE DATOS Y MODELOS DE DATOS: .......................................................................................................................................................... 2
Objetivos de los sistemas de gestin de base de datos:................................................................................................................................... 2
Sublenguajes Del SQL.:.................................................................................................................................................................................. 2
Objetivos S.G.B.D.: ........................................................................................................................................................................................ 2
Gestin De Los Accesos Concurrentes:.......................................................................................................................................................... 2
CONCEPCIN DE UNA BASE DE DATOS: ............................................................................................................................................................... 2
PROBLEMAS ADQUIRIDOS POR UNA MALA CONCEPCIN DE UNA BASE DE DATOS: .............................................................................................. 2
ESTRUCTURA BSICA DEL LENGUAJE DE PROGRAMACIN SQL.:........................................................................................................................ 3
QU ES EL SQL? ............................................................................................................................................................................................... 3
CARACTERSTICAS DEL LENGUAJE ...................................................................................................................................................................... 3
EXISTE UN SOLO SQL?...................................................................................................................................................................................... 3
COMPOSICIN DEL LENGUAJE............................................................................................................................................................................. 4
CAPITULO 2 INTRODUCCIN AL LENGUAJE........................................................................................................................................ 5
PRIMEROS COMANDOS ........................................................................................................................................................................................ 5
CONSULTAS SIMPLES .......................................................................................................................................................................................... 5
select............................................................................................................................................................................................................... 5
from ................................................................................................................................................................................................................ 5
FROM especificacin de tabla........................................................................................................................................................................ 5
alias de tabla .................................................................................................................................................................................................. 5
IN.................................................................................................................................................................................................................... 6
Columnas (campos) ........................................................................................................................................................................................ 6
asterisco ......................................................................................................................................................................................................... 6
Alias de columna. ........................................................................................................................................................................................... 6
Columnas calculadas...................................................................................................................................................................................... 6
Formar expresiones........................................................................................................................................................................................ 6
Operadores..................................................................................................................................................................................................... 6
Access......................................................................................................................................................................................................... 6
SQL Server ................................................................................................................................................................................................. 7
Operadores aritmticos ........................................................................................................................................................................... 7
Operadores BIT a BIT ............................................................................................................................................................................ 7
Operadores de comparacin.................................................................................................................................................................... 7
Operadores lgicos ................................................................................................................................................................................. 8
Funciones.................................................................................................................................................................................................... 8
Access..................................................................................................................................................................................................... 8
SQL Server ............................................................................................................................................................................................. 8
Funciones de agregado........................................................................................................................................................................ 8
Funciones de fecha y hora................................................................................................................................................................... 8
Funciones matemticas ....................................................................................................................................................................... 9
Funciones de cadena ........................................................................................................................................................................... 9
Observaciones:........................................................................................................................................................................................ 9
ORDENACIN DE LAS FILAS - ORDER BY ........................................................................................................................................................... 9
EJEMPLOS DE SELECT: ........................................................................................................................................................................................ 9
SELECCIN DE FILAS LAS CLUSULAS DISTINCT / ALL ................................................................................................................................. 10
LA CLUSULA TOP........................................................................................................................................................................................... 10
LA CLUSULA WHERE .................................................................................................................................................................................... 10
Operador AND ............................................................................................................................................................................................. 11
Operador OR................................................................................................................................................................................................ 11
Operador NOT. ............................................................................................................................................................................................ 11
CONDICIONES DE SELECCIN ............................................................................................................................................................................ 11
El test de comparacin. ................................................................................................................................................................................ 11
AO 2003

Pgina 92 de 96

SQL

Lic. Gustavo Rei


Test de rango (BETWEEN)........................................................................................................................................................................... 11
Test de pertenencia a conjunto (IN).............................................................................................................................................................. 11
Test de valor nulo (IS NULL) ....................................................................................................................................................................... 11
Test de correspondencia con patrn (LIKE)................................................................................................................................................. 12
Resumen Operadores.................................................................................................................................................................................... 12
CAPITULO 3 LAS CONSULTAS MULTITABLA ..................................................................................................................................... 14
CONCEPTOS GENERALES .................................................................................................................................................................................. 14
La unin de tablas ........................................................................................................................................................................................ 14
La composicin de tablas ............................................................................................................................................................................. 14
APLICACIN DE LOS CONCEPTOS GENERALES .................................................................................................................................................. 15
El operador UNION ..................................................................................................................................................................................... 15
El producto cartesiano ................................................................................................................................................................................. 16
CAPITULO 4 COMPOSICIONES EFICIENTES ....................................................................................................................................... 18
EL INNER JOIN ............................................................................................................................................................................................... 18
EL LEFT JOIN Y RIGHT JOIN......................................................................................................................................................................... 18
EXPLICACIN DE SQL SERVER ..................................................................................................................................................................... 20
Columnas de combinacin............................................................................................................................................................................ 20
Columnas relacionadas ................................................................................................................................................................................ 20
Columnas no relacionadas ........................................................................................................................................................................... 21
Tipos de combinaciones................................................................................................................................................................................ 21
Combinacin interna................................................................................................................................................................................. 21
Combinacin externa ................................................................................................................................................................................ 21
Combinacin externa izquierda ............................................................................................................................................................ 21
Combinacin externa derecha............................................................................................................................................................... 21
Combinacin externa completa............................................................................................................................................................. 22
Combinacin cruzada ........................................................................................................................................................................... 22
Operadores de comparacin JOIN ............................................................................................................................................................ 22
Coincidencia en igualdad...................................................................................................................................................................... 22
Otros ..................................................................................................................................................................................................... 22
Combinar tres o ms tablas....................................................................................................................................................................... 22
Utilizar una tabla slo para combinar otras tablas..................................................................................................................................... 22
Utilizar una tabla dos veces en una consulta............................................................................................................................................. 23
Utilizar otro elemento en lugar de una tabla ............................................................................................................................................. 23
CAPTULO 5. LAS CONSULTAS DE RESUMEN ........................................................................................................................................ 24
INTRODUCCIN ................................................................................................................................................................................................. 24
FUNCIONES DE COLUMNA ................................................................................................................................................................................. 24
Seleccin en el origen de datos..................................................................................................................................................................... 26
Origen mltiple............................................................................................................................................................................................. 26
LA CLUSULA GROUP BY............................................................................................................................................................................... 27
LA CLUSULA HAVING................................................................................................................................................................................... 28
RESUMEN DEL TEMA ......................................................................................................................................................................................... 28
CAPTULO 6. LAS SUBCONSULTAS............................................................................................................................................................ 30
DEFINICIONES ................................................................................................................................................................................................... 30
REFERENCIAS EXTERNAS .................................................................................................................................................................................. 30
Qu pasa cuando se ejecuta la consulta principal?.................................................................................................................................... 30
ANIDAR SUBCONSULTAS ................................................................................................................................................................................... 30
SUBCONSULTA EN LA LISTA DE SELECCIN....................................................................................................................................................... 31
EN LA CLUSULA FROM .................................................................................................................................................................................. 31
SUBCONSULTA EN LAS CLUSULAS WHERE Y HAVING ................................................................................................................................ 31
CONDICIONES DE SELECCIN CON SUBCONSULTAS ........................................................................................................................................... 31
El test de comparacin con subconsulta....................................................................................................................................................... 32
La sintaxis es la siguiente:............................................................................................................................................................................ 32

AO 2003

Pgina 93 de 96

SQL

Lic. Gustavo Rei


El test de comparacin cuantificada.......................................................................................................................................................... 32
El test ANY. ......................................................................................................................................................................................... 32
El test ALL. .......................................................................................................................................................................................... 32
Test de pertenencia a conjunto (IN). ..................................................................................................................................................... 33
El test de existencia EXISTS. ............................................................................................................................................................... 33
Resumen del tema..................................................................................................................................................................................... 33
CAPTULO 7: ACTUALIZACIN DE DATOS............................................................................................................................................. 35
INTRODUCCIN ................................................................................................................................................................................................. 35
PARA ACCESS ................................................................................................................................................................................................... 35
Insertar una fila INSERT INTO...VALUES ................................................................................................................................................... 35
Errores que se pueden producir cuando se ejecuta la sentencia INSERT INTO(Con Access):..................................................................... 36
PARA SQL SERVER ........................................................................................................................................................................................... 36
Agregar filas con INSERT ............................................................................................................................................................................ 36
INSERTAR VARIAS FILAS INSERT INTO...SELECT ......................................................................................................................................... 37
INSERTAR FILAS EN UNA NUEVA TABLA SELECT ... INTO............................................................................................................................... 38
MODIFICAR EL CONTENIDO DE LAS FILAS ( UPDATE )..................................................................................................................................... 38
La instruccin UPDATE tiene estas clusulas principales:.......................................................................................................................... 39
SET........................................................................................................................................................................................................... 39
FROM....................................................................................................................................................................................................... 39
WHERE.................................................................................................................................................................................................... 39
Utilizar una instruccin UPDATE simple..................................................................................................................................................... 40
Utilizar la instruccin UPDATE con informacin de otra tabla................................................................................................................... 40
Utilizar UPDATE con la clusula TOP en una instruccin SELECT ........................................................................................................... 41
BORRAR FILAS (DELETE) ................................................................................................................................................................................ 41
Resumen del tema ......................................................................................................................................................................................... 41
Ejemplos de SQL Server ............................................................................................................................................................................... 42
Utilizar DELETE sin parmetros.............................................................................................................................................................. 42
Utilizar DELETE en un conjunto de filas ................................................................................................................................................. 42
Utilizar DELETE en la fila actual de un cursor ........................................................................................................................................ 43
Utilizar la instruccin DELETE basada en una subconsulta o utilizar la extensin de Transact-SQL ...................................................... 43
Utilizar DELETE y SELECT con la clusula TOP................................................................................................................................... 43
CAPTULO 8: EL DDL (L. DEFINICIN DE DATOS)................................................................................................................................ 44
CREATE DATABASE..................................................................................................................................................................................... 44
CREATE TABLE............................................................................................................................................................................................. 46
Restricciones PRIMARY KEY....................................................................................................................................................................... 48
Restricciones UNIQUE................................................................................................................................................................................. 48
Restricciones FOREIGN KEY ...................................................................................................................................................................... 49
Ejemplos....................................................................................................................................................................................................... 49
Utilizar restricciones PRIMARY KEY ..................................................................................................................................................... 49
Utilizar restricciones FOREIGN KEY...................................................................................................................................................... 49
Utilizar restricciones UNIQUE................................................................................................................................................................. 50
Utilizar restricciones CHECK................................................................................................................................................................... 50
Definiciones de tablas completas.............................................................................................................................................................. 50
Utilizar una expresin para una columna calculada .................................................................................................................................. 51
Restricciones CHECK .................................................................................................................................................................................. 51
ALTER TABLE.................................................................................................................................................................................................... 52
DROP TABLE.................................................................................................................................................................................................. 53
CREATE INDEX ............................................................................................................................................................................................. 53
DROP INDEX .................................................................................................................................................................................................. 54
CAPTULO 9: AVANZADOS........................................................................................................................................................................... 55
CLUSTERED | NONCLUSTERED:.......................................................................................................................................................................... 55
FUNCIONES DE FECHA ....................................................................................................................................................................................... 55
DATEADD.................................................................................................................................................................................................... 55

AO 2003

Pgina 94 de 96

SQL

Lic. Gustavo Rei


DATEDIFF................................................................................................................................................................................................... 56
DATENAME ................................................................................................................................................................................................. 57
DATEPART .................................................................................................................................................................................................. 57
DAY .............................................................................................................................................................................................................. 58
SUBSTRING.................................................................................................................................................................................................... 58
Sintaxis ......................................................................................................................................................................................................... 58
Argumentos................................................................................................................................................................................................... 58
Ejemplos....................................................................................................................................................................................................... 59
Utilizar SUBSTRING con una cadena de caracteres ................................................................................................................................ 59
Utilizar SUBSTRING con datos de tipo text, ntext e image ..................................................................................................................... 59
CONVERSIN DE TIPOS DE DATOS ..................................................................................................................................................................... 60
CAST y CONVERT ....................................................................................................................................................................................... 61
Ejemplos....................................................................................................................................................................................................... 62
CASE ............................................................................................................................................................................................................... 63
Ejemplos....................................................................................................................................................................................................... 64
REVERSE ........................................................................................................................................................................................................ 66
RIGHT ............................................................................................................................................................................................................. 66
RTRIM ............................................................................................................................................................................................................. 67
LTRIM ............................................................................................................................................................................................................. 67
LOWER............................................................................................................................................................................................................ 67
LEFT ................................................................................................................................................................................................................ 67
ATN2 ............................................................................................................................................................................................................... 68
UPPER ............................................................................................................................................................................................................. 68
REPLICATE .................................................................................................................................................................................................... 68
COMPUTE / COMPUTE BY .................................................................................................................................................................................. 68
Conjuntos de resultados generados por COMPUTE .................................................................................................................................... 68
Ejemplos de COMPUTE............................................................................................................................................................................... 69
Comparar COMPUTE con GROUP BY ....................................................................................................................................................... 69
ELSE (IF...ELSE)............................................................................................................................................................................................. 70
IF...ELSE.......................................................................................................................................................................................................... 70
Utilizar un bloque IF...ELSE ........................................................................................................................................................................ 70
Utilizar ms de un bloque IF...ELSE ............................................................................................................................................................ 71
END (BEGIN...END).................................................................................................................................................................................... 71
WHILE............................................................................................................................................................................................................. 72
Utilizar BREAK y CONTINUE con IF...ELSE y WHILE anidados............................................................................................................... 72
Utilizar WHILE en un procedimiento con cursores ...................................................................................................................................... 73
GROUPING ..................................................................................................................................................................................................... 73
ROLLUP .......................................................................................................................................................................................................... 73
CUBE ............................................................................................................................................................................................................... 74
Cubos multidimensionales ............................................................................................................................................................................ 76
INFORMES DE TABLAS DE REFERENCIAS CRUZADAS .......................................................................................................................................... 76
ANEXO 1 PRCTICOS ................................................................................................................................................................................. 79
Trabajo prctico sql (1)............................................................................................................................................................................. 79
Trabajo prctico sql (2)............................................................................................................................................................................. 79
Trabajo prctico sql (3)............................................................................................................................................................................. 80
Trabajo prctico sql (4) Compendio con problemas ................................................................................................................................. 81
Trabajo prctico sql (5)............................................................................................................................................................................. 82
Trabajo prctico sql (6)............................................................................................................................................................................. 82
Trabajo prctico sql (7)............................................................................................................................................................................. 83
Trabajo prctico sql (8) Compendio con problemas- Segunda Parte......................................................................................................... 83
ANEXO 2 TIPOS DE DATOS........................................................................................................................................................................ 89
TIPOS DE DATOS SQL SERVER................................................................................................................................................................... 89
SINNIMOS DE TIPOS DE DATOS CON SQL 92.................................................................................................................................................... 89

AO 2003

Pgina 95 de 96

SQL

Lic. Gustavo Rei


TIPOS DE DATOS ORACLE .................................................................................................................................................................................. 90
TIPOS DE DATOS INFORMIX ............................................................................................................................................................................... 90
TIPOS DE DATOS ACCES .................................................................................................................................................................................... 90
NDICE ............................................................................................................................................................................................................... 92

AO 2003

Pgina 96 de 96

Das könnte Ihnen auch gefallen