logo

Вкладені запити в SQL

Передумови: Основи 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

);