Você está na página 1de 24

CREAR UNA BASE DE DATOS EN SQL SERVER

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 UNA BASE DE DATOS

1. Dentro del Administrador Corporativo haga


clic sobre el icono Servidores Microsoft SQL
Server y luego expanda un servidor.
2. Haga clic con el botón derecho del mouse en
la carpeta Bases de datos y escoga nueva base
de datos.
3. Digite un nombre para la nueva base de datos
en la caja de diálogo que aparece.

CREAR TABLAS

Para crear una tabla, haga lo siguiente:

1. Abra la carpeta Bases de


Datos y la base de datos
donde desea crear la tabla.
En seguida, haga clic con el
botón derecho del mouse en
la carpeta Tablas y
seleccione la opción Nueva
Tabla.
2. Una caja de diálogo le pide
entonces el nombre de la
tabla. Ingrese el nombre y
presione Aceptar.
3. La ventana que aparece debe
usarce para determinar las
caracteristicas de las columnas de la tabla que se va a crear.

CREAR DIAGRAMAS DE BASES DE DATOS

Los diagramas de bases de datos son una representación gráfica de la base de datos. Para crear un diagrama siga
estos pasos:

1. Abra la base de datos.


2. Haga clic con el botón derecho del mouse en la carpeta Diagramas y seleccione Nuevo diagrama de base de datos.
3. Se activa entonces el asistente (Wizard). Siga las instrucciones de la caja de diálogo.

Material Preparado por: Juan Pablo Betancourt Ravello 1


Crear relaciones entre tablas

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.

ANALISTA DE CONSULTAS (QUERY ANALYZER)

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.

Digitar y ejecutar una consulta

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.

Material Preparado por: Juan Pablo Betancourt Ravello 2


Guardar y recuperar una
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.

Para cargar una consulta, siga estos pasos:

1. En el menú Archivo, haga un clic en la opción Abrir.


2. Seleccione el sitio donde está la consulta, y en el campo Nombre de Archivo, digite el nombre de la consulta. Recuerde
que la extensión .sql se agrega al nombre del archivo de la misma.
Las últimas cinco consultas guardadas aparecen al final del menú Archivo.

Cambiar ubicación de bases de datos SQL Server del servidor

Cada base de datos de SQL Server tiene al menos dos archivos:


 El archivo de datos que tiene extensión mdf.
 El archivo de transacciones que tiene extensión ldf.
Estos dos archivos se encuentran en "C:\Archivos de Progama\Microsoft SQL Server\MSSQL\Data". Si por algún
motivo necesitamos cambiar la ubicación de estos archivos a otra carpeta o a otro disco tenemos que realizar un proceso
sencillo pero laborioso. Vamos a ver paso a paso como realizar este cambio de ubicación de los ficheros de las bases de
datos.
Para mover la ubicación de los archivos de nuestras bases de datos vamos a suponer que hemos realizado una
instalación por defecto del SQL Server, es decir, las bases de datos se encuentran en la carpeta "C:\Archivos de
Progama\Microsoft SQL Server\MSSQL\Data", y queremos llevarlas a un disco distinto, por ejemplo a "D:\"

Mover Bases de Datos de Usuarios


A continuación vamos a mover las bases de datos de usuarios. Si tenemos una base de datos llamada "Pruebas" en el
analizador de consultas ejecutamos el siguiente script para separar la base de datos del servidor

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.

Material Preparado por: Juan Pablo Betancourt Ravello 3


SQL se ha establecido claramente como el “Lenguaje de Base de Datos Relacionar Estándar”.
El lenguaje SQL tiene varias partes:

Lenguaje de Definición de Datos (DDL) :


El SQL DDL proporciona órdenes para definir esquemas de relación, eliminar relaciones, crear índices y modificar
esquemas de relación.

Lenguaje de Manipulación de Datos Interactivo (DML) :


El SQL DML incluye un lenguaje de consultas basado en el álgebra relacional y el cálculo relacional de tuplas.
También incluye órdenes para insertar, suprimir y modificar tuplas de la Base de Datos.

Lenguaje de Manipulación de Datos Inmersos (DML) :


La forma inmersa de SQL esta diseñada para usar dentro de los lenguajes de programación de propósito general,
tales como PL/I, Cobol, Pascal, Fortran y C.

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 :

SQL incluye ordenes para especificar el comienzo y final de las transacciones.

Estructura Básicas

La estructura básica de una expresión en SQL consta de 3 clausulas :

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.

Material Preparado por: Juan Pablo Betancourt Ravello 4


Una consulta típica en SQL tiene la forma:

Select A1, A2.................An


From R1, R2.................Rm
Where P

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:

 A1, A2.........An ( P (R1 x R2 x.............Rm))

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

Operaciones de conjuntos y tuplas Duplicadas

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.

SELECT DISTINCT Nombre_Sucursal


FROM Depósito

Notese que SQL permite el uso de la palabra clave “ All ” para especificar explícitamente que no se eliminen los duplicados.

SELECT All Nombre_Sucursal


FROM Depósito

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.

Material Preparado por: Juan Pablo Betancourt Ravello 5


La composicón de tablas
La composición 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. Esto es muy útil cuando queremos visualizar
filas cuyos datos se encuentran en dos tablas.

Por ejemplo queremos listar los pedidos con el nombre del


representante que ha hecho el pedido, pues los datos del pedido los tenemos
en la tabla de pedidos pero el nombre del representante está en la tabla de
empleados y además queremos que aparezcan en la misma línea; en este caso
necesitamos componer las dos tablas

Existen distintos tipos de composición, aprenderemos a utilizarlos todos y a elegir el tipo más apropiado a cada caso.

Los tipos de composición de tablas son:


 El producto cartesiano
 El INNER JOIN
 El LEFT / RIGHT JOIN

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

Material Preparado por: Juan Pablo Betancourt Ravello 6


El INNER JOIN es otro tipo de composición de tablas, permite emparejar filas de distintas tablas de forma más
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 las filas que cumplen la condición de emparejamiento, para cada
fila de una de las tablas busca directamente en la otra tabla las filas que cumplen la condición, con lo cual se emparejan
sólo 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 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.

Material Preparado por: Juan Pablo Betancourt Ravello 7


El LEFT JOIN y RIGHT JOIN
El LEFT JOIN y RIGHT JOIN son otro tipo de composición de tablas, también denominada composición
externa. Son una extensión del INNER JOIN.
Las composiciones vistas hasta ahora (el producto cartesiano y el INNER JOIN) son composiciones internas ya
que todos los valores de las filas del resultado son valores que están en las tablas que se combinan.
Con una composición interna sólo se obtienen las filas que tienen al menos una fila de la otra tabla que cumpla la
condición, 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 condición 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 pasara lo mismo, los empleados que tienen un valor nulo en el campo oficina, no aparecerán en el resultado.
Pues en los casos en que queremos que también 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 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.

Material Preparado por: Juan Pablo Betancourt Ravello 8


La sintaxis del RIGHT JOIN es la siguiente:

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".
 

Material Preparado por: Juan Pablo Betancourt Ravello 9


Predicados y Conectores

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í:

SELECT DISTINCT Cliente.Rut, Nombre_Cliente, Ciudad_Cliente


FROM Cliente INNER JOIN Préstamo ON Cliente.Rut = Préstamo.Rut;

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 DISTINCT Cliente.Rut, Nombre_Cliente, Ciudad_Cliente


FROM Cliente INNER JOIN Préstamo ON Cliente.Rut = Préstamo.Rut
WHERE Nombre_Sucursal = "Perryridge";

Material Preparado por: Juan Pablo Betancourt Ravello 10


SQL usa los conectores lógicos And, Or y Not en vez de los símbolos matemático , y .
SQL incluye un operador de comparación Between para simplificar cláusulas Where que especifican que un valor
que sea menor o igual que un valor dado y mayor o igual que otro valor dado. Si queremos encontrar el número de cuenta de
las cuentas con saldos entre 80.000 y 100.000 podemos usar la comparación Between para escribir:

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”.

SELECT DISTINCT Cliente.Rut, Nombre_Cliente


FROM Depósito INNER JOIN Cliente ON Depósito.Rut = Cliente.Rut
WHERE Nombre_Sucursal = "Perryridge"

A continuación, encontrar a todos los clientes que tienen un préstamo en la sucursal “Perryridge”.

SELECT DISTINCT Cliente.Rut, Nombre_Cliente


FROM Préstamo INNER JOIN Cliente ON Préstamo.Rut = Cliente.Rut
WHERE Nombre_Sucursal = "Perryridge";

Para encontrar a todos los clientes que tienen un préstamo, una cuenta, o los dos en la sucursal “Perryridge”,
escribimos:

SELECT DISTINCT Cliente.Rut, Nombre_Cliente


FROM Préstamo INNER JOIN Cliente ON Préstamo.Rut = Cliente.Rut
WHERE Nombre_Sucursal = "Perryridge"
UNION
SELECT DISTINCT Cliente.Rut, Nombre_Cliente
FROM Depósito INNER JOIN Cliente ON Depósito.Rut = Cliente.Rut
WHERE Nombre_Sucursal = "Perryridge";

De manera similar, para encontrar a todos los clientes que tienen un préstamo y una cuenta en la sucursal
“Perryridge”, escribimos:

SELECT DISTINCT Cliente.Rut, Nombre_Cliente


FROM Préstamo INNER JOIN Cliente ON Préstamo.Rut = Cliente.Rut
WHERE Nombre_Sucursal = "Perryridge"
INTERSECT
SELECT DISTINCT Cliente.Rut, Nombre_Cliente
FROM Depósito INNER JOIN Cliente ON Depósito.Rut = Cliente.Rut
WHERE Nombre_Sucursal = "Perryridge";

Material Preparado por: Juan Pablo Betancourt Ravello 11


Para encontrar a todos los clientes de la sucursal “Perryridge” que tienen una cuenta allí, pero no un préstamo,
escribimos:

SELECT DISTINCT Cliente.Rut, Nombre_Cliente


FROM Préstamo INNER JOIN Cliente ON Préstamo.Rut = Cliente.Rut
WHERE Nombre_Sucursal = "Perryridge"
MINUS
SELECT DISTINCT Cliente.Rut, Nombre_Cliente
FROM Depósito INNER JOIN Cliente ON Depósito.Rut = Cliente.Rut
WHERE Nombre_Sucursal = "Perryridge";

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.

SELECT DISTINCT Cliente.Rut, Nombre_Cliente


FROM Depósito INNER JOIN Cliente ON Depósito.Rut = Cliente.Rut
WHERE Nombre_Sucursal = "Perryridge";

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:

SELECT DISTINCT Cliente.Rut, Nombre_Cliente


FROM Depósito INNER JOIN Cliente ON Depósito.Rut = Cliente.Rut
WHERE Nombre_Sucursal = "Perryridge"
and Cliente.Rut in (SELECT Cliente.Rut
FROM Préstamo INNER JOIN Cliente ON Cliente.Rut = Préstamo.Rut
WHERE Nombre_Sucursal = "Perryridge");

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:

SELECT DISTINCT Cliente.Rut, Nombre_Cliente


FROM Depósito INNER JOIN Cliente ON Depósito.Rut = Cliente.Rut
WHERE Nombre_Sucursal = "Perryridge"
and Cliente.Rut not in (SELECT Cliente.Rut
FROM Préstamo INNER JOIN Cliente ON Cliente.Rut = Préstamo.Rut
WHERE Nombre_Sucursal = "Perryridge");

Material Preparado por: Juan Pablo Betancourt Ravello 12


Variables de Tuplas

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í:

SELECT DISTINCT T.nombre_cliente, T.ciudad_cliente


FROM Préstamo AS S, Cliente AS T
WHERE S.Rut = T.Rut;

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:

SELECT DISTINCT t.Nombre_Cliente, t.Calle, t.Ciudad_Cliente


FROM Cliente AS s, Cliente AS t
WHERE S.Nombre_Cliente = "Christian Arriagada" and S.Ciudad_Cliente = T.Ciudad_Cliente;

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.

Apuntamos que un camino alternativo para expresar esta consulta es:

SELECT DISTINCT Nombre_Cliente, Calle, Ciudad_Cliente


FROM Cliente
WHERE Ciudad_Cliente in (SELECT Ciudad_Cliente
FROM Cliente
WHERE Nombre_Cliente = "Christian Arriagada");

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.

SELECT DISTINCT t.Nombre_Sucursal


FROM Sucursal AS t, Sucursal AS s
WHERE t.Activo > s.Activo and s.Ciudad_Sucursal = "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”

Material Preparado por: Juan Pablo Betancourt Ravello 13


Genera el conjunto de todos los valores de los activos de las sucursales de Rancagua. La comparación > some en la
cláusula Where del Select externo es verdadera si el valor activo de la tupla es mayor que al menos un miembro del conjunto
de todos los valores del activo de las sucursales de Rancagua.
SQL también permite las comparaciones Menor alguno (< some), Menor igual alguno (<= some), Mayor igual
alguno (>= some), Igual alguno (= some) y distinto alguno (<> some). Como ejercicio, verifique que =some es idéntica a IN.
Ahora modifiquemos ligeramente la consulta. Encontrar los nombres de todas las sucursales que tienen un activo
mayor que todas las sucursales de Rancagua. La construcción > ALL corresponde a la frase “Mayor que todos”. Usando
esta construcción escribimos la consulta como sigue:

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.

Pruebas para relaciones vacías

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");

Material Preparado por: Juan Pablo Betancourt Ravello 14


Ordenación de la Presentación de Tuplas

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:

SELECT DISTINCT Cliente.Rut, Nombre_Cliente


FROM Depósito INNER JOIN Cliente ON Depósito.Rut = Cliente.Rut
WHERE Nombre_Sucursal = "Perryridge";
ORDER BY Nombre_Cliente;

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.

SELECT TOP 3 Nombre_Sucursal, Activo


FROM Sucursal
ORDER BY Activo;

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:

SELECT TOP 10 PERCENT Nombre_Sucursal, Activo


FROM Sucursal
ORDER BY Activo;

Material Preparado por: Juan Pablo Betancourt Ravello 15


Funciones de Agregación

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:

SELECT Nombre_Sucursal, AVG(Saldo) AS [Promedio de Saldos]


FROM Depósito
GROUP BY Nombre_Sucursal

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:

SELECT Nombre_Sucursal, AVG(Saldo) AS [Promedio de Saldos]


FROM Depósito
GROUP BY Nombre_Sucursal
HAVING AVG(Saldo) > 70000

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:

SELECT avg(saldo) AS [Promedio de Depósitos]


FROM Depósito

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:

SELECT count(*) AS [Número de Clientes]


FROM Cliente

Material Preparado por: Juan Pablo Betancourt Ravello 16


Si en la misma consulta aparecen una cláusula where y una cláusula Having, primero se aplica el predicado de la
columna where. Las tuplas que satisfacen el predicado where son colocadas en grupos por la cláusula Group By. Después se
aplica la cláusula Having a cada grupo. Los grupos que satisfacen el predicado de la cláusula Having son utilizados por la
cláusula Select para generar tuplas del resultado de la cláusula. Si no hay cláusula Having, el conjunto completo de tuplas
que satisfacen la cláusula where se trata como un grupo único. Para ilustrar el uso de una cláusula where y una cláusula
Having en la misma consulta, considere la consulta “ Encontrar el saldo promedio de todos los clientes con depósitos que
viven en San Fernando y tienen por lo menos 2 cuentas”.

SELECT DISTINCT Cliente.Nombre_Cliente, Avg (Saldo) AS [Saldo Promedio]


FROM Depósito INNER JOIN Cliente ON Depósito.Rut = Cliente.Rut
WHERE Ciudad_Cliente ="San Fernando"
GROUP BY Cliente.Nombre_Cliente
HAVING Count (Número_Cuenta) >= 2;

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”.

SELECT DISTINCT Nombre_Sucursal, Sum(Cantidad) AS [Total préstamo]


FROM Préstamo
WHERE Nombre_Sucursal = "Perryridge"
GROUP BY Nombre_Sucursal;

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.

SELECT Préstamo.Nombre_Sucursal, Max(Cantidad) AS [Préstamo Mayor]


FROM Préstamo
GROUP BY Préstamo.Nombre_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.

Tipo de Coincidencia Modelo Coincide No Coinciden


(Devuelve True) (Devuelve False)
Múltiples Caracteres a*a aa, aBa, aBBBa aBC
*ab* AABB, Xab, azb, bac
ab* abcdefg, abc Cab, aab
Carácter Especial a[*]a a*a aaa
Un único carácter a?a aaa, a3a, aBa aBBBa
Un único numero a#a a0a, a1a, a2a aaa, a10a
Intervalo de caracteres [a-z] f, p, g 2, &
Fuera de un intervalo [!a-z] 9, &, % b, a
Distinto de número [!0-9] A, a, &, $ 0, 1, 9
Combinado a[!b-m] # An9, az0, a99 abc, aj0

Ejemplo: Obtener la ciudad y la calle en que vive el Sr. Silva.

SELECT DISTINCT Cliente.*


FROM Cliente
WHERE Nombre_Cliente Like "*Silva*";

Modificación de la Base de Datos

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.

Material Preparado por: Juan Pablo Betancourt Ravello 17


Eliminación:

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

Damos algunos ejemplos de solicitudes de supresión en SQL:

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

3. Suprimir todas las cuentas en las sucursales situadas en Rancagua.

DELETE *
FROM Depósito
WHERE Nombre_Sucursal in (Select Nombre_Sucursal
From Sucursal
Where Ciudad_Sucursal = "Rancagua");

Material Preparado por: Juan Pablo Betancourt Ravello 18


Inserción:

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

INSERT INTO Depósito


VALUES ("11.345.123-2", "Las Condes", 9732, 120000);

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.

INSERT INTO Depósito ( Nombre_Sucursal, Número_Cuenta, Rut, Saldo )


VALUES ("Perryridge", 9732, "11.345.123-2", 120000)

INSERT INTO Depósito (Número_Cuenta, Rut, Nombre_Sucursal, Saldo)


VALUES (9732, "11.345.123-2", "Perryridge", 120000)

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:

INSERT INTO Depósito


SELECT Nombre_Sucursal AS Nombre_Sucursal, Número_Préstamo AS Número_Cuenta, Rut AS Rut, 2000 AS Saldo
FROM Préstamo
WHERE Nombre_Sucursal = "Perryridge";

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

Material Preparado por: Juan Pablo Betancourt Ravello 19


Definición de Datos:

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”.

Create Table r (A1D1, A2D2,.........AnDn)

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))

Material Preparado por: Juan Pablo Betancourt Ravello 20


PRACTICO 1

 Confeccione el Siguiente Diagrama en SQL SERVER

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

Material Preparado por: Juan Pablo Betancourt Ravello 21


Responder las siguientes consultas en SQL Server

1. Listar los nombres de los profesores de la facultad de "Ciencias Empresariales".


2. Listar el nombre de todas las asignaturas dictadas por la carrera con código 2927.
3. Listar las carreras que dicta la facultad de "Ciencias Empresariales".
4. Obtener rut, nombre y status de profesores que pertenecen al depto de "Física y Quimica".
5. ¿Qué profesor dicta la asignatura 10218 ?.
6. Obtener la facultad a la que pertenece el profesor "MILTON ULLOA JARA".
7. Listar código y nombre de las carreras que pertenecen al depto de "Auditoria e Informática".
8. Listar las asignaturas dictadas para la carrera de "Ing. Ejec. En Comp. E Informatíca".
9. ¿A qué facultad pertenece la asignatura "Física I"?
10. ¿A qué facultad pertenece la carrera de "Administración"?
11. ¿Profesores cuyos sueldos están entre 600000 y 650000?
12. listar profesores que tienen el status de Jornada Completa
13. Que Asignaturas dicta el docente Alex Medina

Material Preparado por: Juan Pablo Betancourt Ravello 22


PRACTICO Nº 2

Confeccione el Siguiente Diagrama en SQL SERVER

CONSIDERE LAS SIGUIENTES TABLAS:

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

Material Preparado por: Juan Pablo Betancourt Ravello 23


Responder las siguientes consultas en SQL Server

1. Encontrar las sucursales que tengan actualmente préstamos


2. Encontrar el nombre y la ciudad de todos los clientes que tienen préstamos
3. Encontrar el nombre y la ciudad de todos los clientes que tienen un préstamo en la sucursal de “Perryridge”
4. Encontrar el número de cuenta de las cuentas con saldos entre 80000 y 100000
5. Encontrar todos los clientes que tienen una cuenta en la sucursal de “Perryridge”
6. Encontrar todos los clientes que tienen un préstamo en la sucursal de “Perryridge”
7. Encontrar todos los clientes que tienen un préstamo, una cuenta, o los dos en la sucursal de “Perryridge”
8. Encontrar todos los clientes que tienen un préstamo y una cuenta en la sucursal de “Perryridge”
9. Encontrar a todos los clientes que tienen una cuenta en la sucursal de “Perryridge” pero no tienen un préstamo en la
sucursal
10. Encontrar el nombre y la ciudad de todos los clientes que tienen un préstamo en alguna sucursal
11. Encontrar a todos los clientes que viven en la misma ciudad que el cliente “Christian Arriagada”
12. Encontrar los nombres de todas las sucursales que tienen un activo mayor que alguna sucursal situada en “Rancagua”
13. Encontrar los nombres de todas las sucursales que tienen un activo mayor que todas las sucursales de “Rancagua”
14. Encontrar a todos los clientes que tienen una cuenta y un préstamo en la sucrsal de “Perryridge”
15. Encontrar a todos los clientes de la sucursal de ”Perryridge” que tienen una cuenta allí pero no un préstamo
16. Listar en orden alfabético todos los clientes que tienen un préstamo en la sucursal de “Perryridge”
17. Listar monto préstamo en orden Descendente y Ascendente en relación al número de préstamo
18. Encontrar las 3 sucursales que poseen el activo mayor
19. Encontrar el 10% de las sucursales con mayor activo
20. Obtener la ciudad y calle en que vive el Sr. Silva
21. Listar las personas que vivan en la calle Villa Real

Material Preparado por: Juan Pablo Betancourt Ravello 24

Você também pode gostar