Урок за присъединяване на MySQL: ВЪТРЕШЕН, ВЪНШЕН, НАЛЯВО, НАДЯСНО, КРЪСТ

Anonim

Какво представляват JOINS?

Обединенията помагат за извличане на данни от две или повече таблици на базата данни. Таблиците са взаимно свързани с помощта на първични и външни ключове.

Забележка: JOIN е най-неразбраната тема сред SQL обектите. За простота и лекота на разбиране ще използваме нова база данни за упражняване на извадка. Както е показано по-долу

документ за самоличност първо име фамилия movie_id
1 Адам Смит 1
2 Рави Кумар 2
3 Сюзън Дейвидсън 5
4 Джени Адриана 8
6 Лий Понг 10
документ за самоличност заглавие категория
1 КРЕД НА УБИЙЦА: ЕМБЕРИ Анимации
2 Истинска стомана (2012) Анимации
3 Алвин и Бурундуците Анимации
4 Приключенията на Tin Tin Анимации
5 Безопасно (2012) Действие
6 Безопасна къща (2012) Действие
7 GIA 18+
8 Краен срок 2009 18+
9 Мръсната картина 18+
10 Марли и аз Романтика

Видове съединения

КРЪСТ ПРИСЪЕДИНЕТЕ

Cross JOIN е най-простата форма на JOIN, която съвпада с всеки ред от една таблица на базата данни с всички редове на друга.

С други думи, той ни дава комбинации от всеки ред от първата таблица с всички записи във втората таблица.

Да предположим, че искаме да получим всички записи на членове спрямо всички записи на филми, можем да използваме скрипта, показан по-долу, за да получим желаните резултати.

SELECT * FROM `movies` CROSS JOIN `members`

Изпълнението на горния скрипт в MySQL workbench ни дава следните резултати.

 
id title id first_name last_name movie_id
1 ASSASSIN'S CREED: EMBERS Animations 1 Adam Smith 1
1 ASSASSIN'S CREED: EMBERS Animations 2 Ravi Kumar 2
1 ASSASSIN'S CREED: EMBERS Animations 3 Susan Davidson 5
1 ASSASSIN'S CREED: EMBERS Animations 4 Jenny Adrianna 8
1 ASSASSIN'S CREED: EMBERS Animations 6 Lee Pong 10
2 Real Steel(2012) Animations 1 Adam Smith 1
2 Real Steel(2012) Animations 2 Ravi Kumar 2
2 Real Steel(2012) Animations 3 Susan Davidson 5
2 Real Steel(2012) Animations 4 Jenny Adrianna 8
2 Real Steel(2012) Animations 6 Lee Pong 10
3 Alvin and the Chipmunks Animations 1 Adam Smith 1
3 Alvin and the Chipmunks Animations 2 Ravi Kumar 2
3 Alvin and the Chipmunks Animations 3 Susan Davidson 5
3 Alvin and the Chipmunks Animations 4 Jenny Adrianna 8
3 Alvin and the Chipmunks Animations 6 Lee Pong 10
4 The Adventures of Tin Tin Animations 1 Adam Smith 1
4 The Adventures of Tin Tin Animations 2 Ravi Kumar 2
4 The Adventures of Tin Tin Animations 3 Susan Davidson 5
4 The Adventures of Tin Tin Animations 4 Jenny Adrianna 8
4 The Adventures of Tin Tin Animations 6 Lee Pong 10
5 Safe (2012) Action 1 Adam Smith 1
5 Safe (2012) Action 2 Ravi Kumar 2
5 Safe (2012) Action 3 Susan Davidson 5
5 Safe (2012) Action 4 Jenny Adrianna 8
5 Safe (2012) Action 6 Lee Pong 10
6 Safe House(2012) Action 1 Adam Smith 1
6 Safe House(2012) Action 2 Ravi Kumar 2
6 Safe House(2012) Action 3 Susan Davidson 5
6 Safe House(2012) Action 4 Jenny Adrianna 8
6 Safe House(2012) Action 6 Lee Pong 10
7 GIA 18+ 1 Adam Smith 1
7 GIA 18+ 2 Ravi Kumar 2
7 GIA 18+ 3 Susan Davidson 5
7 GIA 18+ 4 Jenny Adrianna 8
7 GIA 18+ 6 Lee Pong 10
8 Deadline(2009) 18+ 1 Adam Smith 1
8 Deadline(2009) 18+ 2 Ravi Kumar 2
8 Deadline(2009) 18+ 3 Susan Davidson 5
8 Deadline(2009) 18+ 4 Jenny Adrianna 8
8 Deadline(2009) 18+ 6 Lee Pong 10
9 The Dirty Picture 18+ 1 Adam Smith 1
9 The Dirty Picture 18+ 2 Ravi Kumar 2
9 The Dirty Picture 18+ 3 Susan Davidson 5
9 The Dirty Picture 18+ 4 Jenny Adrianna 8
9 The Dirty Picture 18+ 6 Lee Pong 10
10 Marley and me Romance 1 Adam Smith 1
10 Marley and me Romance 2 Ravi Kumar 2
10 Marley and me Romance 3 Susan Davidson 5
10 Marley and me Romance 4 Jenny Adrianna 8
10 Marley and me Romance 6 Lee Pong 10

ВЪТРЕШНО ПРИСЪЕДИНЯВАНЕ

Вътрешният JOIN се използва за връщане на редове от двете таблици, които отговарят на даденото условие.

Да предположим, че искате да получите списък на членовете, които са наели филми, заедно със заглавия на филми, наети от тях. Можете просто да използвате INNER JOIN за това, което връща редове от двете таблици, които отговарят на дадените условия.

SELECT members.`first_name` , members.`last_name` , movies.`title`FROM members ,moviesWHERE movies.`id` = members.`movie_id`

Изпълнявайки горния скрипт give

 
first_name last_name title
Adam Smith ASSASSIN'S CREED: EMBERS
Ravi Kumar Real Steel(2012)
Susan Davidson Safe (2012)
Jenny Adrianna Deadline(2009)
Lee Pong Marley and me

Обърнете внимание, че горният скрипт за резултати също може да бъде написан по следния начин, за да се постигнат същите резултати.

SELECT A.`first_name` , A.`last_name` , B.`title`FROM `members`AS AINNER JOIN `movies` AS BON B.`id` = A.`movie_id`

Външни ПРИСЪЕДИНЕНИЯ

MySQL Outer JOINs връщат всички записи, съвпадащи от двете таблици.

Той може да открие записи, които нямат съвпадение в обединената таблица. Той връща NULL стойности за записи на обединена таблица, ако не е намерено съвпадение.

Звучи объркващо? Нека разгледаме един пример -

НАЛЯВО ПРИСЪЕДИНЯВАНЕ

Да предположим, че сега искате да получите заглавия на всички филми заедно с имена на членове, които са ги наели. Ясно е, че някои филми не са наемани от никой. Можем просто да използваме LEFT JOIN за целта.

LEFT JOIN връща всички редове от таблицата вляво, дори ако не са намерени съответстващи редове в таблицата отдясно. Когато в таблицата вдясно не са намерени съвпадения, се връща NULL.

SELECT A.`title` , B.`first_name` , B.`last_name`FROM `movies` AS ALEFT JOIN `members` AS BON B.`movie_id` = A.`id`

Изпълнението на горния скрипт в MySQL workbench дава. Можете да видите, че във върнатия резултат, който е изброен по-долу, че за филми, които не са наети, полетата с имена на членове имат NULL стойности. Това означава, че няма съответстващ член, който е намерил таблица с членове за този конкретен филм.

 
title first_name last_name
ASSASSIN'S CREED: EMBERS Adam Smith
Real Steel(2012) Ravi Kumar
Safe (2012) Susan Davidson
Deadline(2009) Jenny Adrianna
Marley and me Lee Pong
Alvin and the Chipmunks NULL NULL
The Adventures of Tin Tin NULL NULL
Safe House(2012) NULL NULL
GIA NULL NULL
The Dirty Picture NULL NULL
Note: Null is returned for non-matching rows on right

ПРАВИЛНО ПРИСЪЕДИНЯВАНЕ

НАДЯСНОТО ПРИСЪЕДИНЯВАНЕ очевидно е обратното на ЛЯВОТО ПРИСЪЕДИНЯВАНЕ. НАДЯСНОТО ПРИСЪЕДИНЯВАНЕ връща всички колони от таблицата вдясно, дори ако в таблицата отляво не са намерени съответстващи редове. Когато в таблицата вляво не са намерени съвпадения, се връща NULL.

В нашия пример, нека приемем, че трябва да получите имена на членове и филми, наети от тях. Сега имаме нов член, който все още не е наел нито един филм

SELECT A.`first_name` , A.`last_name`, B.`title`FROM `members` AS ARIGHT JOIN `movies` AS BON B.`id` = A.`movie_id`

Изпълнението на горния скрипт в MySQL workbench дава следните резултати.

 
first_name last_name title
Adam Smith ASSASSIN'S CREED: EMBERS
Ravi Kumar Real Steel(2012)
Susan Davidson Safe (2012)
Jenny Adrianna Deadline(2009)
Lee Pong Marley and me
NULL NULL Alvin and the Chipmunks
NULL NULL The Adventures of Tin Tin
NULL NULL Safe House(2012)
NULL NULL GIA
NULL NULL The Dirty Picture
Note: Null is returned for non-matching rows on left

Клаузи "ON" и "USING"

В горните примери за заявки JOIN използвахме клауза ON за съвпадение на записите между таблицата.

Клаузата USING също може да се използва за същата цел. Разликата с ИЗПОЛЗВАНЕ е, че трябва да има еднакви имена за съвпадащи колони в двете таблици.

Досега в таблицата „филми“ използвахме нейния първичен ключ с името „id“. Посочихме същото в таблицата "members" с името "movie_id".

Нека преименуваме полето "id" таблици "филми", за да има името "movie_id". Правим това, за да имаме идентични съвпадащи имена на полета.

ALTER TABLE `movies` CHANGE `id` `movie_id` INT( 11 ) NOT NULL AUTO_INCREMENT;

След това нека използваме USING с горния LEFT JOIN пример.

SELECT A.`title` , B.`first_name` , B.`last_name`FROM `movies` AS ALEFT JOIN `members` AS BUSING ( `movie_id` )

Освен да използвате ON и USING с JOINs, можете да използвате много други клаузи на MySQL като GROUP BY, WHERE и дори функции като SUM , AVG и др.

Защо трябва да използваме съединения?

Сега може би си мислите, защо използваме JOINs, когато можем да изпълним една и съща задача, изпълнявайки заявки. Особено ако имате известен опит в програмирането на бази данни, знаете, че можем да изпълняваме заявки една по една, използвайте изхода на всяка в последователни заявки. Разбира се, това е възможно. Но използвайки JOINs, можете да свършите работата, като използвате само една заявка с всякакви параметри на търсене. От друга страна MySQL може да постигне по-добра производителност с JOINs, тъй като може да използва индексиране. Просто използването на единична JOIN заявка, вместо да се изпълняват множество заявки, намалява режийните разходи на сървъра. Използването на множество заявки вместо това води до повече трансфери на данни между MySQL и приложения (софтуер). Освен това изисква повече манипулации с данни и в края на приложението.

Ясно е, че можем да постигнем по-добри MySQL и изпълнение на приложенията чрез използване на JOINs.

Обобщение

  • JOINS ни позволяват да комбинираме данни от повече от една таблица в един набор от резултати.
  • JOINS имат по-добра производителност в сравнение с подзаявките
  • INNER JOINS връща само редове, които отговарят на дадените критерии.
  • OUTER JOINS може също да върне редове, където не са намерени съвпадения. Ненадминатите редове се връщат с ключовата дума NULL.
  • Основните типове JOIN включват Inner, Left Outer, Right Outer, Cross JOINS и др.
  • Често използваната клауза в JOIN операции е "ON". Клаузата "USING" изисква съвпадащите колони да бъдат със същото име.
  • JOINS може да се използва и в други клаузи като GROUP BY, WHERE, SUB QUERIES, AGREGATE FUNCTIONS и др.