iberck
10/1/2015 - 7:14 PM

subqueries

subqueries

Subqueries

  • Un subquery puede estar presente en la clausula FROM,WHERE,HAVING
  • Un subquery casi siempre es utilizado dentro de la clausula WHERE.
  • Cuando el subquery retorna 0 o 1 resultado se utiliza where x =,<,> (subquery)
  • Cuando el subquery retorna 0 o N resultados se utiliza where x IN (subquery)
  • Los queries internos se ejecutan primero que los queries padres para que los resultados del query interno puedan ser pasados al query externo.

Subqueries que retornan 1 fila

Ejemplo de subquery con 1 resultado y el signo de comparación >, como se puede observar el subquery regresará siempre 1 resultado por lo que se pueden utilizar cualquiera de los símbolos de comparación:

SELECT * FROM neworder  
WHERE advance_amount <  
(SELECT MAX(advance_amount) FROM orders); 

Ejemplo 2:

SELECT agent_name, agent_code, phone_no  
FROM agents  
WHERE agent_code =   
(SELECT agent_code   
FROM agents  
WHERE agent_name = 'Alex');

Subqueries que retornan múltiples filas

Multiple row subquery returns one or more rows to the outer SQL statement. You may use the IN, ANY, or ALL operator in outer query to handle a subquery that returns multiple rows.

SELECT ord_num,ord_amount,ord_date,  
cust_code, agent_code  
FROM orders  
WHERE agent_code IN(  
SELECT agent_code FROM agents  
WHERE working_area='Bangalore');  

Subqueries en la clausula FROM

You may place a subquery in the FROM clause of an outer query. These types of subqueries are also known is inline views because the subquery provides data inline with the FROM clause -

SELECT item_id  
FROM    
(SELECT item_id     
FROM FOODS      
WHERE item_id<4)

Ejemplo avanzado

-- El siguiente query muestra cómo es posible hacer joins entre subconsultas
select q1.p_id_pollster,count from (
    -- el query representa una tabla: obtener los encuestadores asignados a los canales de la encuesta.
    select p_id_pollster from ch_pollster where c_id_ch in (
        select id_ch from channel where s_id_survey=2
    )
) as q1 left outer join (
    -- el query representa una tabla: obtener la producción de los encuestadores de cierta encuesta.
    select p_id_pollster, count(*) from s_applied sa 
    where s_id_survey=2 group by p_id_pollster
) as q2 on q1.p_id_pollster = q2.p_id_pollster