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.
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.
SELECT [DISTINCT] {*, coluna [apelido],...} FROM 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
Os operadores aritméticos podem ser utilizados em qualquer cláusula de uma instrução SQL, com exceção da cláusula FROM.
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.
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.
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 (‘’).
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 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
Funções de linha para manipulação de números
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 ...
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
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.
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
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.
Converte uma cadeia de caracteres para data. Exemplo:
SQL> Select to_date(‘01/março/2003’) from dual; Resultado: 01/03/03
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:
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:
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).
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:
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.
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:
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
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:
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:
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.