{"id":36671,"date":"2019-10-31T22:13:01","date_gmt":"2019-10-31T19:13:01","guid":{"rendered":"https:\/\/prohoster.info\/blog\/sql-zanimatelnye-zadachki\/"},"modified":"2019-10-31T22:13:01","modified_gmt":"2019-10-31T19:13:01","slug":"sql-zanimatelnye-zadachki","status":"publish","type":"post","link":"https:\/\/prohoster.info\/pt\/blog\/news\/sql-zanimatelnye-zadachki","title":{"rendered":"SQL. Tarefas interessantes","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Ol\u00e1, Habr!<\/p>\n<p>H\u00e1 mais de 3 anos, leciono SQL em diferentes centros de treinamento, e uma das minhas observa\u00e7\u00f5es \u00e9 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\u00f3ricos.<\/p>\n<p>Neste artigo, compartilharei com voc\u00ea 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\u00e3o profunda e clara do SQL.<\/p>\n<p><img decoding=\"async\" alt=\"SQL. Tarefas interessantes\" src=\"\/wp-content\/uploads\/2019\/07\/283f472e0c382c0621ffc14e2ac06881.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSQL (\u02c8\u025bs\u02c8kju\u02c8\u025bl; ingl\u00eas: structured query language - 'linguagem de consulta estruturada') \u00e9 uma linguagem de programa\u00e7\u00e3o 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. <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/SQL\">Saiba mais... <\/a><\/noindex><\/p>\n<p>Voc\u00ea pode ler sobre SQL em diferentes <noindex><a rel=\"nofollow\" href=\"https:\/\/www.google.com\/search?q=SQL\">fontes<\/a><\/noindex>.<br \/>\nEste artigo n\u00e3o tem a inten\u00e7\u00e3o de ensin\u00e1-lo SQL do zero.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nEnt\u00e3o, vamos l\u00e1.<\/p>\n<p>Usaremos a bem conhecida <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/oracle\/db-sample-schemas\/tree\/master\/human_resources\">estrutura de HR<\/a><\/noindex> no Oracle com suas tabelas (<noindex><a rel=\"nofollow\" href=\"https:\/\/docs.oracle.com\/en\/database\/oracle\/oracle-database\/12.2\/comsc\/HR-sample-schema-table-descriptions.html\">Saiba mais<\/a><\/noindex>):<\/p>\n<p><img decoding=\"async\" alt=\"SQL. Tarefas interessantes\" src=\"\/wp-content\/uploads\/2019\/07\/b518c0bedd0d7bbeaedbcc4bd95079cd.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nRessalto que abordaremos apenas tarefas relacionadas a SELECT. N\u00e3o haver\u00e1 tarefas sobre DML e DDL.<\/p>\n<h2>Tarefas<\/h2>\n<p>\n<b>Restringindo e Ordenando Dados<\/b><\/p>\n<p>Tabela Employees. Obtenha uma lista com informa\u00e7\u00f5es sobre todos os funcion\u00e1rios <br \/>\n<b class=\"spoiler_title\">Solu\u00e7\u00e3o<\/b><\/p>\n<pre><code class=\"sql\">SELECT * FROM employees\n<\/code><\/pre>\n<p>Tabela de Funcion\u00e1rios. Obter a lista de todos os funcion\u00e1rios com o nome 'David'<br \/>\n<b class=\"spoiler_title\">Solu\u00e7\u00e3o<\/b><\/p>\n<pre><code class=\"sql\">SELECT *\n  FROM employees\n WHERE first_name = 'David';\n<\/code><\/pre>\n<p>Tabela de Funcion\u00e1rios. Obter a lista de todos os funcion\u00e1rios com job_id igual a 'IT_PROG'<br \/>\n<b class=\"spoiler_title\">Solu\u00e7\u00e3o<\/b><\/p>\n<pre><code class=\"sql\">SELECT *\n  FROM employees\n WHERE job_id = 'IT_PROG'\n<\/code><\/pre>\n<p>Tabela Employees. Obtenha uma lista de todos os funcion\u00e1rios do departamento 50 (department_id) com sal\u00e1rio (salary) maior que 4000<br \/>\n<b class=\"spoiler_title\">Solu\u00e7\u00e3o<\/b><\/p>\n<pre><code class=\"sql\">SELECT *\n  FROM employees\n WHERE department_id = 50 AND salary &gt; 4000;\n<\/code><\/pre>\n<p>Tabela Employees. Obtenha uma lista de todos os funcion\u00e1rios dos departamentos 20 e 30 (department_id)<br \/>\n<b class=\"spoiler_title\">Solu\u00e7\u00e3o<\/b><\/p>\n<pre><code class=\"sql\">SELECT *\n  FROM employees\n WHERE department_id = 20 OR department_id = 30;\n<\/code><\/pre>\n<p>Tabela de Funcion\u00e1rios. Obter a lista de todos os funcion\u00e1rios cuja \u00faltima letra do nome \u00e9 'a'<br \/>\n<b class=\"spoiler_title\">Solu\u00e7\u00e3o<\/b><\/p>\n<pre><code class=\"sql\">SELECT *\n  FROM employees\n WHERE first_name LIKE '%a';\n<\/code><\/pre>\n<p>Tabela Employees. Obtenha uma lista de todos os funcion\u00e1rios dos departamentos 50 e 80 (department_id) que t\u00eam b\u00f4nus (valor na coluna commission_pct n\u00e3o vazio)<br \/>\n<b class=\"spoiler_title\">Solu\u00e7\u00e3o<\/b><\/p>\n<pre><code class=\"sql\">SELECT *\n  FROM employees\n WHERE     (department_id = 50 OR department_id = 80)\n       AND commission_pct IS NOT NULL;\n<\/code><\/pre>\n<p>Tabela de Funcion\u00e1rios. Obter a lista de todos os funcion\u00e1rios cujo nome cont\u00e9m pelo menos 2 letras 'n'<br \/>\n<b class=\"spoiler_title\">Solu\u00e7\u00e3o<\/b><\/p>\n<pre><code class=\"sql\">SELECT *\n  FROM employees\n WHERE first_name LIKE '%n%n%';\n<\/code><\/pre>\n<p>Tabela Employees. Obtenha uma lista de todos os funcion\u00e1rios cujo nome tenha mais de 4 letras<br \/>\n<b class=\"spoiler_title\">Solu\u00e7\u00e3o<\/b><\/p>\n<pre><code class=\"sql\">SELECT *\n  FROM employees\n WHERE first_name LIKE '%_____%';\n<\/code><\/pre>\n<p>Tabela Employees. Obter uma lista de todos os funcion\u00e1rios cujos sal\u00e1rios est\u00e3o entre 8000 e 9000 (inclusive)<br \/>\n<b class=\"spoiler_title\">Solu\u00e7\u00e3o<\/b><\/p>\n<pre><code class=\"sql\">SELECT *\n  FROM employees\n WHERE salary BETWEEN 8000 AND 9000;\n<\/code><\/pre>\n<p>Tabela de Funcion\u00e1rios. Obter a lista de todos os funcion\u00e1rios cujo nome cont\u00e9m o s\u00edmbolo '%'<br \/>\n<b class=\"spoiler_title\">Solu\u00e7\u00e3o<\/b><\/p>\n<pre><code class=\"sql\">SELECT *\n  FROM employees\n WHERE first_name LIKE '%%%' ESCAPE '';\n<\/code><\/pre>\n<p>Tabela Employees. Obter uma lista de todos os IDs dos gerentes<br \/>\n<b class=\"spoiler_title\">Solu\u00e7\u00e3o<\/b><\/p>\n<pre><code class=\"sql\">SELECT DISTINCT manager_id\n  FROM employees\n WHERE manager_id IS NOT NULL;\n<\/code><\/pre>\n<p>Tabela Employees. Obter uma lista de trabalhadores com suas posi\u00e7\u00f5es no formato: Donald(sh_clerk)<br \/>\n<b class=\"spoiler_title\">Solu\u00e7\u00e3o<\/b><\/p>\n<pre><code class=\"sql\">SELECT first_name || '(' || LOWER (job_id) || ')' employee FROM employees;\n<\/code><\/pre>\n<p>\n<b>Usando Fun\u00e7\u00f5es de Linha \u00danica para Personalizar a Sa\u00edda<\/b><\/p>\n<p>Tabela Employees. Obter uma lista de todos os funcion\u00e1rios cujo nome tem mais de 10 letras<br \/>\n<b class=\"spoiler_title\">Solu\u00e7\u00e3o<\/b><\/p>\n<pre><code class=\"sql\">SELECT *\n  FROM employees\n WHERE LENGTH (first_name) &gt; 10;\n<\/code><\/pre>\n<p>Tabela de Funcion\u00e1rios. Obter a lista de todos os funcion\u00e1rios cujo nome cont\u00e9m a letra 'b' (sem diferenciar mai\u00fasculas de min\u00fasculas)<br \/>\n<b class=\"spoiler_title\">Solu\u00e7\u00e3o<\/b><\/p>\n<pre><code class=\"sql\">SELECT *\n  FROM employees\n WHERE INSTR (LOWER (first_name), 'b') &gt; 0;\n<\/code><\/pre>\n<p>Tabela de Funcion\u00e1rios. Obter a lista de todos os funcion\u00e1rios cujo nome cont\u00e9m pelo menos 2 letras 'a'<br \/>\n<b class=\"spoiler_title\">Solu\u00e7\u00e3o<\/b><\/p>\n<pre><code class=\"sql\">SELECT *\n  FROM employees\n WHERE INSTR (LOWER (first_name),'a',1,2) &gt; 0;\n<\/code><\/pre>\n<p>Tabela Employees. Obter uma lista de todos os funcion\u00e1rios cujo sal\u00e1rio \u00e9 m\u00faltiplo de 1000<br \/>\n<b class=\"spoiler_title\">Solu\u00e7\u00e3o<\/b><\/p>\n<pre><code class=\"sql\">SELECT *\n  FROM employees\n WHERE MOD (salary, 1000) = 0;\n<\/code><\/pre>\n<p>Tabela Employees. Obter os primeiros 3 d\u00edgitos do n\u00famero de telefone do funcion\u00e1rio se seu n\u00famero estiver no formato XXX.XXX.XXXX<br \/>\n<b class=\"spoiler_title\">Solu\u00e7\u00e3o<\/b><\/p>\n<pre><code class=\"sql\">SELECT phone_number, SUBSTR (phone_number, 1, 3) new_phone_number\n  FROM employees\n WHERE phone_number LIKE '___.___.____';\n<\/code><\/pre>\n<p>Tabela Departments. Obter a primeira palavra do nome do departamento para aqueles cujo nome cont\u00e9m mais de uma palavra<br \/>\n<b class=\"spoiler_title\">Solu\u00e7\u00e3o<\/b><\/p>\n<pre><code class=\"sql\">SELECT department_name,\n       SUBSTR (department_name, 1, INSTR (department_name, ' ')-1)\n           first_word\n  FROM departments\n WHERE INSTR (department_name, ' ') &gt; 0;\n<\/code><\/pre>\n<p>Tabela Employees. Obter os nomes dos funcion\u00e1rios sem a primeira e a \u00faltima letra do nome<br \/>\n<b class=\"spoiler_title\">Solu\u00e7\u00e3o<\/b><\/p>\n<pre><code class=\"sql\">SELECT first_name, SUBSTR (first_name, 2, LENGTH (first_name) - 2) new_name\n  FROM employees;\n<\/code><\/pre>\n<p>Tabela de Funcion\u00e1rios. Obter a lista de todos os funcion\u00e1rios cuja \u00faltima letra do nome \u00e9 'm' e o comprimento do nome \u00e9 maior que 5<br \/>\n<b class=\"spoiler_title\">Solu\u00e7\u00e3o<\/b><\/p>\n<pre><code class=\"sql\">SELECT *\n  FROM employees\n WHERE SUBSTR (first_name, -1) = 'm' AND LENGTH(first_name)&gt;5;\n<\/code><\/pre>\n<p>Tabela Dual. Obter a data da pr\u00f3xima sexta-feira<br \/>\n<b class=\"spoiler_title\">Solu\u00e7\u00e3o<\/b><\/p>\n<pre><code class=\"sql\">SELECT NEXT_DAY (SYSDATE, 'FRIDAY') next_friday FROM DUAL;\n<\/code><\/pre>\n<p>Tabela Employees. Obter uma lista de todos os funcion\u00e1rios que trabalham na empresa h\u00e1 mais de 17 anos<br \/>\n<b class=\"spoiler_title\">Solu\u00e7\u00e3o<\/b><\/p>\n<pre><code class=\"sql\">SELECT *\n  FROM employees\n WHERE MONTHS_BETWEEN (SYSDATE, hire_date) \/ 12 &gt; 17;\n<\/code><\/pre>\n<p>Tabela Employees. Obter uma lista de todos os funcion\u00e1rios cujo \u00faltimo d\u00edgito do n\u00famero de telefone \u00e9 \u00edmpar e consiste em 3 n\u00fameros separados por ponto<br \/>\n<b class=\"spoiler_title\">Solu\u00e7\u00e3o<\/b><\/p>\n<pre><code class=\"sql\">SELECT *\n  FROM employees\n WHERE     MOD (SUBSTR (phone_number, -1), 2) != 0\n       AND INSTR (phone_number,'.',1,3) = 0;\n<\/code><\/pre>\n<p>Tabela de Funcion\u00e1rios. Obter a lista de todos os funcion\u00e1rios cujo valor de job_id ap\u00f3s o caractere '_' tem pelo menos 3 caracteres, desde que esse valor ap\u00f3s '_' n\u00e3o seja 'CLERK'<br \/>\n<b class=\"spoiler_title\">Solu\u00e7\u00e3o<\/b><\/p>\n<pre><code class=\"sql\">SELECT *\n  FROM employees\n WHERE     LENGTH (SUBSTR (job_id, INSTR (job_id, '_') + 1)) &gt; 3\n       AND SUBSTR (job_id, INSTR (job_id, '_') + 1) != 'CLERK';\n<\/code><\/pre>\n<p>Tabela de Funcion\u00e1rios. Obter a lista de todos os funcion\u00e1rios substituindo em PHONE_NUMBER todos os '.' por '-'<br \/>\n<b class=\"spoiler_title\">Solu\u00e7\u00e3o<\/b><\/p>\n<pre><code class=\"sql\">SELECT phone_number, REPLACE (phone_number, '.', '-') new_phone_number\n  FROM employees;\n<\/code><\/pre>\n<p>\n<b>Usando Fun\u00e7\u00f5es de Convers\u00e3o e Express\u00f5es Condicionais<\/b><\/p>\n<p>Tabela Employees. Obter a lista de todos os funcion\u00e1rios que foram contratados no primeiro dia de qualquer m\u00eas<br \/>\n<b class=\"spoiler_title\">Solu\u00e7\u00e3o<\/b><\/p>\n<pre><code class=\"sql\">SELECT *\n  FROM employees\n WHERE TO_CHAR (hire_date, 'DD') = '01';\n<\/code><\/pre>\n<p>Tabela Employees. Obter a lista de todos os funcion\u00e1rios que foram contratados em 2008<br \/>\n<b class=\"spoiler_title\">Solu\u00e7\u00e3o<\/b><\/p>\n<pre><code class=\"sql\">SELECT *\n  FROM employees\n WHERE TO_CHAR (hire_date, 'YYYY') = '2008';\n<\/code><\/pre>\n<p>Tabela DUAL. Mostrar a data de amanh\u00e3 no formato: Amanh\u00e3 \u00e9 o segundo dia de janeiro<br \/>\n<b class=\"spoiler_title\">Solu\u00e7\u00e3o<\/b><\/p>\n<pre><code class=\"sql\">SELECT TO_CHAR (SYSDATE, 'fm\"\"Amanh\u00e3 \u00e9 \"\"Ddspth \"\"dia de\"\" M\u00eas')     info\n  FROM DUAL;\n<\/code><\/pre>\n<p>Tabela Employees. Obter a lista de todos os funcion\u00e1rios e a data de contrata\u00e7\u00e3o de cada um no formato: 21 de junho de 2007<br \/>\n<b class=\"spoiler_title\">Solu\u00e7\u00e3o<\/b><\/p>\n<pre><code class=\"sql\">SELECT first_name, TO_CHAR (hire_date, 'fmddth \"\"de\"\" M\u00eas, YYYY') hire_date\n  FROM employees;\n<\/code><\/pre>\n<p>Tabela Employees. Obter a lista de funcion\u00e1rios com aumentos de sal\u00e1rio de 20%. Exibir o sal\u00e1rio com o s\u00edmbolo do d\u00f3lar<br \/>\n<b class=\"spoiler_title\">Solu\u00e7\u00e3o<\/b><\/p>\n<pre><code class=\"sql\">SELECT first_name, TO_CHAR (salary + salary * 0.20, 'fm$999,999.00') new_salary\n  FROM employees;\n<\/code><\/pre>\n<p>Tabela Employees. Obter a lista de todos os funcion\u00e1rios que foram contratados em fevereiro de 2007.<br \/>\n<b class=\"spoiler_title\">Solu\u00e7\u00e3o<\/b><\/p>\n<pre><code class=\"sql\">SELECT *\n  FROM employees\n WHERE hire_date BETWEEN TO_DATE ('01.02.2007', 'DD.MM.YYYY')\n                     AND LAST_DAY (TO_DATE ('01.02.2007', 'DD.MM.YYYY'));\n\nSELECT *\n  FROM employees\n WHERE to_char(hire_date,'MM.YYYY') = '02.2007'; \n<\/code><\/pre>\n<p>Tabela DUAL. Exibir a data atual, + segundo, + minuto, + hora, + dia, + m\u00eas, + ano<br \/>\n<b class=\"spoiler_title\">Solu\u00e7\u00e3o<\/b><\/p>\n<pre><code class=\"sql\">SELECT SYSDATE                          now,\n       SYSDATE + 1 \/ (24 * 60 * 60)     plus_second,\n       SYSDATE + 1 \/ (24 * 60)          plus_minute,\n       SYSDATE + 1 \/ 24                 plus_hour,\n       SYSDATE + 1                      plus_day,\n       ADD_MONTHS (SYSDATE, 1)          plus_month,\n       ADD_MONTHS (SYSDATE, 12)         plus_year\n  FROM DUAL;\n<\/code><\/pre>\n<p>Tabela Employees. Obter a lista de todos os funcion\u00e1rios com sal\u00e1rios totais (sal\u00e1rio + comiss\u00e3o_pct(%)) no formato: $24,000.00<br \/>\n<b class=\"spoiler_title\">Solu\u00e7\u00e3o<\/b><\/p>\n<pre><code class=\"sql\">SELECT first_name, salary, TO_CHAR (salary + salary * NVL (commission_pct, 0), 'fm$99,999.00') full_salary\n  FROM employees;\n<\/code><\/pre>\n<p>Tabela Employees. Obter a lista de todos os funcion\u00e1rios e informa\u00e7\u00f5es sobre a exist\u00eancia de b\u00f4nus no sal\u00e1rio (Sim\/N\u00e3o)<br \/>\n<b class=\"spoiler_title\">Solu\u00e7\u00e3o<\/b><\/p>\n<pre><code class=\"sql\">SELECT first_name, commission_pct, NVL2 (commission_pct, 'Sim', 'N\u00e3o') has_bonus\n  FROM employees;\n<\/code><\/pre>\n<p>Tabela Employees. Obter o n\u00edvel salarial de cada funcion\u00e1rio: Menos de 5000 \u00e9 considerado n\u00edvel baixo, 5000 ou mais e menos de 10000 \u00e9 considerado n\u00edvel normal, 10000 ou mais \u00e9 considerado n\u00edvel alto<br \/>\n<b class=\"spoiler_title\">Solu\u00e7\u00e3o<\/b><\/p>\n<pre><code class=\"sql\">SELECIONE first_name,\n       salary,\n       CASE\n           WHEN salary = 5000 AND salary &lt; 10000 THEN &#039;Normal&#039;\n           ELSE &#039;Alto&#039;\n       END salary_level\n  DE employees;\n<\/code><\/pre>\n<p>Tabela Countries. Para cada pa\u00eds, mostre a regi\u00e3o em que ele se encontra: 1-Europa, 2-Am\u00e9rica, 3-\u00c1sia, 4-\u00c1frica (sem Join)<br \/>\n<b class=\"spoiler_title\">Solu\u00e7\u00e3o<\/b><\/p>\n<pre><code class=\"sql\">SELECIONE country_name country,\n       DECODE (region_id,\n               1, 'Europa',\n               2, 'Am\u00e9rica',\n               3, '\u00c1sia',\n               4, '\u00c1frica',\n               'Desconhecido')\n           region\n  DE countries;\n\nSELECIONE country_name\n           country,\n       CASE region_id\n           WHEN 1 THEN 'Europa'\n           WHEN 2 THEN 'Am\u00e9rica'\n           WHEN 3 THEN '\u00c1sia'\n           WHEN 4 THEN '\u00c1frica'\n           ELSE 'Desconhecido'\n       END\n           region\n  DE countries;\n<\/code><\/pre>\n<p>\n<b>Relatando Dados Agregados Usando as Fun\u00e7\u00f5es de Agrupamento<\/b><\/p>\n<p>Tabela Employees. Obtenha um relat\u00f3rio por department_id com o sal\u00e1rio m\u00ednimo e m\u00e1ximo, com a data de contrata\u00e7\u00e3o mais cedo e mais tardia e com a quantidade de funcion\u00e1rios. Ordenar pela quantidade de funcion\u00e1rios (em ordem decrescente)<br \/>\n<b class=\"spoiler_title\">Solu\u00e7\u00e3o<\/b><\/p>\n<pre><code class=\"sql\">  SELECIONE department_id,\n         MIN (salary) min_salary,\n         MAX (salary) max_salary,\n         MIN (hire_date) min_hire_date,\n         MAX (hire_date) max_hire_Date,\n         COUNT (*) count\n    DE employees\nGROUP BY department_id\norder by count(*) desc;\n<\/code><\/pre>\n<p>Tabela Employees. Quantos funcion\u00e1rios t\u00eam nomes que come\u00e7am com a mesma letra? Ordenar pela quantidade. Mostrar apenas aqueles onde a quantidade \u00e9 maior que 1<br \/>\n<b class=\"spoiler_title\">Solu\u00e7\u00e3o<\/b><\/p>\n<pre><code class=\"sql\">SELECIONE SUBSTR (first_name, 1, 1) first_char, COUNT (*)\n    DE employees\nGROUP BY SUBSTR (first_name, 1, 1)\n  HAVING COUNT (*) &gt; 1\nORDER BY 2 DESC;\n<\/code><\/pre>\n<p>Tabela Employees. Quantos funcion\u00e1rios trabalham no mesmo departamento e recebem o mesmo sal\u00e1rio?<br \/>\n<b class=\"spoiler_title\">Solu\u00e7\u00e3o<\/b><\/p>\n<pre><code class=\"sql\">SELECIONE department_id, salary, COUNT (*)\n    DE employees\nGROUP BY department_id, salary\n  HAVING COUNT (*) &gt; 1;\n<\/code><\/pre>\n<p>Tabela Employees. Obtenha um relat\u00f3rio de quantos funcion\u00e1rios foram contratados em cada dia da semana. Ordenar pela quantidade<br \/>\n<b class=\"spoiler_title\">Solu\u00e7\u00e3o<\/b><\/p>\n<pre><code class=\"sql\">SELECIONE TO_CHAR (hire_Date, 'Dia') day, COUNT (*)\n    DE employees\nGROUP BY TO_CHAR (hire_Date, 'Dia')\nORDER BY 2 DESC;\n<\/code><\/pre>\n<p>Tabela Employees. Obtenha um relat\u00f3rio de quantos funcion\u00e1rios foram contratados por ano. Ordenar pela quantidade<br \/>\n<b class=\"spoiler_title\">Solu\u00e7\u00e3o<\/b><\/p>\n<pre><code class=\"sql\">SELECIONE TO_CHAR (hire_date, 'YYYY') year, COUNT (*)\n    DE employees\nGROUP BY TO_CHAR (hire_date, 'YYYY');\n<\/code><\/pre>\n<p>Tabela Employees. Obtenha o n\u00famero de departamentos que t\u00eam funcion\u00e1rios<br \/>\n<b class=\"spoiler_title\">Solu\u00e7\u00e3o<\/b><\/p>\n<pre><code class=\"sql\">SELECIONE COUNT (COUNT (*)) department_count\n    DE employees\n   ONDE department_id \u00c9 N\u00c3O NULL\nGROUP BY department_id;\n<\/code><\/pre>\n<p>Tabela Employees. Obtenha a lista de department_id em que mais de 30 funcion\u00e1rios trabalham<br \/>\n<b class=\"spoiler_title\">Solu\u00e7\u00e3o<\/b><\/p>\n<pre><code class=\"sql\">  SELECIONE department_id\n    DE employees\nGROUP BY department_id\n  HAVING COUNT (*) &gt; 30;\n<\/code><\/pre>\n<p>Tabela Employees. Obtenha a lista de department_id e o sal\u00e1rio m\u00e9dio arredondado dos trabalhadores em cada departamento. <br \/>\n<b class=\"spoiler_title\">Solu\u00e7\u00e3o<\/b><\/p>\n<pre><code class=\"sql\">  SELECIONE department_id, ROUND (AVG (salary)) avg_salary\n    DE employees\nGROUP BY department_id;\n<\/code><\/pre>\n<p>Tabela Countries. Obtenha a lista de region_id e a soma de todas as letras de todos country_name onde \u00e9 maior que 60<br \/>\n<b class=\"spoiler_title\">Solu\u00e7\u00e3o<\/b><\/p>\n<pre><code class=\"sql\">  SELECIONE region_id\n    DE countries\nAGRUPAR POR region_id\n  TENDO A SOMA (COMPRIMENTO (country_name)) &gt; 60;\n<\/code><\/pre>\n<p>Tabela Employees. Obtenha uma lista de department_id onde trabalham funcion\u00e1rios com v\u00e1rios (&gt;1) job_id<br \/>\n<b class=\"spoiler_title\">Solu\u00e7\u00e3o<\/b><\/p>\n<pre><code class=\"sql\">  SELECIONE department_id\n    DE employees\nAGRUPAR POR department_id\n  TENDO A CONTAGEM (DISTINTA job_id) &gt; 1;\n<\/code><\/pre>\n<p>Tabela Employees. Obtenha uma lista de manager_id onde o n\u00famero de subordinados \u00e9 maior que 5 e a soma de todos os sal\u00e1rios de seus subordinados \u00e9 maior que 50000<br \/>\n<b class=\"spoiler_title\">Solu\u00e7\u00e3o<\/b><\/p>\n<pre><code class=\"sql\">  SELECIONE manager_id\n    DE employees\nAGRUPAR POR manager_id\n  TENDO A CONTAGEM (*) &gt; 5 E A SOMA (salary) &gt; 50000;\n<\/code><\/pre>\n<p>Tabela Employees. Obtenha uma lista de manager_id onde a m\u00e9dia salarial de todos os seus subordinados est\u00e1 entre 6000 e 9000 e que n\u00e3o recebem b\u00f4nus (commission_pct vazia)<br \/>\n<b class=\"spoiler_title\">Solu\u00e7\u00e3o<\/b><\/p>\n<pre><code class=\"sql\">  SELECIONE manager_id, AVG (salary) avg_salary\n    DE employees\n   ONDE commission_pct \u00c9 NULO\nAGRUPAR POR manager_id\n  TENDO A M\u00c9DIA (salary) ENTRE 6000 E 9000;\n<\/code><\/pre>\n<p>Tabela de Funcion\u00e1rios. Obter o sal\u00e1rio m\u00e1ximo de todos os funcion\u00e1rios cujo job_id termina com a palavra 'CLERK'<br \/>\n<b class=\"spoiler_title\">Solu\u00e7\u00e3o<\/b><\/p>\n<pre><code class=\"sql\">SELECIONE MAX (salary) max_salary\n  DE employees\n ONDE job_id LIKE '%CLERK';\n\nSELECIONE MAX (salary) max_salary\n  DE employees\n ONDE SUBSTR (job_id, -5) = 'CLERK';\n<\/code><\/pre>\n<p>Tabela Employees. Obtenha o maior sal\u00e1rio entre todas as m\u00e9dias salariais por departamento<br \/>\n<b class=\"spoiler_title\">Solu\u00e7\u00e3o<\/b><\/p>\n<pre><code class=\"sql\">  SELECIONE MAX (AVG (salary))\n    DE employees\nAGRUPAR POR department_id;\n<\/code><\/pre>\n<p>Tabela Employees. Obtenha o n\u00famero de funcion\u00e1rios com o mesmo n\u00famero de letras no nome. Mostre apenas aqueles com comprimento do nome maior que 5 e n\u00famero de funcion\u00e1rios com esse nome maior que 20. Ordenar pelo comprimento do nome<br \/>\n<b class=\"spoiler_title\">Solu\u00e7\u00e3o<\/b><\/p>\n<pre><code class=\"sql\">  SELECIONE LENGTH (first_name), CONTAGEM (*)\n    DE employees\nAGRUPAR POR LENGTH (first_name)\n  TENDO LENGTH (first_name) &gt; 5 E CONTAGEM (*) &gt; 20\nORDENAR POR LENGTH (first_name);\n\n  SELECIONE LENGTH (first_name), CONTAGEM (*)\n    DE employees\n   ONDE LENGTH (first_name) &gt; 5\nAGRUPAR POR LENGTH (first_name)\n  TENDO CONTAGEM (*) &gt; 20\nORDENAR POR LENGTH (first_name);\n<\/code><\/pre>\n<p>\n<b>Exibindo Dados de M\u00faltiplas Tabelas Usando Joins<\/b><\/p>\n<p>Tabela Employees, Departamentos, Locais, Pa\u00edses, Regi\u00f5es. Obtenha uma lista de regi\u00f5es e o n\u00famero de funcion\u00e1rios em cada regi\u00e3o<br \/>\n<b class=\"spoiler_title\">Solu\u00e7\u00e3o<\/b><\/p>\n<pre><code class=\"sql\">  SELECIONE region_name, CONTAGEM (* )\n    DE employees e\n         JOIN departments d ON (e.department_id = d.department_id)\n         JOIN locations l ON (d.location_id = l.location_id)\n         JOIN countries c ON (l.country_id = c.country_id)\n         JOIN regions r ON (c.region_id = r.region_id)\nAGRUPAR POR region_name;\n<\/code><\/pre>\n<p>Tabela Employees, Departamentos, Locais, Pa\u00edses, Regi\u00f5es. Obtenha informa\u00e7\u00f5es detalhadas sobre cada funcion\u00e1rio:<br \/>\nFirst_name, Last_name, Departamento, Trabalho, Rua, Pa\u00eds, Regi\u00e3o<br \/>\n<b class=\"spoiler_title\">Solu\u00e7\u00e3o<\/b><\/p>\n<pre><code class=\"sql\">SELECIONE First_name,\n       Last_name,\n       Department_name,\n       Job_id,\n       street_address,\n       Country_name,\n       Region_name\n  DE employees e\n       JOIN departments d ON (e.department_id = d.department_id)\n       JOIN locations l ON (d.location_id = l.location_id)\n       JOIN countries c ON (l.country_id = c.country_id)\n       JOIN regions r ON (c.region_id = r.region_id);\n<\/code><\/pre>\n<p>Tabela Employees. Mostre todos os gerentes que t\u00eam mais de 6 subordinados<br \/>\n<b class=\"spoiler_title\">Solu\u00e7\u00e3o<\/b><\/p>\n<pre><code class=\"sql\">  SELECIONE man.first_name, CONTAR (*)\n    DOS funcion\u00e1rios emp JUNTE-SE aos funcion\u00e1rios man ON (emp.manager_id = man.employee_id)\nAGRUPAR POR man.first_name\n  TENDO CONTAR (*) &gt; 6;\n<\/code><\/pre>\n<p>Tabela Funcion\u00e1rios. Mostrar todos os funcion\u00e1rios que n\u00e3o t\u00eam subordinados<br \/>\n<b class=\"spoiler_title\">Solu\u00e7\u00e3o<\/b><\/p>\n<pre><code class=\"sql\">SELECIONE emp.first_name\n  DOS funcion\u00e1rios emp\n       JUNTE-SE AOS funcion\u00e1rios man ON (emp.manager_id = man.employee_id)\n ONDE man.FIRST_NAME \u00c9 NULO;\n\nSELECIONE first_name\n  DOS funcion\u00e1rios\n ONDE manager_id \u00c9 NULO;\n<\/code><\/pre>\n<p>Tabela Funcion\u00e1rios, Hist\u00f3rico_de_trabalho. Na tabela Funcion\u00e1rio, est\u00e3o armazenados todos os funcion\u00e1rios. Na tabela Hist\u00f3rico_de_trabalho, est\u00e3o os funcion\u00e1rios que deixaram a empresa. Obter um relat\u00f3rio sobre todos os funcion\u00e1rios e seu status na empresa (Trabalhando ou deixou a empresa com a data de sa\u00edda)<br \/>\nExemplo:<br \/>\nfirst_name | status<br \/>\nJennifer | Deixou a empresa em 31 de dezembro de 2006<br \/>\nClara | Atualmente Trabalhando<br \/>\n<b class=\"spoiler_title\">Solu\u00e7\u00e3o<\/b><\/p>\n<pre><code class=\"sql\">SELECIONE first_name,\n       NVL2 (\n           end_date,\n           TO_CHAR (end_date, 'fm\"\"Deixou a empresa em\"\" DD \"\"de\"\" M\u00eas, AAAA'),\n           'Atualmente Trabalhando')\n           status\n  DOS funcion\u00e1rios e JUNTE-SE ao hist\u00f3rico_de_trabalho j ON (e.employee_id = j.employee_id);\n<\/code><\/pre>\n<p>Tabela Funcion\u00e1rios, Departamentos, Localiza\u00e7\u00f5es, Pa\u00edses, Regi\u00f5es. Obter uma lista de funcion\u00e1rios que vivem na Europa (region_name)<br \/>\n<b class=\"spoiler_title\">Solu\u00e7\u00e3o<\/b><\/p>\n<pre><code class=\"sql\"> SELECIONE first_name\n  DOS funcion\u00e1rios\n       JUNTE-SE aos departamentos USANDO (department_id)\n       JUNTE-SE \u00e0s localiza\u00e7\u00f5es USANDO (location_id)\n       JUNTE-SE aos pa\u00edses USANDO (country_id)\n       JUNTE-SE \u00e0s regi\u00f5es USANDO (region_id)\n ONDE region_name = 'Europa';\n \n SELECIONE first_name\n  DOS funcion\u00e1rios e\n       JUNTE-SE aos departamentos d ON (e.department_id = d.department_id)\n       JUNTE-SE \u00e0s localiza\u00e7\u00f5es l ON (d.location_id = l.location_id)\n       JUNTE-SE aos pa\u00edses c ON (l.country_id = c.country_id)\n       JUNTE-SE \u00e0s regi\u00f5es r ON (c.region_id = r.region_id)\n ONDE region_name = 'Europa';\n<\/code><\/pre>\n<p>Tabela Funcion\u00e1rios, Departamentos. Mostrar todos os departamentos onde trabalham mais de 30 funcion\u00e1rios<br \/>\n<b class=\"spoiler_title\">Solu\u00e7\u00e3o<\/b><\/p>\n<pre><code class=\"sql\">SELECIONE department_name, CONTAR (*)\n    DOS funcion\u00e1rios e JUNTE-SE aos departamentos d ON (e.department_id = d.department_id)\nAGRUPAR POR department_name\n  TENDO CONTAR (*) &gt; 30;\n<\/code><\/pre>\n<p>Tabela Funcion\u00e1rios, Departamentos. Mostrar todos os funcion\u00e1rios que n\u00e3o est\u00e3o em nenhum departamento<br \/>\n<b class=\"spoiler_title\">Solu\u00e7\u00e3o<\/b><\/p>\n<pre><code class=\"sql\">SELECIONE first_name\n  DOS funcion\u00e1rios e\n       JUNTE-SE aos departamentos d ON (e.department_id = d.department_id)\n ONDE d.department_name \u00c9 NULO;\n\nSELECIONE first_name\n  DOS funcion\u00e1rios\n ONDE department_id \u00c9 NULO;\n<\/code><\/pre>\n<p>Tabela Funcion\u00e1rios, Departamentos. Mostrar todos os departamentos que n\u00e3o t\u00eam nenhum funcion\u00e1rio<br \/>\n<b class=\"spoiler_title\">Solu\u00e7\u00e3o<\/b><\/p>\n<pre><code class=\"sql\">SELECIONE department_name\n  DOS funcion\u00e1rios e\n       JUNTE-SE aos departamentos d ON (e.department_id = d.department_id)\n ONDE first_name \u00c9 NULO;\n<\/code><\/pre>\n<p>Tabela Funcion\u00e1rios. Mostrar todos os funcion\u00e1rios que n\u00e3o t\u00eam ningu\u00e9m sob sua supervis\u00e3o<br \/>\n<b class=\"spoiler_title\">Solu\u00e7\u00e3o<\/b><\/p>\n<pre><code class=\"sql\">SELECIONE man.first_name\n  DOS funcion\u00e1rios emp\n       JUNTE-SE aos funcion\u00e1rios man ON (emp.manager_id = man.employee_id)\n ONDE emp.FIRST_NAME \u00c9 NULO;\n<\/code><\/pre>\n<p>Tabela Funcion\u00e1rios, Cargos, Departamentos. Mostrar funcion\u00e1rios no formato: First_name, Job_title, Department_name.<br \/>\nExemplo:<br \/>\nFirst_name | Job_title | Department_name<br \/>\nDonald | Envio | Empregado de Envio<br \/>\n<b class=\"spoiler_title\">Solu\u00e7\u00e3o<\/b><\/p>\n<pre><code class=\"sql\">SELECIONE first_name, job_title, department_name\n  DOS funcion\u00e1rios e\n       JUNTE-SE aos trabalhos j ON (e.job_id = j.job_id)\n       JUNTE-SE aos departamentos d ON (d.department_id = e.department_id);\n<\/code><\/pre>\n<p>Tabela Funcion\u00e1rios. Obter uma lista de funcion\u00e1rios cujos gerentes foram contratados em 2005, mas esses pr\u00f3prios funcion\u00e1rios foram contratados antes de 2005<br \/>\n<b class=\"spoiler_title\">Solu\u00e7\u00e3o<\/b><\/p>\n<pre><code class=\"sql\">SELECT emp.*\n  FROM employees emp JOIN employees man ON (emp.manager_id = man.employee_id)\n WHERE     TO_CHAR (man.hire_date, 'YYYY') = '2005'\n       AND emp.hire_date &lt; TO_DATE (&#039;01012005&#039;, &#039;DDMMYYYY&#039;);\n<\/code><\/pre>\n<p>Tabela Employees. Obter uma lista de empregados cujos gerentes foram contratados em janeiro de qualquer ano e o comprimento do job_title desses empregados \u00e9 maior que 15 caracteres.<br \/>\n<b class=\"spoiler_title\">Solu\u00e7\u00e3o<\/b><\/p>\n<pre><code class=\"sql\">SELECT emp.*\n  FROM employees  emp\n       JOIN employees man ON (emp.manager_id = man.employee_id)\n       JOIN jobs j ON (emp.job_id = j.job_id)\n WHERE TO_CHAR (man.hire_date, 'MM') = '01' AND LENGTH (j.job_title) &gt; 15;\n<\/code><\/pre>\n<p>\n<b>Usando Subconsultas para Resolver Consultas<\/b><\/p>\n<p>Tabela Employees. Obter uma lista de empregados com o nome mais longo.<br \/>\n<b class=\"spoiler_title\">Solu\u00e7\u00e3o<\/b><\/p>\n<pre><code class=\"sql\">SELECT *\n  FROM employees\n WHERE LENGTH (first_name) =\n       (SELECT MAX (LENGTH (first_name)) FROM employees);\n<\/code><\/pre>\n<p>Tabela Employees. Obter uma lista de empregados com sal\u00e1rio acima da m\u00e9dia de todos os empregados.<br \/>\n<b class=\"spoiler_title\">Solu\u00e7\u00e3o<\/b><\/p>\n<pre><code class=\"sql\">SELECT *\n  FROM employees\n WHERE salary &gt; (SELECT AVG (salary) FROM employees);\n<\/code><\/pre>\n<p>Tabela Employees, Departments, Locations. Obter a cidade onde os empregados ganham menos no total.<br \/>\n<b class=\"spoiler_title\">Solu\u00e7\u00e3o<\/b><\/p>\n<pre><code class=\"sql\">SELECT city\n    FROM employees e\n         JOIN departments d ON (e.department_id = d.department_id)\n         JOIN locations l ON (d.location_id = l.location_id)\nGROUP BY city\n  HAVING SUM (salary) =\n         (  SELECT MIN (SUM (salary))\n              FROM employees e\n                   JOIN departments d ON (e.department_id = d.department_id)\n                   JOIN locations l ON (d.location_id = l.location_id)\n          GROUP BY city);\n<\/code><\/pre>\n<p>Tabela Employees. Obter uma lista de empregados cujo gerente ganha mais de 15000.<br \/>\n<b class=\"spoiler_title\">Solu\u00e7\u00e3o<\/b><\/p>\n<pre><code class=\"sql\">SELECT *\n  FROM employees\n WHERE manager_id IN (SELECT employee_id\n                        FROM employees\n                       WHERE salary &gt; 15000)\n<\/code><\/pre>\n<p>Tabela Funcion\u00e1rios, Departamentos. Mostrar todos os departamentos que n\u00e3o t\u00eam nenhum funcion\u00e1rio<br \/>\n<b class=\"spoiler_title\">Solu\u00e7\u00e3o<\/b><\/p>\n<pre><code class=\"sql\">SELECT *\n  FROM departments\n WHERE department_id NOT IN (SELECT department_id\n                               FROM employees\n                              WHERE department_id IS NOT NULL);\n<\/code><\/pre>\n<p>Tabela Employees. Mostrar todos os empregados que n\u00e3o s\u00e3o gerentes.<br \/>\n<b class=\"spoiler_title\">Solu\u00e7\u00e3o<\/b><\/p>\n<pre><code class=\"sql\">SELECT *\n  FROM employees\n WHERE employee_id NOT IN (SELECT manager_id\n                             FROM employees\n                            WHERE manager_id IS NOT NULL)\n<\/code><\/pre>\n<p>Tabela Employees. Mostre todos os gerentes que t\u00eam mais de 6 subordinados<br \/>\n<b class=\"spoiler_title\">Solu\u00e7\u00e3o<\/b><\/p>\n<pre><code class=\"sql\">SELECT *\n  FROM employees e\n WHERE (SELECT COUNT (*)\n          FROM employees\n         WHERE manager_id = e.employee_id) &gt; 6;\n<\/code><\/pre>\n<p>Tabela Employees, Departamentos. Mostrar empregados que trabalham no departamento de TI.<br \/>\n<b class=\"spoiler_title\">Solu\u00e7\u00e3o<\/b><\/p>\n<pre><code class=\"sql\">SELECT *\n  FROM employees\n WHERE department_id = (SELECT department_id\n                          FROM departments\n                         WHERE department_name = 'IT');\n<\/code><\/pre>\n<p>Tabela Funcion\u00e1rios, Cargos, Departamentos. Mostrar funcion\u00e1rios no formato: First_name, Job_title, Department_name.<br \/>\nExemplo:<br \/>\nFirst_name | Job_title | Department_name<br \/>\nDonald | Envio | Empregado de Envio<br \/>\n<b class=\"spoiler_title\">Solu\u00e7\u00e3o<\/b><\/p>\n<pre><code class=\"sql\">SELECT first_name,\n       (SELECT job_title\n          FROM jobs\n         WHERE job_id = e.job_id)\n           job_title,\n       (SELECT department_name\n          FROM departments\n         WHERE department_id = e.department_id)\n           department_name\n  FROM employees e;\n<\/code><\/pre>\n<p>Tabela Funcion\u00e1rios. Obter uma lista de funcion\u00e1rios cujos gerentes foram contratados em 2005, mas esses pr\u00f3prios funcion\u00e1rios foram contratados antes de 2005<br \/>\n<b class=\"spoiler_title\">Solu\u00e7\u00e3o<\/b><\/p>\n<pre><code class=\"sql\">SELECT *\n  FROM employees\n WHERE     manager_id IN (SELECT employee_id\n                            FROM employees\n                           WHERE TO_CHAR (hire_date, 'YYYY') = '2005')\n       AND hire_date &lt; TO_DATE (&#039;01012005&#039;, &#039;DDMMYYYY&#039;);\n<\/code><\/pre>\n<p>Tabela Employees. Obter uma lista de empregados cujos gerentes foram contratados em janeiro de qualquer ano e o comprimento do job_title desses empregados \u00e9 maior que 15 caracteres.<br \/>\n<b class=\"spoiler_title\">Solu\u00e7\u00e3o<\/b><\/p>\n<pre><code class=\"sql\">SELECT *\n  FROM employees e\n WHERE     manager_id IN (SELECT employee_id\n                            FROM employees\n                           WHERE TO_CHAR (hire_date, 'MM') = '01')\n       AND (SELECT LENGTH (job_title)\n              FROM jobs\n             WHERE job_id = e.job_id) &gt; 15;\n<\/code><\/pre>\n<p>\n<b>Por enquanto \u00e9 tudo.<\/b><\/p>\n<p>Espero que as tarefas tenham sido interessantes e envolventes. <br \/>\nVou complementar esta lista de tarefas sempre que poss\u00edvel.<br \/>\nTamb\u00e9m ficarei feliz com quaisquer coment\u00e1rios e sugest\u00f5es.<\/p>\n<p>P.S.: Se algu\u00e9m tiver uma tarefa interessante sobre SELECT, escreva nos coment\u00e1rios, vou adicionar \u00e0 lista.<\/p>\n<p>Obrigado.<br \/>\n<br \/>Fonte: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/461567\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0417\u0434\u0440\u0430\u0432\u0441\u0442\u0432\u0443\u0439, \u0425\u0430\u0431\u0440! \u0412\u043e\u0442 \u0443\u0436\u0435 \u0431\u043e\u043b\u0435\u0435 3-\u0445 \u043b\u0435\u0442 \u044f \u043f\u0440\u0435\u043f\u043e\u0434\u0430\u044e SQL \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u0442\u0440\u0435\u043d\u0438\u043d\u0433 \u0446\u0435\u043d\u0442\u0440\u0430\u0445, \u0438 \u043e\u0434\u043d\u0438\u043c \u0438\u0437 \u043c\u043e\u0438\u0445 \u043d\u0430\u0431\u043b\u044e\u0434\u0435\u043d\u0438\u0439 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u043e, \u0447\u0442\u043e \u0441\u0442\u0443\u0434\u0435\u043d\u0442\u044b \u043e\u0441\u0432\u0430\u0438\u0432\u0430\u044e\u0442 \u0438 \u043f\u043e\u043d\u0438\u043c\u0430\u044e\u0442 SQL \u043b\u0443\u0447\u0448\u0435, \u0435\u0441\u043b\u0438 \u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043f\u0435\u0440\u0435\u0434 \u043d\u0438\u043c\u0438 \u0437\u0430\u0434\u0430\u0447\u0443, \u0430 \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044f\u0445 \u0438 \u0442\u0435\u043e\u0440\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043e\u0441\u043d\u043e\u0432\u0430\u0445. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u043f\u043e\u0434\u0435\u043b\u044e\u0441\u044c \u0441 \u0432\u0430\u043c\u0438 \u0441\u0432\u043e\u0438\u043c \u0441\u043f\u0438\u0441\u043a\u043e\u043c \u0437\u0430\u0434\u0430\u0447, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u044f \u0434\u0430\u044e [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":27465,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[702],"tags":[],"class_list":["post-36671","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-news"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.3 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0417\u0434\u0440\u0430\u0432\u0441\u0442\u0432\u0443\u0439, \u0425\u0430\u0431\u0440! \u0412\u043e\u0442 \u0443\u0436\u0435 \u0431\u043e\u043b\u0435\u0435 3-\u0445 \u043b\u0435\u0442 \u044f \u043f\u0440\u0435\u043f\u043e\u0434\u0430\u044e SQL \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u0442\u0440\u0435\u043d\u0438\u043d\u0433 \u0446\u0435\u043d\u0442\u0440\u0430\u0445, \u0438 \u043e\u0434\u043d\u0438\u043c \u0438\u0437 \u043c\u043e\u0438\u0445 \u043d\u0430\u0431\u043b\u044e\u0434\u0435\u043d\u0438\u0439 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u043e, \u0447\u0442\u043e \u0441\u0442\u0443\u0434\u0435\u043d\u0442\u044b \u043e\u0441\u0432\u0430\u0438\u0432\u0430\u044e\u0442 \u0438 \u043f\u043e\u043d\u0438\u043c\u0430\u044e\u0442 SQL \u043b\u0443\u0447\u0448\u0435, \u0435\u0441\u043b\u0438 \u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043f\u0435\u0440\u0435\u0434 \u043d\u0438\u043c\u0438 \u0437\u0430\u0434\u0430\u0447\u0443, \u0430 \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/pt\/blog\/news\/sql-zanimatelnye-zadachki\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"pt_PT\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47SQL. \u0417\u0430\u043d\u0438\u043c\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0437\u0430\u0434\u0430\u0447\u043a\u0438 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0417\u0434\u0440\u0430\u0432\u0441\u0442\u0432\u0443\u0439, \u0425\u0430\u0431\u0440! \u0412\u043e\u0442 \u0443\u0436\u0435 \u0431\u043e\u043b\u0435\u0435 3-\u0445 \u043b\u0435\u0442 \u044f \u043f\u0440\u0435\u043f\u043e\u0434\u0430\u044e SQL \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u0442\u0440\u0435\u043d\u0438\u043d\u0433 \u0446\u0435\u043d\u0442\u0440\u0430\u0445, \u0438 \u043e\u0434\u043d\u0438\u043c \u0438\u0437 \u043c\u043e\u0438\u0445 \u043d\u0430\u0431\u043b\u044e\u0434\u0435\u043d\u0438\u0439 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u043e, \u0447\u0442\u043e \u0441\u0442\u0443\u0434\u0435\u043d\u0442\u044b \u043e\u0441\u0432\u0430\u0438\u0432\u0430\u044e\u0442 \u0438 \u043f\u043e\u043d\u0438\u043c\u0430\u044e\u0442 SQL \u043b\u0443\u0447\u0448\u0435, \u0435\u0441\u043b\u0438 \u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043f\u0435\u0440\u0435\u0434 \u043d\u0438\u043c\u0438 \u0437\u0430\u0434\u0430\u0447\u0443, \u0430 \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/pt\/blog\/news\/sql-zanimatelnye-zadachki\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-10-31T19:13:01+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T19:13:01+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47SQL. Problemas interessantes | ProHoster","description":"Ol\u00e1, Habr! J\u00e1 faz mais de 3 anos que ensino SQL em diferentes centros de treinamento, e uma das minhas observa\u00e7\u00f5es \u00e9 que os alunos aprendem e compreendem SQL melhor quando enfrentam um desafio, em vez de apenas.","canonical_url":"https:\/\/prohoster.info\/pt\/blog\/news\/sql-zanimatelnye-zadachki","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"pt_PT","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47SQL. \u0417\u0430\u043d\u0438\u043c\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0437\u0430\u0434\u0430\u0447\u043a\u0438 | ProHoster","og:description":"\u0417\u0434\u0440\u0430\u0432\u0441\u0442\u0432\u0443\u0439, \u0425\u0430\u0431\u0440! \u0412\u043e\u0442 \u0443\u0436\u0435 \u0431\u043e\u043b\u0435\u0435 3-\u0445 \u043b\u0435\u0442 \u044f \u043f\u0440\u0435\u043f\u043e\u0434\u0430\u044e SQL \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u0442\u0440\u0435\u043d\u0438\u043d\u0433 \u0446\u0435\u043d\u0442\u0440\u0430\u0445, \u0438 \u043e\u0434\u043d\u0438\u043c \u0438\u0437 \u043c\u043e\u0438\u0445 \u043d\u0430\u0431\u043b\u044e\u0434\u0435\u043d\u0438\u0439 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u043e, \u0447\u0442\u043e \u0441\u0442\u0443\u0434\u0435\u043d\u0442\u044b \u043e\u0441\u0432\u0430\u0438\u0432\u0430\u044e\u0442 \u0438 \u043f\u043e\u043d\u0438\u043c\u0430\u044e\u0442 SQL \u043b\u0443\u0447\u0448\u0435, \u0435\u0441\u043b\u0438 \u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043f\u0435\u0440\u0435\u0434 \u043d\u0438\u043c\u0438 \u0437\u0430\u0434\u0430\u0447\u0443, \u0430 \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e.","og:url":"https:\/\/prohoster.info\/pt\/blog\/news\/sql-zanimatelnye-zadachki","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-10-31T19:13:01+00:00","article:modified_time":"2019-10-31T19:13:01+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"36671","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-22 04:21:19","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 01:40:23","updated":"2026-01-22 04:21:19","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts\/36671","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/comments?post=36671"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts\/36671\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/media\/27465"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/media?parent=36671"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/categories?post=36671"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/tags?post=36671"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}