You are on page 1of 38

Para ver una copia completa de la licencia, acudir a la direccin http://creativecommons.org/licenses/by-nc-sa/2.5/es/legalcode.

es

(3)

(4) Lenguaje SQL (I) Consultas


esquema de la unidad
(4.1) consultas de datos con SQL. DQL ________________________________________________________________ 6
(4.1.1) capacidades (4.1.2) sintaxis sencilla del comando SELECT (4.2.1) aritmticos (4.2.2) concatenacin de textos 6 6 7 7

(4.2) clculos _______________________________________________________________________________________ 7 (4.3) condiciones ____________________________________________________________________________________ 8


(4.3.1) operadores de comparacin (4.3.2) valores lgicos (4.3.3) BETWEEN (4.3.4) IN (4.3.5) LIKE (4.3.6) IS NULL (4.3.7) precedencia de operadores 8 9 9 10 10 10 11

(4.4) ordenacin ____________________________________________________________________________________ 11 (4.5) funciones _____________________________________________________________________________________ 12


(4.5.1) funciones (4.5.2) funciones numricas (4.5.3) funciones de caracteres (4.5.4) funciones de trabajo con nulos (4.5.5) funciones de fecha y manejo de fechas (4.5.6) funciones de conversin (4.5.7) funcin DECODE 12 13 14 16 17 19 22

(4.6) obtener datos de mltiples tablas ______________________________________________________________ 23


(4.6.1) producto cruzado o cartesiano de tablas (4.6.2) asociando tablas (4.6.3) relaciones sin igualdad (4.6.4) sintaxis SQL 1999 (4.7.1) funciones de clculo con grupos (4.7.2) condiciones HAVING 23 23 24 25

(4.7) agrupaciones _________________________________________________________________________________ 27 (4.8) subconsultas __________________________________________________________________________________ 30 (4.9) combinaciones especiales ______________________________________________________________________ 33
(4.9.1) uniones (4.9.2) intersecciones (4.9.3) diferencia 33 33 33 (4.8.1) uso de subconsultas simples (4.8.2) uso de subconsultas de mltiples filas 30 32 28 29

(4.10) DQL en instrucciones DML ____________________________________________________________________ 34


(4.10.1) relleno de registros a partir de filas de una consulta (4.10.2) subconsultas en la instruccin UPDATE (4.10.3) subconsultas en la instruccin DELETE (4.11.1) introduccin (4.11.2) creacin de vistas (4.11.3) mostrar la lista de vistas (4.11.4) borrar vistas 34 35 35

(4.11) vistas ________________________________________________________________________________________ 36


36 36 37 38

(5)

sistemas gestores de bases de datos


(Unidad 4) lenguaje SQL (II). Consultas

(4.1) consultas de datos con SQL. DQL


(4.1.1) capacidades
DQL es la abreviatura del Data Query Language (lenguaje de consulta de datos) de SQL. El nico comando que pertenece a este lenguaje es el verstil comando SELECT Este comando permite:

Obtener datos de ciertas columnas de una tabla (proyeccin) Obtener registros (filas) de una tabla de acuerdo con ciertos criterios
(seleccin)

Mezclar datos de tablas diferentes (asociacin, join) Realizar clculos sobre los datos Agrupar datos

(4.1.2) sintaxis sencilla del comando SELECT


SELECT * | {[DISTINCT] columna | expresin [[AS] alias], ...} FROM tabla; Donde:

*. El asterisco significa que se seleccionan todas las columnas DISTINCT. Hace que no se muestren los valores duplicados. columna. Es el nombre de una columna de la tabla que se desea mostrar expresin. Una expresin vlida SQL alias. Es un nombre que se le da a la cabecera de la columna en el resultado de esta instruccin.

Ejemplos: /* Seleccin de todos los registros de la tabla clientes */ SELECT * FROM Clientes; /* Seleccin de algunos campos*/ SELECT nombre, apellido1, apellido2 FROM Clientes;

(6)

2 curso de administracin de sistemas informticos autor: Jorge Snchez www.jorgesanchez.net

(4.2) clculos
(4.2.1) aritmticos
Los operadores + (suma), - (resta), * (multiplicacin) y / (divisin), se pueden utilizar para hacer clculos en las consultas. Cuando se utilizan como expresin en una consulta SELECT, no modifican los datos originales sino que como resultado de la vista generada por SELECT, aparece un nueva columna. Ejemplo: SELECT nombre, precio,precio*1.16 FROM articulos; Esa consulta obtiene tres columnas. La tercera tendr como nombre la expresin utilizada, para poner un alias basta utilizar dicho alias tras la expresin: SELECT nombre, precio, precio*1.16 AS precio_con_iva FROM articulos; La prioridad de esos operadores es la normal: tienen ms prioridad la multiplicacin y divisin, despus la suma y la resta. En caso de igualdad de prioridad, se realiza primero la operacin que est ms a la izquierda. Como es lgico se puede evitar cumplir esa prioridad usando parntesis; el interior de los parntesis es lo que se ejecuta primero. Cuando una expresin aritmtica se calcula sobre valores NULL, el resultado es el propio valor NULL. Se puede utilizar cualquiera de los operadores aritmticos: suma (+), resta (), multiplicacin (*), divisin (/). Como es habitual, la multiplicacin y la divisin tienen preferencia sobre la suma y la resta en el orden de ejecucin de la instruccin; dicho orden se puede alterar mediante el uso de los parntesis.

(4.2.2) concatenacin de textos


Todas las bases de datos incluyen algn operador para encadenar textos. En SQLSERVER es el signo + en Oracle son los signos ||. Ejemplo (Oracle): SELECT tipo, modelo, tipo || '-' || modelo "Clave Pieza" FROM piezas;

(7)

sistemas gestores de bases de datos


(Unidad 4) lenguaje SQL (II). Consultas

El resultado sera:
TIPO AR AR AR AR AR AR AR AR BI BI BI BI MODELO 6 7 8 9 12 15 20 21 10 20 22 24 Clave Pieza AR-6 AR-7 AR-8 AR-9 AR-12 AR-15 AR-20 AR-21 BI-10 BI-20 BI-22 BI-24

En la mayora de bases de datos, la funcin CONCAT (se describe ms adelante) realiza la misma funcin.

(4.3) condiciones
Se pueden realizar consultas que restrinjan los datos de salida de las tablas. Para ello se utiliza la clusula WHERE. Esta clusula permite colocar una condicin que han de cumplir todos los registros, los que no la cumplan no aparecen en el resultado. Ejemplo: SELECT Tipo, Modelo FROM Pieza WHERE Precio>3;

(4.3.1) operadores de comparacin


Se pueden utilizar en la clusula WHERE, son:
Operador > < >= <= Mayor que Menor que Mayor o igual que Menor o igual que Significado

(8)

2 curso de administracin de sistemas informticos autor: Jorge Snchez www.jorgesanchez.net

Operador = <> != Igual Distinto Distinto

Significado

Se pueden utilizar tanto para comparar nmeros como para comparar textos y fechas. En el caso de los textos, las comparaciones se hacen en orden alfabtico. Slo que es un orden alfabtico estricto. Es decir el orden de los caracteres en la tabla de cdigos. En muchas bases de datos hay problemas con la y otros smbolos nacionales (en especial al ordenar o comparar con el signo de mayor o menor, ya que la el orden ASCII no respeta el orden de cada alfabeto nacional). No obstante es un problema que tiende a arreglarse en la actualidad en todos los SGBD (en Oracle no existe problema alguno) especialmente si son compatibles con Unicode.

(4.3.2) valores lgicos


Son:
Operador AND Significado Devuelve verdadero si las expresiones a su izquierda y derecha son ambas verdaderas Devuelve verdadero si cualquiera de las dos expresiones a izquierda y derecha del OR, son verdaderas Invierte la lgica de la expresin que est a su derecha. Si era verdadera, mediante NOT pasa a ser falso.

OR

NOT

Ejemplos: /* Obtiene a las personas de entre 25 y 50 aos*/ SELECT nombre, apellido1,apellido2 FROM personas WHERE edad>=25 AND edad<=50; /*Obtiene a la gente de ms de 60 aos o de menos de 20*/ SELECT nombre, apellido1,apellido2 FROM personas WHERE edad>60 OR edad<20; /*Obtiene a la gente de con primer apellido entre la A y la O */ SELECT nombre,apellido1,apellido2 FROM personas WHERE apellido1>A AND apellido2<Z;

(4.3.3) BETWEEN
El operador BETWEEN nos permite obtener datos que se encuentren en un rango. Uso: (9)

sistemas gestores de bases de datos


(Unidad 4) lenguaje SQL (II). Consultas

SELECT tipo,modelo,precio FROM piezas WHERE precio BETWEEN 3 AND 8; Saca piezas cuyos precios estn entre 3 y 8 (ambos incluidos).

(4.3.4) IN
Permite obtener registros cuyos valores estn en una lista de valores: SELECT tipo,modelo,precio FROM piezas WHERE precio IN (3,5, 8); Obtiene piezas cuyos precios sean 3, 5 u 8 (no valen ni el precio 4 ni el 6, por ejemplo).

(4.3.5) LIKE
Se usa sobre todo con textos, permite obtener registros cuyo valor en un campo cumpla una condicin textual. LIKE utiliza una cadena que puede contener estos smbolos:
Smbolo % _ Significado Una serie cualquiera de caracteres Un carcter cualquiera

Ejemplos: /* Selecciona nombres que empiecen por S */ SELECT nombre FROM personas WHERE nombre LIKE 'S%'; /*Selecciona las personas cuyo apellido sea Sanchez, Senchez, Stnchez,...*/ SELECT apellido1 FROM Personas WHERE apellido1 LIKE 'S_nchez';

(4.3.6) IS NULL
Devuelve verdadero si el valor que examina es nulo: SELECT nombre,apellidos FROM personas WHERE telefono IS NULL Esa instruccin selecciona a la gente que no tiene telfono. Se puede usar la expresin IS NOT NULL que devuelve verdadero en el caso contrario, cuando la expresin no es nula.

(10)

2 curso de administracin de sistemas informticos autor: Jorge Snchez www.jorgesanchez.net

(4.3.7) precedencia de operadores


A veces las expresiones que se producen en los SELECT son muy extensas y es difcil saber que parte de la expresin se evala primero, por ello se indica la siguiente tabla de precedencia (tomada de Oracle):
Orden de precedencia 1 2 3 4 5 6 7 8 Operador *(Multiplicar) / (dividir) + (Suma) - (Resta) || (Concatenacin)

Comparaciones (>, <, !=, ...)


IS [NOT] NULL, [NOT ]LIKE, IN NOT AND OR

(4.4) ordenacin
El orden inicial de los registros obtenidos por un SELECT no guarda ms que una relacin respecto al orden en el que fueron introducidos. Para ordenar en base a criterios ms interesantes, se utiliza la clusula ORDER BY. En esa clusula se coloca una lista de campos que indica la forma de ordenar. Se ordena primero por el primer campo de la lista, si hay coincidencias por el segundo, si ah tambin las hay por el tercero, y as sucesivamente. Se puede colocar las palabras ASC O DESC (por defecto se toma ASC). Esas palabras significan en ascendente (de la A a la Z, de los nmeros pequeos a los grandes) o en descendente (de la Z a la a, de los nmeros grandes a los pequeos) respectivamente. Sintaxis completa de SELECT (para una sola tabla): SELECT {* | [DISTINCT] {columna | expresin} [[AS] alias], ... } FROM tabla [WHERE condicin] [ORDER BY expresin1 [,expresin2,][{ASC|DESC}]];

(11)

sistemas gestores de bases de datos


(Unidad 4) lenguaje SQL (II). Consultas

(4.5) funciones
(4.5.1) funciones
Todos los SGBD implementan funciones para facilitar la creacin de consultas complejas. Esas funciones dependen del SGBD que utilicemos, las que aqu se comentan son algunas de las que se utilizan con Oracle. Todas las funciones devuelven un resultado que procede de un determinado clculo. La mayora de funciones precisan que se les enve datos de entrada (parmetros o argumentos) que son necesarios para realizar el clculo de la funcin. Este resultado, lgicamente depende de los parmetros enviados. Dichos parmetros se pasan entre parntesis. De tal manera que la forma de invocar a una funcin es: nombreFuncin[(parmetro1[, parmetro2,...])] Si una funcin no precisa parmetros (como SYSDATE) no hace falta colocar los parntesis. En realidad hay dos tipos de funciones:

Funciones que operan con datos de la misma fila Funciones que operan con datos de varias filas diferentes (funciones de
agrupacin). En este apartado se tratan las funciones del primer tipo (ms adelante se comentan las de agrupacin). Nota: tabla DUAL (Oracle) Oracle proporciona una tabla llamada dual con la que se permiten hacer pruebas. Esa tabla tiene un solo campo (llamado DUMMY) y una sola fila de modo que es posible hacer pruebas. Por ejemplo la consulta: SELECT SQRT(5) FROM DUAL; Muestra una tabla con el contenido de ese clculo (la raz cuadrada de 5). DUAL es una tabla interesante para hacer pruebas. En los siguientes apartados se describen algunas de las funciones ms interesantes, las ms importantes son las remarcadas con un fondo naranja ms intenso.

(12)

2 curso de administracin de sistemas informticos autor: Jorge Snchez www.jorgesanchez.net

(4.5.2) funciones numricas


redondeos
Funcin ROUND(n,decimales) Descripcin Redondea el nmero al siguiente nmero con el nmero de decimales indicado ms cercano. ROUND(8.239,2) devuelve 8.3 Los decimales del nmero se cortan para que slo aparezca el nmero de decimales indicado

TRUNC(n,decimales)

matemticas
Funcin MOD(n1,n2) POWER(valor,exponente) SQRT(n) SIGN(n) ABS(n) EXP(n) LN(n) LOG(n) SIN(n) COS(n) TAN(n) ACOS(n) ASIN(n) ATAN(n) SINH(n) COSH(n) TANH(n) Descripcin Devuelve el resto resultado de dividir n1 entre n2 Eleva el valor al exponente indicado Calcula la raz cuadrada de n Devuelve 1 si n es positivo, cero si vale cero y -1 si es negativo Calcula el valor absoluto de n Calcula en, es decir el exponente en base e del nmero n Logaritmo neperiano de n Logaritmo en base 10 de n Calcula el seno de n (n tiene que estar en radianes) Calcula el coseno de n (n tiene que estar en radianes) Calcula la tangente de n (n tiene que estar en radianes) Devuelve en radianes el arco coseno de n Devuelve en radianes el arco seno de n Devuelve en radianes el arco tangente de n Devuelve el seno hiperblico de n Devuelve el coseno hiperblico de n Devuelve la tangente hiperblica de n

(13)

sistemas gestores de bases de datos


(Unidad 4) lenguaje SQL (II). Consultas

(4.5.3) funciones de caracteres


conversin del texto a maysculas y minsculas Son:
Funcin LOWER(texto) UPPER(texto) INITCAP(texto) Descripcin Convierte el texto a minsculas (funciona con los caracteres espaoles) Convierte el texto a maysculas Coloca la primera letra de cada palabra en maysculas

funciones de transformacin
Funcin RTRIM(texto) LTRIM(texto) TRIM(texto) Descripcin Elimina los espaciosa la derecha del texto Elimina los espacios a la izquierda que posea el texto Elimina los espacios en blanco a la izquierda y la derecha del texto y los espacios dobles del interior. Elimina del texto los caracteres indicados. Por ejemplo TRIM('h' FROM nombre) elimina las haches de la columna nombre que estn a la izquierda y a la derecha Obtiene los m siguientes caracteres del texto a partir de la posicin n (si m no se indica se cogen desde n hasta el final). Obtiene el tamao del texto Obtiene la posicin en la que se encuentra el texto buscado en el texto inicial. Se puede empezar a buscar a partir de una posicin inicial concreta e incluso indicar el nmero de aparicin del texto buscado. Ejemplo, si buscamos la letra a y ponemos 2 en nAparicin, devuelve la posicin de la segunda letra a del texto). Si no lo encuentra devuelve 0

TRIM(caracteres FROM texto)

SUBSTR(texto,n[,m])

LENGTH(texto) INSTR(texto, textoBuscado [,posInicial [, nAparicin]])

(14)

2 curso de administracin de sistemas informticos autor: Jorge Snchez www.jorgesanchez.net

Funcin REPLACE(texto, textoABuscar, [textoReemplazo])

Descripcin Buscar el texto a buscar en un determinado texto y lo cambia por el indicado como texto de reemplazo. Si no se indica texto de reemplazo, entonces est funcin elimina el texto a buscar

TRANSLATE(texto, caracteresACambiar, caracteresSustitutivos)

Potentsima funcin que permite transformar caracteres. Los caracteresACambiar son los caracteres que se van a cambiar, los caracteresSustitutivos son los caracteres que reemplazan a los anteriores. De tal modo que el primer carcter a cambiar se cambia por el primer carcter sustitutivo, el segundo por el segundo y as sucesivamente. Ejemplo: SELECT TRANSLATE(prueba,ue,wx) FROM DUAL; El resultado sera el texto prwxba, de tal forma que la u se cambia por la w y la e por la x. Si la segunda cadena es ms corta, los caracteres de la primera que no encuentran sustituto, se eliminan. Ejemplo: SELECT TRANSLATE(prueba,ue,w) FROM DUAL; Da como resultado prwba

LPAD(texto, anchuraMxima, [caracterDeRelleno]) RPAD(texto, anchuraMxima, [caracterDeRelleno])

Rellena el texto a la izquierda (LPAD) o a la derecha (RPAD) con el carcter indicado para ocupar la anchura indicada. Si el texto es ms grande que la anchura indicada, el texto se recorta. Si no se indica carcter de relleno se rellenar el espacio marcado con espacios en blanco. Ejemplo: LPAD(Hola,10,-) da como resultado ------Hola

REVERSE(texto)

Invierte el texto (le da la vuelta)

(15)

sistemas gestores de bases de datos


(Unidad 4) lenguaje SQL (II). Consultas

otras funciones de caracteres


Funcin ASCII(carcter) CHR(nmero) SOUNDEX(texto) Descripcin Devuelve el cdigo ASCII del carcter indicado Devuelve el carcter correspondiente al cdigo ASCII indicado Devuelve el valor fontico del texto. Es una funcin muy interesante para buscar textos de los que se no se sabe con exactitud su escritura. Por ejemplo: SELECT * FROM personas WHERE SOUNDEX(apellido1)=SOUNDEX(Smith) En el ejemplo se busca a las personas cuyo primer apellido suena como Smith

(4.5.4) funciones de trabajo con nulos


Permiten definir valores a utilizar en el caso de que las expresiones tomen el valor nulo.
Funcin NVL(valor,sustituto) NVL2(valor,sustituto1, sustituto2) Descripcin Si el valor es NULL, devuelve el valor sustituto; de otro modo, devuelve valor Variante de la anterior, devuelve el valor sustituto1 si valor no es nulo. Si valor es nulo devuelve el sustituto2

(16)

2 curso de administracin de sistemas informticos autor: Jorge Snchez www.jorgesanchez.net

Funcin COALESCE(listaExpresiones)

Descripcin Devuelve la primera de las expresiones que no es nula. Ejemplo1: CREATE TABLE test ( col1 VARCHAR2(1), col2 VARCHAR2(1), col3 VARCHAR2(1)); INSERT INTO INSERT INTO INSERT INTO INSERT INTO test VALUES test VALUES test VALUES test VALUES (NULL, 'B', 'C'); ('A', NULL, 'C'); (NULL, NULL, 'C'); ('A', 'B', 'C');

SELECT COALESCE(col1, col2, col3) FROM test; El resultado es: B A C A NULLIF(valor1,valor2) Devuelve nulo si valor1 es igual a valor2. De otro modo devuelve valor1

(4.5.5) funciones de fecha y manejo de fechas e intervalos


Las fechas se utilizan muchsimo en todas las bases de datos. Oracle proporciona dos tipos de datos para manejar fechas, los tipos DATE y TIMESTAMP. En el primer caso se almacena una fecha concreta (que incluso puede contener la hora), en el segundo caso se almacena un instante de tiempo ms concreto que puede incluir incluso fracciones de segundo. Hay que tener en cuenta que a los valores de tipo fecha se les pueden sumar nmeros y se entendera que esta suma es de das. Si tiene decimales entonces se suman das, horas, minutos y segundos. La diferencia entre dos fechas tambin obtiene un nmero de das. intervalos Los intervalos son datos relacionados con las fechas en s, pero que no son fechas. Hay dos tipos de intervalos el INTERVAL DAY TO SECOND que sirve para representar das, horas, minutos y segundos; y el INTERVAL YEAR TO MONTH que representa aos y meses.

Ejemplo tomado de http://www.psoug.org/reference/string_func.html

(17)

sistemas gestores de bases de datos


(Unidad 4) lenguaje SQL (II). Consultas

Para los intervalos de ao a mes los valores se pueden indicar de estas formas: /* 123 aos y seis meses */ INTERVAL '123-6' YEAR(4) TO MONTH /* 123 aos */ INTERVAL '123' YEAR(4) TO MONTH /* 6 meses */ INTERVAL '6' MONTH(3) TO MONTH La precisin en el caso de indicar tanto aos como meses, se indica slo en el ao. En intervalos de das a segundos los intervalos se pueden indicar como: /* 4 das 10 horas 12 minutos y 7 con 352 segundos */ INTERVAL '4 10:12:7,352' DAY TO SECOND(3) /* 4 das 10 horas 12 minutos */ INTERVAL '4 10:12' DAY TO MINUTE /* 4 das 10 horas */ INTERVAL '4 10' DAY TO HOUR /* 4 das*/ INTERVAL '4' DAY /*10 horas*/ INTERVAL '10' HOUR /*25 horas*/ INTERVAL '253' HOUR /*12 minutos*/ INTERVAL '12' MINUTE /*30 segundos */ INTERVAL '30' SECOND /*8 horas y 50 minutos */ INTERVAL '8:50' HOUR TO MINUTE; /*7 minutos 6 segundos*/ INTERVAL '7:06 MINUTE TO SECOND; /*8 horas 7 minutos 6 segundos*/ INTERVAL '8:07:06' HOUR TO SECOND; Esos intervalos se pueden sumar a valores de tipo DATE o TIMESTAMP para hacer clculos. Gracias a ello se permiten sumar horas o minutos por ejemplo a los datos de tipo TIMESTAMP. obtener la fecha y hora actual
Funcin SYSDATE SYSTIMESTAMP Descripcin Obtiene la fecha y hora actuales Obtiene la fecha y hora actuales en formato TIMESTAMP

(18)

2 curso de administracin de sistemas informticos autor: Jorge Snchez www.jorgesanchez.net

calcular fechas
Funcin ADDMONTHS(fecha,n) MONTHS_BETWEEN(fecha1, fecha2) NEXT_DAY(fecha,da) Descripcin Aade a la fecha el nmero de meses indicado por n Obtiene la diferencia en meses entre las dos fechas (puede ser decimal) Indica cual es el da que corresponde a aadir a la fecha el da indicado. El da puede ser el texto 'Lunes', 'Martes', 'Mircoles',... (si la configuracin est en espaol) o el nmero de da de la semana (1=lunes, 2=martes,...) Obtiene el ltimo da del mes al que pertenece la fecha. Devuelve un valor DATE Extrae un valor de una fecha concreta. El valor puede ser day (da), month (mes), year (ao), etc. Devuelve la fecha ms moderna la lista Devuelve la fecha ms antigua la lista Redondea la fecha al valor de aplicar el formato a la fecha. El formato puede ser: 'YEAR' Hace que la fecha refleje el ao completo 'MONTH' Hace que la fecha refleje el mes completo ms cercano a la fecha 'HH24' Redondea la hora a las 00:00 ms cercanas 'DAY Redondea al da ms cercano TRUNC(fecha [formato]) Igual que el anterior pero trunca la fecha en lugar de redondearla.

LAST_DAY(fecha) EXTRACT(valor FROM fecha)

GREATEST(fecha1, fecha2,..) LEAST(fecha1, fecha2,..) ROUND(fecha [,'formato']

(4.5.6) funciones de conversin


Oracle es capaz de convertir datos automticamente a fin de que la expresin final tenga sentido. En ese sentido son fciles las conversiones de texto a nmero y viceversa. Ejemplo: SELECT 5+'3' FROM DUAL /*El resultado es 8 */ SELECT 5 || '3' FROM DUAL /* El resultado es 53 */ Tambin ocurre eso con la conversin de textos a fechas. De hecho es forma habitual de asignar fechas. Pero en diversas ocasiones querremos realizar conversiones explcitas. (19)

sistemas gestores de bases de datos


(Unidad 4) lenguaje SQL (II). Consultas

TO_CHAR Obtiene un texto a partir de un nmero o una fecha. En especial se utiliza con fechas (ya que de nmero a texto se suele utilizar de forma implcita. fechas En el caso de las fechas se indica el formato de conversin, que es una cadena que puede incluir estos smbolos (en una cadena de texto):
Smbolo YY YYYY MM MON MONTH DY DAY D DD DDD Q WW AM PM HH12 HH24 MI SS SSSS / . ,:; Significado Ao en formato de dos cifras Ao en formato de cuatro cifras Mes en formato de dos cifras Las tres primeras letras del mes Nombre completo del mes Da de la semana en tres letras Da completo de la semana Da de la semana (del 1 al 7) Da en formato de dos cifras Da del ao Semestre Semana del ao Indicador AM Indicador PM Hora de 1 a 12 Hora de 0 a 23 Minutos (0 a 59) Segundos (0 a 59) Segundos desde medianoche Posicin de los separadores, donde se pongan estos smbolos aparecern en el resultado

Ejemplos: SELECT TO_CHAR(SYSDATE, 'DD/MONTH/YYYY, DAY HH:MI:SS') FROM DUAL ; /* Sale : 16/AGOSTO /2004, LUNES 08:35:15, por ejemplo*/

(20)

2 curso de administracin de sistemas informticos autor: Jorge Snchez www.jorgesanchez.net

nmeros Para convertir nmeros a textos se usa est funcin cuando se desean caractersticas especiales. En ese caso en el formato se pueden utilizar estos smbolos:
Smbolo 9 0 $ L S D G Significado Posicin del nmero Posicin del nmero (muestra ceros) Formato dlar Smbolo local de la moneda Hace que aparezca el smbolo del signo Posicin del smbolo decimal (en espaol, la coma) Posicin del separador de grupo (en espaol el punto)

TO_NUMBER Convierte textos en nmeros. Se indica el formato de la conversin (utilizando los mismos smbolos que los comentados anteriormente). TO_DATE Convierte textos en fechas. Como segundo parmetro se utilizan los cdigos de formato de fechas comentados anteriormente. CAST Funcin muy verstil que permite convertir el resultado a un tipo concreto. Sintaxis: CAST(expresin AS tipoDatos) Ejemplo: SELECT CAST(2.34567 AS NUMBER(7,6)) FROM DUAL; Lo interesante es que puede convertir de un tipo a otro. Por ejemplo imaginemos que tenemos una columna en una tabla mal planteada en la que el precio de las cosas se ha escrito en Euros. Los datos son (se muestra slo la columna precio: PRECIO 25.2 2.8 123.65 .78 .123 (21)

sistemas gestores de bases de datos


(Unidad 4) lenguaje SQL (II). Consultas

PRECIO 20 102.5 Imaginemos que queremos doblar el precio, no podremos porque la columna es de tipo texto, por ello debemos tomar slo la parte numrica y convertirla a nmero, despus podremos mostrar los precios multiplicados por dos: SELECT 2 * CAST(SUBSTR(precio,1,INSTR(precio,'')-2) AS NUMBER) FROM precios; La combinacin de SUBSTR e INSTR es para obtener slo los nmeros. Incluso es posible que haya que utilizar REPLACE para cambiar los puntos por comas (para utilizar el separador decimal del idioma espaol).

(4.5.7) funcin DECODE


Funcin que permite realizar condiciones en una consulta Se evala una expresin y se colocan a continuacin pares valor, resultado de forma que si se la expresin equivale al valor, se obtiene el resultado indicado. Se puede indicar un ltimo parmetro con el resultado a efectuar en caso de no encontrar ninguno de los valores indicados. Sintaxis: DECODE(expresin, valor1, resultado1 [,valor2, resultado2,...] [,valorPordefecto]) Ejemplo: SELECT DECODE(cotizacion,1, salario*0.85, 2,salario * 0.93, 3,salario * 0.96, salario) FROM empleados; En el ejemplo dependiendo de la cotizacin se muestra rebajado el salario: un 85% si la cotizacin es uno, un 93 si es dos y un 96 si es tres. Si la cotizacin no es ni uno ni dos ni tres, sencillamente se muestra el salario sin ms.

(22)

2 curso de administracin de sistemas informticos autor: Jorge Snchez www.jorgesanchez.net

(4.6) obtener datos de mltiples tablas


Es ms que habitual necesitar en una consulta datos que se encuentran distribuidos en varias tablas. Las bases de datos relacionales se basan en que los datos se distribuyen en tablas que se pueden relacionar mediante un campo. Ese campo es el que permite integrar los datos de las tablas. Por ejemplo si disponemos de una tabla de empleados cuya clave es el dni y otra tabla de tareas que se refiere a tareas realizadas por los empleados, es seguro (si el diseo est bien hecho) que en la tabla de tareas aparecer el dni del empleado para saber qu empleado realiz la tarea.

(4.6.1) producto cruzado o cartesiano de tablas


En el ejemplo anterior si quiere obtener una lista de los datos de las tareas y los empleados, se podra hacer de esta forma: SELECT cod_tarea, descripcion_tarea, dni_empleado, nombre_empleado FROM tareas,empleados; La sintaxis es correcta ya que, efectivamente, en el apartado FROM se pueden indicar varias tareas separadas por comas. Pero eso produce un producto cruzado, aparecern todos los registros de las tareas relacionados con todos los registros de empleados,. El producto cartesiano a veces es til para realizar consultas complejas, pero en el caso normal no lo es. necesitamos discriminar ese producto para que slo aparezcan los registros de las tareas relacionadas con sus empleados correspondientes. A eso se le llama asociar (join) tablas

(4.6.2) asociando tablas


La forma de realizar correctamente la consulta anterior (asociado las tareas con los empleados que la realizaron sera: SELECT cod_tarea, descripcion_tarea, dni_empleado, nombre_empleado FROM tareas,empleados WHERE tareas.dni_empleado = empleados.dni; Ntese que se utiliza la notacin tabla.columna para evitar la ambigedad, ya que el mismo nombre de campo se puede repetir en ambas tablas. Para evitar repetir continuamente el nombre de la tabla, se puede utilizar un alias de tabla: SELECT a.cod_tarea, a.descripcion_tarea, b.dni_empleado, b.nombre_empleado FROM tareas a,empleados b WHERE a.dni_empleado = b.dni;

(23)

sistemas gestores de bases de datos


(Unidad 4) lenguaje SQL (II). Consultas

Al apartado WHERE se le pueden aadir condiciones encadenndolas con el operador AND. Ejemplo: SELECT a.cod_tarea, a.descripcion_tarea FROM tareas a,empleados b WHERE a.dni_empleado = b.dni AND b.nombre_empleado='Javier'; Finalmente indicar que se pueden enlazar ms de dos tablas a travs de sus campos relacionados. Ejemplo: SELECT a.cod_tarea, a.descripcion_tarea, b.nombre_empleado, c.nombre_utensilio FROM tareas a,empleados b, utensilios_utilizados c WHERE a.dni_empleado = b.dni AND a.cod_tarea=c.cod_tarea;

(4.6.3) relaciones sin igualdad


A las relaciones descritas anteriormente se las llama relaciones en igualdad (equijoins), ya que las tablas se relacionan a travs de campos que contienen valores iguales en dos tablas. Sin embargo no siempre las tablas tienen ese tipo de relacin, por ejemplo: EMPLEADOS Empleado Antonio Marta Sonia categora D C B A Sueldo 18000 21000 15000 CATEGORIAS Sueldo mnimo 6000 12000 18000 20999 Sueldo mximo 11999 17999 20999 80000

En el ejemplo anterior podramos averiguar la categora a la que pertenece cada empleado, pero estas tablas poseen una relacin que ya no es de igualdad. La forma sera: SELECT a.empleado, a.sueldo, b.categoria FROM empleados a, categorias b WHERE a.sueldo BETWEEN b.sueldo_minimo AND b.sueldo_maximo; (24)

2 curso de administracin de sistemas informticos autor: Jorge Snchez www.jorgesanchez.net

(4.6.4) sintaxis SQL 1999


En la versin SQL de 1999 se ide una nueva sintaxis para consultar varias tablas. La razn fue separar las condiciones de asociacin respecto de las condiciones de seleccin de registros. Oracle incorpora totalmente esta normativa. La sintaxis completa es: SELECT tabla1.columna1, tabl1.columna2,... tabla2.columna1, tabla2.columna2,... FROM tabla1 [CROSS JOIN tabla2]| [NATURAL JOIN tabla2]| [JOIN tabla2 USING(columna)]| [JOIN tabla2 ON (tabla1.columa=tabla2.columna)]| [LEFT|RIGHT|FULL OUTER JOIN tabla2 ON (tabla1.columa=tabla2.columna)] Se describen sus posibilidades en los siguientes apartados. CROSS JOIN Utilizando la opcin CROSS JOIN se realiza un producto cruzado entre las tablas indicadas. Eso significa que cada tupla de la primera tabla se combina con cada tupla de la segunda tabla. Es decir si la primera tabla tiene 10 filas y la segunda otras 10, como resultado se obtienen 100 filas, resultado de combinar todas entre s. Ejemplo: SELECT * FROM piezas CROSS JOIN existencias; No es una operacin muy utilizada, aunque posibilita resolver consultas extremadamente complicadas. NATURAL JOIN Establece una relacin de igualdad entre las tablas a travs de los campos que tengan el mismo nombre en ambas tablas: SELECT * FROM piezas NATURAL JOIN existencias; En ese ejemplo se obtienen los registros de piezas relacionados en existencias a travs de los campos que tengan el mismo nombre en ambas tablas. Hay que asegurarse de que slo son las claves principales y secundarias de las tablas relacionadas, las columnas en las que el nombre coincide, de otro modo fallara la asociacin y la consulta no funcionara.

(25)

sistemas gestores de bases de datos


(Unidad 4) lenguaje SQL (II). Consultas

JOIN USING Permite establecer relaciones indicando qu columna (o columnas) comn a las dos tablas hay que utilizar: SELECT * FROM piezas JOIN existencias USING(tipo,modelo); Las columnas deben de tener exactamente el mismo nombre en ambas tablasJOIN ON Permite establecer relaciones cuya condicin se establece manualmente, lo que permite realizar asociaciones ms complejas o bien asociaciones cuyos campos en las tablas no tienen el mismo nombre: SELECT * FROM piezas JOIN existencias ON(piezas.tipo=existencias.tipo AND piezas.modelo=existencias.modelo); relaciones externas La ltima posibilidad es obtener relaciones laterales o externas (outer join). Para ello se utiliza la sintaxis: SELECT * FROM piezas LEFT OUTER JOIN existencias ON(piezas.tipo=existencias.tipo AND piezas.modelo=existencias.modelo); En este consulta adems de las relacionadas, aparecen los datos de los registros de la tabla piezas que no estn en existencias. Si el LEFT lo cambiamos por un RIGHT, aparecern las existencias no presentes en la tabla piezas (adems de las relacionadas en ambas tablas). La condicin FULL OUTER JOIN producira un resultado en el que aparecen los registros no relacionados de ambas tablas.

(26)

2 curso de administracin de sistemas informticos autor: Jorge Snchez www.jorgesanchez.net

(4.7) agrupaciones
Es muy comn utilizar consultas en las que se desee agrupar los datos a fin de realizar clculos en vertical, es decir calculados a partir de datos de distintos registros. Para ello se utiliza la clusula GROUP BY que permite indicar en base a qu registros se realiza la agrupacin. Con GROUP BY la instruccin SELECT queda de esta forma: SELECT listaDeExpresiones FROM listaDeTablas [JOIN tablasRelacionadasYCondicionesDeRelacin] [WHERE condiciones] [GROUP BY grupos] [HAVING condicionesDeGrupo] [ORDER BY columnas]; En el apartado GROUP BY, se indican las columnas por las que se agrupa. La funcin de este apartado es crear un nico registro por cada valor distinto en las columnas del grupo. Si por ejemplo agrupamos en base a las columnas tipo y modelo en una tabla de existencias, se crear un nico registro por cada tipo y modelo distintos: SELECT tipo,modelo FROM existencias GROUP BY tipo,modelo; Si la tabla de existencias sin agrupar es:
TI AR AR AR AR AR AR AR AR BI BI MODELO 6 6 6 9 9 9 15 20 10 10 N_ALMACEN 1 2 3 1 2 3 1 3 2 3 CANTIDAD 2500 5600 2430 250 4000 678 5667 43 340 23

(27)

sistemas gestores de bases de datos


(Unidad 4) lenguaje SQL (II). Consultas

TI BI BI BI

MODELO 38 38 38

N_ALMACEN 1 2 3

CANTIDAD 1100 540

La consulta anterior crear esta salida:


TI AR AR AR AR BI BI MODELO 6 9 15 20 10 38

Es decir es un resumen de los datos anteriores. Los datos n_almacen y cantidad no estn disponibles directamente ya que son distintos en los registros del mismo grupo. Slo se pueden utilizar desde funciones (como se ver ahora). Es decir esta consulta es errnea: SELECT tipo,modelo, cantidad FROM existencias GROUP BY tipo,modelo; SELECT tipo,modelo, cantidad * ERROR en lnea 1: ORA-00979: no es una expresin GROUP BY

(4.7.1) funciones de clculo con grupos


Lo interesante de la creacin de grupos es las posibilidades de clculo que ofrece. Para ello se utilizan funciones que permiten trabajar con los registros de un grupo son:
Funcin COUNT(*) Significado Cuenta los elementos de un grupo. Se utiliza el asterisco para no tener que indicar un nombre de columna concreto, el resultado es el mismo para cualquier columna Suma los valores de la expresin

SUM(expresin)

(28)

2 curso de administracin de sistemas informticos autor: Jorge Snchez www.jorgesanchez.net

Funcin AVG(expresin) MIN(expresin) MAX(expresin) STDDEV(expresin) VARIANCE(expresin)

Significado Calcula la media aritmtica sobre la expresin indicada Mnimo valor que toma la expresin indicada Mximo valor que toma la expresin indicada Calcula la desviacin estndar Calcula la varianza

Todas las funciones de la tabla anterior se calculan para cada elemento del grupo, as la expresin: SELECT tipo,modelo, cantidad, SUM(Cantidad) FROM existencias GROUP BY tipo,modelo; Obtiene este resultado:
TI AR AR AR AR BI BI MODELO 6 9 15 20 10 38 SUM(CANTIDAD) 10530 4928 5667 43 363 1740

Se suman las cantidades para cada grupo

(4.7.2) condiciones HAVING


A veces se desea restringir el resultado de una expresin agrupada, por ejemplo con: SELECT tipo,modelo, cantidad, SUM(Cantidad) FROM existencias WHERE SUM(Cantidad)>500 GROUP BY tipo,modelo; Pero Oracle devolvera este error: WHERE SUM(Cantidad)>500 * ERROR en lnea 3: ORA-00934: funcin de grupo no permitida aqu (29)

sistemas gestores de bases de datos


(Unidad 4) lenguaje SQL (II). Consultas

La razn es que Oracle calcula primero el WHERE y luego los grupos; por lo que esa condicin no la puede realizar al no estar establecidos los grupos. Por ello se utiliza la clusula HAVING, que se ejecuta una vez realizados los grupos. Se usara de esta forma: SELECT tipo,modelo, cantidad, SUM(Cantidad) FROM existencias GROUP BY tipo,modelo HAVING SUM(Cantidad)>500; Eso no implica que no se pueda usar WHERE. sta expresin s es vlida: SELECT tipo,modelo, cantidad, SUM(Cantidad) FROM existencias WHERE tipo!='AR' GROUP BY tipo,modelo HAVING SUM(Cantidad)>500; En definitiva, el orden de ejecucin de la consulta marca lo que se puede utilizar con WHERE y lo que se puede utilizar con HAVING: Para evitar problemas estos podran ser los pasos en la ejecucin de una instruccin de agrupacin por parte del gestor de bases de datos: (1) (2) (3) (4) (5) Seleccionar las filas deseadas utilizando WHERE. Esta clusula eliminar columnas en base a la condicin indicada Se establecen los grupos indicados en la clusula GROUP BY Se calculan los valores de las funciones de totales (COUNT, SUM, AVG,...) Se filtran los registros que cumplen la clusula HAVING El resultado se ordena en base al apartado ORDER BY.

(4.8) subconsultas
(4.8.1) uso de subconsultas simples
Se trata de una tcnica que permite utilizar el resultado de una tabla SELECT en otra consulta SELECT. Permite solucionar consultas que requieren para funcionar el resultado previo de otra consulta. La sintaxis es: SELECT listaExpresiones FROM tabla WHERE expresin OPERADOR (SELECT listaExpresiones FROM tabla); (30)

2 curso de administracin de sistemas informticos autor: Jorge Snchez www.jorgesanchez.net

Se puede colocar el SELECT dentro de las clusulas WHERE, HAVING o FROM. El operador puede ser >,<,>=,<=,!=, = o IN. Ejemplo: SELECT nombre_empleado, paga FROM empleados WHERE paga < (SELECT paga FROM empleados WHERE nombre_empleado='Martina') ; Lgicamente el resultado de la subconsulta debe incluir el campo que estamos analizando. Se pueden realizar esas subconsultas las veces que haga falta: SELECT nombre_empleado, paga FROM empleados WHERE paga < (SELECT paga FROM empleados WHERE nombre_empleado='Martina') AND paga > (SELECT paga FROM empleadosWHERE nombre_empleado='Luis'); En realidad lo primero que hace la base de datos es calcular el resultado de la subconsulta:
SELECT nombre_empleado, paga FROM empleados 1870 WHERE paga < (SELECT paga FROM empleados WHERE nombre_empleado='Martina') AND paga > 2500 (SELECT paga FROM empleados WHERE nombre_empleado='Luis');

La ltima consulta obtiene los empleados cuyas pagas estn entre lo que gana Lus (1870 euros) y lo que gana Martina (2500) . Las subconsultas siempre se deben encerrar entre parntesis y se debera colocar a la derecha del operador relacional. Una subconsulta que utilice los valores >,<,>=,... tiene que devolver un nico valor, de otro modo ocurre un error. Adems tienen que tener el mismo tipo de columna para relacionar la subconsulta con la consulta que la utiliza (no puede ocurrir que la subconsulta tenga dos columnas y ese resultado se compare usando una sola columna en la consulta general).

(31)

sistemas gestores de bases de datos


(Unidad 4) lenguaje SQL (II). Consultas

(4.8.2) uso de subconsultas de mltiples filas


En el apartado anterior se comentaba que las subconsultas slo pueden devolver una fila. Pero a veces se necesitan consultas del tipo: mostrar el sueldo y nombre de los empleados cuyo sueldo supera al de cualquier empleado del departamento de ventas. La subconsulta necesaria para ese resultado mostrara todos los sueldos del departamento de ventas. Pero no podremos utilizar un operador de comparacin directamente ya que esa subconsulta devuelve ms de una fila. La solucin a esto es utilizar instrucciones especiales entre el operador y la consulta, que permiten el uso de subconsultas de varias filas. Esas instrucciones son:
Instruccin ANY Significado Compara con cualquier registro de la subconsulta. La instruccin es vlida si hay un registro en la subconsulta que permite que la comparacin sea cierta Compara con todos los registros de la consulta. La instruccin resulta cierta si es cierta toda comparacin con los registros de la subconsulta No usa comparador, ya que sirve para comprobar si un valor se encuentra en el resultado de la subconsulta Comprueba si un valor no se encuentra en una subconsulta

ALL

IN

NOT IN

Ejemplo: SELECT nombre, sueldo FROM empleados WHERE sueldo >= ALL (SELECT sueldo FROM empleados); La consulta anterior obtiene el empleado que ms cobra. Otro ejemplo: SELECT nombre FROM empleados WHERE dni IN (SELECT dni FROM directivos); En ese caso se obtienen los nombres de los empleados cuyos dni estn en la tabla de directivos. Si se necesita comprobar dos columnas en una consulta IN, se hace: SELECT nombre FROM empleados WHERE (cod1,cod2) IN (SELECT cod1,cod2 FROM directivos);

(32)

2 curso de administracin de sistemas informticos autor: Jorge Snchez www.jorgesanchez.net

(4.9) combinaciones especiales


(4.9.1) uniones
La palabra UNION permite aadir el resultado de un SELECT a otro SELECT. Para ello ambas instrucciones tienen que utilizar el mismo nmero y tipo de columnas. Ejemplo: SELECT nombre FROM provincias UNION SELECT nombre FROM comunidades El resultado es una tabla que contendr nombres de provincia y de comunidades. Es decir, UNION crea una sola tabla con registros que estn presentes en cualquiera de las consultas. Si estn repetidas slo aparecen una vez, para mostrar los duplicados se utiliza UNION ALL en lugar de la palabra UNION. Es muy importante sealar que tanto sta clusula como el resto de combinaciones especiales, requieren en los dos SELECT que unen el mismo tipo de columnas (y en el mismo orden).

(4.9.2) intersecciones
De la misma forma, la palabra INTERSECT permite unir dos consultas SELECT de modo que el resultado sern las filas que estn presentes en ambas consultas. Ejemplo; tipos y modelos de piezas que se encuentren slo en los almacenes 1 y 2: SELECT tipo,modelo FROM existencias WHERE n_almacen=1 INTERSECT SELECT tipo,modelo FROM existencias WHERE n_almacen=2

(4.9.3) diferencia
Con MINUS tambin se combinan dos consultas SELECT de forma que aparecern los registros del primer SELECT que no estn presentes en el segundo. Ejemplo; tipos y modelos de piezas que se encuentren el almacn 1 y no en el 2 (SELECT tipo,modelo FROM existencias WHERE n_almacen=1) MINUS(SELECT tipo,modelo FROM existencias WHERE n_almacen=2)

(33)

sistemas gestores de bases de datos


(Unidad 4) lenguaje SQL (II). Consultas

Se podran hacer varias combinaciones anidadas (una unin cuyo resultado se intersectar con otro SELECT por ejemplo), en ese caso es conveniente utilizar parntesis para indicar qu combinacin se hace primero: (SELECT.... .... UNION SELECT.... ... ) MINUS SELECT.... /* Primero se hace la unin y luego la diferencia*/

(4.10) DQL en instrucciones DML


A pesar del poco ilustrativo ttulo de este apartado, la idea es sencilla. Se trata de cmo utilizar instrucciones SELECT dentro de las instrucciones DML (INSERT, DELETE o UPDATE), ello permite dar ms potencia a dichas instrucciones.

(4.10.1) relleno de registros a partir de filas de una consulta


Hay un tipo de consulta, llamada de adicin de datos, que permite rellenar datos de una tabla copiando el resultado de una consulta. Se hace mediante la instruccin INSERT y, en definitiva, permite copiar datos de una consulta a otra. Ese relleno se basa en una consulta SELECT que poseer los datos a aadir. Lgicamente el orden de esos campos debe de coincidir con la lista de campos indicada en la instruccin INSERT. Sintaxis: INSERT INTO tabla (campo1, campo2,...) SELECT campoCompatibleCampo1, campoCompatibleCampo2,... FROM lista DeTablas [...otras clusulas del SELECT...] Ejemplo: INSERT INTO clientes2004 (dni, nombre, localidad, direccion) SELECT dni, nombre, localidad, direccion FROM clientes WHERE problemas=0; Lgicamente las columnas del SELECT se tienen que corresponder con las columnas a rellenar mediante INSERT (observar las flechas).

(34)

2 curso de administracin de sistemas informticos autor: Jorge Snchez www.jorgesanchez.net

(4.10.2) subconsultas en la instruccin UPDATE


La instruccin UPDATE permite modificar filas. Es muy habitual el uso de la clusula WHERE para indicar las filas que se modificarn. Esta clusula se puede utilizar con las mismas posibilidades que en el caso del SELECT, por lo que es posible utilizar subconsultas. Por ejemplo: UPDATE empleados SET sueldo=sueldo*1.10 WHERE id_seccion =(SELECT id_seccion FROM secciones WHERE nom_seccion='Produccin'); Esta instruccin aumenta un 10% el sueldo de los empleados de la seccin llamada Produccin. Tambin podemos utilizar subconsultas en la clusula SET de la instruccin UPDATE. Ejemplo: UPDATE empleados SET puesto_trabajo=(SELECT puesto_trabajo FROM empleados WHERE id_empleado=12) WHERE seccion=23; Esta instruccin coloca a todos los empleados de la seccin 23 el mismo puesto de trabajo que el empleado nmero 12. Este tipo de actualizaciones slo son vlidas si el subselect devuelve un nico valor, que adems debe de ser compatible con la columna que se actualiza. Hay que tener en cuenta que las actualizaciones no pueden saltarse las reglas de integridad que posean las tablas.

(4.10.3) subconsultas en la instruccin DELETE


Al igual que en el caso de las instrucciones INSERT o SELECT, DELETE dispone de clusula WHERE y en dicha clusulas podemos utilizar subconsultas. Por ejemplo: DELETE empleados WHERE id_empleado IN (SELECT id_empleado FROM errores_graves); En este caso se trata de una subconsulta creada con el operador IN, se eliminarn los empleados cuyo identificador est dentro de la tabla de errores graves.

(35)

sistemas gestores de bases de datos


(Unidad 4) lenguaje SQL (II). Consultas

(4.11) vistas
(4.11.1) introduccin
Una vista no es ms que una consulta almacenada a fin de utilizarla tantas veces como se desee. Una vista no contiene datos sino la instruccin SELECT necesaria para crear la vista, eso asegura que los datos sean coherentes al utilizar los datos almacenados en las tablas. Por todo ello, las vistas gastan muy poco espacio de disco. Las vistas se emplean para:

Realizar consultas complejas ms fcilmente, ya que permiten dividir la


consulta en varias partes

Proporcionar tablas con datos completos Utilizar visiones especiales de los datos Ser utilizadas como tablas que resumen todos los datos Ser utilizadas como cursores de datos en los lenguajes procedimentales (como PL/SQL)

Hay dos tipos de vistas:

Simples. Las forman una sola tabla y no contienen funciones de

agrupacin. Su ventaja es que permiten siempre realizar operaciones DML sobre ellas. de agrupacin. No siempre permiten operaciones DML.

Complejas. Obtienen datos de varias tablas, pueden utilizar funciones

(4.11.2) creacin de vistas


Sintaxis: CREATE [OR REPLACE] [FORCE|NOFORCE] VIEW vista [(alias[, alias2...])] AS consultaSELECT [WITH CHECK OPTION [CONSTRAINT restriccin]] [WITH READ ONLY [CONSTRAINT restriccin]]

OR REPLACE. Si la vista ya exista, la cambia por la actual FORCE. Crea la vista aunque los datos de la consulta SELECT no existan vista. Nombre que se le da a la vista alias. Lista de alias que se establecen para las columnas devueltas por la consulta SELECT en la que se basa esta vista. El nmero de alias debe coincidir con el nmero de columnas devueltas por SELECT. (36)

2 curso de administracin de sistemas informticos autor: Jorge Snchez www.jorgesanchez.net

WITH CHECK OPTION. Hace que slo las filas que se muestran en la

vista puedan ser aadidas (INSERT) o modificadas (UPDATE). La restriccin que sigue a esta seccin es el nombre que se le da a esta restriccin de tipo CHECK OPTION. un nombre para esta restriccin.

WITH READ ONLY. Hace que la vista sea de slo lectura. Permite grabar
Lo bueno de las vistas es que tras su creacin se utilizan como si fueran una tabla. Ejemplo: CREATE VIEW resumen /* alias */ (id_localidad, localidad, poblacion, n_provincia, provincia,superficie, capital_provincia, id_comunidad, comunidad, capital_comunidad) AS ( SELECT l.id_localidad, l.nombre, l.poblacion, n_provincia, p.nombre, p.superficie, l2.nombre, id_comunidad, c.nombre, l3.nombre FROM localidades l JOIN provincias p USING (n_provincia) JOIN comunidades c USING (id_comunidad) JOIN localidades l2 ON (p.id_capital=l2.id_localidad) JOIN localidades l3 ON (c.id_capital=l3.id_localidad) ); SELECT DISTINCT (comunidad, capital_comunidad) FROM resumen; /* La vista pasa a usarse como una tabla normal*/ La creacin de la vista del ejemplo es compleja ya que hay relaciones complicadas, pero una vez creada la vista, se le pueden hacer consultas como si se tratara de una tabla normal. Incluso se puede utilizar el comando DESCRIBE sobre la vista para mostrar la estructura de los campos que forman la vista o utilizarse como subconsulta en los comandos UPDATE o DELETE.

(4.11.3) mostrar la lista de vistas


La vista del diccionario de datos de Oracle USER_VIEWS permite mostrar una lista de todas las vistas que posee el usuario actual. Es decir, para saber qu vistas hay disponibles se usa: SELECT * FROM USER_VIEWS; La columna TEXT de esa vista contiene la sentencia SQL que se utiliz para crear la vista (sentencia que es ejecutada cada vez que se invoca a la vista).

(37)

sistemas gestores de bases de datos


(Unidad 4) lenguaje SQL (II). Consultas

(4.11.4) borrar vistas


Se utiliza el comando DROP VIEW: DROP VIEW nombreDeVista;

(38)