{"id":1,"date":"2026-04-29T16:42:59","date_gmt":"2026-04-29T16:42:59","guid":{"rendered":"https:\/\/piotrswitlicki.pl\/?p=1"},"modified":"2026-05-07T10:54:58","modified_gmt":"2026-05-07T10:54:58","slug":"wybierz-sql-join-kompletny-przewodnik-inner-left-right-full-i-wiecej-sql-join-kompletny-przewodnik-inner-left-right-full-i-wiecej","status":"publish","type":"post","link":"https:\/\/piotrswitlicki.pl\/pl\/2026\/04\/29\/wybierz-sql-join-kompletny-przewodnik-inner-left-right-full-i-wiecej-sql-join-kompletny-przewodnik-inner-left-right-full-i-wiecej\/","title":{"rendered":"SQL JOIN \u2014 kompletny przewodnik (INNER, LEFT, RIGHT, FULL i wi\u0119cej)"},"content":{"rendered":"<h3 class=\"wp-block-heading\">SQL JOIN \u2014 kompletny przewodnik<\/h3>\n\n<p>JOINy s\u0142u\u017c\u0105 do \u0142\u0105czenia danych z wielu tabel. Poni\u017cej znajdziesz najwa\u017cniejsze typy JOIN wraz z przyk\u0142adami i wizualizacj\u0105.<\/p>\n\n<p>Za\u0142\u00f3\u017cmy dwie tabele:<\/p>\n\n<ul class=\"wp-block-list\">\n<li><code>users<\/code><\/li>\n\n\n\n<li><code>orders<\/code><\/li>\n<\/ul>\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n<h1 class=\"wp-block-heading\">\ud83d\udd39 1. INNER JOIN<\/h1>\n\n<p>Zwraca tylko wsp\u00f3lne dane.<\/p>\n\n<pre class=\"wp-block-code\"><code>users     orders<br><br>  A         A<br>  B         B<br>  C<br><br>Result:<br>  A<br>  B<\/code><\/pre>\n\n<pre class=\"wp-block-code\"><code>SELECT *<br>FROM users<br>INNER JOIN orders ON users.id = orders.user_id;<\/code><\/pre>\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n<h1 class=\"wp-block-heading\">\ud83d\udd39 2. LEFT JOIN<\/h1>\n\n<p>Wszystko z lewej + dopasowania z prawej.<\/p>\n\n<pre class=\"wp-block-code\"><code>users     orders<br><br>  A         A<br>  B         B<br>  C<br><br>Result:<br>  A<br>  B<br>  C (NULL)<\/code><\/pre>\n\n<pre class=\"wp-block-code\"><code>SELECT *<br>FROM users<br>LEFT JOIN orders ON users.id = orders.user_id;<\/code><\/pre>\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n<h1 class=\"wp-block-heading\">\ud83d\udd39 3. RIGHT JOIN<\/h1>\n\n<p>Wszystko z prawej + dopasowania z lewej.<\/p>\n\n<pre class=\"wp-block-code\"><code>users     orders<br><br>  A         A<br>  B         B<br>            D<br><br>Result:<br>  A<br>  B<br>  D (NULL)<\/code><\/pre>\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n<h1 class=\"wp-block-heading\">\ud83d\udd39 4. FULL OUTER JOIN<\/h1>\n\n<p>Wszystko z obu tabel.<\/p>\n\n<pre class=\"wp-block-code\"><code>users     orders<br><br>  A         A<br>  B         B<br>  C         D<br><br>Result:<br>  A<br>  B<br>  C (NULL)<br>  D (NULL)<\/code><\/pre>\n\n<pre class=\"wp-block-code\"><code>SELECT *<br>FROM users<br>FULL OUTER JOIN orders ON users.id = orders.user_id;<\/code><\/pre>\n\n<p>\ud83d\udc49 MySQL: trzeba robi\u0107 UNION<\/p>\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n<h1 class=\"wp-block-heading\">\ud83d\udd39 5. CROSS JOIN<\/h1>\n\n<p>Ka\u017cdy z ka\u017cdym (iloczyn kartezja\u0144ski).<\/p>\n\n<pre class=\"wp-block-code\"><code>users: A, B<br>orders: X, Y<br><br>Result:<br>A-X<br>A-Y<br>B-X<br>B-Y<\/code><\/pre>\n\n<pre class=\"wp-block-code\"><code>SELECT *<br>FROM users<br>CROSS JOIN orders;<\/code><\/pre>\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n<h1 class=\"wp-block-heading\">\ud83d\udd39 6. SELF JOIN<\/h1>\n\n<p>Tabela \u0142\u0105czy si\u0119 sama ze sob\u0105.<\/p>\n\n<pre class=\"wp-block-code\"><code>SELECT a.name, b.name<br>FROM users a<br>JOIN users b ON a.manager_id = b.id;<\/code><\/pre>\n\n<p>\ud83d\udc49 u\u017cywane np. w hierarchiach<\/p>\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n<h1 class=\"wp-block-heading\">\ud83d\udd39 7. LEFT JOIN + WHERE NULL (ANTI JOIN)<\/h1>\n\n<p>Zwraca rekordy bez dopasowania.<\/p>\n\n<pre class=\"wp-block-code\"><code>users     orders<br><br>  A         A<br>  B<br>  C<br><br>Result:<br>  B<br>  C<\/code><\/pre>\n\n<pre class=\"wp-block-code\"><code>SELECT users.*<br>FROM users<br>LEFT JOIN orders ON users.id = orders.user_id<br>WHERE orders.id IS NULL;<\/code><\/pre>\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n<h1 class=\"wp-block-heading\">\ud83d\udd39 8. INNER JOIN z dodatkowymi warunkami<\/h1>\n\n<p>JOIN + filtr logiczny.<\/p>\n\n<pre class=\"wp-block-code\"><code>SELECT *<br>FROM users<br>JOIN orders <br>  ON users.id = orders.user_id<br> AND orders.status = 'paid';<\/code><\/pre>\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n<h1 class=\"wp-block-heading\">\ud83d\udd39 9. UNION jako alternatywa FULL JOIN<\/h1>\n\n<p>(MySQL workaround)<\/p>\n\n<pre class=\"wp-block-code\"><code>SELECT * FROM users<br>LEFT JOIN orders ON users.id = orders.user_id<br><br>UNION<br><br>SELECT * FROM users<br>RIGHT JOIN orders ON users.id = orders.user_id;<\/code><\/pre>\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n<h1 class=\"wp-block-heading\">\ud83d\udd25 Podsumowanie (wa\u017cne w praktyce)<\/h1>\n\n<ul class=\"wp-block-list\">\n<li>INNER JOIN \u2192 najcz\u0119\u015bciej u\u017cywany<\/li>\n\n\n\n<li>LEFT JOIN \u2192 backend standard<\/li>\n\n\n\n<li>RIGHT JOIN \u2192 rzadko potrzebny<\/li>\n\n\n\n<li>FULL JOIN \u2192 raporty \/ analizy<\/li>\n\n\n\n<li>CROSS JOIN \u2192 prawie nigdy w produkcji<\/li>\n\n\n\n<li>SELF JOIN \u2192 relacje hierarchiczne<\/li>\n\n\n\n<li>ANTI JOIN \u2192 bardzo przydatny (np. brakuj\u0105ce dane)<\/li>\n<\/ul>\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n<h1 class=\"wp-block-heading\">\ud83d\udca1 Bonus (Laravel)<\/h1>\n\n<p>W Laravelu INNER JOIN to:<\/p>\n\n<pre class=\"wp-block-code\"><code>User::join('orders', 'users.id', '=', 'orders.user_id')-&gt;get();<\/code><\/pre>\n\n<p>ale cz\u0119sto lepiej u\u017cywa\u0107:<\/p>\n\n<p>eager loading (<code>with()<\/code>)<\/p>\n\n<p>relacji Eloquent<br><br>LEFT JOIN:<br>User::leftJoin(&#8216;orders&#8217;, &#8216;users.id&#8217;, &#8216;=&#8217;, &#8216;orders.user_id&#8217;)->get();<br><br>RIGHT JOIN<br>User::rightJoin(&#8216;orders&#8217;, &#8216;users.id&#8217;, &#8216;=&#8217;, &#8216;orders.user_id&#8217;)->get();<br><br>\u26a0\ufe0f Wa\u017cna rzecz (Laravel mindset)<\/p>\n\n<p>To nie jest \u201eEloquent w pe\u0142ni\u201d, tylko:<\/p>\n\n<p>\ud83d\udc49 <strong>Query Builder przez Eloquent<\/strong><\/p>\n\n<p>Bo:<\/p>\n\n<ul class=\"wp-block-list\">\n<li>tracisz relacje (<code>hasMany<\/code>, <code>belongsTo<\/code>)<\/li>\n\n\n\n<li>tracisz modele w czystej formie<\/li>\n\n\n\n<li>dostajesz bardziej \u201eSQL-like\u201d wynik<\/li>\n<\/ul>\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n<h1 class=\"wp-block-heading\">\ud83e\udde0 Lepsze podej\u015bcie w Laravel (cz\u0119sto)<\/h1>\n\n<p>Zamiast JOIN:<\/p>\n\n<p>User::with(&#8216;orders&#8217;)-&gt;get();<\/p>","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"pagelayer_contact_templates":[],"_pagelayer_content":"","footnotes":""},"categories":[1],"tags":[],"class_list":["post-1","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"acf":[],"_links":{"self":[{"href":"https:\/\/piotrswitlicki.pl\/pl\/wp-json\/wp\/v2\/posts\/1","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/piotrswitlicki.pl\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/piotrswitlicki.pl\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/piotrswitlicki.pl\/pl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/piotrswitlicki.pl\/pl\/wp-json\/wp\/v2\/comments?post=1"}],"version-history":[{"count":4,"href":"https:\/\/piotrswitlicki.pl\/pl\/wp-json\/wp\/v2\/posts\/1\/revisions"}],"predecessor-version":[{"id":331,"href":"https:\/\/piotrswitlicki.pl\/pl\/wp-json\/wp\/v2\/posts\/1\/revisions\/331"}],"wp:attachment":[{"href":"https:\/\/piotrswitlicki.pl\/pl\/wp-json\/wp\/v2\/media?parent=1"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/piotrswitlicki.pl\/pl\/wp-json\/wp\/v2\/categories?post=1"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/piotrswitlicki.pl\/pl\/wp-json\/wp\/v2\/tags?post=1"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}