Linguagens SQL e NoSQL

Anotações importantes relativa a disciplina "Linguagens SQL e NoSQL, MBA em Análise de Dados com BI e Big Data" (EAD Unicsul) - Publicado em agosto/2020.



Data Query Language (DQL)

Para os exemplos e as práticas serão utilizadas as tabelas EMP e DEPT (ambiente default Oracle), que contêm, respectivamente, informações sobre os funcionários e sobre os departamentos de uma empresa e, para que não exista necessidade de armazenar os dados sobre o nome do departamento e a localização dos mesmos para cada registro de funcionários, elas são relacionadas por meio dos campos DEPTNO – que na tabela EMP é chave estrangeira e na tabela DEPT é chave primária.

SQL
Comparação entre BD Relacional x BD NoSQL
Referência: Tabela 1 – Unidade 3 – Linguagens SQL e NoSQL (Pós UNICSUL)

     

Instrução SELECT Básica
SELECT [DISTINCT] {*, coluna [apelido],...} FROM tabela;
  • SELECT: identifica que colunas;
  • FROM: identifica qual tabela.

Selecionando Todas as Colunas:

SQL> SELECT *
2 FROM dept;

Selecionando Colunas Específicas:

SQL> SELECT deptno, loc
2 FROM dept;

Usando Apelidos nos Campos:

SQL> SELECT ename AS name, sal salary
2 FROM emp;
SQL> SELECT ename “Name”,
2 sal*12 “Annual Salary”
3 FROM emp;

O primeiro exemplo exibe o nome e o salário mensal de todos os funcionários. Note que a palavra-chave AS opcional foi usada antes do nome do apelido de coluna. O resultado da consulta deverá ser o mesmo caso a palavra-chave AS seja usada ou não. O segundo exemplo exibe o nome e o salário anual de todos os funcionários. Como o Annual Salary possui espaços, ele foi incluído entre aspas duplas.

Limitando Linhas Selecionadas

SQL> SELECT ename, job, deptno
2 FROM emp
3 WHERE job=’CLERK’;

Restringe as linhas retornadas usando a cláusula WHERE.

ENAME JOB DEPTNO
------- ------- -------
JAMES CLERK 30
SMITH CLERK 20
ADAMS CLERK 20
MILLER CLERK 10
Operadores Aritméticos

Os operadores aritméticos podem ser utilizados em qualquer cláusula de uma instrução SQL, com exceção da cláusula FROM.

  • + Adição
  • - Subtração
  • * Multiplicação
  • / Divisão

Exemplo: exibir o nome de todos os funcionários da tabela EMP, os seus salário e salários acrescidos de 300,00.

SQL> SELECT ename, sal, sal+300
2 FROM emp;

Resultado:

ENAME SAL SAL+300
KING 5000 5300
BLAKE 2850 3150
CLARK 2450 2750
JONES 2975 3275
MARTIN 1250 1550
ALLEN 1600 1900

Observe, no exemplo anterior, que a coluna SAL+300 resultante do cálculo não é uma nova coluna na tabela EMP, ela é somente para exibição. Por default, o nome de uma coluna surge do cálculo que a criou, nesse caso, sal+300. Se uma expressão aritmética tiver mais de um operador, a multiplicação e a divisão serão avaliadas primeiro. Se os operadores dentro de uma expressão tiverem a mesma prioridade, então a avaliação será realizada da esquerda para a direita.

Exemplo:

SQL> SELECT ename, sal, sal + ((sal * 30) / 100)
2 FROM emp;

Pode-se sobrepor as normas de precedência usando parênteses para especificar a ordem de execução dos operadores. Isolando as operações entre parênteses, forçar-se a avaliação da expressão entre parênteses primeiro.

Operadores de Comparação

São utilizados para estabelecer uma relação de comparação entre valores ou expressões. O resultado dessa comparação é sempre um valor lógico (booleano) verdadeiro ou falso. Esses operadores podem ser utilizados em comparações que envolvem apenas uma linha.

  • = : igual
  • <> : diferente
  • > : maior do que
  • < : menor do que
  • <= : menor ou igual a
  • >= : maior ou igual a
  • between v1 and v2 : entre dois valores (inclusive)
  • in (lista de valores) : compara a coluna aos valores de uma lista
  • like : vincula um padrão de caractere
  • is null : é um valor nulo
Operador Between

os valores especificados com o operador BETWEEN são inclusivos, deve-se especificar primeiro o limite inferior. A instrução SELECT abaixo retorna as linhas da tabela EMP para qualquer funcionário cujo salário esteja entre US$1.000 e US$1.500. SQL> SELECT ename, sal 2 FROM emp 3 WHERE sal BETWEEN 1000 AND 1500; | | Limite Limite Inferior Superior Operador IN: para testar os valores em uma determinada lista, use o operador IN. Pode ser usado com qualquer tipo de dados. O exemplo seguinte retorna uma linha da tabela EMP para qualquer funcionário cujo nome estiver incluído na lista de nomes na cláusula WHERE: SQL> SELECT empno, ename, mgr, deptno 2 FROM emp 3 WHERE ename IN (‘FORD’ , ‘ALLEN’); Se forem utilizados caracteres ou datas na lista, eles devem estar entre aspas simples (‘’).

Funções SQL

As funções SQL, assim como em outras linguagens, recebem argumentos, processam esses argumentos e retornam um resultado ao ambiente de chamada. Um argumento pode ser uma constante fornecida pelo usuário, variável, nome de coluna ou uma expressão.

Funções de Uma Única Linha

Funções de uma única linha são usadas para manipular itens de dados. Elas aceitam um ou mais argumentos e retornam um valor para cada linha retornada pela consulta. As funções de linha são utilizadas para manipular caracteres, números, data e para a conversão de dados.

Funções de linha para manipulação de caracteres

  1. LOWER(arg1)
    converte uma cadeia de caracteres em letras minúsculas.
    Exemplo: Select Lower(ename) from emp;
  2. UPPER(arg1)
    converte uma cadeia de caracteres em letras maiúsculas.
    Exemplo: Select Upper(ename) from emp;
  3. INITCAP(arg1)
    converte a primeira letra de cada palavra para maiúscula e mantém as outras letras em minúscula.
    Exemplo: Select Initicap(ename) from emp;
  4. CONCAT(arg1, arg2)
    concatena dois valores.
    Exemplo: Select Concat(ename, job) from emp;
    A função concat opera apenas com dois argumentos; para concatenar n valores, utilize o operador de concatenação ||.
    Exemplo: Select ename || ‘ trabalha como ’ || job from emp;
  5. SUBSTR(arg1, arg2, arg3)
    extrai uma cadeia de caracteres do arg1 iniciando a partir da posição indicada em arg2, conforme o tamanho especificado em arg3.
    Exemplo: Select Substr(‘Plataformas’, 2, 4) from dual; Resultado: lata
  6. LENGTH(arg1)
    exibe o tamanho de um argumento.
    Exemplo: Select Length(‘Plataformas’) from dual; Resultado: 11
  7. INSTR(arg1, arg2)
    localiza a posição numérica de arg2 em arg1.
    Exemplo: Select Instr(‘Plataformas’, ‘t’) from dual; Resultado: 4
  8. LPAD(arg1,arg2, arg3)
    exibe o valor de arg1 justificado à direita, complementando as posições indicadas em arg2, e não preenchidas, com o caractere indicado em arg3 do lado esquerdo do valor.
    Exemplo: Select Lpad(sal,10, ‘*’) from emp; Resultado: ******2000
  9. RPAD(arg1,arg2, arg3):
    exibe o valor de arg1 justificado à esquerda, complementando as posições indicadas em arg2, e não preenchidas, com o caractere indicado em arg3 do lado direito do valor.
    Exemplo: Select rpad(sal,10, ‘*’) from emp; Resultado: 2000******

Funções de linha para manipulação de números

  1. ROUND(arg, precisão)
    arredonda a coluna, expressão ou valor para n casas decimais. Se o segundo argumento for 0 ou estiver ausente, o valor será arredondado para nenhuma casa decimal. Se o segundo argumento for 2, o valor será arredondado para duas casas decimais. Se o segundo argumento for -2, o valor será arredondado para duas casas decimais para a esquerda. A função ROUND pode também ser utilizada com funções de data.
    Exemplos: SELECT ROUND(1500.8987) FROM DUAL; Resultado: 1500.9 | SELECT ROUND(1999.8987,-2) FROM DUAL; Resultado: 2000
  2. TRUNC (arg1, arg2)
    trunca a coluna, expressão ou valor para n casas decimais. Se o segundo argumento for 0 ou estiver ausente, o valor será truncado para nenhuma casa decimal. Se o segundo argumento for 2, o valor será truncado para duas casas decimais. Se o segundo argumento for -2, o valor será truncado para duas casas decimais para a esquerda. Pode ser usada com funções de data.
    Exemplo: SELECT TRUNC(1500.8987) FROM DUAL; Resultado: 1500.89
  3. MOD(arg1, arg2)
    retorna o resto da divisão de arg1 por arg2
    Exemplo: SELECT MOD(14,3) FROM DUAL; Resultado: 2
  4. POWER(n,m)
    calcula n elevado a m.
    Exemplo: Select power(5, 9) from dual;
  5. SQRT(n)
    calcula a raiz quadrada de n.
    Exemplo: Select SQRT(88) from dual;
  6. CEIL(n)
    arredonda n para cima
    Exemplo: Select CEIL(25.2) from dual; Resultado: 26
  7. FLOOR(n)
    arredonda n para baixo.
    Exemplo: Select FLOOR(25.2) from dual; Resultado: 25
Funções de linha para manipulação de datas

O Oracle armazena datas em um formato numérico interno, representando o século, ano, mês, dia, horas, minutos e segundos. Sendo assim, pode-se executar operações aritméticas com elas. O formato de entrada e exibição default para qualquer data é DD-MON-YY. Datas válidas para a Oracle estão entre 1 de janeiro, 4712 A.C. e 31 de dezembro, 9999 D.C. O exemplo apresentado a seguir utiliza o operador aritmético de subtração.

Exemplo: exibir o nome e o número de semanas trabalhadas de todos os funcionários:

SQL> SELECT ename, (SYSDATE - hiredate) / 7 SEMANAS
2 FROM emp
3 WHERE deptno = 10;

Resultado:
ENAME SEMANAS
KING 830.93709
CLARK 853.93709
MILLER 821.36566
...

SYSDATE: Retorna a data e a hora atual. Exemplo: exibir a data do sistema.

SQL> Select sysdate from dual;

Resultado: 18/03/03

MONTHS_BETWEEN(data1, data2): retorna o número de meses entre a data1 e a data2. O resultado pode ser positivo ou negativo. Se data1 for posterior a data2, o resultado será positivo; se data1 for anterior a data2, o resultado será negativo. A parte não-inteira do resultado representa uma parte do mês. Exemplo: selecionar o número de meses trabalhados de cada funcionário.

SQL> SELECT ENAME, TRUNC(MONTHS_BETWEEN(SYSDATE, HIREDATE))
AS MESES FROM EMP;

Resultado:
ENAME MESES
KING 253
BLAKE 259
CLARK 258
JONES 260
...

ADD_MONTHS( ): adiciona um número de meses, representados por n à data. O valor de n deve ser inteiro e pode ser positivo ou negativo. Exemplo: adicionar 10 meses à data de admissão do funcionário.

SQL> SELECT ENAME,
2 ADD_MONTHS( HIREDATE, 10) AS ADICIONAR_10_MESES
3 FROM EMP;

Resultado:
ENAME ADICIONAR_10
KING 17-SEP-82
BLAKE 01-MAR-82
CLARK 09-APR-82
...

NEXT_DAY(data, ‘char’): localiza a data do próximo dia especificado da data seguinte da semana (‘char’). O valor de char pode ser um número representando um dia ou uma string de caractere. Exemplo: exibir a data do próximo domingo a partir da data de admissão para cada funcionário.

SQL> SELECT ENAME, NEXT_DAY(HIREDATE, 1) FROM EMP;

Resultado:
ENAME NEXT_DAY(
KING 22-NOV-81
BLAKE 03-MAY-81
CLARK 14-JUN-81
...

LAST_DAY(data): localiza a data do último dia do mês da data especificada em data. Exemplo: exibir o último dia do mês a partir da data de admissão de cada funcionário.

SQL> SELECT ENAME, LAST_DAY(HIREDATE) FROM EMP;

Resultado:
ENAME LAST_DAY(
KING 30-NOV-81
BLAKE 31-MAY-81
CLARK 30-JUN-81
...

TRUNC(data[, ‘formato’]): retorna a data com a parte da hora do dia truncada para a unidade especificada pelo modelo de formato formato. Se o modelo de formato formato for omitido, a data será truncada para o dia mais próximo. O formato pode representar o dia, mês ou ano. Exemplo:

SQL> SELECT ENAME, TRUNC(HIREDATE, ‘YEAR’) FROM EMP;

ENAME TRUNC(HIR
KING 01-JAN-81
BLAKE 01-JAN-81
CLARK 01-JAN-81
...
Funções para a Conversão de Dados

Muitas vezes é necessário que conversões de dados sejam feitas para que seja possível a realização de alguma operação. Para isso, existem as funções de conversão de tipos de dados TO_CHAR(numero ou data, formato), TO_NUMBER(char), TO_DATE(char, ‘formato’), NVL(coluna, valor).

Exemplo 1 – Exibir a data e hora do sistema seguindo o formato do exemplo: 30/ Abril/2004 11:32:15.

SQL> Select to_char(sysdate,’DD/MMMM/YYYYHH24:MI:SS’)
2 from dual;

Resultado:
18/MARÇO/2003 18:31:00

Exemplo 2 – Exibir a data e hora do sistema seguindo o formato do exemplo: 30 de Abril de 2004, 11:32 manhã.

SQL> select
2 to_char(sysdate, ‘dd “de” month “de” yyyy “,” hh:mi am’)
3 from dual;

Resultado:
18 de março de 2003 , 06:33 tarde
Conversão de Números em Caracteres

Assim como na conversão de datas em caracteres, a conversão de números em caracteres é especialmente utilizada para a manipulação que requeira a apresentação de números em formatos específicos. A seguir, são apresentados alguns exemplos de formatos e a exibição gerada pela sua utilização:

Exemplo: valor de entrada 1234.

  • $: exibe o cifrão no lado esquerdo do valor.
    Formato: $99999
    Resultado: $1234
  • ,: separador de milhar.
    Formato: 999,999
    Resultado: 1,234
  • .: separador decimal.
    Formato: 99999.99
    Resultado: 1234.00
  • 0: completa com zeros à esquerda quando o valor informado tiver comprimento menor do que o especificado.
    Formato: 099999
    Resultado: 01234
  • 9: completa com brancos à esquerda quando o valor informado tiver comprimento menor do que o especificado.
    Formato: 99999
    Resultado: b1234

Exemplo: exibir os valores da coluna do salário no formato original e no formato monetário.

SQL> SELECT sal, TO_CHAR(sal, ‘$99,999.99’) FROM EMP;

Resultado:
SAL TO_CHAR(SAL
800 $800.00
1600 $1,600.00
1250 $1,250.00
Conversão de Caracteres em Números

Converte uma cadeia de caracteres numéricos para um número inteiro. Exemplo: exibir o resto da divisão do caractere 999 por 5.

SQL> select mod(to_number(‘999’),5) from dual;

Resultado:4

Observe que o valor 999 é do tipo caractere. Sendo assim, para a realização da operação aritmética solicitada, deve-se convertê-lo para um tipo numérico.

Conversão Caracteres em Datas

Converte uma cadeia de caracteres para data. Exemplo:

SQL> Select to_date(‘01/março/2003’) from dual;

Resultado: 01/03/03
Outras Funções de Linha

NVL (arg1, arg2): Conversão de nulos em valores. O valor informado em arg2 substitui os nulos encontrados em arg1. Pode-se usar NVL para converter qualquer tipo de dados, porém o valor do retorno deverá ser do mesmo tipo de dados do arg1. Exemplo: exibir o nome, salário, comissão e comissão total de todos os funcionários. Na coluna comissão total, se o funcionário não possuir comissão, deverá ser exibido o valor 0.

SQL> SELECT ename, sal, comm, NVL(comm, 0) as “COMISSAO
TOTAL” FROM EMP;

Resultado:
ENAME SAL COMM NVL(COMM,0)
SMITH 800 0
ALLEN 1600 300 300
WARD 1250 500 500
JONES 2975 0
MARTIN 1250 1400 1400
BLAKE 2850 0

DECODE (coluna, valor1, operação1, valor2, operação2, ... operaçãoN): Funciona de maneira análoga à estrutura de seleção Se-Senão.
A função decode verifica se o conteúdo do argumento coluna é igual ao valor1 – se verdadeiro, então realiza a operação indicada em operação1; se não for, verifica se o conteúdo da coluna é igual ao valor2 – se for verdadeiro, realiza a operação indicada em operação2 e segue até o final.
A operaçãoN (default) será realizada para todas as linhas cuja coluna não atenda às condições anteriores. Se o valor default for omitido, será retornado um valor nulo onde um valor de pesquisa não corresponde a quaisquer valores de resultado.
Exemplo: exibir os cargos e salários dos funcionários e calcular o reajuste salarial de acordo com as especificações:

# Cargo Percentual de reajuste
1 ANALIST 10%
2 CLERK 15%
3 MANAGER 20%
4 Demais cargos 0%
SQL> SELECT job, sal,
2 DECODE(job,’ANALYST’,SAL*1.1,
3 ‘CLERK’ , SAL*1.15,
4 ‘MANAGER’, SAL*1.20,
5 SAL) SAL_REVISADO
6 FROM emp;

Resultado:
JOB SAL SAL_REVISADO
PRESIDENT 5000 5000
MANAGER 2850 3420
MANAGER 2450 2940
...

A solução do exemplo anterior pode ser lida da seguinte maneira:

  1. Selecionar cargo, salário e ...
  2. se cargo for igual a ‘ANALYST’, então aumente o salário em 10%
  3. se cargo for igual a ‘CLERK’, então aumente o salário em 15%
  4. se cargo for igual a ‘MANAGER’, então aumente o salário em 20%
  5. senão mostre o salário apenas da tabela EMP

Funções de Grupo

Diferente das funções de uma única linha, as funções de grupo operam em conjuntos de linhas para fornecer um resultado por grupo. As operações das funções de grupo podem envolver todas as linhas de uma tabela ou conjuntos de linhas definidos por critérios pré-estabelecidos.

Assim como as funções de diversas outras linguagens ou aplicativos, as funções disponíveis na SQL requerem argumentos para realização das operações e retornam valores; nesse caso, os argumentos serão representados pelo nome da coluna: FUNÇÃO(coluna).

Algumas funções disponíveis:

  • AVG ( ) – Retorna a média obtida entre os valores de um conjunto;
  • COUNT ( ) – Retorna a quantidade de ocorrências;
  • MAX ( ) – Retorna o maior valor de um conjunto;
  • MIN ( ) – Retorna o menor valor de um conjunto;
  • SUM( ) – Retorna a somatória dos valores de um conjunto;
  • VARIANCE( ) – Retorna a variância entre os valores de um conjunto.

Sintaxe:

SELECT [coluna,] função_de_grupo(coluna)
FROM tabela
[WHERE condição]
[GROUP BY coluna]
[ORDER BY coluna];

onde:
[coluna,] lista de colunas envolvidas na consulta, é opcional.
função_de_grupo(coluna) indica o nome da função que será utilizada e que os dados da coluna especificada serão passados como parâmetro para a função.
FROM tabela indica a tabela ou tabelas utilizadas na consulta.
[WHERE condição] indica a condição para realização da consulta, limita o conjunto de dados que irão compor o conjunto.
[GROUP BY coluna] cria grupos de dados.
[HAVING condição] limita os grupos a serem mostrados, é similar à cláusula where, mas aplica-se somente a colunas que tenham valores agrupados.
[ORDER BY coluna]; refere-se a ordenação que é por default ascendente.    

A cláusula DISTINCT faz com que a função considere somente valores nãoduplicados; ALL faz com que ela considere cada valor, inclusive duplicados. O default é ALL e, portanto, não precisa ser especificado.

Todas as funções de grupo, exceto COUNT(*), ignoram valores nulos. Para substituir um valor por valores nulos, use a função NVL.

agrupamento simples envolve todo o conjunto de uma determinada tabela, isto é, considera todas as linhas que satisfazem um critério e cada função envolvida produz um único resultado para o conjunto.

Exemplo 1: verificar o maior salário do conjunto; nesse caso, todas as linhas da tabela seriam avaliadas e apenas um valor retornaria como resultado:

SQL> Select MAX(sal)
2 from EMP;

Exemplo 2: calcular a média salarial, o maior salário, o menor salário e a somatória dos salários de todos os funcionários que possuem a cadeia de caracteres ‘SALES’ como parte do cargo.

SQL> SELECT AVG(sal), MAX(sal), MIN(sal), SUM(sal)
3 FROM emp
4 WHERE job LIKE ‘SALES%’;

Resultado:
AVG(SAL) MAX(SAL) MIN(SAL) SUM(SAL)
1400 1600 1250 5600

Exemplo 3: exibir a quantidade de funcionários que trabalham no departamento 30.

SQL> SELECT COUNT(*)
2 FROM emp
3 WHERE deptno = 30;

A Função COUNT tem dois formatos: COUNT(*) e COUNT(expr).

  • COUNT(*) retorna o número de linhas em uma tabela, inclusive linhas duplicadas e linhas contendo valores nulos em qualquer uma das colunas. Se uma cláusula WHERE estiver incluída na instrução SELECT, COUNT(*) retornará o número de linhas que satisfizer a condição na cláusula WHERE.
  • COUNT(expr) retorna o número de linhas não nulas na coluna identificada por expr.

Exemplo 4: exibir a média salarial por departamento.

SQL> SELECT deptno, AVG(sal)
2 FROM emp
3 GROUP BY deptno;

Resultado:
DEPTNO AVG(SAL)
10 2916.6667
20 2175
30 1566.6667 

ATENÇÃO: ao utilizar a cláusula GROUP BY:

  • Para limitar o resultado de linhas que será envolvido no agrupamento, deve-se primeiro utilizar a cláusula WHERE e depois a cláusula GROUP BY;
  • Todas as colunas individuais envolvidas na consulta, isto é, que não estão participando de funções de grupo, devem ser incluídas na cláusula GROUP BY;
  • Não é possível usar o apelido de coluna na cláusula GROUP BY;
  • Por default, as linhas são classificadas por ordem crescente das colunas incluídas na lista GROUP BY. Isso pode ser sobreposto usando a cláusula ORDER BY;
  • A coluna GROUP BY não precisa estar na cláusula SELECT;
  • Pode-se utilizar a função de grupo na cláusula ORDER BY.

Exemplo 5: exiba a somatória dos salários por departamento e cargo.

SQL> SELECT deptno, job, sum(sal)
2 FROM emp
3 GROUP BY deptno, job;

Resultado:
DEPTNO JOB SUM(SAL)
---------- --------- ----------
10 CLERK 1300
10 MANAGER 2450
30 CLERK 950
30 MANAGER 2850
30 SALESMAN 5600
...

No exemplo 5, primeiro as linhas são agrupadas pelo número do departamento. Em seguida, dentro dos grupos de números de departamentos, as linhas são agrupadas pelo cargo. Dessa forma, a função SUM é aplicada à coluna de salários para todos os cargos dentro de cada grupo de números de departamentos.

ATENÇÃO: qualquer coluna ou expressão na lista SELECT que não contenha uma função agregada deve estar na cláusula GROUP BY.

Restringindo Resultados do Grupo

Da mesma forma que se usa a cláusula WHERE para restringir as linhas que serão selecionadas, pode-se usar a cláusula HAVING para restringir grupos.
As seguintes etapas são executadas quando a cláusula HAVING é utilizada:

  • As linhas são agrupadas;
  • A função de grupo é aplicada ao grupo;
  • Os grupos que correspondem aos critérios na cláusula HAVING são exibidos.

ATENÇÃO: a cláusula HAVING pode preceder a cláusula GROUP BY, mas recomenda-se que a cláusula GROUP BY apareça primeiro, pois os grupos são formados e as funções de grupo são calculadas antes de a cláusula HAVING ser aplicada aos grupos na lista SELECT.

Exemplo 6: exibir os números de departamentos e o salário máximo para os departamentos, cujo salário máximo seja maior do que 2.900.

SQL> SELECT deptno, max(sal)
2 FROM emp
3 GROUP BY deptno
4 HAVING max(sal)>2900;

Resultado:
DEPTNO MAX(SAL)
10 5000
20 3000
Subconsultas

Uma subconsulta é uma consulta utilizada dentro de uma instrução SQL. Pode ser utilizada dentro de instruções select, insert, delete update ou create table. Pode ser do tipo:

  • Subconsultas de uma única linha: consultas que retornam somente uma linha da instrução SELECT interna;
  • Subconsultas de várias linhas: consultas que retornam mais de uma linha da instrução SELECT interna;
  • Subconsultas de várias colunas: consultas que retornam mais de uma coluna da instrução SELECT interna
Subconsulta em Consultas

O uso de subconsultas em Consultas é útil quando a consulta principal requer valores desconhecidos, por exemplo: suponha que seja necessário criar uma consulta para descobrir quem recebe um salário maior do que o salário de Jones; nesse caso, qual é o salário de Jones?

Para resolver esse problema, são necessárias duas consultas: uma consulta para descobrir quanto Jones recebe e outra para descobrir quem recebe mais do que ele.

Sintaxe:
SELECT colunas,
FROM tabela
WHERE condição operador expr
(SELECT select_list
FROM tabela);

Onde a condição envolve uma operação de comparação entre uma coluna e o resultado que será retornado pela subconsulta.
A subconsulta é uma consulta, portanto, pode ser construída de acordo com o problema apontado e incluir condições, funções de grupo, várias colunas etc.
A subconsulta (consulta interna) é executada uma vez antes da consulta principal. É possível colocar a subconsulta em várias cláusulas SQL ( WHERE, HAVING, FROM).

ATENÇÃO:

  • As subconsultas devem estar entre parênteses e ao lado direito do operador de comparação;
  • Não utilizar uma cláusula ORDER BY a uma subconsulta;
  • Utilizar operadores de uma única linha com subconsultas de uma única linha;
  • Utilizar operadores de várias linhas com subconsultas de várias linhas.
Subconsultas de uma Linha

Podem ser utilizados os operadores relacionais <,>,<>.>=,<= e = para subconsultas que retornam uma linha. Nos exemplos 1, 2, 3 e 4, são apresentadas diversas situações para subconsultas de uma linha.

Exemplo 1 – Utilizando subconsultas em condições: exiba o nome de todos os funcionários cujo salário é maior do que o salário do funcionário 7566.

SQL> SELECT ename
2 FROM emp
3 WHERE sal >
4 (SELECT sal
5 FROM emp
6 WHERE empno = 7566);

Exemplo 2 – Utilizando subconsultas em condições compostas: exiba o nome e o cargo dos funcionários cujo cargo é igual ao cargo do funcionário 7369 e o salário é maior do que o salário do funcionário 7876.

SQL>SELECT ename, job
2 FROM emp
3 WHERE job =
4 (SELECT job
5 FROM emp
6 WHERE empno = 7369)
7 AND sal >
8 (SELECT sal
9 FROM emp
10 WHERE empno = 7876);

Exemplo 3 – Utilizando subconsultas com funções de grupo: exiba o nome, cargo e salário de todos os funcionários com o salário igual ao menor salário recebido pelos funcionários.

SQL> SELECT ename, job, sal
2 FROM emp
3 WHERE sal =
4 (SELECT MIN(sal)
5 FROM emp);

Exemplo 4 – Utilizando subconsultas com funções de grupo na cláusula having: exiba o menor salário por departamento quando o menor salário for menor do que o menor salário do departamento 20.

SQL> SELECT deptno, MIN(sal)
2 FROM emp
3 GROUP BY deptno
4 HAVING MIN(sal) >
5 (SELECT MIN(sal)
6 FROM emp
7 WHERE deptno = 20);

Um erro comum em subconsultas ocorre quando se utiliza um operador simples para um retorno de várias linhas.