Está en la página 1de 7

Universidad Autnoma de Chiapas

Licenciatura en Sistemas Computacionales

Objetivo especfico: Que el alumno aprenda a obtener datos de ms de una tabla, utilizando los diferentes mtodos disponibles, adems, a como realizar un resumen de la informacin empleando funciones de grupo
Qu es un JOIN? Qu es un producto cartesiano? Consultas de JOIN simple Utilizando Alias para las tablas Non- equijoin Recuperando registros no recuperados directamente Uniendo una tabla consigo misma. Funciones de grupo Clusula Group By Consultas ilegales utilizando funciones de grupo Clusula Having

Lenguajes de Consulta.

Unidad 5 Tratamiento de datos con mltiples tablas

MCE. Luis Alejandro Trujillo Santos

Qu es un JOIN?
Cuando se requieren datos de ms de una tabla de la base de datos, se utiliza una condicin de JOIN. Registros de una tabla pueden ser unidos a registros de otra tabla de acuerdo a valores comunes existentes en las columnas correspondientes, esto es, se unen a travs de las columnas de llave primaria y llave fornea. Existen 2 principales tipos de condiciones JOIN
Equijoins Non-equijoins

Qu es un producto cartesiano? Cuando una condicin de JOIN es invlida u omitida completamente, el resultado es un producto cartesiano, en el cual todas las combinaciones de los registros van a ser desplegadas. Todos los registros de la primer tabla son unidos a todos los registros de la segunda tabla. Ejemplo: SELECT nombre,apellido_paterno FROM departamento,empleado; 4

Mtodos adicionales:
Outer joins Self joins Set operators
3

Consultas con JOIN simple


Para desplegar datos de 2 o ms tablas relacionadas, se necesita escribir una condicin de JOIN en la clusula WHERE Sintaxis
SELECT FROM WHERE tabla.columna, tabla.columna . tabla1, tabla2 tabla1.columna1 = tabla2.columna2;

Consultas con JOIN simple (cont.)


Cuando escribimos una sentencia SELECT para unir 2 tablas, el nombre de la columna debe ir precedido con el nombre de la tabla para una mejor claridad y mejorar el acceso a la base de datos. Si aparece el nombre de una columna en ms de un tabla, entonces el nombre de la columna debe ser prefijada con el nombre de la tabla. Para unir tablas, se necesita tener condiciones JOIN igual al nmero de tablas menos 1. Por ejemplo si se tienen 4 tablas, se va a requerir mnimo de 3 JOINs Esta regla puede no aplicarse si las tablas tiene una llave primaria compuesta, en la cual es requerida ms de una columna para identificar a un registro.
6

En donde:
tabla.columna Denota la tabla y la columna de donde es recuperado el dato

tabla1.columna1 = Es la condicin que une (o relaciona) a las tabla2.columna2 tablas


5

Ejemplo de Equijoin
BD

Ejemplo de Equijoin
Unir las tablas empleados y departamentos para desplegar de la tabla empleados, las columnas nombre y el nmero de departamento y de la tabla departamento, la columna nombre
SELECT empleado. apellido_paterno, empleado.id_dep, departamento.nombre FROM empleado, departamento
Id_dep 1 1 2 2 3 3 3 4 5 Departamento Gerencia Regional Gerencia Regional Gerencia Regional Gerencia Regional Gerencia Regional Gerencia Regional Gerencia Regional Gerencia Regional Gerencia Regional 8

Empleado
Apellido_paterno BACA BAUTISTA CAMPOSECO CHANDOMI CARDENAS CIGARROA Id_dep 1 1 1 1 2 2

Departamento
Id_dep Departamento 1 Gerencia Regional 1 Gerencia Regional 1 Gerencia Regional 1 Gerencia Regional 2 Gerencia Regional 2 Gerencia Regional

WHERE empleado.id_dep = departamento.id_dep;


Apellido_paterno BAUTISTA CAMPOSECO BALLINAS CABALLERO CUNDAPI GOMEZ GUTIERREZ GUTIERREZ HERNANDEZ

La manera para determinar el nombre del departamento para cada empleado, es comparando los valores de la columna id_dep en la tabla empleado con los valores de la columna Id_dep de la tabla Departamento La relacin entre las tablas empleado y departamento es una equijoin, esto es los valores de la columna id_dep en ambas tablas deben ser iguales. Frecuentemente, estas columnas son la llave primaria y la llave fornea.
7

Calificando nombre de columnas ambiguas


Se necesita calificar los nombres de las columnas en la clusula WHERE con el nombre de las tablas, para evitar ambigedades. Sin el prefijo de la tabla, la columna ID podra ser de la tabla departamento o de la tabla empleado. Si no existen los mismos nombres de columnas entre las 2 tablas, entonces no es necesario calificar las columnas. Sin embargo se mejora el desempeo utilizando los prefijos de las tablas.

Utilizando un Alias para las Tablas


Calificar los nombres de las columnas puede consumir mucho tiempo, particularmente si el nombre de la tabla es demasiado largo. La utilizacin de alias es una solucin para este caso. Como los alias de las columnas, los alias de las tablas son mtodos de dar otro nombre a las tablas para crear sentencias SELECT Una vez que se utilizan alias para las tablas, se debe continuar calificando cada columna referenciada con el alias de la tabla.

Ejemplo: Desplegar el nmero de departamento, nmero de regin y el nombre de la regin para todos los departamentos.

Ejemplo: Desplegar el nombre del cliente, nmero de regin y el nombre de la regin para todos los clientes. SELECT c.nombre, c.region_id, r.nombre FROM cliente c, region r WHERE c.id_region = r.id; Nombre del Cliente Deportes de Chiapas Deportycosas Marti id_region Region.Nombre 1 Norte Amrica 1 Norte Amrica 2 Sur Amrica
10

SELECT departamento.id, region.id, region.nombre FROM departamento, region WHERE departamento.id_region = region.id;
Id Departamento 1 2 3 4 5 Region.Id 1 2 3 4 5 Nombre Norte Amrica Sur Amrica Africa/Medio Oriente Asia Europa 9

Non-Equijoin
La relacin entre tablas Empleado y Grado_Salario es un nonequijoin, en la cual ninguna columna de Empleado tiene correspondencia directa con alguna columna en Grado_salario. La relacin es obtenida utilizando un operador diferente a igual ( = )

Desplegando registros no recuperados directamente


Si un registro no satisface una condicin de JOIN, entonces el registro no va a aparecer en el resultado de la consulta OUTER JOIN Los registros perdidos pueden ser recuperados si un operador Outer Join es utilizado en la condicin Join El operador es un signo + encerrado entre parntesis (+), y es colocando sobre el lado del Join en qu es deficiente en informacin El operador tiene el efecto de crear uno o ms registros nulos, para los cuales uno o ms registros de la tabla no deficiente pueden ser unidos. Sintaxis
SELECT tabla.columna, tabla.columna
11

Ejemplo: Crear un non-equijoin para evaluar el grado de salario de un empleado. El salario debe estar entre cualquier de los rangos bajo y alto. SELECT e.apellido_paterno, e.sueldo, g.grado FROM Empleado e, grado_salario g WHERE e.Sueldo BETWEEN g.ba_sueldo AND g.al_sueldo; apellido_paterno
BAUTISTA CAMPOSECO BALLINAS

Sueldo 10,000 12,000 16,000

Grado 1 1 2

FROM

tabla1, tabla2

12

WHERE tabla1.columna = tabla2.columna (+);

Ejemplo de Outer join


BD

Uniendo una tabla a si misma (SELF JOIN)


Se puede unir una tabla a si misma utilizando un alias para simular como si la tabla fuera 2 tablas separadas. Esto permite que registros en una tabla pueda se unida a registros de la misma tabla.

Empleado
Apellido_Paterno ZENTENO TOLEDO ID 1 2

Cliente
Id_rep_ventas Nombre del Cliente 1 Deportes Marti 2 Deporty Cosas Deportes de Chiapas

Restricciones del Outer Join


El operador Outer Join debe aparecer nicamente en un lado de la expresin (el lado en que la informacin no existe). Este retorna esos registros de la tabla en la cual no tiene un valor en la otra tabla
13

SELF JOIN El mejor ejemplo para representar esta situacin es la tabla empleados, la cual es utilizada a travs de 2 perspectivas. Trabajadores Jefes Ejemplo: Desplegar los nombres de los empleados y sus respectivos jefes. SELECT trabajador.apellido_paterno || trabaja para || jefe.apellido_paterno FROM empleado trabajador, empleado jefe WHERE trabajador.id_jefe = jefe.id ;
14

Self joins

BD

Funciones de Grupo.
Las funciones de grupo operan sobre un conjunto de registro para dar un resultado por grupo. Este conjunto puede ser la tabla completa o una tabla dividida en grupos. Las funciones de grupo aparecen en las clusulas SELECT y HAVING.
SELECT FROM [WHERE [GROUP BY [HAVING [ORDER BY columna, funcin de grupo tabla condicin]

Empleado (trabajador)
Apellido_Paterno PEREZ TOLEDO ZENTENO LOPEZ ROBLES Id_jefe 1 1 1 2 2 Id

Empleado (jefe)
Apellido_Paterno 1 RUIZ 1 RUIZ 1 RUIZ 2 PEREZ 2 PEREZ

Sintaxis

Donde

expresin group by] condicin de grupo] columna];

expresin group by condicin de grupo


15

Especfica las columnas cuyos valores determinan las bases para el agrupamiento de registros. Restringe los grupos de registros recuperados para aquellos grupos para los cuales16 la condicin es verdadera.

Funciones de Grupo.
La clusula GROUP BY en sentencias SELECT divide los registros en pequeos grupos. La clusula HAVING restringe los resultados de grupo.
Valor promedio de n, ignorando valores nulos Nmero de registros, donde expr evala cualquier cosa a nulo. COUNT selecciona todos los registros utilizando *, incluyendo duplicados y registros con valores nulos Valor mximo de expr Valor mnimo de expr Desviacin estndar de n, ignorando valores nulos Suma valores de n, ignorando valores nulos Varianza de n, ignorando valores nulos

Ejemplos de Funciones de Grupo.


Desplegar el promedio, el ms alto, el ms bajo y la suma de los salarios mensuales para todos los empleados del departamento 20.
SELECT FROM WHERE AVG(sueldo), MAX(sueldo), MIN(sueldo), SUM(sueldo) Empleado Id_depto = 20; Promedio 18037.037037037 Mximo 25000 Mnimo 7000 Suma 487000

AVG(Distinct|All|n) COUNT(Distinct|All|expr|*)

MAX(Distinct|All|expr) MIN((Distinct|All|expr) STDDEV((Distinct|All|n) SUM((Distinct|All|n) VARIANCE(Distinct|All|n)

Desplegar el apellido paterno del primero y ltimo empleado de una lista de empleados.
SELECT MAX(apellido_paterno), MIN(apellido_paterno) FROM Empleado; Mximo HERNANDEZ Mnimo BACA
18

Distinct hace que la funcin considere nicamente valores no duplicados; All hace considerar cada valor incluyendo duplicados. El 17 default es All, por lo que no es necesario especificarlo

Funcin COUNT.
La funcin COUNT tiene 2 formatos COUNT(*) y COUNT(expr). COUNT(*) retorna el nmero de registros en una tabla, incluyendo registros duplicados y registros conteniendo valores nulos. Ejemplo: Desplegar el nmero de empleados del departamento 31 SELECT FROM WHERE COUNT(*) empleado Id_depto = 31; Total Empleados 9

Clusula GROUP BY
Se utiliza la clusula GROUP BY para dividir los registros en pequeos grupos Se pueden utilizar la funciones de grupo para retornar un resumen de informacin para cada grupo Sintaxis SELECT columna, funcin de grupo FROM [WHERE tabla condicin]

[GROUP BY expresin group by] [ORDER BY columna]; Si incluyes una funcin de grupo en una clusula SELECT, no se puede seleccionar resultados individuales al menos que la columna individual aparezca en la clusula GROUP BY. Si esto sucede ocasionara un mensaje de error. Utilizando la clusula WHERE, se puede pre excluir registros antes de dividirlos en grupos. Se debe incluir la(s) columna(s) en la clusula GROUP BY. Por default, los registros son ordenados en orden ascendente de la lista GROUP BY. Sin embargo se puede anular utilizando la clusula ORDER 20 BY

En contraste, COUNT(expr) retorna el nmero de registros no nulos de la columna especificada en expr. Ejemplo: Desplegar el nmero de empleados del departamento 31 quienes ganen comisin SELECT FROM WHERE COUNT(pct_comision) empleado Id_depto = 31; Empleados con comisin 3
19

Ejemplos con la clusula GROUP BY


Sin utilizar la clusula GROUP BY SELECT FROM WHERE
ID

Ejemplos con la clusula GROUP BY


Desplegar de acuerdo al crdito autorizado el nmero de clientes en cada categora. SELECT credito_autorizado, COUNT(*) FROM cliente
Total Clientes 75000 80000 2 1

Id,apellido_paterno,id_depat empleado Id_depat = 41;


Apellido_paterno 1 BACA 3 BAUTISTA 5 CAMPOSECO Id_depat 41 41 41

GROUP BY credito_autorizado;
Crdito Autorizado

Utilizando la clusula GROUP BY SELECT id_depat, COUNT(*) FROM WHERE empleado Id_depat = 41
La clusula GROUP BY despliega una lnea de datos para cada registro recuperado en la clusula WHERE, y COUNT(*) despliega el nmero de empleados en cada departamento desplegado
21

Desplegar el nivel de estudios y el total del sueldo mensual para cada nivel de estudios, excluyendo a los Lic..Ordenando la lista por el total del salario mensual SELECT nivel_estudios, SUM(sueldo) FROM WHERE GROUP BY ORDER BY
Secundaria

Empleado nivel_estudios NOT LIKE Lic.% nivel_estudios SUM(sueldo);


Total Nomina 17000

GROUP BY Id_depat; Id_depat 41 Total Empleados 9

Nivel_Estudios

22

Ejemplos con la clusula GROUP BY


La columna en la clusula GROUP BY no tiene que estar en la clusula SELECT, como se muestra en el siguiente ejemplo, pero el resultado podra no ser muy significativo. Sueldo Mayor por Nivel de Estudios
15000

Consultas ilegales utilizando funciones de grupo


Cuando mezclamos un campo individual (id_region) y una funcin de grupo (COUNT) dentro de la clusula SELECT, se debe incluir una clusula GROUP BY en la cual se especifique la columna individual. Si la clusula GROUP BY es omitida entonces ocurrir un error. Ejemplo: Desplegar cada regin y el nmero de departamentos en cada regin SELECT FROM Id_region, COUNT(nombre) Departamento;

SELECT FROM GROUP BY

MAX(sueldo) empleado nivel_estudios;

17000 20000 25000 12000 10000

Desplegar el valor mximo del sueldo para cada nivel de estudios y desplegar el titulo.
nivel_estudios Sueldo_Mayor_Estudios

Se corrige la consulta anterior aadiendo la clusula GROUP BY. Ahora id_region es el nombre de un grupo. SELECT Id_region, COUNT(nombre) FROM Departamento; GROUP BY Id_region;
Regin Departamentos 1 2 5 4
24

SELECT FROM

nivel_estudios, MAX(sueldo) Lic. Adm Emp empleado


Lic. Comercio Int. Lic. Contaduria Lic. Sist. Comp. Lic. Turismo Secundaria

15000 17000 20000 25000 12000 10000


23

GROUP BY nivel_estudios;

Consultas ilegales utilizando funciones de grupo


La clusula WHERE no puede ser utilizada para restringir grupos. Ejemplo: Desplegar el nmero de departamento y el sueldo promedio para departamento que tenga un sueldo promedio mayor que 2000 SELECT FROM WHERE Id_depat, AVG(sueldo) empleado AVG(sueldo) > 2000

Grupos dentro de grupos


Se pueden crear resultados para grupos y subgrupos listando ms de una columna en la clusula GROUP BY. Ejemplo: Desplegar el nmero de empleados para cada categora dentro de cada departamento. SELECT FROM Id_depat, nivel_estudios,COUNT(*) empleado

GROUP BY Id_depat; La consulta anterior generara un error, el cual se corrige, utilizando la clusula HAVING para delimitar los registros. SELECT FROM GROUP BY HAVING
Id_depat 1 2

GROUP BY Id_depat,nivel_estudios;
Id_depat 1 1 1 1 1 2 2 2 Nivel_Estudios Lic. Adm Emp Lic. Contaduria Lic. Sist. Comp. Lic. Turismo Secundaria Lic. Adm Emp Lic. Comercio Int. Lic. Sist. Comp. Secundaria Total 2 3 1 2 1 2 1 3 1 26

Id_depat, AVG(sueldo) empleado Id_depat AVG(sueldo) > 2000;


Sueldo_promedio 16222.22 18857.14
25

Grupos dentro de grupos


Ejemplo: Desplegar el nmero de empleados para cada departamento dentro de cada categora.

La clusula HAVING
Se utiliza la clusula HAVING para especificar que grupos son desplegados. Por lo tanto se puede restringir los grupos en base a la informacin SELECT columna, funcin de grupo FROM tabla condicin] condicin de grupo] [WHERE [HAVING

SELECT FROM

nivel_estudios,Id_depat,COUNT(*) Empleado

[GROUP BY expresin group by] [ORDER BY columna];

GROUP BY nivel_estudios,Id_depat;
Nivel_Estudios Lic. Adm Emp Lic. Adm Emp Lic. Comercio Int. Lic. Contaduria Lic. Sist. Comp. Lic. Sist. Comp. Secundaria Id_depat 1 2 3 1 1 2 2 Total 2 2 2 3 1 3 1
27

Donde: Condicin de grupo: Restringe los grupos de registros recuperados para ese grupo para la condicin especificada es verdadera. Cuando se utiliza la clusula HAVING se ejecutan los siguientes pasos. Los registros son recuperados La funcin de grupo es aplicada Los grupos que cumplen con el criterio de la clusula HAVING 28 son desplegados.

Ejemplos utilizando la clusula HAVING


Desplegar el nivel de estudios y el total de sueldo mensual, para cada nivel de estudios con un total de nomina mayor de 20,000, no incluyendo a los de nivel secundaria y ordenados por el total mensual
SELECT FROM WHERE GROUP BY HAVING ORDER BY nivel_estudios, SUM(sueldo) empleado Nivel_estudio NOT LIKE Sec% nivel_estudios SUM(sueldo) > 20000 SUM(sueldo);
Nomina 24000 51000 105000 140000 150000
29

Subquery
Un Subquery es una sentencia SELECT que se encuentra dentro de otra sentencia de SQL Son muy utilizados cuando se necesita seleccionar registros de una tabla con una condicin que depende sobre datos de la tabla misma. Se puede colocar un subquery en las siguientes clusulas: WHERE HAVING FROM de la clusula SELECT o de la sentencia DELETE

Nivel_Estudios Lic. Turismo Lic. Comercio Int. Lic. Adm Emp Lic. Contaduria Lic. Sist. Comp.

30

La clusula HAVING
En el siguiente ejemplo, no existe una funcin de grupo en la clusula SELECT, pero hay en las clusulas HAVING y GROUP BY. Desde que una funcin de grupo es referida en la clusula HAVING, la clusula GROUP BY es requerida. Ejemplo: Desplegar todos los departamentos con un total mensual de pago de nomina mayor que 40,000
SELECT FROM GROUP BY HAVING Id_depat empleado Id_depat SUM(sueldo) > 40000;
Id_depat 1 2 3 4
31

Sintaxis del Subquery


SELECT FROM WHERE Lista de columnas TABLA Expr operador (SELECT lista de columnas FROM tabla); operador Nota: Incluye operadores de comparacin tales como >, =, o IN Los operadores de comparacin caen dentro de 2 clases: registro simple (>,=,>=,<,<>,<=) y mltiple registro (IN, NOT IN)

El subquery es tambin conocido como SELECT anidados, Sub-SELECT, sentencias SELECT internas. El subquery es generalmente ejecutado primero, y su resultado es utilizado para completar la consulta para la 32 condicin principal, o query externo.

Cmo son procesados los Subqueries anidados


Recuperar el apellido paterno y el nivel de estudios de los empleados que pertenezcan al mismo departamento de BAUTISTA. SELECT FROM WHERE apellido_paterno, nivel_estudios empleado Id_depat = (SELECT id_depat FROM empleado WHERE UPPER(apellido_paterno) = BAUTISTA); El SELECT anidado se ejcuta primero, produciendo como resultado = 1 El query principal es procesado enseguida y utiliza el valor retornado por el subquery para completar la condicin bscada. SELECT FROM WHERE apellido_paterno, nivel_estudios empleado Id_depat = 1
33

Subqueries de registro simple


Un subquery de registro simple recupera nicamente un registro de la sentencia SELECT anidada. Este tipo de subquery utiliza un operador de registro simple. Ejemplo: Desplegar el apellido paterno de los empleados quienes tengan el mismo nivel de estudios de BAUTISTA
SELECT FROM WHERE apellido_paterno, nivel_estudios empleado nivel_estudios = (SELECT nivel_estudios FROM empleado WHERE apellido_paterno = BAUTISTA);
Apellido_paterno) BALLINAS BAUTISTA CABALLERO ESPINOSA Nivel_Estudios Lic. Sist. Comp. Lic. Sist. Comp. Lic. Sist. Comp. Lic. Sist. Comp.
34

Subqueries de registro simple


Se puede desplegar datos desde un query principal utilizando una funcin de grupo en un subquery para regresar un registro simple Ejemplo: Desplegar el apellido paterno de los empleados quienes tengan un sueldo menor que el promedio.
SELECT FROM WHERE apellido_paterno, nivel_estudios,sueldo empleado sueldo = (SELECT AVG(sueldo) FROM empleado);
Apellido_paterno BACA CARDENAS CASTANEDO CHANDOMI CIGARROA CORZO Nivel_Estudios Lic. Adm Emp Lic. Comercio Int. Lic. Comercio Int. Lic. Turismo Lic. Adm Emp Secundaria Sueldo Promedio 18037.03 Sueldo 15000 17000 17000 12000 15000 10000
35

Errores cometidos con Subqueries


Un error comn con los subqueries es que se recupera ms de un registro para un registro simple Ejemplo: El siguiente subquery recupera ms de un registro y utiliza un operador de registro simple. Para corregir este error, cambiar el operador = por IN.

SELECT FROM WHERE

apellido_paterno, nombre, nivel_estudios empleado Id_depat = (SELECT id FROM departamento WHERE nombre = Contabilidad OR id_region = 2);
36

Errores cometidos con Subqueries


Un error comn con los subqueries es que se recupera ms de un registro para un registro simple Ejemplo: El siguiente subquery recupera ms de un registro y utiliza un operador de registro simple. Para corregir este error, cambiar el operador = por IN.

Clusula HAVING con subqueries anidados


Se pueden utilizar subqueries no solamente en la clusula WHERE, sino tambin la clusula HAVING. Ejemplo: Desplegar todos los departamentos que tienen un salario promedio mayor que el departamento 32
SELECT FROM GROUP BY Id_depat, AVG(sueldo) Empleado Id_depat AVG(sueldo) > (SELECT AVG(sueldo) FROM empleado WHERE id_depat = 32);
Id_depat 4
37

SELECT FROM WHERE

apellido_paterno, nombre, nivel_estudios empleado Id_depat IN (SELECT id FROM departamento WHERE nombre = Contabilidad OR id_region = 2);

HAVING

Sueldo_Promedio 20000 20000


38

Clusula HAVING con subqueries anidados


Ejemplo: Encontrar el nivel de estudio con el promedio de sueldo ms bajo

Resumen de subqueries
Los subqueries son muy tiles cuando un query esta basado sobre un valor desconocido. Un subquery contiene ms de una sentencia SELECT Primero es procesado el subquery, posteriormente el query principal es ejecutado basado en el resultado del subquery de las clusulas WHERE o HAVING.

SELECT FROM GROUP BY HAVING

nivel_estudios, AVG(sueldo) Empleado nivel_estudios AVG(sueldo) = (SELECT MIN(AVG(sueldo)) FROM empleado GROUP BY nivel_estudios);

39

40

Fin

41

También podría gustarte