inner join vs outer join
Внутрішнє приєднання проти зовнішнього приєднання: приготуйтеся дослідити точні відмінності між внутрішнім та зовнішнім приєднанням
Перш ніж вивчати відмінності між Внутрішнім Приєднанням проти Зовнішнім Приєднанням, давайте спочатку подивимось, що таке SQL JOIN?
Речення об'єднання використовується для об'єднання записів або для маніпулювання записами з двох або більше таблиць через умову об'єднання. Умова приєднання вказує, як стовпці з кожної таблиці співпадають між собою.
Приєднання базується на пов'язаному стовпці між цими таблицями. Найпоширенішим прикладом є об'єднання двох таблиць через стовпець первинного ключа та стовпця зовнішнього ключа.
Припустимо, ми отримали таблицю, яка містить зарплату працівника, а є ще одна таблиця, яка містить дані про співробітників.
У цьому випадку буде спільний стовпець, такий як ідентифікатор працівника, який об’єднає ці дві таблиці. Цей стовпець ідентифікатора працівника буде первинним ключем таблиць даних про працівника та зовнішнім ключем у таблиці заробітної плати працівника.
Дуже важливо мати спільний ключ між двома суб’єктами. Ви можете сприймати таблицю як сутність, а ключ як загальний зв'язок між двома таблицями, який використовується для операції об'єднання.
найкраща програма для контролю температури комп'ютера
В основному, існує два типи об’єднання в SQL, тобто Внутрішнє приєднання та Зовнішнє приєднання . Зовнішнє з'єднання додатково поділяється на три типи, тобто Ліве зовнішнє приєднання, праве зовнішнє приєднання та повне зовнішнє приєднання.
У цій статті ми побачимо різницю між Внутрішнє приєднання та Зовнішнє приєднання детально. Ми будемо утримувати перехресні об’єднання та нерівні об’єднання поза рамками цієї статті.
Що ви дізнаєтесь:
- Що таке Внутрішнє приєднання?
- Що таке зовнішнє приєднання?
- Різниця між внутрішнім та зовнішнім з'єднанням
- Продуктивність
- MS Access Внутрішнє та Зовнішнє приєднання
- Ліве приєднання проти лівого зовнішнього приєднання
- Ліве зовнішнє приєднання проти правого зовнішнього приєднання
- Різниця між внутрішнім і зовнішнім об’єднанням у табличному форматі
- Внутрішнє та зовнішнє приєднання проти Союзу
- Висновок
- Рекомендована література
Що таке Внутрішнє приєднання?
Внутрішнє об’єднання повертає лише ті рядки, які мають відповідні значення в обох таблицях (тут ми розглядаємо об’єднання, яке виконується між двома таблицями).
Що таке зовнішнє приєднання?
Зовнішнє приєднання включає відповідні рядки, а також деякі невідповідні рядки між двома таблицями. Зовнішнє об’єднання в основному відрізняється від внутрішнього об’єднання тим, як воно обробляє умову хибного збігу.
Існує 3 типи Зовнішнього Приєднання:
- Зліва Зовнішнє приєднання : Повертає всі рядки з ЛІВОЇ таблиці та відповідні записи між обома таблицями.
- Правильне зовнішнє приєднання : Повертає всі рядки з таблиці ВПРАВО та відповідні записи між обома таблицями.
- Повне Зовнішнє Приєднання : Він поєднує в собі результат лівого зовнішнього з'єднання та правого зовнішнього з'єднання.
Різниця між внутрішнім та зовнішнім з'єднанням
(зображення джерело )
Як показано на наведеній вище схемі, є дві сутності, тобто таблиця 1 і таблиця 2, і обидві таблиці мають спільні дані.
Внутрішнє приєднання поверне загальну область між цими таблицями (зелена затінена область на діаграмі вище), тобто всі записи, спільні між таблицею 1 і таблицею 2.
Ліве зовнішнє приєднання поверне всі рядки з таблиці 1 і лише ті рядки з таблиці 2, які також є загальними для таблиці 1. Правильне Зовнішнє Приєднання зробить якраз навпаки. Він дасть всі записи з таблиці 2 і лише відповідні записи з таблиці 1.
Крім того, Повне Зовнішнє Приєднання надасть нам усі записи з таблиці 1 та таблиці 2.
Почнемо з прикладу, щоб пояснити це.
Припустимо, у нас є два таблиці: EmpDetails та EmpSalary .
Таблиця EmpDetails:
Ідентифікатор працівника | Ім'я працівника |
7 | Лілія |
1 | Джон |
два | Саманта |
3 | Жоден |
4 | Шовковистий |
5 | ОЗП |
6 | Арпіт |
8 | Сіта |
9 | Фара |
10 | Джеррі |
Таблиця зарплати Emp:
Ідентифікатор працівника | Ім'я працівника | Зарплата працівника |
---|---|---|
одинадцять | Роуз | 90000 |
1 | Джон | 50000 |
два | Саманта | 120000 |
3 | Жоден | 75000 |
4 | Шовковистий | 25000 |
5 | ОЗП | 150000 |
6 | Арпіт | 80000 |
12 | Сакші | 45000 |
13 | Джек | 250 000 |
Давайте зробимо Внутрішнє з’єднання за цими двома таблицями та спостерігаємо за результатами:
Запит:
SELECT EmpDetails. EmployeeID, EmpDetails. EmployeeName, EmpSalary. EmployeeSalary FROM EmpDetails INNER JOIN EmpSalary ON EmpDetails. EmployeeID = EmpSalary. EmployeeID;
Результат:
Ідентифікатор працівника | Ім'я працівника | Зарплата працівника |
---|---|---|
7 | Лілія | НУЛЬ |
1 | Джон | 50000 |
два | Саманта | 120000 |
3 | Жоден | 75000 |
4 | Шовковистий | 25000 |
5 | ОЗП | 150000 |
6 | Арпіт | 80000 |
У наведеному вище наборі результатів ви можете бачити, що Inner Join повернув перші 6 записів, які були присутні як в EmpDetails, так і в EmpSalary, маючи відповідний ключ, тобто EmployeeID. Отже, якщо A і B - дві сутності, Внутрішнє об’єднання поверне набір результатів, який буде дорівнювати «Записам в A і B», на основі відповідного ключа.
Давайте зараз подивимося, що робитиме Ліва Зовнішня Приєднання.
Запит:
SELECT EmpDetails. EmployeeID, EmpDetails. EmployeeName, EmpSalary. EmployeeSalary FROM EmpDetails LEFT JOIN EmpSalary ON EmpDetails. EmployeeID = EmpSalary. EmployeeID;
Результат:
Ідентифікатор працівника | Ім'я працівника | Зарплата працівника |
---|---|---|
1 | Джон | 50000 |
два | Саманта | 120000 |
3 | Жоден | 75000 |
4 | Шовковистий | 25000 |
5 | ОЗП | 150000 |
6 | Арпіт | 80000 |
8 | Сіта | НУЛЬ |
9 | Фара | НУЛЬ |
10 | Джеррі | НУЛЬ |
У наведеному вище наборі результатів ви можете бачити, що ліве зовнішнє приєднання повернуло всі 10 записів із таблиці LEFT, тобто таблиці EmpDetails, і оскільки перші 6 записів відповідають, він повернув заробітну плату працівника за ці відповідні записи.
Оскільки решта записів не мають відповідного ключа в таблиці RIGHT, тобто таблиці EmpSalary, вона повернула NULL, що відповідає цим. Оскільки Лілі, Сіта, Фара та Джеррі не мають відповідного ідентифікатора працівника у таблиці EmpSalary, їхня зарплата відображається як NULL у наборі результатів.
Отже, якщо A і B - дві сутності, то ліве зовнішнє об’єднання поверне набір результатів, який буде дорівнює «Записам у A NOT B», на основі відповідного ключа.
А тепер давайте спостерігатимемо за тим, що робить Правильна Зовнішня Приєднання.
Запит:
SELECT EmpDetails. EmployeeID, EmpDetails. EmployeeName, EmpSalary. EmployeeSalary FROM EmpDetails RIGHT join EmpSalary ON EmpDetails. EmployeeID = EmpSalary. EmployeeID;
Результат:
Ідентифікатор працівника | Ім'я працівника | Зарплата працівника |
---|---|---|
НУЛЬ | НУЛЬ | 90000 |
1 | Джон | 50000 |
два | Саманта | 120000 |
3 | Жоден | 75000 |
4 | Шовковистий | 25000 |
5 | ОЗП | 150000 |
6 | Арпіт | 80000 |
НУЛЬ | НУЛЬ | 250 000 |
НУЛЬ | НУЛЬ | 250 000 |
У наведеному вище наборі результатів ви можете бачити, що праве зовнішнє з'єднання зробило прямо протилежне лівому об'єднанню. Він повернув усі зарплати з потрібної таблиці, тобто таблиці EmpSalary.
Але оскільки Роуз, Сакші та Джек не мають відповідного ідентифікатора працівника у лівій таблиці, тобто таблиці EmpDetails, ми отримали їхній ідентифікатор працівника та найменування EmployeeName як NULL з лівої таблиці.
Отже, якщо A і B - дві сутності, то праве зовнішнє об’єднання поверне набір результатів, який буде дорівнює „Запису в B NOT A“, на основі відповідного ключа.
Давайте також побачимо, яким буде набір результатів, якщо ми виконуємо операцію вибору для всіх стовпців в обох таблицях.
Запит:
SELECT * FROM EmpDetails RIGHT JOIN EmpSalary ON EmpDetails. EmployeeID = EmpSalary. EmployeeID;
Результат:
Ідентифікатор працівника | Ім'я працівника | Ідентифікатор працівника | Ім'я працівника | Зарплата працівника |
---|---|---|---|---|
НУЛЬ | НУЛЬ | одинадцять | Роуз | 90000 |
1 | Джон | 1 | Джон | 50000 |
два | Саманта | два | Саманта | 120000 |
3 | Жоден | 3 | Жоден | 75000 |
4 | Шовковистий | 4 | Шовковистий | 25000 |
5 | ОЗП | 5 | ОЗП | 150000 |
6 | Арпіт | 6 | Арпіт | 80000 |
НУЛЬ | НУЛЬ | 12 | Сакші | 250 000 |
НУЛЬ | НУЛЬ | 13 | Джек | 250 000 |
Тепер давайте перейдемо до Повного приєднання.
Повне зовнішнє об’єднання виконується тоді, коли нам потрібні всі дані з обох таблиць, незалежно від того, чи є збіг чи ні. Отже, якщо я хочу, щоб усі співробітники, навіть якщо я не знайшов відповідного ключа, я запущу запит, як показано нижче.
Запит:
SELECT * FROM EmpDetails FULL JOIN EmpSalary ON EmpDetails. EmployeeID = EmpSalary. EmployeeID;
Результат:
Ідентифікатор працівника | Ім'я працівника | Ідентифікатор працівника | Ім'я працівника | Зарплата працівника |
---|---|---|---|---|
7 | Лілія | НУЛЬ | НУЛЬ | НУЛЬ |
1 | Джон | 1 | Джон | 50000 |
два | Саманта | два | Саманта | 120000 |
3 | Жоден | 3 | Жоден | 75000 |
4 | Шовковистий | 4 | Шовковистий | 25000 |
5 | ОЗП | 5 | ОЗП | 150000 |
6 | Арпіт | 6 | Арпіт | 80000 |
8 | Сіта | НУЛЬ | НУЛЬ | НУЛЬ |
9 | Фара | НУЛЬ | НУЛЬ | НУЛЬ |
10 | Джеррі | НУЛЬ | НУЛЬ | НУЛЬ |
НУЛЬ | НУЛЬ | одинадцять | Роуз | 90000 |
НУЛЬ | НУЛЬ | 12 | Сакші | 250 000 |
НУЛЬ | НУЛЬ | 13 | Джек | 250 000 |
Ви можете бачити у наведеному вище наборі результатів, що, оскільки перші шість записів співпадають в обох таблицях, ми отримали всі дані без будь-якого NULL. Наступні чотири записи існують у лівій таблиці, але не в правій, отже відповідні дані в правій таблиці мають значення NULL.
Останні три записи існують у правій таблиці, а не в лівій, отже, ми маємо NULL у відповідних даних з лівої таблиці. Отже, якщо A і B - дві сутності, повне зовнішнє об’єднання поверне набір результатів, який буде дорівнювати «Записам в A І B», незалежно від відповідного ключа.
Теоретично це поєднання лівого приєднання та правого приєднання.
Продуктивність
Давайте порівняємо внутрішнє об’єднання з лівим зовнішнім об’єднанням на сервері SQL. Говорячи про швидкість роботи, лівий зовнішній JOIN, очевидно, не швидший, ніж внутрішній.
Відповідно до визначення, зовнішнє з'єднання, будь то ліве чи праве, воно повинно виконувати всю роботу внутрішнього з'єднання разом з додатковою роботою, що подовжує результати. Очікується, що зовнішнє об’єднання поверне більшу кількість записів, що ще більше збільшує загальний час його виконання лише через більший набір результатів.
Таким чином, зовнішнє з'єднання є повільнішим, ніж внутрішнє з'єднання.
Більше того, можуть бути деякі конкретні ситуації, коли ліве з'єднання буде швидшим, ніж внутрішнє, але ми не можемо продовжувати замінювати їх між собою, оскільки ліве зовнішнє з'єднання функціонально не еквівалентно внутрішньому з'єднанню.
Давайте обговоримо приклад, коли ліве приєднання може бути швидшим, ніж внутрішнє приєднання. Якщо таблиці, задіяні в операції об’єднання, замалі, скажімо, що вони мають менше 10 записів, і таблиці не мають достатньо індексів, щоб охопити запит, у такому випадку ліве об’єднання, як правило, швидше, ніж внутрішнє об’єднання.
Давайте створимо дві таблиці нижче та зробимо ВНУТРІШНЄ З'єднання та ЛІВО ВНЕШНЄ З'єднання між ними як приклад:
CREATE TABLE #Table1 ( ID int NOT NULL PRIMARY KEY, Name varchar(50) NOT NULL ) INSERT #Table1 (ID, Name) VALUES (1, 'A') INSERT #Table1 (ID, Name) VALUES (2, 'B') INSERT #Table1 (ID, Name) VALUES (3, 'C') INSERT #Table1 (ID, Name) VALUES (4, 'D') INSERT #Table1 (ID, Name) VALUES (5, 'E') CREATE TABLE #Table2 ( ID int NOT NULL PRIMARY KEY, Name varchar(50) NOT NULL ) INSERT #Table2 (ID, Name) VALUES (1, 'A') INSERT #Table2 (ID, Name) VALUES (2, 'B') INSERT #Table2 (ID, Name) VALUES (3, 'C') INSERT #Table2 (ID, Name) VALUES (4, 'D') INSERT #Table2 (ID, Name) VALUES (5, 'E') SELECT * FROM #Table1 t1 INNER JOIN #Table2 t2 ON t2.Name = t1.Name
Посвідчення особи | Ім'я | Посвідчення особи | Ім'я | |
---|---|---|---|---|
Нижче наведено візуалізацію внутрішнього об’єднання: ![]() | Нижче наведено візуалізацію зовнішнього з'єднання ![]() | |||
1 | 1 | ДО | 1 | ДО |
два | два | B | два | B |
3 | 3 | C. | 3 | C. |
4 | 4 | D | 4 | D |
5 | 5 | Є | 5 | Є |
SELECT * FROM (SELECT 38 AS bah) AS foo JOIN (SELECT 35 AS bah) AS bar ON (55=55);
Посвідчення особи | Ім'я | Посвідчення особи | Ім'я | |
---|---|---|---|---|
1 | 1 | ДО | 1 | ДО |
два | два | B | два | B |
3 | 3 | C. | 3 | C. |
4 | 4 | D | 4 | D |
5 | 5 | Є | 5 | Є |
Як ви можете бачити вище, обидва запити повернули однаковий набір результатів. У цьому випадку, якщо ви переглянете план виконання обох запитів, то виявите, що внутрішнє об’єднання коштувало більше, ніж зовнішнє. Це пов’язано з тим, що для внутрішнього об’єднання сервер SQL виконує збіг хешу, тоді як для лівого об’єднання виконує вкладені цикли.
Збіг хешу зазвичай швидший, ніж вкладені цикли. Але в цьому випадку, оскільки кількість рядків настільки мала, і немає індексу для використання (як ми робимо приєднання до стовпця імені), операція хешування виявилася найдорожчим внутрішнім запитом на приєднання.
Однак якщо ви зміните відповідний ключ у запиті на приєднання з Ім'я на Ідентифікатор і якщо в таблиці є велика кількість рядків, то ви виявите, що внутрішнє об’єднання буде швидшим, ніж ліве зовнішнє об’єднання.
MS Access Внутрішнє та Зовнішнє приєднання
Коли ви використовуєте декілька джерел даних у запиті MS Access, тоді ви застосовуєте JOIN для управління записами, які ви хочете бачити, залежно від того, як джерела даних пов'язані між собою.
При внутрішньому об’єднанні лише пов’язані з обох таблиць об’єднуються в єдиному наборі результатів. Це приєднання за замовчуванням у Access та найчастіше використовуване. Якщо ви застосовуєте об'єднання, але явно не вказуєте, який це тип об'єднання, то Access передбачає, що це внутрішнє об'єднання.
У зовнішніх об’єднаннях всі пов’язані дані з обох таблиць поєднуються правильно, а також усі інші рядки з однієї таблиці. У повному зовнішньому з'єднанні всі дані об'єднуються, де це можливо.
Ліве приєднання проти лівого зовнішнього приєднання
У SQL-сервері ключове слово external є необов’язковим, коли ви застосовуєте ліве зовнішнє об’єднання. Таким чином, не має значення, якщо ви напишете „ВЛІВО ВНІШНЄ ПРИЄДНАННЯ“ або „ЛІВО ПРИЄДНАННЯ“, оскільки обидва результати дадуть вам однаковий результат.
A LEFT JOIN B - це еквівалентний синтаксис A LEFT OUTER JOIN B.
Нижче наведено список еквівалентних синтаксисів на сервері SQL:
(зображення джерело )
Ліве зовнішнє приєднання проти правого зовнішнього приєднання
Цю різницю ми вже бачили в цій статті. Щоб побачити різницю, ви можете звернутися до запитів та набору результатів лівого зовнішнього приєднання та правого зовнішнього приєднання.
Основна відмінність між лівим та правим з'єднанням полягає у включенні невідповідних рядків. Ліве зовнішнє об'єднання включає нерівні рядки з таблиці, яка знаходиться зліва від пропозиції об'єднання, тоді як праве зовнішнє об'єднання включає нерівні рядки з таблиці, яка знаходиться праворуч від пункту об'єднання.
Люди справді запитують, що краще використовувати, тобто ліве або праве об’єднання? В основному це однакові операції, за винятком обернених аргументів. Отже, коли ви запитуєте, яке об’єднання використовувати, ви насправді запитуєте, чи писати a a. Це просто питання переваг.
Як правило, люди воліють використовувати Left join у своїх SQL-запитах. Я б порадив вам дотримуватися послідовності в тому, як ви пишете запит, щоб уникнути плутанини в інтерпретації запиту.
На сьогодні ми бачили все про Внутрішнє приєднання та всі типи Зовнішніх приєднань. Давайте швидко узагальнимо різницю між Внутрішньою та Зовнішньою.
Різниця між внутрішнім і зовнішнім об’єднанням у табличному форматі
Внутрішнє з'єднання | Зовнішнє приєднання |
---|---|
Повертає лише ті рядки, які мають відповідні значення в обох таблицях. | Включає відповідні рядки, а також деякі невідповідні рядки між двома таблицями. |
Якщо в таблицях є велика кількість рядків і є індекс, який слід використовувати, INNER JOIN, як правило, швидше, ніж OUTER JOIN. | Як правило, ЗОВНІШНЄ ПРИЄДНАННЯ повільніше, ніж ВНУТРІШНЄ ПРИЄДНАННЯ, оскільки воно потребує повернення більшої кількості записів у порівнянні з ВНУТРІШНЄМ. Однак можуть бути деякі конкретні сценарії, коли ВНЕШНЄ ПРИЄДНАННЯ швидше. |
Коли збіг не знайдено, він нічого не повертає. | Коли збіг не знайдено, у значення стовпця, що повертається, поміщається NULL. |
Використовуйте ВНУТРІШНЄ ПРИЄДНАННЯ, коли потрібно переглянути детальну інформацію будь-якого конкретного стовпця. | Використовуйте ЗОВНІШНЄ ПРИЄДНАННЯ, коли потрібно відобразити список усієї інформації в двох таблицях. |
INNER JOIN діє як фільтр. В обох таблицях має бути відповідність для внутрішнього об’єднання для повернення даних. | Вони діють як додавання даних. |
Існує неявне позначення об’єднання для внутрішнього об’єднання, яке включає таблиці, що об’єднуються комами у реченні FROM. Приклад: SELECT * FROM product, category WHERE product.CategoryID = category.CategoryID; | Немає неявного позначення об’єднання для зовнішнього об’єднання. |
Внутрішнє та зовнішнє приєднання проти Союзу
Часом ми плутаємо Join and Union, і це також одне з найбільш часто задаваних питань у Інтерв’ю з SQL . Ми вже бачили різницю між внутрішнім і зовнішнім з'єднанням. Тепер давайте подивимось, чим ПРИЄДНАННЯ відрізняється від СОЮЗУ.
UNION розміщує рядок запитів один за одним, тоді як join створює декартовий продукт і підгрупує його. Таким чином, UNION та JOIN - це абсолютно різні операції.
Давайте запустимо два наведені нижче запити в MySQL і побачимо їх результат.
Запит СОЮЗУ:
SELECT 28 AS bah UNION SELECT 35 AS bah;
Результат:
Бах | |
---|---|
1 | 28 |
два | 35 |
ПРИЄДНАТИСЯ до запиту:
SELECT * FROM (SELECT 38 AS bah) AS foo JOIN (SELECT 35 AS bah) AS bar ON (55=55);
Результат:
foo | Бар | |
---|---|---|
1 | 38 | 35 |
Операція UNION розміщує результат двох або більше запитів в одному наборі результатів. Цей набір результатів містить усі записи, які повертаються за всіма запитами, що беруть участь у UNION. Таким чином, в основному СОЮЗ поєднує два набори результатів разом.
Операція об’єднання отримує дані з двох або більше таблиць на основі логічних зв’язків між цими таблицями, тобто на основі умови об’єднання. У запиті на приєднання дані з однієї таблиці використовуються для вибору записів з іншої таблиці. Це дозволяє зв’язувати подібні дані, які є в різних таблицях.
Для того, щоб зрозуміти це дуже просто, ви можете сказати, що UNION поєднує рядки з двох таблиць, тоді як об'єднання поєднує стовпці з двох або більше таблиць. Таким чином, обидва використовуються для об'єднання даних з n таблиць, але різниця полягає в тому, як дані поєднуються.
Нижче наведені зображення зображень UNION та JOIN.
Вище викладене наочне зображення операції об’єднання, що показує, що кожен запис у наборі результатів містить стовпці з обох таблиць, тобто таблиці А та таблиці В. Цей результат повертається на основі умови об’єднання, застосованої у запиті.
Як правило, об’єднання є результатом денормалізації (протилежне нормалізації), і воно використовує зовнішній ключ однієї таблиці для пошуку значень стовпців, використовуючи первинний ключ в іншій таблиці.
Вище наведено наочне зображення операції UNION, що показує, що кожен запис у наборі результатів є рядком з будь-якої з двох таблиць. Таким чином, результат UNION об'єднав рядки з таблиці A та таблиці B.
який найкращий безкоштовний завантажувач YouTube -
Подальше читання = >> MySQL UNION пояснив на прикладах
Висновок
У цій статті ми побачили основні відмінності між Внутрішнє приєднання та Зовнішнє приєднання в SQL . Ми також бачили класифікацію Зовнішнього Приєднання, тобто Лівого приєднання, Правого приєднання та Повного приєднання. Ми бачили, як працює кожен із цих типів об’єднань і як вони відрізняються один від одного.
Ми також провели порівняння продуктивності між цими типами об’єднань. Ми також обговорили, чим приєднання відрізняється від профспілки.
Також прочитайте = >> Типи приєднання MySQL
Сподіваюся, ця стаття допомогла б вам зняти сумніви щодо відмінностей між різними типами об’єднань. Ми впевнені, що це справді змусить вас вирішити, який тип об’єднання вибрати на основі бажаного набору результатів.
Рекомендована література
- Точна різниця між верифікацією та валідацією на прикладах
- Модем проти маршрутизатора: знайте точну різницю
- Різниця між SQL Vs MySQL Vs SQL Server (з прикладами)
- Підручник із прикладами Python DateTime
- LAN проти WAN проти MAN: Точна різниця між типами мережі
- Вирізати команду в Unix з прикладами
- Синтаксис команд Unix Cat, варіанти з прикладами
- Використання курсору в MongoDB з прикладами