TEMA 5: Lenguajes de consulta. SQL.

Tamaño: px
Comenzar la demostración a partir de la página:

Download "TEMA 5: Lenguajes de consulta. SQL."

Transcripción

1 1. Introducción TEMA 5: Lenguajes de consulta. SQL. Básicamente, podemos decir que un lenguaje de consulta es un lenguaje usado por el usuario para solicitar información a la base de datos. En el tema anterior, se ha comentado que Codd propuso dos lenguajes formales para representar consultas de una forma concisa, sin embargo, los sistemas de bases de datos comerciales necesitan un lenguaje de consultas más cómodo para el usuario. En este tema veremos el lenguaje comercial que mayor influencia tiene, el SQL. En el tema 1 (punto 3.3. Lenguajes de la base de datos) vimos que la interacción con la base de datos se realiza a través de lenguajes; el lenguaje de definición de datos (DDL o LDD) y el lenguaje de manipulación de datos (DML o LMD, dentro del cual contemplábamos el lenguaje de consulta como la parte del LMD que permitía recuperar información). Aunque a menudo se diga que el SQL es un lenguaje de consulta, es necesario recordar que esto no es exactamente cierto dado que contiene muchas otras capacidades además de la de consultar la base de datos, como son; la definición de la propia estructura de los datos, la manipulación de dichos datos y la especificación de las ligaduras de seguridad. El lenguaje estructurado de consultas SQL (Structured Query Language) es un lenguaje combinado de manipulación y definición de datos, y que permite expresar diversas operaciones con los datos almacenados en las bases de datos relacionales. El SQL fue desarrollado a principios de los años 70 en E.E.U.U por I.B.M. cuando, después de que su empleado Codd publicara su artículo sobre las Bases de Datos Relacionales, I.B.M. decidió desarrollar el primer prototipo de BDR llamado System R que utilizaba un lenguaje llamado SEQUEL (que posteriormente fue el SQL). El Instituto Nacional Americano de Normalización (ANSI, American National Standards Institute) adoptó el lenguaje SQL como estándar, publicando y desarrollando unas especificaciones. En 1986, la Organización Internacional de Normalización (ISO, International Standards Organization) aceptó estas normas y se les denominó SQL-86. Esto no significa que todos los productos sigan estrictamente esta norma, principalmente porque el estándar no cubre todas las necesidades planteadas. Este es el motivo por el que, en 1989, se publicó una norma extendida para el SQL denominada SQL-89. Actualmente los sistemas de bases de datos son en general compatibles, al menos, con las características del SQL-89. La versión actual de la norma SQL ANSI/ISO es la norma SQL-92. Se debe tener en cuenta que algunas implementaciones de SQL pueden ser solo compatibles con SQL-89 y no con SQL-92. Como ya se ha dicho, SQL es tanto un LDD como LMD por lo que existen dos tipos de sentencias: Sentencias de definición de datos (Data Definition Language) que proporcionan las órdenes para definir o modificar esquemas de relación, eliminar relaciones y crear índices. Algunos ejemplos de sentencias son las de tipo CREATE y DROP. Sentencias de manipulación de datos (Data Manipulation Language) que nos permiten realizar consultas y mantener los datos es decir; insertar, suprimir o modificar los datos. Comienzan con las siguientes palabras del lenguaje: SELECT, INSERT, UPDATE y DELETE. En este tema vamos a realizar una descripción del lenguaje SQL aunque omitiremos algunas partes referentes al LDD (creación de permisos, seguridad y control de transacciones) debido a la brevedad del curso. 1

2 A continuación se muestra el ejemplo de base de datos relacional con el que vamos a trabajar durante todo el tema y en base al cual mostraremos los diferentes ejemplos de sentencias SQL. OFICINAS oficina ciudad region dir objetivo ventas CLIENTES num_clie empresa rep_clie limite_credito REPVENTAS num_empl nombre edad oficina_rep titulo contrato director cuota ventas PRODUCTOS id_fab id_producto descripcion precio existencias PEDIDOS num_pedido fecha_pedido clie rep fab producto cant importe OFICINA CIUDAD REGION DIR OBJETIVO VENTAS 22 Toledo Centro Valencia Este Barcelona Este Alicante Este Madrid Centro La relación OFICINAS almacena datos acerca de cada una de las cinco oficinas de ventas incluyendo la ciudad en donde está localizada la oficina, la región de ventas a la que pertenece, etc. La relación CLIENTES almacena datos acerca de cada cliente, tales como el nombre de la empresa, el límite de crédito y el vendedor que atiende al cliente. NUM_CLIE EMPRESA REP_CLIE LIMITE_CREDITO 2111 EVBE S.A Exclusivas del Este S.L Pino S.L Hnos. Martinez S.A Distribuciones Sur S.A AFS S.A Exclusivas Soriano S.A Lopez Asociados S.L Hernandez & hijos S.L Componentes Fernandez S.A Domingo S.L Zapater Importaciones S.A Hnos. Ramon S.L JPF S.L Distribuciones Montiel S.L Construcciones Leon S.A Martinez & Garcia S.L Exclusivas Norte S.A Importaciones Martin S.L Roda & Castedo S.L MALB S.A

3 La relación PEDIDOS lleva la cuenta de cada pedido remitido por un cliente, identificando al vendedor que aceptó el pedido, el producto solicitado, la cantidad y el importe del pedido, etc. Por simplicidad, cada pedido atañe a un solo producto. NUM_PEDIDO FECHA_PEDIDO CLIE REP FAB PRODUCTO CANT IMPORTE /12/ REI 2A44L /01/ ACI /01/ FEA /02/ QSA XK /10/ ACI /01/ ACI 4100Z /02/ REI 2A44R /12/ ACI /01/ BIC /02/ FEA /01/ BIC /12/ ACI /01/ QSA XK /02/ FEA /10/ ACI 4100Z /02/ ACI /01/ IMM 773C /03/ IMM 775C /01/ REI 2A45C /11/ ACI /10/ REI 2A44G /02/ ACI 4100X /02/ IMM 779C /01/ REI 2A45C /02/ QSA XK /01/ IMM 779C /02/ QSA XK /12/ ACI 4100Y /02/ ACI 4100X /02/ REI 2A44R ID_FAB ID_PRODUCTO DESCRIPCION PRECIO EXISTENCIAS REI 2A45C V Stago Trinquete ACI 4100Y Extractor QSA XK47 Reductor BIC Plate IMM 779C Riostra 2-Tm ACI Artículo Tipo ACI Artículo Tipo BIC Manivela IMM 887P Perno Riostra QSA XK48 Reductor REI 2A44L Bisagra Izqda FEA 112 Cubierta IMM 887H Soporte Riostra BIC Reten ACI Artículo Tipo IMM 775C Riostra 1-Tm ACI 4100Z Montador QSA XK48A Reductor ACI Artículo Tipo REI 2A44R Bisagra Dcha IMM 773C Riostra 1/2-Tm ACI 4100X Ajustador FEA 114 Bancada Motor IMM 887X Retenedor Riostra REI 2A44G Pasador Bisagra La relación PRODUCTOS almacena datos acerca de cada producto disponible para venta, tal como el fabricante, el número del producto, su descripción y su precio. 3

4 La relación REPVENTAS almacena el número de empleado, el nombre, la edad, las ventas anuales hasta la fecha y otros datos referentes a cada vendedor. NUM_EMPL NOMBRE EDAD OFICINA_REP TITULO CONTRATO DIRECTOR CUOTA VENTAS 106 Jose Maldonado VP Ventas 14/06/1998 NULL Carlos Martinez Dir. Ventas 19/05/ Belen Aguirre Dir. Ventas 12/02/ Maria Garcia Rep. Ventas 12/10/ Lorenzo Fernandez Dir. Ventas 12/10/ Soledad Martinez Rep. Ventas 10/12/ Daniel Gutierrez Rep. Ventas 20/10/ Antonio Valle 41 NULL Rep. Ventas 13/01/ NULL Pedro Cruz Rep. Ventas 01/03/ Natalia Martin Rep. Ventas 14/11/ Tipos de dominios en SQL En SQL tenemos diferentes tipos de dominios predefinidos sobre los que se definen los datos. Veamos algunos de ellos: 2.1. CHAR y VARCHAR Los tipos CHAR y VARCHAR se usan para definir cadenas de texto genéricas, y puede contener caracteres con cualquier valor ASCII. El número máximo de caracteres que admiten es 255. La diferencia entre ambos es que mientras CHAR proporciona un tamaño fijo para una cadena, VARCHAR admite una cantidad variable de caracteres. La sintaxis para este tipo es CHAR(n) o VARCHAR(n), donde n indica la longitud. Sus contenidos se especifican entre comillas simples. Ejemplo: Hola, 09-MAR-98, Jackie, s INTEGER Sus valores son números enteros, positivos o negativos. Normalmente, con este tipo se pueden definir todos los números enteros entre y , aunque en realidad los límites vienen definidos por la máquina FLOAT Sus valores representan números en coma flotante, es decir, números positivos o negativos que pueden tener decimales. La sintaxis para este tipo es FLOAT(n), donde n es la precisión que como mínimo se desea que tenga el número DATE Se usa para almacenar información de una fecha. Son validas todas las fechas del calendario gregoriano, empezando en el día 1 de Enero del año 1 y terminando el 31 de Diciembre del año 9999, ambos inclusive. Se representa en formato día, mes y año (dd/mm/aaaa) TIME Representa una hora determinada con precisión de segundos (HH:MM:SS) NULL No se trata de un tipo de datos concreto. Es más bien un valor que indica la ausencia de cualquier valor. Por ejemplo, en una columna de tipo numérico el valor nulo no es lo mismo que el valor cero, o en una columna de tipo alfanumérico, el nulo no es lo mismo que blanco o que el valor vacío (longitud cero). Para comparar valores con NULL sólo podremos usar los operadores IS NULL o IS NOT NULL. 4

5 3. Consultas simples Una consulta en SQL consta básicamente de dos cláusulas obligatorias (SELECT y FROM) a las que se le pueden añadir opcionalmente otras cuatro cláusulas (WHERE, GROUP BY, HAVING y ORDER BY) Las cláusulas SELECT / FROM La cláusula SELECT que inicia cada sentencia especifica la lista de atributos de los datos que queremos recuperar en la consulta. Corresponde con la operación de proyección del álgebra relacional. Para especificar la lista de elementos seleccionados podemos escribir cualquiera de los elementos siguientes teniendo en cuenta que, si hay más de uno, estarán separados por comas. El nombre de una columna, que hará referencia a un atributo de la tabla que especifiquemos en la cláusula FROM. Más adelante veremos que, en determinadas ocasiones, al tener más de una tabla en la cláusula FROM necesitaremos además especificar el nombre de la tabla a la que pertenece dicho atributo escrito de la siguiente forma: mi_tabla.atributo_seleccionado El valor *, para indicar que se desea información de todas las columnas que forman la tabla. Una constante, especificando que el valor constante va a aparecer en todas las filas de los resultados de la consulta. O una expresión SQL, indicando que SQL debe calcular el valor a colocar en los resultados según el estilo especificado por la expresión, por ejemplo: AVG.Esto lo veremos más adelante. La cláusula FROM es la que indica sobre que tabla/s se desea recuperar información. Si hay más de una, se separan los nombres de las tablas por comas (y esto correspondería al producto cartesiano del álgebra relacional). El resultado de una consulta SQL es siempre una tabla de datos, semejante a las tablas de base de datos. Generalmente los resultados de la consulta formarán una tabla con varias columnas y filas. Por ejemplo, si queremos saber el listado de los nombres, oficinas y fechas de contrato de todos los vendedores, la consulta sería: SELECT nombre, oficina_rep, contrato FROM repventas ; Dando como resultado una tabla de tres columnas (hemos seleccionado 3 atributos) y diez filas (ya que hay diez vendedores) que es la tabla de la derecha. Sin embargo, si pedimos El nombre, cuota y ventas del empleado número 107, la consulta produce una única fila, ya que sólo hay un vendedor que tenga el número de empleado solicitado. SELECT nombre, cuota, ventas FROM repventas WHERE num_empl=107 ; NOMBRE CUOTA VENTAS Natalia Martin NOMBRE OFICINA_REP CONTRATO Jose Maldonado 11 14/06/1998 Carlos Martinez 12 19/05/1997 Belen Aguirre 13 12/02/1998 Maria Garcia 11 12/10/1999 Lorenzo Fernandez 21 12/10/1999 Soledad Martinez 21 10/12/1996 Daniel Gutierrez 12 20/10/1996 Antonio Valle NULL 13/01/2000 Pedro Cruz 12 01/03/1997 Natalia Martin 22 14/11/1998 En algunos casos los resultados de la consulta pueden ser un único valor, como en el caso de pedir el promedio de ventas de los vendedores : AVG (ventas) SELECT AVG(ventas) FROM repventas ;

6 E incluso en otros puede producir cero filas de resultados. Por ejemplo si realizamos la consulta el nombre y fecha de contrato de cualquier vendedor con ventas superiores a : SELECT nombre, contrato FROM repventas WHERE ventas>75000 ; NOMBRE CONTRATO Aún en esta situación, el resultado sigue siendo una tabla. Se trata de una tabla vacía con dos columnas y cero filas. Por otra parte, hay que tener en cuenta que la cláusula SELECT nos va a mostrar tantas filas como datos respondan a la consulta. Si la consulta incluye la clave primaria de una tabla en su lista de selección, entonces cada fila de resultados será única (ya que la clave primaria tiene un valor diferente en cada fila). Si no se incluye la clave primaria en los resultados pueden producirse filas duplicadas. Por ejemplo, supongamos que pedimos La lista de las regiones en que se encuentran las oficinas : SELECT region FROM oficinas ; Los resultados tienen cinco filas (uno por oficina), pero observamos que hay filas duplicadas dado que las regiones se repiten. Probablemente, estos resultados no son los que uno pretendía con la consulta, es decir, si existen tan solo dos regiones diferentes cabría esperar que aparecieran solo las dos regiones. Se pueden eliminar filas duplicadas de los resultados de la consulta insertando la palabra clave DISTINCT en la sentencia SELECT, justo antes de la lista de selección. Veamos la consulta anterior modificada: REGION Este SELECT DISTINCT region FROM oficinas ; Centro Conceptualmente, SQL efectúa esta consulta generando primero un conjunto completo de resultados (cinco filas) y eliminando luego las filas que son duplicados exactos de alguna otra para formar los resultados finales. Si se omite la palabra DISTINCT, SQL no elimina filas duplicadas. También se puede especificar la palabra clave ALL para indicar que las filas duplicadas sean mostradas, pero es innecesario ya que éste es el comportamiento por defecto. Veamos algunos ejemplos muy sencillos usando las cláusulas SELECT / FROM: REGION Centro Este Este Este Centro CIUDAD REGION VENTAS Lista de la población, región y ventas de cada oficina de ventas: Toledo Valencia Centro Este SELECT ciudad, region, ventas FROM oficinas ; Barcelona Este Alicante Este Madrid Centro CIUDAD REGION VENTAS-OBJETIVO Lista de la ciudad, región y el resultado de ventas Toledo Centro para cada oficina: Valencia Este SELECT ciudad, region, (ventas-objetivo) FROM Barcelona Este oficinas; Alicante Este Madrid Centro Resultado de elevar la cuota de ventas un 3% a cada vendedor: SELECT nombre, cuota, (cuota+(0.03*ventas)) FROM repventas ; NOMBRE CUOTA CUOTA+(.03*VENTAS) Jose Maldonado ,74 Carlos Martinez ,00 Belen Aguirre ,81 Maria Garcia ,15 Lorenzo Fernandez ,99 Soledad Martinez ,28 Daniel Gutierrez ,84 Antonio Valle NULL NULL Pedro Cruz ,00 Natalia Martin ,96 6

7 Valor del inventario de cada producto: SELECT id_fab, id_producto, descripcion, (existencias*precio) FROM productos ; ID_FAB ID_PRODUCTO DESCRIPCION EXISTENCIAS*PRECIO REI 2A45C V Stago Trinquete ACI 4100Y Extractor QSA XK47 Reductor BIC Plate 0 IMM 779C Riostra 2-Tm ACI Artículo Tipo ACI Artículo Tipo BIC Manivela IMM 887P Perno Riostra QSA XK48 Reductor REI 2A44L Bisagra Izqda FEA 112 Cubierta IMM 887H Soporte Riostra BIC Reten ACI Artículo Tipo IMM 775C Riostra 1-Tm ACI 4100Z Montador QSA XK48A Reductor ACI Artículo Tipo REI 2A44R Bisagra Dcha IMM 773C Riostra 1/2-Tm ACI 4100X Ajustador 925 FEA 114 Bancada Motor IMM 887X Retenedor Riostra REI 2A44G Pasador Bisagra Mes y año de contrato de cada vendedor: SELECT nombre, MONTH(contrato), YEAR(contrato) FROM repventas ; Lista de ventas para cada ciudad: CIUDAD tiene ventas de VENTAS Toledo tiene ventas de Valencia tiene ventas de Barcelona tiene ventas de Alicante tiene ventas de Madrid tiene ventas de Todos los datos de la tabla oficinas: SELECT * FROM oficinas ; 3.2. La cláusula WHERE NOMBRE MONTH(contrato) YEAR(contrato) Jose Maldonado Carlos Martinez Belen Aguirre Maria Garcia Lorenzo Fernandez Soledad Martinez Daniel Gutierrez Antonio Valle Pedro Cruz Natalia Martin SELECT ciudad, tiene ventas de, ventas FROM oficinas ; OFICINA CIUDAD REGION DIR OBJETIVO VENTAS 22 Toledo Centro Valencia Este Barcelona Este Alicante Este Madrid Centro Generalmente se desea seleccionar solo algunas de las tuplas de una tabla, aquellas que, por ejemplo, cumplan unas determinadas condiciones (al igual que el operador restricción o selección del álgebra relacional). La cláusula WHERE se emplea para especificar las condiciones que nos restringen a un determinado número de filas, las que se desean recuperar. Por ejemplo, veamos la consulta decir las oficinas donde las ventas exceden al objetivo : 7

8 SELECT ciudad, ventas, objetivo FROM oficinas WHERE ventas>objetivo ; O listar el nombre, ventas y cuota del empleado número 105 : SELECT nombre, ventas, cuota FROM repventas WHERE num_empl=105 ; O decir qué empleados están dirigidos por el empleado número 104 : SELECT nombre, ventas FROM repventas WHERE director=104 ; En la cláusula WHERE indicamos la condición de búsqueda que especifica las filas a recuperar. Conceptualmente, SQL recorre cada fila de la tabla seleccionada, una a una, y aplica la condición de búsqueda produciendo uno de los siguientes resultados: Si la condición de búsqueda es cierta, la fila se incluye en los resultados de la consulta. Si la condición de búsqueda es falsa, la fila se excluye de los resultados de la consulta. Si la condición de búsqueda tiene un valor NULL (desconocido), la fila se excluye de los resultados de la consulta. Para restringir los resultados de una búsqueda, el SQL ofrece un variado conjunto de condiciones de búsqueda que nos van a permitir especificar muchos tipos diferentes de consultas. Las condiciones de búsqueda son cinco según el estándar ANSI/ISO: Condiciones de comparación. Compara el valor de una expresión con el valor de otra. Condiciones de rango. Examina si el valor de una expresión cae dentro de un rango especificado de valores. Condiciones de pertenencia a un conjunto. Comprueba si el valor de una expresión se corresponde con alguno de los valores especificados en conjunto determinado de valores. Condiciones de correspondencia con patrón. Comprueba si el valor de una columna, que contiene datos de cadena de caracteres, se corresponde con un patrón especificado. Condiciones de valor nulo. Comprueba si una columna tiene un valor NULL (desconocido). Veamos como se expresan estas condiciones en SQL. Condiciones de comparación (=, <>, <, <=, >, >=) La condición de búsqueda más común utilizada en una consulta SQL es la de comparación. SQL calcula y compara los valores de dos expresiones SQL por cada fila de datos. Las expresiones pueden ser tan simples como un nombre de columna o una constante, o pueden ser expresiones aritméticas más complejas. Hay seis modos de comparar dos expresiones (=, <>, <, <=, >, >=). Veamos algunos ejemplos: Lista de los vendedores contratados antes de 1998: SELECT nombre FROM repventas WHERE contrato< 01/01/1998 ; Lista de las oficinas cuyas ventas están por debajo del 75% del objetivo: SELECT ciudad, ventas, objetivo FROM oficinas WHERE ventas<(0.75*objetivo) ; CIUDAD VENTAS OBJETIVO Toledo Alicante Madrid NOMBRE VENTAS CUOTA Belen Aguirre NOMBRE VENTAS Belen Aguirre Daniel Gutierrez Pedro Cruz NOMBRE Carlos Martinez Soledad Martinez Daniel Gutierrez Pedro Cruz CIUDAD VENTAS OBJETIVO Barcelona

9 Lista de las oficinas que no se encuentran en la región Centro: SELECT ciudad, region FROM oficinas WHERE region<> Centro ; La condición de comparación más habitual es la que comprueba si el valor de una columna es igual a cierta constante. Cuando la columna es clave primaria, la condición aísla una sola fila de la tabla produciendo una sola fila de resultados, como por ejemplo el caso de Seleccionar el nombre y límite de crédito del cliente número 2107 : SELECT empresa, limite_credito FROM clientes WHERE num_clie=2107 ; Recordemos que SQL trata el valor NULL como valor desconocido, por lo que si tratamos de hacer una comparación con un valor nulo, esa tupla no será devuelta en la consulta. Por ejemplo: Lista de vendedores que superan sus cuotas: SELECT nombre FROM repventas WHERE ventas>cuota ; Lista de vendedores que no superan sus cuotas: SELECT nombre FROM repventas WHERE ventas<=cuota ; Condiciones de rango (BETWEEN) La condición BETWEEN de SQL comprueba si el valor del dato se encuentra entre dos valores especificados, incluyendo en el resultado los valores de los extremos. Veamos algunos ejemplos: Mostrar la relación de pedidos entre dos fechas: SELECT num_pedido, fecha_pedido, producto, importe FROM pedidos WHERE fecha_pedido BETWEEN 01/10/1999 AND 31/12/1999 ; Pedidos que caen en un determinado rango de importe: CIUDAD REGION Valencia Este Barcelona Este Alicante Este EMPRESA LIMITE_CREDITO Distribuciones Sur S.A NOMBRE Carlos Martinez Maria Garcia Soledad Martinez Daniel Gutierrez Pedro Cruz NOMBRE Jose Maldonado Belen Aguirre Lorenzo Fernandez Natalia Martin NUM_PEDIDO FECHA_PEDIDO PRODUCTO IMPORTE /12/1999 2A44L /10/ /12/ /12/ /10/ Z /11/ /10/1999 2A44G /12/ Y NUM_PEDIDO IMPORTE SELECT num_pedido, importe FROM pedidos WHERE importe BETWEEN AND ; La versión negada del test de rango, NOT BETWEEN, comprueba los valores que caen fuera del rango. Por ejemplo: Lista de vendedores cuyas ventas no están entre el 75 y el 150% de su cuota: SELECT nombre, ventas, cuota FROM repventas WHERE ventas NOT BETWEEN (0.75*cuota) AND (1.50*cuota) ; NOMBRE VENTAS CUOTA Carlos Martinez Maria Garcia Lorenzo Fernadez Pedro Cruz Es necesario señalar que la condición BETWEEN no añade potencia expresiva a SQL, pues A BETWEEN B AND C puede ser expresado como (A>=B) AND (A<=C). 9

10 Condiciones de pertenencia a un conjunto (IN) La condición IN examina si un valor de un dato coincide con uno de una lista de valores dados. Veamos un par de ejemplos: Pedidos obtenidos por cuatro vendedores específicos: SELECT num_pedido, rep, importe FROM pedidos WHERE rep IN NUM_PEDIDO REP IMPORTE (101,103,107,109) ; Lista de los vendedores de las oficinas 11, 13 y 22: NOMBRE CUOTA VENTAS Jose Maldonado Belen Aguirre Maria Garcia Natalia Martin SELECT nombre, cuota, ventas FROM repventas WHERE oficina_rep IN (11,13,22) ; Al igual que la condición BETWEEN, la condición IN no añade potencia expresiva a SQL, ya que la condición de búsqueda X IN (A,B,C) es equivalente a (X=A) OR (X=B) OR (X=C). Condiciones de correspondencia con un patrón (LIKE) Se puede utilizar una condición de comparación simple para recuperar las filas en donde el contenido de una columna de texto se corresponde con un cierto texto particular. Por ejemplo, la siguiente consulta límite de crédito de la empresa AFS S.A. recupera la fila de la tabla clientes para el caso de conocer el nombre de la empresa. SELECT empresa, limite_credito FROM clientes WHERE empresa= AFS S.A. ; EMPRESA LIMITE_CREDITO AFS S.A Sin embargo, uno puede olvidar fácilmente el nombre exacto de la empresa, por ejemplo. La condición de correspondencia con un patrón (LIKE) comprueba si el valor de un dato de una columna se ajusta a un patrón dado. El patrón es una cadena que puede incluir uno o más caracteres comodines. Estos caracteres comodines son el signo de porcentaje (%) y el subrayado (_). El carácter comodín signo de porcentaje (%) se corresponde con cualquier secuencia de cero o más caracteres. El carácter comodín subrayado (_) se corresponde con un único carácter cualquiera. Así por ejemplo, podemos consultar todos los vendedores apellidados Martinez de la siguiente forma: NUM_EMPL NOMBRE SELECT num_empl,nombre FROM repventas WHERE nombre LIKE % Martinez ; Carlos Martinez Soledad Martinez Uno de los problemas de la correspondencia con patrones de cadenas es cómo hacer corresponder los propios caracteres comodines como caracteres literales. Para comprobar la presencia de un carácter comodín en una cadena se precede de un carácter de escape que hace que el carácter que le sigue inmediatamente se trate como un literal en lugar de cómo un carácter comodín. El carácter escape en SQL es un signo de dólar ($). Condiciones de valor nulo (IS NULL / IS NOT NULL) En algunas ocasiones es útil comprobar explícitamente los valores NULL en una condición de búsqueda y manejarlos directamente. SQL proporciona una condición especial de valor nulo para tratar este caso (IS NULL). Veamos algunos ejemplos: 10

11 Decir que vendedores aún no tienen asignada una oficina: SELECT nombre FROM repventas WHERE oficina_rep IS NULL ; La forma IS NOT NULL encuentra las filas que no contienen un valor NULL. Por ejemplo: Listar los vendedores que tienen asignada una oficina: SELECT nombre FROM repventas WHERE oficina_rep IS NOT NULL ; Operadores para las búsquedas (AND / OR / NOT) NOMBRE Antonio Valle NOMBRE Jose Maldonado Carlos Martinez Belen Aguirre Maria Garcia Lorenzo Fernandez Soledad Martinez Daniel Gutierrez Pedro Cruz Natalia Martin Cuando queremos realizar búsquedas teniendo en cuenta más de un criterio, tendremos que combinar las condiciones de búsqueda mediante los operadores AND u OR. El operador AND se utiliza para combinar dos condiciones de búsqueda que deban ser ciertas simultáneamente. Por ejemplo, decir los vendedores que están por debajo de la cuota y con ventas inferiores a : SELECT nombre, cuotas, ventas FROM repventas WHERE ventas<cuota AND ventas< ; El operador OR se utiliza para combinar dos condiciones de búsqueda cuando una u otra (o ambas) deban ser ciertas. Por ejemplo, decir los vendedores que están por debajo de la cuota o con ventas inferiores a : SELECT nombre, cuota, ventas FROM repventas WHERE ventas<cuota OR ventas< ; NOMBRE CUOTA VENTAS Carlos Martinez Maria Garcia Pedro Cruz NOMBRE CUOTA VENTAS Carlos Martinez Maria Garcia Soledad Martinez Daniel Gutierrez Antonio Valle NULL Pedro Cruz Por último, se puede utilizar el operador NOT para seleccionar filas en donde la condición de búsqueda es falsa. Por ejemplo, decir los vendedores que están por debajo de la cuota y con ventas no superiores a 5000 : SELECT nombre, cuota, ventas FROM repventas WHERE ventas<cuota AND NOT ventas> ; NOMBRE CUOTA VENTAS Carlos Martinez Pedro Cruz Utilizando las palabras AND, OR y NOT y los paréntesis para agrupar los criterios de búsqueda, se pueden construir criterios de búsqueda muy complejos. Por ejemplo: Listar los vendedores con ventas inferiores a la cuota y con edad mayor de 45 años o con ventas inferiores a 5000: SELECT nombre, edad FROM repventas WHERE (ventas<cuota AND edad>45) OR ventas< ; NOMBRE EDAD Carlos Martinez 33 Soledad Martinez 48 Pedro Cruz 29 11

12 3.3. La cláusula ORDER BY La cláusula ORDER BY sirve para perdir a SQL que ordene los resultados de una consulta según unos criterios que se especifiquen (dado que los resultados de una consulta no están dispuestos en ningún orden particular). Si tenemos más de un criterio de ordenación, se escribirán separados por comas. Por ejemplo, si queremos saber: Las ventas de cada oficina, ordenadas en orden alfabético por región y dentro de cada región por ciudad (deberemos ordenar la consulta por región y ciudad): SELECT ciudad, region, ventas FROM oficinas ORDER BY region, ciudad ; En este caso, la primera especificación de ordenación (región) es la clave de ordenación mayor; las que le sigan (ciudad) son progresivamente claves de ordenación menores, utilizadas para desempatar cuando dos filas de resultados tienen los mismos valores para las claves mayores. Por omisión, SQL ordena los datos de forma ascendente, aunque también se puede especificar poniendo la palabra ASC. Para solicitar la ordenación en secuencia descendente se incluye la palabra clave DESC en la especificación de ordenación, como en este ejemplo: Lista de las oficinas clasificadas en orden descendente de ventas: SELECT ciudad, region, ventas FROM oficinas ORDER BY ventas DESC ; CIUDAD REGION VENTAS Madrid Centro Toledo Centro Alicante Este Barcelona Este Valencia Este CIUDAD REGION VENTAS Madrid Centro Valencia Este Alicante Este Toledo Centro Barcelona Este Si la columna de resultados de la consulta (que se utiliza para ordenación) es una columna calculada, no tiene nombre de columna que se pueda emplear en una especificación de ordenación. En este caso, debe especificarse un número de columna en lugar de un nombre o bien darle un nombre a la columna mediante la palabra clave AS. Veamos ambos casos con el siguiente ejemplo: Lista de las oficinas clasificadas en orden descendente de rendimiento de ventas: SELECT ciudad, region, (ventas-objetivo) FROM oficinas ORDER BY 3 DESC ; SELECT ciudad, region, (ventas-objetivo) AS ventas FROM oficinas ORDER BY ventas DESC ; CIUDAD REGION VENTAS Madrid Centro Alicante Este Toledo Centro Valencia Este Barcelona Este La cláusula UNION y la cláusula INTERSECT Estas cláusulas sirven para combinar resultados de dos o más consultas en una única tabla de resultados totales. En el estándar ANSI de SQL esta capacidad está soportada gracias a la cláusula UNION que devuelve como resultado todas las tuplas que estaban en una u otra consulta. Fuera del estándar podemos encontrar también la cláusula INTERSECT. Por ejemplo, supongamos que queremos resolver la petición: Lista todos los productos en donde el precio del producto exceda de 2000 o en donde más de del producto hayan sido ordenados en un solo pedido. La primera parte de la petición puede satisfacerse con la consulta, productos cuyo precio excede de 2000 : SELECT id_fab, id_producto FROM productos WHERE precio>2000 ; ID_FAB ID_PRODUCTO ACI 4100Y REI 2A44L ACI 4100Z REI 2A44R 12

13 Análogamente, la segunda parte de la petición puede satisfacerse con la consulta, productos de los cuales se ha hecho un pedido mayor de : SELECT DISTINCT fab, producto FROM pedidos WHERE importe>30000 ; La unión de ambas consultas nos dará como resultado la consulta original, y se realiza de la siguiente forma: ID_FAB ID_PRODUCTO ACI 4100Y SELECT id_fab, id_producto FROM productos WHERE precio>2000 ACI 4100Z UNION SELECT DISTINCT fab, producto FROM pedidos WHERE IMM 775C importe>30000 ; REI REI 2A44L 2A44R Para poder realizar una unión existen varias restricciones: Ambas tablas deben contener el mismo número de columnas. El tipo de datos de cada columna en la primera tabla debe ser el mismo que el tipo de datos en la columna correspondiente en la segunda tabla. Ninguna de las dos tablas puede estar ordenadas con la cláusula ORDER BY. Puede observarse que la UNION combina las filas de los dos conjuntos de resultados eliminando por defecto las filas duplicadas. Si se desean mantener las filas duplicadas en una operación UNION, se puede especificar la palabra clave ALL a continuación de la palabra UNION. Por ejemplo, veamos el resultado de la unión de las consultas anteriores conservando las filas repetidas: ID_FAB ID_PRODUCTO SELECT id_fab, id_producto FROM productos WHERE precio>2000 UNION ALL SELECT DISTINCT fab, producto FROM pedidos WHERE importe>30000 ; Como hemos dicho, las sentencias SELECT combinadas no pueden estar ordenadas. Sin embargo, el resultado de la UNION puede ordenarse mediante una cláusula ORDER BY que ordene el resultado. Por ejemplo, la consulta anterior puede ordenarse por la identificación del producto: (SELECT id_fab, id_producto FROM productos WHERE precio>2000) UNION (SELECT DISTINCT fab, producto FROM pedidos WHERE importe>30000) ORDER BY 2 ; ACI REI ACI REI IMM REI REI FAB PRODUCTO IMM 775C REI 2A44L REI 2A44R 4100Y 2A44L 4100Z 2A44R 775C 2A44L 2A44R ID_FAB ID_PRODUCTO REI 2A44L REI 2A44R ACI 4100Y ACI 4100Z IMM 775C La cláusula INTERSECT nos permite combinar resultados de varias consultas devolviendo como resultado aquellas tuplas que pertenecen a todas las consultas. Como ya hemos comentado, esta cláusula no es estándar pero se le aplican las mismas consideraciones que a la UNION excepto en que no elimina los duplicados. Por ejemplo, supongamos que queremos la lista todos los productos en donde el precio del producto exceda de 2000 pero en donde más de del producto hayan sido ordenados en un solo pedido. En este caso, deberemos juntar las dos consultas mediante la cláusula INTERSECT de la siguiente forma: SELECT id_fab, id_producto FROM productos WHERE precio>2000 INTERSECT SELECT DISTINCT fab, producto FROM pedidos WHERE importe>30000 ; ID_FAB ID_PRODUCTO REI 2A44L REI 2A44R 13

14 4. Consultas multitabla (composiciones) Muchas consultas útiles solicitan datos procedentes de dos o más tablas en la base de datos. SQL permite recuperar datos que responden a estas peticiones mediante consultas multitabla que componen (join) datos procedentes de dos o más tablas. Por ejemplo, si queremos formular la consulta listar todos los pedidos, mostrando su número, importe, nombre del cliente y el límite de crédito del cliente, nos damos cuenta de que los cuatro datos están almacenados en dos tablas: La tabla PEDIDOS contiene el número de pedido y el importe de cada pedido, pero no tiene los nombres de cliente ni los límites de crédito. La tabla CLIENTES contiene los nombres de cliente y sus balances pero no la información referente a los pedidos. Sin embargo, existe un enlace entre estas dos tablas. En cada fila de la tabla PEDIDOS, la columna CLIE contiene el número del cliente que ordenó el pedido, el cual se corresponde con el valor en la columna NUM_CLIE de una de las filas de la tabla CLIENTES. En SQL, al proceso de formar parejas de filas haciendo coincidir los contenidos de las columnas relacionadas se denomina componer (joining) las tablas. La tabla resultante se denomina composición entre las tablas. Las composiciones son el fundamento del procesamiento de consultas multitabla en SQL. Todos los datos de la base relacional están almacenados en sus columnas con valores explícitos, de modo que todas las relaciones posibles entre tablas puedan formarse comparando los contenidos de las columnas relacionadas. Teniendo en cuenta lo anterior, la consulta planteada se realizaría de la siguiente forma: SELECT num_pedido, importe, empresa, limite_credito FROM pedidos, clientes WHERE clie=num_clie ; NUM_PEDIDO IMPORTE EMPRESA LIMITE_CREDITO Hnos. Ramon S.L EVBE S.A Exclusivas Soriano S.A Exclusivas Norte S.A Exclusivas del Este S.L Distribuciones Sur S.A Lopez Asociados S.L Pino S.L Exclusivas Norte S.A Zapater Importaciones S.A Domingo S.L Pino S.L Componentes Fernandez S.A Domingo S.L Componentes Fernandez S.A Pino S.L Lopez Asociados S.L Roda & Castedo S.L Distribuciones Sur S.A Exclusivas Norte S.A EVBE S.A Zapater Importaciones S.A Distribuciones Montiel S.L Construcciones Leon S.A Construcciones Leon S.A Zapater Importaciones S.A Exclusivas Norte S.A Pino S.L EVBE S.A Importaciones Martin S.L

15 Las consultas multitabla más comunes implican a dos tablas que tienen una relación entre ellas a través de clave ajena y clave primaria. En el ejemplo que acabamos de ver, cada pedido tiene un cliente asociado y cada cliente puede tener muchos pedidos asociados. Los pares de filas que generan los resultados de la consulta son combinaciones del cliente con sus pedidos. Aunque este sea el tipo de consulta multitabla más habitual, no es el único. A continuación veremos, a través de ejemplos, distintas consultas multitabla comentando los aspectos relevantes. Dar la lista de los vendedores y la ciudad y región donde trabajan: SELECT nombre, ciudad, region FROM repventas, oficinas WHERE oficina_rep=oficina ; Como puede observarse, SQL no requiere que las columnas de emparejamiento sean incluidas en los resultados de la consulta multitabla. Normalmente se omiten pues las claves primarias y las claves ajenas suelen ser números de identificación difíciles de recordar y poco descriptivos. NOMBRE CIUDAD REGION Jose Maldonado Valencia Este Carlos Martinez Barcelona Este Belen Aguirre Alicante Este Maria Garcia Valencia Este Lorenzo Fernandez Madrid Centro Soledad Martinez Madrid Centro Daniel Gutierrez Barcelona Este Pedro Cruz Barcelona Este Natalia Martin Toledo Centro Lista de los vendedores de las oficinas con objetivo igual o superior a 60000, dando la ciudad y región donde trabajan: NOMBRE CIUDAD REGION SELECT nombre, ciudad, region FROM repventas, oficinas Carlos Martinez Barcelona Este WHERE oficina_rep=oficina AND objetivo>=60000 ; Lorenzo Fernandez Madrid Centro Soledad Martinez Madrid Centro Aquí se ha combinado la condición de búsqueda que Daniel Gutierrez Barcelona Este especifica las columnas de emparejamiento en una consulta Pedro Cruz Barcelona Este multitabla con otra condición de búsqueda, restringiendo aún más los contenidos de los resultados. Listar todos los pedidos, mostrando los importes y las descripciones del producto. NUM_PEDIDO IMPORTE DESCRIPCION Bisagra Izqda Articulo Tipo Bancada Motor Reductor Articulo Tipo Montador Bisagra Dcha Articulo Tipo Manivela Cubierta Manivela Articulo Tipo Reductor Bancada Motor Montador Articulo Tipo Riostra 1/2-Tm Riostra 1-Tm V Stago Trinquete Articulo Tipo Pasador Bisagra Ajustador Riostra 2-Tm V Stago Trinquete Reductor Risotra 2-Tm Reductor Extractor Ajustador Bisagra Dcha. SELECT num_pedido, importe, descripcion FROM pedidos, productos WHERE fab=id_fab AND producto=id_producto ; La tabla PEDIDOS y la tabla PRODUCTOS de la base de datos ejemplo están relacionadas por un par de claves ajena/primaria. Las columnas FAB y PRODUCTO de la tabla PEDIDOS forman juntas una clave ajena para la tabla PRODUCTOS, que se emparejan con las columnas ID_FAB e ID_PRODUCTO, respectivamente. Por tanto, para componer las tablas deben especificarse ambos pares de columnas de emparejamiento. Este tipo de composiciones son menos habituales y se encuentran generalmente en consultas que afectan a claves ajenas compuestas. 15

16 Lista de los pedidos superiores a 25000, incluyendo el nombre del vendedor que tomó el pedido y el nombre del cliente que lo solicitó. SELECT num_pedido, importe, empresa, nombre FROM pedidos, clientes, repventas WHERE clie=num_clie AND rep=num_empl AND importe>25000 ; SQL puede combinar datos de tres o más tablas utilizando las mismas técnicas básicas utilizadas para las consultas de dos tablas. Esta consulta utiliza dos claves ajenas de la tabla PEDIDOS. La columna CLIE es una clave ajena para la tabla CLIENTES, que enlaza cada pedido con el cliente que lo remitió. La columna REP es una clave ajena para la tabla REPVENTAS, que enlaza cada pedido con el vendedor que lo aceptó. Lista de los pedidos superiores a 25000, incluyendo el nombre del cliente que remitió el pedido y el nombre del vendedor asignado a ese cliente. SELECT num_pedido, importe, empresa, nombre FROM pedidos, clientes, repventas WHERE clie=num_clie AND rep_clie=num_empl AND importe>25000 ; Lista de los pedidos NUM_PEDIDO IMPORTE EMPRESA NOMBRE CIUDAD superiores a 25000, Hnos. Ramon S.L. Jose Maldonado Valencia incluyendo el nombre del Lopez Asociados S.L. Lorenzo Fernandez Madrid cliente que remitió el Roda & Castedo S.L. Pedro Cruz Barcelona pedido, el vendedor Pino S.L. Belen Aguirre Alicante asociado al cliente y la oficina donde trabaja. SELECT num_pedido, importe, empresa, nombre, ciudad FROM pedidos, clientes, repventas, oficinas WHERE clie=num_clie AND rep_clie=num_empl AND oficina_rep=oficina AND importe>25000 ; Ver los pedidos recibidos en los días en que un vendedor fue contratado. SELECT num_pedido, importe, fecha_pedido, nombre FROM pedidos, repventas WHERE fecha_pedido=contrato ; SQL no exige que las columnas de emparejamiento estén relacionadas como clave primaria y clave ajena. Cualquier par de columnas de dos tablas pueden servir de columnas de emparejamiento, siempre que tengan tipos de datos comparables, tal y como se ha mostrado en este ejemplo. Lista los vendedores y oficinas donde la cuota del vendedor es superior al 50% del objetivo de la oficina. SELECT nombre, cuota, ciudad, objetivo FROM repventas, oficinas WHERE oficina_rep=oficina AND cuota>(0.5*objetivo) ; NUM_PEDIDO IMPORTE EMPRESA NOMBRE Hnos. Ramon S.L. Jose Maldonado Lopez Asociados S.L. Lorenzo Fernandez Roda & Castedo S.L. Natalia Martin Pino S.L. Belen Aguirre NUM_PEDIDO IMPORTE EMPRESA NOMBRE Hnos. Ramon S.L. Jose Maldonado Lopez Asociados S.L. Lorenzo Fernandez Roda & Castedo S.L. Pedro Cruz Pino S.L. Belen Aguirre NUM_PEDIDO IMPORTE FECHA_PEDIDO NOMBRE /10/1999 Maria Garcia /10/1999 Maria Garcia /10/1999 Maria Garcia /10/1999 Lorenzo Fernandez /10/1999 Lorenzo Fernandez /10/1999 Lorenzo Fernandez NOMBRE CUOTA CIUDAD OBJETIVO Belen Aguirre Alicante Maria Garcia Valencia Natalia Martin Toledo Cuando en una consulta multitabla tengamos nombres de columnas duplicados será necesario eliminar la ambigüedad. Para ello debe utilizarse un nombre de columna cualificado para identificar la columna. El nombre de columna cualificado se construye con el nombre de la tabla y el nombre de la columna separados por un punto: nombre_tabla.atributo_columna. 16

17 Lista del nombre, las ventas y la oficina de cada vendedor. SELECT nombre, repventas.ventas, ciudad FROM repventas, oficinas WHERE oficina_rep=oficina ; En este ejemplo, los nombres cualificados de las dos columnas VENTAS son OFICINAS.VENTAS y REPVENTAS.VENTAS, esto es, el nombre de la tabla seguido por el nombre de la columna. NOMBRE VENTAS CIUDAD Jose Maldonado Valencia Carlos Martinez 0 Barcelona Belen Aguirre Alicante Maria Garcia Valencia Lorenzo Fernandez Madrid Soledad Martinez Madrid Daniel Gutierrez Barcelona Pedro Cruz Barcelona Natalia Martin Toledo Utilizar nombres de columna cualificados en una consulta multitabla es siempre una buena medida. La desventaja es que hacen que el texto de la consulta sea mayor. Informe sobre todos los vendedores y las oficinas en que trabajan. SELECT * FROM repventas, oficinas WHERE oficina_rep=oficina ; NUM_EMPL NOMBRE EDAD OFICINA_REPTITULO CONTRATODIRECTORCUOTAVENTASOFICINA CIUDAD REGION DIROBJETIVOVENTAS 106 Jose VP /06/1998 Maldonado Ventas NULL Valencia Este Carlos Dir /05/1997 Martinez Ventas Barcelona Este Belen Dir /02/1998 Aguirre Ventas Alicante Este Maria Rep /10/1999 Garcia Ventas Valencia Este Lorenzo Dir /10/1999 Fernandez Ventas Madrid Centro Soledad Rep /12/1995 Martinez Ventas Madrid Centro Daniel Rep /10/1996 Gutierrez Ventas Barcelona Este Pedro Cruz Rep. 01/03/1997 Ventas Barcelona Este Natalia Rep /11/1998 Martin Ventas Toledo Centro En una consulta multitabla, el asterisco selecciona todas las columnas de todas las tablas listadas en la cláusula FROM. La última consideración que nos queda en este apartado de consultas multitabla es que, en ocasiones, nos interesan consultas que afectan a una relación que una tabla tiene consigo misma. Por ejemplo, supongamos que se desea listar los nombres de todos los vendedores y sus directores. Cada vendedor aparece como una fila en la tabla REPVENTAS, y la columna DIRECTOR contiene el número de empleado del director del vendedor. Por ello, la columna DIRECTOR es una clave ajena para la propia tabla REPVENTAS. Si se tratara de expresar esta consulta como cualquier otra consulta de dos tablas implicando una coincidencia clave ajena/clave primaria: SELECT nombre, nombre FROM repventas, repventas WHERE director=num_empl ; aparecería un error del tipo Referencia duplicada a la tabla repventas. Frente a esto, podríamos pensar que la solución está en eliminar la segunda referencia a la tabla REPVENTAS, haciendo: NOMBRE NOMBRE SELECT nombre, nombre FROM repventas WHERE director=num_empl ; pero de esta forma, lo que obtendríamos es una tabla vacía, pues la condición director=num_empl se aplica fila a fila, buscando empleados que sean sus propios directores, no existiendo tales filas. Para resolver el problema, imaginemos que SQL tuviera dos copias idénticas de la tabla REPVENTAS, una llamada EMPS, que contuviera los empleados, y otra llamada DIRS, que 17

18 contuviera los directores. Entonces la columna director de la tabla EMPS sería una clave ajena para la tabla DIRS y la consulta se realizaría como: SELECT emps.nombre, dirs.nombre FROM emps, dirs WHERE emps.director=dirs.num_empl ; SQL realmente no tiene dos tablas diferentes, pero es capaz de asignar a una tabla un nombre diferente, llamado alias de tabla y esto se hace usando la palabra AS. La cláusula FROM asigna una alias a cada copia de la tabla REPVENTAS especificando el nombre del alias detrás del nombre real de la tabla y precedido por AS. Cuando la cláusula FROM contiene un alias, el alias debe ser utilizado para identificar la tabla en las referencias de las columnas. Por tanto, la consulta escrita utilizando los alias EMPS y DIRS para la tabla REPVENTAS sería: Lista de los nombres de los vendedores y sus directores. NOMBRE NOMBRE SELECT emps.nombre, dirs.nombre FROM repventas AS emps, repventas AS dirs WHERE emps.director=dirs.num_empl ; En este ejemplo no sería realmente necesario utilizar dos alias, uno para cada tabla de la consulta, podríamos haber usado solo uno, quedando la consulta como: SELECT repventas.nombre, dirs.nombre FROM repventas, repventas dirs WHERE repventas.director=dirs.num_empl ; Lista de los vendedores con una cuota superior a la de su director. SELECT repventas.nombre, repventas.cuota, dirs.cuota FROM repventas, repventas AS dirs WHERE repventas.director=dirs.num_empl AND repventas.cuota>dirs.cuota ; Los alias de las tablas son imprescindibles en consultas donde se relaciona una tabla consigo misma pero pueden utilizarse alias en cualquier consulta. Así por ejemplo, la consulta: SELECT nombre, repventas.ventas, ciudad FROM repventas, oficinas WHERE oficina_rep=oficina; puede escribirse como: SELECT r.nombre, r.ventas, ciudad FROM repventas AS r, oficinas WHERE r.oficina_rep=oficina ; 5. Consultas sumarias y funciones de agregación Carlos Martinez Jose Maldonado Belen Aguirre Carlos Martinez Maria Garcia Jose Maldonado Lorenzo Fernandez Jose Maldonado Soledad Martinez Lorenzo Fernandez Daniel Gutierrez Carlos Martinez Antonio Valle Daniel Gutierrez Pedro Cruz Carlos Martinez Natalia Martin Lorenzo Fernandez NOMBRE CUOTA CUOTA Belen Aguirre Maria Garcia Lorenzo Fernandez Daniel Gutierrez Pedro Cruz Muchas peticiones de información no requieren el nivel de detalle proporcionado por las consultas SQL. Por ejemplo, podemos solicitar de la base de datos: Cuál es la cuota total para todos los vendedores? Cuáles son las cuotas mínima y máxima? Cuántos vendedores han superado su cuota? Cuál es el tamaño del pedido medio para cada oficina? SQL soporta estas peticiones mediante un conjunto de funciones de agregación. Una función de agregación SQL acepta una columna entera de datos como argumento y produce un único dato que sumariza la columna. SQL ofrece seis funciones de agregación diferentes: SUM( nombre_columna ) calcula el total de una columna. AVG( nombre_columna ) calcula el valor promedio de una columna. MIN( nombre_columna ) encuentra el valor más pequeño en una columna. MAX( nombre_columna ) encuentra el valor mayor en una columna. COUNT( nombre_columna ) cuenta el número de valores en una columna. COUNT(*) cuenta las filas de resultados de la consulta. 18

19 5.1. Cálculo del total de una columna (SUM) La función SUM() calcula la suma de una columna de valores de datos. Los datos de la columna deben tener un tipo numérico (entero o coma flotante). El resultado de la función SUM() tiene el mismo tipo de dato básico que los datos de la columna, pero el resultado puede tener una precisión superior. Veamos algunos ejemplos que utilizan la función SUM(): Cuotas y ventas totales. SELECT SUM(cuota), SUM(ventas) FROM repventas ; Total de pedidos aceptados por el empleado Belen Aguirre. SELECT SUM(importe) FROM pedidos, repventas WHERE nombre= Belen Aguirre AND rep=num_empl ; 5.2. Cálculo del promedio de una columna (AVG) La función AVG() calcula el promedio de los valores que toman los datos de una columna. Al igual que en la función SUM(), los datos de la columna deben tener tipo numérico. El resultado de la función AVG() puede tener un tipo de datos diferente al de los valores de la columna. Por ejemplo, si se aplica AVG() a una columna de enteros, el resultado será un número un número con decimales. Veamos algunos ejemplos de uso de la función de columna AVG(): Precio promedio de los productos del fabricante ACI. SELECT AVG(precio) FROM productos WHERE id_fab= ACI ; Precio medio del pedido ordenado por el cliente SELECT AVG(importe) FROM pedidos WHERE clie=2103 ; 5.3. Determinación de los valores extremos (MIN y MAX) Las funciones MIN() y MAX() determinan los valores menor y mayor de una columna, respectivamente. Los datos de la columna pueden contener información numérica, de cadena o de fecha/hora. El resultado de la función MIN() y MAX() tiene exactamente el mismo tipo de dato que los datos de la columna. Veamos algunos ejemplos: Cuotas mínima y máxima asignadas a los vendedores. SELECT MIN(cuota), MAX(cuota) FROM repventas ; Fecha del pedido más antiguo en la base de datos. SELECT MIN(fecha_pedido) FROM pedidos ; Mejor rendimiento de todos los vendedores. SELECT MAX(100*ventas/cuota) FROM repventas ; Primer y último vendedor por orden alfabético. SELECT MIN(nombre), MAX(nombre) FROM repventas ; 5.4. Cuenta de valores de datos (COUNT) La función COUNT() cuenta el número de valores de datos que hay en una columna. Los datos de la columna pueden ser de cualquier tipo. La función COUNT() devuelve siempre un entero, independientemente del tipo de datos de la columna. Algunos ejemplos son: Decir el número de clientes. SELECT COUNT(num_clie) FROM clientes ; SUM(CUOTA) SUM(VENTAS) SUM(IMPORTE) AVG(PRECIO) 804,29 AVG(IMPORTE) 8.895,50 MIN(CUOTA) MAX(CUOTA) MIN(FECHA_PEDIDO) 12/10/1999 MAX(100*VENTAS/CUOTA) 195 MIN(NOMBRE) MAX(NOMBRE) Antonio Valle Soledad Martinez COUNT(NUM_CLIE) 21 19

20 Número de vendedores que superan su cuota. SELECT COUNT(nombre) FROM repventas WHERE ventas>cuota ; Número de pedidos de más de SELECT COUNT(importe) FROM pedidos WHERE importe>25000 ; COUNT(NOMBRE) 4 COUNT(IMPORTE) 4 Debemos resaltar que la función COUNT() ignora los valores de los datos en la columna, simplemente cuenta cuántos datos hay. Por lo tanto, en realidad no importa qué columna se especifica como argumento de la función COUNT(). Esta es la razón por la que SQL soporta una función de columna especial, COUNT(*) que cuenta filas en lugar de valores de datos. Así, la última consulta podría haberse escrito como: Número de pedidos de más de SELECT COUNT(*) FROM pedidos WHERE importe>25000 ; 5.5. Funciones de agregación en la lista de selección Las consultas simples con una función de agregación en una lista de selección son fáciles de entender, pero no lo es tanto cuando la lista de selección incluye varias funciones de agregación. Uno de los mejores modos de imaginar las consultas sumarias y las funciones de agregación es pensar en el procesamiento de la consulta dividido en dos pasos. Primero, imaginamos cómo funcionaría la consulta sin las funciones de agregación, produciendo muchas filas de resultados de consulta detallados. Luego imaginamos a SQL aplicando las funciones de agregación a los resultados de consulta detallados, produciendo una sola fila sumaria. Por ejemplo, si queremos ver diversos porcentajes de la base de datos hacemos primero: SELECT importe, importe, 100*importe/limite_credito,100*importe/cuota FROM pedidos, clientes, repventas WHERE clie=num_clie AND rep=num_empl ; y a continuación se aplican sobre los resultados las funciones de agregación: SELECT AVG(importe), SUM(importe), AVG(100*importe/limite_credito), AVG(100*importe/cuota) FROM pedidos, clientes, repventas WHERE clie=num_clie AND rep=num_empl ; AVG(IMPORTE) SUM(IMPORTE) AVG(100*IMPORTE/LIMITE_CREDITO) AVG(100*IMPORTE/CUOTA) 8.253, ,86 Una función agregación puede aparecer, en la lista de selección, en cualquier lugar en el que puede aparecer un nombre de columna. Sin embargo, el argumento de una función de agregación no puede contener a otra función de agregación y también es ilegal mezclar funciones de agregación y nombres normales de columnas en una lista de selección, pues la consulta carece de sentido, ya que un nombre de columna genera una tabla de resultados con cierto número de filas y una función de agregación genera una columna de una fila con los resultados sumarios Valores NULL y funciones de columna Las funciones de agregación SUM(), AVG(), MIN(), MAX() y COUNT() aceptan cada una de ellas una columna de valores de datos como argumento y producen un único valor como resultado. Sin embargo, dicha columna puede contener valores NULL. En tal caso, los valores NULL son ignorados por las funciones de agregación. Veamos un ejemplo: Ejemplo de funciones de columna con valores NULL. SELECT COUNT(*), COUNT(ventas), COUNT(cuota) FROM repventas ; COUNT(*) 4 COUNT(*) COUNT(VENTAS) COUNT(CUOTA)

21 La tabla REPVENTAS contiene diez filas, por lo que COUNT(*) devuelve diez. Las columnas VENTAS contienen diez valores no NULL, por lo que la función COUNT(ventas) devuelve también diez. Sin embargo, la columna CUOTA es NULL para un vendedor, por lo cual la función COUNT(cuota) ignora ese valor de NULL y devuelve el valor nueve. El que las funciones MIN() y MAX() ignoren los valores NULL carece de importancia, sin embargo para las funciones SUM() y AVG() puede producir sutiles problemas. Supongamos la siguiente consulta: Uso de la función SUM con valores NULL. SELECT SUM(ventas), SUM(cuota), SUM(ventas)-SUM(cuota), SUM(ventas-cuota) FROM repventas ; SUM(VENTAS) SUM(CUOTA) SUM(VENTAS)-SUM(CUOTA) SUM(VENTAS-CUOTA) Como se observa, la expresión SUM(ventas)-SUM(cuota) funciona correctamente, mientras que la expresión SUM(ventas-cuota) proporciona un resultado aparentemente incorrecto. Esto es así pues existe un valor NULL en la columna CUOTA. Entonces, SUM(ventas)-SUM(cuota) realiza la resta entre la suma de los diez valores de ventas y la suma de los nueve valores de cuota, mientras que SUM(ventas-cuota) realiza primero la resta, con lo cual solo aparecen nueve valores válidos (pues la resta de un número menos NULL produce NULL), con lo cual solo se suman nueve restas Eliminación de filas duplicadas (DISTINCT) Al igual que en la selección de una lista, se puede pedir a SQL que elimine valores duplicados de una columna antes de aplicarle la función de agregación. Para eliminar valores duplicados, la palabra clave DISTINCT se incluye delante del argumento de la función de columna, inmediatamente después del paréntesis abierto. Veamos algunos ejemplos: Número de títulos diferentes de los vendedores. SELECT COUNT(DISTINCT titulo) FROM repventas ; Número de oficinas con vendedores que superan sus cuotas. SELECT COUNT(DISTINCT oficina_rep) FROM repventas WHERE ventas>cuota ; La palabra clave DISTINCT puede usarse con las funciones de agregación COUNT(), SUM() y AVG() (con MAX y MIN no tiene sentido). Cuando se usa la palabra clave DISTINCT el argumento de la función agregación debe ser un nombre de columna único, no puede ser una expresión; además, la palabra clave DISTINCT sólo puede aparecer una vez en una consulta Consultas agrupadas (cláusula GROUP BY) Las consultas sumarias descritas hasta ahora son como los totales al final de un informe, condensan todos los datos detallados del informe en una única fila sumaria de datos. Sin embargo, en algunos casos es útil obtener subtotales. La cláusula GROUP BY proporciona esta capacidad. Veamos un ejemplo: Tamaño medio de los pedidos para cada vendedor. SELECT rep, AVG(importe) FROM pedidos GROUP BY rep ; SQL lleva a cabo la consulta de la siguiente forma: COUNT(DISTINCT TITULO) 3 COUNT(DISTINCT OFICINA_REP) 4 REP AVG(IMPORTE) , , , , , , , , ,00 21

22 1. SQL divide los pedidos en grupos de pedidos, un grupo por cada vendedor. Dentro de cada grupo todos los pedidos tienen el mismo valor en la columna REP. 2. Por cada grupo, SQL calcula el valor medio de la columna IMPORTE para todas las filas del grupo y genera una única fila sumario de resultados. Veamos algunos ejemplos: Rango de cuotas asignadas a cada oficina. SELECT oficina_rep, MIN(cuota), MAX(cuota) FROM repventas GROUP BY oficina_rep ; Número de vendedores asignados a cada oficina. SELECT oficina_rep, COUNT(*) FROM repventas GROUP BY oficina_rep ; SQL también puede agrupar resultados de consulta en base a contenidos de dos o más columnas. Por ejemplo: Pedidos totales por cliente y vendedor. SELECT rep, clie, SUM(importe) FROM pedidos GROUP BY rep, clie ; Una limitación de las consultas agrupadas es que SQL ignora la información referente a las claves primarias y ajenas cuando analiza la validez de una consulta agrupada. Por ello, la consulta: Pedidos totales por cada vendedor. SELECT num_empl, nombre, SUM(importe) FROM pedidos, repventas WHERE rep=num_empl GROUP BY num_empl ; OFICINA_REP MIN(CUOTA) MAX(CUOTA) NULL NULL NULL OFICINA_REP COUNT(*) NULL COUNT(DISTINCT NUM_CLIE) REP_CLIE Número de clientes diferentes atendidos por cada vendedor SELECT COUNT(DISTINCT num_clie), rep_clie FROM clientes GROUP BY rep_clie ; REP CLIE SUM(IMPORTE) da como resultado un error del tipo : La columna nombre no es una expresión GROUP BY. NUM_EMPL NOMBRE SUM(IMPORTE) 101 Daniel Gutierrez Soledad Martinez Pedro Cruz Belen Aguirre Jose Maldonado Natalia Martin Lorenzo Fernandez Maria Garcia Antonio Valle La consulta tiene perfecto sentido, ya que la agrupación por el número de empleado del vendedor es, en efecto, igual que la agrupación sobre el nombre del vendedor. No obstante, SQL requiere que las columnas de SELECT estén especificadas como columna de agrupación, por ello el problema se corrige sencillamente realizando la consulta de la forma siguiente: SELECT num_empl, nombre, SUM(importe) FROM pedidos, repventas WHERE rep=num_empl GROUP BY num_empl, nombre ; 22

23 5.9. Condiciones de búsqueda en grupos (cláusula HAVING) Al igual que la cláusula WHERE puede ser utilizada para seleccionar y rechazar filas individuales que participan en una consulta, la cláusula HAVING puede ser utilizada para seleccionar y rechazar grupos de filas. El formato de la cláusula HAVING es análogo al de la cláusula WHERE, consistiendo en la palabra clave HAVING seguida de la condición de búsqueda. Por tanto, la cláusula HAVING especifica una condición de búsqueda por grupos. Veamos algunos ejemplos: Tamaño de pedido promedio por vendedor para vendedores con pedidos totales de más de SELECT rep, AVG(importe) FROM pedidos GROUP BY rep HAVING SUM(importe)>30000 ; SQL efectúa la consulta de la siguiente forma: 1. La cláusula GROUP BY dispone los pedidos en grupos por vendedor. 2. La cláusula HAVING elimina entonces los grupos donde el total de pedidos no excede de Finalmente la cláusula SELECT calcula el tamaño de pedido medio para cada uno de los grupos restantes y genera los resultados de la consulta. Cuota total y ventas totales para todos los vendedores de una oficina en oficinas con dos o más personas. SELECT ciudad, sum(cuota), sum(repventas.ventas) FROM oficinas, repventas WHERE oficina=oficina_rep GROUP BY ciudad HAVING COUNT(*)>=2 ; En este caso el proceso que realiza SQL es el siguiente: 1. Compone las tablas OFICINAS y REPVENTAS para hallar la ciudad donde trabaja cada vendedor. 2. Agrupa las filas resultantes por oficina. 3. Elimina los grupos con menos de dos filas. 4. Calcula la cuota total y las ventas totales para cada grupo. Precio, existencias y cantidad total de los pedidos de cada producto para los cuales la cantidad total pedida es superior al 75% de las existencias. SELECT descripcion, precio, existencias, SUM(cant) FROM productos, pedidos WHERE fab=id_fab AND producto=id_producto GROUP BY id_fab, id_producto, descripcion, precio, existencias HAVING SUM(cant)>(0.75*existencias) ORDER BY existencias DESC ; REP AVG(IMPORTE) , , , ,86 CIUDAD SUM(CUOTA) SUM(REPVENTAS.VENTAS) Barcelona Madrid Valencia DESCRIPCION PRECIO EXISTENCIAS SUM(CANT) Reductor Ajustador Bancada Motor Bisagra Dcha Riostra 1-Tm Para procesar esta consulta, SQL efectúa conceptualmente los siguientes pasos: 1. Agrupa las filas resultantes por fabricante y por identificador de producto. 2. Elimina los grupos en donde la cantidad pedida (el total de la columna CANT para todos los pedidos del grupo) es menos del 75% de las existencias. 3. Calcula la cantidad total pedida para cada grupo. 4. Genera una fila sumaria de resultados por cada grupo. 5. Ordena los resultados para que los productos con el mayor valor de existencias aparezcan en primer lugar. En esta consulta, las columnas DESCRIPCION, PRECIO y EXISTENCIAS aparecen especificadas como columnas de agrupación únicamente porque aparecen en la lista de selección. Realmente no contribuyen en nada al proceso de agrupación, ya que ID_FAB e ID_PRODUCTO especifican completamente una única fila en la tabla PRODUCTOS, haciendo automáticamente que las otras tres columnas tengan un único valor por grupo. 23

24 6. Subconsultas y subconsultas anidadas La característica de subconsulta de SQL permite utilizar los resultados de una consulta como parte de otra. La capacidad de utilizar una consulta dentro de otra fue la razón original para la palabra estructurada en el nombre Lenguaje de Consultas Estructuradas (Structured Query Language- SQL). Esta característica juega un papel importante por tres razones: Una sentencia SQL con una subconsulta es frecuentemente el modo más natural de expresar una consulta, ya que se asemeja más estrechamente a la descripción de la consulta en lenguaje natural. Las subconsultas hacen más fácil la escritura de sentencias SELECT, ya que permiten descomponer una consulta en partes (la consulta y sus subconsultas) y luego recomponerlas. Hay algunas consultas que no pueden ser expresadas en el lenguaje SQL sin utilizar una subconsulta. Una subconsulta es una consulta que aparece dentro de la cláusula WHERE o HAVING de otra sentencia SQL. Por ejemplo, analicemos la petición: Lista las oficinas en donde las ventas de la oficina son inferiores al 50% de la suma de las cuotas de los vendedores de la oficina. La petición solicita una lista de oficinas de la tabla OFICINAS, en donde el valor de la columna VENTAS satisface cierta condición. Parece razonable que la sentencia SELECT que expresa la consulta deba ser semejante a esta: SELECT ciudad FROM oficinas WHERE ventas<??? ; donde el valor??? equivaldría a el 50% de la suma de las cuotas de los vendedores asignados a la oficina en cuestión. Sabemos que la menor de las cuotas para una oficina específica puede obtenerse como: SELECT 0.5*SUM(cuota) FROM repventas WHERE oficina_rep=xx ; donde XX representa el número de oficina. Parece entonces razonable comenzar con la primera consulta y reemplazar los??? con la segunda consulta del modo siguiente: SELECT ciudad FROM oficinas WHERE ventas<(select 0.5*SUM(cuota) FROM repventas WHERE oficina_rep=oficina) ; Las subconsultas SQL dentro de la cláusula WHERE ayudan a seleccionar las filas individuales que aparecen en los resultados de la consulta. En la cláusula HAVING, ayudan a seleccionar los grupos de filas que aparecen en los resultados de la consulta. Veamos algunas consideraciones a tener en cuenta: Una subconsulta debe producir una única columna de datos como resultados. Esto significa que una subconsulta siempre tiene un único elemento de selección de la cláusula SELECT. La cláusula ORDER BY no puede ser especificada en una subconsulta. Los resultados de la subconsulta se utilizan internamente por parte de la consulta principal y nunca son visibles al usuario, por lo que carece de sentido ordenarlos. Una subconsulta no puede ser la UNION de varias sentencias SELECT diferentes; sólo se permite una única SELECT. Los nombre de columna que aparecen en una subconsulta pueden referirse a columnas de tablas en la consulta principal. 24

25 6.1. Subconsultas en la cláusula WHERE Veamos con ejemplos las condiciones de búsqueda que ofrece SQL para las subconsultas: Condiciones de comparación en la subconsulta (=, <>, <, <=, >, >=) La comparación en la subconsulta es una forma modificada de la comparación simple. Compara el valor de una expresión con un valor único producido por una subconsulta, y devuelve un resultado TRUE si la comparación es cierta. Ciudades con ventas inferiores al 50% de la suma de las cuotas de los vendedores asignados a dicha ciudad. SELECT ciudad FROM oficinas WHERE ventas<(select 0.5*SUM(cuota) FROM repventas WHERE oficina_rep=oficina) ; Conceptualmente, SQL lleva a cabo la consulta de la siguiente forma: La consulta principal extrae sus datos de la tabla OFICINAS, y la cláusula WHERE selecciona qué oficinas serán incluidas en los resultados de la consulta. Para ello SQL recorre las filas de la tabla OFICINAS una a una, aplicándoles la condición de la cláusula WHERE. La cláusula WHERE compara el valor de la columna VENTAS de la fila actual con el valor producido por la subconsulta. Para examinar el valor VENTAS, SQL lleva a cabo la subconsulta, determinando la suma de las cuotas para los vendedores de la oficina actual. La subconsulta produce un número, y la cláusula WHERE compara el número con el valor VENTAS, seleccionando o rechazando la oficina actual en base a la comparación. Dentro del cuerpo de una subconsulta, con frecuencia es necesario referirse al valor de una columna en la fila actual de la consulta principal, tal y como sucede en la consulta anterior. En estos casos, la columna de la consulta principal que se utiliza en la subconsulta se conoce como referencia externa. Una referencia externa es un nombre de columna que no se refiere a ninguna de las tablas designadas en la cláusula FROM de la subconsulta en la cual aparece el nombre de la columna. En vez de ello, el nombre de columna se refiere a una columna de una tabla especificada en la tabla FROM de la consulta principal. Lista los vendedores con cuota igual o superior al objetivo de Alicante. SELECT nombre FROM repventas WHERE cuota>=(select objetivo FROM oficinas WHERE ciudad= Alicante ) ; Lista de los clientes atendidos por Belen Aguirre. SELECT empresa FROM clientes WHERE rep_clie=(select num_empl FROM repventas WHERE nombre= Belen Aguirre ) ; Condición de pertenencia a un conjunto ( IN ) CIUDAD Barcelona NOMBRE Belen Aguirre Lorenzo Fernandez Soledad Martinez EMPRESA Pino S.L. JPF S.L. Lista de los productos del fabricante ACI para los cuales las existencias superan a las existencias del producto ACI DESCRIPCION EXISTENCIAS SELECT descripcion,existencias FROM productos WHERE Articulo Tipo id_fab= ACI AND existencias>(select existencias FROM Articulo Tipo productos WHERE id_fab= ACI AND id_producto= ) ; Articulo Tipo La condición de pertenencia a un conjunto subconsulta (IN) es una forma modificada de la condición de pertenencia a conjunto simple. Comprueba si el valor de una expresión coincide con uno del conjunto de valores producido por una subconsulta y devuelve un resultado TRUE si el valor coincide. 25

26 Lista de los vendedores que trabajan en oficinas que superan su objetivo de ventas. SELECT nombre FROM repventas WHERE oficina_rep IN (SELECT oficina FROM oficinas WHERE ventas>objetivo) ; Lista de empleados que tienen todos sus clientes con límite de crédito igual o superior a SELECT nombre FROM repventas WHERE num_empl NOT IN (SELECT rep_clie FROM clientes WHERE limite_credito<50000) ; Condición de existencia (EXISTS) La condición de existencia (EXISTS) comprueba si una subconsulta produce alguna fila de resultados. Devuelve TRUE si la subconsulta produce filas o FALSE si no las produce. Esta condición solo se utiliza con subconsultas. Lista de productos para los cuales se ha recibido un pedido mayor o igual a SELECT DISTINCT descripcion FROM productos WHERE EXISTS (SELECT num_pedido FROM pedidos WHERE fab=id_fab AND producto=id_producto AND importe>=25000) ; Lista de los clientes asignados a Soledad Martinez y que no han remitido ningún pedido superior a SELECT empresa FROM clientes WHERE rep_clie=(select num_empl FROM repventas WHERE nombre= Soledad Martinez ) AND NOT EXISTS (SELECT * FROM pedidos WHERE clie=num_clie AND importe>3000) ; Oficinas donde la cuota de un vendedor representa más del 55% del objetivo de la oficina. SELECT ciudad FROM oficinas WHERE EXISTS (SELECT * FROM repventas WHERE oficina_rep=oficina AND cuota>(0.55*objetivo)) ; Como la condición de búsqueda EXISTS no utiliza realmente los resultados de la subconsulta, es posible relajar la regla de que las subconsultas deben devolver una única columna de datos y permitir utilizar la forma SELECT * en la subconsulta de un test EXISTS. Condiciones de comparación cuantificadas ( >ANY / >SOME / >ALL ) NOMBRE Belen Aguirre Lorenzo Fernandez Soledad Martinez Natalia Martin NOMBRE Lorenzo Fernandez Lista de los clientes que han remitido pedidos del fabricante ACI con productos que empiezan por 4100 entre Enero y Junio del EMPRESA SELECT empresa FROM clientes WHERE num_clie IN (SELECT EVBE S.A. Pino S.L. DISTINCT clie FROM pedidos WHERE fab= ACI AND producto LIKE Distribuciones Sur S.A. 4100% AND fecha_pedido BETWEEN 01/01/2000 AND 30/06/2000 ) ; Zapater Importaciones S.A. DESCRIPCION Bisagra Dcha. Bisagra Izqda. Extractor Riostra 1-Tm EMPRESA Hnos. Martinez S.A. Construcciones Leon S.A. CIUDAD Toledo Alicante Las condiciones de comparación cuantificada comparan el valor de una expresión con cada uno de los valores del conjunto producido por una subconsulta. Las condiciones de comparación que se pueden utilizar son cualquiera de los seis operadores de comparación de SQL (=, <>, <, <=, >, >=). Las versiones antiguas de SQL solo contemplaban la condición ANY, posteriormente se cambió por SOME para evitar la ambigüedad de la palabra en inglés, pero ambas sirven para lo mismo. Si usamos la condición SOME o ANY junto con algún operadores de comparación y alguna de las comparaciones individuales produce un resultado TRUE, entonces el resultado global es TRUE. Si usamos la condición ALL junto con algún operadores de comparación, para que el resultado global sea cierto (TRUE) será necesario que cada una de las comparaciones individuales produzcan un TRUE. 26

27 Lista de los vendedores que han aceptado un pedido que representa más de su cuota. SELECT nombre FROM repventas WHERE cuota<any (SELECT importe FROM pedidos WHERE rep=num_empl) ; Lista de las oficinas y sus objetivos en donde todos los vendedores tienen ventas que igualan o superan el objetivo de la oficina. SELECT ciudad, objetivo FROM oficinas WHERE objetivo<all (SELECT ventas FROM repventas WHERE oficina_rep=oficina) ; 6.2. Subconsultas anidadas Todas las consultas descritas hasta ahora han sido consultas de dos niveles, afectando a la consulta principal y a una subconsulta. Del mismo modo que se puede utilizar una subconsulta dentro de una consulta principal, se puede utilizar una subconsulta dentro de otra subconsulta. Esto se puede extender hasta el nivel de subconsulta que se desee. Veamos un ejemplo: Lista de clientes cuyos vendedores están asignados a oficinas de la región de ventas Centro. SELECT empresa FROM clientes WHERE rep_clie IN (SELECT num_empl FROM repventas WHERE oficina_rep IN (SELECT oficina FROM oficinas WHERE region= Centro )) ; En este ejemplo, la subconsulta más interna produce una columna que contiene los números de oficina de las oficinas de la región Centro. La siguiente subconsulta produce una columna que contiene los números de empleado de los vendedores que trabajan en las oficinas seleccionadas. Finalmente la consulta externa encuentra los clientes cuyos vendedores tienen uno de los números de empleado seleccionados Subconsultas en la cláusula HAVING Cuando una subconsulta aparece en la cláusula HAVING funciona como parte de la selección de grupo de filas efectuada por la cláusula HAVING. Consideremos la siguiente consulta: Lista de los vendedores cuyo tamaño de pedido medio para productos fabricados por ACI es superior al tamaño de pedido medio global. NOMBRE AVG(IMPORTE) SELECT nombre, AVG(importe) FROM repventas, pedidos Antonio Valle ,00 WHERE num_empl=rep AND fab= ACI GROUP BY nombre Soledad Martinez ,00 HAVING AVG(importe)>(SELECT AVG(importe) FROM pedidos) ; La consulta funciona calculando en primer lugar el tamaño de pedido medio global. Luego la cláusula HAVING comprueba cada grupo de filas para ver si el tamaño medio pedido de ese grupo es superior al promedio de todos los pedidos. Si es así, el grupo de filas es retenido; si no, el grupo de filas es descartado. Finalmente la cláusula SELECT produce una fila sumaria por cada grupo, mostrando el nombre del vendedor y el tamaño de pedido medio para cada uno. 7. Modificación de los datos de la B.D. en SQL NOMBRE Jose Maldonado Lorenzo Fernandez Natalia Martin CIUDAD OBJETIVO Toledo Alicante EMPRESA Hnos. Martinez S.A. Lopez Asociados S.L. Componentes Fernandez S.A. Domingo S.L. Distribuciones Montiel S.L. Construcciones Leon S.A. Exclusivas Norte S.A. SQL es un lenguaje completo de manipulación de datos que no solo se utiliza para consultas, sino también para insertar, borrar y actualizar los datos de la base de datos. Las cláusulas que emplea SQL para modificar los datos de una base de datos: INSERT, que añade nuevas filas de datos a una tabla. DELETE, que elimina filas de datos de una tabla. UPDATE, que actualiza (cambia) datos existentes en la base de datos. 27

28 7.1. Inserción de datos en la base de datos ( INSERT INTO ) En general, podemos añadir nuevas filas de datos a una base de datos de dos formas: Una sentencia INSERT de una fila que añade una única nueva fila de datos a una tabla. La estructura es: INSERT INTO nombre_de_la_tabla(atributos) VALUES (,, ) donde la cláusula INTO especifica la tabla que recibe la nueva fila y la cláusula VALUE especifica los valores de datos que la nueva fila contendrá. Una sentencia INSERT multifila, que extrae filas de datos de otra parte de la base y las añade a una tabla. La estructura es: INSERT INTO nombre_de_la_tabla SELECT FROM. En este caso, los valores de datos para las nuevas filas no son especificados explícitamente dentro del texto de la sentencia. En su lugar, la fuente de las nuevas filas es una consulta de base de datos especificada en la sentencia. Veamos unos ejemplos de cómo realizar esto: Supongamos que en nuestra base de datos ejemplo, se acaba de contratar a un nuevo vendedor con los siguientes datos: Nombre: Edad: Enrique Jordan 36 Número de empleado: 111 Título: Director de ventas La sentencia INSERT que añade Oficina: el nuevo vendedor a la base de Fecha de contrato: Alicante (número de oficina 13) 25 de Julio de datos es: Cuota: Aún no asignada. Ventas anuales hasta la fecha: 0 INSERT INTO repventas(nombre, edad, num_empl, ventas, titulo, contrato, oficina_rep) VALUES( Enrique Jordan, 36, 111, 0, Dir. Ventas, 25/07/2000, 13) ; Quedando la tabla REPVENTAS de la siguiente forma después de incluir el nuevo empleado: NUM_EMPL NOMBRE EDAD OFICINA_REP TITULO CONTRATO DIRECTOR CUOTA VENTAS 106 Jose Maldonado VP Ventas 14/06/1998 NULL Carlos Martinez Dir. Ventas 19/05/ Belen Aguirre Dir. Ventas 12/02/ Maria Garcia Rep. Ventas 12/10/ Lorenzo Fernandez Dir. Ventas 12/10/ Soledad Martinez Rep. Ventas 10/12/ Daniel Gutierrez Rep. Ventas 20/10/ Antonio Valle 41 NULL Rep. Ventas 13/01/ NULL Pedro Cruz Rep. Ventas 01/03/ Natalia Martin Rep. Ventas 14/11/ Enrique Jordan Dir. Ventas 25/07/2000 NULL NULL 0 Supongamos ahora que el nuevo representante recibe su primer pedido, de Corporacion Oeste S.A., un nuevo cliente que tiene asignado el número de cliente El pedido es de 20 "Articulo Tipo 4" ACI por un precio total de y le ha sido asignado el número de pedido Las sentencias INSERT que añaden el nuevo cliente y pedido a la base de datos son: INSERT INTO clientes(empresa, num_clie, limite_credito, rep_clie) VALUES ( Corporacion Oeste S.A., 2126, 15000, 111) ; INSERT INTO pedidos(importe, fab, producto, cant, fecha_pedido, num_pedido, clie, rep) VALUES (2340, ACI, 41004, 20, CURRENT DATE, , 2126, 111) ; Quedando las tablas de la siguiente forma: 28

29 La tabla CLIENTES: La tabla PEDIDOS: NUM_CLIE EMPRESA REP_CLIE LIMITE_CREDITO 2111 EVBE S.A Exclusivas del Este S.L Pino S.L Hnos. Martinez S.A Distribuciones Sur S.A AFS S.A Exclusivas Soriano S.A Lopez Asociados S.L Hernandez & hijos S.L Componentes Fernandez S.A Domingo S.L Zapater Importaciones S.A Hnos. Ramon S.L JPF S.L Distribuciones Montiel S.L Construcciones Leon S.A Martinez & Garcia S.L Exclusivas Norte S.A Importaciones Martin S.L Roda & Castedo S.L MALB S.A Corporacion Oeste S.A NUM_PEDIDO FECHA_PEDIDO CLIE REP FAB PRODUCTO CANT IMPORTE /12/ REI 2A44L /01/ ACI /01/ FEA /02/ QSA XK /10/ ACI /01/ ACI 4100Z /02/ REI 2A44R /12/ ACI /01/ BIC /02/ FEA /01/ BIC /12/ ACI /01/ QSA XK /02/ FEA /10/ ACI 4100Z /02/ ACI /01/ IMM 773C /03/ IMM 775C /01/ REI 2A45C /11/ ACI /10/ REI 2A44G /02/ ACI 4100X /02/ IMM 779C /01/ REI 2A45C /02/ QSA XK /01/ IMM 779C /02/ QSA XK /12/ ACI 4100Y /02/ ACI 4100X /02/ REI 2A44R /10/ ACI Conviene resaltar el hecho de que existe una sentencia CURRENT DATE que permite introducir el día actual sin necesidad de introducirlo como fecha. Además, SQL automáticamente asigna un valor NULL a cualquier columna cuyo nombre falte de la lista, aunque es posible especificar de forma explícita que una columna tiene valor NULL. Así, cuando hemos introducido el nuevo vendedor podríamos haberlo realizado como: 29

30 INSERT INTO repventas(nombre, edad, num_empl, ventas, titulo, director, cuota, contrato, oficina_rep) VALUES( Enrique Jordan, 36, 111, 0, Dir. Ventas, NULL, NULL, 25/07/2000, 13) ; Además, SQL permite omitir la lista de columnas de la sentencia INSERT. Cuando se omite la lista de columnas, SQL genera automáticamente una lista formada por todas las columnas de la tabla, en secuencia de izquierda a derecha. Esta es la misma secuencia de columnas generadas por SQL cuando se utiliza una consulta SELECT *. Utilizando esta forma, la sentencia INSERT anterior podría escribirse como: INSERT INTO repventas VALUES(111, Enrique Jordan,36,13, Dir. Ventas, 25/07/2000,NULL,NULL,0); Supongamos que se desea copiar, a partir de la tabla PEDIDOS, el número de pedido, la fecha y el importe de todos los pedidos remitidos con anterioridad al 1 de Enero de 2000, en otra tabla llamada ANTPEDIDOS. INSERT INTO antpedidos(num_pedido, fecha_pedido, importe) SELECT num_pedido, fecha_pedido, importe FROM pedidos WHERE fecha_pedido< 01/01/2000 ; El estándar SQL especifica varias restricciones sobre la consulta que aparece dentro de la sentencia INSERT multifila: La consulta no puede contener una cláusula ORDER BY. La consulta no puede ser la UNION de varias sentencias SELECT diferentes. La tabla destino de la sentencia INSERT no puede aparecer en la cláusula FROM de la consulta o de ninguna subconsulta que ésta contenga. Además, los resultados de la consulta deben contener el mismo número de columnas que la lista de columnas de la sentencia INSERT (o de la tabla destino entera, si se ha omitido la lista de columnas), y los tipos de datos deben ser compatibles columna a columna Borrado de datos de la base de datos ( DELETE FROM ) NUM_PEDIDO FECHA_PEDIDO IMPORTE /12/ /10/ /12/ /12/ /10/ /11/ /10/ /12/ La unidad más pequeña de datos que puede ser suprimida de una base de datos relacional es una única fila. La sentencia DELETE elimina filas seleccionadas de datos de una única tabla y su estructura es: DELETE FROM nombre_de_la_tabla WHERE La cláusula FROM especifica la tabla destino que contiene las filas. La cláusula WHERE especifica qué filas de la tabla deben a ser suprimidas. Supongamos que Corporacion Oeste S.A. (número de cliente 2126) decide cancelar todos los pedidos. Podemos eliminar sus pedidos de la tabla PEDIDOS mediante la sentencia: DELETE FROM pedidos WHERE clie=2126 ; Si ahora Enrique Jordan, el nuevo vendedor, decide abandonar la empresa con los clientes que posee, las sentencias DELETE que eliminan sus clientes y su fila de la tabla REPVENTAS son: DELETE FROM clientes WHERE rep_clie=111 ; DELETE FROM repventas WHERE nombre= Enrique Jordan ; Tabla REPVENTAS después de eliminar el vendedor Enrique Jordan NUM_EMPL NOMBRE EDAD OFICINA_REP TITULO CONTRATO DIRECTOR CUOTA VENTAS 106 Jose Maldonado VP Ventas 14/06/1998 NULL Carlos Martinez Dir. Ventas 19/05/ Belen Aguirre Dir. Ventas 12/02/ Maria Garcia Rep. Ventas 12/10/ Lorenzo Fernandez Dir. Ventas 12/10/ Soledad Martinez Rep. Ventas 10/12/ Daniel Gutierrez Rep. Ventas 20/10/ Antonio Valle 41 NULL Rep. Ventas 13/01/ NULL Pedro Cruz Rep. Ventas 01/03/ Natalia Martin Rep. Ventas 14/11/

31 La tabla PEDIDOS después de eliminar los pedidos del cliente 2126 quedaría: NUM_PEDIDO FECHA_PEDIDO CLIE REP FAB PRODUCTO CANT IMPORTE /12/ REI 2A44L /01/ ACI /01/ FEA /02/ QSA XK /10/ ACI /01/ ACI 4100Z /02/ REI 2A44R /12/ ACI /01/ BIC /02/ FEA /01/ BIC /12/ ACI /01/ QSA XK /02/ FEA /10/ ACI 4100Z /02/ ACI /01/ IMM 773C /03/ IMM 775C /01/ REI 2A45C /11/ ACI /10/ REI 2A44G /02/ ACI 4100X /02/ IMM 779C /01/ REI 2A45C /02/ QSA XK /01/ IMM 779C /02/ QSA XK /12/ ACI 4100Y /02/ ACI 4100X /02/ REI 2A44R NUM_CLIE EMPRESA REP_CLIE LIMITE_CREDITO 2111 EVBE S.A Exclusivas del Este S.L Pino S.L Hnos. Martinez S.A Distribuciones Sur S.A AFS S.A Exclusivas Soriano S.A Lopez Asociados S.L Hernandez & hijos S.L Componentes Fernandez S.A Domingo S.L Zapater Importaciones S.A Hnos. Ramon S.L JPF S.L Distribuciones Montiel S.L Construcciones Leon S.A Martinez & Garcia S.L Exclusivas Norte S.A Importaciones Martin S.L Roda & Castedo S.L MALB S.A La tabla CLIENTES después de eliminar los clientes del representante 111. Eliminar los pedidos remitidos antes del 15 de Noviembre de 1999: La cláusula WHERE puede seleccionar varias filas de una tabla SQL y eliminar todas las filas seleccionadas. La sentencia sería: DELETE FROM pedidos WHERE fecha_pedido< 15/11/1999 ; 31

32 La tabla pedidos quedaría: NUM_PEDIDO FECHA_PEDIDO CLIE REP FAB PRODUCTO CANT IMPORTE /12/ REI 2A44L /01/ ACI /01/ FEA /02/ QSA XK /01/ ACI 4100Z /02/ REI 2A44R /12/ ACI /01/ BIC /02/ FEA /01/ BIC /12/ ACI /01/ QSA XK /02/ FEA /02/ ACI /01/ IMM 773C /03/ IMM 775C /01/ REI 2A45C /02/ ACI 4100X /02/ IMM 779C /01/ REI 2A45C /02/ QSA XK /01/ IMM 779C /02/ QSA XK /12/ ACI 4100Y /02/ ACI 4100X /02/ REI 2A44R Eliminar todos los pedidos: DELETE FROM pedidos ; La cláusula WHERE de la sentencia DELETE es opcional, pero casi siempre está presente. Si se omite la cláusula WHERE de una sentencia DELETE, se suprimen todas las filas de la tabla destino pero, aunque esto produce una tabla vacía, no borra la tabla PEDIDOS de la base de datos. La definición de la tabla PEDIDOS y sus columnas siguen estando almacenadas en la base de datos. Suprimir todos los pedidos aceptados por Soledad Martinez. En este caso la selección de las filas no se puede hacer en base a una única tabla sino que debe efectuarse en base a datos contenidos en otras tablas. Aquí, sin saber el número de empleado de Soledad Martinez no se pueden determinar los pedidos a eliminar consultando únicamente la tabla PEDIDOS. Entonces, se podría pensar en hallar todos los pedidos utilizando una consulta de dos tablas como la siguiente: NUM_PEDIDO IMPORTE SELECT num_pedido, importe FROM pedidos, repventas WHERE rep=num_empl AND nombre= Soledad Martinez ; Pero no es posible utilizar una composición en una sentencia DELETE. El modo de manejar esta petición es con una de las condiciones de búsqueda subconsulta. Por ejemplo: DELETE FROM pedidos WHERE rep=(select num_empl FROM repventas WHERE nombre= Soledad Martinez ) ; Que nos permitiría borrar las cuatro filas de pedidos aceptados por Soledad Martinez. La tabla quedaría entonces de la siguiente forma: 32

33 NUM_PEDIDO FECHA_PEDIDO CLIE REP FAB PRODUCTO CANT IMPORTE /12/ REI 2A44L /01/ ACI /01/ FEA /02/ QSA XK /10/ ACI /01/ ACI 4100Z /02/ REI 2A44R /12/ ACI /01/ BIC /02/ FEA /01/ BIC /12/ ACI /01/ QSA XK /02/ FEA /02/ ACI /01/ IMM 773C /03/ IMM 775C /01/ REI 2A45C /11/ ACI /10/ REI 2A44G /02/ ACI 4100X /01/ IMM 779C /02/ QSA XK /12/ ACI 4100Y /02/ ACI 4100X /02/ REI 2A44R /10/ ACI Suprimir los clientes atendidos por vendedores cuyas ventas son inferiores al 80% de su cuota. DELETE FROM clientes WHERE rep_clie IN (SELECT num_empl FROM repventas WHERE ventas<(0.8*cuota)) ; Suprimir los vendedores cuyo total de pedidos actual es menor que el 2% de sus cuotas. DELETE FROM repventas WHERE (0.02*cuota) <(SELECT SUM(importe) FROM pedidos WHERE rep=num_empl) ; Suprimir los clientes que no han realizado pedidos desde el 10 de Noviembre de DELETE FROM clientes WHERE NOT EXISTS (SELECT * FROM pedidos WHERE clie=num_clie AND fecha_pedido< 10/11/1999 ) ; 7.3. Actualización de datos de la base de datos ( UPDATE SET ) La unidad más pequeña de datos que puede modificarse en una base de datos es una única columna de una única fila. La sentencia UPDATE modifica los valores de una o más columnas en las filas seleccionadas de una única tabla. La tabla destino a actualizar se indica en la sentencia y la cláusula SET especifica que columnas se van a actualizar y calcula los nuevos valores (pero estos no pueden ser el resultado de funciones de agregación ni subconsultas). Adicionalmente podemos introducir la cláusula WHERE para seleccionar un determinado conjunto de filas de la tabla a modificar. La estructura es: UPDATE nombre_de_la_tabla SET atributo WHERE Veamos, mediante ejemplos, como actúa esta sentencia UPDATE: Modificar el límite de crédito que tiene la empresa Pino S.L. y asignarle como vendedor representante el 109: UPDATE clientes SET limite_credito=60000, rep_clie=109 WHERE empresa= Pino S.L. ; 33

34 La tabla CLIENTES quedaría entonces: Como vemos en este ejemplo, la cláusula WHERE identifica una sola fila de la tabla CLIENTES y la cláusula SET asigna nuevos valores a dos de las columnas de esta fila. NUM_CLIE EMPRESA REP_CLIE LIMITE_CREDITO 2111 EVBE S.A Exclusivas del Este S.L Pino S.L Hnos. Martinez S.A Distribuciones Sur S.A AFS S.A Exclusivas Soriano S.A Lopez Asociados S.L Hernandez & hijos S.L Componentes Fernandez S.A Domingo S.L Zapater Importaciones S.A Hnos. Ramon S.L JPF S.L Distribuciones Montiel S.L Construcciones Leon S.A Martinez & Garcia S.L Exclusivas Norte S.A Importaciones Martin S.L Roda & Castedo S.L MALB S.A Reducir la cuota de los representantes de ventas de la oficina número 12 en un 10% y cambiarles de oficina para que pasen a ser miembros de la oficina 11: UPDATE repventas SET oficina_rep=11, cuota=0.9*cuota WHERE oficina_rep=12 ; En este caso, la sentencia UPDATE actualiza varias filas de una vez ya que la cláusula WHERE selecciona varias filas de la tabla REPVENTAS, y el valor de las columnas OFICINA_REP y CUOTA se modifica en todas ellas. El resultado de esta acción será: NUM_EMPL NOMBRE EDAD OFICINA_REP TITULO CONTRATO DIRECTOR CUOTA VENTAS 106 Jose Maldonado VP Ventas 14/06/1998 NULL Carlos Martinez Dir. Ventas 19/05/ Belen Aguirre Dir. Ventas 12/02/ Maria Garcia Rep. Ventas 12/10/ Lorenzo Fernandez Dir. Ventas 12/10/ Soledad Martinez Rep. Ventas 10/12/ Daniel Gutierrez Rep. Ventas 20/10/ Antonio Valle 41 NULL Rep. Ventas 13/01/ NULL Pedro Cruz Rep. Ventas 01/03/ Natalia Martin Rep. Ventas 14/11/ Asignar una cuota de a los vendedores que no tengan asignada ya una cuota: UPDATE repventas SET cuota=30000 WHERE cuota IS NULL ; La tabla REPVENTAS, después de modificarla, quedará de la siguiente forma: NUM_EMPL NOMBRE EDAD OFICINA_REP TITULO CONTRATO DIRECTOR CUOTA VENTAS 106 Jose Maldonado VP Ventas 14/06/1998 NULL Carlos Martinez Dir. Ventas 19/05/ Belen Aguirre Dir. Ventas 12/02/ Maria Garcia Rep. Ventas 12/10/ Lorenzo Fernandez Dir. Ventas 12/10/ Soledad Martinez Rep. Ventas 10/12/ Daniel Gutierrez Rep. Ventas 20/10/ Antonio Valle 41 NULL Rep. Ventas 13/01/ Pedro Cruz Rep. Ventas 01/03/ Natalia Martin Rep. Ventas 14/11/

35 Ha habido una confusión y los clientes de los empleados 105, 106 y 107 fueron en realidad atendidos por el empleado número 102. Modificar esta información en la B.D.: UPDATE clientes SET rep_clie=102 WHERE rep_clie IN (105, 106, 107) ; Actualizar la B.D. para que aquellas oficinas que tenían un objetivo inferior a pasen a tenerlo y además le cambiaremos sus ventas por el valor que tenían antes como objetivo: UPDATE oficinas SET objetivo=40000, ventas=objetivo WHERE objetivo<40000 ; Antes de la actualización, las oficinas de Toledo y Alicante tenían unos objetivos de y respectivamente, después de la actualización sus ventas son y respectivamente y no La tabla queda entonces: Esto es así porque el SQL calcula los valores de las columnas sobre los datos que hay antes de aplicar ninguna de las partes de la modificación. Aumentar la cuota de todos los representantes de ventas en un 5%: UPDATE repventas SET cuota=1.05*cuota ; NUM_EMPL NOMBRE EDAD OFICINA_REP TITULO CONTRATO DIRECTOR CUOTA VENTAS 106 Jose Maldonado VP Ventas 14/06/1998 NULL Carlos Martinez Dir. Ventas 19/05/ Belen Aguirre Dir. Ventas 12/02/ Maria Garcia Rep. Ventas 12/10/ Lorenzo Fernandez Dir. Ventas 12/10/ Soledad Martinez Rep. Ventas 10/12/ Daniel Gutierrez Rep. Ventas 20/10/ Antonio Valle 41 NULL Rep. Ventas 13/01/ NULL Pedro Cruz Rep. Ventas 01/03/ Natalia Martin Rep. Ventas 14/11/ Aumentar en 5000 el límite de crédito de cualquier cliente que haya remitido un pedido de más de UPDATE clientes SET limite_credito=limite_credito+5000 WHERE num_clie IN (SELECT DISTINCT clie FROM pedidos WHERE importe>25000) ; La tabla de CLIENTES quedará entonces de la siguiente forma: NUM_CLIE EMPRESA REP_CLIE LIMITE_CREDITO 2111 EVBE S.A Exclusivas del Este S.L Pino S.L Hnos. Martinez S.A Distribuciones Sur S.A AFS S.A Exclusivas Soriano S.A Lopez Asociados S.L Hernandez & hijos S.L Componentes Fernandez S.A Domingo S.L Zapater Importaciones S.A Hnos. Ramon S.L JPF S.L Distribuciones Montiel S.L Construcciones Leon S.A Martinez & Garcia S.L Exclusivas Norte S.A Importaciones Martin S.L Roda & Castedo S.L MALB S.A OFICINA CIUDAD REGION DIR OBJETIVO VENTAS 22 Toledo Centro Valencia Este Barcelona Este Alicante Este Madrid Centro

36 NUM_CLIE EMPRESA REP_CLIE LIMITE_CREDITO 2111 EVBE S.A Exclusivas del Este S.L Pino S.L Hnos. Martinez S.A Distribuciones Sur S.A AFS S.A Exclusivas Soriano S.A Lopez Asociados S.L Hernandez & hijos S.L Componentes Fernandez S.A Domingo S.L Zapater Importaciones S.A Hnos. Ramon S.L JPF S.L Distribuciones Montiel S.L Construcciones Leon S.A Martinez & Garcia S.L Exclusivas Norte S.A Importaciones Martin S.L Roda & Castedo S.L MALB S.A Queremos asignar todos los clientes, atendidos por los vendedores cuyas ventas son menores al 80% de sus cuotas, al vendedor número 105: UPDATE clientes SET rep_clie=105 WHERE rep_clie IN (SELECT num_empl FROM repventas WHERE ventas<(0.8*cuota) ; 8. Creación de la base de datos en SQL (LDD) NUM_CLIE EMPRESA REP_CLIE LIMITE_CREDITO 2111 EVBE S.A Exclusivas del Este S.L Pino S.L Hnos. Martinez S.A Distribuciones Sur S.A AFS S.A Exclusivas Soriano S.A Lopez Asociados S.L Hernandez & hijos S.L Componentes Fernandez S.A Domingo S.L Zapater Importaciones S.A Hnos. Ramon S.L JPF S.L Distribuciones Montiel S.L Construcciones Leon S.A Martinez & Garcia S.L Exclusivas Norte S.A Importaciones Martin S.L Roda & Castedo S.L MALB S.A Hasta el momento hemos visto la parte del SQL referente al LMD. Veamos ahora cómo podemos actuar sobre la propia estructura de la BD. Estos cambios son manejados por un conjunto de sentencias SQL denominadas como lenguaje de definición de datos. Estas sentencias permiten: Definir y crear una nueva tabla. Suprimir una tabla que ya no se necesita. Cambiar la definición de una tabla existente. Definir una tabla virtual (o vista) de datos. Establecer controles de seguridad para una base de datos. (Este parte no la veremos). 36

37 8.1. Creación de tablas en una base de datos ( CREATE TABLE ) La creación de una tabla de la base de datos se realiza con la sentencia CREATE TABLE en la que indicaremos cuál es el esquema de la relación, definiremos el dominio de los valores asociados a cada atributo y le especificaremos las ligaduras de integridad que deben cumplir. Normalmente, también se añaden los índices que deben ser mantenidos en cada relación así como información a cerca de la seguridad y autorización de cada relación, y la estructura de almacenamiento físico en disco, pero esta parte excede al nivel de este curso por lo que no la vamos a incluir. Para ver las posibilidades que tenemos al crear una nueva tabla dividiremos el proceso en 3 partes: 1. Definición de las columnas. 2. Definición de la clave primaria y las claves ajenas (si las hay). 3. Especificar restricciones de los datos. Definición de las columnas Después de escribir la cláusula CREATE TABLE nombre_de_la_tabla ( ) y situado entre los paréntesis, debemos especificar las columnas que tendrá la tabla (indicando su nombre y características) y separadas por comas. El orden en que definamos las columnas nos va a determinar el orden de izquierda a derecha de las columnas en la tabla. Cada definición especifica: El nombre de la columna, que se utiliza para referirse a la columna en las sentencias SQL. Cada columna de la tabla debe tener un nombre único, pero los nombres pueden ser iguales a los de las columnas de otras tablas. El dominio de los datos de la columna, que determina la clase de datos que la columna almacena. (Son los especificados en el pto. 2 de este tema). Si la columna no puede contener datos nulos, la cláusula NOT NULL impide que aparezcan valores NULL en la columna, en caso contrario se permiten los valores nulos en la columna. Con esto, algunas sentencias de ejemplo (aunque incompletas) serían: CREATE TABLE oficinas (oficina INTEGER NOT NULL, ciudad VARCHAR(15) NOT NULL, region VARCHAR(10) NOT NULL, objetivo INTEGER, ventas INTEGER NOT NULL); CREATE TABLE pedidos (num_pedido INTEGER NOT NULL, fecha_pedido DATE NOT NULL, clie INTEGER NOT NULL, rep INTEGER, fab CHAR(3) NOT NULL, producto CHAR(5) NOT NULL, cant INTEGER NOT NULL, importe INTEGER NOT NULL); Definición de la clave primaria y las claves ajenas Además de la definición de las columnas de una tabla, debemos especificar cual o cuales forman la clave primaria y si hay alguna que sea clave ajena, deberemos decir que columnas son y de que tabla son clave primaria. Para esto usaremos las cláusulas PRIMARY KEY y FOREING KEY. Hay que tener en cuenta que, si especificamos que una columa es clave primaria, mediante la cláusula PRIMARY KEY, deberemos asegurar también que el valor de dicha columna sea único y que exista, por lo que deberemos haber especificado que la columna es NOT NULL. Veamos un ejemplo: CREATE TABLE pedidos (num_pedido INTEGER NOT NULL, fecha_pedido DATE NOT NULL, clie INTEGER NOT NULL, rep INTEGER, fab CHAR(3) NOT NULL, producto CHAR(5) NOT NULL, cant INTEGER NOT NULL, importe INTEGER NOT NULL, PRIMARY KEY (num_pedido), FOREING KEY (clie) REFERENCES clients, FOREING KEY (rep) REFERENCES repventas, FOREING KEY (fab, producto) REFERENCES productos); 37

38 Cuando el gestor de la base de datos procesa la sentencia CREATE TABLE, compara cada definición de clave ajena con la definición de la tabla a la que referencia, asegurándose que la clave ajena y la clave primaria de la tabla referenciada concuerden en el número de columnas que contienen y en sus tipos de datos. La tabla referenciada debe estar ya definida en la base de datos para que esta comparación tenga éxito. Si dos o más tablas se referencian mutuamente, no se puede definir la clave ajena de la tabla que se cree en primer lugar, ya que la tabla referenciada todavía no existe. En su lugar debe crearse la tabla sin definición de clave ajena y añadirle la clave ajena posteriormente utilizando la sentencia ALTER TABLE para modificar la estructura de la tabla. Especificación de restricciones de los datos Adicionalmente, podemos añadir a nuestras columnas que los datos que contengan se encuentren dentro de un rango establecido, o que pertenenzcan a un conjunto determinado, etc. Esto se realiza añadiendo a la sentencia CREATE TABLE una cláusula CHECK sobre la columna o columnas en cuestión, indicando qué condición sobre los datos se debe cumplir para poder después insertar una tupla en dicha tabla. Supongamos que en la tabla de pedidos no permitiéramos una cantidad de producto igual a cero, entonces la sentencia para la creación de la tabla sería: CREATE TABLE pedidos (num_pedido INTEGER NOT NULL, fecha_pedido DATE NOT NULL, clie INTEGER NOT NULL, rep INTEGER, fab CHAR(3) NOT NULL, producto CHAR(5) NOT NULL, cant INTEGER NOT NULL, importe INTEGER NOT NULL, PRIMARY KEY (num_pedido), FOREING KEY (clie) REFERENCES clients, FOREING KEY (rep) REFERENCES repventas, FOREING KEY (fab, producto) REFERENCES productos, CHECK ( cant >0 )); Como ejemplo adicional a la creación de tablas, aunque no esté relacionado con nuestra base de datos de ejemplo, supongamos que queremos crear una tabla LIBRO para almacenar información referente a los libros en una BD. Pongámonos en el caso en que existe un atributo que es el código de la editorial y que es clave ajena de una tabla llamada EDITORIAL, y supongamos que cabe la posibilidad de que, si la editorial es una universidad, existe otro atributo el código de universidad que nos referenciaría a la clave primaria de una tabla llamada UNIVERS. Supongamos además, que nos informan de que existe una exclusividad en la edición de un libro por parte de una editorial o de una universidad. Esta restricción debe tenerse en cuenta a la hora de crear la tabla y para ello usaremos la cláusula CHECK. La forma de expresarlo sería: CRATE TABLE libro ( Cod_libro CHAR(10), Titulo VARCHAR(100), Tipo_encuadernacion VARCHAR(15), Cod_editorial CHAR(20), Cod_univers CHAR(20), PRIMARY KEY(Cod_libro), FOREIGN KEY (Cod_editorial) REFERENCES Editorial, FOREIGN KEY (Cod_univers) REFERENCES Univers, CHECK ( (Cod_editorial IS NULL AND Cod_univers IS NOT NULL) OR (Cod_univers IS NULL AND Cod_editorial IS NOT NULL) ); Adicionalmente podríamos añadir otros tipos de comprobaciones como por ejemplo, comprobar que el tipo de encuadernación del libro solo puede ser o normal o de bolsillo o rústica. Esto se haría incluyendo en la tabla LIBRO la siguiente condición: CHECK(Tipo_encuadernacion IN ( normal, de bolsillo, rustica )) Eliminación de tablas de una base de datos ( DROP TABLE ) La eliminación de una tabla de la base de datos se realiza con la sentencia DROP TABLE en la que indicaremos el nombre de la tabla que deseamos quitar. Cuando se ejecuta una sentencia DROP TABLE se borra la estructura de la tabla y todo su contenido. Por ejemplo, eliminar la tabla clientes de la B.D.: DROP TABLE clientes; 38

39 8.3. Modificación de la definición de una tabla ( ALTER TABLE ) La sentencia ALTER TABLE sirve para modificar la estructura, ya definida, de una tabla de la base de datos. Se va a poder añadir nuevos atributos (columnas) a la tabla así como eliminarlos o cambiar las restricciones de la tabla o añadirle más. La estructura es: ALTER TABLE nombre_de_la_tabla accion_a_llevar_a_cabo Las acciones que podemos realizar sobre la tabla, ilustradas con ejemplos, son: Añadir una columna Para añadir una columna a nuestra tabla escribiremos, detrás del nombre de la tabla, la cláusula ADD seguida de la definición de esa columna (usando las mismas características que para crear tablas). Por ejemplo: Añadir un nombre y un teléfono de contacto a la tabla CLIENTES. ALTER TABLE clientes ADD (nombre_contacto VARCHAR(30), telefono_contacto CHAR(9)); Añadir una columna inventario mínimo a la tabla PRODUCTOS. ALTER TABLE productos ADD cant_min INTEGER NOT NULL ; Suprimir de una columna Para eliminar una columna a nuestra tabla escribiremos, detrás del nombre de la tabla, la cláusula DROP seguida del nombre de la columna a eliminar. Por ejemplo: Eliminar el nombre de contacto a la tabla CLIENTES. ALTER TABLE clientes DROP nombre_contacto ; Hay que tener en cuenta que esto podremos hacerlo así solo si se trata de una columna que no es clave primaria. 9. Vistas en SQL (LDD) En el caso del SQL, el sistema cuenta con dos mecanismos diferentes implicados en el mantenimiento de la seguridad: el sistema de gestión de vistas, y el subsistema de autorización que nos permitan asignar a los usuarios permisos de acceso a tablas y vistas de la base de datos. Como ya se ha comentado anteriormente, nosotros sólo veremos por encima el caso de las vistas. En SQL, una vista es una tabla virtual en la base de datos cuyos contenidos están definidos por una consulta. Para el usuario de la base de datos, la vista aparece igual que una tabla real, con un conjunto de columnas designadas y filas de datos pero a diferencia de una tabla real, una vista no existe en la base de datos como conjunto almacenado de valores. En su lugar, las filas y columnas de datos visibles a través de la vista son los resultados producidos por la consulta que define la vista. Las vistas proporcionan una variedad de beneficios, pudiendo resaltarse los siguientes: Seguridad. Cada usuario puede obtener permiso para acceder a la base de datos únicamente a través de un pequeño conjunto de vistas que contienen los datos específicos que el usuario está autorizado a ver. Simplicidad de consulta. Una vista puede extraer datos de varias tablas diferentes y presentarlos como una única tabla, haciendo que consultas multitabla se formulen como consultas de una sola tabla con respecto a la vista. 39

40 Simplicidad estructurada. Las vistas pueden dar a un usuario una visión "personalizada" de la estructura que tiene la base de datos presentando está como un conjunto de tablas virtuales que tienen sentido para ese usuario. Aislamiento frente al cambio. Una vista representa una imagen consistente inalterada de la base de datos, incluso si las tablas originales se dividen, reestructuran o cambian de nombre. Integridad de datos. Si los datos se acceden y se introducen a través de una vista, el gestor de la base de datos puede comprobar automáticamente los datos para asegurarse que satisfacen restricciones de integridad específicas. Sin embargo, las vistas presentan también una serie de desventajas al utilizarlas en lugar de una tabla real. Estas desventajas son: Rendimiento. Las vistas crean la apariencia de una tabla, pero el gestor de la base de datos debe traducir las consultas con respecto a la vista en consultas con respecto a las tablas fuente originales. Restricciones de actualización. Cuando un usuario trata de actualizar filas de una vista, el gestor de la base de datos debe traducir la petición a una actualización sobre las filas de las tablas fuente. Esto es posible para vistas sencillas, pero vistas complejas no pueden ser actualizadas, son "de solo lectura". Para crear una vista en SQL usaremos la sentencia: CREATE VIEW nombre_de_la_tabla AS consulta ; Opcionalmente se puede dar un nombre a cada columna de la vista recién creada pero, si se especifica una lista de nombres de columnas, deben tener el mismo número de elementos que el número de columnas producido por la consulta. Y para borrar una vista usaremos la sentencia: DROP VIEW nombre_de_la_tabla ; Veamos algunos ejemplos de creación de vistas: Queremos que un director de ventas vea solamente las filas de la tabla REPVENTAS correspondientes a los vendedores de la región del director. Para lograr esto se pueden definir dos vistas de forma que permita a cada director ver tan solo los vendedores de su región. Vamos a crear la vista con los vendedores de la zona Este y después la vista los vendedores de la zona Centro. CREATE VIEW repeste AS SELECT * FROM repventas WHERE oficina_rep IN (11, 12, 13) ; NUM_EMPL NOMBRE EDAD OFICINA_REP TITULO CONTRATO DIRECTOR CUOTA VENTAS 106 Jose Maldonado VP Ventas 14/06/1998 NULL Carlos Martinez Dir. Ventas 19/05/ Belen Aguirre Dir. Ventas 12/02/ Maria Garcia Rep. Ventas 12/10/ Daniel Gutierrez Rep. Ventas 20/10/ Pedro Cruz Rep. Ventas 01/03/ CREATE VIEW repcentro AS SELECT * FROM repventas WHERE oficina_rep IN (21, 22) ; NUM_EMPL NOMBRE EDAD OFICINA_REP TITULO CONTRATO DIRECTOR CUOTA VENTAS 108 Lorenzo Fernandez Dir. Ventas 12/10/ Soledad Martinez Rep. Ventas 10/12/ Natalia Martin Rep. Ventas 14/11/ Creación de una vista que contiene únicamente las oficinas de la región Este: 40

41 CREATE VIEW oficinaeste AS SELECT * FROM oficinas WHERE region='este' ; Creación de una vista para Soledad Martinez (empleada 102) que contiene solamente los pedidos remitidos por clientes asignados a ella. CREATE VIEW pedidossoledad AS SELECT * FROM pedidos WHERE clie IN (SELECT num_clie FROM clientes WHERE rep_clie=102) ; NUM_PEDIDO FECHA_PEDIDO CLIE REP FAB PRODUCTO CANT IMPORTE /01/ QSA XK /10/ ACI 4100Z /02/ IMM 779C /01/ REI 2A45C /02/ QSA XK Creación de una vista que muestra aquellos clientes que tiene más de en pedidos. CREATE VIEW clientesvip AS SELECT * FROM clientes WHERE 30000<(SELECT SUM(importe) FROM pedidos WHERE clie=num_clie) ; NUM_CLIE EMPRESA REP_CLIE LIMITE_CREDITO 2117 Hnos. Ramon S.L Lopez Asociados S.L Pino S.L Roda & Castedo S.L Hacer que el departamento de procesamiento de pedidos solo pueda acceder al número de empleado, su nombre y la asignación de oficina de cada vendedor, pues es información necesaria para procesar correctamente el pedido, pero no hay necesidad de que acceda al total de ventas realizadas o a la cuota. CREATE VIEW inforep AS SELECT num_empl, nombre, oficina_rep FROM repventas ; Creación una vista de la tabla OFICINAS. CREATE VIEW infooficina AS SELECT oficina, ciudad, region FROM oficinas ; EMPRESA REP_CLIE EVBE S.A. 103 Exclusivas del Este S.L. 101 Pino S.L. 105 Hermanos Martinez S.A. 102 Distribuciones Sur S.A. 110 AFS S.A. 101 Exclusivas Soriano S.A. 106 Lopez Asociados S.L. 108 Hernandez & hijos S.L. 103 Componentes Fernandez S.A. 102 Domingo S.L. 107 Zapater Importaciones S.A. 109 Hnos. Ramon S.L. 106 JPF S.L. 105 Distribuciones Montiel S.L. 102 Construcciones Leon S.A. 102 Martinez & Garcia S.L. 109 Exclusivas Norte S.A. 108 Ian & Shmidt 104 Roda & Castedo S.L. 103 MALB S.A. 101 OFICINA CIUDAD REGION DIR OBJETIVO VENTAS 11 Valencia Este Barcelona Este Alicante Este NUM_EMPL NOMBRE OFICINA_REP 106 Jose Maldonado Carlos Martinez Belen Aguirre Maria Garcia Lorenzo Fernandez Soledad Martinez Daniel Gutierrez Antonio Valle NULL 103 Pedro Cruz Natalia Martin 22 OFICINA CIUDAD REGION 22 Toledo Centro 11 Valencia Este 12 Barcelona Este 13 Alicante Este 21 Madrid Centro Creación de una vista de la tabla CLIENTES. CREATE VIEW infoclie AS SELECT empresa, rep_clie FROM clientes ; 41

42 Creación de una vista que contiene el número de cliente, el nombre de la empresa y el limite de crédito para los clientes de Belen Aguirre (empleado número 105). CREATE VIEW cliebill AS SELECT num_clie, empresa, limite_credito FROM clientes WHERE rep_clie=105 ; Creación de una vista que contiene datos sumarios de los pedidos para cada vendedor. CREATE VIEW ped_por_rep(quien, cuantos, total, inf, sup, medio) AS SELECT rep, COUNT(*), SUM(importe), MIN(importe), MAX(importe), AVG(importe) FROM pedidos GROUP BY rep ; NOMBRE CUANTOS TOTAL MEDIO Lorenzo Fernandez ,14 Belen Aguirre ,40 Natalia Martin ,33 Jose Maldonado ,00 Daniel Gutierrez ,00 Antonio Valle ,00 Soledad Martinez ,00 Maria Garcia ,50 Pedro Cruz ,00 NUM_CLIE EMPRESA LIMITE_CREDITO 2103 Pino S.L JPF S.L QUIEN CUANTOS TOTAL INF SUP MEDIO , , , , , , , , ,00 Datos sumarios de los vendedores obtenidos a partir de la vista PED_POR_REP. SELECT nombre, cuantos, total, medio FROM repventas, ped_por_rep WHERE quien=num_empl ORDER BY total DESC ; Creación de una vista de la tabla PEDIDOS con nombres en vez de códigos. CREATE VIEW info_pedido(num_pedido, empresa, nombre_rep, importe) AS SELECT num_pedido, empresa, nombre, importe FROM pedidos, clientes, repventas WHERE clie=num_clie AND rep=num_empl ; NUM_PEDIDO EMPRESA NOMBRE_REP IMPORTE Hnos. Ramon S.L. Jose Maldonado EVBE S.A. Belen Aguirre Exclusivas Soriano S.A. Jose Maldonado Exclusivas Norte S.A. Lorenzo Fernandez Exclusivas del Este S.L. Daniel Gutierrez Distribuciones Sur S.A. Antonio Valle Lopez Asociados S.L. Lorenzo Fernandez Pino S.L. Belen Aguirre Exclusivas Norte S.A. Lorenzo Fernandez Zapater Importaciones S.A. Maria Garcia Domingo S.L. Natalia Martin Pino S.L. Belen Aguirre Componentes Fernandez S.A. Lorenzo Fernandez Domingo S.L. Natalia Martin Componentes Fernandez S.A. Soledad Martinez Pino S.L. Belen Aguirre Lopez Asociados S.L. Lorenzo Fernandez Roda & Castedo S.L. Natalia Martin Distribuciones Sur S.A. Antonio Valle Exclusivas Norte S.A. Lorenzo Fernandez EVBE S.A. Pedro Cruz Zapater Importaciones S.A. Daniel Gutierrez Distribuciones Montiel S.L. Soledad Martinez Construcciones Leon S.A. Soledad Martinez Construcciones Leon S.A. Soledad Martinez Zapater Importaciones S.A. Maria Garcia Exclusivas Norte S.A. Lorenzo Fernandez Pino S.L. Belen Aguirre EVBE S.A. Pedro Cruz Importaciones Martin S.L. Daniel Gutierrez

43 Mayores pedidos realizados, ordenados por importe. SELECT empresa, importe, nombre_rep FROM info_pedido WHERE importe>20000 ORDER BY importe DESC ; EMPRESA IMPORTE NOMBRE_REP Lopez Asociados S.L Lorenzo Fernandez Hnos. Ramon S.L Jose Maldonado Roda & Castedo S.L Natalia Martin Pino S.L Belen Aguirre Distribuciones Sur S.A Antonio Valle Importaciones Martin S.L Daniel Gutierrez La vista hace mucho más fácil de examinar lo que sucede en la consulta que si fuera expresada como la composición equivalente de tres tablas. 10. Ejercicio propuesto de consultas en SQL Dado el siguiente diagrama de una base de datos y las relaciones mostradas a continuación: DPTOFICINAS codigo oficina departamento telefono EMPLEADOS num nombre edad departamento categoria contrato OFICINAS oficina ciudad region DEPARTAMENTOS deptno nombre CATEGORIAS categoria titulo salario trienio DPTOFICINAS CODIGO OFICINA DEPARTAMENTO TELEFONO EMPLEADOS NUM NOMBRE EDAD DEPARTAMENTOCATEGORÍACONTRATO 1000 Antonio Gutierrez /01/ Paloma Blanco /03/ Antonio Pazos /03/ Ana Garcia /10/ Amparo Beltran /02/ Enrique Gomez /07/ Nieves Soler /03/ Juan Jose Velasco /02/ Isidro Perez /05/ Ignacio Lopez /04/ Vicente Salvador /07/ Carmen Hernandez /07/ Juan Pons /04/ Pedro Fernandez /09/ Silvia Blasco /02/ Jose Alegre /08/ Cristina Prats /11/ Carlos Gimenez /05/ Maria Gonzalez /06/ Manuel Torres /01/ Jose Perez /03/ Alejandro Martos /10/ Veronica Muelas /07/ Elena Lopez /07/ Isabel Fernandez /10/ Jose Mujica /09/ Pedro Bledos /02/ Pablo Costas /07/ Ester Castro /07/ Gregorio Mas /03/ Jose Medina /06/ Maria Utrillas /08/ Marina Gilabert /12/1998 DEPARTAMENTOS DEPTNO NOMBRE 1 Dirección 2 Administración 3 Comercial 4 Almacén 5 Informática OFICINAS OFICINA CIUDAD REGION 11 Valencia Este 12 Barcelona Este 13 Alicante Este 21 Madrid Centro 22 Toledo Centro CATEGORÍAS CATEGORIA TITULO SALARIO TRIENIO 1 Director Jefe Sección Administrativo Comercial Empl. almacén

44 Realizar las siguientes consultas en SQL: 1) Nombre y edad de los empleados. 2) Salario y trienios de cada categoría si suponemos un aumento del 2%. 3) Fecha de contratación de cada empleado. 4) Edades de los empleados. 5) Número de empleados que hay para cada una de las edades. 6) Edad media de los empleados por departamento. 7) Categorías profesionales que superan las de salario. 8) Datos del empleado número ) Empleados del departamento ) Empleados cuya contratación se produjo en el año ) Empleados que no sean comerciales (código de categoría 4). 12) Empleados contratados entre los años 1990 y ) Categorías que tienen un salario inferior a o superior a ) Empleados cuya categoría es director o jefe de sección (códigos 1 y 2). 15) Empleados de nombre 'Jose'. 16) Empleados que pertenecen a la categoría de administrativo (código 3) y que tienen una edad mayor de 35 años. 17) Empleados que no pertenecen al departamento ) Nombre y edad de los empleados ordenados de menor a mayor edad. 19) Nombre y edad de los empleados ordenados por nombre de forma descendente. 20) Nombre del empleado y de la categoría en el que trabaja. 21) Código y teléfonos de los departamentos de las oficinas de la región 'Centro'. 22) Nombre del empleado y ciudad en la que trabaja. 23) Sueldo de cada empleado incluyendo trienios. 24) Nombre de los empleados y de sus jefes de sección. 25) Suma del sueldo de los empleados, sin contar trienios. 26) Promedio del sueldo, sin contar trienios, de la oficina de 'Barcelona'. 27) Salarios máximo y mínimo de los empleados, incluyendo trienios (#). 28) Número de empleados que superan los 40 años. 29) Número de edades diferentes que tienen los empleados. 30) Categoría y suma de los sueldos de los empleados, contando trienios, de cada una de las categorías. 31) Nombre y suma de los sueldos de los empleados, sin contar trienios, de cada oficina. 32) Titulo y suma de trienios de las categorías cuya suma supera las ) Nombre del departamento y número de empleados de los departamentos que tienen más de 5 empleados. 34) Nombre y sueldo, sin contar trienios, de los empleados cuyos sueldos son inferiores a la media de sueldos de la empresa. 35) Título de las categorías donde existe un empleado con contrato anterior a ) Nombre de los empleados que tiene un contrato más antiguo que cualquier empleado del departamento de 'Informática'. 37) Ciudad y número de empleados de la oficina que tiene un número de empleados superior a la media de la empresa. 38) Año de contratación de cada empleado. 39) Crear la tabla de empleados y de categorías suponiendo que todo empleado tiene un sueldo superior a ptas. 40) Añadirle a la tabla de empleados una nueva columna que sea la dirección del empleado. (#) El dinero recibido por los trienios se calcula en base a la fórmula: trienio*((fecha_actual-fecha_del_contrato)/(365*3)) 44

Esquema de la base de datos de ejemplo

Esquema de la base de datos de ejemplo Esquema de la base de datos de ejemplo OFICINAS oficina ciudad region dir objetivo ventas CLIENTES num_clie empresa rep_clie limite_credito REPVENTAS num_empl nombre edad oficina_rep titulo contrato director

Más detalles

El lenguaje SQL III: Creación de bases de datos y seguridad. Introducción

El lenguaje SQL III: Creación de bases de datos y seguridad. Introducción Introducción La estructura de la base de datos se maneja mediante las sentencias denominadas lenguaje de definición de datos El lenguaje de definición de datos permite: Definir y crear nuevas tablas: CREATE

Más detalles

TEMA 3: El lenguaje SQL I: Consulta de datos.

TEMA 3: El lenguaje SQL I: Consulta de datos. 3.1 Introducción. TEMA 3:. Antes de proceder a explicar el lenguaje en SQL, veamos la descripción de la pequeña base de datos relacional que usaremos a lo largo del presente tema para la ejecución de los

Más detalles

TEMA 4: El lenguaje SQL II: Introducción, modificación y borrado de datos.

TEMA 4: El lenguaje SQL II: Introducción, modificación y borrado de datos. TEMA 4: El lenguaje SQL II: Introducción, modificación y borrado de datos. 4.1 Actualización de datos en SQL. SQL es un lenguaje completo de manipulación de datos que no solo se utiliza para consultas,

Más detalles

TEMA 4.. CONSULTA DE DATOS I.

TEMA 4.. CONSULTA DE DATOS I. TEMA 4.. CONSULTA DE DATOS I. 4.1 El lenguaje DML (Lenguaje de manipulación de datos) Las sentencias DML(Data Manipulation Language) del lenguaje SQL (Structured Query Language o Lenguaje de peticiones

Más detalles

INFORMÁTICA MÉDICA. Profesor: MsC. Liz Armenteros Chávez

INFORMÁTICA MÉDICA. Profesor: MsC. Liz Armenteros Chávez INFORMÁTICA MÉDICA Profesor: MsC. Liz Armenteros Chávez Tema No.2: Gestión de la Información Biomédica Conferencia No.4 SQL: Structured Query Language. Consultas Simples. Marzo, 2014 Introducir las consultas

Más detalles

Modulo I: Introducción Gestores de Bases De Datos

Modulo I: Introducción Gestores de Bases De Datos Modulo I: Introducción Gestores de Bases De Datos El SQL El SQL (Lenguaje de Consulta Estructurado Structure Query Language), es un lenguaje de consulta estructurado establecido claramente como el lenguaje

Más detalles

1. DML. Las consultas multitabla

1. DML. Las consultas multitabla 1.1 Introducción 1. DML. Las consultas multitabla Hasta ahora hemos visto consultas que obtienen los datos de una sola tabla, en este tema veremos cómo obtener datos de diferentes tablas en una sola instrucción

Más detalles

LENGUAJE DE CONSULTA ESTRUCTURADO (SQL)

LENGUAJE DE CONSULTA ESTRUCTURADO (SQL) Qué es una base de datos? Una base de datos (cuya abreviatura es BD) es una entidad en la cual se pueden almacenar datos de manera estructurada, con la menor redundancia posible. Diferentes programas y

Más detalles

Lenguaje de manipulación de datos

Lenguaje de manipulación de datos Introducción Lenguaje de manipulación de datos (Data Manipulation Language) Permite a los usuarios llevar a cabo las tareas de consulta o manipulación de la BD. El más popular es SQL. Tablas de ejemplo

Más detalles

Los DLL que permiten crear y definir nuevas bases de datos, campos e índices.

Los DLL que permiten crear y definir nuevas bases de datos, campos e índices. Componentes del SQL El lenguaje SQL está compuesto por comandos, cláusulas, operadores y funciones agregadas. Estos elementos se combinan en las instrucciones para crear, actualizar y manipular las bases

Más detalles

1. DML. Las consultas de resumen

1. DML. Las consultas de resumen 1.1 Introducción 1. DML. Las consultas de resumen Una de las funcionalidades de la sentencia SELECT es el permitir obtener resúmenes de los datos contenidos en las columnas de las tablas. Para poder llevarlo

Más detalles

ADMINISTRACION DE ORACLE 9i Guía de estudio (OCA) TEMA 1

ADMINISTRACION DE ORACLE 9i Guía de estudio (OCA) TEMA 1 ADMINISTRACION DE ORACLE 9i Guía de estudio (OCA) TEMA 1 TEMA 1. CONSULTAS BÁSICAS Fundamentos de SQL Tipos de datos, operadores y literales Sentencia SELECT Limitación de filas y operadores Ordenación

Más detalles

El SQL es un lenguaje estándar de programación para el acceso a bases de datos.

El SQL es un lenguaje estándar de programación para el acceso a bases de datos. El SQL es un lenguaje estándar de programación para el acceso a bases de datos. El lenguaje SQL se utiliza para acceder y manipular datos en cualquier base de datos del mercado, como por ejemplo, para

Más detalles

MATERIAL INTRODUCTORIO ORACLE 11G

MATERIAL INTRODUCTORIO ORACLE 11G MATERIAL INTRODUCTORIO ORACLE 11G Esp. JONATHAN GUERRERO ASTAIZA Capacidades de una sentencia SELECT La sentencia SELECT recibe información a partir de una base de datos. Con la sentencia SELECT usted

Más detalles

Operadores. Además se pueden emplear en sentencias SET.

Operadores. Además se pueden emplear en sentencias SET. Operadores MySQL dispone de multitud de operadores diferentes para cada uno de los tipos de columna. Esos operadores se utilizan para construir expresiones que se usan en cláusulas ORDER BY y HAVING de

Más detalles

1. Lenguaje de Definición de Datos. 2. Lenguaje de Manipulación de. Datos. M. C. Gustavo Alfonso Gutiérrez Carreón

1. Lenguaje de Definición de Datos. 2. Lenguaje de Manipulación de. Datos. M. C. Gustavo Alfonso Gutiérrez Carreón 1. Lenguaje de Definición de Datos 2. Lenguaje de Manipulación de Datos M. C. Gustavo Alfonso Gutiérrez Carreón Los 'sistemas de gestión de bases de datos (en inglés database management system, abreviado

Más detalles

Está basado en el álgebra y en el cálculo relacional.

Está basado en el álgebra y en el cálculo relacional. SQL DML. Introducción SQL. QUÉ ES. SQL (Structured Query Language, Lenguaje Estructurado de Consultas): Lenguaje que permite expresar operaciones diversas (aritméticas, combinatorias, lógicas, selección

Más detalles

SQL. Amparo López Gaona. México, D.F. Noviembre 2003

SQL. Amparo López Gaona. México, D.F. Noviembre 2003 Amparo López Gaona México, D.F. Noviembre 2003 Introducción El lenguaje SQL (Structured Query Language) es el lenguaje estándar para trabajo con bases de datos relacionales. Permite la definición, acceso

Más detalles

SQL Básico. José Muñoz Jimeno Febrero 2015

SQL Básico. José Muñoz Jimeno Febrero 2015 SQL Básico José Muñoz Jimeno Febrero 2015 Control de cambios Version Fecha Comentarios 1.0 13/02/2015 Primera versión para el curso Introducción a las bases de datos con MySQL en el COITCV La última versión

Más detalles

TEMA 5: El lenguaje SQL III: Creación de bases de datos y seguridad.

TEMA 5: El lenguaje SQL III: Creación de bases de datos y seguridad. El lenguaje SQL III: Creación de bases de datos TEMA 5: El lenguaje SQL III: Creación de bases de datos y seguridad 51 Introducción Hasta el momento hemos visto sentencias SQL (SELECT INSERT etc) que permiten

Más detalles

Oracle Database 12c SQL and PLSQL Fundamentals

Oracle Database 12c SQL and PLSQL Fundamentals Oracle Database 12c SQL and PLSQL Fundamentals DESCRIPCION MODULOS DE CAPACITACION Introducción Información general sobre 12c de base de datos Oracle y productos afines Descripción de los conceptos y la

Más detalles

Insertar Datos en Tablas

Insertar Datos en Tablas Insertar Datos en Tablas La instrucción básica para insertar valores a los atributos (columnas) de una tabla es la instrucción INSERT INTO Insertar una sola tupla Para insertar una tupla en la tabla, se

Más detalles

Anexo 3 COMPONENTES DE SQL SERVER. Los DDL (Data Definition Languaje) que permiten crear y definir nuevas

Anexo 3 COMPONENTES DE SQL SERVER. Los DDL (Data Definition Languaje) que permiten crear y definir nuevas Anexo 3 COMPONENTES DE SQL SERVER COMANDOS Existen tres tipos de comandos SQL [5]: Los DDL (Data Definition Languaje) que permiten crear y definir nuevas bases de datos, campos e índices. En la tabla se

Más detalles

Manual de Sentencias Básicas en SQL

Manual de Sentencias Básicas en SQL Manual de Sentencias Básicas en SQL Pues hoy que he estado enredando un rato con MySQl, y me he acordado de aquellos comienzos en los que tenía que volver a mis antiguos apuntes para lograr entender las

Más detalles

Structured Query Language (SQL) Fundamentos de Bases de Datos InCo - 2011

Structured Query Language (SQL) Fundamentos de Bases de Datos InCo - 2011 Structured Query Language () Fundamentos de Bases de Datos InCo - Un poco de historia Lenguajes de consulta relacionales: SEQUEL (IBM-1970) QUEL (Ingres-1970) QBE (IBM-1970) es el lenguaje comercial más

Más detalles

Access SQL: DDL y DML. Una empresa de Ingeniería precisa una base de datos para la gestión de sus proyectos.

Access SQL: DDL y DML. Una empresa de Ingeniería precisa una base de datos para la gestión de sus proyectos. SGBD y SQL Access SQL: DDL y DML Ejercicio Una empresa de Ingeniería precisa una base de datos para la gestión de sus proyectos. Necesita almacenar información acerca de sus empleados y los proyectos en

Más detalles

GUÍA DE TRABAJO N 5 GRADO 11 Programación y Diseño de Articulación SENA Software Ing. Néstor Raúl Suarez Perpiñan Página 1 de 6

GUÍA DE TRABAJO N 5 GRADO 11 Programación y Diseño de Articulación SENA Software Ing. Néstor Raúl Suarez Perpiñan Página 1 de 6 Página 1 de 6 GUIA N 5 LINEA DE COMANDOS MYSQL I. CREAR, SELECCIONAR, VISUALIZAR 1. CREAR BASE DE DATOS CREATE DATABASE Nombre_Base_Datos; 2. VER LISTADO DE BASES DE DATOS SHOW DATABASES; 3. USAR UNA BASE

Más detalles

Clase 4: SQL DDL DML Consultas Simples y Multitablas. BASE DE DATOS FAC.DE INGENIERIA - UNJu

Clase 4: SQL DDL DML Consultas Simples y Multitablas. BASE DE DATOS FAC.DE INGENIERIA - UNJu Clase 4: SQL DDL DML Consultas Simples y Multitablas BASE DE DATOS FAC.DE INGENIERIA - UNJu SQL (Structured query language) Es un lenguaje de consulta estructurado, surgido de un proyecto de investigación

Más detalles

SELECT listadecampos FROM nombredetablas WHERE condicionesdebúsqueda;

SELECT listadecampos FROM nombredetablas WHERE condicionesdebúsqueda; SQL El Lenguaje de Consulta Estructurado (SQL) se usa para consultar, actualizar y administrar bases de datos relacionales, tales como las de Microsoft Access. Al crear una consulta en la ventana Consulta,

Más detalles

GUÍA DE TRABAJO N 7 GRADO 11. Ing. Néstor Raúl Suarez Perpiñan Página 1 de 6 GUIA N 7 COMANDOS MYSQL II. CREAR UNA TABLA

GUÍA DE TRABAJO N 7 GRADO 11. Ing. Néstor Raúl Suarez Perpiñan Página 1 de 6 GUIA N 7 COMANDOS MYSQL II. CREAR UNA TABLA Página 1 de 6 GUIA N 7 COMANDOS MYSQL I. CREAR, SELECCIONAR, VISUALIZAR 1. CREAR BASE DE DATOS CREATE DATABASE Nombre_Base_Datos; 2. VER LISTADO DE BASES DE DATOS SHOW DATABASES; 3. USAR UNA BASE DE DATOS

Más detalles

CC BASES DE DATOS OTOÑO 2018

CC BASES DE DATOS OTOÑO 2018 CC3201-1 BASES DE DATOS OTOÑO 2018 Clase 5: El Cálculo Relacional + SQL (I) Aidan Hogan [email protected] LA ÚLTIMA VEZ... El Álgebra Relacional Formalizando demasiadas preguntas Y marcas de vino que tienen

Más detalles

Tema 7. Elaboración de consultas básicas de selección. Lenguajes de bases de datos. SQL básico 15/12/2011

Tema 7. Elaboración de consultas básicas de selección. Lenguajes de bases de datos. SQL básico 15/12/2011 Lenguajes de bases de datos Tema 7 Elaboración de consultas básicas de selección En esta unidad se abordan cuestiones que, aunque están definidas por el estándar ANSI/ISO SQL, no están asumidas al 100%

Más detalles

CONSULTAS MULTITABLAS SQL SERVER 2005. Manual de Referencia para usuarios. Salomón Ccance CCANCE WEBSITE

CONSULTAS MULTITABLAS SQL SERVER 2005. Manual de Referencia para usuarios. Salomón Ccance CCANCE WEBSITE CONSULTAS MULTITABLAS SQL SERVER 2005 Manual de Referencia para usuarios Salomón Ccance CCANCE WEBSITE CONSULTAS MULTITABLAS Hasta ahora hemos visto consultas que obtienen los datos de una sola tabla,

Más detalles

Introducción 1 Recuperación de Datos mediante la Sentencia SQL SELECT

Introducción 1 Recuperación de Datos mediante la Sentencia SQL SELECT Introducción Objetivos I-2 Objetivos del Curso I-3 Oracle11g - 12cI-5 Oracle Database 11g - 12cI-6 Oracle Application Server 11g - 12cI-7 Oracle Enterprise Manager 11g - 12cGrid Control I-8 Sistema de

Más detalles

Bases de Datos 1. Teórico: Structured Query Language

Bases de Datos 1. Teórico: Structured Query Language Bases de Datos 1 Teórico: Structured Query Language Historia Los orígenes del SQL están ligados a los orígenes de las bases de datos relacionales Estandarizado por ANSI en 1986 (SQL-86) Hubieron varias

Más detalles

Un proyecto de IBM llamado Sistem/R construye un prototipo simple llamado SQUARE que después se transformó en SQL.

Un proyecto de IBM llamado Sistem/R construye un prototipo simple llamado SQUARE que después se transformó en SQL. CONTENIDO: 1. Lenguaje SQL 1. Componentes 2. Comandos 3. Clausulas 4. Operadores lógicos 5. Operadores de comparación 6. Funciones de agregado 2. MYSQL 1. Como entrar a MySQL 2. Comandos generales 3. Sintaxis

Más detalles

Bases de Datos: Structured Query Language (SQL)

Bases de Datos: Structured Query Language (SQL) Structured Query Language (SQL): Introducción Bases de Datos: Structured Query Language (SQL) Franco Guidi Polanco Escuela de Ingeniería Industrial Pontificia Universidad Católica de Valparaíso, Chile

Más detalles

MANUAL BÁSICO DEL LENGUAJE SQL

MANUAL BÁSICO DEL LENGUAJE SQL MANUAL BÁSICO DEL LENGUAJE SQL INTRODUCCIÓN A continuación se presentan lo que son comandos DLL y DML, las clausulas, lo operadores (lógicos y de comparación), funciones de agregado, consultas, tipos de

Más detalles

SQL (Structured Query Language)

SQL (Structured Query Language) SQL (Structured Query Language) El lenguaje de consulta estructurado o SQL (por sus siglas en inglés Structured Query Language) es un lenguaje declarativo de acceso a bases de datos relacionales que permite

Más detalles

Bases de Datos 2. Teórico

Bases de Datos 2. Teórico Bases de Datos 2 Teórico Structured Query Language (SQL) Características de SQL Standard Opera sobre conjuntos de tuplas: incluso para las operaciones de inserción, borrado y actualización. No elimina

Más detalles

Conceptos Avanzados de Bases de datos

Conceptos Avanzados de Bases de datos Página 1 Conceptos Avanzados de Bases de datos (1) Introducción a las Bases de Datos (2) Lenguaje Estándar de Consultas SQL Definición formal SQL Página 2 Es un conjunto exhaustivo (en su modelización

Más detalles

TEMA 6: LENGUAJE DE DEFINICIÓN DE DATOS (LDD)

TEMA 6: LENGUAJE DE DEFINICIÓN DE DATOS (LDD) TEMA 6: LENGUAJE DE DEFINICIÓN DE DATOS (LDD 6.1 Introducción Hasta ahora hemos estudiado las sentencias que forman parte del DML (Data Management Language lenguaje de manipulación de datos, todas esas

Más detalles

APÉNDICE D. INTRODUCCIÓN A SQL

APÉNDICE D. INTRODUCCIÓN A SQL APÉNDICE D. INTRODUCCIÓN A SQL D.1 INTRODUCCIÓN. CONCEPTOS PREVIOS D.1.1 Base de Datos Relacional Conjunto de Datos que el usuario percibe como una colección de tablas. La visión tabular de los datos es

Más detalles

Conceptos Avanzados de Programación en Internet

Conceptos Avanzados de Programación en Internet Página 1 Conceptos Avanzados de Programación en Internet (1) Introducción a las Bases de Datos (2) Lenguaje Estándar de Consultas SQL Página 2 Lenguaje SQL. Introducción BD Justificación de las Bases de

Más detalles

RESUMEN SQL. Tipo de coincidencia Modelo Planteado Coincide No coincide. Varios caracteres 'ab*' 'abcdefg', 'abc' 'cab', 'aab'

RESUMEN SQL. Tipo de coincidencia Modelo Planteado Coincide No coincide. Varios caracteres 'ab*' 'abcdefg', 'abc' 'cab', 'aab' RESUMEN SQL Agustina Botas May COMO SE ESCRIBE UNA CONSULTA SELECT : campos WHERE : criterios que se aplican directamente a los datos (aplica a TODOS los registros) GROUP BY: agrupación de los datos seleccionados

Más detalles

SQL, Consultas. Son Importantes las Consultas? Cuál es el Resultado de SELECT? Andrés Moreno S.

SQL, Consultas. Son Importantes las Consultas? Cuál es el Resultado de SELECT? Andrés Moreno S. SQL, Consultas Andrés Moreno S. 1 Son Importantes las Consultas? Una cosa es guardar la información en forma estructurada y ordenada. Pero el utilizar la información y entender su relevancia son la clave

Más detalles

Tablas -SQL Curso Bases de Datos. Por Elizabeth León Guzmán, Ph.D. Profesora Ingeniería de Sistemas Grupo de Investigación MIDAS

Tablas -SQL Curso Bases de Datos. Por Elizabeth León Guzmán, Ph.D. Profesora Ingeniería de Sistemas Grupo de Investigación MIDAS Tablas -SQL Curso Bases de Datos Por Elizabeth León Guzmán, Ph.D. Profesora Ingeniería de Sistemas Grupo de Investigación MIDAS SQL (Structured Query Language) SQL lenguaje usado para definir, manipular,

Más detalles

álgebra relacional 2

álgebra relacional 2 16/04/2012 1 La división es un operador "extraño" dentro del álgebra relacional por su especificidad. Suponemos que su inclusión en AR tiene que ver con el "para todos" ( x F) del cálculo relacional puesto

Más detalles

FUNDAMENTOS ORACLE 12C

FUNDAMENTOS ORACLE 12C FUNDAMENTOS ORACLE 12C Introducción a Oracle Fundamentos 12c Aprende a programar en SQL con la base de datos más poderosa del mercado. Diseña y modela bases de datos corporativas utilizando las herramientas

Más detalles

SELECT SELECT WHERE WHERE GROUP BY

SELECT SELECT WHERE WHERE GROUP BY [,,...] * FROM [alias_tabla_1][, [alias_tabla_2],... [alias_tabla_n]] [] [GROUP BY [HAVING]]

Más detalles

Manual Práctico de SQL. ORIENTADO A SQL 7.0 Preparado por: Alvaro E. García

Manual Práctico de SQL. ORIENTADO A SQL 7.0 Preparado por: Alvaro E. García ORIENTADO A SQL 7.0 Preparado por: Alvaro E. García [email protected] ÍNDICE INTRODUCCIÓN 3 PASOS PARA IMPLEMENTAR UNA BD 5 CREAR UNA BD 6 SENTENCIA CREATE 8 LIGADURAS 9 ELIMINACIÓN DE TABLAS 14 SENTENCIA

Más detalles

Base de Datos. Docente: Ing. Francisco Rodríguez BASE DATOS. Resultados. Internet. Requerimientos

Base de Datos. Docente: Ing. Francisco Rodríguez BASE DATOS. Resultados. Internet. Requerimientos UNIVERSIDAD NACIONAL DE TRUJILLO ESCUELA DE ING. INDUSTRIAL Base de Datos Resultados Internet Requerimientos BASE DATOS Docente: Ing. Francisco Rodríguez Base de Datos Tema 6: El Lenguaje Estándar SQL

Más detalles

Uso de sentencias para el envió y extracción de datos

Uso de sentencias para el envió y extracción de datos Base de datos I Uso de sentencias para el envió y extracción de datos Objetivos: Identificar la sintaxis de las consultas de datos Elaborar sentencias de manejo de datos. INTRODUCCION: Las sentencias más

Más detalles

Create Database ClaseAutos. Use ClaseAutos

Create Database ClaseAutos. Use ClaseAutos Vamos a Crear el siguiente modelo, en una base de Datos llamada ClaseAutos. Comando para Crear la Base de Datos Create Database ClaseAutos Comando para utilizar la Base de Datos Use ClaseAutos vehiculo

Más detalles

SQL SERVER SQL Server 2005 permite tres tipos de operaciones con conjuntos: UNION, disponible en todas las versiones de SQL Server.

SQL SERVER SQL Server 2005 permite tres tipos de operaciones con conjuntos: UNION, disponible en todas las versiones de SQL Server. SQL SERVER 2005 Operaciones con Conjuntos SQL Server 2005 permite tres tipos de operaciones con conjuntos: UNION, disponible en todas las versiones de SQL Server. EXCEPT, nuevo en SQL Server 2005. INTERSECT,

Más detalles

SQL: Lenguaje de Interrogación Estructurado

SQL: Lenguaje de Interrogación Estructurado SQL: Lenguaje de Interrogación Estructurado SQL Es el lenguaje para Bases de Datos Relacionales más usado Es un lenguaje declarativo: QUÉ no CÓMO El núcleo fundamental se basa en el Algebra Relacional,

Más detalles

1.- CREACIÓN DE CONSULTAS.

1.- CREACIÓN DE CONSULTAS. 1.- CREACIÓN DE CONSULTAS. Una consulta permite efectuar preguntas acerca de la información almacenada en las tablas. En una consulta se pueden obtener datos de una tabla e incluso de varias tablas, por

Más detalles

Tutorial MySql - 1 -

Tutorial MySql - 1 - Tutorial MySql - 1 - Índice 1 - Introducción...4 2 - show databases...5 3 - Creación de una tabla y mostrar sus campos (create table - show tables - describe - drop table)...6 4 - Carga de registros a

Más detalles

Modelamiento y Gestión de Base de Datos

Modelamiento y Gestión de Base de Datos Modelamiento y Gestión de Base de Datos Uso de sentencias para el envió y extracción de datos Objetivos: Identificar la sintaxis de las consultas de datos Elaborar sentencias de manejo de datos. INTRODUCCION:

Más detalles

A.1. Definiciones de datos en SQL

A.1. Definiciones de datos en SQL A.1. Definiciones de datos en SQL Las Sentencias del lenguaje de definición de datos (DDL) que posee SQL operan en base a tablas. Las Principales sentencias DDL son las siguientes: CREATE TABLE DROP TABLE

Más detalles

Oracle Fundamentos. Programa de Estudio.

Oracle Fundamentos. Programa de Estudio. Oracle Fundamentos Programa de Estudio Oracle Fundamentos Aprende a programar en SQL con la base de datos más poderosa del mercado. Diseña y modela bases de datos corporativas utilizando las herramientas

Más detalles

Oracle Fundamentos. Programa de Estudio.

Oracle Fundamentos. Programa de Estudio. Oracle Fundamentos Programa de Estudio Oracle Fundamentos Aprende a programar en SQL con la base de datos más poderosa del mercado. Diseña y modela bases de datos corporativas utilizando las herramientas

Más detalles

ÍNDICE. Introducción... Capítulo 1. Características, instalación, inicio y entorno de trabajo... 1

ÍNDICE. Introducción... Capítulo 1. Características, instalación, inicio y entorno de trabajo... 1 ÍNDICE Introducción... XI Capítulo 1. Características, instalación, inicio y entorno de trabajo... 1 Características y novedades de Access 2010... 1 Comienzo rápido del trabajo y seguimiento de la información...

Más detalles

Características del lenguaje SQL

Características del lenguaje SQL Lenguaje SQL Características del lenguaje SQL Es el lenguaje estándar para realizar operaciones en bases de datos relacionales. Instrucciones: SELECT Consulta. Su implementación está basada en álgebra

Más detalles

1 2 3 ( /! 3 ) +, 1& 3 0))) % &! ( ) +,. / & 0)))

1 2 3 ( /! 3 ) +, 1& 3 0))) % &! ( ) +,. / & 0))) ! !! # ! 1 2 3 ( 1 2 3. /! 3 ) +, 1& 3 0))) % &! ( ) +,. / & 0))) 4 2 5! 4 /! 4 # 2 / # %! # ( # %! #!! # %! #! )! & ,,, #./ 0 + . 4 # 4. 0! 2! ) 3! 1 ,! 2 % % 7 0! 2 % &! ) 3! 56 %&! #! 55 ( ) 58 ( )

Más detalles

RESUMEN DEL LENGUAJE SQL

RESUMEN DEL LENGUAJE SQL RESUMEN DEL LENGUAJE SQL AUTORÍA JOSEFA PÉREZ DOMINGUEZ TEMÁTICA INFORMATICA ETAPA CICLO FORMATIVO DE GRADO SUPERIOR Y MEDIO DE INFORMATICA Resumen Con esta publicación muestra un resumen de la sintaxis

Más detalles

CC BASES DE DATOS PRIMAVERA Clase 7: SQL (II) Aidan Hogan

CC BASES DE DATOS PRIMAVERA Clase 7: SQL (II) Aidan Hogan CC3201-1 BASES DE DATOS PRIMAVERA 2016 Clase 7: SQL (II) Aidan Hogan [email protected] El Cálculo Relacional (de tuplas) Fórmulas atómicas: Una fórmula puede ser Una fórmula atómica o Sean (recursivamente)

Más detalles

Modelamiento y Diseño de Base de Datos

Modelamiento y Diseño de Base de Datos Modelamiento y Diseño de Base de Datos Sub consultas y vistas Objetivos: Elaborar sub consultas, a partir de una consulta. Generar diferentes vistas a partir de las tablas de una base de datos. Introducción

Más detalles

Bases de Datos Relacionales con Base de OpenOffice y consultas SQL para Tecnología de la Información.

Bases de Datos Relacionales con Base de OpenOffice y consultas SQL para Tecnología de la Información. Bases de Datos Relacionales con Base de OpenOffice y consultas SQL para Tecnología de la Información. 1 Introducción Como ya sabes las bases de datos (BD) son la mejor forma de almacenar y trabajar con

Más detalles

LENGUAJE DE MANIPULACIÓN DE DATOS (DML) CONSULTA DE DATOS

LENGUAJE DE MANIPULACIÓN DE DATOS (DML) CONSULTA DE DATOS PREVIO 5 LENGUAJE DE MANIPULACIÓN DE DATOS (DML) CONSULTA DE DATOS INTRODUCCIÓN SQL permite realizar consultas con condiciones de búsqueda, de tal forma que los resultados son precisamente aquellos que

Más detalles

SQL (Structured query language)

SQL (Structured query language) SQL (Structured query language) - Disponible en www.ecured.cu/index.php/sql - Bibliografía:.Principios de Bases de Datos. Serrano, Sara Lana, Madrid E.U.I.T de Telecomunicación..Gestión de Bases de Datos.

Más detalles

Unidad III: Lenguaje de manipulación de datos (DML) 3.1 Inserción, eliminación y modificación de registros

Unidad III: Lenguaje de manipulación de datos (DML) 3.1 Inserción, eliminación y modificación de registros Unidad III: Lenguaje de manipulación de datos (DML) 3.1 Inserción, eliminación y modificación de registros La sentencia INSERT permite agregar nuevas filas de datos a las tablas existentes. Está sentencia

Más detalles

Introducción a SQL (DDL)

Introducción a SQL (DDL) Introducción a SQL (DDL) Grupo de Ingeniería del Software y Bases de Datos Departamento de Lenguajes y Sistemas Informáticos Universidad de Sevilla noviembre 2012 Introducción a SQL Objetivos de este tema

Más detalles

Uso de SQL. "WHERE id = " + cuentas[i].getid() o bien ResulSet r =s.executequery("select nombre FROM alumno" + "WHERE id = " + cuentas[i].

Uso de SQL. WHERE id =  + cuentas[i].getid() o bien ResulSet r =s.executequery(select nombre FROM alumno + WHERE id =  + cuentas[i]. Introducción El lenguaje (Structured Query Language) es el lenguaje estándar para trabajo con bases de datos relacionales. Permite la definición, acceso y control de datos en una base de datos relacional.

Más detalles

Capítulo 4. Realización de consultas

Capítulo 4. Realización de consultas Capítulo 4 Realización de consultas ÍNDICE CAPÍTULO 4 Introducción sentencia SELECT Base de datos de ejemplo Consultas básicas Cláusula ORDER BY Cláusula DISTINCT Cláusula LIMIT Expresiones Funciones propias

Más detalles

Bases de Datos SQL 1 SQL. Jorge Pérez R. Universidad de Talca, II Semestre 2006

Bases de Datos SQL 1 SQL. Jorge Pérez R. Universidad de Talca, II Semestre 2006 Bases de Datos SQL 1 SQL Jorge Pérez R. Universidad de Talca, II Semestre 2006 Bases de Datos SQL 2 Structured Query Language Lenguaje de consulta para bases de datos comerciales. Originalmente llamado

Más detalles

Tema 4. DML (Parte I)

Tema 4. DML (Parte I) Tema 4 DML (Parte I) IES Francisco Romero Vargas Departamento de Informática Tema 4. DML (I). Página 1 de 9 1. Introducción Un Lenguaje de Manipulación de Datos (Data Manipulation Language, DML) es un

Más detalles

Manejo de Tablas y Llaves Foráneas

Manejo de Tablas y Llaves Foráneas Manejo de Tablas y Llaves Foráneas Llaves Foráneas Para manejar las llaves foráneas, deben crearse al menos dos tablas, la primera tal y como se ha hecho anteriormente CREATE TABLE nombre_tabla ( nombre_columna_1

Más detalles

1. DML. Las subconsultas

1. DML. Las subconsultas 1.1 Introducción 1. DML. Las subconsultas Una subconsulta es una consulta que aparece dentro de otra consulta o subconsulta en la lista de selección, en la cláusula WHERE o HAVING, originalmente no se

Más detalles

SQL DML Select. Ges$ón y Modelación de Datos. María Constanza Pabón

SQL DML Select. Ges$ón y Modelación de Datos. María Constanza Pabón SQL DML Select Ges$ón y Modelación de Datos María Constanza Pabón [email protected] SQL - DML Sentencias: INSERT UPDATE DELETE SELECT SQL - DML Query (consulta): proceso de recuperar datos de

Más detalles

Prácticas EDAT Curso 12/13

Prácticas EDAT Curso 12/13 Prácticas EDAT Curso 12/13 Alejandro Bellogín Escuela Politécnica Superior Universidad Autónoma de Madrid Septiembre 2012 http://www.eps.uam.es/~abellogin Esquema Parte I Contacto Organización de las prácticas

Más detalles

SQL. Dra. Amparo López Gaona () Posgrado en Ciencia e Ingeniería de la Compu. Abril 2012 / 14

SQL. Dra. Amparo López Gaona () Posgrado en Ciencia e Ingeniería de la Compu. Abril 2012 / 14 Dra. Amparo López Gaona tación, UNAM Abril 2012 Introducción El lenguaje (Structured Query Language) es el lenguaje estándar para trabajo con bases de datos relacionales. Permite la definición, acceso

Más detalles

Bases de Datos Relacionales y SQL: Una Introducción

Bases de Datos Relacionales y SQL: Una Introducción 1 Bases de Datos Relacionales y SQL: Una Introducción Protein Design Group, CNB CSIC 2 Sumario Qué es un SGBDR? Usuarios de base de datos Tablas: creación y definición de restricciones Manipulación de

Más detalles

SQL SERVER Curso Teórico-Práctico

SQL SERVER Curso Teórico-Práctico SQL SERVER 2008-2012 Curso Teórico-Práctico IMPLEMENTACION DE LA BASE DE DATOS Nomenclatura Todas las tablas tendrán: - Un identificador de tipo entero auto numérico. Ésta será la clave primaria. La denominamos

Más detalles

Unidad 5. Lenguaje Estructurado de Consultas SQL

Unidad 5. Lenguaje Estructurado de Consultas SQL Unidad 5 Lenguaje Estructurado de Consultas SQL Introducción y Origen SQL El lenguaje de consulta estructurado o SQL (por sus siglas en inglés Structured Query Language) es un lenguaje declarativo para

Más detalles

Diseña y Administra Bases de Datos Guía de Estudio

Diseña y Administra Bases de Datos Guía de Estudio Diseña y Administra Bases de Datos Guía de Estudio Responde las preguntas que se te plantean Ordena los siguientes códigos: A. and edad=18 C. from clientes D. Select E. nombre, edad

Más detalles

Bases de datos: Lenguaje de consultas SQL

Bases de datos: Lenguaje de consultas SQL Bases de datos: Lenguaje de consultas SQL EMPEZAR LA CASA POR EL TEJADO Del código máquina a los lenguajes de alto nivel. Img 0. Del código máquina al lenguaje de alto nivel. Creación propia. De los sistemas

Más detalles