Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Desplegando datos de
mltiples tablas
Objetivos
Al completar esta leccin, deber ser
capaz de hacer lo siguiente :
DEPT
ENAME
----KING
BLAKE
... DEPTNO
... -----...
10
...
30
MILLER ...
10
DEPTNO
-----10
20
30
40
DNAME
---------ACCOUNTING
RESEARCH
SALES
OPERATIONS
LOC
-------NEW YORK
DALLAS
CHICAGO
BOSTON
EMPNO
EMPNO DEPTNO
DEPTNO LOC
LOC
--------- ------------- --------------7839
10
7839
10 NEW
NEW YORK
YORK
7698
30
7698
30 CHICAGO
CHICAGO
7782
10
7782
10 NEW
NEW YORK
YORK
7566
20
7566
20 DALLAS
DALLAS
7654
30
7654
30 CHICAGO
CHICAGO
7499
30
7499
30 CHICAGO
CHICAGO
...
...
14
14 rows
rows selected.
selected.
Desplegando datos de mltiples tablas 55-3
Qu es un Join?
Utilice un join para consultar datos en ms de una
tabla.
SELECT
SELECT
FROM
FROM
table1.column,
table1.column, table2.column
table2.column
table1
table1 INNER
INNER JOIN
JOIN table2
table2
ON
ON table1.column1
table1.column1 == table2.column2;
table2.column2;
Definicin de Join
Cuando se requieren datos que estn en ms de una tabla , se requiere utilizar
una condicion join. Los renglones de una tabla pueden ser unidos (joined) a
los de otra Tabla, solo si existen en ambas tablas un atributo que sea comn
entre ellas, normalmente , una relacin de la llave primaria y la llave fornea .
Para desplegar datos de dos o ms tablas que estn relacionadas escriba una
simple condicin/join en la clausula FROM,
Sintaxis
table.colum
Denota la tabla y la columna donde los datos sern recuperados.
table.colum 1 = table 2.column2
es la condicin de junta relaciona (join) las tablas.
Cuando escriba una consulta que relacione dos tablas preceda cada
columna con el nombre de su respectiva tabla por claridad y mejoramiento
del acceso a la base de datos.
Parte 5 SQL-Server Bsico
Pgina 4 de 27
table1.column,
table1.column, table2.column
table2.column
table1,
table1, table2
table2
table1.column1
table1.column1 == table2.column2;
table2.column2;
Definicin de Join(continuacin)
Algunos manejadores de bases de datos no incluyen en su sintaxis las palabras
INNER JOIN, JOIN, LEFT OUTER JOIN, etc. Que pueden ser utilizadas
directamente en la clusula FROM junto con el indicador ON condicin-join.
Por lo que el mtodo tradicional para hacer un join es colocar las tablas afectadas
en la clusula FROM separads por comas, y la condicin-join colocarla en la
clusula WHERE.
Estas dos formas de crear Joins genera exactamente el mismo resultado, solo que
el mtodo anterior( colocando la palabra join en la clusula FROM) permite mayor
comodidad y claridad para otras condiciones adicionales que afecten el resultado
de la consulta.
Producto Cartesiano
A x B
b
c
Producto Cartesiano
En matemticas, el producto cartesiano de dos conjuntos; es el conjuto de todos
los pares ordenados de elementos tales que el primer elemento de cada par
pertenece a A y el segundo elemento de cada par pertenece a B.
Producto Cartesiano
Un Producto Cartesiano es formado
cuando:
Una condicincondicin-join es omitida
Una condicin-join es invlida
Todos los registros de la primer tabla se
unen con todos los registros de la
segunda tabla.
Para evitar un Producto Cartesiano,
incluya siempre condicin-join vlida en
la clusula WHERE.
Desplegando datos de mltiples tablas 55-7
Producto cartesiano
Cuando una condicin-join es valida o se omite, el resultado es un producto
cartesiano en el que se combinan cada uno de los renglones de la tabla 1 con los
de la tabla 2, hasta terminar el ltimo registro de la tabla 1, con todos los de la
tabla 2
Un producto cartesiano tiende a generar un gran nmero de renglones (multiplicar
la cardinalidad de la tabla 1 por la cardinalidad de la tabla 2, y se obtiene la
cardinalidad del producto cartesiano).
Cardinalidad: en el modelo relacional, es un nmero de renglones de una tabla
DEPT (4 rows)
rows)
...
... DEPTNO
DEPTNO
...
... ----------...
10
...
10
...
30
...
30
...
...
ENAME
ENAME
----------KING
KING
BLAKE
BLAKE
Producto
Cartesiano:
14*4=56 reng.
reng.
10
10
DEPTNO
LOC
DEPTNO DNAME
DNAME
LOC
-------------------- ---------- --------------10
10 ACCOUNTING
ACCOUNTING NEW
NEW YORK
YORK
20
RESEARCH
DALLAS
20 RESEARCH
DALLAS
30
CHICAGO
30 SALES
SALES
CHICAGO
40
OPERATIONS
BOSTON
40 OPERATIONS BOSTON
DNAME
DNAME
------------------ACCOUNTING
ACCOUNTING
ACCOUNTING
ACCOUNTING
...
...
KING
RESEARCH
KING
RESEARCH
BLAKE
RESEARCH
BLAKE
RESEARCH
...
...
(56
(56 row(s)
row(s) afected)
afected)
Producto Cartesiano
En el ejemplo se muestran el nombre de los empleados y el de los departamentos
de las tablas EMP y DEPT. Debido a que no se indic condicin en la clusula
WHERE, todos los renglones (14) de la tabla EMP son unidos (joined) a los
renglones (4) de la tabla DEPT, el resultado es una tabla con 56 renglones.
SELECT
FROM
ename,
emp,
ENAME
--------------------KING
BLAKE
KING
BLAKE
.
56 rows selected.
dname
dep;
DNAME
----------------------ACCOUNTING
ACCOUNTING
RESEARCH
RESEARCH
Tipos de Joins
Tipos de joins
Existen dos tipos principales de condici-join.
Equijoins (inner join)
Non-equijoins
Existen joins adicionales:
Outer joins (left right join)
Self joins
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
------10
30
10
20
30
30
30
30
30
20
20
...
14 rows
DNAME
---------ACCOUNTING
SALES
ACCOUNTING
RESEARCH
SALES
SALES
SALES
SALES
SALES
RESEARCH
RESEARCH
LOC
-------NEW YORK
CHICAGO
NEW YORK
DALLAS
CHICAGO
CHICAGO
CHICAGO
CHICAGO
CHICAGO
DALLAS
DALLAS
selected.
Equijoins
Para determinar el nombre de los departamentos a los que pertenece cada
empleado, necesita comparar el valor en la columna DEPTNO de la tabla EMP
con los valores de DEPTNO en la tabla DEPT. La relacin entre las tablas EMP y
DEPT son conocidas como un equijoin, es decir, los valores de las columnas
DEPTNO en ambas tablas deben coincidir.
Nota: Los equijoins son tambin llamados simplemente joins o inner joins.
Recuperando Renglones
con Equijoins (inner)
SELECT
FROM
empno ename
deptno deptno loc
------ ---------- ------ ------ ------------7369 SMITH
20
20 DALLAS
7499 ALLEN
30
30 CHICAGO
7521 WARD
30
30 CHICAGO
7566 JONES
20
20 DALLAS
.....
14 rows selected.
Tabla DEPT
Tabla EMP
En la clusula ON se especifica la condicin join:
emp.deptno=dep.deptno;
Parte 5 SQL-Server Bsico
Pgina 11 de 27
Recuperando Renglones
con Equijoins
SELECT
FROM
WHERE
empno ename
deptno deptno loc
------ ---------- ------ ------ ------------7369 SMITH
20
20 DALLAS
7499 ALLEN
30
30 CHICAGO
7521 WARD
30
30 CHICAGO
7566 JONES
20
20 DALLAS
.....
14 rows selected.
La clusula FROM especifica las tablas que debern ser acezadas sin
especificar el tipo de join que se efectuara entre ellas:
o Tabla DEPT
o Tabla EMP
DEPT
ENAME
DEPTNO
------- ------KING
10
BLAKE
30
CLARK
10
JONES
20
MARTIN
30
ALLEN
30
TURNER
30
JAMES
30
WARD
30
FORD
20
SMITH
20
DEPTNO
-----10
30
10
20
30
30
30
30
30
20
20
...
DNAME
--------ACCOUNTING
SALES
ACCOUNTING
RESEARCH
SALES
SALES
SALES
SALES
SALES
RESEARCH
RESEARCH
LOC
-------NEW YORK
CHICAGO
NEW YORK
DALLAS
CHICAGO
CHICAGO
CHICAGO
CHICAGO
CHICAGO
DALLAS
DALLAS
Condiciones adicionales
Adems del join, puede indicar otros criterios de bsqueda en la clusula WHERE.
Por ejemplo, mostrar el nmero, el nombre, el numero de departamento, y la
localizacin del departamento del empleado KING.
SELECT empno, ename, emp.deptno, loc
FROM emp INNER JOIN dept
ON emp.deptno = dept.deptno
WHERE ename = KING;
empno
ename
deptno loc
-------------------- ---------- ------ ------------7839
KING
10 NEW YORK
O bien la forma tradicional :
SELECT
FROM
WHERE
ORD
NAME
CUSTID
NAME
CUSTID
--------------------- ----------JOCKSPORTS
100
JOCKSPORTS
100
TKB
SPORT
SHOP
101
TKB SPORT SHOP
101
VOLLYRITE
102
VOLLYRITE
102
JUST
103
JUST TENNIS
TENNIS
103
K+T
105
K+T SPORTS
SPORTS
105
SHAPE
106
SHAPE UP
UP
106
WOMENS
107
WOMENS SPORTS
SPORTS
107
...
...
...
...
99 rows
selected.
rows selected.
CUSTID
CUSTID ORDID
ORDID
------------- ------------101
610
101
610
102
611
102
611
104
612
104
612
106
601
106
601
102
602
ITEM
102
602
106
604
106
604 ITEMID
ORDID
ORDID
ITEMID
106
605
106 -----605
------ ------------...
...
610
33
610
21
21 rows
rows selected.
selected.
611
11
611
612
11
612
601
11
601
602
11
602
...
...
64
64 rows
rows selected.
selected.
name
ordid itemid
itemtot total
--------------------------------------------- ------ ------ ---------- -------------------TKB SPORT SHOP
610 3
58.00
101
TKB SPORT SHOP
610 1
35.00
101
TKB SPORT SHOP
610 2
8.40
101
(3 filas afectadas)
Parte 5 SQL-Server Bsico
Pgina 16 de 27
SELECT
FROM
WHERE
AND
AND
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.
Non-equijoins
La relacin entre las tablas EMP y SALGRADE son un Non-Equijoins, es decir,
que ninguna columna de la tabla EMP corresponde directamente a una columna
en la tabla SALGRADE
La relacin entre estas dos tablas es por columna LOSAL y HISAL de la tabla
SALGRADE. La relacin se obtiene utilizando otro operador diferente de (=)
Recuperar Registros
con NonNon-Equijoins
SELECT
FROM
ENAME
SAL
GRADE
---------- --------- --------JAMES
950
1
SMITH
800
1
ADAMS
1100
1
...
14 rows selected.
SELECT
FROM
WHERE
DEPT
ENAME
----KING
BLAKE
CLARK
JONES
...
DEPTNO
-----10
30
10
20
DEPTNO
-----10
30
10
20
...
40
DNAME
---------ACCOUNTING
SALES
ACCOUNTING
RESEARCH
OPERATIONS
No existen empleados en el
departamento OPERATIONS
ename
deptno
--------------KING
10
BLAKE
30
CLARK
10
JONES
20
MARTIN
30
ALLEN
30
TURNER
30
..
14 rows selected
dname
-------------ACCOUNTING
SALES
ACCOUNTING
RESEARCH
SALES
Parte 5 SQL-Server Bsico
SALESPgina 19 de 27
SALES
Outer Joins
Puede utilizar un outer join para ver tambin
aquellos renglones que normalmente no
cumplen la condicincondicin-join.
join.
SELECT
SELECT
FROM
FROM
table.column,
table.column, table.column
table.column
table1
table1 LEFT
LEFT OUTER
OUTER JOIN
JOIN table2
table2
ON
ON table1.column
table1.column == table2.column;
table2.column;
SELECT
FROM
table.column, table.column
table1 RIGHT OUTER JOIN table2
ON table1.column = table2.column;
Outer Joins
Los renglones que no cumplen la condicin pueden ser mostrados dependiendo
de que lado se encuentren.
Utilice LEFT RIGHT dependiendo de que lado se encuentran los renglones que
desee aparezcan an cuando no cumpla la condicin-join.
ENAME
DEPTNO DNAME
---------- --------- ------------KING
10 ACCOUNTING
CLARK
10 ACCOUNTING
...
40 OPERATIONS
15 rows selected.
Self Joins
EMP (WORKER)
EMPNO
----7839
7698
7782
7566
7654
7499
ENAME
-----KING
BLAKE
CLARK
JONES
MARTIN
ALLEN
EMP (MANAGER)
MGR
----
EMPNO
-----
7839
7839
7839
7698
7698
7839
7839
7839
7698
7698
ENAME
-------KING
KING
KING
BLAKE
BLAKE
Self Joins
En ocasiones necesitar hacer join con la misma tabla. Para encontrar el nombre
del jefe de cada empleado, necesita hacer un join con EMP y con la misma tabla.
Por ejemplo, para encontrar el nombre del Jefe de Blake, necesita:
------------------------------------------------------------BLAKE
BLAKE works
works for
for KING
KING
CLARK
CLARK works
works for
for KING
KING
JONES
JONES works
works for
for KING
KING
MARTIN
MARTIN works
works for
for BLAKE
BLAKE
...
...
13
13 rows
rows selected.
selected.
Prcticas
Practica 5
1- Haga una consulta para desplegar el nombre, numero de departamento y el nombre del
departamento para todos los empleados.
ename
---------KING
BLAKE
CLARK
JONES
MARTIN
ALLEN
TURNER
JAMES
WARD
FORD
SMITH
SCOTT
ADAMS
MILLER
deptno dname
------------------10
ACCOUNTING
30
SALES
10
ACCOUNTING
20
RESEARCH
30
SALES
30
SALES
30
SALES
30
SALES
30
SALES
20
RESEARCH
20
RESEARCH
20
RESEARCH
20
RESEARCH
10
ACCOUNTING
2. Haga una lista nica de todos los puestos que hay en el departamento 30.
3. Escriba un query para mostrar el nombre del empleado , nombre del departamento y
localizacin para todos los empleados que ganan una comisin.
4. Muestre el nombre de empleado y nombre del departamento para todos los empleados
que tengan una A en su nombre. Guarde el Script como s05q04.sql
5. Escriba un query que muestre el nombre, el puesto, el nmero y el nombre del
departamento para aquellos empleados que trabajen en DALLAS
6. Muestre el nombre y nmero de empleado junto con el nombre y nmero de su jefe,
ordene la salida por el nombre del jefe en forma descendente, etiquete las columnas como
se muestra a continuacin..... guarde el script como s05q06.sql
Employeee
Emp# Manager
Mgr#
Parte 5 SQL-Server Bsico
Pgina 25 de 27
Emp#
ADAMS
JONES
BLAKE
CLARK
SCOTT
FORD
SMITH
MILLER
ALLEN
WARD
MARTIN
TUNER
JAMES
KING
Manager
7876
7566
7698
7782
7788
7902
7369
7934
7499
7521
7654
7844
7900
7839
Mgr#
SCOTT
KING
KING
KING
JONES
JONES
FORD
CLARK
BLAKE
BLAKE
BLAKE
BLAKE
BLAKE
"--------------"
7788
7839
7839
7839
7566
7566
7902
7782
7698
7698
7698
7698
7698
8. Cree un query que muestre el nombre del empleado, numero de departamento y los
nombres de todos los empleados que trabajan en el mismo departamento para un empleado
dado. De nombres apropiados a las columnas.
deptno
Employee
10
10
10
10
10
10
20
20
20
20
20
20
20
CLARK
CLARK
KING
KING
MILLER
MILLER
ADAMS
ADAMS
ADAMS
ADAMS
FORF
FORD
FORD
Colleague
KING
MILLER
CLARK
MILLER
CLARK
KING
SMITH
JONES
SCOTT
FORD
SMITH
JONES
SCOTT
(56 rows(s) affected)
Practica 5(continuacin)
9. Haga un query que muestre el nombre, el puesto, el nombre del departamento, salario y
el nivel de salario de todos los empleados. (Nota: utilice la tabla SALGRADE para obtener
el nivel del salario)
ename
MILLER
CLARK
KING
SMITH
ADAMS
JONES
SCOTT
FORD
JAMES
WARD
MARTIN
ALLEN
TURNER
BLAKE
Job
dname
CLERK
MANAGER
PRESIDENT
CLERK
CLERK
MANAGER
ANALYST
ANALYST
CLERK
SALESMAN
SALESMAN
SALESMAN
SALESMAN
MANAGER
sal
ACCOUNTING
ACCOUNTING
ACCOUNTING
RESEARCH
RESEARCH
RESEARCH
RESEARCH
RESEARCH
SALES
SALES
SALES
SALES
SALES
SALES
grade
1300.00
2450.00
5000.00
800.00
1100.00
2975.00
3000.00
3000.00
950.00
1250.00
1250.00
1600.00
1500.00
2850.00
2
4
5
1
1
4
4
4
1
2
2
3
3
4
10. Cree un query para mostrar el nombre y la fecha de ingreso para aquellos empleados
que han sido contratados despus del empleado BLAKE.
dname
Hiredate
SMITH
ALLEN
WARD
JONES
1980-12-17
1981-02-20
1981-02-22
1981-04-02
00:00:00.000
00:00:00.000
00:00:00.000
00:00:00.000