Professional Documents
Culture Documents
Gracias a su interfaz gráfica la creación de una base de datos, específicamente su estructura básica, es una labor
extremadamente simple en el SQL Server. Crearla manualmente, no requiere más de uno cuantos minutos.
Puede crearse una base de datos utilizando el Administrador Corporativo.
CREAR TABLAS
Los diagramas de bases de datos son una representación gráfica de la base de datos. Para crear un diagrama siga
estos pasos:
Esta operación es bastante sencilla. Basta seleccionar la fila que define la columna con la llave primaria en la nueva
tabla y arrastrarla hacia el nombre de la columna correspondiente en la otra tabla.
Ingresar datos
En el panel detalles, haga clic con el botón derecho sobre el nombre de la tabla que desee ingresar datos. Seleccione
Abrir Tabla y haga clic en Devolver todas las filas, y posteriormente ingrese los nuevos registros.
Sql Server query Analyzer es una herramienta de SQL Server con interfaz gráfica que Permite al usuario ejecutar
consultas a una base de datos SQL Server usando comandos SQL.
Ventana de trabajo
La ventana de trabajo está compuesta por dos paneles. Si sólo aparece uno, se presiona el botón Mostrar el panel
resultados (antes del campo BD) para abrir el segundo panel. En el primero, llamado Panel de Consultas, se digitan los
comandos SQL o se cargan los guiones para su ejecución. En el panel de abajo, puede visualizarse el resultado de la consulta
o mensajes de error y advertencia.
La barra de herramientas posee botones equivalentes a algunas opciones de los menús. En ella también se encuentra
la lista de bases de datos disponibles en el servidor. Puede seleccionarse una base de datos haciendo clic en la flecha para
abrir la lista y después en el nombre de la base de datos deseada. En este ejemplo, vamos a trabajar con la base de datos
Academico.
En el panel de consultas, se digita el comando “Select profesor.nombre From depto, profesor Where facultad =
"Ciencias Empresariales" and Código_Depto = Código” Nótese que, al digitar las palabras SELECT Y FROM, éstas se
vuelven azules, pues son partes fijas de la sintaxis del comando SELECT, que es el principal
comando usado para recuperar campos y filas de una base de datos. En este momento Depto y
Profesor ya son tablas de la base de datos Academico. Para ejecutar y ver el resultado de la
consulta, puede optarse por usar el botón Ejecutar consulta.
El texto o guión
de una consulta puede
grabarse en disco para su
posterior recuperación y
ejecución. Si se hacen
algunas consultas con
frecuencia, este proceso
puede economizar tiempo
considerable.
Para guardar
una consulta siga estos
pasos:
1. En el menú Archivo, haga clic en la opción Guardar. Aparecerá la caja de diálogo Guardar Archivo.
2. Seleccione el sitio donde desea guardar la consulta y en el campo Nombre de Archivo digite el nombre de la consulta.
use master
go
sp_detach_db 'Pruebas'
go
Lo siguiente es mover los archivos de esta base de datos (pruebas.mdf y pruebas.ldf) a la carpeta destino ("D:\")Y
por último volvemos a adjuntar la base de datos en su ubicación actual.
use master
go
sp_attach_db 'Pruebas','D:\pruebas.mdf','D:\pruebas.ldf'
go
Ahora hay que repetir este procedimiento para todas las bases de datos de usuario que tengamos
Lenguaje SQL
Existen numerosas versiones de SQL. La versión original fue desarrollada en el San José Research Laboratory de
IBM (ahora el Almaden Research Center). Este lenguaje, originalmente fue llamado “Sequel”.
El lenguaje Sequel ha evolucionado desde entonces, y su nombre ha cambiado a SQL (Structured Query
Language , (Lenguaje de Consulta Estructurado)). Ahora numerosos productos soportan el lenguaje SQL. Aunque las
versiones del producto de SQL difieren en varios detalles de los lenguajes, las diferencia son para la mayoría, sin
importancia.
Definición de Vista :
El SQL DDL incluye ordenes para definir vistas.
Autorización :
El SQL DDL incluye ordenes para especificar derechos de acceso a relaciones y vistas.
Integridad :
El lenguaje Sequel incluye ordenes para especificar restricciones de integridad complejas. Versiones recientes de
SQL, incluyendo el Ansi estándar, proporcionan unicamente una forma limtada de comprobación de integridad.
Control de Transacciones :
Estructura Básicas
Select = ()
From = (x)
Where = ()
La cláusula Select corresponde a la operación de Proyección del álgebra relacional. Se usa para listar los atributos que
se desean en el resultado de una consulta.
La cláusula From corresponde a la operación de Producto Cartesiano del álgebra relacional. Lista las relaciones que
se van a examinar en la evaluación de la expresión.
La cláusura Where corresponde al predicado de selección del álgebra relacional. Consta de un predicado que implica
atributos de las relaciones que aparecen en la clausula From.
Cada Ai, representa un atributo y cada Ri una relación. P es un predicado. Esta consulta es equivalente a la
expresión del álgebra relacional:
La lista A1, A2..........An de atributos puede sustituirse por un asterisco (*) para seleccionar todos los atributos de
todas las relaciones que aparecen en la cláusula From.
SQL forma el Producto Cartesiano de las relaciones nombradas en la cláusula From, realiza una selección del
álgebra relacional usando el predicado de la cláusula Where y después proyecta el resultado a los atributos de la clausula
Select.
El resultado de una consulta en SQL es, por supuesto, una relación. Consideremos una consulta muy sencilla usando
el ejemplo bancario. “Encontrar los nombres de todas las sucursales en la relación Depósito”.
Ejemplo:
Select Nombre_Sucursal
From Depósito
Los lenguajes de consulta formales se basan en la noción matemática de relación como un conjunto. Por ello nunca
aparecen tuplas duplicadas en las relaciones. En la practica, la eliminación de duplicados lleva bastante tiempo. Por tanto,
SQL (y casi todos los demás lenguajes de consulta comerciales) permiten duplicados en las relaciones. Asi, pues, la consulta
anterior listará cada nombre_sucursal una vez por cada tupla la que aparece en la relación depósito.
En aquellos casos en los queremos forzar la eliminación de duplicados, insertamos la palabra clave Distinct después
de Select. Podemos reescribir la consulta anterior así si queremos quitar duplicados.
Notese que SQL permite el uso de la palabra clave “ All ” para especificar explícitamente que no se eliminen los duplicados.
Puesto que la retención de duplicados está implícita, no usaremos All en los ejemplos. Para asegurar la eliminación
de duplicados en los resultados de las consultas de los ejemplos, usaremos Distinct siempre que sea necesario.
Existen distintos tipos de composición, aprenderemos a utilizarlos todos y a elegir el tipo más apropiado a cada caso.
El producto cartesiano
El producto cartesiano es un tipo de composición 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 más tablas.
Nbtabla puede ser un nombre de tabla o un nombre de consulta. Si todas las tablas están en una base de datos
externa, añadiremos la cláusula IN basedatosexterna después de la última tabla. Pero para mejorar el rendimiento y
facilitar el uso, se recomienda utilizar una tabla vinculada en lugar de la cláusula IN.
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 pequeñas.
Se ve claramente que el producto cartesiano es una operación costosa sobre todo si operamos con más de dos tablas o con
tablas voluminosas.
Para ver cómo funciona el producto cartesiano seleccionamos las tablas representante y Pedidos, y creamos una
consulta que halle el producto cartesiano de las dos.
SELECT *
FROM Representantes, Pedidos
Where Representante.numemp = Pedidos.rep
Normalmente emparejamos tablas que están 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 más
eficiente utilizar otro tipo de composición, el INNER JOIN.
El INNER JOIN
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 cláusula 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 numéricos deben ser de tipos similares. Por ejemplo, se puede combinar campos AutoNumérico y Long puesto
que son tipos similares, sin embargo, no se puede combinar campos de tipo Simple y Doble. Además las columnas no
pueden ser de tipo Memo ni OLE.
Comp representa cualquier operador de comparación ( =, <, >, <=, >=, o <> ) y se utiliza para establecer la
condición de emparejamiento.
Se pueden definir varias condiciones de emparejamiento unidas por los operadores AND y OR poniendo cada condición
entre paréntesis. Ejemplo:
SELECT *
FROM pedidos INNER JOIN productos ON (pedidos.fab = productos.idfab) AND (pedidos.producto =
productos.idproducto)
Se pueden combinar más 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, también 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.
La descripción de la sintaxis es la misma que la del INNER JOIN, lo único que cambia es la palabra INNER por
LEFT (izquierda en inglés).
Esta operación consiste en añadir 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 los empleados que no
tienen oficina asignada aparecerán con sus datos normales y los datos de su oficina a nulos.
La sintaxis es la misma que la del INNER JOIN, lo único que cambia es la palabra INNER por RIGHT (derecha
en inglés).
Esta operación consiste en añadir 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 además aparece una
fila por cada oficina que no está asignada a ningún empleado con los datos del empleado a nulos.
Una operación LEFT JOIN o RIGHT JOIN se puede anidar dentro de una operación INNER JOIN, pero una
operación 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 cláusula FROM.
Por ejemplo podemos tener:
SELECT *
FROM clientes INNER JOIN (empleados LEFT JOIN oficinas ON empleados.oficina = oficinas.oficina) ON
clientes.repclie = empleados.numclie
Combinamos empleados con oficinas para obtener los datos de la oficina de cada empleado, y luego añadimos los
clientes de cada representante, así obtenemos los clientes que tienen un representante asignado y los datos de la oficina del
representante asignado.
Si hubiéramos puesto INNER en vez de LEFT no saldrían los clientes de los empleados que no tienen oficina y por
tanto no aparece en el resultado del LEFT JOIN y por tanto no entrará en el cálculo del INNER JOIN con clientes.
Resumen de cuándo utilizar cada operación.
Para saber en cada caso qué tipo de operación se debe utilizar, a continuación tienen un gráfico que indica qué
preguntas se tienen que hacer y según la respuesta, qué operación utilizar.
Para resumir hemos llamado T1 y T2 las tablas de las que queremos sacar los datos y R la tabla lógica que
representa el resultado de consulta. T1 y T2 podrían 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".
Supongamos que queremos responder la consulta “Encontrar el nombre y la ciudad de todos los clientes que tienen
un préstamo en alguna sucursal” En SQL, esto se puede escribir así:
Obsérve que SQL usa la notación nombre_relación.nombre_atributo, para evitar ambigüedad en los casos en los que
un atributo aparece en el esquema de más de una relación.
Podíamos haber escrito Cliente.Ciudad_Cliente en vez de Ciudad_Cliente en la cláusula Select. Sin embargo, puesto
que el atributo Ciudad_Cliente aparece solamente en una de las relaciones que se nombran en la clausula From no hay
ambigüedad al escribir Ciudad_Cliente.
Ampliemos la consulta anterior y consideremos un caso algo más complicado en el que se requiere también que todos
los clientes tengan un préstamo de la sucursal Perryridge. “Encontrar el nombre y la ciudad de todos los clientes que tienen
un préstamo en la sucursal Perryridge”. Para escribir esta consulta, necesitaremos declarar dos límites en la cláusula Where,
conectados por el conector lógico And.
SELECT Número_Cuenta
FROM Depósito
WHERE Saldo Between 80.000 And 100.000
En vez de
SELECT Número_Cuenta
FROM Depósito
WHERE Saldo >= 80000 and Saldo <=100000
Operaciones de Conjuntos
SQL incluye las operaciones Unión (Unión), Intersect (Intersección) y Minus (Diferencia), que operan sobre
relaciones.
Ejemplo: Encontrar a todos los clientes que tienen una cuenta en la sucursal “Perryridge”.
A continuación, encontrar a todos los clientes que tienen un préstamo en la sucursal “Perryridge”.
Para encontrar a todos los clientes que tienen un préstamo, una cuenta, o los dos en la sucursal “Perryridge”,
escribimos:
De manera similar, para encontrar a todos los clientes que tienen un préstamo y una cuenta en la sucursal
“Perryridge”, escribimos:
Aunque la operación Unión es parte del SQL estándar de ANSI, varios productos no la soportan. Las operaciones
Intersect y Minus eran parte del SQL original (Sequel), pero no están incluidas en el estándar.
Es posible expresar estas operaciones usando otras característica del SQL estándar de ANSI.
Pertenencia a un Conjunto
SQL se basa en él calculo relacional para operaciones que permiten probar la pertenencia de tuplas a una relación.
El conector IN prueba si se es miembro de un conjunto, donde el conjunto es una colección de valores producidos
por una cláusula Select. El conector NOT IN prueba la no pertenencia al conjunto.
Para ilustrarlo, considérese de nuevo la consulta “Encontrar a todos los clientes que tienen un préstamo y una
cuenta en la sucursal Perryridge”. Anteriormente, se escribío dicha consulta mediante la Intersección de dos conjuntos: El
conjunto de los clientes con un depósito en la sucursal Perryridge y el conjunto de los clientes con un préstamo en la sucursal
“Perryridge”. Podemos tomar el enfoque alternativo de encontrar a todos los clientes que tienen una cuenta en la sucursal
“Perryridge” que son miembros del conjuntos de los clientes con préstamo de la sucursal “Perryridge”. Claramente, esto
genera los mismos resultados que antes, pero nos lleva a escribir la consulta usando el conector IN de SQL. Empezamos
encontrando a todos los clientes que tienen cuenta, y escribimos la subconsulta.
Después necesitamos encontrar a los clientes con préstamos de la sucursal “Perryridge” y que aparecen en la lista
de clientes que tienen cuenta obtenida en la subconsulta. HaCcemos esto incorporando la subconsulta en un Select externo.
La consulta resultante es:
Este ejemplo muestra que es posible escribir la misma consulta de varias formas en SQL. Esto es conveniente ya que
permite al usuario pensar la consulta en la forma que aparece más natural. Veremos que en SQL hay una cantidad
importante de redundancia.
Ahora ilustramos el uso de la construcción NOT IN. Para encontrar a todos los clientes que tienen una cuenta en la
sucursal Perryridge pero no tienen un préstamo en la sucursal Peryridge, podemos escribir:
SQL toma prestada la notación de variables de tupla del cálculo relacional de tuplas. Una variable de tupla en SQL
debe estar asociada con una relación determinada. Las variables de tupla se definen en la cláusula From. Para ilustrarlo,
volvemos a escribir la consulta “encontrar el nombre y la ciudad de todos los clientes que tienen un préstamo en alguna
sucursal”, así:
Nótese que una variable de tupla se define en la cláusula FROM colocándola después del nombre de la relación con
la cual está asociada, separada por uno o más espacios.
Las variables de tupla son muy útiles para comparar dos tuplas de la misma relación. En tales casos el álgebra
relacional usa la operación renombrar. Supóngase que queremos encontrar a todos los clientes que viven en la misma ciudad
que el cliente Christian Arriagada. Escribimos esta consulta como sigue:
Observesé que no podríamos usar la notación Cliente.Ciudad_Cliente, puesto que no estaría claro cuál es la
referencia a Cliente que se quiere hacer.
Comparación de Conjuntos
Fue posible utilizar la construcción IN en la consulta anterior porque estuvimos probando la igualdad entre dos
nombres de sucursales. Considere la consulta “Encontrar los nombres de todas las sucursales que tienen un activo mayor que
alguna sucursal situada en Rancagua.
Puesto que ésta es una comparación “mayor que” no podemos escribir la expresión usando la construcción IN.
SQL, sin embargo, ofrece un estilo alternativo para escribir la consulta anterior. La frase “ Mayor que algún” se
representa en SQL por “> some”. Esta construcción nos permite rescribir la consulta de una forma que se parece bastante a
nuestra formulación de la consulta en español.
SELECT Nombre_Sucursal
FROM Sucursal
WHERE Activo >Some (SELECT Activo
FROM Sucursal
WHERE Ciudad_Sucursal = "Rancagua");
La subconsulta :
Select Activo
From Sucursal
Where Ciudad_Sucursal = “Rancagua”
SELECT Nombre_Sucursal
FROM Sucursal
WHERE Activo>all (SELECT Activo
FROM Sucursal
WHERE Ciudad_Sucursal = "Rancagua");
Como en el caso de some, SQL permite las comparaciones <ALL, <=ALL, >=ALL, =ALL, <>ALL.
SQL incluye una característica para probar si una subconsulta tiene alguna tupla en su resultado. La construcción
EXISTS devuelve el valor true si la subconsulta del argumento no está vacía. Usando la construcción exists, podemos
escribir la consulta “Encontrar a todos los clientes que tienen una cuenta y un préstamo en la sucursal Perryridge”. Todavía
de otra forma:
SELECT Nombre_Cliente
FROM Cliente
WHERE EXISTS (SELECT *
FROM Depósito
WHERE Depósito.Rut = Cliente.Rut
and Nombre_Sucursal = "Perryridge")
and EXISTS (SELECT *
FROM Préstamo
WHERE Préstamo.Rut = Cliente.Rut
and Nombre_Sucursal = "Perryridge");
La primera subconsulta Exists prueba si el cliente tiene una cuenta en la sucursal Perryridge. La segunda
subconsulta Exists prueba si el cliente tiene un préstamo de la sucursal Perryridge.
La no existencia de tuplas en una subconsulta puede probarse usando la construcción NOT EXISTS. Volviendo a
una consulta anterior, podemos escribir “Encontrar a todos los clientes de la sucursal Perryridge que tiene una cuenta allí
pero no un préstamo”. Como sigue:
SELECT Nombre_Cliente
FROM Cliente
WHERE EXISTS (SELECT *
FROM Depósito
WHERE Depósito.Rut = Cliente.Rut
and Nombre_Sucursal = "Perryridge")
and not EXISTS (SELECT *
FROM Préstamo
WHERE Préstamo.Rut = Cliente.Rut
and Nombre_Sucursal = "Perryridge");
SQL ofrece a los usuarios cierto control sobre el orden en el que se van a presentar las tuplas en una relación. La
cláusula “Order By” hace que las tuplas en el resultado de una consulta aparezcan en un orden determinado. Para listar en
orden alfabético todos los clientes que tienen un préstamo en la sucursal Perryridge, escribimos:
Por omisión, SQL dicta los elementos en orden ascendente. Para especificar el tipo de ordenación, podemos
especificar Desc para orden descendente o Asc para orden ascendente. Además, el orden puede realizarse sobre múltiples
atributos. Supóngase que queremos listar la relación préstamo completa en orden descendente de cantidad. Si varios
préstamos tiene la misma cantidad, los ordenamos en orden ascendente por número de préstamo. Expresamos esto en SQL,
como sigue:
SELECT *
FROM Préstamo
ORDER BY Cantidad DESC , Número_Préstamo;
Para satisfacer una solicitud de Orden By, SQL debe realizar una ordenación. Puesto que ordenar un gran número
de tuplas puede ser costoso, lo más conveniente es ordenar cuando sea necesario.
Por otro lado, si necesitamos cierto número de registros que sólo se encuentren entre la parte superior e inferior
de un intervalo especificado por una cláusula Order By, utilizaremos la palabra “Top N”. Ejemplo: Encontrar las 3
sucursales que poseen el activo mayor.
Si no incluye la cláusula Order By, el resultado de la consulta devolverá un conjunto aleatorio de 3 registros de la
tabla sucursal que cumplan la cláusula Where.
El predicado top no elige entre valores iguales. En el ejemplo anterior, si el activo de los registros 3 y 4 son iguales,
la consulta devolverá 4 registros.
También puede utilizar la palabra reservada Percent para devolver un determinado porcentaje de registros que se
encuentran entre la parte superior e inferior de un intervalo especificado en la cláusula Order By. Suponga que en lugar de
las 3 sucursales con mayor activo, desea el 10 % de las sucursales con mayor activo, la consulta seria:
SQL ofrece la posibilidad de calcular funciones en grupos de tuplas usando la cláusula “Group By”. El atributo o
atributos dados en la cláusula Group By se usan para formar grupos. Las tuplas con el mismo valor en todos los atributos en
la cláusula Group By se colocan en un grupo. SQL incluye funciones para calcular:
Promedio : Avg
Mínimo : Min
Máximo : Max
Total : Sum
Contar : Count
Las operaciones con el Avg se llaman funciones de agregación porque operan sobre grupos de tuplas. El resultado
de una función de agregación es un valor único. Para ilustrarlo, considere la consulta “Encontrar el saldo promedio de las
cuentas en todas las sucursales”. Escribimos esto como sigue:
A veces es útil declarar una condición que se aplica a los grupos más que a las tuplas. Por ejemplo, podríamos estar
interesados únicamente en sucursales en las que el saldo promedio de las cuentas es mayor que 70.000. Esta condición no se
aplica a una única tupla. Más bien se aplica a cada grupo construido mediante la cláusula Group By. Para expresar una
consulta de este tipo, usamos la cláusula “Having” de SQL. Los predicados de la cláusula Having se aplican después de la
formación de grupos, por lo que pueden utilizarse funciones de agregación. Expresamos esta consulta en SQL como sigue:
Como otro ejemplo del uso de funciones de agregados; considere la consulta “Encontrar aquellas sucursales con el
saldo promedio mayor”. Las funciones de agregados no pueden componerse en SQL. Significa que cualquier intento de
utilizar Max(Avg(...)) no estará permitida. En cambio, nuestra estrategia es encontrar aquellas sucursales para las que el
balance promedio es mayor o igual que todos los balances promedio.
SELECT Nombre_Sucursal
FROM Depósito
GROUP BY Nombre_Sucursal
HAVING Avg(Saldo) >=All (Select avg(saldo)
From Depósito
Group By Nombre_Sucursal)
A veces deseamos tratar la relación completa como un grupo único. En tales casos no usamos la cláusula Group By.
Considere la consulta “Encontrar el saldo promedio en todas las cuentas”. Escribimos esto como sigue:
La función de agregación Count se usa frecuentemente para contar el número de tuplas en una relación. La notación
para esto en SQL es count(*). Así, para encontrar el número de tuplas en la relación cliente, escribimos:
Las función Sum totaliza los valores de un campo. Por ejemplo, podría utilizar la función Sum para determinar el
total en dinero de préstamos efectuados por la sucursal “Perryridge”.
Puede utilizar, además las funciones Min y Max para determinar los valores mayor y menor de un campo basándose
en el agregado o agrupamiento especificado. Ejemplo: indicar el préstamo mayor efectuado por cada sucursal.
Operador Like:
Puede utilizar el operador Like para encontrar valores en un campo que coincidan con el modelo que se especificó.
Para modelo, puede especificar el valor completo(por ejemplo, Like “García”) o puede utilizar caracteres comodín para
encontrar un intervalo de valores (por ejemplo, Like “Ga*”).
En una expresión, puede utilizar el operador Like para comparar un valor de campo con una expresión de cadena.
Por ejemplo, si introduce Like “C*” en una consulta SQL, la consulta devuelve todos los valores de campo que empiezan con
la letra C.
El siguiente ejemplo devuelve los datos que empiezan con la letra P seguido de cualquier letra entre A y F y 3
números.
Like “P[A-F]###”
La tabla siguiente muestra cómo puede utilizar el operador Like para probar expresiones de diferentes
método modelos.
Hasta ahora hemos restringido nuestra atención a la extracción de información de la base de datos. Ahora
mostramos como añadir, eliminar o cambiar información usando SQL.
Una solicitud de eliminación se expresa casi de la misma forma que una consulta. Podemos suprimir
solamente tuplas completadas, no podemos suprimir valores sólo de atributos determinados. En SQL, una supresión se
expresa por medio de:
Delete r
From p
1. Suprimir todos los registros de cuentas del cliente cuyo rut es 11.345.123-2.
DELETE *
FROM Depósito
WHERE Rut = "11.345.123-2"
2. Suprimir todos los prestamos con números de prestamos entre 5000 y 6000.
DELETE *
FROM Préstamo
WHERE Número_Préstamo Between 5000 and 6000
DELETE *
FROM Depósito
WHERE Nombre_Sucursal in (Select Nombre_Sucursal
From Sucursal
Where Ciudad_Sucursal = "Rancagua");
Para insertar datos en una relación, especificamos una tupla que se va a insertar o escribimos una consulta cuyo
resultado es un conjunto de tuplas que se van a insertar. Obviamente, los valores de atributos para las tuplas insertadas
deben ser miembros del dominio de los atributos. Análogamente, las tuplas insertadas deben tener el número correcto de
atributos.
La sentencia Insert más sencilla es una solicitud para insertar una tupla.
Supóngase que queremos insertar el hecho de que el cliente cuyo Rut es “11.345.123-2” tiene $120.000 en la cuenta
9732 en la sucursal Las Condes. Escribimos
En el ejemplo anterior, los valores se especifican en el orden en que se listan los atributos correspondientes en el
esquema de la relación. Para beneficio de los usuarios que no pueden recordar el orden de los atributos, SQL permite
especificar los atributos como parte de la sentencia Insert. Las siguientes son sentencias Insert en SQL idénticas en función a
la anterior.
De forma más general, podríamos querer insertar tuplas basadas en el resultado de una consulta. Supóngase que
queremos proporcionar a todos los clientes con préstamos en la sucursal Perryridge, una cuenta de ahorro de $2.000. El
número de préstamos sirve como número de cuenta para la nueva cuenta de ahorro escribimos:
En vez de especificar una tupla como hicimos anteriormente, usamos un Select para especificar un conjunto de
tuplas. Cada tupla tiene el Nombre_Sucursal(Perryridge), un Número_Prestamo(que sirve como número de cuenta para la
nueva cuenta), el nombre del cliente del préstamo al que se va a dar la nueva cuenta y el saldo inicial de la nueva cuenta
2000.
Actualizaciones:
En ciertas situaciones podemos desear cambiar el valor en una tupla sin cambiar todos los valores en la
tupla. Para este propósito puede usarse la sentencia Update, como era el caso de Insert y Delete. Podemos elegir las tuplas
que se van a actualizar usando una consulta. Supóngase que se están haciendo pagos de interés y que todos los saldos se van
a incrementar un 5%. Escribimos
Update Depósito
Set Saldo = Saldo * 1.05
En la mayor parte de nuestras decisiones, referentes a SQL y Bases de Datos relacionales, hemos
supuesto que se nos daba un conjunto de relaciones. Por supuesto, el conjunto de relaciones en una Base de Datos debe ser
especificado al sistema por medio de un Lenguaje de Definición de Datos (DDL).
En SQL DDL proporciona ordenes para definir esquemas de relaciones, eliminar relaciones, crear índices y
modificar esquemas de relación. Una relación en SQL se define usando la orden “Create Table”.
Donde r es el nombre de la relación, cada Ai es el nombre de un atributo del esquema de la relación r y Di es el tipo
de dato de los valores en el dominio del atributo Ai. La orden Create Table también incluye opciones para especificar ciertas
restricciones de integridad.
Una relación recién creada está inicialmente vacía. La orden Insert puede usarse para cargar datos en la relación.
Ejemplos:
- Tabla Cliente
Create Table Cliente
(Rut Char(12) not null,
Nombre_Cliente Char(30) not null,
Calle Char (30) not null,
Ciudad_Cliente Char (30) not null,
Constraint Cli Primary Key(Rut))
- Tabla Sucursal
Create Table Sucursal
(Nombre_Sucursal Char(30) not null,
Ciudad_Sucursal Char(30) not null,
Activo Integer,
Constraint Suc Primary Key (Nombre_Sucursal))
- Tabla Depósito
Create Table Depósito
(Rut Char(12) not null,
Nombre_Sucursal Char(30) not null,
Número_Cuenta Integer,
Saldo Integer,
Constraint Dep Primary Key (Rut, Nombre_Sucursal, Número_Cuenta),
Constraint Clidep Foreign Key (Rut) references Cliente(Rut),
Constraint Clisuc Foreign Key (Nombre_Sucursal) references Sucursal(Nombre_Sucursal))
- Tabla Préstamo
Create Table Préstamo
(Rut Char(12) not null,
Nombre_Sucursal Char(30) not null,
Número_Préstamo Integer,
Cantidad Integer,
Constraint Dep Primary Key (Rut, Nombre_Sucursal, Número_Préstamo),
Constraint CliPre Foreign Key (Rut) references Cliente(Rut),
Constraint CliPresuc Foreign Key (Nombre_Sucursal) references Sucursal(Nombre_Sucursal))
DEPTO
Código Nombre Facultad Nombre_Director
12 Auditoría e Informática Ciencias Empresariales Alex Medina
24 Física y Química Educación Juan Perez
CARRERA
Código Nombre Código_Depto
1224 Administración 12
1313 Física 24
1408 Química 24
2010 Ing. Ejec. en Comp e Informática 12
2927 Auditoría 12
ASIGNATURA
Código Nombre Código_Carrera
10212 Base de Datos 2010
10213 Calculo I 2010
10214 Administración 2927
10215 Calculo II 1224
10216 Física I 1313
10217 Física II 1408
10218 Base de Datos 2927
PROFESOR
Rut Nombre Código_Depto Oficina Status Sueldo
12.345.678-9 Milton Ulloa Jara 24 3 Jornada Completa 600000
12.377.666-6 Alex Medina 12 1 Jornada Completa 640000
12.413.328-9 karen Espinoza 12 2 Pert-Time 630000
98.765.432-1 Wilson Marquez 24 4 Jornada Completa 695000
DICTAR
Código_Profesor Código_Asignatura Semestre Año
12.377.666-6 10212 1 01/03/2009
12.377.666-6 10218 1 01/03/2009
12.413.328-9 10213 1 01/03/2009
12.413.328-9 10215 1 01/03/2009
CLIENTE
Rut Nombre_Cliente Calle Ciudad_Cliente
11.345.123-2 Carmen Zavalla Pasaje el alelí 191 Villa Real Rancagua
11.456.233-3 Manuel Carquin Pasaje el alelí 191 Villa Real Rancagua
12.377.666-6 José Silva Villa Principal 1267 San Fernando
12.865.234-4 Pamela San Martín Rosas 795 Chillán
13.123.345-4 Mauricio Hidalgo Rosas 795 Chillán
13.345.455-5 Christian Arriagada Villa Centinela 1234 Rancagua
14.213.344-1 Gema Godoy Centenario 9090 Chillán
SUCURSAL
Nombre_Sucursal Ciudad_Sucursal Activo
Cardenal Caro Chillán 500.000
Las Condes San Fernando 370.000
Ñuble Chillán 400.000
Perryridge Rancagua 350.000
San Carlos Rancagua 200.000
DEPOSITO
Rut Nombre_Sucursal Número_Cuenta Saldo
11.345.123-2 Las Condes 1212 900.000
11.345.123-2 Las Condes 1213 900.000
11.345.123-2 Las Condes 1214 900.000
11.456.233-3 Perryridge 4567 30.000
12.377.666-6 Cardenal Caro 5678 70.000
12.377.666-6 Cardenal Caro 5679 90.000
12.865.234-4 Cardenal Caro 1132 97.000
13.123.345-4 Cardenal Caro 8989 77.000
13.345.455-5 San Carlos 3456 98.000
14.213.344-1 Perryridge 1237 100.000
PRESTAMO
Rut Nombre_Sucursal Número_Préstamo Cantidad
11.345.123-2 Ñuble 5678 1.000.000
12.377.666-6 Ñuble 7889 200.000
13.123.345-4 Perryridge 1237 3.000.000
14.213.344-1 Perryridge 5641 400.000