Consulta de datos SELECT [ALL | DISTINCT] [colum1, ..column | *] FROM tabla1, .., tablan [WHERE condicion] [ORDER BY colum1 [DESC | ASC], colum1 [DESC | ASC],…] ; Consulta de datos • FROM, obligatoria, se especifican las tablas donde está la información necesaria. – SELECT * FROM emp; • Se puede poner alias a las tablas – SELECT * FROM emp e; Consulta de datos • WHERE condición – expresión operador expresión • Operadores – IN, NOT IN, BETWEEN, NOT BETWEEN, LIKE • Condiciones múltiples – AND, OR, NOT y ( ) • SELECT ename FROM EMP where SAL > 1000; – WHERE (SAL > 1000) AND (COMM IS NOT NULL) – WHERE (comm IS NULL) AND (UPPER(ENAME) =‘MARY’) Consulta de datos • ORDER BY colum [ASC |DESC], … – Por defecto es ASC. – SELECT ename FROM emp ORDER BY sal * 12; • si tiene 2 o más criterios de ordenación, el principal es el más a la izquierda y dentro de este los siguientes. SELECT ename, job, sal * 12 AS salario_anual FROM emp ORDER BY job ASC, sal * 12 DESC; Consulta de datos • ALL, recupera todas las filas, opción por defecto. • DISTINCT, recupera las filas distintas. SELECT DISTINCT deptno FROM emp; SELECT DISTINCT sal FROM emp; Proyección SELECT [ALL|DISTINCT] colum1, ..column FROM tabla1,…tablan; Todas las columnas SELECT empno, ename,… FROM EMP; SELECT * FROM emp; Algunas columnas SELECT deptno, dname from dept; Selección de filas • Es necesaria la clausula: WHERE condicion. SELECT ename, job, mgr FROM emp WHERE deptno = 10 ORDER BY job, ename; SELECT * FROM emp WHERE job = ‘CLERK’ AND deptno = 10 ORDER BY deptno, ename; ALIAS a columnas • Si el nombre (aparece como cabecera ) de la columna resulta demasiado largo, corto o críptico, se puede hacer uso de los alias. SELECT ename as nombre_empleado, dname as nombre_departamento FROM emp e, dept d WHERE e.deptno = d.deptno; Comparación de cadenas =, para comparar cadenas enteras. Si deseamos los empleados que empiezan por‘P’, usaremos LIKE y los comodines % cualquier cadena de 0 o más caracteres. - Cualquier carácter en la posición donde se encuentre el – En c. WHERE columna LIKE ‘cadena_car’ Comparación de cadenas LIKE ‘ANALYST’ LIKE ‘M%’ LIKE ‘%X%’ LIKE ‘_ _M’ LIKE ‘N _’ LIKE ‘_ R%’ Se distinguen mayúsculas de las minúsculas NULL, NOT NULL NULL, columna vacía SELECT ename FROM emp WHERE comm IS NULL; NOT NULL, columna llena SELECT ename FROM emp WHERE comm IS NOT NULL; Pertenencia a un conjunto • Operador IN. comprueba si una expresión pertenece o no a un conjunto de valores. • Formato: Expresion [NOT] IN ( lista de valores) SELECT ename FROM emp WHERE deptno IN (10, 20); SELECT ename FROM emp WHERE deptno NOT IN (30, 40); Pertenencia a un rango • BETWEEN, comprueba si un valor o no está comprendido en un rango de valores. • Formato: Expresion [NOT] BETWEEN valor_inicial AND valor_final SELECT ename FROM emp WHERE sal BETWEEN 1000 and 2000; SELECT ename FROM emp WHERE sal NOT BETWEEN 1000 AND 2000; Combinación AND, OR y NOT • Orden de prioridad en la evaluación : NOT AND OR SELECT ename, sal, deptno from emp WHERE sal > 2000 AND (deptno = 10 OR deptno = 20); La misma sin paréntesis que significaría? Como sería con IN? Subconsultas Consultas que forman parte de WHERE en otra SELECT SELECT …………… FROM ……… WHERE columna operador_comparacion (SELECT …. WHERE… ); Subconsultas Obtén los nombres de los empleados con el mismo oficio que Gil. SELECT job FROM emp WHERE ename = ‘Gil’; SELECT ename FROM emp WHERE job = ‘ANALYST’; SELECT ename FROM emp WHERE job = (SELECT job FROM emp WHERE ename = ‘Gil’); Ejercicio • Muestra nombre, oficio, salario y fecha de ingreso de los empleados que tengan el mismo oficio que JAMES o que tengan un salario mayor o igual que MILLER. Condiciones de búsqueda en subconsultas • Las subconsultas aparecen como parte de una condición de búsqueda de una cláusula WHERE o HAVING. • Las condiciones de búsqueda son: – Test de comparación en subconsultas(<, >..) – Test de pertenencia a un conjunto de valores (IN). – Test de existencia (EXISTS, NO EXISTS). – Test de comparación cuantificada (ANY, ALL). Condiciones de búsqueda en subconsultas Test de comparación en subconsultas(<, >, =, >=, <=, <>, !=). Compara el valor de una expresión con un valor único producido por una subconsulta. SELECT ename FROM emp WHERE job = (SELECT job FROM emp WHERE ename = ‘JAMES’); Condiciones de búsqueda en subconsultas Test de pertenencia a un conjunto de valores (IN). Comprueba el valor de una expresión con uno de los valores producido por una Subconsulta. SELECT ename FROM emp WHERE job IN (SELECT job FROM emp WHERE deptno = 20); Condiciones de búsqueda en subconsultas Test de existencia (EXISTS, NO EXISTS). Examina si una subconsulta produce alguna fila de resultado(TRUE o FALSE) SELECT dname FROM dept WHERE EXISTS (SELECT * FROM emp WHERE emp.deptno = dept.deptno); Condiciones de búsqueda en subconsultas Test de comparación cuantificada (ANY, ALL). Se usan junto a <, >, = ,... ANY, compara el valor de una expresión con cada uno del conjunto de valores producido por una subconsulta, si alguna de las comparaciones devuelve TRUE, ANY devuelve TRUE, si la subconsulta no devuelve nada, devolverá FALSE. Condiciones de búsqueda en subconsultas ANY, ejemplo SELECT * FROM emp WHERE sal = ANY (SELECT sal FROM emp WHERE deptno = 30); Condiciones de búsqueda en subconsultas ALL, compara el valor de una expresión con cada uno del conjunto de valores producido por una subconsulta, si todas las comparaciones devuelven TRUE, ALL devuelve TRUE, en caso contrario, devolverá FALSE. Condiciones de búsqueda en subconsultas ALL, ejemplo. SELECT * FROM emp WHERE sal < ALL (SELECT sal FROM emp WHERE deptno = 30); Subconsultas que generan valores simples Devuelven una fila o valor simple, se usan <, >.., si la subconsulta produce más de un valor se origina un error. SELECT ename FROM emp WHERE job = (SELECT job FROM emp WHERE deptno = 20); Subconsultas que generan listas de valores Devuelven más de una fila o más de un valor, usaremos el operador IN en la c. WHERE. SELECT ename FROM emp WHERE job IN (SELECT job FROM emp WHERE deptno = 20); Ejemplo Visualizar los datos de los empleados que trabajan en DALLAS o CHICAGO SELECT * FROM emp WHERE deptno IN (SELECT deptno FROM dept WHERE loc IN (‘DALLAS’, ‘CHICAGO’)); Ejemplo Consulta los nombres y oficios de los empleados del departamento 20 cuyo oficio sea igual al de cualquiera de los empleados del departamento SALES. SELECT ename, job FROM emp WHERE deptno = 20 AND job IN (SELECT job FROM emp WHERE deptno = (SELECT deptno FROM dept WHERE dname =‘SALES’)); Ejemplo Consulta los apellidos de los empleados con el mismo oficio y salario que JAMES. SELECT ename, sal FROM emp WHERE (job, sal) = (SELECT job, sal FROM emp WHERE ename = ‘JAMES’); Ejemplo El mismo de otra forma SELECT ename, sal FROM emp WHERE job =(SELECT job FROM emp WHERE ename = ‘JAMES’) AND sal =(SELECT sal FROM emp WHERE ename = ‘JAMES’); Combinación de tablas A veces las consultas necesitan datos de 2 o más tablas, se indican a continuación de FROM. Formato: SELECT columnas de las tablas FROM tabla1, tabla2… WHERE tabla1.columna1 = tabla2.columna2; Combinación de tablas Reglas: Se pueden unir tantas tablas como deseemos. En SELECT se pueden citar columnas de todas las tablas. Si hay columnas con el mismo nombre en varias tablas, se pueden especificar como: Nombre_tabla.nombre_columna. La condicion de combinación se especifica en WHERE. Si se omite se obtiene el producto cartesiano. Combinación de tablas Consultar nombre de empleados, salario, nombre del departamento al que pertenecen y localidad de este. SELECT ename, sal, dname, loc FROM emp e, dept d WHERE e.deptno = d.deptno; Ejercicios • Visualiza los nombres de los empleados con un salario entre 500 y 1000, cuyo oficio sea MANAGER. • Visualiza los nombres de los departamentos que no tengan empleados. • Visualiza los nombres de los departamentos que tengan algún empleado. Funciones en SQL • Funciones: Se usan con expresiones y actúan con valores de columnas, variables y ctes. Se usan en cláusulas SELECT, WHERE Y ORDER BY. • Hay 5 tipos: – Aritméticas. – De cadena de caracteres. – De manejo de fechas. – De conversión. – Otras funciones. Funciones aritméticas • De valores simples: ABS(n)= Devuelve el valor absoluto de (n). CEIL(n)=Obtiene el valor entero inmediatamente superior o igual a "n". FLOOR(n) = Devuelve el valor entero inmediatamente inferior o igual a "n". MOD (m, n)= Devuelve el resto resultante de dividir "m" entre "n". POWER (m, exponente)= Calcula la potencia de un numero. ROUND (numero [, m])= Redondea números con el numero de decimales indicado. SIGN (valor)= Indica el signo del "valor". SQRT(n)= Devuelve la raíz cuadrada de "n". TRUNC (numero, [m])= Trunca números para que tengan una cierta cantidad de decimales – http://dev.mysql.com/doc/refman/5.0/en/mathematical-functions.html Ejemplos SELECT ename, sal, ABS(sal - 10000) from emp; SELECT CEIL(20.3), CEIL(16), CEIL(-20.3), CEIL(-16) FROM DUAL ; SELECT FLOOR(20.3), FLOOR(16), FLOOR(-20.3), FLOOR(-16) FROM DUAL ; SELECT MOD(11,4), MOD(10, -15), MOD(-10, -3), MOD(10.4, 4.5) FROM DUAL; SELECT POWER(2, 4), POWER(2, -4), POWER(3.5, 2.4), POWER(4.5, 2) FROM DUAL; SELECT ROUND(1.56, 1), ROUND(1.56), ROUND(1.2234, 2), ROUND(1.2676, 3) FROM DUAL; SELECT ROUND(145.5, -1), ROUND(145.5, -2), ROUND(145.5, -3), ROUND(141, -1), ROUND(145, -1) FROM DUAL; Ejemplos SELECT SIGN(-10), SIGN(10) FROM DUAL; SELECT SQRT(25), SQRT(25.6) FROM DUAL; SELECT TRUNC(1.5634, 1), TRUNC(1.1684, 2), TRUNC(1.662) FROM DUAL; SELECT TRUNC(187.98, -1), TRUNC(187.98, -2), TRUNC(187.98, -3) FROM DUAL; Funciones de agregación Funciones de grupos de valores: AVG(n)= Calcula el valor medio de "n" ignorando los valores nulos. COUNT (* | Expresión)= Cuenta el numero de veces que la expresión evalúa algún dato con valor no nulo. La opción "*" cuenta todas las filas seleccionadas. MAX (expresión)= Calcula el máximo. MIN (expresión)= Calcula el mínimo. SUM (expresión)= Obtiene la suma de los valores de la expresión. • http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html Ejemplos SELECT AVG(SAL) FROM EMP WHERE DEPTNO = 10; SELECT COUNT(*) FROM EMP; SELECT COUNT(COMM) FROM EMP; SELECT MAX(SAL) FROM EMP; SELECT MAX(ENAME) FROM EMP; SELECT MIN(SAL) FROM EMP; SELECT MIN(ENAME) FROM EMP; SELECT SUM(SAL) FROM EMP; SELECT VARIANCE(SAL) FROM EMP; SELECT COUNT(DISTINCT(JOB)) FROM EMP; Funciones aritméticas Funciones de listas. GREATEST (valor1, valor2…)= Obtiene el mayor valor de la lista. LEAST (valor1, valor2…)= Obtiene el menor valor de la lista. Ejemplos SELECT ENAME, GREATEST(SAL, NVL(COMM, 0)), LEAST(SAL, NVL(COMM, 0)) FROM EMP; Funciones de cadenas de caracteres CHR(n) = Devuelve el carácter cuyo valor en binario es equivalente a "n". CONCAT (cad1, cad2)= Devuelve "cad1" concatenada con "cad2". LOWER (cad)= Devuelve la cadena "cad" en minúsculas. UPPER (cad)= Devuelve la cadena "cad" en mayúsculas. LPAD (cad1, n[,cad2])= Añade caracteres a la izquierda de la cadena hasta que tiene una cierta longitud. RPAD (cad1, n[,cad2])= Añade caracteres a la derecha de la cadena hasta que tiene una cierta longitud. Funciones de cadenas de caracteres LTRIM (cad [,set])= Suprime un conjunto de caracteres a la izquierda de la cadena. RTRIM (cad [,set])= Suprime un conjunto de caracteres a la derecha de la cadena. REPLACE (cad, cadena_busqueda [, cadena_sustitucion])= Sustituye un carácter o caracteres de una cadena con 0 o mas caracteres. SUBSTR (cad, m [,n])= Obtiene parte de una cadena. • http://dev.mysql.com/doc/refman/5.0/en/string-functions.html Ejemplos SELECT CHR(75), CHR(65) FROM DUAL; SELECT CONCAT('El nombre es: ', ename) FROM EMP; SELECT LOWER('oRACLe Y sql'), UPPER('oRACLe Y sql'), INITCAP('oRACLe Y sql') FROM DUAL; SELECT LPAD(ENAME, 20, '.'), RPAD(ENAME, 20, '.') FROM EMP; SELECT LTRIM(' HOLA'), RTRIM(' ADIOS') FROM DUAL; SELECT REPLACE ('BLANCO Y NEGRO', 'O', 'AS') FROM DUAL; SELECT SUBSTR(ENAME, 1, 1) FROM EMP; Funciones que devuelven valores numéricos ASCII(cad)= Devuelve el valor ASCII de la primera letra de la cadena "cad". INSTR (cad1, cad2 [, comienzo [,m]])= Permite una búsqueda de un conjunto de caracteres en una cadena pero no suprime ningún carácter después. LENGTH (cad)= Devuelve el numero de caracteres de cad. Ejemplos SELECT ASCII('A') FROM DUAL; SELECT INSTR('II VUELTA CICLISTA A TALAVERA', 'TA', 3,2) FROM DUAL; SELECT INSTR('II VUELTA CICLISTA A TALAVERA', 'A', -1) FROM DUAL; SELECT ENAME, LENGTH(ENAME) FROM EMP; Funciones para manejo de fechas CURDATE()= Devuelve la fecha del sistema. DATE_FORMAT(fecha,formato): símbolo '%' seguido de una letra que define el formato. Nosotros hemos utilizado: %Y: devuelve el año en formato largo (2002); %m: devuelve el mes en formato de dos cifras (01/12); %m: devuelve el día en formato de dos cifras (01/31); cha2". ADDDATE(fecha INTERVAL tiempo): añade 'tiempo' a 'fecha'. TO_DAYS(fecha): devuelve el numero de días desde el 1 de enero del año 0 DATEDIFF(fecha1,fecha2), que devuelve el número de días entre la fecha1 y la fecha 2 http://dev.mysql.com/doc/refman/5.0/es/date-and-time-functions.html. Funciones de conversión CAST(exp as type) • type puede ser uno de los siguientes valores: • BINARY • CHAR • DATE • DATETIME • DECIMAL • SIGNED [INTEGER] • TIME • UNSIGNED [INTEGER]