Escolar Documentos
Profissional Documentos
Cultura Documentos
Las definiciones de esos objetos quedan almacenadas en el diccionario de datos del sistema. Sentencias DML (Lenguaje de Manipulacin de Datos): Nos permiten indicar al sistema las operaciones que queremos realizar con los datos almacenados en las estructuras creadas por medio de las sentencias DDL. Por ejemplo son las sentencias que permitirn: generar consultas, ordenar, filtrar, aadir, modificar, borrar, etc.
Sentencias DCL (Lenguaje de Control): Un conjunto de sentencias orientado a gestionar todo lo relativo a: usuarios, permisos, seguridad, etc.
Con el tiempo han surgido nuevas necesidades en los SGBDR que han obligado a incorporar nuevas sentencias que no se pueden clasificar en los tres grupos clsicos anteriores, cmo son las Sentencias para gestin de transacciones y bloqueos, las sentencias para replicacin, etc. Las sentencias SQL a su vez se construyen a partir de:
OPERADORES LGICOS
CLUSULAS
FUNCIONES
DE CLCULO Y TRANSFORMACIN DE DATOS
EXPRESIONES
FUNCIONES DE AGREGACIN
Clusulas: Que modifican el comportamiento de las sentencias. Constan de palabras reservadas y alguno de los siguientes elementos. Operadores lgicos y de comparacin: Sirven para ligar operandos y producir un resultado booleano (verdadero o falso). Funciones de agregacin: Para realizar operaciones sobre un grupo de filas de una tabla. Funciones: Para realizar clculos y operaciones de transformacin sobre los datos. Expresiones: Construidas a partir de la combinacin de operadores, funciones, literales y nombres de columna.
Al escribir una sentencia INSERT el nmero de columnas y de valores debe ser igual y escrito en el mismo orden. Se pueden dejar columnas sin especificar, en este caso tomarn el valor por defecto indicado cuando se cre la tabla (DEFAULT). Por ejemplo, si queremos aadir el departamento con cdigo 02, llamado Ventas y situado en la ciudad de Almera escribiremos: INSERT INTO departamento (cddep,nombre,ciudad) VALUES ('02','Ventas','Almera')
INSERTANDO DATOS EN LAS TABLAS
DE LA BASE DE DATOS
Si no queremos suministrar la ciudad del departamento escribiremos: INSERT INTO departamento (cddep,nombre) VALUES ('10','Contabilidad') En este caso no le hemos dado valor a la columna ciudad. Si quisiramos aadir el empleado con cdigo A03, de nombre Pedro Rojo, con fecha de ingreso 7 de marzo de 1995, cuyo jefe es el empleado con cdigo A11 y que trabaja en el departamento 01, deberamos escribir:
INSERT INTO empleado (cdemp,nombre,fecha_ingreso,cdjefe,cddep) VALUES ('A03','Pedro Rojo','1995-3-7','A11','01') El ejemplo anterior merece varios comentarios: o Si el empleado con cdigo A11 no existe en la tabla de empleados la sentencia INSERT fallar y no tendr ningn efecto, en este caso se habr incumplido la clusula FOREIGN KEY que indica que cdjefe es una clave externa y por lo tanto se est incumpliendo la regla de integridad de referencia. Podemos aadir el empleado A11 a la tabla de empleados y repetir la insercin del empleado A03. Observa que tambin existe una clusula FOREIGN KEY respecto de la tabla de departamentos. La columna fecha_ingreso se declar de tipo DATE. En MySQL las fechas deben ser suministradas en el formato ao-mes-da, que es el formato en ingls. Ten cuidado con esto. La introduccin de fechas con nuestro formato habitual en espaol puede ser fuente de frecuentes errores
INSERT [INTO] <tabla> [(<columna>,...)] SELECT ... Para entender bien la estructura de esta sintaxis deberamos conocer la sentencia SQL que permite seleccionar filas de una tabla (SELECT), puesto que la seleccin de las filas de origen se hace con una sentencia SELECT normal. Como esta sentencia ser estudiada ms adelante en esta unidad posponemos su explicacin en detalle hasta ese momento. Ahora te presentamos un sencillo ejemplo: Si quisiramos aadir todos los empleados del departamento 02 al proyecto con cdigo AEE, suponiendo que existe tal proyecto en la tabla de proyectos, la sentencia a utilizar sera: INSERT INTO trabaja (cdemp,cdpro) SELECT cdemp,'AEE' FROM empleado WHERE cddep='02'
No te preocupes si en este momento no entiendes bien cmo funciona la sentencia SELECT. Ms adelante las estudiars en detalle, ya que es la sentencia ms importante y verstil de SQL.
UPDATE <tabla> SET <columna_1>=<expresin_1> [, <columna_2>=<expresin_2> ...] WHERE <criterio>] Si no se especifica ningn criterio de seleccin la modificacin se efecta sobre todas las filas de la tabla. En cambio si queremos modificar solamente alguna o algunas filas concretas habr que determinar a cuales nos referimos por medio de la clusula WHERE, especificando una condicin lgica que permita discriminar a qu filas afectar la operacin (criterio). Por ejemplo, si queremos cambiar la ciudad donde se ubica el departamento 02, y hacer que sea Crdoba, escribiremos: UPDATE departamento SET ciudad='Crdoba' WHERE cddep='02' Es importante que te des cuenta que si hubiramos escrito: UPDATE departamento SET ciudad='Crdoba' Habramos cambiado TODOS los departamentos a Crdoba! Es posible especificar expresiones como nuevo valor de columnas. Si deseamos incrementar en 5 las horas de trabajo dedicadas al proyecto AEE por todos los empleados que trabajan en l, deberamos escribir: UPDATE trabaja SET nhoras=nhoras+5 WHERE cdpro='02' Si se intenta hacer un cambio que entra en conflicto con alguna de las reglas de la tabla, se producir un error y el cambio no ser llevado a efecto. Por ejemplo si intentamos modificar el valor de la clave primaria de una fila por un valor que exista previamente (recuerda que no pueden existir dos filas con el mismo valor de clave primaria), la operacin no se efectuar. Esto lo gestiona automticamente el SGBDR, asegurando la integridad de los datos de la base de datos. Asimismo, si modificamos el valor de una columna que forma parte de una restriccin FOREIGN KEY el SGBDR actuar segn lo indicado en ON UPDATE. Por ejemplo si actualizamos el valor de un cddep en la tabla departamento el cambio se transmitir a todos los empleados y proyectos que referenciaban a ese departamento. Esto es as puesto que en la creacin de la base de datos fijamos ON UPDATE al valor CASCADE. UPDATE departamento SET cddep='22' WHERE cddep='02' Cambia el cddep del departamento 02 por 22, en la tabla de departamentos, y tambin en las tablas proyecto y empleado. El cambio se transmite en cascada tal y como indicamos en la reglas FOREIGN KEY correspondientes.
Por ejemplo si queremos eliminar los empleados que pertenecen al departamento 02 escribiramos: DELETE FROM empleado WHERE cddep='02' Cuidado! Si no especificamos ningn criterio se eliminarn todas las filas de la tabla. Por supuesto el borrado de filas no debe dejar la base de datos en un estado de inconsistencia. Esto quiere decir que el SGBDR comprobar las restricciones FOREIGN KEY definidas y actuar segn lo indicado en ON DELETE. Veamos un ejemplo: Si intentamos eliminar un departamento que es referenciado en la tabla de empleados, es decir, un departamento donde trabaja al menos un empleado, el SGBDR abortar la operacin de borrado. Slo se podrn eliminar departamentos en los que no trabaje ningn empleado. Esto es as porque se especific ON DELETE RESTRICT al definir la clave externa cddep de la tabla empleado. DELETE FROM departamento WHERE cddep='02' Abortar si existe alguna fila en la tabla empleado cuyo valor de columna cddep sea 02.
Practicando con :
INSERT UPDATE DELETE
Esta variedad de casos nos permitir probar las sentencias de SQL ms utilizadas que sern estudiadas a continuacin, las sentencias de seleccin SELECT. Te sugerimos que escribas las sentencias INSERT adecuadas en un script SQL, esto te ser til para poder regenerar fcilmente la base de datos al estado original de prueba propuesto en este apartado. Para facilitar tu trabajo te incluimos el script SQL completo y listo para su uso, bajo el ttulo: Este script SQL inserta en las tablas de gestionproyectos un conjunto de datos de prueba.
Siendo <lista_de_expresiones> una lista de expresiones a evaluar por cada fila afectada de la tabla, (normalmente sern nombres de columnas). Por ejemplo, para obtener los nombres de todos los departamentos y las ciudades donde se encuentran, se teclea en SQL: SELECT nombre,ciudad FROM departamento Si queremos obtener todas las columnas de una tabla se puede utilizar cmo <lista_de_expresiones> el carcter *. Por ejemplo, para obtener todos los datos de todos los empleados podemos utilizar la siguiente sentencia SELECT: SELECT * FROM empleado Se pueden utilizar expresiones que realicen algn clculo u operacin. Por ejemplo, si suponemos que cada hora de trabajo se paga a 40 euros. Una lista de lo que hay que pagar a cada empleado que trabaja en un proyecto se hara de la siguiente manera: SELECT cdemp, nhoras*40 FROM trabaja La sentencia SELECT admite otras clusulas que la hacen ms potente y verstil. Estas son las siguientes: WHERE ORDER BY GROUP BY HAVING LIMIT
Condicin de valor nulo o no nulo: <expresin> IS NULL y <expresin> IS NOT NULL respectivamente. Se vern afectadas las filas cuyo valor de expresin sea NULL o no, respectivamente. Por ejemplo, empleados que no tienen jefe asignado: SELECT * FROM empleado WHERE cdjefe IS NULL
Operadores lgicos para enlazar ms de un criterio: AND y OR. Sirven para obtener un resultado lgico combinando el resultado de dos criterios. Tienen el habitual significado del Y y el O lgicos. Por ejemplo, empleados del departamento 02 o del departamento 04: SELECT * FROM empleado WHERE cddep='02' OR cddep='04'
Operador de negacin lgico: NOT. Niega lgicamente Por ejemplo, empleados que no son del departamento 02: SELECT * FROM empleado WHERE NOT cddep='02'
el
criterio
que
sigue
continuacin.
Las expresiones lgicas pueden agruparse con parntesis para indicar el orden de evaluacin o aclarar las expresiones complicadas. Por ejemplo, las expresiones cdpro='DAG' OR (cdpro='GRE' AND nhoras>=15) y (cdpro='DAG' OR cdpro='GRE') AND nhoras>=15 , no producen el mismo resultado. Prueba a lanzar las sentencias SQL correspondientes y comprubalo.
Clusula ORDER BY
Se puede decidir si el orden ser ascendente (ASC) o descendente (DESC). Si queremos la lista de departamentos ordenada por orden alfabtico descendente de la ciudad de localizacin podemos usar: SELECT * FROM departamento ORDER BY ciudad DESC El sentido de la ordenacin por defecto es ascendente. Se pueden combinar criterios ascendentes y descendentes. Por ejemplo, si queremos la lista de departamento por orden ascendente de ciudad y descendente de nombre, se puede emplear. SELECT * FROM departamento ORDER BY ciudad ASC, nombre DESC Por supuesto se puede combinar la clusula ORDER BY con la clusula WHERE. En este caso ORDER BY debe aparecer despus de WHERE. Por ejemplo, la lista de empleados por orden alfabtico del departamento 02 se obtendra con: SELECT * FROM empleado WHERE cddep='02' ORDER BY nombre
SELECT SUM(nhoras) FROM trabaja o Media aritmtica AVG(<expresin>) : AVG es la abreviatura de Average, que significa media. Como te imaginars, calcula la media aritmtica de los valores de expresin. Por ejemplo, la media de horas trabajadas por cada empleado se calcula como:
SELECT AVG(nhoras) FROM trabaja o Valor mnimo MIN(<expresin>) : Produce como resultado el mnimo de los valores del conjunto de expresiones evaluadas. Por ejemplo, el mnimo valor de horas trabajadas (correspondiente al trabajador que menos horas ha trabajado):
SELECT MIN(nhoras) FROM trabaja o Valor mximo MAX(<expresin>) : Obtiene el mximo del conjunto de expresiones. Por ejemplo, fecha de ingreso en la empresa ms reciente, es decir, la fecha en la que ingres el ltimo trabajador contratado por la empresa. (Evidentemente se entiende que las fechas ms recientes son mayores que las ms antiguas):
SELECT MAX(fecha_ingreso) FROM empleado o Cuenta del nmero de filas de una consulta COUNT(*) : Calcula el nmero de filas que se obtienen en una consulta. Por ejemplo para saber el nmero de empleados de la empresa:
SELECT COUNT(*) FROM empleado o Cuenta del nmero de filas que no producen el valor NULL COUNT(<expresin>): Produce como resultado un nmero que indica cuntas filas de la consulta no producen NULL al evaluar la expresin. Por ejemplo para calcular el nmero de empleados que estn asignados a un departamento:
Cuenta del nmero de filas distintas de una consulta COUNT(DISTINCT <expresin>) : Anlogo al anterior pero sin contar las filas repetidas. Por ejemplo, si
queremos saber en cuntas ciudades diferentes existen departamentos de la empresa: SELECT COUNT(DISTINCT ciudad) FROM departamento Observaciones: No se pueden combinar funciones de agregacin con otro tipo de expresiones, esto provocara un error de SQL. Aunque s se puede combinar varias funciones de agrupamiento en la misma consulta. Si se quiere saber la fecha de ingreso ms antigua y ms reciente:
SELECT MIN(fecha_ingreso), MAX(fecha_ingreso) FROM empleado Es muy til combinar estas funciones de agregacin con la clusula GROUP BY, de esta forma se pueden calcular subtotales de grupos de filas con alguna caracterstica en comn. Por ejemplo, si quisiramos saber cul es el nmero de horas trabajadas en cada proyecto se podra emplear:
SELECT cdpro, SUM(nhoras) FROM trabaja GROUP BY cdpro En caso de utilizar GROUP BY s es posible mezclar expresiones simples con funciones de agregacin, siempre que las expresiones simples formen parte de la clusula ORDER BY. Tambin es posible establecer varios niveles de agrupamiento. Por ejemplo, lista del nmero de empleados por cada departamento y jefe:
SELECT cddep, COUNT(nombre) FROM empleado WHERE cdjefe='A11' GROUP BY cddep HAVING COUNT(nombre)>1 Por supuesto se puede combinar lo anterior con la ordenacin por medio de la clusula ORDER BY. Por ejemplo, si quisiramos seleccionar a los empleados cuyo jefe es el empleado A11o el A03 y aplicar todas las acciones en una sola consulta: SELECT cddep, COUNT(nombre) FROM empleado WHERE cdjefe='A11' OR cdjefe='A03' GROUP BY cddep HAVING COUNT(nombre)>1 ORDER BY cddep
Clusula WHERE
Clusula HAVING
SELECT cddep, COUNT(nombre) FROM empleado WHERE cdjefe='A11' GROUP BY cddep HAVING COUNT(nombre)>1 ORDER BY cddep
Otro ejemplo puede ser conocer los dos empleados que ms horas han trabajado en proyectos: SELECT cdemp,SUM(nhoras) FROM trabaja GROUP BY cdemp ORDER BY SUM(nhoras) DESC LIMIT 2
Clusula LIMIT
SELECT cdemp,SUM(nhoras) FROM trabaja GROUP BY cdemp ORDER BY SUM(nhoras) DESC LIMIT 2
2.5.7. Subconsultas.
En muchas ocasiones el criterio lgico para seleccionar las filas de una consulta en la clusula WHERE viene dado por los resultados de otra consulta previa. A esta consulta previa se la denomina subconsulta o consulta anidada. Es una caracterstica muy importante del lenguaje SQL, hasta el punto de que muchas consultas no podran ser realizadas sin el uso de esta capacidad. o Una sentencia SQL con una subconsulta es frecuentemente el modo ms natural de expresar una consulta, ya que se asemeja mucho a la descripcin de la consulta en lenguaje natural. Las subconsultas hacen ms fcil la escritura de sentencias SELECT, ya que permiten descomponer una consulta en partes (la consulta y sus subconsultas) y luego recomponerlas.
Una subconsulta es una consulta que aparece dentro de la clusula WHERE o HAVING de otra sentencia SQL. Por ejemplo, si analizamos el enunciado lista de empleados que han trabajado ms horas de la media de horas trabajadas de todos los empleados en proyectos, nos daremos cuenta que en realidad hay dos consultas en el enunciado, en una de ellas hay que calcular la media de horas trabajadas, y en la otra hay que listar los empleados que superan esa media. En SQL quedara as: SELECT cdemp, nhoras FROM trabaja WHERE nhoras > (SELECT AVG(nhoras) FROM trabaja) En la clusula HAVING las subconsultas sirven para seleccionar los grupos de filas del resultado. Por ejemplo, lista de empleados que han trabajado ms horas en proyectos que las horas dedicadas al proyecto AEE: SELECT cdemp, SUM(nhoras) FROM trabaja GROUP BY cdemp HAVING SUM(nhoras) > (SELECT SUM(nhoras) FROM trabaja WHERE cdpro='AEE') Es necesario hacer una serie de consideraciones relativas a las subconsultas: o Una subconsulta debe producir una nica columna de datos como resultado. Esto significa que una subconsulta siempre tiene un nico elemento de seleccin de la clusula SELECT. La clusula ORDER BY no tiene sentido en una subconsulta. Los resultados de la subconsulta se utilizan internamente por parte de la consulta principal y nunca son visibles al exterior, por lo que carece de sentido ordenarlos. Es posible referirse a nombres de columnas de la consulta principal desde dentro de la subconsulta.
Subconsultas
Existe una gama muy rica de operadores para relacionar la consulta principal y la subconsulta. Vamos a verlos a continuacin. o Operadores de comparacin: <, <=, =, >=, >, <>: Se compara el valor de la expresin WHERE utilizada en la consulta principal con un nico valor proporcionado por la subconsulta. Por ejemplo, lista de los departamentos que estn en la misma ciudad que el departamento 01:
SELECT cddep FROM departamento WHERE ciudad = (SELECT ciudad FROM departamento WHERE cddep='01')
Operador de pertenencia a un conjunto <expresin> IN (<subconsulta): Se seleccionan las filas en las que la evaluacin de la expresin sea alguno de los valores del conjunto de valores producido por la subconsulta. Por ejemplo, lista de empleados que tienen como jefe un empleado del departamento 04:
SELECT nombre, cddep, cdjefe FROM empleado WHERE cdjefe IN (SELECT cdemp FROM empleado WHERE cddep='04') Operador de existencia EXIST(<subconsulta>) : Este operador comprueba si la subconsulta siguiente devuelve alguna fila o no, evalundose a VERDADERO o FALSO respectivamente. Hay que hacer notar que en la subconsulta debe aparecer alguna columna de la consulta principal. Para ello se puede utilizar la notacin <tabla>.<columna>, de manera que no se produzcan ambigedades. Por ejemplo, si quisiramos obtener los nombres de los empleados que trabajan en departamentos situados en la provincia de Almera, podramos escribir: o SELECT nombre FROM empleado WHERE EXISTS (SELECT * FROM departamento WHERE ciudad LIKE 'Almer%' AND empleado.cddep=departamento.cddep) Observa cmo hemos incluido una condicin en la clusula WHERE de la subconsulta que la relaciona con la consulta principal empleado.cddep=departamento.cddep. o Tambin es posible utilizar alias para los nombres de tabla en el caso de que la tabla de la consulta principal y de la subconsulta sean la misma, un alias es como un sobrenombre dado a una tabla. Se pueden definir los alias en la clusula FROM, a continuacin del nombre la tabla referenciada. Por ejemplo, si quisiramos obtener la lista de los empleados que son jefes de algn empleado, deberamos comprobar para cada empleado de la tabla empleado s existe (EXISTS) algn otro empleado de la tabla empleado que tiene como cdjefe el cdemp del empleado que estamos comprobando. Quedara as:
SELECT nombre FROM empleado a WHERE EXISTS (SELECT * FROM empleado b WHERE a.cdemp=b.cdjefe) Puedes observar que podemos obtener un resultado equivalente mediante la siguiente consulta: SELECT nombre FROM empleado WHERE cdemp IN (SELECT DISTINCT cdjefe FROM empleado) o Operadores de comparacin cuantificada <operador de comparacin>[SOME|ALL] : Combinan el uso de los operadores de comparacin (<,>,<=,>=,=,<>) con la cuantificacin alguno (SOME) o todos (ALL). Veamos un ejemplo de cada caso.
Lista de los empleados que tienen una antigedad superior a alguno del departamento 03: SELECT nombre,fecha_ingreso,cdemp FROM empleado WHERE fecha_ingreso > SOME(SELECT fecha_ingreso FROM empleado WHERE cddep='03') Lista de empleados y horas trabajadas de los empleados que han trabajado ms horas que todos los empleados del proyecto GRE: SELECT cdemp,nhoras FROM trabaja WHERE nhoras > ALL (SELECT nhoras FROM trabaja WHERE cdpro='GRE')
Es muy habitual que los datos que queremos obtener por medio de una consulta se encuentren en tablas diferentes. En estos casos hay que combinar las tablas necesarias para construir una nica consulta. Existen dos tipos de combinaciones de tablas, la unin (UNION) y la composicin (JOIN). Vamos a ver a continuacin en qu consiste cada una. Unin de tablas. La unin de tablas en una consulta produce como resultado la unin, en el sentido algebraico de la teora de conjuntos, de las filas de ambas tablas, es decir, produce una nueva tabla que tiene todas las filas de la primera tabla y a continuacin tambin todas las filas de la segunda tabla. Por supuesto las filas de ambas tablas deben tener el mismo nmero de columnas y del mismo tipo. Tambin es posible utilizar la unin de consultas SELECT. Por ejemplo, si queremos tener una lista de los empleados que pertenecen al departamento 04, unidos a aquellos cuyo jefe es el empleado A11: (SELECT * FROM empleado WHERE cddep='04') UNION (SELECT * FROM empleado WHERE cdjefe='A11') Composicin de tablas. En este tipo de combinacin de tablas las filas de una tabla se concatenan a las filas de la otra tabla. A esto se le llama JOIN de tablas. Vamos a explicarlo con un ejemplo. Si quisiramos listar los nombres de los empleados, junto con el nombre del departamento donde trabajan, deberamos obtener datos de la tabla empleado (nombre del empleado) y de la tabla departamento (nombre de departamento). En SQL quedara as: SELECT empleado.nombre,departamento.nombre FROM empleado, departamento WHERE empleado.cddep=departamento.cddep Veamos algunas consideraciones sobre la composicin (JOIN) de tablas apoyndonos en el ejemplo anterior: o Las consultas combinadas suelen relacionar tablas por medio de una columna comn que es clave primaria en una tabla y externa en la otra. En el ejemplo, la columna cddep es clave primaria en la tabla departamento y es clave externa en la tabla empleado. Siempre que exista ambigedad ser necesario utilizar la notacin <tabla>.<columna> , y en general es una buena costumbre utilizarla en cualquier caso. En el ejemplo anterior existen las columnas nombre y cddep en ambas tablas de combinacin, por lo que es necesario indicar a cul nos referimos exactamente. Se pueden componer filas de una tabla con filas de esa misma tabla. En este caso deberemos emplear alias de tabla para no cometer ambigedades.
Lo anterior es un ejemplo del tipo de composicin ms sencillo, el producto cartesiano. Consiste en combinar todas las filas de una tabla con todas las filas de la otra, y luego seleccionar slo las filas en las que coincide el campo clave comn, que se usa para hacer el JOIN, y dejar una sola vez esa columna comn. Esto es el producto cartesiano en trminos de teora de conjuntos si las filas de cada tabla fuesen los elementos de dos conjuntos, que se complementa con una condicin WHERE que selecciona qu filas del producto cartesiano formarn el resultado final del JOIN. Piensa que en vez de tablas de bases de datos estuvieras manejando esas mismas tablas pero impresas en papel, cada una en una hoja. La forma de encontrar la informacin que se pide, cul sera? Pues empezaramos con la primera fila de la primera tabla empleado, nos fijaramos en el nombre del primer empleado, y en el cdigo del departamento en el que trabaja, para a continuacin empezar a comparar ese cdigo de departamento con el de todas las filas de la tabla departamentos en la segunda hoja, hasta que encontrramos una coincidencia. Entonces nos fijaramos en el nombre de ese departamento y lo anotaramos junto al nombre del empleado. Y volveramos a repetir el proceso con todas las filas de la tabla empleado. Pues bien, ms o menos es lo mismo que hace automticamente la composicin (JOIN) Existen otros tipos de composicin ligeramente diferentes al anterior. Los veremos a continuacin. o Composicin interna INNER JOIN: Bsicamente funciona igual que el producto cartesiano slo que utiliza ndices para agilizar el tiempo en obtener el resultado. Empareja las filas de una tabla buscando directamente en las filas de la otra tabla las filas que cumplen la condicin, esto lo consigue usando el ndice. La sintaxis es la siguiente: SELECT <lista_de_expresiones> FROM <tabla1> INNER JOIN <tabla2> ON <expresin_composicin> En donde <expresin_composicin> es la combinacin por medio de un operador de comparacin (<, >, <=, >=, =, <>) de dos columnas procedentes de cada tabla. Por ejemplo, si queremos resolver de forma ms eficiente el ejemplo propuesto cuando tratamos la composicin por producto cartesiano, listado de nombres de los empleados junto con el nombre del departamento donde trabajan. Podemos escribir: SELECT e.nombre, d.nombre FROM empleado e INNER JOIN departamento d ON e.cddep=d.cddep Observa adems el uso de alias de tablas, aunque no es necesario en este caso nos ahorra escribir repetidamente el nombre de las tablas. o Composiciones externas LEFT JOIN y RIGHT JOIN: En el caso de las composiciones producto cartesiano e INNER JOIN se concatenan filas de dos tablas que constan de una columna y valores comunes. Pero si alguna de las filas de las tablas a componer tienen valores nulos (NULL) en alguna de sus filas, o el valor que contienen no coincide con ninguno de los de la otra tabla, se pierden esas filas en la composicin resultado, lo cual puede hacer aparecer resultados errneos. Para corregir este comportamiento se utilizan las composiciones LEFT JOIN y RIGHT JOIN. En ambos casos las filas con valores nulos en las columnas de composicin, o con valores no coincidentes en ambas tablas de composicin son tenidas en cuenta. LEFT JOIN aade al resultado del INNER JOIN las filas de la tabla izquierda que no tienen correspondencia en la tabla de la derecha, RIGHT JOIN hace lo propio con las filas de la tabla derecha. Veamos un par de ejemplos:
SELECT e.nombre, d.nombre FROM empleado e LEFT JOIN departamento d ON e.cddep=d.cddep El resultado es el INNER JOIN de ambas tablas, ms los empleados que no estn asignados a ningn departamento.
SELECT e.nombre, d.nombre FROM empleado e RIGHT JOIN departamento d ON e.cddep=d.cddep El resultado es el INNER JOIN de ambas tablas ms los departamentos donde no hay empleados en este momento. Para que entiendas mejor las diferencias entre las distintas composiciones estudiadas hemos confeccionado una animacin que te aclarar de forma grfica esas diferencias.
3. Funciones SQL.
. En los apartados anteriores hemos hecho mencin a expresiones como combinacin de columnas y operadores. SQL tambin dispone de una extensa gama de funciones que pueden ser utilizadas en las expresiones. Tpicamente las expresiones constan de un nombre y aceptan unos parmetros entre parntesis para devolver un valor. <nombre_funcin>(<parmetro1>,<parmetro2>,) Aunque hay otros, los grupos fundamentales de funciones son: o o o o o Funciones de control de flujo Funciones de caracteres. Funciones numricas. Funciones de fecha y hora. Funciones de conversin.
No sera posible estudiarlas todas ya que son varios cientos, por lo que te remitimos al siguiente enlace donde puedes ver la lista completa, y al que debers acudir a documentarte cada vez que tengas dudas al usar alguna de ellas.
A continuacin trataremos las ms importantes y utilizadas. Funciones de control de flujo. o IF(<expresin1>,<expresin2>,<expresin3>) : Devuelve <expresin2> o <expresin3> en funcin de si <expresin1> es VERDAD o FALSO respectivamente. Ejemplo: SELECT IF(3>5, 'verdad','falso') Devuelve falso. o IFNULL(<expresin1>,<expresin2>) : Devuelve <expresin1> si <expresin1> es distinto de NULL, en otro caso devuelve <expresin2>.
Ejemplo: SELECT IFNULL(cddep,'Desconocido') Devuelve 'Desconocido' para los cddep que sean NULL, en los dems quedan como estn. Es muy til en consultas que devuelven valores nulos para cambiarlos por un valor descriptivo. Funciones de caracteres o CHAR_LENGTH(<cadena>): Devuelve un entero que es la longitud de la cadena de caracteres. Ejemplo: SELECT CHAR_LENGTH('Hola')Devuelve 4. o CONCAT(<cadena1>,<cadena2>,...) : Concatena las cadenas de caracteres. Ejemplo: SELECT CONCAT('H','o','l','a') Devuelve Hola. INSTR(<cadena>,<subcadena>): Devuelve la posicin de la primera ocurrencia de la subcadena dentro de la cadena. Ejemplo: SELECT INSTR('Hola', 'ol') Devuelve 2. o LOWER(<cadena>) : Pasa la cadena a minsculas. Ejemplo: SELECT LOWER('HOLA') Devuelve hola UPPER(<cadena>) : Pasa la cadena a maysculas. Ejemplo: SELECT UPPER('hola') Devuelve HOLA.
RTRIM(<cadena>) y LTRIM(<cadena>) : Devuelve la cadena sin espacios en blanco a la derecha (RTRIM) o izquierda (LTRIM). Hola ')) Devuelve 'Hola'. o
SUBSTR(<cadena>,<posicin>,<longitud>) : Devuelve la subacadena de longitud <longitud> a partir de la posicin <posicin> de la cadena <cadena>. Ejemplo: SELECT SUBSTR('Hola',2,2) Devuelve ol.
Funciones numricas o ABS(<nmero>) : Devuelve el valor absoluto de un nmero. Ejemplo: SELECT ABS(-21) Devuelve 21. o CEIL(<nmero>): Devuelve el entero ms pequeo no menor que nmero. Ejemplo: SELECT CEIL(21.9) Devuelve 22. MOD(<numero1>,<nmero2>) : Devuelve el resto de la divisin entera entre <numero1> y <numero2>. Ejemplo: SELECT MOD(18,7) Devuelve 4. ROUND(<nmero>) : Devuelve el redondeo al entero ms cercano. Ejemplos: SELECT ROUND(20.7) Devuelve 21. SELECT ROUND(20.3) Devuelve 20. TRUNCATE(<nmero>,<Posiciones_decimales>): Devuelve el nmero con las posiciones decimales dadas sin redondeo. Ejemplo: SELECT TRUNCATE(68.99999,2) Devuelve 68.99.
Funciones de fecha y hora o ADDDATE(<fecha>,<numero_dias>) : Devuelve la fecha proporcionada, incrementada en el nmero de das indicado. Ejemplo: SELECT ADDDATE('2005-04-19',15) Devuelve '2005-05-04'. CURDATE() : Devuelve la fecha actual del sistema. CURTIME() : Devuelve la hora actual del sistema.
o o
DATEDIFF(<fecha1>,<fecha2>): Devuelve el nmero de das entre las dos fechas. Ejemplo: SELECT DATEDIFF('2005-04-19','2005-04-2') Devuelve 17. DATE_FORMAT(<fecha>,<formato>) : Devuelve la fecha formateada segn el formato especificado. Ejemplo: SELECT DATE_FORMAT('2005-04-19', '%d %m %Y') Devuelve '19 04 2005' (Consultar la documentacin de MySQL para ver los formatos posibles). DAY(<fecha>) : Devuelve el da del mes de una fecha. Ejemplo: SELECT DAY('2005-04-19'). Devuelve 19. MONTH(<fecha>) : Devuelve el mes de un fecha. Ejemplo: SELECT MONTH('2005-04-19'). Devuelve 4. NOW() : Devuelve la fecha y hora del sistema. YEAR(<fecha>): Devuelve el ao de un fecha. Ejemplo: SELECT YEAR('2005-04-19'). Devuelve 2005.
o o
Funciones de conversin: o CONVERT(<expresion>,<tipo_dato>): Devuelve la expresin convertida al tipo de dato suministrado. Ejemplo: SELECT CONVERT(21,DECIMAL) Devuelve 21.00. CAST(<expresin> AS <tipo_dato>) : Anloga a la anterior.
Otras funciones: o PASSWORD(<cadena>) : Devuelve la cadena encriptada en el formato de encriptacin usado por MySQL. Ejemplo: SELECT PASSWORD('Hola') Devuelve '*70E61FCD7F1FC3F6D951F0A36510223608C1141A'. Esta funcin es til para encriptar contraseas de nuestras aplicaciones. La encriptacin es en un solo sentido.
4. Vistas.
En este tema has podido comprobar la versatilidad y potencia del leguaje SQL en su faceta de manipulacin de datos. Tambin has visto que algunas sentencias son laboriosas de escribir. Es necesario volver a escribirlas cada vez que quiero obtener la misma informacin? Tendr, por ejemplo, que escribir cada mes la consulta para obtener la lista de los trabajadores que ms han trabajado, o la lista de trabajadores asignados a cada proyecto cada vez que haya cambios en los departamentos o en los proyectos? Es un poco tedioso, no?, porque aunque la informacin obtenida cambie en cada momento segn la informacin que contenga la base de datos, la sentencia SQL necesaria va a ser siempre la misma. Una primera solucin sera escribir la sentencia en un script SQL, de forma que podamos ejecutarla cada vez que sea necesario sin tener que volver a teclearla. Sin embargo, hay una solucin todava mejor: Crear una vista, con un nombre, que usaremos como si fuera una tabla de la base de datos que contiene justo la informacin que deseamos, aunque no exista realmente como tabla en la base de datos.
Nos va a permitir obtener la informacin que deseamos de forma ms simple. Adems nos va a permitir hacer consultas distintas usando la vista creada como una tabla ms.
De esta forma, mediante las vistas, la base de datos presenta para los usuarios un aspecto ms adecuado a las necesidades de cada uno, permitindole trabajar a cada uno como si la base de datos tuviera distintas tablas en cada caso, aunque el almacenamiento fsico sea nico. Es decir, en SQL existe una forma de poder almacenar sentencias SQL para simplificar su manejo: Son las vistas. Una vista no es ms que una sentencia SQL almacenada que puede ser lanzada (ejecutada) sin tener que volver a escribirla, y que funcionalmente acta cmo si fuera una tabla ms. Se puede crear una vista con la sintaxis bsica: CREATE VIEW <nombre_vista> (<columnas>) AS <sentencia_select> Veamos un ejemplo. En la empresa de nuestras prcticas se requiere a menudo una lista de nombres de proyecto y la suma de horas trabajadas en cada uno de ellos. Se podra crear una vista que resumiese esa consulta con un nombre descriptivo como horas_trabajadas_por_proyecto. CREATE VIEW horas_trabajadas_por_proyecto (proyecto,horas_trabajadas) AS SELECT p.nombre,SUM(t.nhoras) FROM proyecto p LEFT JOIN trabaja t ON p.cdpro=t.cdpro GROUP BY p.nombre A partir de ese momento podramos obtener el listado requerido con slo escribir: SELECT * FROM horas_trabajadas_por_proyecto Al ser tratada como una tabla se podran hacer consultas basadas en la vista. Por ejemplo, lista de proyectos con ms de 100 horas trabajadas. SELECT * FROM horas_trabajadas_por_proyecto WHERE horas_trabajadas >= 100 Para borrar una vista se emplea DROP VIEW <nombre_vista>. Por supuesto las tablas subyacentes no se vern afectadas por el borrado de la vista.