Beruflich Dokumente
Kultur Dokumente
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
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 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
Pgina 2 de 96
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.
Pgina 3 de 96
SQL
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.
1
2
AO 2003
SQL
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:
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
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
Pgina 6 de 96
SQL
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.
Significado
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
bit
int
smallint
tinyint
varbinary
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
Menor que
No es igual a
Pgina 7 de 96
SQL
Significado
!= (no es igual a)
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
AND
ANY
BETWEEN
EXISTS
IN
LIKE
NOT
OR
SOME
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
Pgina 8 de 96
SQL
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.
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
SQL
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
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
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
NULL
FALSE NULL
OPERADOR OR.
El resultado es verdadero si al menos una de las dos condiciones es verdadera.
OR
TRUE
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
valor
de
la
expresin
est
comprendido
entre
los
dos
valores
definidos
por
exp1
exp2.
AO 2003
Pgina 11 de 96
SQL
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.
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
ANY SOME
ALL
EXISTS
IS [NOT] NULL
NOT IN
Propsito
Ejemplo
Igual a:
deptno != 5 AND
deptno != 15 AND
deptno != null
AO 2003
Pgina 13 de 96
SQL
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
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
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
Pgina 15 de 96
SQL
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
Pgina 16 de 96
SQL
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
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
AO 2003
Pgina 18 de 96
SQL
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
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".
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
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
AO 2003
Pgina 21 de 96
SQL
Pgina 22 de 96
SQL
AO 2003
Pgina 23 de 96
SQL
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
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
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
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
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
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
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 $.
Pgina 28 de 96
SQL
AO 2003
Pgina 29 de 96
SQL
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).
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
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).
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.
AO 2003
Pgina 31 de 96
SQL
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 .
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 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
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
Pgina 33 de 96
SQL
AO 2003
Pgina 34 de 96
SQL
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
Pgina 35 de 96
SQL
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
Pgina 36 de 96
SQL
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
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
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
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
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
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.
AO 2003
Pgina 40 de 96
SQL
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
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.
Pgina 41 de 96
SQL
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.
Pgina 42 de 96
SQL
AO 2003
Pgina 43 de 96
SQL
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
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
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:
AO 2003
Pgina 46 de 96
SQL
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
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 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
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
AO 2003
Pgina 49 de 96
SQL
Pgina 50 de 96
SQL
/* 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')
)
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
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
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
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
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
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
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
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
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)
AO 2003
Pgina 59 de 96
SQL
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
AO 2003
Pgina 60 de 96
SQL
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
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)
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
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
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
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
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
Pgina 65 de 96
SQL
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
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
Pgina 67 de 96
SQL
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.
Pgina 68 de 96
SQL
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.
AO 2003
Pgina 69 de 96
SQL
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
Pgina 70 de 96
SQL
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
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
Pgina 72 de 96
SQL
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
Red
Blue
Red
223
101
210
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
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
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)
Pgina 76 de 96
SQL
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
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
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
AO 2003
SQL
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
Pgina 80 de 96
SQL
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).
AO 2003
Pgina 81 de 96
SQL
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.
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
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
AO 2003
Pgina 83 de 96
SQL
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
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
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.
Pgina 86 de 96
SQL
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.
Pgina 87 de 96
SQL
AO 2003
Pgina 88 de 96
SQL
numric
Money
Smallmoney
Float
Real
Datetime
Smalldatetime
Char
Varchar
Text
Nchar
Nvarchar
Ntext
Binary
Varbinary
Image
Cursor
Sql_ variant
Table
Timestamp
uniqueidentifier
14
AO 2003
Sinnimo
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
character varying(n)
varchar(n)
Dec
decimal
Double precision
float
real
float
integer
int
national character(n)
nchar(n)
national char(n)
nchar(n)
nvarchar(n)
nvarchar(n)
national text
ntext
rowversion
timestamp
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
16
Pgina 90 de 96
SQL
Tipo de datos
MONEY
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
Pgina 91 de 96
SQL
Pgina 92 de 96
SQL
AO 2003
Pgina 93 de 96
SQL
AO 2003
Pgina 94 de 96
SQL
AO 2003
Pgina 95 de 96
SQL
AO 2003
Pgina 96 de 96