Когато работите с вашата база данни, може да се наложи да съберете данни от няколко различни таблици. Тази статия ще ви покаже как.
Вече писах за SQL присъединяванията тук и тук, но нека отделим малко време, за да прегледаме първо как работи едно обединяване и по-специално синтаксиса, специфичен за MySQL.
Изявление за присъединяване към SQL
Присъединяването е изявление, което ви позволява да съберете две таблици, да съпоставите редове, които са свързани един с друг, и да запазите само редовете, които могат да бъдат съпоставени, без да запазвате несдвоени редове.
SELECT * FROM table1
INNER JOIN table2
ON table1.id = table2.id;
SELECT ... FROM
оператор показва коя е първата таблица, след което името на втората таблица се изписва точно след INNER JOIN
ключови думи.
Как трябва да бъдат обединени двете таблици е написано в ON
изявление. В този случай двете таблици се обединяват с помощта на връзката table1.id = table2.id
.
Възможно е да се използват няколко оператора за свързване заедно, за да се присъединят повече от една таблица едновременно.
SELECT *
FROM table1
INNER JOIN table2
ON table1.id = table2.id
INNER JOIN table3
ON table2.id = table3.id;
За да направите това, добавяте второ INNER JOIN
изявление и втори ON
оператор, за да посочи третата таблица и втората връзка.
Нека поговорим за момент за връзките, които можете да имате между таблиците и защо може да искате да обедините три таблици заедно.
Връзки между таблици в SQL
Когато имате таблици, които са свързани помежду си, техните връзки могат да бъдат от различни типове.
един към много
При отношение един към много, един ред от първата таблица може да бъде свързан с множество редове на втората таблица.
В релационна база данни това може да бъде реализирано с втората таблица с first_table_id
колона, която казва към кой ред от първата таблица е свързан този ред.
много към едно
При отношение много към едно, един ред от първата таблица може да бъде свързан с един единствен ред от втората таблица, а един ред от втората таблица може да бъде свързан с множество редове на първата таблица.
В релационна база данни това може да бъде реализирано с първата таблица с second_table_id
колона, която казва към кой ред от втората таблица е свързан този ред.
много към много
В този случай множество редове са свързани с множество редове.
Този вид връзка не може да бъде представена както при SQL таблиците – трябва да добавите таблица за свързване между двете таблици, така че между таблиците да присъстват само връзки много към едно и едно към много.
Всеки ред на таблицата в средата представлява една връзка между редовете на лявата таблица и и редовете на дясната таблица.
На практика в MySQL тази средна таблица ще има колона за first_table_id
и колона за second_table_id
, като всяка комбинация е уникална.
Присъединяване към SQL таблици на практика
Нека си представим, че имаме база данни на организация, където имаме таблица с екипи (името им и друга информация за идентифициране) и таблица с проекти (име, напредък и т.н.).
id | име_на_отбор | специалност |
---|---|---|
1 | Хвърчалки на банани | Банани |
2 | Гризачи за дърво | Гризане на дърво |
3 | Розовите слонове | Тъпчене на земята |
4 | Пухкави картофи | Работа и спане |
id | име_на_проект | напредък |
---|---|---|
1 | Изграждане на язовир | Необходими са още малко гризане на дърва и тъпчене на земята |
2 | Бананова торта | Някой изяжда всички банани |
3 | Изследване на съня | Прекалено много сън, недостатъчно изследвания |
Тъй като един екип може да работи по множество проекти и по един проект може да се работи от множество екипи, има и трета таблица, която следи съвпаденията на екип-проект.
project_id | идентификатор_на_група |
---|---|
1 | 2 |
1 | 3 |
2 | 1 |
3 | 1 |
3 | 2 |
3 | 3 |
3 | 4 |
Можем да използваме JOIN
изявление, за да съберем всичко заедно, когато трябва да прегледаме информацията от таблиците по четим от човека начин, като този:
SELECT
teams.team_name AS team_name,
projects.project_name AS project_name
FROM TABLE teams
INNER JOIN matches
ON teams.id = matches.team_id
INNER JOIN matches
ON matches.project_id = projects.id
ORDER BY teams.id;
Избираме кои колони да се показват от всяка таблица с SELECT
изявление.
Указваме как редовете на таблиците трябва да се комбинират с ON
изявление.
И подреждаме редовете по начина, който предпочитаме с ORDER BY
изявление.
ON
изявления teams.id = matches.team_id
и matches.projects_id = projects.id
означава, че редовете се комбинират с помощта на редовете на matches
маса. Всеки ред от изходната таблица има името на проекта и името на екипа, комбинирани с помощта на двойките идентификатор на проекта и идентификатор на екип в matches
таблица.
Изходната таблица ще изглежда по-долу.
Име_на_отбор | Име_на_проект |
---|---|
Хвърчалки на банани | Бананова торта |
Хвърчалки на банани | Изследване на съня |
Гризачи за дърво | Изграждане на язовир |
Гризачи за дърво | Изследване на съня |
Розовите слонове | Сграда на язовир |
Розовите слонове | Сграда на язовир |
Пухкави картофи | Изследване на съня |
Няма колона директно от matches
маса. matches
таблицата не се показва в изхода, но се използва като инструкции за това как да комбинирате редовете на teams
и projects
таблици.
Заключение
JOIN
оператор ви позволява да обедините една или повече таблици. Трябва да се използва заедно с ON
оператор за определяне на връзката между редовете на таблица и редовете на различна таблица.
В тази статия научихте как да използвате JOIN
изявление за обединяване на три различни таблици.