8. Selección de todas las columnas DEPTNO DNAME LOC --------- -------------- ------------- 10 ACCOUNTING NEW YORK 20 RESEARCH DALLAS 30 SALES CHICAGO 40 OPERATIONS BOSTON SQL> SELECT * 2 FROM dept;
9. Selección Especifica de Columnas DEPTNO LOC --------- ------------- 10 NEW YORK 20 DALLAS 30 CHICAGO 40 BOSTON SQL> SELECT deptno, loc 2 FROM dept;
10. Uso de Operadores Aritméticos Operador + - * / Descripción Suma Resta Multiplicación División
11. Uso de Operadores Aritméticos SQL> SELECT ename, sal, sal+300 2 FROM emp; ENAME SAL SAL+300 ---------- --------- --------- KING 5000 5300 BLAKE 2850 3150 CLARK 2450 2750 JONES 2975 3275 MARTIN 1250 1550 ALLEN 1600 1900 ... 14 rows selected.
12.
13. Uso de alias SQL> SELECT ename AS name, sal salary 2 FROM emp; NAME SALARY ------------- --------- ... SQL> SELECT ename "Name", 2 sal*12 "Annual Salary" 3 FROM emp; Name Annual Salary ------------- ------------- ...
14.
15.
16.
17. Cláusula WHERE SQL> SELECT ename, job, deptno 2 FROM emp 3 WHERE job='CLERK'; ENAME JOB DEPTNO ---------- --------- --------- JAMES CLERK 30 SMITH CLERK 20 ADAMS CLERK 20 MILLER CLERK 10
18. Campos de Tipo Carácter SQL> SELECT ename, job, deptno 2 FROM emp 3 WHERE ename = 'JAMES';
19. Operadores de Comparación SQL> SELECT ename, sal, comm 2 FROM emp 3 WHERE sal<=comm; ENAME SAL COMM ---------- --------- --------- MARTIN 1250 1400 Operador = > >= < <= <> Significado Igual a Mayor que Mayor que o igual a Menor que Menor que o igual a No igual a
20. Otros Operadores Operador BETWEEN ...AND... IN(list) LIKE IS NULL Significado Entre dos valores (inclusive) Lista de valores Se ajusta a un patrón Es un valor nulo
21.
22.
23.
24.
25. Operadores Lógicos Operador AND OR NOT Significado Devuelve TRUE si ambas condiciones son TRUE Devuelve TRUE si alguna de las condiciones es TRUE Devuelve TRUE si la siguiente condición es FALSE
26.
27.
28. Operador NOT SQL> SELECT ename, job 2 FROM emp 3 WHERE job NOT IN ('CLERK','MANAGER','ANALYST'); ENAME JOB ---------- --------- KING PRESIDENT MARTIN SALESMAN ALLEN SALESMAN TURNER SALESMAN WARD SALESMAN
29.
30.
31. Consulta a Varias tablas EMPNO DEPTNO LOC ----- ------- -------- 7839 10 NEW YORK 7698 30 CHICAGO 7782 10 NEW YORK 7566 20 DALLAS 7654 30 CHICAGO 7499 30 CHICAGO ... 14 rows selected. EMP DEPT EMPNO ENAME ... DEPTNO ------ ----- ... ------ 7839 KING ... 10 7698 BLAKE ... 30 ... 7934 MILLER ... 10 DEPTNO DNAME LOC ------ ---------- -------- 10 ACCOUNTING NEW YORK 20 RESEARCH DALLAS 30 SALES CHICAGO 40 OPERATIONS BOSTON
32.
33.
34.
35. ¿Qué es un Equijoin? EMP DEPT EMPNO ENAME DEPTNO ------ ------- ------- 7839 KING 10 7698 BLAKE 30 7782 CLARK 10 7566 JONES 20 7654 MARTIN 30 7499 ALLEN 30 7844 TURNER 30 7900 JAMES 30 7521 WARD 30 7902 FORD 20 7369 SMITH 20 ... 14 rows selected. DEPTNO DNAME LOC ------- ---------- -------- 10 ACCOUNTING NEW YORK 30 SALES CHICAGO 10 ACCOUNTING NEW YORK 20 RESEARCH DALLAS 30 SALES CHICAGO 30 SALES CHICAGO 30 SALES CHICAGO 30 SALES CHICAGO 30 SALES CHICAGO 20 RESEARCH DALLAS 20 RESEARCH DALLAS ... 14 rows selected. Primary key Foreign key
36. Recuperación de Registros con Equijoins SQL> SELECT emp.empno, emp.ename, emp.deptno, 2 dept.deptno, dept.loc 3 FROM emp, dept 4 WHERE emp.deptno=dept.deptno; EMPNO ENAME DEPTNO DEPTNO LOC ----- ------ ------ ------ --------- 7839 KING 10 10 NEW YORK 7698 BLAKE 30 30 CHICAGO 7782 CLARK 10 10 NEW YORK 7566 JONES 20 20 DALLAS ... 14 rows selected.
37.
38. Combinando Más de Dos Tablas NAME CUSTID ----------- ------ JOCKSPORTS 100 TKB SPORT SHOP 101 VOLLYRITE 102 JUST TENNIS 103 K+T SPORTS 105 SHAPE UP 106 WOMENS SPORTS 107 ... ... 9 rows selected. CUSTOMER CUSTID ORDID ------- ------- 101 610 102 611 104 612 106 601 102 602 106 604 106 605 ... 21 rows selected. ORD ORDID ITEMID ------ ------- 610 3 611 1 612 1 601 1 602 1 ... 64 rows selected. ITEM
39. Non-Equijoins EMP SALGRADE EMPNO ENAME SAL ------ ------- ------ 7839 KING 5000 7698 BLAKE 2850 7782 CLARK 2450 7566 JONES 2975 7654 MARTIN 1250 7499 ALLEN 1600 7844 TURNER 1500 7900 JAMES 950 ... 14 rows selected. GRADE LOSAL HISAL ----- ----- ------ 1 700 1200 2 1201 1400 3 1401 2000 4 2001 3000 5 3001 9999 “ el salario en la tabla EMP, está entre el salario más bajo y el salario más alto de la tabla SALGRADE”
40. Recuperación de Registros con Non-Equijoins ENAME SAL GRADE ---------- --------- --------- JAMES 950 1 SMITH 800 1 ADAMS 1100 1 ... 14 rows selected. SQL> SELECT e.ename, e.sal, s.grade 2 FROM emp e, salgrade s 3 WHERE e.sal 4 BETWEEN s.losal AND s.hisal;
41. Outer Joins EMP DEPT ENAME DEPTNO ----- ------ KING 10 BLAKE 30 CLARK 10 JONES 20 ... DEPTNO DNAME ------ ---------- 10 ACCOUNTING 30 SALES 10 ACCOUNTING 20 RESEARCH ... 40 OPERATIONS No hay empleados en el departamento OPERATIONS
42.
43. Uso de Outer Joins SQL> SELECT e.ename, d.deptno, d.dname 2 FROM emp e, dept d 3 WHERE e.deptno(+) = d.deptno 4 ORDER BY e.deptno; ENAME DEPTNO DNAME ---------- --------- ------------- KING 10 ACCOUNTING CLARK 10 ACCOUNTING ... 40 OPERATIONS 15 rows selected.
44. Self Joins EMP (WORKER) EMP (MANAGER) EMPNO ENAME MGR ----- ------ ---- 7839 KING 7698 BLAKE 7839 7782 CLARK 7839 7566 JONES 7839 7654 MARTIN 7698 7499 ALLEN 7698 EMPNO ENAME ----- -------- 7839 KING 7839 KING 7839 KING 7698 BLAKE 7698 BLAKE “ MGR en la tabla WORKER es igual a EMPNO en la tabla MANAGER”
45. Combinación de una Tabla Consigo Misma WORKER.ENAME MANAGER.MANAG ------------------------------- BLAKE KING CLARK KING JONES KING MARTIN BLAKE ... 13 rows selected. SQL> SELECT worker.ename,manager.ename 2 FROM emp worker, emp manager 3 WHERE worker.mgr = manager.empno;
49. COUNT(*) --------- 6 SQL> SELECT COUNT(*) 2 FROM emp 3 WHERE deptno = 30; SQL> SELECT COUNT(comm) 2 FROM emp 3 WHERE deptno = 30; COUNT(COMM) ----------- 4
50. Creando Grupos de Datos EMP “ media de salarios en EMP para cada departamento” DEPTNO SAL --------- --------- 10 2450 10 5000 10 1300 20 800 20 1100 20 3000 20 3000 20 2975 30 1600 30 2850 30 1250 30 950 30 1500 30 1250 DEPTNO AVG(SAL) ------- --------- 10 2916.6667 20 2175 30 1566.6667 2916.6667 2175 1566.6667
51.
52.
53. Exclusión de Resultados de un Grupo “ máximo salario por departamento mayor de 2900$” EMP DEPTNO SAL --------- --------- 10 2450 10 5000 10 1300 20 800 20 1100 20 3000 20 3000 20 2975 30 1600 30 2850 30 1250 30 950 30 1500 30 1250 DEPTNO MAX(SAL) --------- --------- 10 5000 20 3000 5000 3000 2850
54.
55. Cláusula HAVING SQL> SELECT deptno, max(sal) 2 FROM emp 3 GROUP BY deptno 4 HAVING max(sal)>2900; DEPTNO MAX(SAL) --------- --------- 10 5000 20 3000
56.
57. Uso de subconsultas SQL> SELECT ename 2 FROM emp 3 WHERE sal > 4 (SELECT sal 5 FROM emp 6 WHERE empno=7566); ENAME ---------- KING FORD SCOTT 2975
58.
59. Operador ANY EMPNO ENAME JOB --------- ---------- --------- 7654 MARTIN SALESMAN 7521 WARD SALESMAN SQL> SELECT empno, ename, job 2 FROM emp 3 WHERE sal < ANY 4 (SELECT sal 5 FROM emp 6 WHERE job = 'CLERK') 7 AND job <> 'CLERK'; 950 800 1100 1300
Notas del editor
Tablas Utilizadas en el Curso Utilizaremos tres tablas principales: EMP, que da los detalles de los empleados. DEPT, que da los detalles de los departamentos. SALGRADE, que da los detalles de los salarios para varios grados. La estructura de los datos para todas las tablas se detallan en el Apéndice B.
Equijoins Para determinar el nombre del departamento del empleado, se compara el valor de la columna DEPTNO en la tabla EMP con los valores de DEPTNO en la tabla DEPT. La relación entre las tablas EMP y DEPT es un equijoin , ésto quiere decir que los valores en la columna DEPTNO en ambas tablas deben ser iguales. Frecuentemente, este tipo de joins incluyen complementos de clave primaria y externa. Nota: Los equijoins también se llaman joins simples o inner joins.
Recuperación de Registros con Equijoins En el ejemplo de la parte superior: La claúsula SELECT especifica los nombre de columna a recuperar: nombre de empleado, número de empleado y número de departamento, los cuales son columnas en la tabla EMP. número de departamento, nombre de departamento y localidad, los cuales son columnas en la tabla EMP. La claúsula FROM especifica las dos tablas a las que debe acceder la base de datos: Tabla EMP. Tabla DEPT. La claúsula WHERE especifica cómo se van a unir las tablas: EMP.DEPTNO=DEPT.DEPTNO Ya que la columna DEPTNO es igual en ambas tablas, ésta debe ir prefijada por el nombre de la tabla para evitar la ambigüedad.
Alias de Tablas Calificar las tablas con los nombres de tabla puede llevar mucho tiempo, especialmente si los nombres son largos. Podemos utilizar alias de tablas en lugar de nombres de tablas. Así como los alias de columnas dan a una columna otro nombre, los alias de tablas dan a una tabla otro nombre. Los alias de tablas ayudan a mantener reducido el código SQL, utilizando por lo tanto menos memoria. Observar en el ejemplo cómo los alias de tablas se identifican en la claúsula FROM. El nombre de la tabla se especifica por completo, seguido de un espacio y después el alias de la tabla. A la tabla EMP se le ha dado un alias de E, mientras que la tabla DEPT tiene un alias de D. Guía de Escritura Los alias de tablas pueden tener más de 30 caracteres de longitud, pero es mejor que sean más cortos. Si se usa un alias para un nombre de tabla en particular en la claúsula FROM, entonces debe ser sustituída a través de toda la sentencia SELECT. Los alias de tablas deberían ser significativos. El alias de tabla es válido solo en la sentencia SELECT actual.
Condiciones de Búsqueda Adicionales En ocasiones necesitaremos unir más de dos tablas. Por ejemplo, para visualizar el nombre, los pedidos realizados, los números de elementos, el total para cada elemento y el total de cada pedido para el cliente TKB SPORT SHOP, tendremos que unir las tablas CUSTOMER, ORD e ITEM. SQL> SELECT c.name, o.ordid, i.itemid, i.itemtot, o.total 2 FROM customer c, ord o, item i 3 WHERE c.custid = o.custid 4 AND o.ordid = i.ordid 5 AND c.name = 'TKB SPORT SHOP'; NAME ORDID ITEMID ITEMTOT TOTAL ------------ --------- --------- --------- --------- TKB SPORT SHOP 610 3 58 101.4 TKB SPORT SHOP 610 1 35 101.4 TKB SPORT SHOP 610 2 8.4 101.4
Non-Equijoins La relación entre las tablas EMP y SALGRADE en un non-equijoin, lo cual significa que ninguna columna en la tabla EMP se corresponde directamente con una columna en la tabla SALGRADE. La relación entre las dos tablas es que la columna SAL en la tabla EMP está entre las columnas LOSAL y HISAL de la tabla SALGRADE. La relación se obtiene utilizando un operador distinto del igual (=).
Non-Equijoins (continuación) El ejemplo de la parte superior, crea un non-equijoin para evaluar el grado de salario de un empleado. El salario debe estar entre cualquier par de los rangos de salario alto y bajo. Es importante observar que todos los empleados aparecen exactamente una vez cuando se ejecuta una consulta. Ningún empleado se repite en la lista. Hay dos razones para ésto: Ninguna de las filas en la tabla del grado del salario contiene grados que se solapen. Esto significa que el valor del salario de un empleado solo puede estar entre el salario más bajo y el más alto de una de las filas en la tabla del grado del salario. Todos los salarios de los empleados están dentro de los límites proporcionados por la tabla del grado del salario. Esto significa que ningún empleado gana menos del valor más bajo contenido en la columna LOSAL ni más del valor más alto contenido en la columna HISAL. Nota: Se pueden utilizar otro operadores como <= y >=, pero BETWEEN es el más simple. Al utilizar BETWEEN recordar especificar primero el valor más bajo y por último el valor más alto. Los alias de tablas se han especificado por cuestiones de rendimiento, no por ambigüedad.
Devolución de Registros sin Coincidencias Directas con Outer Joins Si una fila no satisface una condición de join, no aparecerá en el resultado de la consulta. Por ejemplo, en la condición de equijoin de las tablas EMP y DEPT, el departamento OPERATIONS no aparece porque nadie trabaja es ese departamento. SQL> SELECT e.ename, e.deptno, d.dname 2 FROM emp e, dept d 3 WHERE e.deptno = d.deptno; ENAME DEPTNO DNAME ---------- --------- ------------- KING 10 ACCOUNTING BLAKE 30 SALES CLARK 10 ACCOUNTING JONES 20 RESEARCH ... ALLEN 30 SALES TURNER 30 SALES JAMES 30 SALES ... 14 rows selected.
Devolución de Registros sin Coincidencias Directas con Outer Joins La(s) fila(s) que faltan pueden ser recuperadas si en la condición de join se uns un operador outer join. El operador es un signo más encerrado entre paréntesis (+) y se coloca en el “lado” del join que es deficiente en información. Este operador tiene el efecto de crear una o más filas NULL para que aquellas filas de la tabla sin valores conicidentes en la otra puedan ser combinadas. En la sintaxis: tabla1.columna = es la condición que combina ambas tablas tabla2.columna (+) es el símbolo de outer join, el cual se puede ubicar en cualquier lado de una condición de cláusula WHERE, pero no en ambos. Ubicar el símbolo dentrás del nombre de la tabla sin filas coincidentes.
Devolución de Resgistros sin Coincidencias Directas on Outer Joins El ejemplo de arriba muestra los números y los nombres de todos los departamentos. El departamento OPERATIONS, que no tiene ningún empleado, también se visualiza. Restricciones Outer Join El operador outer join puede aparecer solo en un lado de la expresión: el lado al que le falta la información. Este recupera aquellas filas de una tabla que no tiene correspondencia directa en otra tabla. Una condición que incluye un outer join no puede utilizar el operador IN o unirse a otra condición por el operador OR.
Combinación de una Tabla Consigo Misma En alguna ocasión necesitaremos combinar una tabla consigo misma. Para encontrar el nombre de cada jefe de empleado necesitamos combinar la tabla EMP consigo misma. Por ejemplo, para encontrar el nombre del jefe de Blake, necesitamos: Encontrar a Blake en la tabla EMP mirando en la columna ENAME. Encontrar el número de jefe de Blake mirando en la columna MGR. El número de jefe de Blake es 7839. Encontrar el nombre del jefe con EMPNO 7839 mirando en la columna ENAME. En número de empleado de King es 7839. Por lo tanto, King es el jefe de Blake. En este proceso, miramos dos veces en la tabla. La primera vez miramos en la tabla para encontrar a Blake en la columna ENAME y en MGR para encontrar el valor 7839. La segunda vez miramos en la columna EMPNO para encontrar 7839 y la columna ENAME para encontrar a King.
Combinación de una Tabla Consigo Misma (continuación) El ejemplo de la parte superior, combina la tabla EMP consigo misma. Para simular dos tablas en la claúsula FROM, hay dos alias, WORKER y MANAGER, para la misma tabla, EMP. En este ejemplo, la claúsula WHERE contiene la combinación que significa “dónde un jefe de un trabajador coincide con el número de empleado para el jefe”.