SQL. Quebra-cabeças divertidos

Olá, Habr!

Há mais de 3 anos ensino SQL em vários centros de treinamento, e uma de minhas observações é que os alunos dominam e entendem melhor SQL se receberem uma tarefa, e não apenas informados sobre as possibilidades e fundamentos teóricos.

Neste artigo, compartilharei com vocês minha lista de problemas que dou aos alunos como lição de casa e sobre os quais realizamos vários tipos de brainstorms, o que leva a uma compreensão profunda e clara de SQL.

SQL. Quebra-cabeças divertidos

SQL (ˈɛsˈkjuˈɛl; linguagem de consulta estruturada em inglês) é uma linguagem de programação declarativa usada para criar, modificar e gerenciar dados em um banco de dados relacional gerenciado por um sistema de gerenciamento de banco de dados apropriado. Leia mais ...

Você pode ler sobre SQL em vários de fontes.
Este artigo não tem como objetivo ensinar SQL do zero.

Então, vamos.

Usaremos o conhecido Diagrama de RH no Oracle com suas tabelas (Mais):

SQL. Quebra-cabeças divertidos
Observo que consideraremos apenas tarefas SELECT. Não há tarefas DML ou DDL aqui.

Tarefas

Restringindo e Classificando Dados

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

SELECT * FROM employees

Mesa de funcionários. Obtenha uma lista de todos os funcionários chamados 'David'
Solução

SELECT *
  FROM employees
 WHERE first_name = 'David';

Mesa de funcionários. Obtenha uma lista de todos os funcionários com job_id igual a 'IT_PROG'
Solução

SELECT *
  FROM employees
 WHERE job_id = 'IT_PROG'

Mesa de funcionários. Obtenha uma lista de todos os funcionários do 50º departamento (department_id) com salário (salário) superior a 4000
Solução

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

Mesa de funcionários. Obtenha uma lista de todos os funcionários do 20º e 30º departamento (department_id)
Solução

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

Mesa de funcionários. Obtenha uma lista de todos os funcionários cuja última letra do nome seja 'a'
Solução

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

Mesa de funcionários. Obtenha uma lista de todos os funcionários do 50º e 80º departamento (department_id) que possuem bônus (o valor na coluna commission_pct não está vazio)
Solução

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

Mesa de funcionários. Obtenha uma lista de todos os funcionários cujos nomes contenham pelo menos 2 letras 'n'
Solução

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

Mesa de funcionários. Obtenha uma lista de todos os funcionários cujos nomes têm mais de 4 letras
Solução

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

Mesa de funcionários. Obtenha uma lista de todos os funcionários cujo salário está na faixa de 8000 a 9000 (inclusive)
Solução

SELECT *
  FROM employees
 WHERE salary BETWEEN 8000 AND 9000;

Mesa de funcionários. Obtenha uma lista de todos os funcionários cujo nome contém o símbolo '%'
Solução

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

Mesa de funcionários. Obtenha uma lista de todos os IDs de gerente
Solução

SELECT DISTINCT manager_id
  FROM employees
 WHERE manager_id IS NOT NULL;

Mesa de funcionários. Obtenha uma lista de funcionários com seus cargos 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

Mesa de funcionários. Obtenha uma lista de todos os funcionários cujos nomes têm mais de 10 letras
Solução

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

Mesa de funcionários. Obtenha uma lista de todos os funcionários que possuem a letra 'b' em seus nomes (sem distinção entre maiúsculas e minúsculas)
Solução

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

Mesa de funcionários. Obtenha uma lista de todos os funcionários cujos nomes contenham pelo menos 2 letras 'a'
Solução

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

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

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

Mesa de funcionários. Obtenha o primeiro número de três dígitos do número de telefone de um funcionário se o número dele 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 de departamentos. Obtenha a primeira palavra do nome do departamento para quem tem mais de uma palavra no nome
Solução

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

Mesa de funcionários. Obtenha nomes de 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;

Mesa de funcionários. Obtenha uma lista de todos os funcionários cuja última letra do nome seja 'm' e cujo nome seja maior que 5
Solução

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

Mesa Dupla. Obtenha a data da próxima sexta-feira
Solução

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

Mesa de funcionários. Obtenha 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;

Mesa de funcionários. Obtenha 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 um ponto
Solução

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

Mesa de funcionários. Obtenha uma lista de todos os funcionários cujo valor job_id após o sinal '_' tenha pelo menos 3 caracteres, mas esse valor após '_' não seja 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';

Mesa de funcionários. Obtenha uma lista de todos os funcionários substituindo todos os '.' no valor PHONE_NUMBER sobre '-'
Solução

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

Usando funções de conversão e expressões condicionais

Mesa de funcionários. Obtenha uma lista de todos os funcionários que vieram trabalhar no primeiro dia do mês (qualquer)
Solução

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

Mesa de funcionários. Obtenha uma lista de todos os funcionários que vieram trabalhar em 2008
Solução

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

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

SELECT TO_CHAR (SYSDATE, 'fm""Tomorrow is ""Ddspth ""day of"" Month')     info
  FROM DUAL;

Mesa de funcionários. Obtenha uma lista de todos os funcionários e a data em que cada funcionário chegou ao trabalho no formato: 21 de junho de 2007
Solução

SELECT first_name, TO_CHAR (hire_date, 'fmddth ""of"" Month, YYYY') hire_date
  FROM employees;

Mesa de funcionários. Obtenha uma lista de funcionários com salários aumentados em 20%. Mostrar salário com cifrão
Solução

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

Mesa de funcionários. Obtenha uma lista de todos os funcionários que começaram a trabalhar 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'; 

Mesa DUAL. Mostre 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;

Mesa de funcionários. Obtenha uma lista de todos os funcionários com salários integrais (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;

Mesa de funcionários. Obtenha uma lista de todos os funcionários e informações sobre a disponibilidade de bônus salariais (Sim/Não)
Solução

SELECT first_name, commission_pct, NVL2 (commission_pct, 'Yes', 'No') has_bonus
  FROM employees;

Mesa de funcionários. Obtenha o nível salarial de cada funcionário: Menos de 5000 é considerado nível baixo, maior ou igual a 5000 e menor que 10000 é considerado nível normal, maior ou igual a 10000 é considerado nível alto
Solução

SELECT first_name,
       salary,
       CASE
           WHEN salary < 5000 THEN 'Low'
           WHEN salary >= 5000 AND salary < 10000 THEN 'Normal'
           ELSE 'High'
       END salary_level
  FROM employees;

Tabela Países. Para cada país, mostre a região em que está localizado: 1-Europa, 2-América, 3-Ásia, 4-África (sem adesão)
Solução

SELECT country_name country,
       DECODE (region_id,
               1, 'Europe',
               2, 'America',
               3, 'Asia',
               4, 'Africa',
               'Unknown')
           region
  FROM countries;

SELECT country_name
           country,
       CASE region_id
           WHEN 1 THEN 'Europe'
           WHEN 2 THEN 'America'
           WHEN 3 THEN 'Asia'
           WHEN 4 THEN 'Africa'
           ELSE 'Unknown'
       END
           region
  FROM countries;

Relatório de dados agregados usando as funções de grupo

Mesa de funcionários. Receba um relatório por departament_id com o salário mínimo e máximo, datas antecipadas e atrasadas de chegada ao trabalho e número de funcionários. Classificar por número de funcionários (decrescente)
Solução

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

Mesa de funcionários. Quantos funcionários cujos nomes começam com a mesma letra? Classifique por quantidade. Mostrar apenas aqueles onde a quantidade é maior que 1
Solução

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

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

SELECT department_id, salary, COUNT (*)
    FROM employees
GROUP BY department_id, salary
  HAVING COUNT (*) > 1;

Mesa de funcionários. Obtenha um relatório de quantos funcionários foram contratados em cada dia da semana. Classificar por quantidade
Solução

SELECT TO_CHAR (hire_Date, 'Day') day, COUNT (*)
    FROM employees
GROUP BY TO_CHAR (hire_Date, 'Day')
ORDER BY 2 DESC;

Mesa de funcionários. Obtenha um relatório de quantos funcionários foram contratados por ano. Classificar por quantidade
Solução

SELECT TO_CHAR (hire_date, 'YYYY') year, COUNT (*)
    FROM employees
GROUP BY TO_CHAR (hire_date, 'YYYY');

Mesa de funcionários. Obtenha o número de departamentos que possuem funcionários
Solução

SELECT COUNT (COUNT (*))     department_count
    FROM employees
   WHERE department_id IS NOT NULL
GROUP BY department_id;

Mesa de funcionários. Obtenha uma lista de Department_ids que possuem mais de 30 funcionários
Solução

  SELECT department_id
    FROM employees
GROUP BY department_id
  HAVING COUNT (*) > 30;

Mesa de funcionários. Obtenha uma lista de Department_ids e o salário médio arredondado dos funcionários de cada departamento.
Solução

  SELECT department_id, ROUND (AVG (salary)) avg_salary
    FROM employees
GROUP BY department_id;

Tabela Países. Obtenha a lista region_id a soma de todas as letras de todos os country_names em que há mais de 60
Solução

  SELECT region_id
    FROM countries
GROUP BY region_id
  HAVING SUM (LENGTH (country_name)) > 60;

Mesa de funcionários. Obtenha uma lista de Department_ids em que funcionários de vários (>1) job_ids trabalham
Solução

  SELECT department_id
    FROM employees
GROUP BY department_id
  HAVING COUNT (DISTINCT job_id) > 1;

Mesa de funcionários. Obtenha uma lista de manager_ids cujo número de subordinados seja superior a 5 e a soma de todos os salários de seus subordinados seja superior a 50000
Solução

  SELECT manager_id
    FROM employees
GROUP BY manager_id
  HAVING COUNT (*) > 5 AND SUM (salary) > 50000;

Mesa de funcionários. Obtenha uma lista de manager_ids cujo salário médio de todos os seus subordinados está na faixa de 6000 a 9000 e que não recebem bônus (commission_pct está vazio)
Solução

  SELECT manager_id, AVG (salary) avg_salary
    FROM employees
   WHERE commission_pct IS NULL
GROUP BY manager_id
  HAVING AVG (salary) BETWEEN 6000 AND 9000;

Mesa de funcionários. Obtenha o salário máximo de todos os funcionários job_id que termina com a palavra 'CLERK'
Solução

SELECT MAX (salary) max_salary
  FROM employees
 WHERE job_id LIKE '%CLERK';

SELECT MAX (salary) max_salary
  FROM employees
 WHERE SUBSTR (job_id, -5) = 'CLERK';

Mesa de funcionários. Obtenha o salário máximo entre todos os salários médios do departamento
Solução

  SELECT MAX (AVG (salary))
    FROM employees
GROUP BY department_id;

Mesa de funcionários. Obtenha o número de funcionários com o mesmo número de letras no nome. Ao mesmo tempo, mostre apenas aqueles cujo comprimento do nome seja superior a 5 e o número de funcionários com o mesmo nome seja superior a 20. Classifique por comprimento do nome
Solução

  SELECT LENGTH (first_name), COUNT (*)
    FROM employees
GROUP BY LENGTH (first_name)
  HAVING LENGTH (first_name) > 5 AND COUNT (*) > 20
ORDER BY LENGTH (first_name);

  SELECT LENGTH (first_name), COUNT (*)
    FROM employees
   WHERE LENGTH (first_name) > 5
GROUP BY LENGTH (first_name)
  HAVING COUNT (*) > 20
ORDER BY LENGTH (first_name);

Exibindo dados de várias tabelas usando junções

Tabela Funcionários, 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

  SELECT region_name, COUNT (*)
    FROM 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)
GROUP BY region_name;

Tabela Funcionários, Departamentos, Locais, Países, Regiões. Obtenha informações detalhadas sobre cada funcionário:
Nome, Sobrenome, Departamento, Cargo, Rua, País, Região
Solução

SELECT First_name,
       Last_name,
       Department_name,
       Job_id,
       street_address,
       Country_name,
       Region_name
  FROM 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);

Mesa de funcionários. Mostrar todos os gestores que possuem mais de 6 funcionários subordinados a eles
Solução

  SELECT man.first_name, COUNT (*)
    FROM employees emp JOIN employees man ON (emp.manager_id = man.employee_id)
GROUP BY man.first_name
  HAVING COUNT (*) > 6;

Mesa de funcionários. Mostrar todos os funcionários que não se reportam a ninguém
Solução

SELECT emp.first_name
  FROM employees  emp
       LEFT JOIN employees man ON (emp.manager_id = man.employee_id)
 WHERE man.FIRST_NAME IS NULL;

SELECT first_name
  FROM employees
 WHERE manager_id IS NULL;

Tabela Funcionários, Job_history. A tabela Employee armazena todos os funcionários. A tabela Job_history armazena funcionários que deixaram a empresa. Obtenha um relatório sobre todos os funcionários e sua situação na empresa (trabalha ou saiu da empresa com a data de saída)
Exemplo:
primeiro_nome | status
Jennifer | Deixou a empresa em 31 de dezembro de 2006
Clara | Atualmente trabalhando
Solução

SELECT first_name,
       NVL2 (
           end_date,
           TO_CHAR (end_date, 'fm""Left the company at"" DD ""of"" Month, YYYY'),
           'Currently Working')
           status
  FROM employees e LEFT JOIN job_history j ON (e.employee_id = j.employee_id);

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

 SELECT first_name
  FROM employees
       JOIN departments USING (department_id)
       JOIN locations USING (location_id)
       JOIN countries USING (country_id)
       JOIN regions USING (region_id)
 WHERE region_name = 'Europe';
 
 SELECT first_name
  FROM 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)
 WHERE region_name = 'Europe';

Funcionários de mesa, departamentos. Mostrar todos os departamentos com mais de 30 funcionários
Solução

SELECT department_name, COUNT (*)
    FROM employees e JOIN departments d ON (e.department_id = d.department_id)
GROUP BY department_name
  HAVING COUNT (*) > 30;

Funcionários de mesa, departamentos. Mostrar todos os funcionários que não estão em nenhum departamento
Solução

SELECT first_name
  FROM employees  e
       LEFT JOIN departments d ON (e.department_id = d.department_id)
 WHERE d.department_name IS NULL;

SELECT first_name
  FROM employees
 WHERE department_id IS NULL;

Funcionários de mesa, departamentos. Mostrar todos os departamentos em que não há funcionários
Solução

SELECT department_name
  FROM employees  e
       RIGHT JOIN departments d ON (e.department_id = d.department_id)
 WHERE first_name IS NULL;

Mesa de funcionários. Mostrar todos os funcionários que não possuem ninguém subordinado a eles
Solução

SELECT man.first_name
  FROM employees  emp
       RIGHT JOIN employees man ON (emp.manager_id = man.employee_id)
 WHERE emp.FIRST_NAME IS NULL;

Tabela Funcionários, Empregos, Departamentos. Mostre os funcionários no formato: Nome_cargo, Nome_do_departamento.
Exemplo:
Nome_nome | Cargo_título | Nome do departamento
Donald | Envio | Balconista
Solução

SELECT first_name, job_title, department_name
  FROM employees  e
       JOIN jobs j ON (e.job_id = j.job_id)
       JOIN departments d ON (d.department_id = e.department_id);

Mesa de funcionários. Obtenha uma lista de funcionários cujos gerentes conseguiram um emprego em 2005, mas ao mesmo tempo esses próprios funcionários conseguiram um emprego 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');

Mesa de funcionários. Obtenha uma lista de funcionários cujos gerentes conseguiram um emprego em janeiro de qualquer ano e o tamanho do cargo_título desses funcionários seja superior a 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

Mesa de funcionários. Obtenha uma lista de funcionários com o nome mais longo.
Solução

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

Mesa de funcionários. Obtenha uma lista de funcionários com salário superior ao salário médio de todos os funcionários.
Solução

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

Tabela de Funcionários, Departamentos, Locais. Obtenha a cidade em que os funcionários 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);

Mesa de funcionários. Obtenha uma lista de funcionários cujo gerente recebe um salário superior a 15000.
Solução

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

Funcionários de mesa, departamentos. Mostrar todos os departamentos em que não há funcionários
Solução

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

Mesa de funcionários. Mostrar todos os funcionários 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)

Mesa de funcionários. Mostrar todos os gestores que possuem mais de 6 funcionários subordinados a eles
Solução

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

Funcionários de mesa, departamentos. Mostre funcionários 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, Empregos, Departamentos. Mostre os funcionários no formato: Nome_cargo, Nome_do_departamento.
Exemplo:
Nome_nome | Cargo_título | Nome do departamento
Donald | Envio | Balconista
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;

Mesa de funcionários. Obtenha uma lista de funcionários cujos gerentes conseguiram um emprego em 2005, mas ao mesmo tempo esses próprios funcionários conseguiram um emprego 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');

Mesa de funcionários. Obtenha uma lista de funcionários cujos gerentes conseguiram um emprego em janeiro de qualquer ano e o tamanho do cargo_título desses funcionários seja superior a 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;

Isso é tudo por agora.

Espero que as tarefas tenham sido interessantes e emocionantes.
Acrescentarei a esta lista de tarefas o máximo possível.
Também ficarei feliz em receber comentários e sugestões.

PS: Se alguém surgir com uma tarefa SELECT interessante, escreva nos comentários e eu a adicionarei à lista.

Obrigado.

Fonte: habr.com

Adicionar um comentário