Skip to content

SQL-liitokset selitettynä

SQL:n JOIN-tyypit vertailtuna: inner, outer, cross, self, lateral, natural — mitä kukin palauttaa ja yksirivinen esimerkki.

Liitokset yhdistävät kahden taulun rivit yhteisen avaimen perusteella. Liitostyyppi määrää, mitkä rivit säilyvät, kun avaimet täsmäävät, puuttuvat tai toistuvat.

Viitetaulukko · 8 merkintää
8 of 8 rows
Inner ja outer
Vain rivit, joissa ON-ehto täsmää molemmissa tauluissa. Täsmäämättömät rivit jäävät pois molemmilta puolilta.SELECT u.name, o.total FROM users u INNER JOIN orders o ON u.id = o.user_id;
Kaikki vasemman taulun rivit. Oikean taulun sarakkeet ovat NULL, jos vastaavuutta ei ole.SELECT u.name, o.total FROM users u LEFT OUTER JOIN orders o ON u.id = o.user_id;
Kaikki oikean taulun rivit. Vasemman taulun sarakkeet ovat NULL, jos vastaavuutta ei ole.SELECT u.name, o.total FROM users u RIGHT OUTER JOIN orders o ON u.id = o.user_id;
Kaikki molempien taulujen rivit. Täsmäämättömät puolet täytetään arvolla NULL.SELECT u.name, o.total FROM users u FULL OUTER JOIN orders o ON u.id = o.user_id;
Cross ja self
Karteesinen tulo. Jokainen vasemman taulun rivi yhdistetään jokaiseen oikean taulun riviin. Ei ON-ehtoa.SELECT u.name, o.total FROM users u CROSS JOIN orders o;
Taulu liitetään itseensä aliasnimien avulla. Vertaa rivejä yhden taulun sisällä.SELECT a.id AS o1, b.id AS o2 FROM orders a JOIN orders b ON a.user_id = b.user_id WHERE a.id < b.id;
Edistyneet
FROM-osassa oleva alikysely, joka suoritetaan jokaista ulkoista riviä kohden. Alikysely voi viitata ulkoisen taulun sarakkeisiin.SELECT u.name, o.total FROM users u, LATERAL (SELECT total FROM orders WHERE user_id = u.id LIMIT 1) o;
Liittää sarakkeisiin, joilla on sama nimi. Ei ON-ehtoa. Varo tahattomia avainten törmäyksiä.SELECT u.name, o.total FROM users u NATURAL JOIN orders o;