Consultas Avanzadas

Embed Size (px)

Citation preview

  • 5/11/2018 Consultas Avanzadas

    1/18

    Facultad de Ingenieria Industrial y de Sistemas

    C ' ~Ipi '7:T') l ! '7r-"O 2 !.A," 'J .I / V /..I/..J ' .,' ~"'I'

    Introduce/on a SQL pag.35

  • 5/11/2018 Consultas Avanzadas

    2/18

    Universidad Nacional de Ingenieria

    CONSLLTAS AVANZADAS CON SQLUtillzar varies tablas para extreer infurmacion de lin base de datos:Utilizar tuocionee de grupo para realizer calcufos sobre una extension de flIasen una failla.

    Visualizaci6n de datos de varias tablas.Datos de Varias TablasA veces es necesario utrllzar datos de mas de una tabla. Enla base de datos,enelschema scott existen tablas relacionadas que sirven para extraer datos en conjunto.

    Los identificadores de empleado estan en la tabla EMP. Es el campo EMPNO. Losidentifi.cadores de departamento estan en las tablas EMP y DEPT. Estolrnpuca una retacionenfrearobas tablas pues comparten informacion. los identi.ficadores de ubicacion estanen la tabla DEPT.Para producir el informe, debe enlazar las tablas EMP y DEPT Y acceder alas datosde ambas.Existen muchas formasde acceder a los datos de varias tablas al mismo tiernpo:PRODUCTOS CARTESJANOS

    Cuando una condicion de union no es valida 0 esta compietamente omitida, elresultado es un producto Cartesiano, en el que 5e muestran todas las cornbinacionesde filas. Todas las mas de la primera tabla se unen can todas las filas de la segundatabla.Los productos Cartesianos tienden a generar un gran nurnero de filas yes pocofrecuente que el resultado sea util, Debe incluir siernpre una condicion de union validaen una clausula WHERE. a menos que tenga la necesidad especlfica de combinartodas las filas de todas las tablas,Los productos Cartesianos son utlles para algunas pruebas en las que se necesitagenerar un gran numero de filas para slrnular una cantidad razonable de datos.Se genera un producto Cartesiano si una condicion de union esta ornitida.En el ejemplo se muestra el apellido delernpleado y el nombre del departamento delas tablas EMP y DEPT. Como no se ha especificado ninguna clausula WHERE, todaslas filas de la tabla EMP se han unido 'con tadas las filas de la tabla DEPT, generandomuchas filas en la salida.

    pag.36 Introducci60 a SQL

  • 5/11/2018 Consultas Avanzadas

    3/18

    Facultad de Ingenierja Industrial y de SistemasSELECTename, dnameFROM emp, dept;Otra rnanera de oblener el mismo resultado esufiiizando la sintaxis del Sal 1999:La clausula CROSS JOIN produce varios productos entre dos tablas.Es 10 mismo que un producto Cartesiano entre las dos tablas.SELECT ename, dnameFROM emp CROSS JOIN dept;Tipos de Uniones

    las Uniones pueden ser:

    La base de datos Oracle109 efrece una sintaxis de union conforme con SOL: 1999.Antes de la version 109, la sin taxis de union era distinta de los sstandares ANSI. lanueva sintaxis de union conforme con Sal: 1999 no ofrece ninguna ventaja derendimiento con respecto a la sintaxis de union de propiedad de Oracle que existia enlas versiones anteriores.

    De igualdadDe no igualdadExtemasAutouniones

    Definicion de UnionesCuanda son necesarios datos de mas de una tabla de la base de datos, se utiliza unacondici6n de union. las filas de una tabla se pueden unir a las de otra segun valorescomunes que existen en las columnae correspondientes. es decir, normaimentecolumnas de clave primaria y ajena.Para visualizar datos de dos 0 mas tablas relacionadas. escriba una condicion deunion simple en la clausula WHERE.SELECT tablel.column,table2.columnFROM table1, table2WHERE tablel.columnl = table2.column2;

    En la sintaxis:

    table1.column1 =Indica la tabla y la columna de la que se recuperan losdatoses la condici6n que une (0 relaciona) las tablas entre sitable2.cotumn2

    table1.column

    Introducci6n a SQL p a g . 37

  • 5/11/2018 Consultas Avanzadas

    4/18

    Universidad Nacional de IngenieriaInstrucciones

    AI escribir una senten cia SELECT que unas tabtes, ponga delante del nornbrede la columna el nombre de la tabla para obtener una mayor claridad y paramejorar el aceeso a la base de datos.Si en mas de una labia aparece el misrno nombre de columna. este debe lIevarel nombre de tabla como prefijo.Para unir n tablas, necesita un minima de. n-1 condiciones de union. Porejemplo, para unir cuatro tablas, 58 requiere un minima de tres uniones. Estaregia puede no aplicarse si la tabla tiene una clave primaria concatenada, encuyo case se requiere mas de una columna para identtflcar a cada fila de formaexclusive.

    UnionesdelgualdadPara determinar el nombre de departamento de un empleado, compare el valor de lacolumna de la tabla EMP con los valores de DEPTNO de Ia tabla DEPT. La retaclonentre las tablas EMP y DEPT es una uni6n de igualdad, es decir, los valores de lacolumna DEPTNO de arnbas tablas deben ser iguales. Con frecuencia, este tipo deunion implica complementos de clave primaria y ajena.EjemphSELECT ErMP. empno, EMP. ename,

    EMP.DEPTNO, DEPT.DBPTNO.DEPT. lac

    FROM EMP, DEPTWHERE EMP.DEPTNO = DEPT.DBPTNO

    La clausula SELECT especifica los nombres de columna que se recuperan:o ApeUido del empleado, nurnero del empleado y nurnero dedepartamento, que son oolumnas de la tabla EMP.o Numero de departamento, nombre de departamento e identificador de

    ublcacion, que son columnas de la tabla DEPT.La clausula FROMespecifica las dos tablas a las que debe acceder la base dedatos:o tabla EMP_o tabla DEPT.La clausula WHEREespecifica como se deben unlr las taolas:o EMP.DEPTNO = OEPT.oEPTNO

    p a g . 38 Introducr;;i6n a SOL

  • 5/11/2018 Consultas Avanzadas

    5/18

    Facultad de Ingenieria Industrial y de SistemasComo la columna DEPTNO es ccrnun a ambas tablas, debe tener como prefijo elnornbre de la tabla para evitar arnbiquedades,Condiciones de Busqueda AdicionalesAdernas de la uni6n, puede tener criterios para la clausula WHERE para restringir lasfilas en consideraci6n para una 0mas tablas de la uni6n. Par ejemplo, para visualizarel nurnero y el nombre de departamento del empleado Mato, neeesita una condici6nadicional en la clausula WHERE.SELECT ename, emp.deptno,dnameFROM ernp, deptWHERE emp.deptno = dept.deptnoAND ename = 'Matos';

    introducci6n a SQL pag.39

    Cualificaci6n de Nombres de Columna AmbiguosEs necesario que cualifique los nombres de las columnas de la clausula WHERE conel nombre de tabla para evitar ambigOedades. Sin los prefijos de tabla, la columnaDEPTNO podrfa ser de la tabla DEPT 0 de la tabla EMP. Es necesario agregar elprefijo de tabla para ejecutar la consulta.SI no hay nombres de columna comunes entre dos tablas, no es necesario cualificarlas eoJumnas. Sin embargo, el usa del prefijo de tabla mejora el rendimiento ya queindica a Oracle Server d6nde debe buscar exactamente las columnas.La necesidad de cualificar 105 nombres de columna ambiguos tarnblen es aplicable acolumnas que pueden ser ambiguas en otras clausulas, como SELECT u ORDER BY.Alias de TablaLa cualificaci6n de nombres de columna can nombres de tabla puede lIevar muchotiempo, especialmente si los nombres de tabla son largos. Puede utilizar en su lugaralias de tabla. AI igual que un alias de columna asigna a una columna otro nombre, unalias de tabla asigna a una tabla otro nombre. Los alias de tabla ayudan a reducir elc6digo SOL, utilizando asf menos memoria.Observe como se identifiean los alias de tabla en la clausula FROM del ejemplo. EInombre de tabla se especifica completo, seguido de un espacio y del alias de tabla. Ala tabla EMP se Ie ha asignado el alias e ya la tabla DEPT el alias d.Istrucciones

    Los alias de tabla pueden tener hasta 30 caracteres, pera cuantos maspequefios sean. mejor. Si se utiliza un alias de tabla para un nombre de tabla en particular en \aclausula FROM, dicho alias se debe sustituir por el nombre de tabla en toda lasentencia SELECT. Los alias de tabla deben ser significativos.

  • 5/11/2018 Consultas Avanzadas

    6/18

    _./ 'I ,. _ , r: \ 1 " 1 rj I I " l " 1 '1 ' i . ! " f; - - : _ ) L -I I L/~ ' U J,JJ Universidad Nacional de IngenleriaEI alias de tabla s610es valido para la sentencia SELECT actual.

    SELECT e.empno, e.ename, e.deptno,d.deptno, d.location_id

    FROM amp e t dept dWHERE e.deptno = d.deptno;

    Condiciones de Busqueda AdicionalesA veces es posible que necesite unir mas de des tablas. Par ejemplo, para visualizar elapellldo, el nombre de departamento y la ciudad de cada empleado, tiene que unir lastablas EMP, DEPTy BONUS.SELECT e.ename, d.dname, b.salFROM emp e, dept d, bonus bWHERE e.deptno = d.deptnoAND e.ename = b.ename;

    SELECT e.ename, e.sal, j.grade_levelFROM ernp e, job_grades jWHERE e.sal BETWEEN j.lowest_sal AND j.highest_sali

    Uniones de No IgualdadUna union de no igualdad es una condici6n de unl6n que contiene alga distinto a unoperador de igualdad.La relaci6n entre las tablas EMP y SALGRADES es un ej,emplo de unl6n de, noigualdad. Una relaci6n entre las dos tablases que la columna SAL de la tabla EMPdebe estar entre los valores de las columnas LOSAL y HISAL de la tablaSALGRADES. La relaci6n se obtiene utilizando un operador dlstinto de igual a (=).

    Devoluci6n de Registros sin Coincidencia Directa con Uniones ExternasSi una fila no satisface una condici6n de union, no eparecera en el resultado de labusqueda. Por ejemplo, en la condicion de union de igualdad de las tablas EMP yDEPT,el empleado Grant no apareoe porque no hay idehtificador de departamentoregistrado para el en la tabla EMP, En tuqar de ver 20 empleados en el juego deresultados, ve 19.SELECT e.ename, e.depno, d.dnameFROM emp e, dept d 'WHERE e.deptno = d.deptno;

    pag.40 Introducci6n a SQL

  • 5/11/2018 Consultas Avanzadas

    7/18

    Facultad de Ingenieria Industrial y de Sistemas~I r I 'f

  • 5/11/2018 Consultas Avanzadas

    8/18

    Universidad Nacional de IngenieriaDefinicion deUniones con Ia sintaxis Sal 1999SELECT tablel.column, table2.colunmFROM tablel[CROSS JOIN table2}[NATURAL JOIN tabl e2]

    , [JOIN table2 USING (colwnn name)][JOIN table2ON(tablel. column name = ta.ble2. ooI u.mn name)][LE.FT I RIGHT I FULL-OUTER JOIN tabl e2ON (tablel.column .Dame = table2.column name)];

    AI utilizarla sintaxls SOL: 1999, puede obtener resultados iguales a los mostrados enpaginas anteriores.En la sintaxis;

    table1.oolumn Indica la tabla y la columna de la que se recuperan losdatos.CROSS JOIN Devuelve un producto Cariesiano de las dos tablas.NATURAL JOIN Une dos tablas basadas en el mismo nornbre decolumna.JOIN tableUSING column_name Realiza una union de igualdad basada en elnombre de columnaJOIN table ON

    table1.column_name Realiza una union de igualdad basada enlacondicion de la clausula ON = table2.column nameLEFT/RIGHT/FULL OUTER

    Creacion de Uniones NaturalesEn las versiones anteriores de Oracle, no era posible realizar una union sin especificarde forma explicita las columna s en las tablas cones pond ientes. En Oracle 1Og sepuede dejar que se termine automaticarnente la union basada en columnas de las dostablas que tienen tipos de oato y nombres coinc!dentes, utilizando las palabras claveNATURAL JOIN ...

    pag.42 Introducci6na SQL

  • 5/11/2018 Consultas Avanzadas

    9/18

    introducci6n a SQL pag.43

    Facultad de Ingenieria Industrial y de SistemasNota: La unIon 00/0 pue .d e @cu ", r en c o f l : J m I t t{ l s Que ren gan los m fsm os n o m b r e s y t lpasde dato 8h las aos tBf;J/as.Si las colf/mnas i lsnen 8/ miemo nombre, pero drstintos tiposde dato, la sin taxis N A T U RA L JO IN produce un error.

    SELECT deptno, dname,loc, cityFROM dept NATURAL JOIN locs ;

    La Clausula USINGLas uniones naturales utilizan todas las columnas can nombres y tipos de datacoincidentes para unir las tablas. La clausula USING 59 puede utillzar para especificarsalamente las column as que se deben utilizar para una union de igualdad. Lascolumnas de referenda en la clausula USING no deben tener un cualificador (nombrea alias de tabla) en ninqun lugar de la sentencia Sal.Por ejernplo, esta sentencia es valida:SELECT I.city, d.dnameFROM locs I JOIN dept d USING (lac)WHERE lac = 1400;Esta senten cia no es valida porque LOC esta cuallflcado en la ctausuta WHERE:SELECT I.city, d.dnameFROM lacs I JOIN dept d USING (Ioc)WHERE d.loc =1400;ORA-25154: column part of USING clause cannot have qualifierLa misma restricci6n se aplica tarnblen a las uniones NATURAL. Par 1 0 tanto. lascolumnas que tienen el mismo nornbre en las dos tablas 58 deben utilizar sin ninguncual ifica dar.La Condici6n ONUtilice la ctausula ON para especificar una condici6n de union. Esto Ie permiteespecificar condiciones de union distintas de cuatquier condiclon de busqueda 0 filtroen la clausula WHERE.

    La condtcron de union para la uni6n natural es basicarnente una union deigualdad de todas las columnas con el mismo nombre.Para especificar condiciones arbitrarias 0 especificar cotumnas para unir, seutiJiza la clausula ON.La condicion de union se separa de otras condiciones de busqueda. La clausuta ON facilita la cornprension del c6digo.

    SELECT e.empno, e.ename, e.deptno, d.deptno, d.locFROM emp e JOIN dept dON (e.deptno = d.deptno);

  • 5/11/2018 Consultas Avanzadas

    10/18

    Universidad Nacional de IngenieriaUniones en Tres SentidosUna union en tres sentidos es una union de tres tablas. En Ie sintaxis conforme conSOL: 1999, las uniones se realizan de izquierda a derecha, por 10 que la primera quese realize es EMP JOIN DEPT. La primera condicion de union puede hacer referendaa celumnas de EMP y de DEPT, pero no a columnas de referencia en LOC .. Lasegunda condicion de uni6n puede hacer referenda a columnas de las tres tablas.Tarnbien se puede escribir como union de iguaidad en tres sentidos:SE.lECT empno, city, dnameFROM emp eJOIN dept dON d.deptno = e.deptnoJOIN locs ION d.loe = l.Ioc;Ej.emplo de LEFT OUTER JOINEsta consulta recupera todaslas filas de la tabla EMP, que es la tabla izquierdaaunque no haya ninguna coincidencia enla tabla DEPT.SELECT e.ename, e.deptno, d.dnameFROM empeLEFT OUTER JOIN dept dON (e.deptnoe d.deptno)jSELECT e.ename, e.deptno, d.dname'FROM ernp eFULL OUTER JOIN dept dON (e.deptno = d.deptno) ;

    pag.44 Introducr:i6n a SQL

    Funciones De gruposA diferencia de las funciones de una sola fila, las funciones de grupo operan sabrejuegos de filas para proporcionar un resultado par grupo. Estes juegos pueden ser Iatabla completa 0 la tabla dividida engrupos. .Las funciones de grupo son:

    AVGCOUNTMAXMINSTDDEVSUMVARIANCE.

    PromedioCantidadValor mayorValor menorDesviacion estandarSumatoriaVarianza

  • 5/11/2018 Consultas Avanzadas

    11/18

    SELECTFROM[WHERE[GROUP[ORDER

    [colUQlll, J group_xunction(co]umn),tablecondition]

    BY column]BY column] ;

    Facultad de Ingenieria Industrial y de Sistemas

    Instrucciones para el Usa de Funciones deGrupoDISTINCT hace que !a funclon solamente considere valores no duplicados; ALLhace que considere todos los vaJores incluyendo duplicados. EI valor pardefecto es ALL y, par 10tanto, no es necesario especificarlo.Los tipos de data para las funclones con un argumento expr pueden ser CHAR,VARCHAR2, NUMBER 0DATE.Todas las funciones de grupo ignoran los valores nulos. Para sustituir un valorpar valores nulos, utilice las funciones NVL, NVL2 COALESCE.

    Oracle Server ordena implicitamente el juego de resultados en ordenascendente al utilizer una clausula GROUP BY. Para sustituir este orden pardefecto, se puede utillzar DESC en una clausula ORDER BY.Funciones de GrupoPuede utilizar las funciones AVG. SUM, MIN y MAX en columnas que almacenandatos numerlcos. En e! ejemplo se muestra la media, el salario mayor, el menor y lasuma de los salarios mensuales de todos los representantes de ventas.SELECT AVG(sal). MAX(sal). MIN(saQ.SUM(sal)FROM empWHERE job LIKE '%REP%';Puede utilizar las funciones MAX y MIN para cualquler tipo de dato. En el ejemplo semuestra al empleado de menor edad y al de mayor edad.SELECT MIN(hiredate), MAX(hiredate)FROM emp;En el siguiente ejemplo se muestra el apellido del primer y del ultimo empleado de unalista altabetica de lodos los empleados.SELECT MIN(ename), MAX.(ename)FROM emp;

    Nota; L as fu nc io n es A V a, S U ! } ( 1 , VARfANp lE"Y '$TDD5V so/a se pueden ~ l 1l ll iz qr oontipostJe dats n umer icos.: :: -

    Introducci6n a SQL pag.45

  • 5/11/2018 Consultas Avanzadas

    12/18

    Universidad Nacional de IngenieriaLa Funci6n COUNTLa funclon COUNT liene tres formatas.

    COUNT(")COUNT(expr)COUNT(DISTINCT expr)COUNT(*) devuelve el numero de filas de una tabla que satisface los criterios de lasentencia SELECT, incluyendo filas duplicadas y filas que contengan valores nulos encualquiera de [as columnas. Si se incluye una ctausula WHERE en la sentenciaSELECT, GOUNT(*) devuelve el nurnero de filas que satisface [a condici6n de laclausula WHERE ..En contraste, CQUNT(expr) devuelve el nurnero de valores no nulos de fa columnaidentificada par expr.CQUNT(DlST1NCT expr) devuelve el nurnero de valores unicos no nulos de lacolumna identificada par expr.SELECT COUNT(*)FROM empWHERE deptno = 50;

    SELECT AVG(comm)FROM emp;

    Funciones de Grupo y Valores NulosTodas las funciones de grupo ignoran los valores nulos de la columna. En el ejernplo,la media 58 calcula basandose solamente en las filas de la tabla que almacenan unvalor valido en la columna COMM. La media se calcula como la comisi6n total pagadaa tad as los empleados dividida per el nurnero de empleados que perciben unacomislon (cuatro).

    La funci6n NVL fuerza a que las funciones de grupo incluyan valores nulos. En elejemplo, la media se calcula basandose en todas las filas de la tabla,independientemente de si se almacenan valores nulos en la columna COMM. Lamedia 5e calcula coma la comisi6n total pagada a todos los empleados dividida par elnurnero total de empleados de la campania (20).SELECT AVG(NVL(comm. 0)FROM emp;

    Pag.46 Introducci6n a SQL

  • 5/11/2018 Consultas Avanzadas

    13/18

    SELECT column, group_runction(column)FROM table(WHERE condition][GROUP BY group_by_expression][ORDER BY column] ;

    Facultad de Ingenieria Industrial y de Sistemas_ . / Q ' '1'["" '~Ir, l. J!I''''.II r,.,J.I r i ' lTDser> !.hJJl . . . . . . - - - " " "

    Grupos de DatosHasta ahora, todas las funciones de grupo han Iratado la tabla como un gran grupo deinformacion. A veces, necesita dividir la tabla deinforrnaci6n engrupos mas pequefios,Esto se puede rea liz er utilizando la clausula GROUP BY .

    Puede utilizar la clausula GROUP BY para dividir las fllas de una tabla en grupos. Acontinuaci6n, puede utilizar las funciones de grupo para devolver informacion deresumen para cada grupo,En la sintaxis:

    group_by _expression especifica columnas cuyos valores determinan tabase para agrupar filas

    No se puede utilizar un alias de columna en la clausula GROUP BY.

    Instrucciones5i incluye una funci6n de grupo en una clausula SELECT, no puedeseleccionar tarnbten resultados individuales. a menos que la columna individualaparezca en la ctausuia GROUP BY. Recibira un mensaje de error si no incluyela lista de columnas en la clausula GROUP BY.Si utlliza una clausuta WHERE. puede excluir filas antes de divfdirlas engrupos.Debe incluir las columnas e n ta c ia us ula GROUP BY .

    Por defecto, las filas se ordenan en orden ascendente de las cotumnasincluidas en la lista GROUP BY . Puede 5ustituir este orden por defectoutilizando la clausula ORDER BY.SELECT deptno, AVG(sal)FROM empGROUP BY deptno ;

    tntroauccion a SQL pag.47

  • 5/11/2018 Consultas Avanzadas

    14/18

    Universidad Nacional de IngenieriaAI utilizar la clausula GROUP BY, asequrese de que todas las columnas de la listaSELECT que no son funciones de grupo estan incluidas en la clausula GROUP BY. Enel ejemplo 58 muestra el nurnero de departamento y el salario media para cadadepartamento. A continuaci6n, se mues!ra el modo en que S8 evatua esta sentenciaSELECT, que contiene una clausula GROUP BY:

    La ctausula SELECT especifica las columnas que se van a recuperar:o Columna de nurnero de departamento de la tabla EMPo La media de todos los salarios en el grupo que ha especificado en 1aclausuta GROUP BYLa clausula FROM especifica las tablas a las que debe' acceder la base dedatos: la tabla EMP.La clausula WHERE especifica las fllas que se van a recuperar. Como no hayninguna clausula WHERE, S8 recuperan todas las filas par defecto.La clausula GROUP BY esoecrica c6rno 5e deben agrupar las filas. Las filas seagrupan par nurnero de departamento, par 1 0 que la. funci6n AVG que se estaaplicando a la columna de salaria calculara el salaria media de cadadepa rtarnento.

    La columna GROUP BY no tiene que estar en la clausula SELECT. Par ejemplo, lasentencia SELECT de la transparancia muestra los salaries medias para cadadepartamento sin mastrar los nurneros de los departamentos respectivos. Sinembargo, sin los nurne ro s de departamento. los resultados no parecen significativos.SELECT AVG(saf)FROM empGROUP BY deptno ;

    Grupos dentro de GruposA veces necesita ver resultados para grupos dentro de grupos. Par ejemplo se puederequerir un informe con el salario total que se paga a cada cargo, dentro de cadadepartamento.La tabla EMP se agrupa en primer lugar par numero de departamento y , denlro dedicha aqrupacion, par cargo.SELECT deptno codigo, job cargo, SUM(sal)FROM empGROUP BY deptno, job;Puede devalver resultados resumidos para grupos y subgrupos incluyendo en una listamas de una columna GROUP BY. Puede determinar el orden por defecto de losresultados par el orden de las coJumnas en la clausula GROUP BY. A continuaci6n, semuestra el modo en que S8 evalua la sentencia SELECT de la transparencia, queconnene una clausula GROUP BY:

    pag.48 lntroduccion a SQL

  • 5/11/2018 Consultas Avanzadas

    15/18

    Facultad de Ingenieria Industrial y de SistemasLa clausula SELECT especifica la columna que se va a reeuperar:o Nurnero de departamento de la tabla EMPo Identificador de cargo de la tabla EMPo La suma de todos los salarios en el grupo que ha especificado en laclausula GROUP BYLa ctausula FROM especiflca las tablas a las que debe acceder la base dedatos: la tabla EMP.La clausula GROUP BY especifica e6mo debe agrupar las filas:o En primer lugar, las filas se agrupan per nurnero de departamento.a En segundo lugar, dentro de los grupos de numeros de departamento,las filas se agrupan par identlflcador de cargo.

    De esta forma, la tuncion SUM se esta aplicando a la columna de salario para todoslos identiflcadores de cargo dentro de cada grupo de nurneros de departamento.Restricci6n de Resultados deGrupoDe la rnlsrna forma que utlliza la clausula WHERE para restrlngir las fllas queselecciona, utilice la clausula HAVING para restringirgrupos. Para busear el salariomaximo de cada departamento, pero mostrando solamente los departamentos quetengan un salario maximo de mas de 10.000, debe:1. Buscar el salario media para cada departamento agrupando par nurnero dedepartamento.2. Hestringir los grupos a los departamentos con un salario maximo mayor que10,000.SELECT deptno, MAX(sal)FROM ampGROUP BY deptnoHAVING MAX(sal10000;En el ejemplo se muestran numeros de departamento y salarios maximos para losdepartamentos cuyos salaries rnaxlrnos son mayores que $10.000.

    tntroduccion a SQL Pag.49

    Puede utilizar la clausula GROUP BY sin utIlizar una funci6n de grupo en la listaSELECT.Si restringe las filas basandose en el resultado de una funcien de grupo, debe teneruna clausula GROUP BY adernas de la clausula HAVING.En el siguiente ejernpto se muestran los numeros de departamento y los salariosmedios para los departamentos cuyos salaries rnaxtrnos sean mayores que $10.000:En el ejemplo S8 muestra el ldentficador de cargo y eJsalario mensual total para cadacargo con una n6mina total superior a $13.000. EI ejemplo excluye a representantesde ventas y ordena la lista sequn el salario mensual total.

  • 5/11/2018 Consultas Avanzadas

    16/18

    Universidad Nacional de Ingenierfa

    Las funciones de grupo se pueden anidar hasta una profundidad de des. En el ejemplode la transparencia se muestra el salaria media maximo.

    SELECT job, SUM(sal) PLANILLAFROM empWHERE job NOT LIKE '%REP%'GROUP BY jobHAVING SUM{sal) > 13000ORDER BY SUM(sal);Anidamiento de Funciones de Grupo

    SELECT MAX(AVG(sal))FROM empGROUP BY deptno;

    P a g . 5 0 Introducci6n a SQL

  • 5/11/2018 Consultas Avanzadas

    17/18

    Facultad de In{Jenieria Industrial y de Sistemas

    EJERCTCIO PRACTfCO1. Escriba una consults para visuallzar elapellido delempleado, el nurnero y elnombre de departamento para todos los empleados ..2. Cree un listado unico de todos los cargos que haya en el departamento 20.Incluya la ublcaclon del departamento en el resuttado.3. Escriba una consulta para mostrar el apellldo del empleado, el nombre dedepariamento, el identificador de ubicacion y la ciudad de todos los empleadosque perciben cornision.4. Visualice el apelJido del empleado y el nombre de departamento para todos losempleados que tengan una a (rnirruscutas) en el apellido.5. Escriba una consulta para visualizar el apeJlido, el cargo, el nornero y el nombrede departamento para todos los empleados que trabalan en Toronto.6. Visualice el apellido y el nurnero del empleado junto con el apellido y el nurnerode su director. Etiquete las columnas como Employee, Ernp#, Manager y Mgr#,respectivamente.7. Cree una consulta que muestre apellidos de empleado, numeros dedepartamento y todos los empleados que trabajan en sl mismo departamentoque un empleado dado. Asigne a cada columna la etiqueta adecuada.8. VisuaHce la estructura de la tabla SALGRADES. Cree una consulta en la que

    pueda visuallzar el nombre, el cargo, el nombre de departamento, el salario y elgrado de todos los empleados.9. Cree una consulta para visualizar el apellido y la facha de contratacton decualquier empleado contratado despues del empleado Davies.10. Visualice los nombres y las fechas de contrataci6n de todos los empleadoscontratados antes que sus dlrectores, junto con los nombres y las fechas decontrataci6n de estos ultlrnos. Etiquete las columnas como Employee, EmpHired, Manager y Mgr Hired, respectivamente.

    14. Visualice el nurnero de director y el salario del empJeado de menor sueldo paradicho director. Excluya a todas las personas con director desconocido. Excluyalos grupos donde el salario minimo sea $6.000 0 inferior. Ordene el resultadoen orden descendente de salario.

    1 1 . Escriba una consulta para visualizar el nurnero de personas can el mismocargo.

    1 .2 . Determine el nurnero de directores sin enumerarlos ..Etiquete la columna comoNumber of Managers. tndlcadon: Utilice la columna MGR para determinar elnurnero de directores.13. Escriba una consulta para visualizar Ia diferencia entre et salario mayor y elmenor. Etiquete la columna DIFERENCIA.

    fntroducci6n a SQL pag.51

  • 5/11/2018 Consultas Avanzadas

    18/18

    Introducci6n a SQL

    Universidad Nacional de Ingenieria15. Escrlba una consulta para visualizar el nambre, la ubicaclon, el nurnero deempleados y el salario media de todos los empleados de cada departamento.Eliquete las columnas como Name, Location, Number of People y SaL,respectivamente. Redondee el salario media en dos posiciones decimates.16. Cree una consulta que muestre el nurnero total de ernpleados y, de ese total, elnurnero de empleados contratados en 1995, 1996. 1997 Y 1998. Cree lascabeceras de columna adecuadas.

    Prig. 52