SlideShare a Scribd company logo
Область использования
вложенных запросов
Ряд конструкций языка DML предусматривает использование
вложенных запросов:			
• некоторые формы конструкции WHERE в операторе SELECT;
• теоретико-множественные операции (например, UNION);
• вставка данных в таблицу (INSERT)
• любая таблица в запросе может быть представлена в виде вложенного
запроса.
 
Формы с подзапросами
в конструкции WHERE
оператора SELECT				
• expression [ NOT ] IN (SELECT-statement)
• expression relation-operator ( SELECT-statement )
• [NOT ] EXISTS ( SELECT-statement )
• expression relation-operator { ANY | ALL | SOME } ( SELECT-
statement )
• (здесь ключевые слова ANY и SOME – синонимы).
Оператор UNION
SELECT-statement
UNION [ALL]
SELECT-statement
[UNION SELECT-statement...]
[ORDER BY …]
[LIMIT n[,m]]
Пример: запрос с проверкой
на вхождение в множество
Номера зачеток и ФИО студентов, получивших 2 на экзаменах.
SELECT StudentId,
StudentName
FROM STUDENT
WHERE StudentId IN
(SELECT DISTINCT StudentId
FROM EXAM_RESULT
WHERE Mark = 2);
Пример: запрос с проверкой
существования записей подзапроса
Преподаватели, которые будут принимать экзамен по Базам данных.
SELECT * FROM TEACHER
WHERE EXISTS(SELECT * FROM EXAM_SHEET WHERE EXAM_SHEET.CourseId =
(SELECT COURSE.CourseId FROM COURSE
WHERE COURSE.CourseTitle = 'Базы данных')
AND TEACHER.TeacherId = EXAM_SHEET.TeacherId);
Пример: запрос с проверкой
значения всех записей подзапроса
Вся информация о студентах-отличниках.
SELECT * FROM STUDENT
WHERE 5 = ALL(SELECT Mark FROM EXAM_RESULT
WHERE EXAM_RESULT.StudentId = STUDENT.StudentId);
Пример: агрегирование
с условием для группировки
Студенты, для которых указано более одного номера телефона.
SELECT StudentName FROM STUDENT
WHERE StudentId IN (SELECT StudentId
FROM PHONE_LIST
GROUP BY StudentId HAVING COUNT(*) > 1);
Пример: использование вложенного
запроса в списке полей
Вычисление среднего балла студента.
SELECT StudentName,
(SELECT AVG(MARK) FROM EXAM_RESULT
WHERE EXAM_RESULT.StudentId = STUDENT.StudentId) AVG_MARK
FROM STUDENT;
Пример: вложенный запрос
в операторе INSERT
Добавление факультативных курсов в таблицу COURSE.
INSERT INTO COURSE(CourseId, CourseTitle)
SELECT CourseId + 1000, CONCAT(CourseTitle,
'(факультатив)')
FROM COURSE;
Пример: агрегирование среднего
балла для групп
SELECT GroupNumber, AVG(MARK) AVG_MARK
FROM
(SELECT StudentId, Mark,
(SELECT GroupNumber FROM STUDENT
WHERE StudentId = EXAM_RESULT.
StudentId) GroupNumber
FROM EXAM_RESULT) TEMP
GROUP BY GroupNumber;
  
Пример: использование
подзапросов в операторе
UNION
(SELECT StudentId FROM PHONE_LIST WHERE PhoneType = 'дом')
UNION
(SELECT StudentId FROM PHONE_LIST WHERE PhoneType = 'моб')
Список номеров зачеток студентов, у которых
в базе данных указан мобильный или домашний телефон
ORDER BY StudentId;

More Related Content

More from Roman Brovko

Bare metal training_06_I2C
Bare metal training_06_I2CBare metal training_06_I2C
Bare metal training_06_I2C
Roman Brovko
 
Bare metal training_05_uart
Bare metal training_05_uartBare metal training_05_uart
Bare metal training_05_uart
Roman Brovko
 
подготовка рабочего окружения
подготовка рабочего окруженияподготовка рабочего окружения
подготовка рабочего окружения
Roman Brovko
 

More from Roman Brovko (20)

Individual task Networking
Individual task NetworkingIndividual task Networking
Individual task Networking
 
Networking essentials lect3
Networking essentials lect3Networking essentials lect3
Networking essentials lect3
 
Gl embedded starterkit_ethernet
Gl embedded starterkit_ethernetGl embedded starterkit_ethernet
Gl embedded starterkit_ethernet
 
Networking essentials lect2
Networking essentials lect2Networking essentials lect2
Networking essentials lect2
 
Networking essentials lect1
Networking essentials lect1Networking essentials lect1
Networking essentials lect1
 
Bare metal training_07_spi_flash
Bare metal training_07_spi_flashBare metal training_07_spi_flash
Bare metal training_07_spi_flash
 
Bare metal training_06_I2C
Bare metal training_06_I2CBare metal training_06_I2C
Bare metal training_06_I2C
 
Glesk worshop
Glesk worshopGlesk worshop
Glesk worshop
 
Bare metal training_05_uart
Bare metal training_05_uartBare metal training_05_uart
Bare metal training_05_uart
 
Bare metal training_04_adc_temp_sensor
Bare metal training_04_adc_temp_sensorBare metal training_04_adc_temp_sensor
Bare metal training_04_adc_temp_sensor
 
Bare metal training_03_timers_pwm
Bare metal training_03_timers_pwmBare metal training_03_timers_pwm
Bare metal training_03_timers_pwm
 
Bare metal training_02_le_ds_and_buttons
Bare metal training_02_le_ds_and_buttonsBare metal training_02_le_ds_and_buttons
Bare metal training_02_le_ds_and_buttons
 
Bare metal training_01_hello_world
Bare metal training_01_hello_worldBare metal training_01_hello_world
Bare metal training_01_hello_world
 
Bare metal training_00_prerequisites
Bare metal training_00_prerequisitesBare metal training_00_prerequisites
Bare metal training_00_prerequisites
 
C language lect_23_advanced
C language lect_23_advancedC language lect_23_advanced
C language lect_23_advanced
 
C language lect_22_advanced
C language lect_22_advancedC language lect_22_advanced
C language lect_22_advanced
 
C language lect_21_advanced
C language lect_21_advancedC language lect_21_advanced
C language lect_21_advanced
 
подготовка рабочего окружения
подготовка рабочего окруженияподготовка рабочего окружения
подготовка рабочего окружения
 
C language lect_20_advanced
C language lect_20_advancedC language lect_20_advanced
C language lect_20_advanced
 
C language lect_19_basics
C language lect_19_basicsC language lect_19_basics
C language lect_19_basics
 

21 - Базы данных. Вложенные запросы

  • 1. Область использования вложенных запросов Ряд конструкций языка DML предусматривает использование вложенных запросов: • некоторые формы конструкции WHERE в операторе SELECT; • теоретико-множественные операции (например, UNION); • вставка данных в таблицу (INSERT) • любая таблица в запросе может быть представлена в виде вложенного запроса.
  • 2.   Формы с подзапросами в конструкции WHERE оператора SELECT • expression [ NOT ] IN (SELECT-statement) • expression relation-operator ( SELECT-statement ) • [NOT ] EXISTS ( SELECT-statement ) • expression relation-operator { ANY | ALL | SOME } ( SELECT- statement ) • (здесь ключевые слова ANY и SOME – синонимы).
  • 3. Оператор UNION SELECT-statement UNION [ALL] SELECT-statement [UNION SELECT-statement...] [ORDER BY …] [LIMIT n[,m]]
  • 4. Пример: запрос с проверкой на вхождение в множество Номера зачеток и ФИО студентов, получивших 2 на экзаменах. SELECT StudentId, StudentName FROM STUDENT WHERE StudentId IN (SELECT DISTINCT StudentId FROM EXAM_RESULT WHERE Mark = 2);
  • 5. Пример: запрос с проверкой существования записей подзапроса Преподаватели, которые будут принимать экзамен по Базам данных. SELECT * FROM TEACHER WHERE EXISTS(SELECT * FROM EXAM_SHEET WHERE EXAM_SHEET.CourseId = (SELECT COURSE.CourseId FROM COURSE WHERE COURSE.CourseTitle = 'Базы данных') AND TEACHER.TeacherId = EXAM_SHEET.TeacherId);
  • 6. Пример: запрос с проверкой значения всех записей подзапроса Вся информация о студентах-отличниках. SELECT * FROM STUDENT WHERE 5 = ALL(SELECT Mark FROM EXAM_RESULT WHERE EXAM_RESULT.StudentId = STUDENT.StudentId);
  • 7. Пример: агрегирование с условием для группировки Студенты, для которых указано более одного номера телефона. SELECT StudentName FROM STUDENT WHERE StudentId IN (SELECT StudentId FROM PHONE_LIST GROUP BY StudentId HAVING COUNT(*) > 1);
  • 8. Пример: использование вложенного запроса в списке полей Вычисление среднего балла студента. SELECT StudentName, (SELECT AVG(MARK) FROM EXAM_RESULT WHERE EXAM_RESULT.StudentId = STUDENT.StudentId) AVG_MARK FROM STUDENT;
  • 9. Пример: вложенный запрос в операторе INSERT Добавление факультативных курсов в таблицу COURSE. INSERT INTO COURSE(CourseId, CourseTitle) SELECT CourseId + 1000, CONCAT(CourseTitle, '(факультатив)') FROM COURSE;
  • 10. Пример: агрегирование среднего балла для групп SELECT GroupNumber, AVG(MARK) AVG_MARK FROM (SELECT StudentId, Mark, (SELECT GroupNumber FROM STUDENT WHERE StudentId = EXAM_RESULT. StudentId) GroupNumber FROM EXAM_RESULT) TEMP GROUP BY GroupNumber;
  • 11.    Пример: использование подзапросов в операторе UNION (SELECT StudentId FROM PHONE_LIST WHERE PhoneType = 'дом') UNION (SELECT StudentId FROM PHONE_LIST WHERE PhoneType = 'моб') Список номеров зачеток студентов, у которых в базе данных указан мобильный или домашний телефон ORDER BY StudentId;