SQL - script - subqueries

From Ibbddunq

(Difference between revisions)
Line 1: Line 1:
-
== sólo un punteo por ahora ==
+
== Concepto ==
 +
 
 +
Básicamente es lo que ya saben de AR: puedo hacer jugar el resultado de una consulta en otra, combinando operaciones.
 +
 
 +
Muchas veces se hace innecesario por la sintaxis básica de la sentencia SELECT de SQL, que permite hacer muchos joins, una selección (que se optimiza, entonces es como si fueran varias) y una proyección todo en una sola sentencia, y además lo del nombre compuesto de atributo evita la necesidad de renombrado.
 +
 
 +
Por otro lado, aparecen casos en donde la técnica de meter una consulta adentro de otra es muy útil. Veamos algunos.
 +
 
 +
 
 +
== Subqueries en el FROM ==
 +
 
 +
Una fácil: UNION ordenado, p.ej. quiero las funciones donde aparecen osos o leones ordenadas por fecha.
 +
  select *
 +
  from
 +
    (select diaFn, horaFn from formaParte where nomActo = 'osos'
 +
    union
 +
    select diaFn, horaFn from formaParte where nomActo = 'leones')
 +
  order by diaFn, horaFn;
 +
 
 +
Si quiero usar funciones agrupadas sobre grupos, entonces mi tabla es la de grupos
 +
  -- la duracion de la funcion mas larga
 +
  select max(duracionFuncion)
 +
  from
 +
    (select diaFn, horaFn, sum(duracion) duracionFuncion
 +
    from formaParte
 +
    group by diaFn, horaFn) as duracionPorFuncion);
-
Concepto - básicamente es lo que ya saben de AR
 
Repaso de situaciones donde puede ser útil
Repaso de situaciones donde puede ser útil
Line 9: Line 33:
* tabla de 1x1 en comparaciones en el WHERE
* tabla de 1x1 en comparaciones en el WHERE
* IN con tabla de 1 atributo
* IN con tabla de 1 atributo
-
* NOT EXISTS
+
* NOT EXISTS vs NOT IN, queries correlacionados
-
* ¿ALL / ANY?
+

Revision as of 01:20, 28 April 2009

Concepto

Básicamente es lo que ya saben de AR: puedo hacer jugar el resultado de una consulta en otra, combinando operaciones.

Muchas veces se hace innecesario por la sintaxis básica de la sentencia SELECT de SQL, que permite hacer muchos joins, una selección (que se optimiza, entonces es como si fueran varias) y una proyección todo en una sola sentencia, y además lo del nombre compuesto de atributo evita la necesidad de renombrado.

Por otro lado, aparecen casos en donde la técnica de meter una consulta adentro de otra es muy útil. Veamos algunos.


Subqueries en el FROM

Una fácil: UNION ordenado, p.ej. quiero las funciones donde aparecen osos o leones ordenadas por fecha.

 select *
 from
   (select diaFn, horaFn from formaParte where nomActo = 'osos'
    union
    select diaFn, horaFn from formaParte where nomActo = 'leones')
 order by diaFn, horaFn;

Si quiero usar funciones agrupadas sobre grupos, entonces mi tabla es la de grupos

 -- la duracion de la funcion mas larga
 select max(duracionFuncion)
 from
   (select diaFn, horaFn, sum(duracion) duracionFuncion
    from formaParte
    group by diaFn, horaFn) as duracionPorFuncion);


Repaso de situaciones donde puede ser útil

  • en el FROM
    • UNION ordenado
    • cuando quiero hacer un join con una tabla agrupada
  • tabla de 1x1 en comparaciones en el WHERE
  • IN con tabla de 1 atributo
  • NOT EXISTS vs NOT IN, queries correlacionados
Personal tools