Вложенный select. Вложенные и связанные подзапросы в SQL, предикат EXISTS

Вложенный select. Вложенные и связанные подзапросы в SQL, предикат EXISTS

Вложенный запрос относится к специальным объектам в программе 1С. К его функционалу прибегают, если требуется сформировать и выполнить специальные виды запросов к таблицам базы данных (БД) в программе. Для получения результата по запросу сначала необходимо корректное составление текста запроса, который будет аккумулировать актуальную информацию об источниках для получения данных. Это могут быть таблицы, специальные поля, уникальные группировки.

Современный язык запросов для программы 1С

Вложенные запросы пишутся с применением языка, который имеет свои особенности и в тоже время похож на другие специальные языки SQL, к примеру, по своему синтаксису. Главные отличительные черты языка запросов в 1С такие:

  • Разыменование ссылочных полей;
  • Возможности нетипичных запросов;
  • Упорядочивание по примитивным типам;
  • Использование конструкции «Представление»;
  • Выборка данных по шаблону;
  • Совместное использование группировок и итогов;
  • Конструкция с условием «Где».

Есть и другие отличительные особенности языка запросов в 1С, которые позволяют ему быть эффективным.

Что нужно знать о вложенных запросах и языке запросов?

Профессиональное изучение конструкции языка запроса позволяет не только понять, для чего предназначен язык запросов , но и научится представлять совокупность объектов базы в формате 2-х мерных таблиц, обрабатывать консоль запросов, создавать файлы для хранения списков запросов, познакомиться со специфическими полями таблиц, имеющих ссылочный тип. И всё это будут только начальные знания о системе вложенных запросов в 1С. Важно освоить и групповые операции, относящиеся к языку запросов, изучить, как делать корректную выборку по нескольким источникам данных.

Пример вложенного запроса

Рассмотрим один из вариантов вложенного запроса на основе объединения запросов. Предположим, есть документы по приходу и расходу, при этом одно и то же юридическое лицо выступает и как продавец, и как покупатель. Нам нужно узнать, общий долг по контрагенту. Для этого используем эффективную конструкцию «ОБЪЕДИНИТЬ ВСЕ».

Таблица «ПРИХОД»

Таблица «РАСХОД»

Сначала определяем все расходы, затем приход по юрлицам. Второй запрос ставим со знаком «-», это позволит корректно свернуть данные.

Результат действия:

Но нам нужно получить свёрнутый результат, требуется группировка по юридическому лицу.

Тогда результатом отчёта будет:

Когда речь идёт о таблицах Расхода и Прихода, к примеру, по справочнику Номенклатура, то необходимо исключить дублирование. Но сливать каждый из запросов отдельно не получится. Поэтому нужно сделать так:

В этом случае запрос помещён между скобками, его называют вложенным запросом. Это позволяет не только провести группировку актуальных для нас записей, но и исключить аналогичные элементы из двух используемых подзапросов.

Существуют определённые требования, которых необходимо придерживаться, выполняя объединение двух запросов. Прежде всего, это касается количества полей. Необходимо, чтобы их число было идентичным. К примеру, если бы в таблице данных «Расход» была указана Скидка, а в данных по Приходу такого элемента не было бы, то следует прибегнуть к следующей конструкции:

В дальнейшем нужно будет скорректировать величину суммы на скидку и выполнить необходимую группировку.

Вторым непременным условием является порядок. Дело в том, что процедура объединения по полям происходит в чётком соответствии с их порядком, то есть тем, как они обозначены в каждой последовательной секции. Для изменения порядка применим такую конструкцию:

Кстати, при применении конструкции Объединения следует отличать её от понятия соединения нескольких запросов. Объединение даёт возможность вертикального соединения результатов выборки, поочерёдно берутся данные из первого, потом уже переходят ко второму. Именно так получаются данные в результате конструкции объединения информации из двух таблиц.

SQL позволяет вкладывать запросы друг в друга. Обычно подзапрос возвращает одно значение, которое проверяется на предмет истинности предиката.

Виды условий поиска:
. Сравнение с результатом вложенного запроса (=, >=)
. Проверка на принадлежность результатам подзапроса (IN)
. Проверка на существование (EXISTS)
. Многократное (количественное) сравнение (ANY, ALL)

Примечания по вложенным запросам:
. Подзапрос должен выбирать только один столбец (за исключением подзапроса с предикатом EXISTS), и тип данных его результата должен соответствовать типу данных значения, указанному в предикате.
. В ряде случаев можно использовать ключевое слово DISTINCT для гарантии получения единственного значения.
. Во вложенном запросе нельзя включать раздел ORDER BY и UNION.
. Подзапрос может находиться и лева и справа от условия поиска.
. В подзапросах могут использоваться функции агрегирования без раздела GROUP BY, которые автоматически выдают специальное значение для любого количества строк, специальный предикат IN, а также выражения, основанные на столбцах.
. По возможности следует вместо подзапросов использовать соединение таблиц JOIN.

Примеры на вложенные запросы :

SELECT * FROM Orders WHERE SNum=(SELECT SNum FROM SalesPeople WHERE SName=’Motika’)
SELECT * FROM Orders WHERE SNum IN (SELECT SNum FROM SalesPeople WHERE City=’London’)
SELECT * FROM Orders WHERE SNum=(SELECT DISTINCT SNum FROM Orders WHERE CNum=2001)
SELECT * FROM Orders WHERE Amt>(SELECT AVG(Amt) FROM Orders WHERE Odate=10/04/1990)
SELECT * FROM Customer WHERE CNum=(SELECT SNum+1000 FROM SalesPeople WHERE SName=’Serres’)

2) Связанные подзапросы

В SQL можно создавать подзапросы со ссылкой на таблицу из внешнего запроса. В этом случае подзапрос выполняется многократно, по одному разу для каждой строки таблицы из внешнего запроса. Поэтому важно, чтобы подзапрос использовал индекс. Подзапрос может обращаться к той же таблице, чтоб и внешний. Если внешний запрос возвращает относительно небольшое число строк, то связанный подзапрос будет работать быстрее несвязанного. Если подзапрос возвращает небольшое число строк, то связанный запрос выполнится медленнее несвязанного.

Примеры на связанные подзапросы:

SELECT * FROM SalesPeople Main WHERE 1(SELECT AVG(Amt) FROM Orders O2 WHERE O2.CNum=O1.CNum) //возвращает все заказы, величина которых превосходит среднюю величины заказа для данного покупателя

3) Предикат EXISTS

Синтаксическая форма: EXISTS ()

Предикат использует подзапрос в качестве аргумента и оценивает его как истинный, если в подзапросе есть выходные данные, а в противном случае как ложный. Выполняется подзапрос один раз и может содержать несколько столбцов, поскольку их значения не проверяются, а просто фиксируется результат наличия строк.

Примечания по предикату EXISTS:
. EXISTS – предикат, возвращающий значение TRUE или FALSE, и его можно применять отдельно или вместе с другими булевыми выражениями.
. EXISTS не может использовать функции агрегирования в своем подзапросе.
. В коррелирующих (связанных, зависимых – Correlated) подзапросах предикат EXISTS выполняется для каждой строки внешней таблицы.
. Можно комбинировать предикат EXISTS с соединениями таблиц.

Примеры на предикат EXISTS:

SELECT * FROM Customer WHERE EXISTS(SELECT * FROM Customer WHERE City=’San Jose’) – возвращает всех покупателей, если кто-то из них проживает в San Jose.
SELECT DISTINCT SNum FROM Customer First WHERE NOT EXISTS (SELECT * FROM Customer Send WHERE Send.SNum=First.SNum AND Send.CNumFirst.CNum) – возвращает номера продавцов, обслуживших только одного покупателя.
SELECT DISTINCT F.SNum, SName, F.City FROM SalesPeople F, Customer S WHERE EXISTS (SELECT * FROM Customer T WHERE S.SNum=T.SNum AND S.CNumT.CNum AND F.SNum=S.SNum) – возвращает номера, имена и города проживания всех продавцов, обслуживших нескольких покупателей.
SELECT * FROM SalesPeople Frst WHERE EXISTS (SELECT * FROM Customer Send WHERE Frst.SNum=Send.SNum AND 1

4) Предикаты количественного сравнения

Синтаксическая форма: {=|>|=|} ANY|ALL ()

Эти предикаты используют в качестве аргумента подзапрос, однако, по сравнению с предикатом EXISTS, они применяются в конъюнкции с предикатами отношения (=,>=). В этом смысле они сходны с предикатом IN, но применяются только с подзапросами. Стандарт допускает использовать вместо ANY ключевое слово SOME, однако не все СУБД его поддерживают.

Примечания по предикатам сравнения:
. Предикат ALL принимает значение TRUE, если каждое значение, выбранное в процессе выполнения подзапроса, удовлетворяет условию, заданному в предикате внешнего запроса. Чаще всего он используется с неравенствами.
. Предикат ANY принимает значение TRUE, если хотя бы одно значение, выбранное в процессе выполнения подзапроса, удовлетворяет условию, заданному в предикате внешнего запроса. Чаще всего он используется с неравенствами.
. Если подзапрос не возвращает строк, то ALL автоматически принимает значение TRUE (считается, что условие сравнения выполняется), а для ANY – FALSE.
. Если сравнение не имеет значения TRUE ни для одной строки и есть одна или несколько строк с NULL значением, то ANY возвращает UNKNOWN.
. Если сравнение не имеет значения FALSE ни для одной строки и есть одна или несколько строк с NULL значением, то ALL возвращает UNKNOWN.

Примеры на предикат количественного сравнения:

SELECT * FROM SalesPeople WHERE City=ANY(SELECT City FROM Customer)
SELECT * FROM Orders WHERE Amt ALL(SELECT Rating FROM Customer WHERE City=’Rome’)

5) Предикат уникальности

UNIQUE|DISTINCT ()

Предикат служит для проверка уникальности (отсутствия дублей) в выходных данных подзапроса. Причем в предикате UNIQUT строки с NULL значениями считаются уникальными, а в предикате DISTINCT два неопределенных значения считаются равными друг другу.

6) Предикат совпадений

MATCH ()

Предикат MATCH проверяет, будет ли значение строки запроса совпадать со значением любой строки, полученной в результате подзапроса. От предикатов IN И ANY такой подзапрос отличается тем, что позволяет обрабатывать «частичные» (PARTIAL) совпадения, которые могут встречаться среди строк, имеющих часть NULL-значений.

7) Запросы в разделе FROM

Фактически допустимо использовать подзапрос везде, где допускается ссылка на таблицу.

SELECT CName, Tot_Amt FROM Customer, (SELECT CNum, SUM(Amt) AS Tot_Amt FROM Orders GROUP BY CNum) WHERE City=’London’ AND Customer.CNum=Orders.CNum
//подзапрос возвращает суммарную величину заказов, сделанных каждым покупателем из Лондона.

8) Рекурсивные запросы

WITH RECURSIVE
Q1 AS SELECT … FROM … WHERE …
Q2 AS SELECT … FROM … WHERE …

  • 4.Основные понятия в концептуальном проектировании реляционных баз данных (сущность, атрибуты, отношения). Элементы реляционной модели.
  • Зависимости между атрибутами
  • 5.Целостность данных и ее виды. Нарушения целостности (аномалии).
  • 6.Функциональные связи атрибутов и нормализация таблиц. Основные нормальные формы (нф). Примеры нф.
  • 7.Использование er–моделирования в концептуальном проектировании бд. Диаграммы er- экземпляров и er-типов.
  • 8.Преобразование концептуальной модели в реляционную. Основные этапы и правила формирования отношений (пример).
  • 9.Структура и основные технические характеристики субд access 200*.Возможности проектирования персональных и сетевых приложений.
  • 10.Конструирование таблиц в ms access хр.Свойства полей. Определение типа данных, ключей, индексов.
  • 11.Связывание таблиц в субд access. Логическая схема и обеспечение ссылочной целостности данных.
  • 12.Средства реализации запросов в субд access. Виды запросов.
  • 5.2.3 Запрос к связанным таблицам
  • 5.2.4 Запросы удаления
  • 13.Реализация запросов с групповыми операциями и вычисляемыми полями. Примеры.
  • 14.Реализация запросов на модификацию и на создание таблицы.
  • 15.Стандарты современных реализаций языка sql. Основные разделы и их наполнение в sql-Jet.
  • 16.Общий формат select-инструкции (запроса на выборку). Пример реализации.
  • 17.Пример qbe- и sql–реализации перекрестного запроса.
  • 18.Создание интерфейса приложения в субд access. Работа в конструкторе форм. Разделы, элементы управления, свойства.
  • 19.Создание вложенных sql-запросов. Пример реализации.
  • 20.Программы сервиса субд access.
  • 21.Защита и администрирование бд средствами субд access.
  • 22.Использование макросов, отчетов и страниц доступа к данным в приложениях ms access хр.
  • 23.Система программирования Matlab: общая характеристика. Пакеты расширения и специализированные приложения: назначения и возможности. Подсистема Simulink.
  • 24.Структуры данных и основные структуры управления в системе программирования matlab
  • 25.Графические средства системы matlab. Работа с инструментом lti-Viewer графического анализа линейных систем управления.
  • 26.Этапы построения модели в подсистеме Simulink. Элементы технологии визуально-блочного моделирования. Настройка параметров моделирования и параметров блоков.
  • 27.Общее описание блоков библиотеки simulink.
  • 28.Реализация принципа иерархии в Simulink – моделях посредством блоков портов и подсистем. Маскирование подсистем.
  • 29.Компоненты виртуального прибора и их сборка в приложение в среде LabView. Основные элементы управления и индикаторы LabView и их соединение на блок-диаграмме.
  • 19.Создание вложенных sql-запросов. Пример реализации.

    С помощью SQL можно вкладывать запросы внутрь друг друга. Обычно внутренний запрос генерирует значение, которое проверяется в предикате внешнего запроса (в предложении WHERE или HAVING), определяющего, верно оно или нет. Совместно с подзапросом можно использовать предикат EXISTS, который возвращает истину, если вывод подзапроса не пуст.

    В сочетании с другими возможностями оператора выбора, такими как группировка, подзапрос представляет собой мощное средство для достижения нужного результата. В части FROM оператора SELECT допустимо применять синонимы к именам таблицы, если при формировании запроса нам требуется более чем один экземпляр некоторого отношения. Синонимы задаются с использованием ключевого слова AS, которое может быть вообще опущено. Поэтому часть FROM может выглядеть следующим образом:

    FROM Rl AS A, Rl AS В

    FROM Rl A. Rl В:

    оба выражения эквивалентны и рассматриваются как применения оператора SELECT к двум экземплярам таблицы R1.

    Например, покажем, как выглядят на SQL некоторые запросы к БД «Сессия»:

     Список тех, кто сдал все положенные экзамены.

    WHERE Оценка > 2

    HAVING COUNT(*) = (SELECT COUNT(*)

    WHERE R2.Группа=R3.Группа AND ФИОа.ФИО)

    Здесь во встроенном запросе определяется общее число экзаменов, которые должен сдавать каждый студент, обучающийся в группе, в которой учится данный студент, и это число сравнивается с числом экзаменов, которые сдал данный студент.

     Список тех, кто должен был сдавать экзамен по БД, но пока еще не сдавал.

    SЕLЕСТ ФИО

    WHERE R2.Fpynna=R3.Группа AND Дисциплина = "БД" AND NOT EXISTS

    (SELECT ФИО FROM Rl WHERE ФИО=а.ФИО AND Дисциплина = "БД")

    Предикат EXISTS (SubQuery) истинен, когда подзапрос SubQuery не пуст, то есть содержит хотя бы один кортеж, в противном случае предикат EXISTS ложен.

    Предикат NOT EXISTS обратно - истинен только тогда, когда подзапрос SubQuery пуст.

    Обратите внимание, каким образом NOT EXISTS с вложенным запросом позволяет обойтись без операции разности отношений. Например, формулировка запроса со словом «все» может быть выполнена как бы с двойным отрицанием. Рассмотрим пример базы, которая моделирует поставку отдельных деталей отдельными поставщиками, она представлена одним отношением SP «Поставщики-детали» со схемой

    SP (Номер_поставщика. номер_детали) Р (номер_детали. наименование)

    Вот каким образом формулируется ответ на запрос: «Найти поставщиков, которые поставляют все детали».

    SELECT DISTINCT НОМЕР_ПОСТАВЩИКА FROM SP SP1 WHERE NOT EXISTS

    (SELECT номер_детали

    FROM P WHERE NOT EXISTS

    (SELECT * FROM SP SP2

    WHERE SР2.номер_поставщика=SР1.номер_поставщика AND

    sр2.номер_детали = Р.номер_детали)):

    Фактически мы переформулировали этот запрос так: «Найти поставщиков таких, что не существует детали, которую бы они не поставляли». Следует отметить, что этот запрос может быть реализован и через агрегатные функции с подзапросом:

    SELECT DISTINCT Номер_поставщика

    GROUP BY Номер_поставщика

    HAVING CounKDISTINCT номер_детали) =

    (SELECT Count(номер_детали)

    В стандарте SQL92 операторы сравнения расширены до многократных сравнений с использованием ключевых слов ANY и ALL. Это расширение используется при сравнении значения определенного столбца со столбцом данных, возвращаемым вложенным запросом.

    Ключевое слово ANY, поставленное в любом предикате сравнения, означает, что предикат будет истинен, если хотя бы для одного значения из подзапроса предикат сравнения истинен. Ключевое слово ALL требует, чтобы предикат сравнения был бы истинен при сравнении со всеми строками подзапроса.

    Например, найдем студентов, которые сдали все экзамены на оценку не ниже чем «хорошо». Работаем с той же базой «Сессия», но добавим к ней еще одно отношение R4, которое характеризует сдачу лабораторных работ в течение семестра:

    R 1 = (ФИО, Дисциплина, Оценка);

    R 2 = (ФИО, Группа);

    R 3 = (Группы, Дисциплина)

    R 4 = (ФИО, Дисциплина, Номер_лаб_раб, Оценка);

    Select R1.ФИО From R1 Where 4 > = All (Select Rl.Оценка

    Where R1.Фио = R11.Фио)

    Рассмотрим еще один пример:

    Выбрать студентов, у которых оценка по экзамену не меньше, чем хотя бы одна оценка по сданным им лабораторным работам по данной дисциплины:

    Select R1.Фио

    From R1 Where R1.Оценка >= ANY (Select R4.Оценка

    Where Rl.Дисциплина = R4. Дисциплина AND R1.Фио = R4.Фио)

    Объединение таблиц.

    В запросе можно объединять данные из одной или нескольких таблиц. Такое объединение таблиц называется соединением (связыванием) таблиц. Различают внутреннее и внешнее соединения.

    Внутреннее соединение – это соединение, при котором результирующий набор получается путем перечисления нужных полей из разных таблиц после слова SELECT. При этом таблицы должны находиться в отношении «один-к-одному».

    Например,

    SELECT R.fam, R.birthday,A.Foto

    FROM Rabotniki R, Advanced A

    где таблицы Rabotniki и Advanced содержат основные и дополнительные сведения о работниках предприятия. Связь «один-к-одному». Таблице Rabotniki дан псевдоним R, а таблице Advanced дан псевдоним A.

    В предыдущем примере перед именем поля записано имя таблицы. Имена поля и таблицы отделяются точкой. Имя таблицы указывать необходимо, если имена полей повторяются для различных таблиц.

    Если применить внутреннее соединение к таблицам, связанным по принципу «один-ко-многим», то результирующий набор может содержать избыточную информацию. Для устранения избыточности используют критерии отбора.

    Пример 1 . Дана БД Sotrudniki, состоящая из двух таблиц:

    Запрос внутреннего соединения таблиц, связанных отношением «один-ко-многим» имеет вид

    Число записей в результирующем наборе данных равно произведению числа записей в таблице Sotrudniki на число записей в таблице Doljn. Результирующий набор данных имеет вид и содержит избыточную информацию:

    Для ограничения числа записей в результирующем наборе данных применяют критерии отбора. Запрос в этом случае будет иметь вид

    SELECT S_Fio,S_Birthday,D_Nazv FROM Sotrudniki, Doljn

    WHERE S_Doljn=D_Code

    Число записей в результирующем наборе данных будет равно числу записей в таблице Sotrudniki. p

    Пример 2 . Требуется для БД Sotrudniki сформировать запрос, который позволит получить список сотрудников, имеющих должность «программист». Получим

    SELECT S_fio, S_birthday FROM sotrudniki, doljn

    WHERE S_doljn=D_code and D_nazv="программист"

    В SQL-запросах допускается самообъединение таблицы. В этом случае одной таблице даются два псевдонима.

    Например, для нахождения всех ровесников в таблице Sotrudniki можно написать запрос:

    SELECT s1.s_fio, s2.s_fio, s1.s_birthday

    FROM Sotrudniki s1, Sotrudniki s2

    WHERE (EXTRACT(YEAR

    FROM s1.s_birthday)=EXTRACT(YEAR

    FROM s2.s_birthday))

    AND (s1.s_fio!=s2.s_fio) AND (s1.s_fio

    Последнее условие упорядочивает фамилии и исключает дублирование результатов.

    При внутреннем соединении все таблицы, поля которых указаны в SQL-запросе, являются равноправными. То есть каждой записи в первой таблице находилась соответствующая ей запись во второй таблице.

    При внешнем объединении (outer join ) в результирующий набор включаются записи независимо от того, есть ли соответствующее поле во второй таблице. Существует три типа внешнего объединения.

    1) LEFT OUTER JOIN … ON – левое, включает в результат все записи первой таблицы, даже те, для которых не имеется соответствия во второй.

    2) RIGHT OUTER JOIN … ON – правое, включает в результат все записи второй таблицы, даже те, для которых не имеется соответствия в первой.

    3) FULL OUTER JOIN … ON – полное, включает в результат объединение записей обеих таблиц, независимо от их соответствия.

    При внешнем соединении можно говорить о том, какая из таблиц является главной. В первом случае – левая, во втором – правая.

    Например. Пусть в таблице Sotrudniki БД Sotrudniki есть фамилии, имеющие должность, не указанную в таблице Doljn, и есть должности в таблице Doljn, для которых нет фамилии в таблице Sotrudniki. Тогда

    1) SELECT * FROM Sotrudniki LEFT OUTER JOIN Doljn

    ON S_doljn=D_code

    Результат включат все поля и таблицы Sotrudniki и таблицы Doljn. Число строк соответствует числу записей таблицы Sotrudniki. В строках, относящихся к записям, для которых в Doljn не нашлось соответствие, поля таблицы Doljn остаются пустыми.

    2) SELECT * FROM Sotrudniki RIGHT OUTER JOIN Doljn

    ON S_doljn=D_code

    Число строк соответствует числу записей таблицы Doljn. В строках, относящихся к записям, для которых в Sotrudniki не нашлось соответствие, поля таблицы Sotrudniki остаются пустыми.

    3) SELECT * FROM Sotrudniki FULL OUTER JOIN Doljn ON

    К строкам, относящимся к таблице Sotrudniki добавлены строки, относящиеся к таблице Doljn, для которых нет соответствия в таблице Sotrudniki.


    В SQL-запросе можно использовать запросы, вложенные в первый. Это можно применить и к операторам, возвращающих совокупные характеристики, и к операторам, возвращающим множество значений.

    Например,

    1) Определить всех однофамильцев в таблицах Sotrudniki и Sotrudniki1, имеющих одинаковую структуру:

    SELECT * FROM Sotrudniki

    WHERE S_fio IN (SELECT S_fio FROM Sotrudniki1)

    Вложенный оператор SELECT возвращает множество фамилий из таблицы Sotrudniki1, а конструкция WHERE основного оператора SELECT отбирает в таблице Sotrudniki те записи, которые имеются во множестве фамилий из таблицы Sotrudniki1.

    2) Вывести из БД Sotrudniki фамилию (фамилии) самого молодого сотрудника:

    SELECT S_Fio, EXTRACT(YEAR FROM S_Birthday)

    WHERE EXTRACT(YEAR FROM S_Birthday)=

    (SELECT max(EXTRACT(YEAR FROM S_Birthday))

    FROM Sotrudniki)

    Вложенный оператор SELECT возвращает максимальный год рождения, который используется в условии WHERE основного оператора SELECT.

    3) Вывести из БД Students все оценки конкретного студента, например, Петрова:

    SELECT S_fam, P_nazv, E_mark FROM

    Examination,Predm, Students

    WHERE E_student=(SELECT S_code FROM Students

    WHERE S_fam="Петров")

    AND E_Predm=P_code AND E_Student=S_code

    Во вложенной конструкции SELECT определяется код студента по фамилии "Петров", а последние условия обеспечивают исключение избыточности при внутреннем объединении таблиц.

    Связанные подзапросы. Во внутреннем запросе можно ссылаться на таблицу, имя которой указано в предложении FROM внешнего запроса. Такой связанный подзапрос выполняется по одному разу для каждой строки таблицы основного запроса.

    Например, получить сведения о предметах, по которым проводился экзамен конкретного числа, например, ‘14.01.2006’:

    SELECT * FROM Predm PR

    WHERE "14.01.2006" IN (SELECT E_date

    FROM Examination

    WHERE PR.P_code=E_predm)

    Эту же задачу можно решить с помощью операции соединения таблиц:

    SELECT DISTINCT P_nazv FROM Predm, Examination

    WHERE P_code=E_predm AND E_date= "14.01.2006"

    Пример. Вывести фамилию (фамилии) студента, получившего на экзамене оценку выше среднего балла

    SELECT DISTINCT S_fam FROM Students, Examination

    E_mark>(SELECT AVG(E_mark) FROM Examination)

    AND S_code=E_student

    В условии WHERE при работе с множествами записей можно использовать ключевые слова ALL и ANY. ALL - условие выполняется для всех записей, ANY - условие выполняется хотя бы для одной записи.

    Например ,

    1) вывести фамилии сотрудников из таблицы Sotrudniki, которые не старше любого сотрудника в таблице Sotrudniki1:

    WHERE S_birthday>= ALL (SELECT S_birthday

    FROM Sotrudniki1)

    2) вывести фамилии сотрудников из таблицы Sotrudniki, которые моложе хотя бы одного сотрудника в таблице Sotrudniki1:

    SELECT S_fio,S_birthday FROM Sotrudniki

    WHERE S_birthday> ANY (SELECT S_birthday FROM Sotrudniki1)

    Во вложенных конструкциях SELECT можно использовать ключевое слово EXISTS, которое означает отбор только тех записей, для которых вложенный запрос возвращает одно или более значений.

    Например,

    SELECT S_fio,S_birthday FROM Sotrudniki S1

    WHERE EXISTS (SELECT S_fio,S_birthday

    FROM Sotrudniki S2

    WHERE (S1.S_birthday=S2.S_birthday)

    AND (S1.S_code!=S2.S_code))

    Получение списка сотрудников, которые имеют хотя бы одного сверстника.



    © 2024 beasthackerz.ru - Браузеры. Аудио. Жесткий диск. Программы. Локальная сеть. Windows