O domínio sobre a linguagem SQL (Structured Query Language) é o básico que um DBA precisa ter para recuperar informações do Banco de Dados.
O SQL é composto por 5 linguagens: DDL (Data Definition Language), DML (Data Manipulation Language), DQL (Data Query Language), DCL (Data Control Language) e DTL (Data Transaction Language).
Contudo a Oracle entende que a instrução SELECT está no conjunto de instruções DML, e não na DQL, que seria uma linguagem à parte que abordaria somente esta instrução. De fato podemos manipular dados com a instrução SELECT, portanto, para que possamos continuar essa primeira aula, a teoria sobre a linguagem DQL está eliminada.
A cada final de aula farei 3 (três) perguntas relacionadas à aula em questão e, possivelmente, às anteriores.
DML - Linguagem de Manipulação de Dados
Essa linguagem é composta pelas seguintes instruções:
Insert - Instrução usada para inserção de dados em tabelas;
Update - Instrução usada para atualização de dados contidos em tabelas;
Delete - Instrução usada para deletar dados contidos em tabelas;
Select - Instrução usada para recuperar dados contidos em tabelas;
Merge - Instrução usada para comparar e atualizar tabelas, deixando-as idênticas.
Logicamente a instrução mais complexa é a SELECT, pois dispõem de uma variedade de possibilidades para elaboração de consultas, portanto será a primeira a ser estudada.
Os recursos possíveis usando uma instrução SELECT são:
Projeção - retorna algumas ou todas as colunas, conforme a necessidade.
Seleção - retorna apenas as linhas(ou tuplas) que você queira.
Join - retorna dados armazenados em tabelas distintas.
Instrução SELECT simples
SELECT coluna(s) FROM tabela;
O SELECT identifica as colunas que devem ser retornadas, enquanto o FROM identifica qual tabela você deseja que o Oracle consulte.
Você pode suprimir duplicação usando a cláusula DISTINCT ou seu sinônimo UNIQUE:
SELECT DISTINCT coluna(s) FROM tabela;
ou
SELECT UNIQUE coluna(s) FROM tabela;
ou mandar o Oracle retornar todas as colunas da tabela usando a seguinte instrução:
SELECT * FROM tabela;
Tente realizar a seguinte consulta em seu BD Oracle:
SELECT * FROM departments;
Obs.:
1- As instruções SQL não são sensitive case, ou seja, não fazem diferenciação entre palavras maiúsculas ou minúsculas;
2 - No programa SQL Developer, o ponto e vírgula(;), ao final das instruções, é opcional;
3 - É possível pressionar F9 para mostrar o resultado em Grid (Query Result) ou F5 para mostrar em Script (Script Output).
Expressões e operadores
Podemos utilizar operadores aritméticos em instruções SQL, como Adição(+), Subtração(-), Multiplicação(*) e Divisão(/).
É muito comum precisarmos prever como seria um determinado resultado usando operações aritméticas em campos numéricos ou mesmo utilizar esses operadores em outras instruções DML, como INSERT e UPDATE.
Por exemplo, façamos a seguinte consulta no banco para recuperar as informações de salário e sobrenome de todos os funcionários e também uma coluna mostrando seu salário com uma subtração provinda de impostos que totalizam 20% do salário base:
SELECT last_name, salary, salary*0.8 FROM employees;
ou
SELECT last_name, salary, salary/100*80 FROM employees;
como preferir.
Observe que essa nova coluna não pertence à tabela de forma alguma, ela é uma coluna temporária criada para mostrar um resultado de alguma operação casual.
Agora, por sua conta, mostre a diferença entre o salário antigo e o novo salário com os descontos.
O resultado deve ser este:
A precedência dos operadores aritméticos em instruções SQL têm as mesmas regras da matemática, divisão e multiplicação vêm primeiro, seguidas da adição e subtração, sempre sendo resolvidas da esquerda para a direita, mas podem sofrer mudança de ordem quando são adicionados parênteses à consulta.
SELECT last_name, 1.5 * salary + 500 FROM employees;
é diferente de
SELECT last_name, 1.5 * (salary + 500) FROM employees;
Devemos tomar cuidado com operações aritméticas quando há a possibilidade de encontrarmos registros NULOS. Nulo não é a mesma coisa que 0 ou espaço em branco. Nulo é simplesmente Nulo para o banco, um valor indisponível, não aplicável. Quando retornado de consulta que contenha operador aritmético o resultado será NULO também.
Faça o teste com os atributos SALARY e COMMISSION_PCT do nosso esquema de testes HR. Todos os registros que tiverem comissão Nula retornará um valor literal NULL como resultado.
SELECT last_name, salary, commission_pct, salary+commission_pct FROM employees;
Nomeando uma Coluna
Muitas vezes nos deparamos com nomenclaturas padronizadas que não fazem muito sentido para outrem que não esteja familiarizado com a categorização interna de nomeação de esquemas e tabelas no Banco de Dados. Visando este cenário, ou apenas a possibilidade do próprio DBA ter mais facilidade em distinguir os campos de sua consulta, há possibilidade de nomear qualquer coluna em uma consulta realizada naquele momento. Logicamente essa nomeação é temporária e não afeta o nome original dos campos.
A sintaxe é simples:
SELECT last_name AS nome FROM employees;
ou sem a palavra opcional 'AS'
SELECT last_name nome FROM employees;
ou então entre aspas duplas
SELECT last_name "nome" FROM employees;
Utilizamos aspas duplas quando queremos que apareça na coluna exatamente aquilo que escrevemos, por exemplo:
SELECT last_name "É o $nome$ do #Empregado#" FROM employees;
Operador de Concatenação
A concatenação é realizada utilizando duas barras verticais entre as colunas, resultando em uma expressão de caractere:
SELECT last_name || department_id concatenando FROM employees;
As colunas são combinadas para criar uma única saída no visualizador. Podemos utilizar a palavra-chave AS antes do nome 'concatenando' para facilitar a leitura da instrução SELECT, mas isso é opcional.
Quando uma coluna tem possíveis campos NULOS o resultado são apenas as colunas que possuem dados. A concatenação não resulta erros, apenas ignora o valor nulo e mostra os valores recuperados na instrução.
Podemos facilitar a leitura de certos resultados vindos do banco acrescentando literais de caractere à nossa instrução. Fazemos isso incrementando a nossa instrução DML com palavras entre aspas simples, apenas os literais de números não precisam de aspas. Lembre-se que cada linha retornada terá esse literal acrescentado na visualização.
SELECT last_name || ' trabalha no departamento ' || department_id "Empregado" FROM employees;
Caso seja necessário utilizar aspas simples como literal de caractere, podemos usar o operador de cotação (q) para este fim. A sintaxe é simples e pode ser seguido de qualquer delimitador mais conveniente para o momento ou então utilizar pares de caractere como ( ), [ ], < >, etc, para facilitar o entendimento.
SELECT last_name || q'( é o sobre'nome de )' || first_name "Empregado" FROM employees;
Comando DESCRIBE
Há momentos que necessitamos saber qual é a estrutura de uma tabela, view ou mesmo um sinônimo existente no banco e, obviamente, que possuamos acesso. Para isto, usamos o comando DESCRIBE ou DESC.
DESC employees;
ou
DESCRIBE employees;
Ambos funcionam no SQL Developer da mesma forma e resultam em algo assim:
QUESTIONÁRIO
1- Virou o ano e todos os funcionários devem receber um aumento de dissídio equivalente a 6% sobre seus respectivos salários. Traga em sua instrução as colunas LAST_NAME, SALARY e o resultado do aumento. Nomeie a última coluna para Salário Atualizado, respeitando as letras maiúsculas e as minúsculas.
2- Descreva a estrutura da tabela DEPARTMENT e depois traga todos os números de departamentos da tabela EMPLOYEES, sem repetí-los. Traga cada resultado com a seguinte definição: Department's ID xx, onde xx é o número do departamento. Nomeie a coluna para Número do Departamento.
3- Recupere todos os dados da tabela EMPLOYEES separando-os por vírgula (,) numa mesma coluna e a renomeie esta coluna para TODAS AS INFORMAÇÕES DO EMPREGADO.
***Respostas na Próxima Aula***