SQL Joins

natural Join не дуже добре працює і не рекомендується його використовувати.  

Приклад: 

SELECT * FROM albums NATURAL JOIN artists; 

Об'єднає дві таблиці за спільною колонкою. 

LEFT JOIN -  по лівій таблиці знаходить співпадіння у правій 

SELECT Title, Name FROM albums LEFT JOIN artists ON albums.artistId = artists.artistId; 

обєднає дві таблиці по artistId, оскільки джоін по лівій часині то КОЖНОМУ значенню з лівої БУДЕ ЗНАЙДЕНО співпадіння або null.  Якщо при обєднанні по стовчику , як в прикладі вище назви стовпчиків ОДНАКОВІ в обох таблицях то замість ON albums.artistId = artists.artistId можна писати USING(ArtistId)

INNER JOIN - працює так само але знаходить лише ті співставлення в яких немає null. Тобто кожному значенюю з лівої таблиці ОБОВЯЗКОВО буде співставлення, або воно буде відкинуто якщо співствалення немає. 

SELECT Title, Name FROM albums INNER JOIN artists ON albums.artistId = artists.artistId;

CROSS JOIN - кожному значенню з лівої таблиці буде співставленно ВСІ значенн з правої.  

Умовно, якщо є таблиця з одним стовпчиком products і значеннями А, B, C і таблиця з стовпчиком Date і списком дат, то для A буде повний список дат, для B і для С 

SELECT * FROM products CROSS JOIN calendars;

JOIN можна робити в 3 і більше таблиць також, наприклад: 

SELECT  
trackid,  
tracks.name AS Track,  
albums.title AS Album,  
artists.name AS Artist  
FROM tracks  
INNER JOIN albums ON albums.albumid = tracks.albumid  
INNER JOIN artists ON artists.artistid = albums.artistid
SELECT
users.name as 'User name',
users.email as 'User email',
CONCAT(IFNULL(books.name, ''), IFNULL(pages.name, ''), IFNULL(chapters.name, ''), IFNULL(bookshelves.name, '')) as 'Resource Name',
views.viewable_type 'Resource type',
views.views as 'View count',
views.updated_at as 'Last visited'
FROM views 
LEFT JOIN users on views.user_id = users.id 
LEFT JOIN books on books.id = views.viewable_id and views.viewable_type = 'book' 
LEFT JOIN pages on pages.id = views.viewable_id and views.viewable_type = 'page' 
LEFT JOIN chapters on chapters.id = views.viewable_id and views.viewable_type = 'chapter'
LEFT JOIN bookshelves on bookshelves.id = views.viewable_id and views.viewable_type = 'bookshelf'
WHERE views.updated_at > DATE_SUB(NOW(), INTERVAL 24 HOUR)
ORDER BY views.updated_at DESC;