Едно от най-големите предимства на използването на релационни бази данни като MySQL е, че неговата релационна структура ви позволява лесно да съхранявате и заявявате информация в множество таблици.
Нека да проучим как да извлечете точно данните, които искате, от множество таблици на базата данни и различните налични обединения, които ви позволяват да извлечете точните резултати, които искате.
Инициализирайте примерна база данни
Това не се изисква, но ако искате да следвате заедно с примерите в тази статия, можете да инициализирате примерна база данни локално с командите по-долу на терминала:
git клонинг https://github.com/mdizak/sample-select-db.git
cd sample-select-db
sudo mysql sudo mysql sampledb
mysql> SELECT COUNT (*) ОТ клиенти;
Трябва да получите резултат, посочващ, че има 2000 реда в клиенти маса.
По подразбиране / ВЪТРЕШНО присъединяване
Присъединяването по подразбиране, използвано в рамките на MySQL бази данни се нарича INNER join и е най-често срещаният и прав напред. Това присъединяване връща всички записи, за които има съвпадащи записи и в двете таблици, и отхвърля всички останали записи.
Java предоставя JDBC като част от Java SDK. В тази статия нека да разгледаме подробностите за свързване към база данни на MySQL и извършване на заявки с нея.
Например, ако искате да видите собственото и фамилното име на клиента, плюс сумата и датата на поръчката за всички поръчки, по-големи от $ 1000, можете да използвате следния SQL израз:
ИЗБЕРЕТЕ
c.id, c.first_name, c.last_name, o.amount, o.created_at
ОТ
клиенти c, поръчки o
КЪДЕТО
o.customer_id = c.id И o.amount> = 1000;
Няколко бележки относно горната заявка:
- Избират се пет различни колони, три от таблицата с клиенти и две от таблицата с поръчки.
- В рамките на клаузата FROM двете таблици са дефинирани, но суфиксирани с буквите "c" и "o". Те просто посочват псевдоними в SQL, могат да бъдат всичко, което пожелаете, и се използват за съкращаване на SQL заявката.
- The o.customer_id = c.id е присъединителният аспект на заявката и осигурява правилна корелация между клиентите и поръчките.
По-различен и технически по-синтактично правилен начин за писане на една и съща заявка е по-долу:
ИЗБЕРЕТЕ
c.id, c.first_name, c.last_name, o.amount, o.created_at
ОТ
клиенти c INNER JOIN поръчки o
НА
customer_id = c.id
КЪДЕТО
o.сума> = 1000;
Горната заявка обикновено е малко по-лесна за четене, тъй като лесно можете да видите съединението между таблицата на клиентите и поръчките. За всички намерения обаче тези две заявки са еднакви и ще създадат абсолютно еднакви записи.
НАЛЯВО се присъединява
Лявите обединения ще върнат всички записи от лявата таблица, които също съвпадат със записи от дясната таблица, и ще отхвърлят всички останали записи. Например, може би искате да видите общия размер на продажбите за всеки продукт в базата данни, можете да опитате да използвате заявка като:
ИЗБЕРЕТЕ
p.name, сума (item.amount) КАТО tamount
ОТ
order_items артикул LEFT JOIN продукти стр
НА
item.product_id = p.id
ГРУПИРАЙТЕ по item.product_id ПОРЪЧАЙТЕ по тамонт DESC
Това води до хубав изглед в две колони, показващ името на продукта с общата сума на продажбите и работи както се очаква. Заявката премина през всички продукти в таблицата order_items, присъедини ги към записи в таблицата продукти и върна общата сума на продажбите на всеки.
НАДЯСНО се присъединява
Използвайки горния пример, обърнете внимание на факта, че горната заявка върна само 19 записа, докато в базата данни има общо 22 продукта. Това е така, защото заявката започна с таблицата order_items и вляво я присъедини към таблицата products и тъй като някои продукти никога не са били поръчвани, в рамките на елементи_за поръчки не съществуват записи за тези продукти маса.
Какво се случва, ако искате да получите списък на всички продукти със суми за продажби, включително продукти, които не са поръчани? Опитайте дясно присъединяване със следната заявка:
ИЗБЕРЕТЕ
p.name, сума (item.amount) КАТО tamount
ОТ
order_items артикул ПРАВО СЕ ПРИСЪЕДИНЕТЕ продукти p
НА
item.product_id = p.id
ГРУПИРАНЕ ПО p.id ПОРЪЧАЙТЕ по tamount DESC
Това е по-добре и заявката сега връща пълните 22 продукта, като три от тях имат количество нула. Това е така, защото вместо да се използват поръчките_и елементи като основна таблица, която се присъединява към таблицата продукти, дясното съединение обръща поръчката и присъединява таблицата продукти към таблицата поръчки_драве.
Множество присъединения в заявка
Понякога имате нужда да обедините три или повече таблици заедно, за да получите определен набор от резултати.
Например може би искате списък с всички клиенти, закупили микровълновата печка (идентификационен номер на продукта №1), включително тяхното име и дата на поръчката. Това изисква SELECT в три таблици, което може да се направи чрез използване на две съединения със следната заявка:
ИЗБЕРЕТЕ
c.first_name, c.last_name, o.amount, o.created_at
ОТ
клиенти c INNER JOIN поръчки o
НА
c.id = o.customer_id ВЪТРЕШНО ПРИСЪЕДИНЯВАНЕ елемент_за поръчки
НА
item.order_id = o.id
КЪДЕТО
item.product_id = 1 ПОРЪЧАЙТЕ О.created_at;
Тази заявка връща всички 426 поръчки на микровълновата печка и работи както се очаква. Първо съпоставя всички клиенти със съответните им поръчки, след това допълнителни заявки, които резултатът задава от съвпадение на всички поръчки само с тези в таблицата order_items, които съдържат микровълновия продукт (id # 1).
Никога не използвайте подзаявки с клаузи IN
Като бърза страница, на всяка цена винаги трябва да избягвате да използвате подзаявки в рамките на вашите SQL заявки като:
ИЗБЕРЕТЕ first_name, last_name ОТ клиенти WHERE id IN (ИЗБЕРЕТЕ client_id ОТ поръчки WHERE статус = 'одобрен' И сума <100);
Заявки като горепосочените са много неефективни, използват голям брой ресурси и трябва да се избягват, доколкото е възможно. Вместо това използвайте правилни съединения, както е посочено в горните раздели. Например, горната заявка трябва да бъде пренаписана като:
ИЗБЕРЕТЕ c.first_name, c.last_name ОТ клиенти c LEFT JOIN поръчки o ON o.customer_id = c.id КЪДЕ o.status = 'одобрен' И o.amount <100;
Спестете време със SQL присъединявания
Надяваме се, че тази статия ще ви покаже силата на релационните бази данни като MySQL и как да изградите SQL заявки които извличат записи от множество таблици в рамките на една заявка, използвайки обединения, което ви позволява да извлечете точните желани резултати.
Научихте три различни съединения в SQL, как да псевдоним на имена на колони и таблици, да използвате множество съединения в една заявка и защо трябва да избягвате подзаявки. Никога повече не се бъркайте, опитвайки се ръчно да компилирате различни набори от данни в един и започнете да използвате съединения, за да впечатлите колегите си по работа и да спестите време.
Google Docs вече е офис електроцентрала. С помощта на тези добавки можете да направите вашите Google Docs да изглеждат красиви и стилни.
- Програмиране
- SQL
- база данни
Абонирайте се за нашия бюлетин
Присъединете се към нашия бюлетин за технически съвети, рецензии, безплатни електронни книги и ексклузивни оферти!
Още една стъпка…!
Моля, потвърдете имейл адреса си в имейла, който току-що ви изпратихме.