DB2 12 - SQL - Examples of subselects - Exemplos de subseleções



Desenvolvido por DORNELLES Carlos Alberto - Analista de Sistemas - Brasília DF. - cad_cobol@hotmail.com

DB2 12 - SQL - Examples of subselects - Exemplos de subseleções

You can use the various clauses of the subselect to construct queries.
Você pode usar as várias cláusulas da subseleção para construir consultas.

The following Example subselects illustrate how to use the various clauses of the subselect to construct queries.
As seguintes subseleções de exemplo ilustram como usar as várias cláusulas da subseleção para construir consultas.

Example 1:

Show all rows of the table DSN8C10.EMP.

Mostrar todas as linhas da tabela DSN8C10.EMP.

   SELECT * FROM DSN8C10.EMP;

Example 2:

Show the job code, maximum salary, and minimum salary for each group of rows of DSN8C10.EMP with the same job code, but only for groups with more than one row and with a maximum salary greater than 50000.

Mostre o código do trabalho, o salário máximo e o salário mínimo para cada grupo de linhas de DSN8C10.EMP com o mesmo código do trabalho, mas apenas para grupos com mais de uma linha e com um salário máximo superior a 50000.

   SELECT JOB
   ,      MAX(SALARY)
   ,      MIN(SALARY)
   FROM   DSN8C10.EMP
   GROUP  BY JOB
   HAVING COUNT(*) > 1 AND MAX(SALARY) > 50000;

Example 3:

For each employee in department E11, get the following information from the table DSN8C10.EMPPROJACT:
employee number, activity number, activity start date, and activity end date.
Using the CHAR function, convert the start and end dates to their USA formats.
Get the needed department information from the table DSN8C10.EMP.

Para cada funcionário do departamento E11, obtenha as seguintes informações da tabela DSN8C10.EMPPROJACT:
número do funcionário, número da atividade, data de início da atividade e data de término da atividade.
Usando a função CHAR, converta as datas de início e término para seus formatos dos EUA.
Obtenha as informações de departamento necessárias na tabela DSN8C10.EMP.

   SELECT EMPNO
   ,      ACTNO
   ,      CHAR(EMSTDATE,USA)
   ,      CHAR(EMENDATE,USA)
   FROM   DSN8C10.EMPPROJACT
   WHERE  EMPNO IN (SELECT EMPNO 
                    FROM   DSN8C10.EMP
                    WHERE  WORKDEPT = 'E11');

Example 4:

Show the department number and maximum departmental salary for all departments whose maximum salary is less than the average salary for all employees.
(In this Example, the subquery would be executed only one time.)

Mostrar o número do departamento e o salário máximo do departamento para todos os departamentos cujo salário máximo é menor que o salário médio de todos os funcionários.
(Neste exemplo, a subconsulta seria executada apenas uma vez.)

   SELECT WORKDEPT
   ,      MAX(SALARY)
   FROM   DSN8C10.EMP
   GROUP  BY WORKDEPT
   HAVING MAX(SALARY) < (SELECT AVG(SALARY)
                            FROM   DSN8C10.EMP);

Example 5:

Show the department number and maximum departmental salary for all departments whose maximum salary is less than the average salary for employees in all other departments.
(In contrast to Example 4, the subquery in this statement, containing a correlated reference, would need to be executed for each group.)

Mostre o número do departamento e o salário máximo do departamento para todos os departamentos cujo salário máximo é menor que o salário médio dos funcionários de todos os outros departamentos.
(Em contraste com o Exemplo 4, a subconsulta nesta instrução, contendo uma referência correlacionada, precisaria ser executada para cada grupo.)

   SELECT WORKDEPT
   ,      MAX(SALARY)
   FROM   DSN8C10.EMP Q
   GROUP  BY WORKDEPT
   HAVING MAX(SALARY) < (SELECT AVG(SALARY)
                            FROM   DSN8C10.EMP
                            WHERE  NOT WORKDEPT = Q.WORKDEPT);

Example 6:

For each group of employees hired during the same year, show the year-of-hire and current average salary.
(This Example demonstrates how to use the AS clause in a FROM clause to name a derived column that you want to refer to in a GROUP BY clause.)

Para cada grupo de funcionários contratados durante o mesmo ano, mostre o ano de contratação e o salário médio atual.
(Este exemplo demonstra como usar a cláusula AS em uma cláusula FROM para nomear uma coluna derivada que você deseja referir em uma cláusula GROUP BY.)

   SELECT HIREYEAR
   ,      AVG(SALARY)
   FROM  (SELECT YEAR(HIREDATE) AS HIREYEAR
          ,      SALARY
          FROM   DSN8C10.EMP) AS NEWEMP
   GROUP BY HIREYEAR;

Example 7:

For an Example of how to group the results of a query by an expression in the SELECT clause without having to retype the expression, see Example 4 for CASE expressions.

Para obter um exemplo de como agrupar os resultados de uma consulta por uma expressão na cláusula SELECT sem precisar redigitar a expressão, consulte o Exemplo 4 para expressões CASE.


Example 8:

Get the employee number and employee name for all the employees in DSN8C10.EMP.
Order the results by the date of hire.

Obtenha o número e o nome do funcionário de todos os funcionários em DSN8C10.EMP.
Ordene os resultados pela data de contratação.

   SELECT EMPNO
   ,      FIRSTNME
   ,      LASTNAME
   FROM   DSN8C10.EMP
   ORDER  BY HIREDATE;

Example 9:

Select all the rows from tables T1 and T2 and order the rows such that the rows from table T1 are first and are ordered by column C1, followed by the rows from T2, which are ordered by column C2.
The rows of T1 are retrieved by one subselect which is connected to the results of another subselect that retrieves the rows from T2.
Each subselect specifies the ordering for the rows from the referenced table.
Note that both subselects need to be enclosed in parenthesis because each subselect is not the outermost fullselect.
Because each of the two ORDER BY clauses appears in a parenthesized subselect, neither ORDER BY clause provides an ordering for the outermost result table.

Selecione todas as linhas das tabelas T1 e T2 e ordene as linhas de forma que as linhas da tabela T1 sejam as primeiras e sejam ordenadas pela coluna C1, seguidas pelas linhas de T2, que são ordenadas pela coluna C2.
As linhas de T1 são recuperadas por uma subseleção que está conectada aos resultados de outra subseleção que recupera as linhas de T2.
Cada subseleção especifica a ordem das linhas da tabela referenciada.
Observe que as duas subseleções precisam ser colocadas entre parênteses porque cada subseleção não é a seleção completa mais externa.
Como cada uma das duas cláusulas ORDER BY aparece em uma subseleção entre parênteses, nenhuma das cláusulas ORDER BY fornece uma ordem para a tabela de resultados mais externa.

   (SELECT * FROM T1 ORDER BY C1)
   UNION
   (SELECT * FROM T2 ORDER BY C2);

Example 10:

Specify the ORDER BY clause to order the results of a union using the second column of the result table if the union.
In this Example, the second ORDER BY clause applies to the results of the outermost fullselect (the result of the union) rather than to the second subselect.
If the intent is to apply the second ORDER BY clause to the second subselect, the second subselect should be enclosed within parentheses as shown in Example 9.

Especifique a cláusula ORDER BY para ordenar os resultados de uma união usando a segunda coluna da tabela de resultados se a união.
Neste exemplo, a segunda cláusula ORDER BY se aplica aos resultados da seleção completa mais externa (o resultado da união) em vez da segunda subseleção.
Se a intenção é aplicar a segunda cláusula ORDER BY à segunda subseleção, a segunda subseleção deve ser colocada entre parênteses, conforme mostrado no Exemplo 9.

   (SELECT * FROM T1 ORDER BY C1)
   UNION
   SELECT * FROM T2 ORDER BY C2

Example 11:

Retrieve all rows of table T1 with no specific ordering) and connect the result table to the rows of table T2, which have been ordered by the first column of table T2.
The ORDER BY ORDER OF clause in the fullselect specifies that the order of the rows in the result table of the union is to be inherited by the final result.

Recuperar todas as linhas da tabela T1 sem nenhuma ordem específica) e conectar a tabela de resultados às linhas da tabela T2, que foram ordenadas pela primeira coluna da tabela T2.
A cláusula ORDER BY ORDER OF na seleção completa especifica que a ordem das linhas na tabela de resultados da união deve ser herdada pelo resultado final.

   SELECT *                             
   FROM  (SELECT * FROM T1             
         UNION ALL                   
         (SELECT * FROM T2 ORDER BY 1)
         ) AS UTABLE                   
  ORDER  BY ORDER OF UTABLE;

Example 12:

The following Example uses a query to join data from a table to the result table of a nested table expression.
The query uses the ORDER BY ORDER OF clause to order the rows of the result table using the order of the rows of the nested table expression.

O exemplo a seguir usa uma consulta para juntar dados de uma tabela à tabela de resultados de uma expressão de tabela aninhada.
A consulta usa a cláusula ORDER BY ORDER OF para ordenar as linhas da tabela de resultados usando a ordem das linhas da expressão de tabela aninhada.

   SELECT T1.C1
   ,      T1.C2
   ,      TEMP.Cy
   ,      TEMP.Cx
   FROM T1,
        (SELECT T2.C1
         ,      T2.C2  
         FROM   T2 
         ORDER BY 2) AS TEMP(Cx, Cy)
   WHERE Cy = T1.C1
   ORDER BY ORDER OF TEMP;

Example 13:

Using the EMP_ACT table, find the project numbers that have an employee whose salary is in the top three salaries for all employees.

Usando a tabela EMP_ACT, encontre os números de projetos que têm um funcionário cujo salário está entre os três primeiros salários de todos os funcionários.

   SELECT EMP_ACT.EMPNO
   ,      PROJNO
   FROM   EMP_ACT
  WHERE   EMP_ACT.EMPNO IN
         (SELECT EMPLOYEE.EMPNO
          FROM   EMPLOYEE
          ORDER  BY SALARY DESC
          FETCH  FIRST 3 ROWS ONLY);

Example 14:

Assume that an external function named ADDYEARS exists.
For a given date, the function adds a given number of years and returns a new date.
(The data types of the two input parameters to the function are DATE and INTEGER.)
Get the employee number and employee name for all employees who have been hired within the last 5 years.

Suponha que exista uma função externa chamada ADDYEARS.
Para uma determinada data, a função adiciona um determinado número de anos e retorna uma nova data.
(Os tipos de dados dos dois parâmetros de entrada para a função são DATE e INTEGER.)
Obtenha o número do funcionário e o nome do funcionário para todos os funcionários que foram contratados nos últimos 5 anos.

   SELECT EMPNO
   ,      FIRSTNME
   ,      LASTNAME
   FROM   DSN8C10.EMP
   WHERE  ADDYEARS(HIREDATE, 5) > CURRENT DATE;
To distinguish the different types of joins, to show nested table expressions, and to demonstrate how to combine join columns, the remaining Examples use these two tables:

Para distinguir os diferentes tipos de junções, para mostrar expressões de tabela aninhadas e para demonstrar como combinar colunas de junção, os exemplos restantes usam estas duas tabelas:

      The PARTS table                         The PRODUCTS table
PART      PROD#   SUPPLIER              PROD#     PRODUCT        PRICE
=======   =====   ============          =====     ===========    =====
WIRE      10      ACWF                  505       SCREWDRIVER    3.70
OIL       160     WESTERN_CHEM          30        RELAY          7.55
MAGNETS   10      BATEMAN               205       SAW            18.90
PLASTIC   30      PLASTIK_CORP          10        GENERATOR      45.75
BLADES    205     ACE_STEEL

Example 15:

Join the tables on the PROD# column to get a table of parts with their suppliers and the products that use the parts:

Junte as tabelas na coluna PROD# para obter uma tabela de peças com seus fornecedores e os produtos que usam as peças:

   SELECT PART
   ,      SUPPLIER 
   ,      PARTS.PROD#
   ,      PRODUCT
   FROM   PARTS
   ,      PRODUCTS
   WHERE  PARTS.PROD# = PRODUCTS.PROD#;
or
   SELECT PART
   ,      SUPPLIER
   ,      PARTS.PROD#
   ,      PRODUCT
   FROM   PARTS INNER JOIN PRODUCTS
          ON PARTS.PROD# = PRODUCTS.PROD#;
Either one of these two statements give this result:

Qualquer uma dessas duas declarações fornece este resultado:

PART        SUPPLIER       PROD#     PRODUCT
=======     ============   =====     ==========
WIRE        ACWF           10        GENERATOR
MAGNETS     BATEMAN        10        GENERATOR
PLASTIC     PLASTIK_CORP   30        RELAY
BLADES      ACE_STEEL      205       SAW

Notice two things about the Example:
Observe duas coisas sobre o exemplo:

  • There is a part in the parts table (OIL) whose product (#160) is not listed in the products table.
    There is a product (SCREWDRIVER, #505) that has no parts listed in the parts table.
    Neither OIL nor SCREWDRIVER appears in the result of the join.

    An outer join, however, includes rows where the values in the joined columns do not match.

    Há uma parte na tabela de peças (OIL) cujo produto (# 160) não está listado na tabela de produtos.
    Existe um produto (SCREWDRIVER, # 505) que não possui peças listadas na tabela de peças.
    Nem OIL nem SCREWDRIVER aparecem no resultado da junção.

    Uma junção externa, entretanto, inclui linhas onde os valores nas colunas unidas não coincidem.

  • There is explicit syntax to express that this familiar join is not an outer join but an inner join.
    You can use INNER JOIN in the FROM clause instead of the comma.
    Use ON when you explicitly join tables in the FROM clause.

    Há uma sintaxe explícita para expressar que essa junção familiar não é uma junção externa, mas uma junção interna.
    Você pode usar INNER JOIN na cláusula FROM em vez da vírgula.
    Use ON quando você unir tabelas explicitamente na cláusula FROM.

You can specify more complicated join conditions to obtain different sets of results.
For Example, eliminate the suppliers that begin with the letter A from the table of parts, suppliers, product numbers and products:

Você pode especificar condições de junção mais complicadas para obter diferentes conjuntos de resultados.
Por exemplo, elimine os fornecedores que começam com a letra A da tabela de peças, fornecedores, números de produtos e produtos:

   SELECT PART
   ,      SUPPLIER
   ,      PARTS.PROD#
   ,      PRODUCT
   FROM   PARTS INNER JOIN PRODUCTS
          ON  PARTS.PROD# = PRODUCTS.PROD#
          AND SUPPLIER NOT LIKE 'A%';

The result of the query is all rows that do not have a supplier that begins with A:

O resultado da consulta são todas as linhas que não têm um fornecedor que comece com A:

PART        SUPPLIER       PROD#     PRODUCT
=======     ============   =====     ==========
MAGNETS     BATEMAN        10        GENERATOR
PLASTIC     PLASTIK_CORP   30        RELAY

Example 16:

Join the tables on the PROD# column to get a table of all parts and products, showing the supplier information, if any.

Junte as tabelas da coluna PROD# para obter uma tabela de todas as peças e produtos, mostrando as informações do fornecedor, se houver.


   SELECT PART
   ,      SUPPLIER
   ,      PARTS.PROD#
   ,      PRODUCT
   FROM   PARTS FULL OUTER JOIN PRODUCTS
          ON PARTS.PROD# = PRODUCTS.PROD#;
The result is: - O resultado é:
PART        SUPPLIER       PROD#     PRODUCT
=======     ============   =====     ==========
WIRE        ACWF           10        GENERATOR
MAGNETS     BATEMAN        10        GENERATOR
PLASTIC     PLASTIK_CORP   30        RELAY
BLADES      ACE_STEEL      205       SAW
OIL         WESTERN_CHEM   160       (null)
(null)      (null)         (null)    SCREWDRIVER

The clause FULL OUTER JOIN includes unmatched rows from both tables.
Missing values in a row of the result table are filled with nulls.

A cláusula FULL OUTER JOIN inclui linhas sem correspondência de ambas as tabelas.
Os valores ausentes em uma linha da tabela de resultados são preenchidos com nulos.


Example 17:

Join the tables on the PROD# column to get a table of all parts, showing what products, if any, the parts are used in:

Junte as tabelas na coluna PROD# para obter uma tabela de todas as peças, mostrando quais produtos, se houver, as peças são usadas em:

   SELECT PART
   ,      SUPPLIER
   ,      PARTS.PROD#
   ,      PRODUCT
   FROM   PARTS LEFT OUTER JOIN PRODUCTS
          ON PARTS.PROD# = PRODUCTS.PROD#;
The result is: - O resultado é:
PART        SUPPLIER       PROD#     PRODUCT
=======     ============   =====     ==========
WIRE        ACWF           10        GENERATOR
MAGNETS     BATEMAN        10        GENERATOR
PLASTIC     PLASTIK_CORP   30        RELAY
BLADES      ACE_STEEL      205       SAW
OIL         WESTERN_CHEM   160       (null)

The clause LEFT OUTER JOIN includes rows from the table identified before it where the values in the joined columns are not matched by values in the joined columns of the table identified after it.

A cláusula LEFT OUTER JOIN inclui linhas da tabela identificada antes dela, onde os valores nas colunas unidas não correspondem aos valores nas colunas unidas da tabela identificada depois dela.


Example 18:

Join the tables on the PROD# column to get a table of all products, showing the parts used in that product, if any, and the supplier.

Junte as tabelas na coluna PROD # para obter uma tabela de todos os produtos, mostrando as peças usadas naquele produto, se houver, e o fornecedor.

   SELECT PART
   ,      SUPPLIER
   ,      PRODUCTS.PROD#
   ,      PRODUCT
   FROM   PARTS RIGHT OUTER JOIN PRODUCTS
          ON PARTS.PROD# = PRODUCTS.PROD#;
The result is: - O resultado é:
PART        SUPPLIER       PROD#     PRODUCT
=======     ============   =====     ===========
WIRE        ACWF           10        GENERATOR
MAGNETS     BATEMAN        10        GENERATOR
PLASTIC     PLASTIK_CORP   30        RELAY
BLADES      ACE_STEEL      205       SAW
(null)      (null)         505       SCREWDRIVER

The clause RIGHT OUTER JOIN includes rows from the table identified after it where the values in the joined columns are not matched by valuesin the joined columns of the table identified before it.

A cláusula RIGHT OUTER JOIN inclui linhas da tabela identificada depois dela, onde os valores nas colunas unidas não são correspondidos por valores nas colunas unidas da tabela identificada antes dela.


Example 19:

The result of Example 16 (a full outer join) shows the product number for SCREWDRIVER as null, even though the PRODUCTS table contains a product number for it.
This is because PRODUCTS.PROD# was not listed in the SELECT list of the query.
Revise the query using COALESCE so that all part numbers from both tables are shown.

O resultado do Exemplo 16 (uma junção externa completa) mostra o número do produto para SCREWDRIVER como nulo, embora a tabela PRODUCTS contenha um número de produto para ele.
Isso ocorre porque PRODUCTS.PROD # não estava listado na lista SELECT da consulta.
Revise a consulta usando COALESCE para que todos os números de peça de ambas as tabelas sejam mostrados.

   SELECT PART
   ,      SUPPLIER
   ,      COALESCE(PARTS.PROD#, PRODUCTS.PROD#) AS PRODNUM, PRODUCT
   FROM   PARTS FULL OUTER JOIN PRODUCTS
          ON PARTS.PROD# = PRODUCTS.PROD#;

In the result, notice that the AS clause (AS PRODNUM), provides a name for the result of the COALESCE function:

No resultado, observe que a cláusula AS (AS PRODNUM) fornece um nome para o resultado da função COALESCE:

PART        SUPPLIER       PRODNUM   PRODUCT
=======     ============   =======   ===========
WIRE        ACWF           10        GENERATOR
MAGNETS     BATEMAN        10        GENERATOR
PLASTIC     PLASTIK_CORP   30        RELAY
BLADES      ACE_STEEL      205       SAW
OIL         WESTERN_CHEM   160       (null)
(null)      (null)         505       SCREWDRIVER

Example 20:

For all parts that are used in product numbers less than 200, show the part, the part supplier, the product number, and the product name.
Use a nested table expression.

Para todas as peças usadas em números de produto inferiores a 200, mostre a peça, o fornecedor da peça, o número do produto e o nome do produto.
Use uma expressão de tabela aninhada.

   SELECT PART
   ,      SUPPLIER
   ,      PRODNUM
   ,      PRODUCT
   FROM  (SELECT PART
          ,      PROD# AS PRODNUM
          ,      SUPPLIER
          FROM   PARTS
          WHERE  PROD# < 200) AS PARTX
                 LEFT OUTER JOIN PRODUCTS ON PRODNUM = PROD#;
The result is: - O resultado é:
PART        SUPPLIER         PRODNUM     PRODUCT
=======     ============     =======     ==========
WIRE        ACWF             10          GENERATOR
MAGNETS     BATEMAN          10          GENERATOR
PLASTIC     PLASTIK_CORP     30          RELAY
OIL         WESTERN_CHEM     160         (null)

Example 21:

Examples of statements with DISTINCT specified more than once in a subselect:

Exemplos de instruções com DISTINCT especificado mais de uma vez em uma subseleção:

   SELECT DISTINCT COUNT(DISTINCT A1)
   ,      COUNT(A2)
   FROM T1;
   SELECT COUNT(DISTINCT A))
   FROM   T1
   WHERE  A3 > 0
   HAVING AVG(DISTINCT A4) >1;

Example 22:
Examples of cross join to combine information for all customers with all states.

Exemplos de junção cruzada para combinar informações de todos os clientes em todos os estados.

Use a cross join to combine information for all customers with all of the states.
The cross join combines all rows in both tables and creates a Cartesian product.
Assume that the following tables exist:

Use uma junção cruzada para combinar informações de todos os clientes de todos os estados.
A junção cruzada combina todas as linhas em ambas as tabelas e cria um produto cartesiano.
Suponha que existam as seguintes tabelas:
Customer:
---------------------
ACOL1     |  ACOL2
---------------------
A1        |  AA1
A2        |  AA2
A3        |  AA3
---------------------
States:
---------------------
BCOL1     |  BCOL2
---------------------
B1        |  BB1
B2        |  BB2
---------------------

The following two select statements produce identical results:

As duas instruções de seleção a seguir produzem resultados idênticos:

   SELECT * FROM customer CROSS JOIN states
   SELECT * FROM A, B

The result table for either of these select statements looks like the following:

A tabela de resultados para qualquer uma dessas instruções select tem a seguinte aparência:

------------------------------------------
ACOL1     |  ACOL2  |  BCOL1   |  BCOL2
------------------------------------------
A1        |  AA1    |  B1      |  BB1
A1        |  AA1    |  B2      |  BB2
A2        |  AA2    |  B1      |  BB1
A2        |  AA2    |  B2      |  BB2
A3        |  AA3    |  B1      |  BB1
A3        |  AA3    |  B2      |  BB2
------------------------------------------

Example 23:
Example of using a typed-correlation-clause when referencing a generic table function.

Exemplo de uso de uma cláusula de correlação digitada ao fazer referência a uma função de tabela genérica.

In the following select statement, 'tf6' is a generic table function defined using the CREATE FUNCTION (external table) statement.
The typed-correlation-clause is used to define the column names and data types of the result table.

Na seguinte instrução de seleção, 'tf6' é uma função de tabela genérica definida usando a instrução CREATE FUNCTION (tabela externa).
A cláusula de correlação digitada é usada para definir os nomes das colunas e os tipos de dados da tabela de resultados.
   SELECT c1
   ,      c2
   FROM   T1(tf6('abcd')) AS z (c1 int, c2 varchar(100));


© Copyright IBM Corp.