DO BÁSICO AO AVANÇADO PARA MANIPULAÇÃO E OTIMIZAÇÃO DE DADOS Fábio Roberto Octaviano
Utilizando Operadores de Conjuntos
Após o término do Capítulo: Definir os operadores de conjunto. Usar os operadores de conjunto para combinar múltiplas queries em uma. Controlar a ordem das linhas retornadas.
A B A B UNION / UNION ALL A B INTERSECT A B MINUS
Tabelas utilizadas neste capítulo: EMPLOYEES: possui detalhes de todos os empregados atuais da empresa. JOB_HISTORY: Guarda detalhes da data de início e final do cargo inicial do empregado, e o id do cargo e departamento quando um empregado troca de cargo.
A B O operador UNION retorna resultados de ambas as queries após eliminar as duplicações de registros.
Mostra os detalhes dos cargos atual e anteriores dos empregados. Mostra cada empregado apenas uma vez. SELECT employee_id, job_id FROM employees UNION SELECT employee_id, job_id FROM job_history;
A B O operador UNION ALL retorna resultados de ambas as queries, incluindo as duplicações de registros.
Mostra os departamentos atual e anteriores de todos os empregados. SELECT employee_id, job_id, department_id FROM employees UNION ALL SELECT employee_id, job_id, department_id FROM job_history ORDER BY employee_id;
A B O operador INTERSECT retorna linhas que são comuns a ambas as queries.
Mostra os IDs dos empregados e a função daqueles empregados que atualmente possuem um cargo igual ao cargo quando eles foram inicialmente contratados (isto é, eles mudaram de cargo mas agora voltaram ao seu cargo de origem). SELECT employee_id, job_id FROM employees INTERSECT SELECT employee_id, job_id FROM job_history;
A B O operador MINUS retorna linhas da primeira query que não estão presentes na segunda query.
Mostra os IDs dos empregados que nunca trocaram de cargo nenhuma vez. SELECT employee_id FROM employees MINUS SELECT employee_id FROM job_history;
As expressões na lista SELECT devem bater em quantidade e tipo de dados. Parênteses podem ser utilizados para alterar a seqüência de execução. Por padrão, o Oracle avalia os operadores de cima para baixo e da esquerda para a direita. O operador IN tem precedência maior que UNION. Valores NULL não são descartados. Operadores de conjunto podem aparecer em subqueries. A cláusula ORDER BY: Pode aparecer somente no final do comando todo. Aceitará o nome da coluna ou alias do primeiro SELECT ou a notação de sua posição.
Linhas duplicadas são automaticamente removidas, exceto para o operador UNION ALL. Nome das colunas do primeiro SELECT aparecem no resultado. A saída é ordenada em ordem crescente por padrão, exceto para o operador UNION ALL.
Usando o operador UNION, mostre o ID do departamento, a sua localização e a data de contratação dos empregados. SELECT department_id, TO_NUMBER(null) location, hire_date FROM employees UNION SELECT department_id, location_id, TO_DATE(null) FROM departments;
Usando o operador UNION, exiba o ID do empregado, seu histórico de cargos e o salário atual de todos os empregados. SELECT employee_id, job_id,salary FROM employees UNION SELECT employee_id, job_id,0 FROM job_history;
Crie uma sentença em Inglês utilizando dois operadores UNION. COLUMN a_dummy NOPRINT SELECT 'sing' AS "My dream", 3 a_dummy FROM dual UNION SELECT 'I''d like to teach', 1 a_dummy FROM dual UNION SELECT 'the world to', 2 a_dummy FROM dual ORDER BY a_dummy;
É possível customizar cabeçalhos de colunas no isqlplus: Sintaxe: COL[UMN] [{coluna alias} [option]] Onde OPTION pode ser: CLE[AR]: limpa os formatos existentes na coluna HEA[DING] text: Determina o cabeçalho da coluna FOR[MAT] format: Altera o formato de exibição da coluna NOPRINT PRINT: Esconde ou mostra o cabeçalho e dados da coluna NULL Exemplo: COLUMN a_dummy NOPRINT
Objetivos: Utilizar o operador UNION. Utilizar o operador INTERSECTION. Utilizar o operador MINUS.
1. O RH precisa de uma listagem dos IDs dos departamentos que não possuem o cargo ST_CLERK. Utilize operadores de conjunto para criar a listagem. SELECT department_id FROM departments MINUS SELECT department_id FROM employees WHERE job_id = 'ST_CLERK';
2. O RH precisa de uma listagem dos países que não possuem departamentos localizados neles. Mostre o ID e o nome dos países resultantes. Utilize operadores de conjunto para criar a listagem. SELECT country_id,country_name FROM countries MINUS SELECT c.country_id, c.country_name FROM countries c JOIN locations l ON (c.country_id = l.country_id) JOIN departments d ON (d.location_id = l.location_id);
3. Crie uma listagem dos cargos para os departamentos 10, 50 e 20, ordenando os resultados nessa exata ordem de departamentos. Mostre o cargo e o ID do departamento. Utilize operadores de conjunto para criar a listagem.
3. Solução: COLUMN dummy NOPRINT SELECT job_id, department_id, 'x' dummy FROM employees WHERE department_id = 10 UNION SELECT job_id, department_id, 'y' dummy FROM employees WHERE department_id = 50 UNION SELECT job_id, department_id, 'z' dummy FROM employees WHERE department_id = 20 ORDER BY dummy; COLUMN dummy PRINT
4. Crie um relatório que liste o ID do empregado e seu cargo para os empregados que atualmente exerçam a mesma função de quando foram inicialmente contratados. Utilize operadores de conjunto para criar a listagem. COLUMN hire_date NOPRINT SELECT e.employee_id, e.job_id, e.hire_date FROM employees e INTERSECT SELECT h1.employee_id, h1.job_id, h1.start_date FROM job_history h1;
5. O RH precisa do seguinte relatório: Sobrenome e ID do departamento de todos os empregados, não importa se pertençam ou não a um departamento. ID e nome de todos os departamentos existentes, não importa se possuam ou não empregados trabalhando neles.
5. Solução: SELECT last_name Sobrenome, department_id ID_Depto, TO_CHAR(null) Nome_Depto FROM employees UNION SELECT TO_CHAR(null), department_id, department_name FROM departments;