{"id":1002,"date":"2026-06-09T18:20:26","date_gmt":"2026-06-09T21:20:26","guid":{"rendered":"https:\/\/jrtx.com.br\/blog\/2026\/06\/09\/aula-12-subqueries-consultas-aninhadas-e-correlacionadas\/"},"modified":"2026-06-09T18:20:26","modified_gmt":"2026-06-09T21:20:26","slug":"aula-12-subqueries-consultas-aninhadas-e-correlacionadas","status":"publish","type":"post","link":"https:\/\/jrtx.com.br\/blog\/2026\/06\/09\/aula-12-subqueries-consultas-aninhadas-e-correlacionadas\/","title":{"rendered":"Aula 12: Subqueries \u2014 consultas aninhadas e correlacionadas"},"content":{"rendered":"<p>Nesta Aula 12 do curso &#8220;MySQL \u2014 Do Zero ao Avan\u00e7ado&#8221;, vamos nos aprofundar no tema das <strong>Subqueries<\/strong>, tamb\u00e9m conhecidas como consultas aninhadas. Este \u00e9 um t\u00f3pico valioso para quem deseja realizar consultas complexas no MySQL, aproveitando o poder dos dados relacionais ao m\u00e1ximo. As subqueries permitem extrair dados de maneiras que apenas opera\u00e7\u00f5es mais b\u00e1sicas n\u00e3o permitiriam, tornando-se uma ferramenta indispens\u00e1vel para analistas e desenvolvedores.<\/p>\n<p>Voc\u00ea aprender\u00e1 a diferenciar entre subqueries simples e correlacionadas, entender\u00e1 quando e como utiliz\u00e1-las, e ver\u00e1 exemplos pr\u00e1ticos de implementa\u00e7\u00e3o. Ao final desta aula, voc\u00ea estar\u00e1 habilitado a criar consultas avan\u00e7adas, capaz de analisar dados de forma otimizada e eficiente. A import\u00e2ncia disso reside na capacidade de responder a quest\u00f5es complexas de neg\u00f3cios e tecnologia, diretamente do banco de dados.<\/p>\n<p>Antes de come\u00e7armos, \u00e9 importante ter em mente os pr\u00e9-requisitos. As aulas anteriores forneceram uma base s\u00f3lida em consultas b\u00e1sicas e intermedi\u00e1rias no MySQL, que ser\u00e3o fundamentais para o entendimento pleno desta aula. Garanta que seu ambiente MySQL esteja configurado corretamente, pois executaremos exemplos que exigem funcionalidade total do banco de dados.<\/p>\n<h3>O que voc\u00ea vai aprender nesta aula<\/h3>\n<ul>\n<li>O que s\u00e3o subqueries e como funcionam no MySQL<\/li>\n<li>Diferenciar subqueries simples de subqueries correlacionadas<\/li>\n<li>Implementar subqueries em consultas complexas<\/li>\n<li>Testar e verificar o comportamento das subqueries<\/li>\n<li>Solucionar erros comuns ao trabalhar com subqueries<\/li>\n<\/ul>\n<h3>Pr\u00e9-requisitos e Ambiente<\/h3>\n<p>Para seguir esta aula, voc\u00ea deve ter o MySQL instalado e configurado em seu sistema. Certifique-se de estar usando uma vers\u00e3o compat\u00edvel com os exemplos fornecidos (pelo menos MySQL 5.7). Voc\u00ea tamb\u00e9m deve ter acesso de administrador ao banco de dados para criar e manipular tabelas. Se voc\u00ea estiver em um ambiente corporativo, verifique se tem as permiss\u00f5es necess\u00e1rias.<\/p>\n<h3>O que s\u00e3o Subqueries?<\/h3>\n<p>Subqueries, ou consultas aninhadas, s\u00e3o consultas SQL inseridas dentro de outra consulta SQL. Elas s\u00e3o usadas para retornar dados que ser\u00e3o utilizados pela consulta principal como uma condi\u00e7\u00e3o para filtrar, combinar ou agregar dados de tabelas. Essa funcionalidade \u00e9 extremamente poderosa, pois permite um n\u00edvel avan\u00e7ado de customiza\u00e7\u00e3o e an\u00e1lise dos dados.<\/p>\n<p>Em nossos projetos na JRT Technology Solutions, subqueries s\u00e3o frequentemente utilizadas para atender demandas complexas de extra\u00e7\u00e3o de dados sem a necessidade de processamento adicional em outras camadas da aplica\u00e7\u00e3o.<\/p>\n<h3>Tipos de Subqueries<\/h3>\n<p>Subqueries podem ser divididas em dois tipos principais: subqueries simples e subqueries correlacionadas.<\/p>\n<ul>\n<li><strong>Subqueries Simples:<\/strong> Executadas de maneira independente. Ap\u00f3s executadas, seus resultados s\u00e3o passados para a consulta externa. Por exemplo, podemos buscar um conjunto de IDs em uma tabela e us\u00e1-los para filtrar outra tabela.<\/li>\n<li><strong>Subqueries Correlacionadas:<\/strong> Dependem de dados de uma ou mais tabelas da consulta externa. Elas s\u00e3o executadas repetidamente, uma vez para cada linha da tabela pai. Essa t\u00e9cnica \u00e9 poderosa, mas pode ser menos eficiente em termos de desempenho.<\/li>\n<\/ul>\n<h3>Passo a Passo \u2014 Criando e Usando Subqueries<\/h3>\n<p>Vamos agora criar uma s\u00e9rie de subqueries para entender seu comportamento e aplica\u00e7\u00e3o pr\u00e1tica. Este exemplo usar\u00e1 duas tabelas simples, <em>employees<\/em> e <em>departments<\/em>, que voc\u00ea deve ter acesso no seu ambiente MySQL.<\/p>\n<ol>\n<li>Primeiro, vamos criar uma base simples de dados para os exemplos.<\/li>\n<pre><code>\n  CREATE TABLE departments (\n      department_id INT PRIMARY KEY,\n      name VARCHAR(50)\n  );\n\n  CREATE TABLE employees (\n      employee_id INT PRIMARY KEY,\n      name VARCHAR(50),\n      department_id INT,\n      salary DECIMAL(10, 2),\n      FOREIGN KEY (department_id) REFERENCES departments(department_id)\n  );\n  <\/code><\/pre>\n<li>Insira alguns registros em ambas as tabelas.<\/li>\n<pre><code>\n  INSERT INTO departments VALUES (1, 'Engineering'), (2, 'HR'), (3, 'Marketing');\n  INSERT INTO employees VALUES (1, 'Alice', 1, 70000), (2, 'Bob', 1, 80000), (3, 'Charlie', 2, 40000), (4, 'Diana', 3, 45000);\n  <\/code><\/pre>\n<li>Agora, execute uma subquery simples. Queremos encontrar o nome de todos os departamentos que t\u00eam pelo menos um funcion\u00e1rio com sal\u00e1rio acima de 75000.<\/li>\n<pre><code>\n  SELECT name FROM departments WHERE department_id IN (\n      SELECT department_id FROM employees WHERE salary > 75000\n  );\n  <\/code><\/pre>\n<\/ol>\n<pre><code class=\"output\">\n+-------------+\n| name        |\n+-------------+\n| Engineering |\n+-------------+\n<\/code><\/pre>\n<h3>Configura\u00e7\u00e3o Detalhada \u2014 Parametrizando Consultas<\/h3>\n<p>Ao trabalhar com subqueries, \u00e9 comum ajust\u00e1-las para que aceitem par\u00e2metros din\u00e2micos, tornando suas consultas mais eficientes e personaliz\u00e1veis. Abaixo, oferece-se um exemplo de como isso pode ser realizado adicionando uma cl\u00e1usula de par\u00e2metro ao exemplo anterior.<\/p>\n<pre><code>\nSELECT name FROM departments WHERE department_id IN (\n    SELECT department_id FROM employees WHERE salary > ?\n);\n<\/code><\/pre>\n<p>Neste caso, o ponto de interroga\u00e7\u00e3o <strong>(?)<\/strong> representa um par\u00e2metro que pode ser substitu\u00eddo por um valor espec\u00edfico durante a execu\u00e7\u00e3o da consulta. Isso \u00e9 amplamente utilizado em aplica\u00e7\u00f5es que executam SQL din\u00e2mico via linguagens de programa\u00e7\u00e3o.<\/p>\n<h3>Verificando a Instala\u00e7\u00e3o \/ Testando a Configura\u00e7\u00e3o<\/h3>\n<p>Ap\u00f3s implementar suas consultas com subqueries, \u00e9 essencial verificar que as mesmas foram configuradas e est\u00e3o funcionando corretamente.<\/p>\n<pre><code>\nEXPLAIN SELECT name FROM departments WHERE department_id IN (\n    SELECT department_id FROM employees WHERE salary > 75000\n);\n<\/code><\/pre>\n<pre><code class=\"output\">\n+----+--------------------+------------+-------+---------------+---------+---------+-------+------+-------------+\n| id | select_type        | table      | type  | possible_keys | key     | key_len | ref   | rows | Extra       |\n+----+--------------------+------------+-------+---------------+---------+---------+-------+------+-------------+\n|  1 | PRIMARY            | departments| ALL   | NULL          | NULL    | NULL    | NULL  |    3 | Using where |\n|  2 | DEPENDENT SUBQUERY | employees  | index | NULL          | dept_id | 4       | NULL  |    4 | Using where |\n+----+--------------------+------------+-------+---------------+---------+---------+-------+------+-------------+\n<\/code><\/pre>\n<h3>Erros Comuns e Como Resolver<\/h3>\n<ul>\n<li><strong>Erro: Subquery returns more than 1 row:<\/strong> Isso acontece quando a subquery est\u00e1 fornecendo mais de um resultado para um contexto que s\u00f3 aceita um. Usar &#8220;<em>IN<\/em>&#8221; ao inv\u00e9s de &#8220;=&#8221; \u00e9 uma solu\u00e7\u00e3o comum.<\/li>\n<li><strong>Erro: Unknown column in &#8216;where clause&#8217;:<\/strong> Normalmente indicado por uma column_name na subquery que n\u00e3o \u00e9 vis\u00edvel no contexto pretendido. Certifique-se de que todas as colunas referenciadas existam e sejam alcan\u00e7\u00e1veis pelas subqueries.<\/li>\n<li><strong>Erro de desempenho:<\/strong> Subqueries correlacionadas podem ser lentas em conjunto com grandes volumes de dados. Preste aten\u00e7\u00e3o \u00e0 otimiza\u00e7\u00e3o do \u00edndice e considere reescrever a consulta para modos mais eficientes.<\/li>\n<li><strong>Erro de sintaxe:<\/strong> Muito comum com par\u00eanteses e clausulas de subqueries. Verifique o SQL para garantir que cada abertura de par\u00eanteses tenha um fechamento correspondente.<\/li>\n<\/ul>\n<h3>Boas Pr\u00e1ticas e Dicas Avan\u00e7adas<\/h3>\n<p>Subqueries podem ser ferramentas poderosas, mas \u00e9 crucial us\u00e1-las de maneira otimizada. Algumas dicas incluem o uso de \u00edndices apropriados para acelerar subqueries correlacionadas, evitar subqueries aninhadas excessivamente profundas que podem impactar o desempenho, e utilizar <em>JOINs<\/em> quando a situa\u00e7\u00e3o permitir, pois eles podem \u00e0s vezes substituir subqueries de forma mais eficiente.<\/p>\n<p>Em nossos projetos na JRT Technology Solutions, asseguramos que consultas com subqueries sejam revisadas para efici\u00eancia, garantindo que estamos obtendo dados de forma r\u00e1pida e eficaz sem sobrecarregar o servidor de banco de dados.<\/p>\n<h3>Resumo da Aula 12<\/h3>\n<p>Nesta aula, aprendemos sobre a aplica\u00e7\u00e3o de <strong>Subqueries<\/strong> no MySQL, explorando desde conceitos b\u00e1sicos at\u00e9 consultas mais avan\u00e7adas. Compreendemos quando utilizar subqueries simples e correlacionadas, como parametrizar consultas para maior flexibilidade e resolvemos erros comuns que surgem neste contexto. Aumentamos significativamente nossa capacidade de executar consultas complexas e realizar an\u00e1lises de dados precisas e otimizadas. Na pr\u00f3xima aula, continuaremos a avan\u00e7ar em opera\u00e7\u00f5es SQL, explorando t\u00f3picos de otimiza\u00e7\u00e3o de consulta e uso de \u00edndices.<\/p>\n<p>Junte-se a n\u00f3s na pr\u00f3xima aula e continue se desenvolvendo e se aperfei\u00e7oando em MySQL, sempre com o suporte e expertise da JRT Technology Solutions.<\/p>\n<div style=\"margin:52px 0 40px;padding:36px 28px;background:linear-gradient(135deg,#0f172a 0%,#1a2744 100%);border:2px solid #25D366;border-radius:18px;text-align:center;box-shadow:0 4px 28px rgba(37,211,102,0.18)\">\n<p style=\"margin:0 0 10px;font-size:18px;color:#ffffff;font-weight:700;line-height:1.4\">Quer aprender na pr\u00e1tica com especialistas?<\/p>\n<p style=\"margin:0 0 28px;font-size:15px;color:#94a3b8;font-weight:400;line-height:1.6\">A JRT Technology Solutions oferece treinamentos e implementa\u00e7\u00e3o de MySQL para equipes corporativas.<\/p>\n<p>  <a href=\"https:\/\/api.whatsapp.com\/send\/?phone=5521980606699&#038;text=Ol%C3%A1!%20Tenho%20interesse%20no%20treinamento%20de%20MySQL.&#038;type=phone_number&#038;app_absent=0\"\n     target=\"_blank\" rel=\"noopener noreferrer\"\n     style=\"display:inline-flex;align-items:center;gap:12px;background:#25D366;color:#ffffff;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;font-size:16px;font-weight:700;padding:15px 32px;border-radius:100px;text-decoration:none;box-shadow:0 4px 16px rgba(37,211,102,0.45);letter-spacing:0.01em\"><br \/>\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"#ffffff\"><path d=\"M17.472 14.382c-.297-.149-1.758-.867-2.03-.967-.273-.099-.471-.148-.67.15-.197.297-.767.966-.94 1.164-.173.199-.347.223-.644.075-.297-.15-1.255-.463-2.39-1.475-.883-.788-1.48-1.761-1.653-2.059-.173-.297-.018-.458.13-.606.134-.133.298-.347.446-.52.149-.174.198-.298.298-.497.099-.198.05-.371-.025-.52-.075-.149-.669-1.612-.916-2.207-.242-.579-.487-.5-.669-.51-.173-.008-.371-.01-.57-.01-.198 0-.52.074-.792.372-.272.297-1.04 1.016-1.04 2.479 0 1.462 1.065 2.875 1.213 3.074.149.198 2.096 3.2 5.077 4.487.709.306 1.262.489 1.694.625.712.227 1.36.195 1.871.118.571-.085 1.758-.719 2.006-1.413.248-.694.248-1.289.173-1.413-.074-.124-.272-.198-.57-.347m-5.421 7.403h-.004a9.87 9.87 0 01-5.031-1.378l-.361-.214-3.741.982.998-3.648-.235-.374a9.86 9.86 0 01-1.51-5.26c.001-5.45 4.436-9.884 9.888-9.884 2.64 0 5.122 1.03 6.988 2.898a9.825 9.825 0 012.893 6.994c-.003 5.45-4.437 9.884-9.885 9.884m8.413-18.297A11.815 11.815 0 0012.05 0C5.495 0 .16 5.335.157 11.892c0 2.096.547 4.142 1.588 5.945L.057 24l6.305-1.654a11.882 11.882 0 005.683 1.448h.005c6.554 0 11.89-5.335 11.893-11.893a11.821 11.821 0 00-3.48-8.413z\"\/><\/svg><br \/>\n    Falar no WhatsApp<br \/>\n  <\/a>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Domine subqueries em SQL: consultas aninhadas e correlacionadas. Aprenda na pr\u00e1tica com exemplos claros e diretos. Acesse a aula 12 agora!<\/p>\n","protected":false},"author":1,"featured_media":1001,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"iawp_total_views":1,"footnotes":""},"categories":[75],"tags":[1743,1741,1744,1742,1740],"class_list":["post-1002","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-devops","tag-banco-de-dados","tag-consultas-aninhadas","tag-otimizacao-de-queries","tag-subconsultas-correlacionadas","tag-subqueries-sql"],"_links":{"self":[{"href":"https:\/\/jrtx.com.br\/blog\/wp-json\/wp\/v2\/posts\/1002","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/jrtx.com.br\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/jrtx.com.br\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/jrtx.com.br\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/jrtx.com.br\/blog\/wp-json\/wp\/v2\/comments?post=1002"}],"version-history":[{"count":0,"href":"https:\/\/jrtx.com.br\/blog\/wp-json\/wp\/v2\/posts\/1002\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/jrtx.com.br\/blog\/wp-json\/wp\/v2\/media\/1001"}],"wp:attachment":[{"href":"https:\/\/jrtx.com.br\/blog\/wp-json\/wp\/v2\/media?parent=1002"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/jrtx.com.br\/blog\/wp-json\/wp\/v2\/categories?post=1002"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/jrtx.com.br\/blog\/wp-json\/wp\/v2\/tags?post=1002"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}