2.6.2 Использование дополнительных предложений

Приказ обновления данных позволяет одновременно обновлять несколько строк и столбцов таблицы. Выбор строки производится при помощи предложения where, который следует четко показать в запросе обновления столбца.
В следующем примере обновляют фамилии, имена всех студентов, чей код равен 2; если уникальный индекс определен как код (см. определение индекса у соответствующего примера), то будет обновлена только одна запись (или ни одной, если нет студентов с кодом 2).
Пример: |
update tudengid set perenimi="Juurikas" and eesnimi="Piret" where tkood=2; |
До сих пор мы рассматривали приказы изменения данных, теперь станем исследовать, как необходимую информацию вывести из таблицы. Для этого используют широкоиспользуемый оператор select, который является и очень гибким:
select ( colname, ...) from tname [where ...] [group by (colname, ...)] [order by (colname, ...)] [having ...] [into [temp] table tname];
используемые обозначения:
colname - имя столбца;
tname - имя таблицы, из которой выбираются данные;
where -
предложение, которое было описано при описании вышеупомянутых приказов delete и update;
having -
несколько похожа на where, но оцениваются частичные результаты.
Предложение order by позволяет выводить данные, располагая их в определенном порядке, в то же время предложение group by позволяет группировать данные. В таких приказах, где используются все перечисленные предложения, where применяется в первую очередь, затем order by и group by и только тогда предложение having.
Учитывая сложность и гибкость приказа select, рассмотрим несколько различных примеров. В первом примере покажем, как выбрать всю информацию из таблицы: звездочка вместо наименования столбца указывает, что все столбцы таблицы, должны быть выбраны. Отсутствие предложения where позволяет выбрать все строки.
Пример: |
select * from tudengid; |
Во втором примере выбираются имена и фамилии всех студентов, которые были старше 18 лет по состоянию на 31 декабря 2003-го года. Результаты упорядочиваются по фамилии и имени. Обратите внимание: последовательность столбцов в приказе необходимо указать посредством order by.
Пример: |
select perenimi, eesnimi from tudengid where synnipaev <="31.12.1985" order by perenimi, eesnimi; |
В третьем примере сгруппированы все студенты с одним и тем же именем; выбирается имя вместе с числом студентов с тем же именем. Функция подсчета count(*) возвращает количество сгруппированных строк. В примере не используется предложение where, хотя можно было бы и использовать.
Пример: |
select eesnimi, count(*) from tudengid group by eesnimi order by eesnimi; |
Четвертый пример показывает, как использовать предложение having для выборки редко встречающихся имен или для выборки имен, встречающихся только один раз.
Пример: |
select eesnimi, count(*) from tudengid group by eesnimi order by eesnimi having count(‘)=1; |
В пятом примере выбираются фамилии и имена студентов, принимающих участие в учебном предмете. Это осуществляется путем установления отношений между таблицами студентов и учебных предметов. Для того чтобы понять запрос, следует знать, что таблица учебных предметов содержит столбцы предмета и студента (студент участвует в учебном предмете). Исследуя запрос, можно заметить в нем есть два столбца под названием «имя» - эти столбцы отличимы друг от друга, поскольку имя таблицы находится до имени столбца, и их соединяет промежуточная точка. Этот синтаксис также используется для указания условий в предложении where, но это используется только для ясности (можно без проблем написать where tudeng = kood). Для понимания, как работает запрос, давайте посмотрим, как СУБД его выполняет:
- Находят прямое произведение между таблицами учебного предмета и студентов
- Выбирает только те строки, где значение столбца «студент» равно значение столбца «код»
- Создается проекция, которая стирает все неподходящие столбцы
- Делается запрос на основе выбранных столбцов (oppeained.tudeng, tudengid.eesnimi, фамилия) полученной таблицы.
Все эти операции соответствуют естественному соединению (естественная связь).
Пример: |
select oppeained.eesnimi, perenimi, tudengid.eesnimi from oppeained, order by oppeained.eesnimi, perenimi, tudengid.eesnimi where oppeained.tudeng=tudengid.kood; |
Шестой и последний пример использует пятый пример и проводит его усовершенствования так, чтобы также позволить выбрать предметы, где нет зарегистрировавшихся студентов. В этом случае, строки содержат данные предмета и те строки, где данные студента отсутствуют (поскольку студенты не участвуют в предмете). С точки зрения команды достаточно, если добавить слово outer перед именем таблицы студентов. Этот тип связности есть внешнее соединение - outer join или левое соединение - left join.Синтаксис внешнего соединения может быть гораздо сложнее и может зависеть от используемого стандарта языка SQL.
Пример: |
select oppeained.eesnimi, perenimi, tudengid.eesnimi from oppeained, outer tudengid order by oppeained.eesnimi, perenimi, tudengid.eesnimi where oppeained.tudeng=tudengid.kood; |