segunda-feira, 5 de dezembro de 2016

SELECT

SELECT
Este comando é utilizado para selecionar linhas de dados de uma tabela.


Selecionando Todas as Colunas e Todas Linhas da Tabela

SELECT * FROM S_DEPT;

ID NAME              REGION_ID
-- ----------------- ---------
50 Administration    1
45 Operations        5
44 Operations        4
43 Operations        3
42 Operations        2
41 Operations        1
35 Sales             5
34 Sales             4
33 Sales             3
32 Sales             2
31 Sales             1
10 Finace            1


Selecionando algumas Colunas e Todas Linhas da Tabela

SELECT ID, NAME FROM S_DEPT;

ID NAME              
-- ----------------- 
50 Administration    
45 Operations        
44 Operations        
43 Operations        
42 Operations        
41 Operations        
35 Sales             
34 Sales             
33 Sales             
32 Sales             
31 Sales             
10 Finace            



SELECT com Cláusula WHERE
Através desta cláusula podemos selecionar as Linhas da Tabela que satisfaça uma determinada condição.


Relação de Operadores 
          >   Maior que 
          <   Menor que
         >=   Maior e igual a
         <=   Menor e igual a
          =   Igual a
         <>   Diferente de
         !=   Diferente de
         IN   Contido em
     NOT IN   Não Contido em
    BETWEEN   Esteja Entre A e B
NOT BETWEEN   Não Esteja Entre A e B
       LIKE   Que contenha
   NOT LIKE   Que não contenha


SELECT ID, NAME FROM S_DEPT WHERE ID > 35;

ID NAME              
-- ----------------- 
41 Operations
42 Operations
43 Operations
44 Operations
45 Operations
50 Administration       


SELECT ID, NAME FROM S_DEPT WHERE ID IN (45,41);

ID NAME              
-- ----------------- 
41 Operations        
45 Operations  


SELECT ID, NAME FROM S_DEPT WHERE ID NOT IN (45,41);

ID NAME              
-- ----------------- 
10 Finance
31 Sales
32 Sales
33 Sales
34 Sales
35 Sales
42 Operations
43 Operations
44 Operations
50 Administration


SELECT ID, NAME FROM S_DEPT WHERE ID BETWEEN 41 AND 45);

ID NAME              
-- ----------------- 
41 Operations
42 Operations
43 Operations
44 Operations
45 Operations
  

SELECT ID, NAME FROM S_DEPT WHERE ID NOT BETWEEN 41 AND 45);

ID NAME              
-- ----------------- 
10 Finance
31 Sales
32 Sales
33 Sales
34 Sales
35 Sales
50 Administration



SELECT id, name FROM s_dept WHERE name LIKE %Sal%;

ID NAME              
-- ----------------- 
31 Sales
32 Sales
33 Sales
34 Sales
35 Sales


SELECT id, name FROM s_dept WHERE name NOT LIKE %Sal%;

ID NAME              
-- ----------------- 
10 Finace 
41 Operations 
42 Operations 
43 Operations 
44 Operations 
45 Operations 
50 Administration    


Relação de Funções Caracteres
      UPPER   Retorna caracteres MAIÚSCULOS 
      LOWER   Retorna caracteres MINÚSCULOS

SELECT emp_id, first_name, last_name, salary, manager_id
  FROM s_emp
 WHERE manager_id = 1
 ORDER BY emp_id

EMP_ID  FIRST_NAME   LAST_NAME       SALARY  MANAGER_ID
------  ----------   ------------    ------  ----------
1       Milton       VELASQUEZ       2500    1
2       thomaz       NGAO            1450    1
3       Marcos       NAGAYAMA        1400    1
4       Ludovick     QUICK-TO-SEE    1450    1
5       Matheus      ROPEBURN        1550    1

Preciso saber exibir a coluna first_name em caracteres maiúsculos e last_name em minúsculos

SELECT emp_id, UPPER(first_name), LOWER(last_name), 
       salary, manager_id
  FROM s_emp
 WHERE manager_id = 1
 ORDER BY emp_id

EMP_ID  FIRST_NAME   LAST_NAME       SALARY  MANAGER_ID
------  ----------   ------------    ------  ----------
1       MILTON       velasquez       2500    1
2       THOMAZ       ngao            1450    1
3       MARCOS       nagayama        1400    1
4       LUCOVICK     quick-to-see    1450    1
5       MATHEUS      ropeburn        1550    1



SELECT com Cláusula ORDER BY
Através da cláusula ORDER BY podemos determinar a ordem de apresentação do resultado das linhas pesquisadas, sendo (ASC) de forma ascendente ou (DESC) de forma descendente. Quando não utilizamos esta cláusula, as linhas são retornadas na mesma ordem em que os dados foram inseridos na base de dados.
Nota: O Padrão é ASC, esta informação pode ser omitida

Selecionando as Linhas da Tabela em Ordem Descendente

SELECT * FROM S_DEPT ORDER BY ID ASC;

ID NAME              
-- ----------------- 
10 Finace  
31 Sales 
32 Sales
33 Sales
34 Sales 
35 Sales 
41 Operations
42 Operations
43 Operations
44 Operations
45 Operations
50 Administration


Selecionando as Linhas da Tabela em Ordem Descendente

SELECT * FROM S_DEPT ORDER BY ID DESC;

ID NAME              
-- ----------------- 
50 Administration
45 Operations
44 Operations
43 Operations
42 Operations
41 Operations
35 Sales
34 Sales
33 Sales
32 Sales
31 Sales
10 Finance


SELECT com Cláusula DISTINCT
Através do DISTINCT conseguimos exibir as informações sem duplicidade


Abaixo um exemplo de um SELECT sem a cláusula DISTINCT.

SELECT name FROM S_DEPT;

NAME              
----------------- 
Administration    
Operations        
Operations        
Operations        
Operations        
Operations        
Sales             
Sales             
Sales             
Sales             
Sales             
Finace            


Desejo exibir as Linhas da minha Tabela sem os dados duplicados, exemplo,
quero saber quais são os nomes dos departamentos que existem na base de dados.
Vejamos agora o resultado da pesquisa com a cláusula DISTINCT

SELECT DISTINCT name FROM S_DEPT;

NAME              
----------------- 
Administration
Operations
Sales
Finance


SELECT com Cláusula GROUP BY
Através do GROUP BY conseguimos exibir as informações divididas em grupos de linhas que correspondem a um ou mais valores.


Desejo exibir as Linhas da minha Tabela sem os dados agrupados , exemplo, quero saber quais
são os nomes dos departamentos que existem na base de dados sem duplicidades.
Vejamos agora o resultado da pesquisa com a cláusula GROUP BY, observe
que o resultado foi o mesmo de quando usei a cláusula DISTINCT.

SELECT name FROM S_DEPT GROUP BY name

NAME              
----------------- 
Administration
Operations
Sales
Finance

Todavia, é mais usual utilizar a cláusula GROUP BY para trazer resultados AGRUPADOS.
Por exemplo. desejo saber quantos setores tenho em cada departamento.
então faço uso de uma função de grupo com a cláusula ORDER BY

  SELECT DISTINCT name, count(*) 
    FROM S_DEPT
GROUP BY name

NAME              COUNT(*)
----------------- --------
Administration    1
Operations        5 
Sales             1
Finance           5


Tenho a seguinte relação  salarial dos empregados para cada gerente

SELECT emp_id, first_name, salary, manager_id
  FROM s_emp
 ORDER BY emp_id

EMP_ID  FIRST_NAME   SALARY  MANAGER_ID
------  ----------   ------  ----------
1       Milton         2500           1
2       thomaz         1450           1
3       Marcos         1400           1
4       Ludovick       1450           1
5       Matheus        1550           1
6       marcelo        1200           2
7       thiago         1250           2
8       carmen         1100           2
9       lucca          1300           2
10      pietro         1307           2
11      marcos         1400           3
12      percio         1490           3

Quero saber qual é a média salarial dos empregados por gerente, então neste caso usaria a clausula GROUP BY juntamente com uma função de grupo que devolve a média (AVG) que veremos mais adiante com mais calma.

SELECT manager_id, avg(salary)
  FROM s_emp
 GROUP BY manager_id

MANAGER_ID  AVG(SALARY)
----------  -----------
         1         1670
         2      1231,40 
         3         1445

Relação de Funções de Grupo
        SUM   SOMA os valores de uma coluna de uma tabela
        AGV   Calcula MÉDIA de valores de uma coluna de uma tabela
        MIN   Retorna o valor MÍNIMO entre os valores de uma coluna
        MAX   Retorna o valor MÁXIMO entre os valores de uma coluna
      COUNT   Retorna quantidade TOTAL de registros de uma tabela


SELECT emp_id, first_name, salary, manager_id
  FROM s_emp
 ORDER BY emp_id

EMP_ID  FIRST_NAME   SALARY  MANAGER_ID
------  ----------   ------  ----------
1       Milton         2500           1
2       thomaz         1450           1
3       Marcos         1400           1
4       Ludovick       1450           1
5       Matheus        1550           1
6       marcelo        1200           2
7       thiago         1250           2
8       carmen         1100           2
9       lucca          1300           2
10      pietro         1307           2
11      marcos         1400           3
12      percio         1490           3


Preciso SOMAR todos os salários dos empregados para saber o total de gastos com a folha de pagamento dos meus empregados por gerente.

SELECT manager_id, SUM(salary)
  FROM s_emp
 GROUP BY manager_id

MANAGER_ID   SALARY  
----------   ------  
1              8350       
2              6157
3              2890


Preciso ter a MÉDIA salarial dos empregados  por gerente.

SELECT manager_id, AVG(salary)
  FROM s_emp
 GROUP BY manager_id

MANAGER_ID     SALARY  
----------  ---------  
1                1670       
2              1231,4
3                1445


Preciso obter o MENOR salario dos empregados  por gerente.

SELECT manager_id, MIN(salary)
  FROM s_emp
 GROUP BY manager_id

MANAGER_ID     SALARY  
----------  ---------  
1                1400      
2                1100
3                1400


Preciso obter o MAIOR salarial dos empregados  por gerente.

SELECT manager_id, MAX(salary)
  FROM s_emp
 GROUP BY manager_id

MANAGER_ID     SALARY  
----------  ---------  
1                2500       
2                1307
3                1490


Preciso saber quantos empregados cada gerente possui em seu departamento.

SELECT manager_id, COUNT(*)
  FROM s_emp
 GROUP BY manager_id

MANAGER_ID     SALARY  
----------  ---------  
1                   5       
2                   5
3                   2


SELECT com Cláusula HAVING
Através da cláusula HAVING podemos selecionar as Linhas da Tabela que satisfaça uma determinada condição que envolve funções de grupo.

Agora desejo trazer a mesma pesquisa acima, todavia só me interessa a relação cuja média salarial seja maior que 1500, vejamos vamos adicionar uma cláusula WHERE para efetuar esta condição.

SELECT manager_id, avg(salary)
  FROM s_emp
 WHERE avg(salary) > 1500
 GROUP BY manager_id;

Vai ocorrer o seguinte erro:
      *
Erro na linha 2
ORA-00934: a função de grupo não é permitida aqui

Como podemos ver não podemos utilizar a cláusula WHERE com uma função de grupo, para condicionar uma função de grupo usamos a cláusula HAVING, vejamos:

SELECT manager_id, avg(salary)
  FROM s_emp
HAVING avg(salary) > 1300
GROUP BY manager_id;

MANAGER_ID  AVG(SALARY)
----------  -----------
         1         1670
         3         1445
Postagem Anterior
Proxima Postagens

Postado Por:

0 comentários: