domingo, 19 de abril de 2015

CONSULTAS AVANZADAS CONSULTAS AVANZADAS: CUANTIFICADORES ALL, ANY Y EXISTS
   
En relacción con consultas anidadas existen 3 cuantificadores ALL y ANY y EXITS.


CUANTIFICADOR ALL.
   
Se utilizará de forma conjunta con una consulta anidada que devuelva más de un valor y un operador de comparación que no sea la igualdad.

Sirve para seleccionar los valores que cumplan una determinada condición para todos los valores de la consulta anidada. (No se suele utilizar con igualdad).

EJEMPLO 53:
Nombre de las asignaturas que tengan más créditos.
    SELECT Nombre
    FROM ASIGNATURA
    WHERE Creditos >= ALL (SELECT Creditos
                           FROM ASIGNATURA);
Otra forma:
    SELECT Nombre
    FROM ASIGNATURA
    WHERE Creditos = (SELECT MAX(Creditos)
                      FROM ASIGNATURA);
EJEMPLO 54:
Personas que viven en la ciudad que vive más gente.
    SELECT *
    FROM PERSONA
    WHERE Ciudad IN (SELECT Ciudad
                           FROM PERSONA
                           GROUP BY Ciudad
                           HAVING COUNT(*) >= ALL (SELECT COUNT(*)
                                                   FROM PERSONA
                                                   GROUP BY Ciudad));

CUANTIFICADOR ANY.
   
En conjunción con una consulta anidada que devuelve varios valores, sirve para determinar cuando una determinada condición se verifica para al menos uno de los valores que devuelve la subconsulta. (No se suele utilizar con desigualdad).

EJEMPLO 54B:
Personas que viven en cualquier ciudad excepto en la que vive más gente.
    SELECT *
    FROM PERSONA
    WHERE Ciudad IN (SELECT Ciudad
                       FROM PERSONA
                       GROUP BY Ciudad
                       HAVING COUNT(*) < ANY (SELECT COUNT(*)
                                              FROM PERSONA
                                              GROUP BY Ciudad));

CUANTIFICADOR EXISTS.
   
En conjunción con una consulta anidada sirve para determinar si existen filas en dicha subconsulta. Podemos utilizar análogamente NOT EXISTS.

Este tipo de consultas se llaman correlacionadas ya que hay una relacción entre la consulta principal y la subconsulta.

EJEMPLO 55:
Lista de asignaturas en las que no se ha matriculado nadie.
    SELECT *
    FROM ASIGNATURA
    WHERE NOT EXISTS (SELECT *
                      FROM ALUMNO_ASIGNATURA
                      WHERE ALUMNO_ASIGNATURA.IdAsignatura = ASIGNATURA.IdAsignatura);
EJEMPLO 56:
Ciudades en las que vive algún profesor y también algún alumno.
    SELECT DISTINCT Ciudad
    FROM PERSONA AS PP, PROFESOR
    WHERE PP.DNI = PROFESOR.DNI
    AND EXISTS (SELECT *
                FROM PERSONA AS PA, ALUMNO
                WHERE PA.DNI = ALUMNO.DNI
                AND PA.Ciudad = PP.Ciudad);
Otra forma:
    SELECT DISTINCT PP.Ciudad
    FROM PERSONA AS PP, PROFESOR, PERSONA AS PA, ALUMNO
    WHERE PP.DNI = PROFESOR.DNI
    AND PA.DNI = ALUMNO.DNI
    AND PA.Ciudad = PP.Ciudad;
EJEMPLO 57:
Ciudades en las que vive algún profesor pero ningún alumno.
    SELECT DISTINCT Ciudad
    FROM PERSONA AS PP, PROFESOR
    WHERE PP.DNI = PROFESOR.DNI
    AND NOT EXISTS (SELECT *
                    FROM PERSONA AS PA, ALUMNO
                    WHERE PA.DNI = ALUMNO.DNI
                    AND PA.Ciudad = PP.Ciudad);

No hay comentarios:

Publicar un comentario