[select employees.first_name, employees.last_name, employees.hire_date from employees where employees.last_name LIKE 'R%';]
2) Apresente o último nome concatenado com o primeiro nome de todos os empregados que trabalham no departamento 60.
[select first_name || ' ' ||last_name from employees where department_id=60;
select concat(first_name, concat(' ',last_name)) from employees where department_id=60;]
3) Apresente em maiúsculas o nome do departamento 60.
[select upper(department_name) from departments where department_id=60;]
4) Apresente o nome completo de todos os empregados que foram admitidos no ano de 1999.
[select first_name || ' ' || last_name NomeCompleto, hire_date from employees where hire_date between '01/01/99' and '31/12/99';
select first_name || ' ' || last_name NomeCompleto, hire_date from employees where hire_date >= '01/01/99' and hire_date <= '31/12/99';
select first_name || ' ' || last_name NomeCompleto, hire_date from employees where hire_date like '%99';
select first_name || ' ' || last_name NomeCompleto, hire_date from employees where to_char(hire_date,'YYYY')=1999;]
5) Apresente o nome e o salario anual de todos os empregados que ganham entre 4000 e 7000.
[select first_name || ' ' || last_name NomeCompleto, salary*12 from employees where salary between 4000 and 7000;
select first_name || ' '|| last_name NomeCompleto, salary*12 from employees where salary >= 4000 and salary <= 7000;]
6) Executando um ou mais comandos SQL, apresente o nome completo dos empregados que trabalham no departamento de nome ‘Shipping’.
[-- obter o número do departamento
select department_id from departments where department_name='Shipping';
-- utilizar o número de departamento obtido anteriormente para concluir a consulta
select first_name||' '||last_name "Nome" from professor.employees where department_id=50;
-- utilizando sub-consulta
select first_name||' '||last_name as "Nome" from professor.employees e where e.department_id = (select d.department_id from professor.departments d where d.department_name='Shipping');
-- junção (join)
select e.first_name||' '||e.last_name "Nome", d.department_name from professor.employees e join professor.departments d on e.department_id=d.department_id where d.department_name='Shipping';
select e.first_name||' '||e.last_name "Nome", d.department_name from professor.employees e, professor.departments d where e.department_id=d.department_id and d.department_name='Shipping';]
7) Retorne o nome de todos os empregados que trabalham no departamento ‘Shipping’ ganhando entre 5000 e 8000 e que foram admitidos entre 1997 e 1999.
[select first_name||' '||last_name "Nome" from professor.employees e join professor.departments d on e.department_id=d.department_id where department_name = 'Shipping' and salary between 5000 and 8000 and to_char(hire_date,'YYYY') in (1997,1998,1999);
select first_name||' '||last_name "Nome" from professor.employees e, professor.departments d where e.department_id=d.department_id and department_name = 'Shipping' and salary between 5000 and 8000 and hire_date between '01/01/97'and '31/12/99';]
8) Com um ou mais comandos SQL, apresente todos os empregados que são gerenciados diretamente pelo empregado Steven King.
[-- com dois comandos, um com uma consulta
select e.employee_id from professor.employees e where first_name='Steven' and Last_name='King';
select first_name || ' ' || last_name as nome_completo from professor.employees where manager_id=100;
-- com um único comando, com duas consultas
select first_name || ' ' || last_name as nome_completo from professor.employees where manager_id=(select e.employee_id from professor.employees e where first_name='Steven' and Last_name='King');
-- com junção: A tabela é repetida no from, mas tendo papeis diferentes
select e.first_name || ' ' || e.last_name as nome_completo from professor.employees e, professor.employees m where e.manager_id = m.employee_id and m.first_name='Steven' and m.Last_name='King';]
9) Apresente o nome de cada empregado e o país onde trabalha.
[select e.last_name ||' '|| first_name nome, c.country_name from professor.employees e, professor.departments d, professor.locations l, professor.countries c where e.department_id=d.department_id and d.location_id=l.location_id and l.country_id = c.country_id;]
10) Apresente o nome dos empregados do departamento ‘Shipping’ admitidos entre 1999 e 2005 e que ganham mais de 2000. Para cada empregado, apresente também o nome do seu departamento, a cidade, o país e a região do departamento.
[select e.first_name ||' '|| e.last_name nome, d.department_name, l.city, c.country_name, r.region_name from employees e, departments d, locations l, countries c, regions r where e.department_id=d.department_id and d.location_id=l.location_id and l.country_id = c.country_id and c.region_id = r.region_id and d.department_name = 'Shipping' and e.salary > 2000 and to_char(e.hire_date, 'YYYY') between 1999 and 2005;]
11) Apresente o nome dos departamentos que não têm empregados. Faça isso com consulta aninhada. Utilize corretamente o operador IN, evitando valores nulos.
[select department_name from departments where department_id not IN (select department_id from employees where department_id is not null);]
12) Agora refaça o comando para usar o operador NOT EXISTS com consultas correlacionadas.
[select department_name from departments d where not exists (select 1 from employees e where d.department_id = e.department_id);]
13) Apresente o nome de todos os empregados (nome completo: FIRST_NAME e LAST_NAME), com o nome dos seus departamentos.
[select e.first_name, e.last_name, d.department_name from departments d join employees e on d.department_id=e.department_id;]
14) Agora, refaça o comando anterior para incluir também os empregados sem departamentos. Nesse caso, o nome do departamento deve ser nulo. Ou seja, faça isso com junção externa.
[select e.first_name, e.last_name, d.department_name from departments d right join employees e on d.department_id=e.department_id;]
15) Se você usou junção externa à direita, refaça o comando anterior para usar a esquerda e vice-versa.
[select e.first_name, e.last_name, d.department_name from employees e left join departments d on d.department_id=e.department_id;]
16) Apresente o nome dos empregados (o código dos cargos anteriores que já ocuparam (esse código está em JOB_HISTORY.JOB_ID) e data de ocupação (início e fim). Faça isso para todos os empregados, inclusive os que nunca tiveram cargos anteriores. Use junção externa. Não precisa colocar o título (JOB_TITLE) do cargo que está em JOBS.
[select e.first_name, e.last_name, jh.start_date, jh.end_date, jh.job_id from employees e left outer join job_history jh on e.employee_id = jh.employee_id;]
17) Agora, refaça o comando anterior para incluir o nome do cargo, que, como foi dito, está em JOBS. Continue usando junção externa. Observe agora que são duas junções e que pode ser necessário estender a junção externa para obter o resultado correto.
[select e.first_name, e.last_name, jh.start_date, jh.end_date, jh.job_id, j.job_title from (employees e left outer join job_history jh on e.employee_id = jh.employee_id) inner join jobs j on jh.job_id = j.job_id;]
18) Apresente, distintamente, todos os cargos sendo ocupados atualmente na cidade de ‘Seattle’. Utilize, para isso, somente consultas aninhadas. A palavra DISTINC pode ser usada no SELECT, diminuindo o espaço de busca nas consultas externas. DISTINCT deve vir somente uma vez, depois da cláusula SELECT e antes das colunas da projeção.
[select j.job_title from jobs j where j.job_id in (select distinct e.job_id from employees e where e.department_id in (select d.department_id from departments d where d.location_id in (select l.location_id from locations l where l.city='Seattle')));]
19) Resolva a consulta anterior, utilizando somente junções ao invés de consultas aninhadas.
[select distinct j.job_title from ((locations l join departments d on l.location_id = d.location_id) join employees e on d.department_id = e.department_id) join jobs j on e.job_id = j.job_id where l.city='Seattle';]
20) Apresente o nome e o mês, por extenso, de admissão de todos os empregados que começam com a letra ‘R’ no último nome. Não utilize LIKE, mas funções SQL.
[select concat(concat(first_name,' '), last_name) "Nome", to_char(hire_date,'Month') from employees where substr(last_name,1,1) = 'R';]
21) Apresente o último nome concatenado com o primeiro nome, mas separados por branco, de todos os empregados que trabalham no departamento de nome “executive” (em minúsculas). Em maiúsculas, o nome do departamento deve aparecer no resultado. Utilize funções SQL e junções.
[select concat(concat(first_name,' '), last_name) "Nome", department_name from employees e join departments d on e.department_id=d.department_id where upper(department_name) = 'EXECUTIVE';]
22) Apresente o nome completo de todos os empregados que foram admitidos no ano de 1999. Use a coluna HIRE_DATE com funções de data.
[select concat(concat(first_name,' '), last_name) "Nome" from employees e where to_char(hire_date,'YYYY') = 1999;]
23) Apresente o nome, o salario diário, arredondado, e o anual de todos os empregados. O salário em EMPLOYEES é mensal.
[select concat(concat(first_name,' '), last_name) "Nome", round(salary/30) Salario_Diario, Salary*12 Salario_Anual from employees e;]
24) Apresente somente a inicial de cada nome de empregados que são gerentes de departamento. Incluir o nome do departamento.
[select substr(first_name,1,1) Inicial_PNome, substr(first_name,1,1) Inicial_UNome, department_name from employees e join departments d on e.department_id=d.department_id;]
25) Apresente a média salarial por departamento, incluindo o nome do departamento.
[select department_name "Departamento", round(avg(salary)) "Média salarial" from employees e join departments d on e.department_id=d.department_id group by department_name;]
26) Apresente a quantidade de empregados por departamento. O departamento deve aparecer.
[select department_name "Nome departamento", count(employee_id) "Quantidade de empregados" from employees e join departments d on e.department_id=d.department_id group by department_name;]
COMENTÁRIOS