Apunte 1 SQL

32
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. Material Preparado por: Juan Pablo Betancourt Ravello 1

Transcript of Apunte 1 SQL

Page 1: Apunte 1 SQL

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

Page 2: Apunte 1 SQL

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

Page 3: Apunte 1 SQL

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

Material Preparado por: Juan Pablo Betancourt Ravello 3

Page 4: Apunte 1 SQL

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.

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

Page 5: Apunte 1 SQL

Una consulta típica en SQL tiene la forma:

Select A1, A2.................AnFrom R1, R2.................RmWhere 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_SucursalFROM 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

Page 6: Apunte 1 SQL

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 *

Material Preparado por: Juan Pablo Betancourt Ravello 6

Page 7: Apunte 1 SQL

FROM Representantes, PedidosWhere 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

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

Page 8: Apunte 1 SQL

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.*,ciudadFROM empleados, oficinasWHERE 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.*, ciudadFROM 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

Page 9: Apunte 1 SQL

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

Page 10: Apunte 1 SQL

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_ClienteFROM 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_ClienteFROM Cliente INNER JOIN Préstamo ON Cliente.Rut = Préstamo.Rut

WHERE Nombre_Sucursal = "Perryridge";

Material Preparado por: Juan Pablo Betancourt Ravello 10

Page 11: Apunte 1 SQL

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_CuentaFROM DepósitoWHERE Saldo Between 80.000 And 100.000

En vez de

SELECT Número_CuentaFROM DepósitoWHERE 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_ClienteFROM Depósito INNER JOIN Cliente ON Depósito.Rut = Cliente.RutWHERE 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_ClienteFROM 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_ClienteFROM Préstamo INNER JOIN Cliente ON Préstamo.Rut = Cliente.Rut WHERE Nombre_Sucursal = "Perryridge"UNIONSELECT DISTINCT Cliente.Rut, Nombre_ClienteFROM Depósito INNER JOIN Cliente ON Depósito.Rut = Cliente.RutWHERE 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_ClienteFROM Préstamo INNER JOIN Cliente ON Préstamo.Rut = Cliente.Rut WHERE Nombre_Sucursal = "Perryridge"

INTERSECTSELECT DISTINCT Cliente.Rut, Nombre_ClienteFROM Depósito INNER JOIN Cliente ON Depósito.Rut = Cliente.RutWHERE Nombre_Sucursal = "Perryridge";

Material Preparado por: Juan Pablo Betancourt Ravello 11

Page 12: Apunte 1 SQL

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_ClienteFROM Préstamo INNER JOIN Cliente ON Préstamo.Rut = Cliente.Rut WHERE Nombre_Sucursal = "Perryridge"

MINUSSELECT DISTINCT Cliente.Rut, Nombre_ClienteFROM Depósito INNER JOIN Cliente ON Depósito.Rut = Cliente.RutWHERE 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_ClienteFROM Depósito INNER JOIN Cliente ON Depósito.Rut = Cliente.RutWHERE 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_ClienteFROM Depósito INNER JOIN Cliente ON Depósito.Rut = Cliente.RutWHERE 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_ClienteFROM Depósito INNER JOIN Cliente ON Depósito.Rut = Cliente.RutWHERE 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

Page 13: Apunte 1 SQL

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_ClienteFROM Cliente AS s, Cliente AS tWHERE 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 ActivoFrom SucursalWhere Ciudad_Sucursal = “Rancagua”

Material Preparado por: Juan Pablo Betancourt Ravello 13

Page 14: Apunte 1 SQL

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

Page 15: Apunte 1 SQL

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_ClienteFROM Depósito INNER JOIN Cliente ON Depósito.Rut = Cliente.RutWHERE 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éstamoORDER 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

Page 16: Apunte 1 SQL

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 : AvgMínimo : MinMáximo : MaxTotal : SumContar : 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ósitoGROUP 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ósitoGROUP BY Nombre_SucursalHAVING 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_SucursalFROM DepósitoGROUP BY Nombre_SucursalHAVING 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

Page 17: Apunte 1 SQL

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.RutWHERE Ciudad_Cliente ="San Fernando"GROUP BY Cliente.Nombre_ClienteHAVING 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éstamoWHERE 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éstamoGROUP 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(Devuelve True)

No Coinciden(Devuelve False)

Múltiples Caracteres

a*a*ab*ab*

aa, aBa, aBBBaAABB, Xab, abcdefg, abc

aBCazb, bacCab, aab

Carácter Especial a[*]a a*a aaaUn único carácter a?a aaa, a3a, aBa aBBBaUn único numero a#a a0a, a1a, a2a aaa, a10aIntervalo 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

Material Preparado por: Juan Pablo Betancourt Ravello 17

Page 18: Apunte 1 SQL

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.

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ósitoWHERE Rut = "11.345.123-2"

2. Suprimir todos los prestamos con números de prestamos entre 5000 y 6000.

DELETE *FROM PréstamoWHERE Número_Préstamo Between 5000 and 6000

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

DELETE *FROM DepósitoWHERE Nombre_Sucursal in (Select Nombre_SucursalFrom SucursalWhere Ciudad_Sucursal = "Rancagua");

Material Preparado por: Juan Pablo Betancourt Ravello 18

Page 19: Apunte 1 SQL

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ósitoVALUES ("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ósitoSELECT Nombre_Sucursal AS Nombre_Sucursal, Número_Préstamo AS Número_Cuenta, Rut AS Rut, 2000 AS SaldoFROM PréstamoWHERE 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ósitoSet Saldo = Saldo * 1.05

Material Preparado por: Juan Pablo Betancourt Ravello 19

Page 20: Apunte 1 SQL

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

Page 21: Apunte 1 SQL

PRACTICO 1

Confeccione el Siguiente Diagrama en SQL SERVER

DEPTOCódigo Nombre Facultad Nombre_Director

12 Auditoría e Informática Ciencias Empresariales Alex Medina24 Física y Química Educación Juan Perez

CARRERACódigo Nombre Código_Depto

1224 Administración 121313 Física 241408 Química 242010 Ing. Ejec. en Comp e Informática 122927 Auditoría 12

ASIGNATURACódigo Nombre Código_Carrera

10212 Base de Datos 201010213 Calculo I 201010214 Administración 292710215 Calculo II 122410216 Física I 131310217 Física II 140810218 Base de Datos 2927

PROFESORRut Nombre Código_Dept

oOficina Status Sueldo

12.345.678-9 Milton Ulloa Jara 24 3 Jornada Completa

60000012.377.666-6 Alex Medina 12 1 Jornada

Completa640000

12.413.328-9 karen Espinoza 12 2 Pert-Time 63000098.765.432-1 Wilson Marquez 24 4 Jornada

Completa695000

DICTARCódigo_Profesor Código_Asignatu

raSemestre Año

12.377.666-6 10212 1 01/03/200912.377.666-6 10218 1 01/03/200912.413.328-9 10213 1 01/03/200912.413.328-9 10215 1 01/03/2009

Material Preparado por: Juan Pablo Betancourt Ravello 21

Page 22: Apunte 1 SQL

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 Completa13. Que Asignaturas dicta el docente Alex Medina

Material Preparado por: Juan Pablo Betancourt Ravello 22

Page 23: Apunte 1 SQL

PRACTICO Nº 2

Confeccione el Siguiente Diagrama en SQL SERVER

CONSIDERE LAS SIGUIENTES TABLAS:

CLIENTERut Nombre_Cliente Calle Ciudad_Cliente

11.345.123-2 Carmen Zavalla Pasaje el alelí 191 Villa Real

Rancagua11.456.233-3 Manuel Carquin Pasaje el alelí 191 Villa

RealRancagua

12.377.666-6 José Silva Villa Principal 1267 San Fernando12.865.234-4 Pamela San Martín Rosas 795 Chillán13.123.345-4 Mauricio Hidalgo Rosas 795 Chillán13.345.455-5 Christian

ArriagadaVilla Centinela 1234 Rancagua

14.213.344-1 Gema Godoy Centenario 9090 Chillán

SUCURSALNombre_Sucursal Ciudad_Sucursal Activo

Cardenal Caro Chillán 500.000Las Condes San Fernando 370.000Ñuble Chillán 400.000Perryridge Rancagua 350.000San Carlos Rancagua 200.000

DEPOSITORut Nombre_Sucursal Número_Cuenta Saldo

11.345.123-2 Las Condes 1212 900.00011.345.123-2 Las Condes 1213 900.00011.345.123-2 Las Condes 1214 900.00011.456.233-3 Perryridge 4567 30.00012.377.666-6 Cardenal Caro 5678 70.00012.377.666-6 Cardenal Caro 5679 90.00012.865.234-4 Cardenal Caro 1132 97.00013.123.345-4 Cardenal Caro 8989 77.00013.345.455-5 San Carlos 3456 98.00014.213.344-1 Perryridge 1237 100.000

PRESTAMORut Nombre_Sucursal Número_Préstamo Cantidad

11.345.123-2 Ñuble 5678 1.000.00012.377.666-6 Ñuble 7889 200.00013.123.345-4 Perryridge 1237 3.000.00014.213.344-1 Perryridge 5641 400.000

Material Preparado por: Juan Pablo Betancourt Ravello 23

Page 24: Apunte 1 SQL

Responder las siguientes consultas en SQL Server

1. Encontrar las sucursales que tengan actualmente préstamos2. Encontrar el nombre y la ciudad de todos los clientes que tienen préstamos3. 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 1000005. 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 sucursal10. Encontrar el nombre y la ciudad de todos los clientes que tienen un préstamo en alguna sucursal11. 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éstamo16. 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éstamo18. Encontrar las 3 sucursales que poseen el activo mayor19. Encontrar el 10% de las sucursales con mayor activo20. Obtener la ciudad y calle en que vive el Sr. Silva21. Listar las personas que vivan en la calle Villa Real

Material Preparado por: Juan Pablo Betancourt Ravello 24