Mysql
 sql >> база данни >  >> RDS >> Mysql

Производителност на MySQL:Въведение в JOIN в SQL

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

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

Типове JOIN

Има четири основни типа JOIN:ВЪТРЕШНО, ВЪНШНО, ЛЯВО и ДЯСНО. Когато свързват две таблици, всяка от тях ще върне различно подмножество от съответните таблици въз основа на условието в клаузата ON.

  • LEFT и RIGHT JOIN изпълняват подобна задача. И двете връщат цялата една таблица с информация, която е свързана с втората таблица.
  • INNER и OUTER JOIN изпълняват много различни задачи. INNER JOIN дава много ограничен резултат, докато OUTER връща пълен набор от данни.
Забележка:Към момента на писане на тази статия MariaDB и MySQL не поддържат OUTER JOIN. Ние обаче ще предоставим пример за начин за производство на този изход по различен начин.

В този пример използваме примера на отдел продажби за този урок, използващ три таблици:продавачи, поръчки и клиенти.

Таблицата на продавачите ще има три колони:идентификатор, име и комисионна.

След това таблицата с поръчки ще съдържа четири колони:идентификационният номер на поръчката, общата цена на поръчката, клиентът и, ако е наличен, продавачът.

Таблицата с клиенти ще съдържа две колони:идентификатор и основна информация за контакт.

И така, сега имаме множество таблици с информация, които са полезни за различни хора по различни начини. Използвайки тези три таблици (продавачи, поръчки и клиент), ще предоставим примери за това как всяко от JOIN може да бъде полезно.

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

Вероятно най-често използваният тип JOIN е LEFT JOIN. Ако мислите, че двете таблици са обединени, споменатата в клаузата FROM е отляво. Посоченият в клаузата JOIN е вдясно. При LEFT JOIN всеки ред от таблицата LEFT (или FROM) се връща в резултата и се свързва със съответните редове от таблицата RIGHT (или JOIN), която съответства на клаузата ON.

Имайте предвид, че някои редове от ЛЯВО може да нямат съвпадащи данни от ДЯСНО. В този случай полетата, които биха били попълнени от ДЯСНАТА таблица в резултата, ще бъдат попълнени със стойност NULL.

Също така, ако множество редове в ДЯСНАТА таблица съвпадат с редовете от ЛЯВАТА таблица, тогава множество редове ще бъдат включени в набора от резултати. Диаграма на Venn показва как би изглеждало визуализирано LEFT JOIN:

Маркетинговият директор ви иска отчет за всички поръчки, разбити по клиенти. Можете да използвате LEFT JOIN за това:

SELECT *
FROM orders
LEFT JOIN customer
ON orders.customer_id = customer.id;

Тази заявка изисква всички данни в таблицата „поръчки“, свързани с редовете в таблицата „клиент“, където идентификаторът на клиента е равен на customer_id в поръчката. Резултатът ще изглежда така:

Забележете, че за клиента на Widgets LLC има три записа, защото са имали три поръчки. Jolly Inc. направи две поръчки, а Acme Inc направи една. Cheapo не се показва в този списък, защото не са направени поръчки.

ДЯСНО ПРИСЪЕДИНЕНЕ

RIGHT JOIN е много подобен на LEFT JOIN, с изключение на това, че връща всеки ред от таблицата RIGHT (JOIN) и само съответните редове от таблицата LEFT (FROM). Отново, ако няма данни в таблицата LEFT, тогава тези колони ще бъдат попълнени с NULL стойности.

Ако има няколко реда в таблицата ЛЯВА, тогава в резултатния набор ще има няколко реда. Диаграмата на Вен би изглеждала така:

Ако ръководството иска отчет с ВСЕКИ клиент; дори и да не са направили поръчка, бихме могли да използваме ПРАВО ПРИСЪЕДИНЯВАНЕ.

SELECT *
FROM orders
RIGHT JOIN customer
ON orders.customer_id = customer.id;

Отново започваме с таблицата „поръчки“ и я ПРИСЪЕДИНЯВАЙТЕ към таблицата на клиентите. Тъй като използвахме RIGHT JOIN, ще получим поне един ред за всеки запис в RIGHT (JOIN) таблица, клиент. Когато има съвпадение между customer.id и orders.customer_id, тогава информацията се попълва.  Резултатите включват Cheapo Co със стойности NULL в колоните за поръчка:

INNER JOIN

INNER JOIN връща само редовете от всяка колона, които съответстват на клаузата ON. Ако няма съвпадение в ДЯСНО, тогава редовете от ЛЯВО се изключват и обратно. Диаграмата на Venn за INNER JOIN изглежда така:

Това е ден на заплата и отделът за заплати трябва да знае колко комисионна да изплати. За това те ще трябва да знаят поръчките, направени чрез всеки продавач. Имайте предвид, че не всички поръчки са преминали през продавач, така че ние не се интересуваме от тях. За това можем да използваме INNER JOIN:

SELECT *,cost * commission_rate / 100 AS commission_amount
FROM orders
INNER JOIN salespeople
ON orders.salesperson_id = salespeople.id;

Отново започваме с таблицата за поръчки. Този път се присъединяваме към масата на продавачите. Ако има запис в таблицата с поръчки, който съвпада с запис в таблицата на продавачите, тогава редът ще бъде включен. Вместо да се попълват несъвпадащи редове със стойности NULL, тези редове се игнорират в резултатите.

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

ВЪНШНО ПРИСЪЕДИНЕНИЕ

OUTER JOIN връща всичко, независимо дали има съвпадение. Ако трябваше да комбинирате резултатите от ЛЯВО и ДЯСНО ПРИСЪЕДИНЯВАНЕ, ще получите OUTER JOIN. Диаграмата на Venn за OUTER JOIN изглежда така:

Сега е краят на месеца и мениджърът по продажбите иска да знае ВСИЧКИ продажби, както и всички изплатени комисионни. За това ще използваме OUTER JOIN:

SELECT *,cost * commission_rate / 100 AS commission_amount
FROM orders
FULL OUTER JOIN salespeople
ON orders.salesperson_id = salespeople.id;

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

Сега не забравяйте, че казахме, че MariaDB и MySQL не поддържат OUTER JOIN. Също така казахме, че ако добавите ЛЯВО ПРИСЪЕДИНЕНИЕ към ДЯСНО ПРИСЪЕДИНЕНИЕ, ще получите OUTER JOIN. Номерът в тези две системи е да направите точно това. Ние постигаме това с клаузата UNION. Той добавя резултатите от една заявка към друга:

SELECT *,cost * commission_rate / 100 AS commission_amount
FROM orders
LEFT JOIN salespeople
ON orders.salesperson_id = salespeople.id
UNION
SELECT *,cost * commission_rate / 100 AS commission_amount
FROM orders
RIGHT JOIN salespeople
ON orders.salesperson_id = salespeople.id;

Резултатите биха изглеждали така:

МНОЖЕСТВО СЪЕДИНЕНИЯ

JOIN също ви позволява да свържете повече от две маси. Ако искаме пълен отчет за продажбите с информация за клиентите и продавачите, просто правим още едно ПРИСЪЕДИНЕНИЕ в края.

SELECT *
FROM orders
LEFT JOIN salespeople
ON orders.salesperson_id = salespeople.id
LEFT JOIN customer
ON customer.id = orders.customer_id;

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

Тази статия е кратко въведение и не е предназначена да бъде изчерпателна дискусия за това как JOIN може да се използва в SQL.

Щракнете по-долу, за да използвате този удобен талон днес!

Liquid Web разполага с едни от най-мощните сървъри за бази данни в индустрията. Тези сървъри могат да се използват за управление на най-малкия домашен бизнес до най-големите клъстери с множество бази данни за корпоративни корпорации.

Обадете ни се на 800.580.4985 или отворете чат или билет с нас, за да говорите с някой от нашите опитни решения или съветници за хостинг, за да научите как можете да се възползвате от тези техники днес!

Навигация по серии<<Предишна статия

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. INSERT ... ПРИ АКТУАЛИЗИРАНЕ НА ДУБЛИРАН КЛЮЧ с КЪДЕ?

  2. Как да разрешите отказан достъп за потребителя ‘root’@’localhost’ (използвайки парола:Да) Когато свържете MySQL база данни

  3. Как да преномерирате първичния индекс

  4. Как да синхронизирам база данни SQLite на телефон с Android с база данни MySQL на сървъра?

  5. Урок за MySQL – Конфигуриране и управление на SSL на вашия MySQL сървър