Передумови: Основи SQL
Вкладені запити — це спосіб виконання складних запитів шляхом вбудовування одного запиту в інший. Зовнішній запит може застосовувати деякі умови до результатів внутрішнього запиту. Давайте використовувати СТУДЕНТ, КУРС, СТУДЕНТ_КУРС таблиці для розуміння вкладених запитів.
СТУДЕНТ
| S_ID | S_NAME | S_АДРЕСА | S_PHONE | S_AGE |
| S1 | ОЗП | ДЕЛІ | 9455123451 | 18 |
| S2 | РАМЕШ | ГУРГАОН | 9652431543 | 18 |
| S3 | SUJIT | РОХТАК | 9156253131 | двадцять |
| S4 | СУРЕШ | ДЕЛІ | 9156768971 | 18 |
КУРС
| C_ID | C_NAME |
| C1 | DSA |
| C2 | Програмування |
| C3 | СУБД |
СТУДЕНТСЬКИЙ_КУРС
| S_ID | C_ID |
| S1 | C1 |
| S1 | C3 |
| S2 | C1 |
| S3 | C2 |
| S4 | C2 |
| S4 | C3 |
В основному існує два типи вкладених запитів:
- Незалежні вкладені запити: У незалежних вкладених запитах виконання запиту починається від самого внутрішнього запиту до самих зовнішніх запитів. Виконання внутрішнього запиту не залежить від зовнішнього запиту, але результат внутрішнього запиту використовується при виконанні зовнішнього запиту. Для написання незалежних вкладених запитів використовуються різні оператори, такі як IN, NOT IN, ANY, ALL тощо.
В: Якщо ми хочемо дізнатися S_ID які зараховані до C_NAME «DSA» або «СУБД», ми можемо написати це за допомогою незалежного вкладеного запиту та оператора IN. Від КУРС таблиці, ми можемо дізнатися C_ID для C_NAME «DSA» або СУБД», і ми можемо використовувати їх C_ID s для знаходження S_ID s від СТУДЕНТСЬКИЙ_КУРС ТАБЛИЦЯ. КРОК 1: Знахідка C_ID для C_NAME ='DSA' або 'СУБД' Виберіть C_ID від КУРС де C_NAME = «DSA» або C_NAME = «СУБД» КРОК 2: Використання C_ID кроку 1 для знаходження S_ID Виберіть S_ID від СТУДЕНТСЬКИЙ_КУРС де C_ID В (ВИБРАТИ C_ID від КУРС де C_NAME = «DSA» або C_NAME =’СУБД’); Внутрішній запит поверне набір із елементами C1 і C3, а зовнішній запит поверне їх S_ID s для якого C_ID дорівнює будь-якому члену множини (у цьому випадку C1 і C3). Отже, він поверне S1, S2 і S4. Примітка: Якщо ми хочемо дізнатися імена СТУДЕНТ тих, хто зареєструвався в «DSA» або «DBMS», це можна зробити так: Виберіть S_NAME з СТУДЕНТ де S_ID IN (Виберіть S_ID від СТУДЕНТСЬКИЙ_КУРС де C_ID В (ВИБРАТИ C_ID від КУРС де C_NAME ='DSA' або C_NAME =’СУБД’));
НЕ В: Якщо ми хочемо дізнатися S_ID s of СТУДЕНТ тих, хто не зареєстрований ні в «DSA», ні в «СУБД», це можна зробити так: Виберіть S_ID від СТУДЕНТ де S_ID НЕ В (Виберіть S_ID від СТУДЕНТСЬКИЙ_КУРС де C_ID В (ВИБРАТИ C_ID від КУРС де C_NAME ='DSA' або C_NAME =’СУБД’)); Внутрішній запит поверне набір із елементами C1 і C3. Другий внутрішній запит поверне їх S_ID s для якого C_ID дорівнює будь-якому члену множини (у цьому випадку C1 і C3), які є S1, S2 і S4. Зовнішній запит поверне їх S_ID s де S_ID не є членом множини (S1, S2 і S4). Таким чином, він поверне S3.
- Пов’язані вкладені запити: У взаємопов’язаних вкладених запитах вихід внутрішнього запиту залежить від рядка, який зараз виконується у зовнішньому запиті. напр.; Якщо ми хочемо дізнатися S_NAME з СТУДЕНТ s, які зареєстровані в C_ID «C1», це можна зробити за допомогою суміжного вкладеного запиту: Виберіть S_NAME з СТУДЕНТ S де ІСНУЄ ( виберіть * з СТУДЕНТСЬКИЙ_КУРС SC де S. S_ID =SC. S_ID і SC. C_ID =’C1’); Для кожного ряду СТУДЕНТ S, він знайде рядки з СТУДЕНТСЬКИЙ_КУРС де S. S_ID = SC. S_ID і SC. C_ID ='C1'. Якщо для a S_ID від СТУДЕНТ S, принаймні рядок існує в СТУДЕНТСЬКИЙ_КУРС СК с C_ID =’C1’, тоді внутрішній запит поверне істину та відповідність S_ID буде повернено як результат.
ПРИКЛАД У КОДУ SQL:
ВИБРАТИ Ім'я студента
ВІД Студентів
WHERE StudentID IN (
ВИБЕРІТЬ ID студента
ВІД Оцінки
WHERE Subject = «Mathematics» AND Score> 90
);