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 (ˈɛ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.
Você pode ler sobre SQL em diferentes .
Este artigo não tem a intenção de ensiná-lo SQL do zero.
Então, vamos lá.
Usaremos a bem conhecida no Oracle com suas tabelas ():

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
