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

iDevice ikoon 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;