<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Profissionais TI - Pra quem respira informação &#187; join</title>
	<atom:link href="http://www.profissionaisti.com.br/tag/join/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.profissionaisti.com.br</link>
	<description>Pra quem respira informação</description>
	<lastBuildDate>Mon, 06 Sep 2010 13:44:28 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Entendendo Outer Joins SQL &#8211; Parte 3 (Conexões Externas LEFT, RIGHT JOIN)</title>
		<link>http://www.profissionaisti.com.br/2009/06/entendendo-outer-joins-sql-parte-3-conexoes-externas-left-right-join/</link>
		<comments>http://www.profissionaisti.com.br/2009/06/entendendo-outer-joins-sql-parte-3-conexoes-externas-left-right-join/#comments</comments>
		<pubDate>Wed, 24 Jun 2009 09:00:41 +0000</pubDate>
		<dc:creator>Paulinha Winter</dc:creator>
				<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[cross-join]]></category>
		<category><![CDATA[inner-join]]></category>
		<category><![CDATA[join]]></category>
		<category><![CDATA[left-join]]></category>
		<category><![CDATA[natural-join]]></category>
		<category><![CDATA[outer-join]]></category>
		<category><![CDATA[right-join]]></category>
		<category><![CDATA[SQL]]></category>

		<guid isPermaLink="false">http://www.profissionaisti.com.br/?p=2932</guid>
		<description><![CDATA[3 &#8211; Conexões Externas
As conexões externas servem para efetuar junções entre tabelas sem que necessariamente exista entre elas uma combinação exata. O LEFT e o RIGHT OUTER JOIN são os componentes desse tipo de conexão. Não é obrigado o uso do termo OUTER, se você encontrar apenas LEFT JOIN, por exemplo, funcionará da mesma maneira.
O [...]]]></description>
			<content:encoded><![CDATA[<p><strong>3 &#8211; Conexões Externas</strong></p>
<p>As conexões externas servem para efetuar junções entre tabelas sem que necessariamente exista entre elas uma combinação exata. O <strong>LEFT</strong> e o <strong>RIGHT OUTER JOIN</strong> são os componentes desse tipo de conexão. Não é obrigado o uso do termo OUTER, se você encontrar apenas LEFT JOIN, por exemplo, funcionará da mesma maneira.</p>
<p>O OUTER JOIN pode ser utilizado quando você quiser retornar uma lista de todos os programadores, mesmo que estes não estejam relacionados a nenhuma linguagem de programação. A diferença do LEFT para o RIGHT está apenas na identificação de qual tabela da junção irá retornar todos os dados. O mais comum é o LEFT, pois normalmente colocamos a tabela mais importante primeiro. Inclusive a ordem das tabelas e das cláusulas de restrições na consulta, em alguns bancos, altera o desempenho.</p>
<p><strong>Obs.:</strong> O modelo de dados utilizado neste post encontra-se em <a title="Produto Cartesiano" href="http://www.profissionaisti.com.br/2009/06/entendendo-outer-joins-sql-parte-1-produto-cartesiano" target="_blank">Entendendo Outer Joins SQL &#8211; Parte 1 (Produto Cartesiano)</a></p>
<p>No exemplo abaixo quero uma lista com todos os programadores e suas empresas independente se eles estão relacionados a uma empresa ou não.</p>
<p><span style="color: #0000ff;">SELECT</span> * <span style="color: #0000ff;">FROM</span> programadores p <span style="color: #0000ff;">LEFT JOIN</span> empresas e <span style="color: #0000ff;">ON</span> e.id_empresa = p.id_empresa;</p>
<p>Já neste exemplo, eu quero a lista de todas as empresas e seus programadores, independente se a empresa tem ou não programadores.</p>
<p><span style="color: #0000ff;">SELECT</span> * <span style="color: #0000ff;">FROM</span> programadores p <span style="color: #0000ff;">RIGHT JOIN</span> empresas e <span style="color: #0000ff;">ON</span> e.id_empresa = p.id_empresa;</p>
<p>O banco vai relacionar cada linha de uma tabela com todas as linhas da outra tabela, trazendo as linhas que atendem a comparação existente na consulta (ON) e para as empresas que não tem nem um programador ele irá preencher com NULL os campos, como é o caso da “Empresa 5”.</p>
<p align="center"><img class="aligncenter size-full wp-image-152" src="http://www.paulinhawinter.com/wp-content/uploads/2009/04/right.jpg" alt="right" width="394" height="157" /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.profissionaisti.com.br/2009/06/entendendo-outer-joins-sql-parte-3-conexoes-externas-left-right-join/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Entendendo Outer Joins SQL &#8211; Parte 2 (Conexões Internas &#8211; INNER JOIN)</title>
		<link>http://www.profissionaisti.com.br/2009/06/entendendo-outer-joins-sql-parte-2-conexoes-internas-inner-join/</link>
		<comments>http://www.profissionaisti.com.br/2009/06/entendendo-outer-joins-sql-parte-2-conexoes-internas-inner-join/#comments</comments>
		<pubDate>Tue, 23 Jun 2009 09:00:47 +0000</pubDate>
		<dc:creator>Paulinha Winter</dc:creator>
				<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[cross-join]]></category>
		<category><![CDATA[inner-join]]></category>
		<category><![CDATA[join]]></category>
		<category><![CDATA[left-join]]></category>
		<category><![CDATA[natural-join]]></category>
		<category><![CDATA[outer-join]]></category>
		<category><![CDATA[right-join]]></category>
		<category><![CDATA[SQL]]></category>

		<guid isPermaLink="false">http://www.profissionaisti.com.br/?p=2939</guid>
		<description><![CDATA[2 &#8211; Conexões Internas
A conexão interna inicialmente faz a mesma coisa que a conexão cruzada, porém aplica restrições que podem ser de igualdade ou desigualdade, isso faz com que algumas linhas sejam eliminadas do resultado.
Vamos lá então, quem faz parte das conexões internas? INNER JOIN, NATURAL JOIN e STRAIGHT_JOIN.
Obs.: O modelo de dados utilizado neste [...]]]></description>
			<content:encoded><![CDATA[<p><strong>2 &#8211; Conexões Internas</strong></p>
<p>A conexão interna inicialmente faz a mesma coisa que a <a title="Produto Cartesiano" href="http://www.profissionaisti.com.br/2009/06/entendendo-outer-joins-sql-parte-1-produto-cartesiano" target="_blank">conexão cruzada</a>, porém aplica restrições que podem ser de igualdade ou desigualdade, isso faz com que algumas linhas sejam eliminadas do resultado.</p>
<p><strong>Vamos lá então, quem faz parte das conexões internas?</strong> INNER JOIN, NATURAL JOIN e STRAIGHT_JOIN.</p>
<p><strong>Obs.:</strong> O modelo de dados utilizado neste post encontra-se em <a title="Produto Cartesiano" href="http://www.profissionaisti.com.br/2009/06/entendendo-outer-joins-sql-parte-1-produto-cartesiano" target="_blank">Entendendo Outer Joins SQL &#8211; Parte 1 (Produto Cartesiano)</a></p>
<p>Digamos que eu necessite fazer uma busca de todos os programadores e suas respectivas empresas, como resolvo?</p>
<p><span style="color: #0000ff;">SELECT</span> * <span style="color: #0000ff;">FROM</span> programadores p <span style="color: #0000ff;">INNER JOIN</span> empresas e <span style="color: #0000ff;">ON</span> e.id_empresa = p.id_empresa;</p>
<p>Na consulta acima, fiz uma junção entre as duas tabelas que guardam as informações que preciso e fiz uma restrição (ON) comparando a chave da empresa existente nas duas tabelas.</p>
<p>A figura abaixo mostra o comportamento do banco, o qual relaciona cada linha de uma tabela com todos os registros da outra tabela, trazendo como resultado somente as linhas onde a chave da empresa é idêntica (linhas em vermelho).</p>
<p style="text-align: center;" align="center"><img class="aligncenter size-full wp-image-156" src="http://www.paulinhawinter.com/wp-content/uploads/2009/04/inner_comofunciona.jpg" alt="inner_comofunciona" width="391" height="594" /></p>
<p>Essa restrição (ON) não impede que eu utilize as outras opções da sintaxe do SELECT, por exemplo, o WHERE. Inclusive eu obteria o mesmo resultado com a consulta abaixo:</p>
<p><span style="color: #0000ff;">SELECT</span> * <span style="color: #0000ff;">FROM</span> programadores p, empresas e <span style="color: #0000ff;">WHERE</span> e.id_empresa = p.id_empresa;</p>
<p>Vamos para uma segunda situação, na qual preciso de uma lista com todos os programadores que programam em pelo menos uma linguagem e saber quais são estas. Como mostra o modelo, temos um relacionamento n:m que originou a tabela programadores_linguagens, como resolvo?</p>
<p><span style="color: #0000ff;">SELECT</span> p.nome, l.nome<br />
<span style="color: #0000ff;">FROM</span> programadores p<span style="color: #0000ff;"><br />
INNER JOIN</span> programadores_linguagens pl<br />
<span style="color: #0000ff;">ON</span> pl.id_programador = p.id_programador<br />
<span style="color: #0000ff;">INNER JOIN</span> linguagens l <span style="color: #0000ff;"><br />
ON</span> l.id_linguagens = pl.id_linguagens;</p>
<p style="text-align: center;" align="center"><img class="aligncenter size-full wp-image-155" src="http://www.paulinhawinter.com/wp-content/uploads/2009/04/inner2.jpg" alt="inner2" width="131" height="147" /></p>
<p>Repare que os programadores Pinter e Gabriel não apareceram no resultado da consulta, isso porque ambos não estão relacionados à nenhuma linguagem de programação. Mas, e se fosse necessário a presença deles na listagem? Você resolveria utilizando conexões externas (item 3).</p>
<p>O NATURAL JOIN e o STRAIGHT_JOIN fazem exatamente a mesma coisa que o INNER JOIN em questão de resultado, porém com suas particularidades:</p>
<p><strong>NATURAL JOIN:</strong> com ele você não precisa identificar quais colunas serão comparadas, pois ele fará a comparação entre campos com mesmo nome.</p>
<p><span style="color: #0000ff;">SELECT</span> * <span style="color: #0000ff;">FROM</span> programadores <span style="color: #0000ff;">NATURAL JOIN</span> empresas;</p>
<p><strong>STRAIGHT_JOIN:</strong> faz com que a tabela a esquerda seja lida primeiro, isso é utilizado quando o otimizador do JOIN coloca as tabelas em ordem errada. Isto é muito pouco utilizado.</p>
<p><span style="color: #0000ff;">SELECT</span> * <span style="color: #0000ff;">FROM</span> programadores p <span style="color: #0000ff;">STRAIGHT_JOIN</span> empresas e <span style="color: #0000ff;">ON</span> e.id_empresa = p.id_empresa;</p>
<p><strong>Obs.:<br />
1</strong><strong> –</strong> Posso substituir o <strong>ON</strong> por <strong>USING</strong> quando o nome nas duas tabelas for idêntico.</p>
<p>Ex.: <span style="color: #0000ff;">SELECT</span> * <span style="color: #0000ff;">FROM</span> programadores p <span style="color: #0000ff;">INNER JOIN</span> empresas e <span style="color: #0000ff;">USING</span>(id_empresa);</p>
<p><strong>2 –</strong> O uso do <strong>INNER</strong> é opcional.</p>
<p>Ex.: <span style="color: #0000ff;">SELECT</span> * <span style="color: #0000ff;">FROM</span> programadores p <span style="color: #0000ff;">JOIN</span> empresas e <span style="color: #0000ff;">USING</span> (id_empresa);</p>
]]></content:encoded>
			<wfw:commentRss>http://www.profissionaisti.com.br/2009/06/entendendo-outer-joins-sql-parte-2-conexoes-internas-inner-join/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Entendendo Outer Joins SQL &#8211; Parte 1 (Produto Cartesiano)</title>
		<link>http://www.profissionaisti.com.br/2009/06/entendendo-outer-joins-sql-parte-1-produto-cartesiano/</link>
		<comments>http://www.profissionaisti.com.br/2009/06/entendendo-outer-joins-sql-parte-1-produto-cartesiano/#comments</comments>
		<pubDate>Mon, 22 Jun 2009 09:00:01 +0000</pubDate>
		<dc:creator>Paulinha Winter</dc:creator>
				<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[cross-join]]></category>
		<category><![CDATA[inner-join]]></category>
		<category><![CDATA[join]]></category>
		<category><![CDATA[left-join]]></category>
		<category><![CDATA[outer-join]]></category>
		<category><![CDATA[produto-cartesiano]]></category>
		<category><![CDATA[right-join]]></category>
		<category><![CDATA[SQL]]></category>

		<guid isPermaLink="false">http://www.profissionaisti.com.br/?p=2943</guid>
		<description><![CDATA[Participo de algumas listas de discussão sobre PHP e percebi  que muitos desenvolvedores têm dúvidas a respeito de comandos SQL, não sabem ou  não utilizam de forma correta os outer joins.
Por isso, decidi fazer um post sobre esse assunto explicando  como utilizar o left outer join, right  outer join, natural join, [...]]]></description>
			<content:encoded><![CDATA[<p>Participo de algumas listas de discussão sobre PHP e percebi  que muitos desenvolvedores têm dúvidas a respeito de comandos SQL, não sabem ou  não utilizam de forma correta os outer joins.</p>
<p>Por isso, decidi fazer um post sobre esse assunto explicando  como utilizar o<em> left outer join, right  outer join, natural join, cross join ou inner join</em> (mais utilizado).</p>
<p><strong>Para que servem os  outer joins?</strong></p>
<p><strong></strong>Servem para fazer as junções entre duas ou mais tabelas,  cruzando informações, combinando registros, testando desigualdades.</p>
<p><strong>Por que cruzar dados?</strong></p>
<p><strong></strong>Quando pensamos em armazenamento de dados, não podemos sair criando tabelas  sem uma avaliação e sem a criação de um modelo ER (Entidade Relacionamento), e  uma das vantagens de pensar no modelo é evitar a repetição de dados. E como  fazer isso? Distribuindo-os em mais de uma tabela de forma que possamos  categorizar as repetições.</p>
<p>Se você olhar o modelo abaixo, existe uma tabela de programadores  e uma de empresas, note que as duas estão relacionadas. Guardo na tabela programadores  somente um código que identifica a empresa em que o programador trabalha. Fiz  isso em virtude da possibilidade de ter vários programadores relacionados a  mesma empresa, assim evito ter que escrever várias vezes o nome da empresa  (texto ocupa mais espaço que número) e evito que a mesma empresa seja escrita  de maneiras diferentes, dificultando assim, por exemplo, uma busca. Porém,  agora para recuperar esses dados será necessário utilizar junções.</p>
<p align="center"><img class="aligncenter size-full wp-image-158" src="http://www.paulinhawinter.com/wp-content/uploads/2009/04/modelo.jpg" alt="modelo" width="432" height="211" /></p>
<table border="0" cellspacing="4" cellpadding="4" width="400" align="center">
<tbody>
<tr>
<td align="right" valign="top">
<div><img class="aligncenter size-full wp-image-154" src="http://www.paulinhawinter.com/wp-content/uploads/2009/04/empresas.jpg" alt="empresas" width="224" height="140" /></div>
</td>
<td align="left" valign="top">
<div>
<div>
<div><img class="aligncenter size-full wp-image-160" src="http://www.paulinhawinter.com/wp-content/uploads/2009/04/programadores_linguagens.jpg" alt="programadores_linguagens" width="201" height="154" /></div>
</div>
</div>
</td>
</tr>
<tr>
<td align="right" valign="top">
<div><img class="aligncenter size-full wp-image-159" src="http://www.paulinhawinter.com/wp-content/uploads/2009/04/programador.jpg" alt="programador" width="227" height="154" /></div>
</td>
<td style="text-align: left;" align="left" valign="top"><img class="aligncenter size-full wp-image-157" src="http://www.paulinhawinter.com/wp-content/uploads/2009/04/linguagens.jpg" alt="linguagens" width="147" height="151" /></td>
</tr>
</tbody>
</table>
<p><strong>Cruzando Dados</strong></p>
<p><strong>1 &#8211; Produto Cartesiano</strong></p>
<p>Esse não é bem um tipo de junção, é  conhecido como conexão cruzada, ou seja, resulta no cruzamento de cada linha de  uma tabela com todas as linhas de outra tabela.</p>
<p><span style="color: #0000ff;">SELECT</span> p.nome, l.nome <span style="color: #0000ff;">FROM</span> programadores p <span style="color: #0000ff;">CROSS  JOIN</span> linguagens l;</p>
<p align="center"><img class="aligncenter size-full wp-image-153" src="http://www.paulinhawinter.com/wp-content/uploads/2009/04/cross.jpg" alt="cross" width="237" height="151" /></p>
<p>O resultado desta consulta gera 36  linhas de combinações. Obs.: Esse tipo de junção não é muito utilizado.</p>
<p>Para obter o mesmo resultado  podemos utilizar outras duas sintaxes: retirar o CROSS JOIN e inserir uma vírgula  (,) ou usar o INNER JOIN sem a condição de comparação (ON). O resultado será o  mesmo.</p>
<p><span style="color: #0000ff;">SELECT</span> p.nome, l.nome <span style="color: #0000ff;">FROM</span> programadores p, linguagens l;</p>
<p><span style="color: #0000ff;">SELECT</span> p.nome, l.nome <span style="color: #0000ff;">FROM</span> programadores p <span style="color: #0000ff;">INNER  JOIN</span> linguagens l;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.profissionaisti.com.br/2009/06/entendendo-outer-joins-sql-parte-1-produto-cartesiano/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
	</channel>
</rss>
