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
< 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
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
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 OperationsSelecionando 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
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
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
OperationsNAME
-----------------
Administration
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
OperationsNAME
-----------------
Administration
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(*)
----------------- --------
Sales 1
Finance 5
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 tabelaAGV 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
0 comentários: