SQL. Tarefas interessantes

Olá, Habr!

Há mais de 3 anos, leciono SQL em diferentes centros de treinamento, e uma das minhas observações é que os alunos aprendem e compreendem SQL melhor quando recebem tarefas a serem realizadas, em vez de apenas ouvir sobre as possibilidades e fundamentos teóricos.

Neste artigo, compartilharei com você a minha lista de tarefas que dou aos alunos como dever de casa e sobre as quais realizamos diferentes tipos de brainstorming, o que leva a uma compreensão profunda e clara do SQL.

SQL. Tarefas interessantes

SQL (ˈɛsˈkjuˈɛl; inglês: structured query language - 'linguagem de consulta estruturada') é uma linguagem de programação declarativa usada para criar, modificar e gerenciar dados em um banco de dados relacional, controlado por um sistema de gerenciamento de banco de dados correspondente. Saiba mais...

Você pode ler sobre SQL em diferentes fontes.
Este artigo não tem a intenção de ensiná-lo SQL do zero.

Então, vamos lá.

Usaremos a bem conhecida estrutura de HR no Oracle com suas tabelas (Saiba mais):

SQL. Tarefas interessantes
Ressalto que abordaremos apenas tarefas relacionadas a SELECT. Não haverá tarefas sobre DML e DDL.

Tarefas

Restringindo e Ordenando Dados

Tabela Employees. Obtenha uma lista com informações sobre todos os funcionários
Solução

SELECT * FROM employees

Tabela Employees. Obtenha uma lista de todos os funcionários com o nome 'David'
Solução

SELECT *
  FROM employees
 WHERE first_name = 'David';

Tabela Employees. Obtenha uma lista de todos os funcionários cujo job_id é 'IT_PROG'
Solução

SELECT *
  FROM employees
 WHERE job_id = 'IT_PROG'

Tabela Employees. Obtenha uma lista de todos os funcionários do departamento 50 (department_id) com salário (salary) maior que 4000
Solução

SELECT *
  FROM employees
 WHERE department_id = 50 AND salary > 4000;

Tabela Employees. Obtenha uma lista de todos os funcionários dos departamentos 20 e 30 (department_id)
Solução

SELECT *
  FROM employees
 WHERE department_id = 20 OR department_id = 30;

Tabela Employees. Obtenha uma lista de todos os funcionários cujo último caractere do nome é 'a'
Solução

SELECT *
  FROM employees
 WHERE first_name LIKE '%a';

Tabela Employees. Obtenha uma lista de todos os funcionários dos departamentos 50 e 80 (department_id) que têm bônus (valor na coluna commission_pct não vazio)
Solução

SELECT *
  FROM employees
 WHERE     (department_id = 50 OR department_id = 80)
       AND commission_pct IS NOT NULL;

Tabela Employees. Obtenha uma lista de todos os funcionários cujo nome contém pelo menos 2 letras 'n'
Solução

SELECT *
  FROM employees
 WHERE first_name LIKE '%n%n%';

Tabela Employees. Obtenha uma lista de todos os funcionários cujo nome tenha mais de 4 letras
Solução

SELECT *
  FROM employees
 WHERE first_name LIKE '%_____%';

Tabela Employees. Obter uma lista de todos os funcionários cujos salários estão entre 8000 e 9000 (inclusive)
Solução

SELECT *
  FROM employees
 WHERE salary BETWEEN 8000 AND 9000;

Tabela Employees. Obter uma lista de todos os funcionários cujo nome contém o caractere ‘%’
Solução

SELECT *
  FROM employees
 WHERE first_name LIKE '%%%' ESCAPE '';

Tabela Employees. Obter uma lista de todos os IDs dos gerentes
Solução

SELECT DISTINCT manager_id
  FROM employees
 WHERE manager_id IS NOT NULL;

Tabela Employees. Obter uma lista de trabalhadores com suas posições no formato: Donald(sh_clerk)
Solução

SELECT first_name || '(' || LOWER (job_id) || ')' employee FROM employees;

Usando Funções de Linha Única para Personalizar a Saída

Tabela Employees. Obter uma lista de todos os funcionários cujo nome tem mais de 10 letras
Solução

SELECT *
  FROM employees
 WHERE LENGTH (first_name) > 10;

Tabela Employees. Obter uma lista de todos os funcionários cujo nome contém a letra ‘b’ (sem distinção entre maiúsculas e minúsculas)
Solução

SELECT *
  FROM employees
 WHERE INSTR (LOWER (first_name), 'b') > 0;

Tabela Employees. Obter uma lista de todos os funcionários cujo nome contém pelo menos 2 letras ‘a’
Solução

SELECT *
  FROM employees
 WHERE INSTR (LOWER (first_name),'a',1,2) > 0;

Tabela Employees. Obter uma lista de todos os funcionários cujo salário é múltiplo de 1000
Solução

SELECT *
  FROM employees
 WHERE MOD (salary, 1000) = 0;

Tabela Employees. Obter os primeiros 3 dígitos do número de telefone do funcionário se seu número estiver no formato XXX.XXX.XXXX
Solução

SELECT phone_number, SUBSTR (phone_number, 1, 3) new_phone_number
  FROM employees
 WHERE phone_number LIKE '___.___.____';

Tabela Departments. Obter a primeira palavra do nome do departamento para aqueles cujo nome contém mais de uma palavra
Solução

SELECT department_name,
       SUBSTR (department_name, 1, INSTR (department_name, ' ')-1)
           first_word
  FROM departments
 WHERE INSTR (department_name, ' ') > 0;

Tabela Employees. Obter os nomes dos funcionários sem a primeira e a última letra do nome
Solução

SELECT first_name, SUBSTR (first_name, 2, LENGTH (first_name) - 2) new_name
  FROM employees;

Tabela Employees. Obter uma lista de todos os funcionários cuja última letra do nome é ‘m’ e cujo nome tem mais de 5 letras
Solução

SELECT *
  FROM employees
 WHERE SUBSTR (first_name, -1) = 'm' AND LENGTH(first_name)>5;

Tabela Dual. Obter a data da próxima sexta-feira
Solução

SELECT NEXT_DAY (SYSDATE, 'FRIDAY') next_friday FROM DUAL;

Tabela Employees. Obter uma lista de todos os funcionários que trabalham na empresa há mais de 17 anos
Solução

SELECT *
  FROM employees
 WHERE MONTHS_BETWEEN (SYSDATE, hire_date) / 12 > 17;

Tabela Employees. Obter uma lista de todos os funcionários cujo último dígito do número de telefone é ímpar e consiste em 3 números separados por ponto
Solução

SELECT *
  FROM employees
 WHERE     MOD (SUBSTR (phone_number, -1), 2) != 0
       AND INSTR (phone_number,'.',1,3) = 0;

Tabela Employees. Obter a lista de todos os funcionários cujo valor job_id após o sinal '_' tem pelo menos 3 caracteres, mas esse valor após '_' não é igual a 'CLERK'
Solução

SELECT *
  FROM employees
 WHERE     LENGTH (SUBSTR (job_id, INSTR (job_id, '_') + 1)) > 3
       AND SUBSTR (job_id, INSTR (job_id, '_') + 1) != 'CLERK';

Tabela Employees. Obter a lista de todos os funcionários substituindo no valor PHONE_NUMBER todos os '.' por '-'
Solução

SELECT phone_number, REPLACE (phone_number, '.', '-') new_phone_number
  FROM employees;

Usando Funções de Conversão e Expressões Condicionais

Tabela Employees. Obter a lista de todos os funcionários que foram contratados no primeiro dia de qualquer mês
Solução

SELECT *
  FROM employees
 WHERE TO_CHAR (hire_date, 'DD') = '01';

Tabela Employees. Obter a lista de todos os funcionários que foram contratados em 2008
Solução

SELECT *
  FROM employees
 WHERE TO_CHAR (hire_date, 'YYYY') = '2008';

Tabela DUAL. Mostrar a data de amanhã no formato: Amanhã é o segundo dia de janeiro
Solução

SELECT TO_CHAR (SYSDATE, 'fm""Amanhã é ""Ddspth ""dia de"" Mês')     info
  FROM DUAL;

Tabela Employees. Obter a lista de todos os funcionários e a data de contratação de cada um no formato: 21 de junho de 2007
Solução

SELECT first_name, TO_CHAR (hire_date, 'fmddth ""de"" Mês, YYYY') hire_date
  FROM employees;

Tabela Employees. Obter a lista de funcionários com aumentos de salário de 20%. Exibir o salário com o símbolo do dólar
Solução

SELECT first_name, TO_CHAR (salary + salary * 0.20, 'fm$999,999.00') new_salary
  FROM employees;

Tabela Employees. Obter a lista de todos os funcionários que foram contratados em fevereiro de 2007.
Solução

SELECT *
  FROM employees
 WHERE hire_date BETWEEN TO_DATE ('01.02.2007', 'DD.MM.YYYY')
                     AND LAST_DAY (TO_DATE ('01.02.2007', 'DD.MM.YYYY'));

SELECT *
  FROM employees
 WHERE to_char(hire_date,'MM.YYYY') = '02.2007'; 

Tabela DUAL. Exibir a data atual, + segundo, + minuto, + hora, + dia, + mês, + ano
Solução

SELECT SYSDATE                          now,
       SYSDATE + 1 / (24 * 60 * 60)     plus_second,
       SYSDATE + 1 / (24 * 60)          plus_minute,
       SYSDATE + 1 / 24                 plus_hour,
       SYSDATE + 1                      plus_day,
       ADD_MONTHS (SYSDATE, 1)          plus_month,
       ADD_MONTHS (SYSDATE, 12)         plus_year
  FROM DUAL;

Tabela Employees. Obter a lista de todos os funcionários com salários totais (salário + comissão_pct(%)) no formato: $24,000.00
Solução

SELECT first_name, salary, TO_CHAR (salary + salary * NVL (commission_pct, 0), 'fm$99,999.00') full_salary
  FROM employees;

Tabela Employees. Obter a lista de todos os funcionários e informações sobre a existência de bônus no salário (Sim/Não)
Solução

SELECT first_name, commission_pct, NVL2 (commission_pct, 'Sim', 'Não') has_bonus
  FROM employees;

Tabela Employees. Obter o nível salarial de cada funcionário: Menos de 5000 é considerado nível baixo, 5000 ou mais e menos de 10000 é considerado nível normal, 10000 ou mais é considerado nível alto
Solução

SELECIONE first_name,
       salary,
       CASE
           WHEN salary = 5000 AND salary < 10000 THEN 'Normal'
           ELSE 'Alto'
       END salary_level
  DE employees;

Tabela Countries. Para cada país, mostre a região em que ele se encontra: 1-Europa, 2-América, 3-Ásia, 4-África (sem Join)
Solução

SELECIONE country_name country,
       DECODE (region_id,
               1, 'Europa',
               2, 'América',
               3, 'Ásia',
               4, 'África',
               'Desconhecido')
           region
  DE countries;

SELECIONE country_name
           country,
       CASE region_id
           WHEN 1 THEN 'Europa'
           WHEN 2 THEN 'América'
           WHEN 3 THEN 'Ásia'
           WHEN 4 THEN 'África'
           ELSE 'Desconhecido'
       END
           region
  DE countries;

Relatando Dados Agregados Usando as Funções de Agrupamento

Tabela Employees. Obtenha um relatório por department_id com o salário mínimo e máximo, com a data de contratação mais cedo e mais tardia e com a quantidade de funcionários. Ordenar pela quantidade de funcionários (em ordem decrescente)
Solução

  SELECIONE department_id,
         MIN (salary) min_salary,
         MAX (salary) max_salary,
         MIN (hire_date) min_hire_date,
         MAX (hire_date) max_hire_Date,
         COUNT (*) count
    DE employees
GROUP BY department_id
order by count(*) desc;

Tabela Employees. Quantos funcionários têm nomes que começam com a mesma letra? Ordenar pela quantidade. Mostrar apenas aqueles onde a quantidade é maior que 1
Solução

SELECIONE SUBSTR (first_name, 1, 1) first_char, COUNT (*)
    DE employees
GROUP BY SUBSTR (first_name, 1, 1)
  HAVING COUNT (*) > 1
ORDER BY 2 DESC;

Tabela Employees. Quantos funcionários trabalham no mesmo departamento e recebem o mesmo salário?
Solução

SELECIONE department_id, salary, COUNT (*)
    DE employees
GROUP BY department_id, salary
  HAVING COUNT (*) > 1;

Tabela Employees. Obtenha um relatório de quantos funcionários foram contratados em cada dia da semana. Ordenar pela quantidade
Solução

SELECIONE TO_CHAR (hire_Date, 'Dia') day, COUNT (*)
    DE employees
GROUP BY TO_CHAR (hire_Date, 'Dia')
ORDER BY 2 DESC;

Tabela Employees. Obtenha um relatório de quantos funcionários foram contratados por ano. Ordenar pela quantidade
Solução

SELECIONE TO_CHAR (hire_date, 'YYYY') year, COUNT (*)
    DE employees
GROUP BY TO_CHAR (hire_date, 'YYYY');

Tabela Employees. Obtenha o número de departamentos que têm funcionários
Solução

SELECIONE COUNT (COUNT (*)) department_count
    DE employees
   ONDE department_id É NÃO NULL
GROUP BY department_id;

Tabela Employees. Obtenha a lista de department_id em que mais de 30 funcionários trabalham
Solução

  SELECIONE department_id
    DE employees
GROUP BY department_id
  HAVING COUNT (*) > 30;

Tabela Employees. Obtenha a lista de department_id e o salário médio arredondado dos trabalhadores em cada departamento.
Solução

  SELECIONE department_id, ROUND (AVG (salary)) avg_salary
    DE employees
GROUP BY department_id;

Tabela Countries. Obtenha a lista de region_id e a soma de todas as letras de todos country_name onde é maior que 60
Solução

  SELECIONE region_id
    DE countries
AGRUPAR POR region_id
  TENDO A SOMA (COMPRIMENTO (country_name)) > 60;

Tabela Employees. Obtenha uma lista de department_id onde trabalham funcionários com vários (>1) job_id
Solução

  SELECIONE department_id
    DE employees
AGRUPAR POR department_id
  TENDO A CONTAGEM (DISTINTA job_id) > 1;

Tabela Employees. Obtenha uma lista de manager_id onde o número de subordinados é maior que 5 e a soma de todos os salários de seus subordinados é maior que 50000
Solução

  SELECIONE manager_id
    DE employees
AGRUPAR POR manager_id
  TENDO A CONTAGEM (*) > 5 E A SOMA (salary) > 50000;

Tabela Employees. Obtenha uma lista de manager_id onde a média salarial de todos os seus subordinados está entre 6000 e 9000 e que não recebem bônus (commission_pct vazia)
Solução

  SELECIONE manager_id, AVG (salary) avg_salary
    DE employees
   ONDE commission_pct É NULO
AGRUPAR POR manager_id
  TENDO A MÉDIA (salary) ENTRE 6000 E 9000;

Tabela Employees. Obtenha o maior salário de todos os funcionários com job_id que termina com a palavra ‘CLERK’
Solução

SELECIONE MAX (salary) max_salary
  DE employees
 ONDE job_id LIKE '%CLERK';

SELECIONE MAX (salary) max_salary
  DE employees
 ONDE SUBSTR (job_id, -5) = 'CLERK';

Tabela Employees. Obtenha o maior salário entre todas as médias salariais por departamento
Solução

  SELECIONE MAX (AVG (salary))
    DE employees
AGRUPAR POR department_id;

Tabela Employees. Obtenha o número de funcionários com o mesmo número de letras no nome. Mostre apenas aqueles com comprimento do nome maior que 5 e número de funcionários com esse nome maior que 20. Ordenar pelo comprimento do nome
Solução

  SELECIONE LENGTH (first_name), CONTAGEM (*)
    DE employees
AGRUPAR POR LENGTH (first_name)
  TENDO LENGTH (first_name) > 5 E CONTAGEM (*) > 20
ORDENAR POR LENGTH (first_name);

  SELECIONE LENGTH (first_name), CONTAGEM (*)
    DE employees
   ONDE LENGTH (first_name) > 5
AGRUPAR POR LENGTH (first_name)
  TENDO CONTAGEM (*) > 20
ORDENAR POR LENGTH (first_name);

Exibindo Dados de Múltiplas Tabelas Usando Joins

Tabela Employees, Departamentos, Locais, Países, Regiões. Obtenha uma lista de regiões e o número de funcionários em cada região
Solução

  SELECIONE region_name, CONTAGEM (* )
    DE employees e
         JOIN departments d ON (e.department_id = d.department_id)
         JOIN locations l ON (d.location_id = l.location_id)
         JOIN countries c ON (l.country_id = c.country_id)
         JOIN regions r ON (c.region_id = r.region_id)
AGRUPAR POR region_name;

Tabela Employees, Departamentos, Locais, Países, Regiões. Obtenha informações detalhadas sobre cada funcionário:
First_name, Last_name, Departamento, Trabalho, Rua, País, Região
Solução

SELECIONE First_name,
       Last_name,
       Department_name,
       Job_id,
       street_address,
       Country_name,
       Region_name
  DE employees e
       JOIN departments d ON (e.department_id = d.department_id)
       JOIN locations l ON (d.location_id = l.location_id)
       JOIN countries c ON (l.country_id = c.country_id)
       JOIN regions r ON (c.region_id = r.region_id);

Tabela Employees. Mostre todos os gerentes que têm mais de 6 subordinados
Solução

  SELECIONE man.first_name, CONTAR (*)
    DOS funcionários emp JUNTE-SE aos funcionários man ON (emp.manager_id = man.employee_id)
AGRUPAR POR man.first_name
  TENDO CONTAR (*) > 6;

Tabela Funcionários. Mostrar todos os funcionários que não têm subordinados
Solução

SELECIONE emp.first_name
  DOS funcionários emp
       JUNTE-SE AOS funcionários man ON (emp.manager_id = man.employee_id)
 ONDE man.FIRST_NAME É NULO;

SELECIONE first_name
  DOS funcionários
 ONDE manager_id É NULO;

Tabela Funcionários, Histórico_de_trabalho. Na tabela Funcionário, estão armazenados todos os funcionários. Na tabela Histórico_de_trabalho, estão os funcionários que deixaram a empresa. Obter um relatório sobre todos os funcionários e seu status na empresa (Trabalhando ou deixou a empresa com a data de saída)
Exemplo:
first_name | status
Jennifer | Deixou a empresa em 31 de dezembro de 2006
Clara | Atualmente Trabalhando
Solução

SELECIONE first_name,
       NVL2 (
           end_date,
           TO_CHAR (end_date, 'fm""Deixou a empresa em"" DD ""de"" Mês, AAAA'),
           'Atualmente Trabalhando')
           status
  DOS funcionários e JUNTE-SE ao histórico_de_trabalho j ON (e.employee_id = j.employee_id);

Tabela Funcionários, Departamentos, Localizações, Países, Regiões. Obter uma lista de funcionários que vivem na Europa (region_name)
Solução

 SELECIONE first_name
  DOS funcionários
       JUNTE-SE aos departamentos USANDO (department_id)
       JUNTE-SE às localizações USANDO (location_id)
       JUNTE-SE aos países USANDO (country_id)
       JUNTE-SE às regiões USANDO (region_id)
 ONDE region_name = 'Europa';
 
 SELECIONE first_name
  DOS funcionários e
       JUNTE-SE aos departamentos d ON (e.department_id = d.department_id)
       JUNTE-SE às localizações l ON (d.location_id = l.location_id)
       JUNTE-SE aos países c ON (l.country_id = c.country_id)
       JUNTE-SE às regiões r ON (c.region_id = r.region_id)
 ONDE region_name = 'Europa';

Tabela Funcionários, Departamentos. Mostrar todos os departamentos onde trabalham mais de 30 funcionários
Solução

SELECIONE department_name, CONTAR (*)
    DOS funcionários e JUNTE-SE aos departamentos d ON (e.department_id = d.department_id)
AGRUPAR POR department_name
  TENDO CONTAR (*) > 30;

Tabela Funcionários, Departamentos. Mostrar todos os funcionários que não estão em nenhum departamento
Solução

SELECIONE first_name
  DOS funcionários e
       JUNTE-SE aos departamentos d ON (e.department_id = d.department_id)
 ONDE d.department_name É NULO;

SELECIONE first_name
  DOS funcionários
 ONDE department_id É NULO;

Tabela Funcionários, Departamentos. Mostrar todos os departamentos que não têm nenhum funcionário
Solução

SELECIONE department_name
  DOS funcionários e
       JUNTE-SE aos departamentos d ON (e.department_id = d.department_id)
 ONDE first_name É NULO;

Tabela Funcionários. Mostrar todos os funcionários que não têm ninguém sob sua supervisão
Solução

SELECIONE man.first_name
  DOS funcionários emp
       JUNTE-SE aos funcionários man ON (emp.manager_id = man.employee_id)
 ONDE emp.FIRST_NAME É NULO;

Tabela Funcionários, Cargos, Departamentos. Mostrar funcionários no formato: First_name, Job_title, Department_name.
Exemplo:
First_name | Job_title | Department_name
Donald | Envio | Empregado de Envio
Solução

SELECIONE first_name, job_title, department_name
  DOS funcionários e
       JUNTE-SE aos trabalhos j ON (e.job_id = j.job_id)
       JUNTE-SE aos departamentos d ON (d.department_id = e.department_id);

Tabela Funcionários. Obter uma lista de funcionários cujos gerentes foram contratados em 2005, mas esses próprios funcionários foram contratados antes de 2005
Solução

SELECT emp.*
  FROM employees emp JOIN employees man ON (emp.manager_id = man.employee_id)
 WHERE     TO_CHAR (man.hire_date, 'YYYY') = '2005'
       AND emp.hire_date < TO_DATE ('01012005', 'DDMMYYYY');

Tabela Employees. Obter uma lista de empregados cujos gerentes foram contratados em janeiro de qualquer ano e o comprimento do job_title desses empregados é maior que 15 caracteres.
Solução

SELECT emp.*
  FROM employees  emp
       JOIN employees man ON (emp.manager_id = man.employee_id)
       JOIN jobs j ON (emp.job_id = j.job_id)
 WHERE TO_CHAR (man.hire_date, 'MM') = '01' AND LENGTH (j.job_title) > 15;

Usando Subconsultas para Resolver Consultas

Tabela Employees. Obter uma lista de empregados com o nome mais longo.
Solução

SELECT *
  FROM employees
 WHERE LENGTH (first_name) =
       (SELECT MAX (LENGTH (first_name)) FROM employees);

Tabela Employees. Obter uma lista de empregados com salário acima da média de todos os empregados.
Solução

SELECT *
  FROM employees
 WHERE salary > (SELECT AVG (salary) FROM employees);

Tabela Employees, Departments, Locations. Obter a cidade onde os empregados ganham menos no total.
Solução

SELECT city
    FROM employees e
         JOIN departments d ON (e.department_id = d.department_id)
         JOIN locations l ON (d.location_id = l.location_id)
GROUP BY city
  HAVING SUM (salary) =
         (  SELECT MIN (SUM (salary))
              FROM employees e
                   JOIN departments d ON (e.department_id = d.department_id)
                   JOIN locations l ON (d.location_id = l.location_id)
          GROUP BY city);

Tabela Employees. Obter uma lista de empregados cujo gerente ganha mais de 15000.
Solução

SELECT *
  FROM employees
 WHERE manager_id IN (SELECT employee_id
                        FROM employees
                       WHERE salary > 15000)

Tabela Funcionários, Departamentos. Mostrar todos os departamentos que não têm nenhum funcionário
Solução

SELECT *
  FROM departments
 WHERE department_id NOT IN (SELECT department_id
                               FROM employees
                              WHERE department_id IS NOT NULL);

Tabela Employees. Mostrar todos os empregados que não são gerentes.
Solução

SELECT *
  FROM employees
 WHERE employee_id NOT IN (SELECT manager_id
                             FROM employees
                            WHERE manager_id IS NOT NULL)

Tabela Employees. Mostre todos os gerentes que têm mais de 6 subordinados
Solução

SELECT *
  FROM employees e
 WHERE (SELECT COUNT (*)
          FROM employees
         WHERE manager_id = e.employee_id) > 6;

Tabela Employees, Departamentos. Mostrar empregados que trabalham no departamento de TI.
Solução

SELECT *
  FROM employees
 WHERE department_id = (SELECT department_id
                          FROM departments
                         WHERE department_name = 'IT');

Tabela Funcionários, Cargos, Departamentos. Mostrar funcionários no formato: First_name, Job_title, Department_name.
Exemplo:
First_name | Job_title | Department_name
Donald | Envio | Empregado de Envio
Solução

SELECT first_name,
       (SELECT job_title
          FROM jobs
         WHERE job_id = e.job_id)
           job_title,
       (SELECT department_name
          FROM departments
         WHERE department_id = e.department_id)
           department_name
  FROM employees e;

Tabela Funcionários. Obter uma lista de funcionários cujos gerentes foram contratados em 2005, mas esses próprios funcionários foram contratados antes de 2005
Solução

SELECT *
  FROM employees
 WHERE     manager_id IN (SELECT employee_id
                            FROM employees
                           WHERE TO_CHAR (hire_date, 'YYYY') = '2005')
       AND hire_date < TO_DATE ('01012005', 'DDMMYYYY');

Tabela Employees. Obter uma lista de empregados cujos gerentes foram contratados em janeiro de qualquer ano e o comprimento do job_title desses empregados é maior que 15 caracteres.
Solução

SELECT *
  FROM employees e
 WHERE     manager_id IN (SELECT employee_id
                            FROM employees
                           WHERE TO_CHAR (hire_date, 'MM') = '01')
       AND (SELECT LENGTH (job_title)
              FROM jobs
             WHERE job_id = e.job_id) > 15;

Por enquanto é tudo.

Espero que as tarefas tenham sido interessantes e envolventes.
Vou complementar esta lista de tarefas sempre que possível.
Também ficarei feliz com quaisquer comentários e sugestões.

P.S.: Se alguém tiver uma tarefa interessante sobre SELECT, escreva nos comentários, vou adicionar à lista.

Obrigado.

Fonte: habr.com

Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS 🔥 Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS | ProHoster