Inicio‎ > ‎SQL‎ > ‎Lliçons SQL‎ > ‎T02 Consultes‎ > ‎

T02B Consultes niades

Les subconsultes, depenent del valor esperat i del tipus de comparació desitjat es poden utilitzar de 3 formes:

  • expr opcompara {ALL|[ANY|SOME]} (orde select)
  • expr [NOT] IN (orde select)
  • [NOT] EXISTS (orde select)

on opcompara és qualsevol operador de comparació. 

Els valors possibles a tornar per una orde select niada són :

  • res
  • un valor únic (una fila i una columna),
  • un conjunt de valors (unes quantes files i una columna).

Sempre que la subconsulta torne quelcom, únicament serà en una i ni més menys que una columna (excepte l’operador EXISTS, que es veurà més avant).

de valor escalar

expr opcompara (orde select) 

Podem utilitzar els operadors de comparació per a preguntar si el valor d’una determinada expressió és major, menor, igual, etc. que el resultat de la subconsulta, sempre i quan aquesta torne una única fila i una única columna, és a dir, un valor escalar.

select descripcion
from asignaturas
where creditos = (select creditos from asignaturas where creditos < 9)

SQL Error: Subquery returns more than 1 row


Encara que també es pot utilitzar qualsevol consulta de què estem segurs que ens va a tornar una fila i una columna, el més habitual és que siga el resultat de buscar un valor concret d’una clau primària (en general, de qualsevol combinació de columnes que no admeta duplicats)


Asignaturas que tienen más créditos que la asignatura HI.

select * from asignaturas
where creditos >(select creditos
from asignaturas
where codigo = 'HI')

codigo descripcion creditos creditosp
DGBD DISEÑO Y GESTION DE BASES DE DATOS 6.0 3.0
FBD FUNDAMENTOS DE LAS BASES DE DATOS 6.0 1.5
FP FUNDAMENTOS DE LA PROGRAMACION 9.0 4.5
PC PROGRAMACION CONCURRENTE 6.0 1.5


de llista de valors

expr opcompara ALL|[ANY|SOME] (orde select) 

Quan la taula resultat conté més d’una fila (però una única columna, insistim) cal utilitzar un modificador per a l’operador de comparació.


Asignaturas que tienen más créditos que las demás (asignaturas que tienen la máxima cantidad de créditos en la base de datos)

select descripcion
from asignaturas
where creditos >= ALL (select creditos from asignaturas)

descripcion
FUNDAMENTOS DE LA PROGRAMACION

El número en crèdits de l’assignatura ha de ser major o igual que tots (all) els valors obtinguts en la subconsulta (que és la relació de crèdits de totes les assignatures). També es podria haver formulat com

select descripcion
from asignaturas
where creditos (select max(creditos) from asignaturas)



Nombre de las asignaturas que no son las que menos créditos tienen.

select descripcion
from asignaturas
where creditos > ANY (select creditos from asignaturas)

descripcion
DISEÑO Y GESTION DE BASES DE DATOS
FUNDAMENTOS DE LAS BASES DE DATOS
FUNDAMENTOS DE LA PROGRAMACION
PROGRAMACION CONCURRENTE

Serien totes aquelles assignatures els crèdits de les quals superen al menys a un (any) dels valors tornats per la subconsulta. Els modificadors some i any són sinònims. Una solució alternativa és

select descripcion
from asignaturas
where creditos != (select min(creditos) from asignaturas)



Nombre de los profesores que imparten una asignatura que no sea la máxima en número de créditos

select nombre
from profesores p, asignaturas a, imparte i
where p.dni = i.dni and i.asignatura = a.codigo
and creditos < ANY ( select creditos from asignaturas )

nombre
EVA GOMEZ
EVA GOMEZ
RAFAEL ROMERO


NOTA IMPORTANT:

Per un canvi de configuració que, al mateix temps, descobreix una fallada de la versió instal·lada de MySQL, les expressions expr opcompara {ALL|[ANY|SOME]} provoquen un error de compilació i no poden executar-se. Per fortuna, la major part tenen relació amb "el màxim, el mínim x" pel que es pot utilitzar la forma de l’exemple:

NO funcionarà (en la nostra versió de MySQL)


select descripcion, creditos
from asignaturas
where creditos <= ALL( select creditos from asignaturas )

SÍ funcionarà, i és equivalent en el seu resultat

 

select descripcion, creditos
from asignaturas
where creditos = ( select min(creditos) from asignaturas )

Per últim, vegem que alguns d’aquests operadors són equivalents:
expr IN (orden select) ≈ expr=ANY(orden select)
expr NOT IN (orden select) ≈ expr<>ALL(orden select)

Comments