Documente Academic
Documente Profesional
Documente Cultură
Estudiante:_______________________________________
Codigo:_____________
Fecha: _________________________
En este caso el sistema tiene el mecanismo de transacciones para evitar este error. Las
operaciones se incluyen las dos en una misma transaccin y as el sistema sabe que las tiene
que ejecutar las dos, si por lo que sea no se pueden ejecutar las dos, se encarga de deshacer
los cambios que se hubiesen producido para no ejecutar ninguna.
Las instrucciones que gestionan las autorizaciones sern utilizadas normalmente por
el administrador mientras que las otras, referentes a proceso de transacciones sern utilizadas
tambin por los programadores.
No todos los sistemas disponen de ellas.
El DML se compone de las instrucciones para el manejo de los datos, para insertar nuevos
datos, modificar datos existentes, para eliminar datos y la ms utilizada, para recuperar datos
de la base de datos. Veremos que una sola instruccin de recuperacin de datos es tan
potente que permite recuperar datos de varias tablas a la vez, realizar clculos sobre estos
datos y obtener resmenes.
El DML interacta con el nivel externo de la base de datos por lo que sus instrucciones son
muy parecidas, por no decir casi idnticas, de un sistema a otro, el usuario slo indica lo que
quiere recuperar no cmo se tiene que recuperar, no influye el cmo estn almacenados los
datos.
Es el lenguaje que utilizan los programadores y los usuarios de la base de datos.
A lo largo del curso se explicarn cada una de las formas de explotacin de la base de datos.
Dependiendo de tu perfil profesional (programador o administrador) o de tu inters personal
te resultar ms til un bloque u otro.
Como hemos dicho, el sistema gestor de base de datos SQL-Server 2005 utiliza su propia
versin del lenguaje SQL, el TRANSACT-SQL.
TRANSACT-SQL es un lenguaje muy potente que nos permite definir casi cualquier tarea que
queramos efectuar sobre la base de datos. En este tema veremos que TRANSACT-SQL va ms
all de un lenguaje SQL cualquiera ya que incluye caractersticas propias de cualquier lenguaje
de programacin, caractersticas que nos permiten definir la lgica necesaria para el
tratamiento de la informacin:
Tipos de datos.
Definicin de variables.
Estructuras de control de flujo.
Gestin de excepciones.
Funciones predefinidas.
Sin embargo no permite:
Crear interfaces de usuario.
Crear aplicaciones ejecutables, sino elementos que en algn momento llegarn al
servidor de datos y sern ejecutados.
Debido a estas restricciones se emplea generalmente para crear procedimientos almacenados,
triggers y funciones de usuario.
Puede ser utilizado como cualquier SQL como lenguaje embebido en aplicaciones
desarrolladas en otros lenguajes de programacin como Visual Basic, C, Java, etc. Y por
supuesto los lenguajes incluidos en la plataforma .NET.
Tambin lo podremos ejecutar directamente de manera interactiva, por ejemplo desde el
editor de consultas de SSMS (SQL Server Management Studio) el entorno de gestin que ya
conocemos. Esta es la forma en que lo utilizaremos nosotros.
Motor de Base de Datos Pgina 3
Nota: Material tomado de Aulaclic.es Derechos Reservados
MOTOR DE BASE DE DATOS ORACLE
DOCENTE: DAIRO RODRIGUEZ BLANCO
ANLISIS Y PROGRAMACION DE COMPUTADORES
TIPOS DE DATOS
En SQL Server 2005, cada columna, expresin, variable y parmetro est asociado a un tipo de
datos.
Un tipo de datos, realmente define el conjunto de valores vlidos para los campos definidos de
ese tipo. Indica si el campo puede contener: datos numricos, de caracteres, moneda, fecha y
hora, etc.
SQL Server proporciona un conjunto de tipos de datos del sistema que define todos los tipos
de datos que pueden utilizarse. Tambin podemos definir nuestros propios tipos de datos en
Transact-SQL o Microsoft .NET Framework.
Los tipos de datos ms utilizados son:
Los numricos: int, decimal, money
Los de fecha y hora: datetime
Y las cadenas de caracteres: varchar
LAS CONSTANTES
Una constante es un valor especfico o un smbolo que representa un valor de dato especfico.
El formato de las constantes depende del tipo de datos del valor que representan. En este
apartado veremos las ms utilizadas.
Las constantes numricas se escriben mediante una cadena de nmeros, con la
consideracin de que el separador decimal es un punto, no una coma, y que si se trata
de un valor monetario deberemos incluir la moneda al inicio de la constante. Por
ejemplo: 85.90 y85.90, el primero sera un valor decimal y el segundo un
valor money. De forma predeterminada, los valores sern positivos. Para indicar lo
contrario escribimos el signo - al principio.
Las constantes de fecha y hora van entre comillas simples y con un formato de fecha y
hora adecuado. Por ejemplo: '03/10/90'.
Y las constantes en cadenas de caracteres van entre comillas simples. Por
ejemplo: 'Juan Garca Lpez'.
Para indicar valores negativos y positivos aadimos el prefijo + o - segn sea el valor positivo o
negativo. Sin prefijo se entiende que el valor es positivo.
LAS EXPRESIONES
Una expresin es una combinacin de smbolos y operadores que el motor de base de datos
de SQL Server evala para obtener un nico valor. Una expresin simple puede ser una sola
constante, variable, columna o funcin escalar. Los operadores se pueden usar para combinar
dos o ms expresiones simples y formar una expresin compleja.
Dos expresiones pueden combinarse mediante un operador si ambas tienen tipos de datos
admitidos por el operador y se cumple al menos una de estas condiciones:
Las expresiones tienen el mismo tipo de datos.
El tipo de datos de menor prioridad se puede convertir implcitamente al tipo de datos
de mayor prioridad.
La funcin CAST puede convertir explcitamente el tipo de datos con menor prioridad
al tipo de datos con mayor prioridad o a un tipo de datos intermedio que pueda
convertirse implcitamente al tipo de datos con la mayor prioridad.
Tipos de operadores:
- Operadores numricos:
suma +
resta -
multiplicacin *
divisin /
mdulo
%
(resto de una divisin)
- Operadores bit a bit: realizan manipulaciones de bits entre dos expresiones de cualquiera de
los tipos de datos de la categora del tipo de datos entero.
AND &
OR |
OR exclusivo ^
- Operadores de comparacin:
Igual a =
Mayor que >
Menor que <
Mayor o igual que >=
Menor o igual que <=
Distinto de <>
No es igual a !=
No menor que !<
No mayor que !>
- Operadores lgicos:
Aqu slo los nombraremos ya que en el tema de consultas simples los veremos en detalle.
ALL IN
AND LIKE
ANY NOT
BETWEEN OR
EXISTS SOME
- Operadores de cadenas:
Concatenacin +
Resultados de la expresin
- Si se combinan dos expresiones mediante operadores de comparacin o lgicos, el tipo de
datos resultante es booleano y el valor es uno de los siguientes: TRUE, FALSE o UNKNOWN.
- Cuando dos expresiones se combinan mediante operadores aritmticos, bit a bit o de cadena,
el operador determina el tipo de datos resultante.
Las expresiones complejas formadas por varios smbolos y operadores se evalan como un
resultado formado por un solo valor. El tipo de datos, intercalacin, precisin y valor de la
expresin resultante se determina al combinar las expresiones componentes de dos en dos,
hasta que se alcanza un resultado final. La prioridad de los operadores de la expresin define
la secuencia en que se combinan las expresiones.
FUNCIONES
SQL Server 2005 proporciona numerosas funciones integradas y permite crear funciones
definidas por el usuario.
Existen diferentes tipos de funciones:
Funciones de conjuntos de filas: devuelven un objeto que se puede utilizar, en
instrucciones Transact-SQL, en lugar de una referencia a una tabla.
Funciones de agregado (tambin llamadas funciones de columna): Operan sobre una
coleccin de valores y devuelven un solo valor de resumen. Por ejemplo, la funcin
de suma sobre la columna importe para conocer el importe total: SUM(importe)
Funciones de categora: Devuelven un valor de categora para cada fila de un conjunto
de filas, por ejemplo devuelve el nmero de la fila, el ranking de la fila en una
determinada ordenacin, etc.
Funciones escalares: Operan sobre un valor y despus devuelven otro valor. Son las
funciones que estamos acostumbrados a utilizar. Las funciones escalares se clasifican
segn el tipo de datos de sus operandos
LAS VARIABLES
En Transact-SQL podemos definir variables, que sern de un tipo de datos determinado, como
tipos de datos podemos utilizar los propios de la base de datos SQL-SERVER, pero tambin
podemos utilizar tipos propios del lenguaje que no pueden ser utilizados en DDL. El tipo Cursor
y el tipo Table son dos de estos tipos.
Las variables se definen utilizando la instruccin DECLARE con el siguiente formato:
DECLARE @nbvariable tipo
El nombre de la variable debe empezar por el smbolo @, este smbolo hace que SQL
interprete el nombre como un nombre de variable y no un nombre de objeto de la base de
datos.
Por ejemplo: DECLARE @empleados INT
Con esto hemos definido la variable @empleados de tipo entero.
Para asignar un valor a una variable, la asignacin se realiza con la palabra SELECT y el signo
igual con el formato:
SELECT @nbvariable = valor
El valor puede ser cualquier valor constante, otro nombre de variable, una expresin vlida o
algo ms potente, parte de una sentencia SELECT de SQL.
Por ejemplo:
SELECT @empleados = 0;
SELECT @empleados = @otra * 100;
SELECT @EMPLEADOS = COUNT(numemp) FROM empleados;
El valor almacenado en la variable se puede visualizar mediante la orden PRINT. o SELECT
PRINT @nbvariable o SELECT @nbvariable
El valor almacenado en la variable se visualizar en la pestaa de resultados. Tambin se
puede usar para escribir mensajes:
PRINT 'Este es el mensaje'
Otros elementos del lenguaje
CONSULTAS SIMPLES
Introduccin
Vamos a empezar por la instruccin que ms se utiliza en SQL, la sentencia SELECT. La
sentencia SELECT es, con diferencia, la ms compleja y potente de las sentencias SQL, con ella
podemos recuperar datos de una o ms tablas, seleccionar ciertos registros e incluso obtener
resmenes de los datos almacenados en la base de datos. Es tan compleja que la estudiaremos
a lo largo de varias unidades didcticas incorporando poco a poco nuevas funcionalidades.
El resultado de una SELECT es una tabla lgica que alberga las filas resultantes de la ejecucin
de la sentencia.
La sintaxis completa es la siguiente:
SELECT sentencia::=[WITH <expresion_tabla_comun> [,...n]]
<expresion_consulta>
[ORDER BY {expression_columna|posicion_columna [ASC|DESC] }
[ ,...n ]]
[COMPUTE
{{AVG|COUNT|MAX|MIN|SUM} (expression)}[ ,...n ] [BY expression[ ,...n ]]
]
[<FOR clausula_for>]
[OPTION (<query_hint>[ ,...n ])]
<expresion_consulta> ::=
{<especificacion_consulta> | ( < expresion_consulta > ) }
[ {UNION [ALL]|EXCEPT|INTERSECT}
<especificacion_consulta> | (<expresion_consulta>) [...n ]
]
<especificacion_consulta> ::=
SELECT [ALL|DISTINCT]
[TOP expresion [PERCENT] [WITH TIES] ]
<lista_seleccion>
[INTO nueva_tabla]
[FROM { <origen> } [ ,...n ] ]
[WHERE <condicion_busqueda> ]
[GROUP BY [ ALL ] expresion_agrupacion [ ,...n ]
[WITH { CUBE | ROLLUP } ]
]
[HAVING < condicion_busqueda > ]
Debido a la complejidad de la sentencia (en la sintaxis anterior no se han detallado algunos
elementos), la iremos viendo poco a poco, empezaremos por ver consultas bsicas para luego
ir aadiendo ms clusulas.
Empezaremos por ver las consultas ms simples, basadas en una sola tabla y nos limitaremos a
la siguiente sintaxis:
SELECT [ALL|DISTINCT]
[TOP expresion [PERCENT] [WITH TIES]]
<lista_seleccion>
FROM <origen>
[WHERE <condicion_busqueda> ]
Motor de Base de Datos Pgina 11
Nota: Material tomado de Aulaclic.es Derechos Reservados
MOTOR DE BASE DE DATOS ORACLE
DOCENTE: DAIRO RODRIGUEZ BLANCO
ANLISIS Y PROGRAMACION DE COMPUTADORES
LA LISTA DE SELECCIN
En la lista de seleccin <lista_seleccion> indicamos las columnas que se tienen que visualizar
en el resultado de la consulta.
<lista_seleccion> ::=
{ *
| {nombre_tabla|nombre_vista|alias_tabla}.*
| { [{nombre_tabla|nombre_vista|alias_tabla}.]
{nb_columna|$IDENTITY|$ROWGUID}
|<expresion>
}[[AS] alias_columna]
| alias_columna = <expresion>
} [ ,...n ]
Separamos la definicin de cada columna por una coma y las columnas del resultado
aparecern en el mismo orden que en la lista de seleccin.
Para cada columna del resultado su tipo de datos, tamao, precisin y escala son los mismos
que los de la expresin que da origen a esa columna.
Podemos definir las columnas del resultado de varias formas, mediante:
Una expresin simple:
o una referencia a una funcin.
o una variable local
o una constante
o una columna del origen de datos,
Una subconsulta escalar, que es otra instruccin SELECT que devuelve un nico valor
y se evala para cada fila del origen de datos (esto no lo veremos de momento).
Una expresin compleja generada al usar operadores en una o ms expresiones
simples.
La palabra clave *.
La asignacin de variables con el formato @variable_local = expresin.
La palabra clave $IDENTITY.
La palabra clave $ROWGUID.
El resultado sera:
nombre oficina contrato
Antonio Viguer 12 1986-10-20
Alvaro Jaumes 21 1986-12-10
Juan Rovira 12 1987-03-01
Jos Gonzlez 12 1987-05-19
Vicente Pantalla 13 1988-02-12
Luis Antonio 11 1988-06-14
ALIAS DE COLUMNA
Por defecto, en el encabezado de cada columna del resultado, aparece el nombre de la
columna origen, pero esto se puede cambiar definiendo un alias de columna, el alias de
columna es un nombre alternativo que se le da a esa columna.
El alias de columna se indica mediante la clusula AS. Se escribe el nuevo texto tal cual sin
comillas siguiendo las reglas de los identificadores.
Ejemplo:
SELECT numclie,nombre AS nombrecliente
FROM clientes;
El resultado ser :
Numclie nombrecliente
2101 Luis Garca Antn
2102 Alvaro Rodrguez
2103 Jaime Llorens
en vez de:
Numclie Nombre
2101 Luis Garca Antn
2102 Alvaro Rodrguez
2103 Jaime Llorens
La palabra AS es opcional.
SELECT numclie,nombre nombrecliente
FROM clientes;
Sera equivalente a la consulta anterior
Si queremos incluir espacios en blanco en el nombre lo debemos encerrar entre corchetes.
SELECT numclie,nombre AS [nombre cliente]
FROM clientes;
Nota importante: Este nombre de alias se podr utilizar en la lista de seleccin y en la clusula
ORDER BY pero no en la clusula WHERE.
FUNCIONES
Existen funciones que podemos utilizar en la lista de seleccin, e incluso en otras clusulas que
veremos ms adelante, como el WHERE. Las principales funciones son las siguientes:
Funciones de fecha:
Funcin Descripcin
GETDATE Devuelve la fecha actual.
GETUTCDATE Devuelve la hora UTC.
DATEPART Devuelve un entero que corresponde a la parte de la fecha solicitada.
DAY Devuelve el da de la fecha indicada.
MONTH Devuelve el mes de la fecha indicada.
YEAR Devuelve el ao de la fecha indicada.
Devuelve una cadena de caracteres que representa el valor de la unidad
DATENAME
especificada de una fecha especificada.
Devuelve un valor datetime nuevo que resulta de sumar un intervalo de
DATEADD
tiempo a una fecha especificada.>
DATEDIFF Devuelve el n de intervalos que hay entre dos fechas.
@@DATEFIRST Devuelve el primer da de la semana establecido con SET DATEFIRST.
SET DATEFIRST Establece el primer da de la semana en un nmero del 1 al 7.
Funciones de cadena:
Funcin Descripcin
Devuelve el valor de cdigo ASCII del carcter situado ms a la izquierda de
ASCII
una expresin de caracteres.
CHAR Devuelve el carcter ASCII del entero indicado.
NCHAR Devuelve el carcter Unicode del entero indicado.
UNICODE Devuelve el entero que se corresponde al carcter Unicode indicado.
Devuelve el total de caracteres de una cadena, excluidos los espacios en
LEN
blanco finales.
LTRIM Devuelve una cadena tras quitarle los espacios en blanco iniciales.
RTRIM Devuelve una cadena tras quitarle los espacios en blanco finales.
COLUMNAS CALCULADAS
Adems de las columnas que provienen directamente de la tabla origen, una consulta SQL
puede incluir columnas calculadas cuyos valores se evalan a partir de una expresin.
La expresin puede contener cualquier operador vlido (+, -, *, /, &), cualquier funcin
vlida, nombres de columnas del origen de datos, nombres de parmetros o constantes y para
combinar varias operaciones se pueden utilizar los parntesis.
Ejemplos de columnas calculadas:
Listar la ciudad, regin y el supervit de cada oficina. Consideraremos el supervit como el
volumen de ventas que se encuentran por encima o por debajo del objetivo de la oficina.
SELECT ciudad, region, (ventas-objetivo) AS superavit
FROM oficinas;
Motor de Base de Datos Pgina 16
Nota: Material tomado de Aulaclic.es Derechos Reservados
MOTOR DE BASE DE DATOS ORACLE
DOCENTE: DAIRO RODRIGUEZ BLANCO
ANLISIS Y PROGRAMACION DE COMPUTADORES
El resultado ser:
Listar las ventas en cada oficina con el formato: 22 tiene ventas de 186,042.00
SELECT oficina, 'tiene ventas de ' AS [ ], ventas
FROM oficinas;
Motor de Base de Datos Pgina 17
Nota: Material tomado de Aulaclic.es Derechos Reservados
MOTOR DE BASE DE DATOS ORACLE
DOCENTE: DAIRO RODRIGUEZ BLANCO
ANLISIS Y PROGRAMACION DE COMPUTADORES
El resultado sera:
oficina ventas
11 tiene ventas de 69300,00
12 tiene ventas de 73500,00
13 tiene ventas de 36800,00
21 tiene ventas de 83600,00
22 tiene ventas de 18600,00
23 tiene ventas de NULL
24 tiene ventas de 15000,00
26 tiene ventas de NULL
28 tiene ventas de 0,00
El incluir una constante como columna en la lista de seleccin puede parecer intil (se repetir
el mismo valor en todas las filas) pero veremos ms adelante que tiene utilidad en ciertos
casos.
Tambin podemos utilizar la sintaxis:
alias_columna = <expresion>
Ejemplo:
SELECT oficina, superavit = ventas-objetivo
Esto tiene el mismo efecto que
SELECT oficina, ventas-objetivo AS supervit
NULL
Si un mismo empleado dirige varias oficinas (por ejemplo el 108), su cdigo aparece repetido
en el resultado. Para evitarlo modificamos la consulta:
SELECT DISTINCT dir
FROM oficinas;
dir
NULL
104
105
106
108
Han desaparecido los valores duplicados.
Los que se eliminan son valores duplicados de filas del resultado, por ejemplo:
SELECT DISTINCT dir, region
FROM oficinas;
dir region
NULL este
NULL norte
104 este
105 este
106 este
108 centro
108 oeste
Ahora el 108 aparece dos veces porque las dos filas donde aparece no son iguales (porque
tienen distinta regin).
NOTA: La clusula DISTINCT hace que la consulta tarde algo ms en ejecutarse debido al
proceso adicional de buscar y eliminar las repeticiones, por lo que se aconseja utilizarla
nicamente cuando sea imprescindible.
LA CLUSULA TOP
La clusula TOP indica que en el resultado no deben aparecer todas las filas resultantes sino un
cierto nmero de registros, las n primeras. Si la consulta incluye la clusula ORDER BY, se
realiza la ordenacin antes de extraer los n primeros registros.
La expresin representa ese nmero n y debe devolver un nmero entero sin signo.
ORDER BY ventas;
ORDER BY ventas
Si existen ms registros con las mismas ventas que el ltimo valor de la lista, stos no saldrn
en el resultado de la consulta.
En el ejemplo el registro con cod = 2 no sale en el resultado y tiene las mismas ventas que cod
= 3.
Si queremos que salgan aadimos la clusula WITH TIES. La clusula WITH TIES slo se puede
emplear si la SELECT incluye un ORDER BY, de lo contrario dar error.
FROM productos
ORDER BY ventas
Obtenemos:
Se incluyen en el resultado todos los registros que tienen ventas iguales al ltimo registro.
Otro ejemplo:
FROM oficinas
ORDER BY ventas;
Devuelve las 10 peores oficinas en cuanto a ventas: ordenamos las oficinas por ventas de
menor a mayor y sacamos las 10 primeras.
FROM productos
ORDER BY ventas
Devuelve:
La clusula WHERE se emplea para especificar las filas que se desean recuperar del origen de
datos.
WHERE <condicion_bsqueda>
<condicion_bsqueda> ::=
{ [NOT]<predicado>
|(<condicion_bsqueda>)
[ ...n ]
En el resultado de la consulta slo aparecern las filas que cumplan que la condicin de
bsqueda sea TRUE, los valores NULL no se incluyen, por lo tanto, en las filas del resultado. La
condicin de bsqueda puede ser una condicin simple o una condicin compuesta por varias
condiciones (predicados) unidas por operadores AND y OR, no hay lmite en cuanto al nmero
de predicados que se pueden incluir. En las condiciones compuestas se pueden utilizar
parntesis para delimitar predicados y se aconseja su uso cuando se incluyen operadores AND
y OR en la misma condicin de bsqueda.
Predicados
Comparacin estndar
Si contiene (CONTAINS)
FREETEXT
Comparacin estndar.
Compara el valor de una expresin con el valor de otra. Para la comparacin se pueden
emplear = , <> , !=, < , <= , !<, > , >= ,!>
Sintaxis:
Un nombre de columna,
una constante,
una variable,
Ejemplo:
FROM empleados
Las columnas que aparecen en el WHERE no tienen por qu aparecer en la lista de seleccin,
esta instruccin es igual de vlida:
FROM empleados
FROM empleados
FROM empleados
Hallar oficinas cuyas ventas estn por debajo del 80% de su objetivo:
SELECT oficina
FROM oficinas
SELECT oficina
FROM oficinas
Examina si el valor de la expresin de test est en el rango delimitado por los valores
resultantes de expresion1 y expresion2, estos valores no tienen porqu estar ordenados en
ANSI/ISO; expresion1 debe ser menor o igual a expresion2.
FROM empleados
FROM empleados
Ejemplo:
FROM empleados
Una condicin de bsqueda puede ser TRUE, FALSE o NULL/UNKNOW, este ltimo caso se
produce cuando algn campo que interviene en la condicin tiene valor NULL.
A veces es til comprobar explcitamente los valores NULL en una condicin de bsqueda ya
que estas filas puede que queramos darles un tratamiento especial, para ello tenemos el
predicado IS NULL.
Este test produce un valor TRUE o FALSE, por lo que se podr combinar con otras condiciones.
El valor NULL no es en s un valor por eso no lo podemos utilizar en una igualdad.
SELECT numemp,nombre
FROM empleados
Esta instruccin no da error pero no obtiene lo que en principio parece que quiere obtener. No
obtenemos los empleados cuya oficina sea un valor nulo (es decir los empleados que no tienen
oficina), no obtenemos nada, en cambio los obtendremos utilizando el test de valor nulo:
FROM empleados
Resultado:
FROM empleados
Se utiliza cuando queremos comparar el valor de una columna con un patrn en el que se
utilice caracteres comodines.
Con expresin indicamos el valor a comparar (normalmente ser el nombre de una columna) y
patrn es la cadena que se busca. El patrn es de tipo texto y tiene que escribirse entre
comillas simples. Dentro del patrn podemos utilizar los siguientes comodines:
SELECT numemp,nombre
FROM empleados
Motor de Base de Datos Pgina 30
Nota: Material tomado de Aulaclic.es Derechos Reservados
MOTOR DE BASE DE DATOS ORACLE
DOCENTE: DAIRO RODRIGUEZ BLANCO
ANLISIS Y PROGRAMACION DE COMPUTADORES
numemp nombre
SELECT numemp,nombre
FROM empleados
numemp nombre
SELECT numemp,nombre
FROM empleados
numemp nombre
SELECT numemp,nombre
FROM empleados
numemp nombre
Obtiene los nombres cuya tercera letra sea una a (en el patrn tenemos dos caracteres
subrayado).
SELECT numemp,nombre
FROM empleados
Es equivalente a escribir:
SELECT numemp,nombre
FROM empleados
SELECT numemp,nombre
FROM empleados
SELECT numemp,nombre
FROM empleados
Es importante tener en cuenta que dentro del patrn el espacio en blanco es considerado
como un carcter ms, si colocamos dos espacios en el patrn, se buscarn dos espacios en el
campo.
Si queremos incluir en el patrn uno de los caracteres comodines y que no sea interpretado
como un comodn, sino como un carcter normal, lo tenemos que encerrar entre corchetes o
utilizar un carcter de escape.
[ESCAPE 'car_escape']
Por ejemplo queremos buscar los nombres compuestos que incluyen un subrayado. En este
caso tenemos que poner el carcter _ como un carcter normal no como un comodn, as que
lo escribiremos as:
SELECT numemp,nombre
FROM empleados
O bien,
SELECT numemp,nombre
FROM empleados
OR Combina dos condiciones y se evala como TRUE cuando alguna de las condiciones es
TRUE.
OR TRUE FALSE NULL
TRUE TRUE TRUE TRUE
FALSE TRUE FALSE NULL
NULL TRUE NULL NULL
NOT Niega la expresin booleana que especifica el predicado
NOT TRUE FALSE NULL
FALSE TRUE NULL
Hallar los vendedores que estn por debajo de su cuota y tienen ventas inferiores a 30.000.
SELECT nombre
FROM empleados
WHERE ventas < cuota AND ventas < 30000;
Hallar los vendedores que estn debajo de su cuota, pero cuyas ventas no sean inferiores a
150.000.
SELECT nombre
FROM empleados
WHERE ventas < cuota AND ventas < 150000;
Hallar las oficinas no dirigidas por el empleado 108
SELECT oficina
FROM oficinas
WHERE NOT dir = 108;
O
SELECT oficina
FROM oficinas
WHERE dir <> 108;
Devuelven:
Oficina
11
12
13
Las oficinas sin director no aparecen, para que aparezcan deben aadir otro predicado:
SELECT oficina, dir
FROM oficinas
WHERE NOT dir = 108 or dir is null;
Oficina dir
11 106
12 104
13 105
26 NULL
28 NULL
CONSULTAS MULTITABLA
Introduccin
Hasta ahora hemos visto consultas que obtienen los datos de una sola tabla, en este tema
veremos cmo obtener datos de diferentes tablas.
En esta parte ampliaremos la clusula FROM y descubriremos nuevas palabras reservadas
(UNION, EXCEPT e INTERSECT) que corresponden a operaciones relacionales.
Para obtener datos de varias tablas tenemos que combinar estas tablas mediante alguna
operacin basada en el lgebra relacional.
El lgebra relacional define una serie de operaciones cuyos operandos son tablas y cuyo
resultado es tambin una tabla.
Las operaciones de lgebra relacional implementadas en Transact-Sql son:
La unin UNION
La diferencia EXCEPT
La interseccin INTERSECT
El producto cartesiano CROSS JOIN
La composicin interna INNER JOIN
La composicin externa LEFT JOIN, RIGHT JOIN Y FULL JOIN
En todo el tema cuando hablemos de tablas nos referiremos tanto a las tablas que fsicamente
estn almacenadas en la base de datos como a las tablas temporales y a las resultantes de una
consulta o vista.
La unin de tablas UNION
La unin de tablas consiste en coger dos tablas y obtener una tabla con las filas de las dos
tablas, en el resultado aparecern las filas de una tabla y, a continuacin, las filas de la otra
tabla.
Para poder realizar la operacin, las dos tablas tienen que tener el mismo esquema (mismo
nmero de columnas y tipos compatibles) y la tabla resultante hereda los encabezados de la
primera tabla.
La sintaxis es la siguiente:
{< consulta >|(< consulta >)}
UNION [ALL]
{< consulta >|(< consulta >)}
[{UNION [ALL] {< consulta >|(< consulta >)}}[ ...n ] ]
[ORDER BY {expression_columna|posicion_columna [ASC|DESC]}
[ ,...n ]]
< consulta > representa la especificacin de la consulta que nos devolver la tabla a combinar.
Puede ser cualquier especificacin de consulta con la limitacin de que no admite la clusula
ORDER BY, los alias de campo se pueden definir pero slo tienen efecto cuando se indican en
la primera consulta ya que el resultado toma los nombres de columna de esta.
Ejemplo: Suponemos que tenemos una tabla Valencia con las nuevas oficinas de Valencia y
otra tabla Madrid con las nuevas oficinas de Madrid y queremos obtener una tabla con las
nuevas oficinas de las dos ciudades:
SELECT oficina as OFI, ciudad FROM Valencia
UNION ALL
SELECT oficina, ciudad FROM Madrid;
El resultado sera:
OFI Ciudad
11 Valencia
28 Valencia
23 Madrid
El resultado coge los nombres de columna de la primera consulta y aparecen primero las filas
de la primera consulta y despus las de la segunda.
Si queremos que el resultado aparezca ordenado podemos incluir la clusula ORDER BY, pero
despus de la ltima especificacin de consulta, y expresion_columna ser cualquier columna
vlida de la primera consulta.
SELECT oficina as OFI, ciudad FROM Valencia
UNION
SELECT oficina, ciudad FROM Madrid
ORDER BY ofi;
OFI Ciudad
11 Valencia
23 Madrid
28 Valencia
Ahora las filas aparecen ordenadas por el nmero de oficina y hemos utilizado el nombre de
columna de la primera consulta.
Cuando aparezcan en el resultado varias filas iguales, el sistema por defecto elimina las
repeticiones.
Si se especifica ALL, el sistema devuelve todas las filas resultante de la unin incluidas las
repetidas
El empleo de ALL tambin hace que la consulta se ejecute ms rpidamente ya que el sistema
no tiene que eliminar las repeticiones.
Se pueden combinar varias tablas con el operador UNION. Por ejemplo supongamos que
tenemos otra tabla Pamplona con las oficinas nuevas de Pamplona:
SELECT oficina, ciudad FROM Valencia
UNION
SELECT oficina, ciudad FROM Madrid
UNION
SELECT oficina, ciudad FROM Pamplona;
Combinamos las tres tablas.
Otro ejemplo:
Obtener todos los productos cuyo precio exceda de 20 o que se haya vendido ms de 300
euros del producto en algn pedido.
SELECT idfab, idproducto
FROM productos
WHERE precio > 20
UNION
SELECT fab, producto
FROM pedidos
WHERE importe > 300;
LA DIFERENCIA EXCEPT
Aparecen en la tabla resultante las filas de la primera consulta que no aparecen en la segunda.
Las condiciones son las mismas que las de la unin.
{<consulta>|(<consulta>)}
EXCEPT
{<consulta>|(<consulta>)}
[{EXCEPT {<consulta>|(<consulta>)}}[ ...n ] ]
[ORDER BY {expression_columna|posicion_columna [ASC|DESC]}
[ ,...n ]]
Por ejemplo tenemos las tablas T1 y T2.
T1 T2
Cod
Codigo
1
2
2
3
4
4
5
5
6
SELECT cod FROM T1
EXCEPT
SELECT codigo FROM T2;
Devuelve:
Cod
1
6
Ejemplo:
Listar los productos que no aparezcan en ningn pedido.
SELECT idfab, idproducto
FROM productos
EXCEPT
SELECT DISTINCT fab, producto
FROM pedidos;
LA INTERSECCIN INTERSECT
Tiene una sintaxis parecida a las anteriores pero en el resultado de la interseccin aparecen las
filas que estn simultneamente en las dos consultas.
Las condiciones son las mismas que las de la unin.
{ <consulta>|(<consulta>)}
INTERSECT
{<especificacion_consulta>|(<especificacion_consulta>)}
[{INTERSECT {<consulta>|(<consulta>)}} [ ...n ] ]
[ORDER BY {expression_columna|posicion_columna [ASC|DESC]}
[ ,...n ]]
Retomando el ejemplo anterior:
SELECT cod FROM T1
INTERSECT
SELECT cod FROM T2;
Devuelve:
Cod
2
4
5
Ejemplo: Obtener todos los productos que valen ms de 20 euros y que adems se haya
vendido en un pedido ms de 300 euros de ese producto.
SELECT idfab, idproducto
FROM productos
WHERE precio > 20
INTERSECT
SELECT fab, producto
FROM pedidos
WHERE importe > 300;
LA COMPOSICIN DE TABLAS
Hasta ahora hemos operado con tablas que tenan el mismo esquema, pero muchas veces lo
que necesitamos es obtener una tabla que tenga en una misma fila datos de varias tablas, por
ejemplo, obtener las facturas y que en la misma fila de factura aparezca el nombre y direccin
del cliente. Pues en lo que queda del tema estudiaremos este tipo de consultas basadas en la
composicin de tablas. La composicin de tablas consiste en obtener a partir de dos tablas
cualesquiera una nueva tabla fusionando las filas de una con las filas de la otra, concatenando
los esquemas de ambas tablas. Consiste en formar parejas de filas.
La sentencia SELECT permite realizar esta composicin, incluyendo dos o ms tablas en la
clusula FROM.
Es hora de ampliar la clusula FROM que vimos en el tema anterior.
Empezaremos por estudiar la operacin a partir de la cual estn definidas las dems
operaciones de composicin de tabla, el producto cartesiano.
El producto cartesiano CROSS JOIN
El producto cartesiano obtiene todas las posibles concatenaciones de filas de la primera tabla
con filas de la segunda tabla.
Se indica escribiendo en la clusula FROM los nombres de las tablas separados por una coma o
utilizando el operador CROSS JOIN.
FROM {<tabla_origen>} [ ,...n ]
|<tabla_origen> CROSS JOIN <tabla_origen>
Tabla_origen puede ser un nombre de tabla o de vista o una tabla derivada (resultado de una
SELECT), en este ltimo caso la SELECT tiene que aparecer entre parntesis y la tabla derivada
debe llevar asociado obligatoriamente un alias de tabla. Tambin puede ser una composicin
de tablas.
Se pueden utilizar hasta 256 orgenes de tabla en una instruccin, aunque el lmite vara en
funcin de la memoria disponible y de la complejidad del resto de las expresiones de la
consulta. Tambin se puede especificar una variable table como un origen de tabla.
Ejemplo:
SELECT *
FROM empleados, oficinas;
Si ejecutamos esta consulta veremos que las filas del resultado estn formadas por las
columnas de empleados y las columnas de oficinas. En las filas aparece cada empleado
combinado con la primera oficina, luego los mismos empleados combinados con la segunda
oficina y as hasta combinar todos los empleados con todas las oficinas.
Si ejecutamos:
SELECT *
Motor de Base de Datos Pgina 38
Nota: Material tomado de Aulaclic.es Derechos Reservados
MOTOR DE BASE DE DATOS ORACLE
DOCENTE: DAIRO RODRIGUEZ BLANCO
ANLISIS Y PROGRAMACION DE COMPUTADORES
Obtiene los empleados con su oficina y los empleados (tabla a la izquierda LEFT del JOIN) que
no tienen oficina aparecern tambin en el resultado con los campos de la
tabla oficinas rellenados a NULL.
SELECT numemp,nombre,empleados.oficina, ciudad, oficinas.oficina
FROM empleados RIGHT JOIN oficinas
ON empleados.oficina=oficinas.oficina;
numemp Nombre oficina ciudad oficina
106 Luis Antonio 11 Valencia 11
109 Mara Sunta 11 Valencia 11
101 Antonio Viguer 12 Alicante 12
103 Juan Rovira 12 Alicante 12
104 Jos Gonzlez 12 Alicante 12
105 Vicente Pantalla 13 Castelln 13
102 Alvaro Jaumes 21 Badajoz 21
108 Ana Bustamante 21 Badajoz 21
107 Jorge Gutirrez 22 A Corua 22
NULL NULL NULL Madrid 23
NULL NULL NULL Aranjuez 24
NULL NULL NULL Pamplona 26
NULL NULL NULL Valencia 28
Las oficinas 23,24,26 y 28 no tienen empleados.
Obtiene los empleados con su oficina y las oficinas (tabla a la derecha RIGHT del JOIN) que no
tienen empleados aparecern tambin en el resultado con los campos de la
tabla empleados rellenados a NULL.
SELECT numemp,nombre,empleados.oficina, ciudad, oficinas.oficina
FROM empleados FULL JOIN oficinas
ON empleados.oficina=oficinas.oficina;
numemp Nombre oficina ciudad oficina
101 Antonio Viguer 12 Alicante 12
102 Alvaro Jaumes 21 Badajoz 21
103 Juan Rovira 12 Alicante 12
104 Jos Gonzlez 12 Alicante 12
105 Vicente Pantalla 13 Castelln 13
106 Luis Antonio 11 Valencia 11
107 Jorge Gutirrez 22 A Corua 22
108 Ana Bustamante 21 Badajoz 21
109 Mara Sunta 11 Valencia 11
110 Juan Victor NULL NULL NULL
NULL NULL NULL Madrid 23
NULL NULL NULL Aranjuez 24
NULL NULL NULL Pamplona 26
NULL NULL NULL Valencia 28
Aparecen tanto los empleados sin oficina como las oficinas sin empleados.
Motor de Base de Datos Pgina 41
Nota: Material tomado de Aulaclic.es Derechos Reservados
MOTOR DE BASE DE DATOS ORACLE
DOCENTE: DAIRO RODRIGUEZ BLANCO
ANLISIS Y PROGRAMACION DE COMPUTADORES
CONSULTAS DE RESUMEN
Introduccin
Una de las funcionalidades de la sentencia SELECT es el permitir obtener resmenes de los
datos contenidos en las columnas de las tablas.
Para poder llevarlo a cabo la sentencia SELECT consta de una serie de clusulas especficas
(GROUP BY, HAVING), y Transact-SQL tiene definidas unas funciones para poder realizar estos
clculos, las funciones de agregado (tambin llamadas funciones de columna).
La diferencia entre una consulta de resumen y una consulta de las que hemos visto hasta
ahora es que en las consultas normales las filas del resultado se obtienen directamente de las
filas del origen de datos y cada dato que aparece en el resultado tiene su dato correspondiente
en el origen de la consulta mientras que las filas generadas por las consultas de resumen no
representan datos del origen sino un total calculado sobre estos datos. Esta diferencia har
que las consultas de resumen tengan algunas limitaciones que veremos a lo largo del tema.
Un ejemplo sera:
A la izquierda tenemos una consulta simple que nos saca las oficinas con sus ventas ordenadas
por regin, y a la derecha una consulta de resumen que obtiene la suma de las ventas de las
oficinas de cada regin
Las funciones de agregado
Una funcin de agregado SQL acepta un grupo de datos (normalmente una columna de datos)
como argumento, y produce un nico dato que resume el grupo. Por ejemplo la funcin AVG()
acepta una columna de datos numricos y devuelve la media aritmtica (average) de los
valores contenidos en la columna.
El mero hecho de utilizar una funcin de agregado en una consulta, convierte sta en una
consulta de resumen.
Todas las funciones de agregado tienen una estructura muy parecida:
Funcin ([ALL|DISTINCT] expression)
El grupo de valores sobre el que acta la funcin lo determina el resultado de la expresin que
ser un nombre de columna o una expresin basada en una columna o varias del origen de
datos. En la expresin nunca puede aparecer una funcin de agregado ni una subconsulta.
La palabra ALL indica que se tiene que tomar en cuenta todos los valores de la columna. Es el
valor por defecto.
La palabra DISTINCT hace que se consideren todas las repeticiones del mismo valor como uno
slo (considera valores distintos).
Todas las funciones de agregado se aplican a las filas del origen de datos una vez ejecutada la
clusula WHERE (si la hubiera).
Si exceptuamos la funcin COUNT, todas las funciones de agregado ignoran los valores NULL.
Una funcin de agregado puede aparecer en la lista de seleccin en cualquier lugar en el que
puede aparecer un nombre de columna. Puede, por ejemplo, formar parte de una expresin
pero no se pueden anidar funciones de agregado.
Tampoco se pueden mezclar funciones de columna con nombres de columna ordinarios. Hay
excepciones a esta regla pero cuando definimos agrupaciones y subconsultas que veremos
ms adelante.
La funcin COUNT
COUNT ({[ALL|DISTINCT] expresion | * } )
Expresion puede ser de cualquier tipo excepto text, image o ntext. No se permite utilizar
funciones de agregado ni subconsultas. El tipo de dato devuelto es int.
Si el nmero de valores devueltos por expresion es superior a 231-1, COUNT genera un error,
en ese caso hay que utilizar la funcin COUNT_BIG.
La funcin cuenta los valores distintos de NULL que hay en la columna. La palabra ALL indica
que se tienen que tomar todos los valores de la columna, mientras que DISTINCT hace que se
consideren todas las repeticiones del mismo valor como uno solo. Estos parmetros son
opcionales, por defecto se considera ALL.
Por ejemplo:
SELECT COUNT(region) FROM oficinas;
Devuelve 9 porque tenemos nueve valores no nulos en la columna region. A la hora de
interpretar un COUNT es conveniente no olvidar que cuenta valores no nulos, por ejemplo si
interpretramos la sentencia tal cual se lee, cuntas regiones tenemos en oficinas sera
errneo, realmente estamos obteniendo cuntas oficinas tienen una regin asignada.
La funcin COUNT_BIG
Funciona igual que la funcin COUNT. La nica diferencia entre ambas funciones est en los
valores devueltos, COUNT_BIG siempre devuelve un valor de tipo bigint y por lo tanto admite
ms valores de entrada, no est limitado a 231-1 valores de entrada como COUNT.
La funcin MAX
MAX ([ALL|DISTINCT] expression)
Devuelve el valor mximo de la expresin sin considerar los nulos.
MAX se puede usar con columnas numricas, de caracteres y de datetime, pero no con
columnas de bit. No se permiten funciones de agregado ni subconsultas.
Utilizar DISTINCT no tiene ningn sentido con MAX (el valor mximo ser el mismo si
consideramos las repeticiones o no) y slo se incluye para la compatibilidad con SQL-92.
Por ejemplo:
SELECT SUM(ventas) AS VentasTotales, MAX(objetivo) AS MayorObjetivo
FROM oficinas;
Devuelve 9 porque tenemos nueve valores no nulos en la columna region. A la hora de
interpretar un COUNT es conveniente no olvidar que cuenta valores no nulos, por ejemplo si
interpretramos la sentencia tal cual se lee, cuntas regiones tenemos en oficinas sera
errneo, realmente estamos obteniendo cuntas oficinas tienen una regin asignada.
La funcin MIN
MIN ([ALL|DISTINCT] expression)
Devuelve el valor mnimo de la expresin sin considerar los nulos.
MIN se puede usar con columnas numricas, de caracteres y de datetime, pero no con
columnas de bit. No se permiten funciones de agregado ni subconsultas.
Utilizar DISTINCT no tiene ningn sentido con MIN (el valor mnimo ser el mismo si
consideramos las repeticiones o no) y slo se incluye para la compatibilidad con SQL-92.
La funcin SUM
SUM ([ALL|DISTINCT] expresion )
Devuelve la suma de los valores devueltos por la expresin.
Slo puede utilizarse con columnas numricas.
El resultado ser del mismo tipo aunque puede tener una precisin mayor.
SELECT SUM(importe) FROM pedidos;
Obtiene el importe total vendido en todos los pedidos.
SELECT SUM(ventas) AS VentasTotales, MAX(objetivo) AS MayorObjetivo
FROM oficinas;
Devuelve la suma de las ventas de todas las oficinas y de los objetivos de todas las oficinas, el
de mayor importe.
La funcin AVG
AVG ([ALL|DISTINCT] expresion )
Devuelve el promedio de los valores de un grupo, para calcular el promedio se omiten los
valores nulos.
El grupo de valores lo determina el resultado de la expresin que ser un nombre de columna
o una expresin basada en una columna o varias del origen de datos.
La funcin se aplica tambin a campos numricos, y en este caso el tipo de dato del resultado
puede cambiar segn las necesidades del sistema para representar el valor del resultado.
La funcin VAR
VAR ([ALL|DISTINCT] expresion )
Devuelve la varianza estadstica de todos los valores de la expresin especificada.
VAR slo se puede utilizar con columnas numricas. Los valores NULL se pasan por alto.
La funcin VARP
VARP ([ALL|DISTINCT] expresion )
La funcin STDEV
STDEV ([ALL|DISTINCT] expresion )
Devuelve la desviacin tpica estadstica de todos los valores de la expresin especificada.
Slo se puede utilizar con columnas numricas. Los valores NULL se pasan por alto.
La funcin STDEVP
STDEVP ([ALL|DISTINCT] expresion )
Devuelve la desviacin estadstica estndar para la poblacin de todos los valores de la
expresin especificada.
Slo se puede utilizar con columnas numricas. Los valores NULL se pasan por alto.
La funcin GROUPING
GROUPING (nb_columna)
Es una funcin de agregado que genera como salida una columna adicional con el valor 1 si la
fila se agrega mediante el operador CUBE o ROLLUP, o el valor 0 cuando la fila no es el
resultado de CUBE o ROLLUP.
Nb_columna tiene que ser una de las columnas de agrupacin y la clusula GROUP BY debe
contener el operador CUBE o ROLLUP.
En el siguiente punto, cuando veamos las clusulas CUBE y ROLLUP quedar ms claro.
Si en la columna de agrupacin existen valores nulos, se generar una fila de resumen para
este valor, en este caso se considera el valor nulo como otro valor cualquiera.
Ejemplo:
SELECT oficina, count(numemp) AS [Nmero de empleados]
FROM empleados
GROUP BY oficina;
Resultado:
oficina Nmero de empleados
NULL 2
11 2
12 3
13 1
21 2
22 1
Hay empleados sin oficinas (con oficina a nulo), estos forman un grupo con el valor NULL en
oficina, en este caso hay dos empleados as.
Podemos indicar varias columnas de agrupacin.
Ejemplo:
SELECT rep, clie, count(numpedido) AS [Nmero de pedidos], MAX(importe) AS [Importe
mximo]
FROM pedidos
WHERE YEAR(fechapedido) = 1997
GROUP BY rep, clie
ORDER BY rep, clie;
Resultado:
Nmero Importe
rep clie
de pedidos mximo
101 2113 1 225,00
102 2106 2 21,30
102 2120 1 37,50
103 2111 2 21,00
105 2103 4 275,00
105 2111 1 37,45
106 2101 1 14,58
107 2109 1 313,50
107 2124 2 24,30
108 2112 1 29,25
108 2114 1 71,00
108 2118 3 14,20
De cada representante obtenemos el nmero de pedidos y el importe mximo vendido a cada
cliente, de las ventas de 1997. La clusula ORDER BY se ha incluido para que las filas aparezcan
ordenadas y quede ms claro.
Hemos dicho que los resmenes se calculan sobre todas las filas del origen despus de haber
ejecutado el WHERE, pues ALL permite obtener un resumen de las filas que no cumplen el
WHERE.
ALL Incluye todos los grupos y conjuntos de resultados, incluso aquellos en los que no hay filas
que cumplan la condicin de bsqueda especificada en la clusula WHERE. Cuando se
especifica ALL, se devuelven valores NULL para las columnas de resumen de los grupos que no
cumplen la condicin de bsqueda. No se puede especificar ALL con los operadores CUBE y
ROLLUP.
GROUP BY ALL no se admite en consultas que tienen acceso a tablas remotas si tambin hay
una clusula WHERE en la consulta.
Por ejemplo, vamos a modificar la consulta anterior:
SELECT rep, clie, count(numpedido) AS [Nmero de pedidos], MAX(importe) AS [Importe
mximo]
FROM pedidos
WHERE YEAR(fechapedido) = 1997
GROUP BY ALL rep, clie
ORDER BY rep, clie;
Resultado:
Nmero Importe
rep clie
de pedidos mximo
101 2102 0 NULL
101 2108 0 NULL
101 2113 1 225,00
102 2106 2 21,30
102 2120 1 37,50
103 2111 2 21,00
105 2103 4 275,00
105 2111 1 37,45
106 2101 1 14,58
106 2117 0 NULL
107 2109 1 313,50
107 2124 2 24,30
108 2112 1 29,25
108 2114 1 71,00
108 2118 3 14,20
Cul ha sido el efecto de aadir ALL? Se han aadido filas para las filas del origen que no
cumplen la condicin del WHERE pero sin que intervengan en el clculo de las funciones de
agregado.
Por ejemplo el representante 101 tiene pedidos con el cliente 2102 pero estos pedidos no son
del ao 1997, por eso aparece la primera fila (no estaba en el resultado de la otra consulta)
pero con 0 y NULL como resultados de las funciones de agregado.
ROLLUP especifica que, adems de las filas que normalmente proporciona GROUP BY, se
incluyen filas de resumen en el conjunto de resultados. Los grupos se resumen en un orden
jerrquico, desde el nivel inferior del grupo hasta el superior. La jerarqua del grupo se
determina por el orden en que se especifican las columnas de agrupamiento. Cambiar el orden
de las columnas de agrupamiento puede afectar al nmero de filas generadas en el conjunto
de resultados.
Por ejemplo:
SELECT rep, clie, count(numpedido) AS [Nmero de pedidos], MAX(importe) AS [Importe
mximo]
FROM pedidos
WHERE YEAR(fechapedido) = 1997
GROUP BY rep, clie WITH ROLLUP;
Resultado:
Nmero Importe
rep clie
de pedidos mximo
101 2113 1 225,00
101 NULL 1 225,00
102 2106 1 21,30
102 2120 1 37,50
102 NULL 3 37,50
103 2111 2 21,00
103 NULL 2 21,00
105 2103 4 275,00
105 2111 1 37,45
105 NULL 5 275,00
106 2101 1 14,28
106 NULL 1 14,28
107 2109 1 313,50
107 2124 2 24,30
107 NULL 3 313,50
108 2112 1 29,25
108 2114 1 71,00
108 2118 3 14,20
108 NULL 5 71,00
... ... ... ...
NULL NULL 23 450,00
Efecto: Se han aadido automticamente subtotales por cada nivel de agrupamiento y una
lnea de totales generales al final. En este caso no hemos incluido ORDER BY porque las filas
salen ya ordenadas.
CUBE especifica que, adems de las filas que normalmente proporciona GROUP BY, deben
incluirse filas de resumen en el conjunto de resultados. Se devuelve una fila de resumen
GROUP BY por cada posible combinacin de grupo y subgrupo del conjunto de resultados. En
el resultado se muestra una fila de resumen GROUP BY como NULL, pero se utiliza para indicar
todos los valores.
Por ejemplo:
SELECT rep, clie, count(numpedido) AS [Nmero de pedidos], MAX(importe) AS [Importe
mximo]
FROM pedidos
WHERE YEAR(fechapedido) = 1997
Motor de Base de Datos Pgina 49
Nota: Material tomado de Aulaclic.es Derechos Reservados
MOTOR DE BASE DE DATOS ORACLE
DOCENTE: DAIRO RODRIGUEZ BLANCO
ANLISIS Y PROGRAMACION DE COMPUTADORES
de columnas que contiene la clusula GROUP BY. Cada operando (columna) de la clusula
GROUP BY se enlaza segn el agrupamiento NULL y se aplica el agrupamiento al resto de los
operandos (columnas). CUBE devuelve todas las combinaciones posibles de grupo y subgrupo.
Tanto si utilizamos CUBE como ROLLUP, nos ser til la funcin de agregado GROUPING.
Si cogemos por ejemplo la primera fila remarcada (101 NULL ) el valor NULL, no sabemos si
se refiere a una fila de subtotal o a que el representante 101 ha realizado un pedido sin
nmero de cliente. Para poder salvar este problema se utiliza la funcin de agregado
GROUPING.
SELECT rep, clie, count(numpedido) AS [Nmero de pedidos], MAX(importe) AS [Importe
mximo], GROUPING(clie) AS [Fila resumen]
FROM pedidos
WHERE YEAR(fechapedido) = 1997
GROUP BY rep, clie WITH ROLLUP;
Nmero Importe Fila
rep clie
de pedidos mximo Resumen
101 2113 1 225,00 0
101 NULL 1 225,00 1
102 2106 2 21,30 0
102 2120 1 37,50 0
102 NULL 3 37,50 1
103 2111 2 21,00 0
Las filas que corresponden a subtotales aparecen con un 1 y las normales con un cero.
Ahora que estamos ms familiarizados con las columnas de agrupamiento debemos comentar
una regla a no olvidar:
EN LA LISTA DE SELECCIN DE UNA CONSULTA DE RESUMEN UN NOMBRE DE COLUMNA NO
PUEDE APARECER FUERA DE UNA FUNCIN DE AGREGADO SI NO ES UNA COLUMNA DE
AGRUPACIN.
Esta SELECT es la misma que la del primer ejemplo del apartado sobre la clusula GROUP BY, la
diferencia es que le hemos aadido la clusula HAVING, que hace que del resultado slo se
visualicen los grupos que cumplan la condicin. Es decir slo aparecen las oficinas que tienen
menos de 2 empleados.
Siempre que en una condicin de seleccin haya una funcin de columna, la condicin deber
incluirse en la clusula HAVING, adems, como HAVING filtra filas del resultado, slo puede
contener expresiones (nombres de columnas, expresiones, funciones) que tambin pueden
aparecer en la lista de seleccin, por lo que tambin se aplica la misma regla a no olvidar:
EN LA CLUSULA HAVING UN NOMBRE DE COLUMNA NO PUEDE APARECER FUERA DE UNA
FUNCIN DE AGREGADO SI NO ES UNA COLUMNA DE AGRUPACIN.
Las expresiones que pongamos en HAVING no tienen porqu aparecer en la lista de seleccin,
por ejemplo en la SELECT anterior se poda haber escrito:
HAVING SUM(ventas)=10000
ACTUALIZACIN DE DATOS
Introduccin
Hasta ahora hemos trabajado con tablas que tenan datos introducidos y cuando nos ha hecho
falta hemos aadido nuevos datos en las mismas y hemos modificado algn dato directamente
desde el entorno de SSMS, en este tema veremos cmo hacerlo con instrucciones de Transact-
SQL.
Seguimos en el DML porque las instrucciones que veremos actan sobre los datos de la base
de datos no sobre su definicin y tenemos tres tipos de operaciones posibles:
Insertar nuevas filas en una tabla.
Modificar datos ya almacenados.
Eliminar filas de una tabla.
Insertar creando una nueva tabla
Una forma de insertar datos es crear una tabla que incluya los datos de otra. Esta es la
sentencia SELECT... INTO.
SELECT ...
INTO nb_NuevaTabla
FROM ...
<destino> ::=
{
[nbBaseDatos.nbEsquema. | nbEsquema.]nbTablaVista
}
Con esta instruccin podemos insertar una fila de valores determinados o un conjunto de filas
derivadas de otra consulta.
Cuando indicamos nombres de columnas, esas columnas sern las que reciban los valores a
insertar, la asignacin de valores se realiza por posicin, la primera columna recibe el primer
valor, la segunda columna el segundo, y as sucesivamente.
En la lista, las columnas pueden estar en cualquier orden y tambin se pueden omitir algunas
columnas.
Una columna que no aparezca en la lista de columnas se rellenar de acuerdo a su definicin:
con su valor por defecto si est definida con la clusula DEFAULT
con el valor de identidad incremental siguiente si tiene la propiedad IDENTITY.
con el valor calculado si es una columna calculada.
con el valor NULL , en cualquier otro caso y si la columna lo admite.
Cuando no se indica una lista de columnas el sistema asume por defecto todas las columnas de
la tabla y en el mismo orden que aparecen en la definicin de la tabla, en este caso, los valores
se tienen que especificar en el mismo orden que las columnas en la definicin de la tabla, y se
tiene que especificar un valor por cada columna ya que los valores se rellenan por posicin, la
primera columna recibe el primer valor, la segunda columna el segundo, y as sucesivamente.
En cualquier caso, el nmero de valores debe coincidir con el nmero de columnas y los tipos
de dato de los valores deben ser compatibles con las columnas.
Aunque pueda parecer ms engorroso escribir la lista de columnas, es un hbito
recomendable, hace que la sentencia sea ms fcil de leer y mantener (cuando leemos la
sentencia sabemos en qu columnas asignamos los valores sin necesidad de consultar la
definicin de la tabla) y evita que se tenga que cambiar la sentencia si se modifica el esquema
de la tabla (si el orden de las columnas dentro de la tabla cambia).
Los registros se agregan al final de la tabla.
Cuando se insertan nuevas filas en una tabla, el sistema comprobar que la nueva fila no
infrinja ninguna regla de integridad, por ejemplo no podremos asignar a una columna
PRIMARY KEY un valor nulo o que ya exista en la tabla, a una columna UNIQUE un valor que ya
exista en la tabla, a una columna NOT NULL un valor NULL, a una clave ajena (FOREIGN KEY) un
valor que no exista en la tabla de referencia.
De producirse alguna de las situaciones anterior, la instruccin genera un mensaje de error y la
fila no se inserta.
Ejemplos.
INSERT INTO oficinas (oficina, ciudad) VALUES (26, 'Elx');
En este caso hemos indicado slo dos columnas y dos valores, las dems columnas se rellenan
con el valor por defecto si lo tiene (DEFAULT) o con NULL. Si alguna columna no nombrada no
admite nulos ni tiene clusula DEFAULT definida, la instruccin dar error.
INSERT INTO oficinas
VALUES (27,'Mstoles','Centro',default ,null, default)
Aqu no hemos indicado una lista de columnas luego los valores se tienen que indicar en el
mismo orden que las columnas dentro de la tabla, si nos equivocamos de orden, el valor se
guardar en una columna errnea (si los tipos son compatibles) o generar un mensaje de
error y la fila no se insertar (si los tipos no son compatibles).
Actualiza todas las filas de la tabla oficinas dejando el campo ventas con el valor cero.
Si el campo ventas est definido con un valor predeterminado 0, la sentencia anterior equivale
a:
UPDATE oficinas SET ventas = DEFAULT;
Si lo que queremos es dejar el campo a nulo:
UPDATE oficinas SET ventas = NULL;
En una misma sentencia podemos actualizar varias columnas, slo tenemos que indicar las
distintas asignaciones separadas por comas:
UPDATE oficinas SET ventas = 0, objetivo = 0;
Los nombres de columna pueden especificarse en cualquier orden.
Si no queremos actualizar todas las filas de la tabla sino unas cuantas, utilizaremos la clusula
TOP, o unas determinadas, utilizaremos la clusula WHERE.
TOP ( expresion ) [ PERCENT ]
Especifica el nmero o porcentaje de filas aleatorias que se van a modificar.
expression debe generar un valor numrico e indica el nmero de filas a modificar empezando
por el principio. Como en la SELECT, si aadimos la palabra PERCENT, el nmero representado
por expresin se refiere al porcentaje de filas a modificar sobre el total. La clusula TOP
funciona casi igual que en la SELECT pero en este caso, las filas no se ordenan, y la expresin
debe ir entre parntesis.
Por ejemplo:
UPDATE TOP (10) PERCENT oficinas
SET ventas = 0;
Actualiza el 10% de filas de la tabla oficinas.
[ WHERE <condicion> ]
Utilizamos la clusula WHERE para filtrar las filas a actualizar. Se actualizarn todas las filas que
cumplan la condicin. Por ejemplo si queremos actualizar slo las oficinas del Este:
UPDATE oficinas
SET ventas = 0
WHERE region = 'Este';
Cuando para la condicin de la clusula WHERE necesitamos un dato de otra tabla podemos
utilizar una subconsulta:
UPDATE empleados SET ventas = 0
WHERE oficina IN (SELECT oficina
FROM oficinas
WHERE region = 'Este');
Cuando el campo de la otra tabla se utiliza para la clusula SET, entonces debemos utilizar la
clusula FROM.
La clusula FROM permite definir un origen de datos basado en varias tablas, y ese origen ser
el utilizado para realizar la actualizacin.
Por ejemplo queremos actualizar el importe de los pedidos con el precio de la tabla productos.
UPDATE pedidos SET importe = cant * precio
FROM pedidos INNER JOIN productos
ON fab = idfab AND producto = idproducto;
Modificamos la tabla pedidos dejando en la columna importe el resultado de multiplicar
la cantidad del pedido por el precio del producto que se encuentra en la tabla productos.
Si la actualizacin de una fila infringe una restriccin o una regla, infringe la configuracin de
valores NULL de la columna o si el nuevo valor es de un tipo de datos incompatible con la
columna, se cancela la instruccin, se devuelve un error y no se actualiza ningn registro.
Cuando una instruccin UPDATE encuentra un error aritmtico (error de desbordamiento,
divisin por cero o de dominio) durante la evaluacin de la expresin, la actualizacin no se
lleva a cabo. El resto del lote no se ejecuta y se devuelve un mensaje de error.
Adems del permiso de UPDATE, se requieren permisos SELECT para la tabla que se actualiza si
la instruccin UPDATE contiene una clusula WHERE o en el caso de que el
argumento expression de la clusula SET utilice una columna de la tabla, y permisos SELECT
para la tabla del origen si utilizamos una clusula FROM o un WHERE con subconsulta.