Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Информационное обеспечение систем управления. Построение запросов пр.pdf
Скачиваний:
4
Добавлен:
15.11.2022
Размер:
3.76 Mб
Скачать

Юлий

Альбертович

Алексеев

19.09.1974

Татьяна

Сергеевна

Бартош

02.12.1974

Александр

Анатольевич

Лебедев

03.04.1977

Татьяна

Владимировна

Алтынцева

03.09.1977

Оксана

Владимировна

Мельчакова

06.07.1978

Татьяна

Михайловна

Мосина

30.06.1979

Татьяна

Юрьевна

Шарапова

14.04.1980

Лариса

Вилльевна

Вашкарина

05.11.1980

Анна

Николаевна

Верхоланцева

06.10.1991

Наталья

Владимировна

Алавердян

 

Назгуль

Асановна

Алиева

 

Руслан

Рафаилович

Амерзянов

 

Ксения

Аркадьевна

Антонова

 

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

3.2. Использование ключевого слова DISTINCT

Выполните следующий оператор:

SELECT PRJNAME2 AS "Имя" FROM PERSON

Вы получите список из имен, среди которых есть много повто- ряющихся.

Замечание. Это, кстати, один из примеров нарушения прин-

7 " £ б ш ы 7 т ой7 гебры

L e -

27до77нп’Г ""

* "Ч»™» р а й о н н о й алгеб-

отношением

ттЖе отношете. Однако то. что мы получили,

строки

 

потому что содержит и одинаковые

Чтобы убрать ненужные нам повторы, необходимо в оператор

ввести ключевое слово DISTINCT (заодно упорядочим вывод поимени) :

PR_NAME2AS "Имя"

SELECT DISTINCT FROM PERSON ORDER BY PR_NAME2;

Теперь мы получим список из 62 имен, среди которых не будет ювторяющихся.

 

 

Листинг 6

 

Список всех имен (без повторов)

Имя

Имя

Имя

Алевтина

Екатерина

Николай

Александр

Елена

Нина

Алексей

Илья

Оксана

Альбина

Ирина

Олег

Амина

Кирил

Ольга

Анастасия

Константин

Павел

Ангелина

Ксения

Петр

Анна

Лариса

Руслан

Антонина

Лиана

Светлана

Валентина

Лилия

Семен

Валерий

Нина

Сергей

Василий

Любовь

Станислав

Вера

Людмила

Тарас

Виктория

Максим

Татьяна

Владимир

Марианна

Эдуард

Вячеслав

Марина

Эльвира

Галина

Мария

Эмма

Гульнара

Михаил

Юлиана

Дмитрий

Надежда

Юлий

Евгений

Назгуль

Юлия

Евгения

Наталья

Я вар

3.3. Предложение WHERE

Предложение WHERE позволяет задать условие, на основании которого строки таблицы будут попадать в результирующий набор данных. Строка помещается в выходной набор данных, если она удовлетворяет указанному, подчас довольно сложному, условию. При отсутствии этого предложения в выходной набор данных по­ мещаются все строки исходной таблицы (таблиц).

Следует отдавать себе отчет, что выражение в предложении WHERE является логическим выражением, возвращающим значе­ ние TRUE, FALSE или UNKNOWN. В выборку будут попадать только те записи таблицы, для которых это выражение дает истин­ ный результат (TRUE). Соответственно, к выражению применимы все законы исчисления высказываний. На практике чаще всего ис­ пользуется закон де Моргана, про который далее мы скажем не­ сколько слов.

Надо еще помнить, что операции сравнения, в которых прини­ мают участие пустые значения (NULL), никогда не дают истинного значения. Для таких столбцов дополнительно следует также ис­ пользовать проверку типа IS NULL или IS NOT NULL.

Вся мощь оператора SELECT в реляционных базах данных проявляется в первую очередь в предложении WHERE. Из большо­ го, а временами - очень большого, количества исходных данных оператор позволяет выбрать релевантный (т. е. соответствующий потребностям пользователя) объем данных.

Синтаксис предложения WHERE

Начальное определение синтаксиса предложения WHERE просто:

WHERE <условия поиска>

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

<условия поиска> ::= <значение> <оператор> {<значение> | (<выбор одного>)}

| <значенив> [NOT] BETWEEN <значение> AND <значе-

ние>

 

 

| <значение> [NOT] LIKE <значение>

 

I

<значение> [NOT] IN (<значенив> [ <значение>]

\

<список выбора>)

 

| <значение> IS [NOT] NULL

 

j <значение> <onepamop> {ALL \ SOME \ ANY] (<выбор

списка значений одного столбца>)

 

|

EXISTS (<список выбора>)

 

|

SINGULAR (<список выбора>)

 

| <значение> [NOT] CONTAINING <значение>

 

| <значение> [NOT] STARTING [WITH] <значение>

 

|

<значение> <оператор> {ALL \ SOME \ ANY] (<выбор

списка значений одного столбца>) | EXISTS (<список выбора>)

j SINGULAR (<список выбора>) | (<условия поиска>)

j NOT <условил поиска>

| <условия поиска> OR <условия поиска>

| <условия поиска> AND <условия поиска>

Здесь <оператор> — один из допустимых операторов сравне­ ния: =, <, >, <=, >=, !<, !> о,!=. Восклицательный знак использует­ ся в этих операторах как отрицание. Кроме того, в этом качестве также используется и символ Л. К перечню операторов сравнения следует также добавить и следующие: Л=, л>, л<.

<значение> { <имя столбца>

| <константа> \ <выражение> \ <функция>

| NULL }

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

Не спеша просмотрим по порядку возможные варианты выбора нужных нам строк.

Использование операторов сравнения

Рассмотрим использование операторов сравнения в конструкции:

<значение> <оператор> {<значвние> \ (<выбор одного>)}

Операторы сравнения применимы к любым типам данных, кроме BLOB.

Выполним следующий оператор выборки всех данных из таб­ лицы PERSON, SELECT * FROM PERSON.

Как мы уже видели в листинге 1, получаем список всех имею­ щихся у нас личностей. Обычно требуется не весь список, а список, отобранный по какому-нибудь критерию. Предложение WHERE позволяет задать условие поиска — условие, на основании которого в результат выборки будут попадать данные из базы данных.

Найдем всех Татьян, данные о которых хранятся в базе дан­ ных:12

SELECT * FROM PERSON

WHERE PRJNAME2 = 'Татьяна'

 

 

 

 

Листинг 7

 

 

Список всех Татьян

 

PR_CODE

PRJ4AME

PRJ4AME2

PRJ4AME3

PR_BIRTHDAY

13

Беспалова

Татьяна

Евгеньевна

21.12.1965

77

Соснина

Татьяна

Александровна

05.12.1968

93

Хемлих

Татьяна

Владимировна

25.10.1953

104

Шарапова

Татьяна

Юрьевна

14.04.1980

118

Алтынцева

Татьяна

Владимировна

03.09.1977

121

Арсентьева

Татьяна

Сергеевна

10.09.1954

124

Баландина

Татьяна

Анатольевна

11.01.1955

126

Бартош

Татьяна

Сергеевна

02.12.1974

143

Веремчук

Татьяна

Валерьевна

23.08.1948

146

Владысик

Татьяна

Викторовна

19.10.1960

173

Звездина

Татьяна

Александровна

01.10.1961

175

Зырянова

Татьяна

Геннадьевна

22.01.1970

216

Леушина

Татьяна

Фёдоровна

04.05.1963

223

Мазеина

Татьяна

Александровна

06.04.1969

230

Мосина

Татьяна

Михайловна

30.06.1979

236

Некрасова

Татьяна

Николаевна

04.12.1949

Теперь рассмотрим использование условий Найдем всех рожденных после 1.01.1970:13

SELECT PRJNAME2

AS "Имя",

 

 

PRJNAME3

AS "Отчество",

 

 

PR_NAME

AS "Фамилия",

 

 

PRJBIRTHDAYAS "Дата рождения"

FROM PERSON

 

 

WHERE

PR_BIRTHDAY> '1.01.1970'

 

ORDER BY

PRJBIRTHDAY, PR NAME

 

 

 

 

Листинг 8

 

Список всех рожденных после 1.01.1970

Имя

 

Отчество

Фамилия

Дата рождения

Татьяна

Геннадьевна

Зырянова

22.01Л 970

Максим

Владимирович

Бычков

08.09Л 970

Юлий

Альбертович

Алексеев

19.09.1974

Татьяна

Сергеевна

Бартош

02.12.1974

Александр

Анатольевич

Лебедев

03.04.1977

Татьяна

Владимировна

Алтынцева

03.09.1977

Оксана

Владимировна

Мельчакова

06.07.1978

Татьяна

Михайловна

Мосина

30.06.1979

Татьяна

Юрьевна

Шарапова

14.04.1980

Лариса

Вилльевна

Вашкарина

05.11.1980

Анна

Николаевна

Верхоланцева

06.10.1991

Объединим оба предыдущих условия, т.е. найдём всех Татьян, рожденных после даты “ 1.01.1970”:14

SELECT PRJNAME2 AS "Имя", PRJNAME3 AS "Отчество",

PRJNAME AS "Фамилия", PRJBIRTHDAY AS "Дата рождения"

FROM PERSON

WHERE (PRJNAME2 = 'Татьяна') AND (PR_BIRTHDAY > 4.01.1970)

ORDER BY PRBIRTHDA Y, PRJNAME

 

 

 

Листинг 9

 

Список Татьян, рожденных после 1.01.1970

Имя

Отчество

Фамилия

Дата рождения

Татьяна

Геннадьевна

Зырянова

22.01.1970

Татьяна

Сергеевна

Бартош

02.12.1974

Татьяна

Владимировна

Алтынцева

03.09.1977

Татьяна

Михайловна

Мосина

30.06.1979

Татьяна

Юрьевна

Шарапова

14.04.1980

Использование варианта BETWEEN

Близок к операторам сравнения вариант BETWEEN, который выглядит следующим образом:

<значение> [NOT] BETWEEN <значение> AND <значение> Это применимо как к числовым, так и к строковым столбцам,

дате, времени — ко всем, за исключением BLOB. Этот вариант тре­ бует, чтобы значение находилось в указанном диапазоне, включая граничные значения.

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

не от 1.01.1960 до 31.12.1969:15

 

SELECT

РRENAME2

AS "Имя",

 

 

PR_NAME3

AS "Отчество",

 

 

PR_NAME

AS "Фамилия",

 

 

PR BIRTHDAYAS "Датарождения"

FROM

PERSON

 

 

WHERE PRJBIRTHDAYBETWEEN '1.01.1960'AND '31.12.1969'

ORDER В Y PRJ31RTHDA Y, PR_NAME

 

В результате получаем следующий список.

 

 

 

 

Листинг 10

Список рожденных в диапазоне от 1.01.1960 до 31.12.1969

Имя

Отчество

Фамилия

Дата рождения

Татьяна

Викторовна

Владысик

19.10.1960

Светлана

Александровна

Ветошкина

23.12.1960

Татьяна

Александровна

Звездина

01.10.1961

Татьяна

Фёдоровна

Леушина

04.05.1963

Олег

Владимирович

Лядов

07.06.1964

Оксана

Васильевна

Власова

11.02.1965

Надежда

Александровна

Зеленина

11.12.1965

Татьяна

Евгеньевна

Беспалова

21.12.1965

Татьяна

Александровна

Соснина

05.12.1968

Татьяна

Александровна

Мазеина

06.04.1969

Понятно, что такого же результата можно было бы добиться введя запрос:16

SELECTPR_NAME2

AS "Имя",

 

PR_NAME3

AS "Отчество",

PR_NAME

AS "Фамилия",

PR_BIRTHDAYAS "Дата рождения"

FROM PERSON

 

>= 4.01. I9601 AND

WHERE

PR_BIRTHDAY

PR BIRTHDAY

< = ’31.12.1969'

 

ORDER B Y PR_BIRTHDAY, PR_NAME

Результат будет такой же, но вариант запроса с использованием BETWEEN - намного более выразительный.

Замечание. Логическое выражение в предложении WHERE нашего примера содержит только операторы конъюнкции (логиче­ ское И). По этой причине я здесь не использую скобок. Вообще же очень рекомендую всегда использовать скобки для явного задания порядка выполнения любых операторов, в особенности логических. Скобки совершенно необходимы, когда у вас довольно сложное ло­ гическое выражение. Иначе выяснение причин, почему неверно осу­ ществляется выборка данных, моэ/сет затянуться на длительное время.

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

Проверка на присутствие в списке значений (вариант IN)

В варианте ГЫ вы можете задать список, среди элементов кото­ рого должно (или не должно) находиться значение указанного столбца:

<значение> [NOT] IN ({<значение> [ <значенив>]

\

<список выбора>})

 

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

Найдем из нашего списка всех Юль, Юлиев и Юлиан:17

SELECT PRJNAME2 AS ".Имя",

PRJNAME3 AS "Отчество”,

PRJNAME AS "Фамилия",

PR_BIRTHDAYAS "Дата рождения" FROM PERSON

WHERE PR_NAME2 IN (Юлий', Юлия', Юлиана')

 

 

 

Листинг 11

 

Список Юль, Юлиев и Юлиан

 

Имя

Отчество

Фамилия

Дата рождения

Юлий

Альбертович

Алексеев

19.09.1974

Юлия

Геннадьевна

Проскурякова

29.09.1974

Юлия

Игоревна

Шатрова

03.04.1958

Юлия

Владимировна

Янышева

 

Юлия

Дмитриевна

Гаевская

07.01.1959

Юлиана

Валерьевна

Коршунова

02.03.1950

Юлия

Валерьевна

Кудинова

29.05.1981

Юлия

Владимировна

Лаврова

08.10.1949

Юлия

Анатольевна

Луковникова

06.12.1979

Юлия

Владимировна

Мясникова

01.09.1961

Юлия

Витальевна

Оборина

02.10.1984

Тот же самый результат можно было бы получить, введя запрос с операторами сравнения: 18

SELECT PR_NAME2 AS "Имя", PRJNAME3 AS "Отчество", PRJNAME AS "Фамилия",

PR BIRTHDAYAS "Дата рождения" FROM PERSON

WHERE PRJNAME2 - Юлий' OR

P R N A M E 2 = Юлия' OR

P R N A M E 2 = Юлиана'

Проверка на пустое значение

Если столбцы ваших таблиц, входящих в условие поиска, могут иметь пустое значение, то вам следует проявлять бдительность, за­ давая проверку их значений на NULL. Всегда следует перед выпол­ нением «нормальных» проверок уточнить, не является ли значение пустым. Мы можем использовать два варианта:

<значение> IS NULL

и

<значение> IS NOT NULL

Еще раз повторю, это действительно может стать источником больших ошибок — перед обычной, нормальной, проверкой прове­ ряйте значения на NULL.

Поиск в строковых столбцах

Для строковых значений используются варианты LIKE, CONTAINING и STARTING WITH. Напомню синтаксис:

| <значение> [NOT] LIKE <значение>

| <значение> [NOT] CONTAINING <значение>

| <значение> [NOT] STARTING [WITH] <значение>

Вариант LIKE

В варианте LIKE строковое значение должно содержать ука­ занные символы.

В этом варианте можно использовать шаблонные символы: процент (%) означает любое, в том числе и нулевое, количество лю­ бых символов, знак подчеркивания (__) означает ровно один любой символ. LIKE является чувствительным к регистру, т.е. раз­ личает строчные и прописные буквы. На самом деле, это неприятное ограничение можно очень легко и безболезненно обойти, применяя для имени столбца, используемого в выражении, функцию UPPER, которая возвращает все буквенные данные в верхнем регистре в лю­ бом допустимом для набора используемых символов алфавите.

Выберем строки из таблицы PERSON, введя условие, по кото­ рому фамилия должна заканчиваться на «ов». Для этого перед бук­ вами «ов» используем шаблонный символ %.

SELECT PR_NAME2

AS "Имя",

 

 

PR_NAME3

AS "Отчество",

 

PRJNAME AS "Фамилия"

FROM PERSON

 

 

WHERE PR_NAME LIKE '%oe'

 

Получаем следующий список:

 

 

 

 

Листинг 12

 

Выборка людей в варианте LIKE '%ов'

Имя

Отчество

Фамилия

Максим

Владимирович

 

Бычков

Олег

Владимирович

 

Лядов

Евгений

Андреевнич

 

Болотов

Олег

Сергеевич

 

Феофилактов

Явар

Гейдар

 

Джафаров

Александр

Михайлович

 

Жданов

Алексей

Викторович

 

Лобанов

Сергей

Анатольевич

 

Лубов

Алексей

Олегович

 

Львов

Станислав

Витальевич

 

Приданников

Сергей

Анатольевич

 

Ременников

Эдуард

Владимирович

 

Седов

Олег

Николаевич

 

Фролов

Александр

Александрович

 

Чудинов

Николай

Викторович

 

Шатров

Руслан

Рафаилович

 

Амерзянов

Константин

Игоревич

Баталов

Сергей

Валерьевич

Бутаков

Василий

Александрович

Глазов

Дмитрий

Федорович

Глумов

Михаил

Валерьевич

Ермаков

Максим

Владимирович

Захаров

Илья

Борисович

Карманов

Владимир

Николаевич

Карпов

Вячеслав

Валерьевич

Красногоров

Станислав

Евгеньевич

Кузнецов

Олег

Александрович

Куликов

Максим

Николаевич

Кучеров

Владимир

Николаевич

Лобанов

Дмитрий

Алексеевич

Назаров

Дмитрий

Аресентьсвич

Наумов

Эдуард

Булатович

Нигаметзянов

Алексей

Викторович

Спешков

Петр

Сергеевич

Теплоухов

Расширим условие поиска, выполним:20

SELECT PR NAME2 AS "Имя",

PR_NAME3 AS "Отчество",

PRJNAME AS "Фамилия" FROM PERSON

WHERE UPPER(PR_NAME) LIKE %oe%'

Мы добавили еще знак процента в условие: LIKE %ов%, т. е. не только до, но и после символов «ов» может располагаться любое,

втом числе и нулевое, количество любых символов. Теперь мы также получаем и женские фамилии.

Поскольку вариант LIKE является чувствительным к регистру,

увас, казалось бы, должны быть сложности при поиске данных, ес­ ли вы не следовали моим советам и не вводили подобные строки

вверхнем регистре. На самом деле, ничего особенно страшного не произойдет. Даже если данные у вас введены вперемежку и про­ писными и строчными буквами, вы можете использовать функцию UPPER, которая переведет все буквы строки в верхний регистр. По­ вторю — это относится только к символам алфавита, поддерживае­ мого вашим набором символов для этого столбца. Предыдущий за­

прос можно записать следующим образом:21

SELECT PRJNAME2 AS ".Имя", PR_NAME3 AS "Отчество", PRJNAME AS "Фамилия" FROM PERSON

WHERE UPPER(PR_NAME) LIKE '%oe%'

Теперь покажем, как воспользоваться знаком подчеркивания (_). Найдем всех людей, у которых «ов» начинается со второго символа:"2

SELECT PRJNAME2 AS "Имя", PRJNAME3 AS "Отчество", PRJNAME AS "Фамилия" FROM PERSON

WHERE UPPER(PR_NAME) LIKE ‘_oe% ‘

В результате получим:

Листинг 13

Список людей, у которых в фамилии после первого символа следует «ов» (выборка в варианте LIKE 'ов%')

Имя

Отчество

Фамилия

Вера

Валерьевна

Новикова

Марина

Рафаиловна

Новикова

Ольга

Викторовна

Новосёлова

Использование логических операций в условиях поиска

Вот последние четыре строки в описании синтаксиса предло­ жения WHERE:

| (<условия поиска>)

| NOT <условия поиска>

| <условия поиска> OR <условия поиска>

| <условия поиска> AND <условия поиска>

Это означает, что любую правильную часть условия можно за­ ключать в круглые скобки и что можно строить сколь угодно слож­ ные логические условия, используя операции отрицания (NOT), дизъюнкции (OR) и конъюнкции (AND).

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

ошибки.

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

NOT (A AND д) = NOT (A) OR NOT (В)

NOT (A OR В) = NOT (A) AND NOT (В)

Таким образом, отрицание конъюнкции двух высказываний (в нашем случае —- условий, которые так же, как и высказывания, возвращают истинностное значение - «истина» или «ложь» равно дизъюнкции отрицаний этих высказываний. Отрицание дизъюнк­ ции равно конъюнкции отрицаний. Знание этого существенно уп­ рощает выполнение преобразований условий.

Замечание. Тот факт, что в SQL используется не двухзначная, а трехзначная логика, ничего не меняет в используемых нами зако­ нах исчисления высказываний. В случае допустимости у столбцов пустых значений мы должны лишь проверить нужные нам столб­ цы на NULL. Этого достаточно.

Рассмотрим пример. Чуть раньше мы отображали список тех,

чья дата рождения находится в диапазоне от 1.01.1960 до

31.12.1969. Мы использовали следующий оператор:

SELECT PR

NAME2

AS "Имя",

PR

NAME3

AS "Отчество",

PRJNAME

AS "Фамилия",

PR BIRTH DA Y

AS "Дата рождения"

FROM PERSON

>= Ч.01.I960' AND

WHERE

PR B IR TH D A Y

PRJBiRTHDAY

<= '31.12.1969'

 

Если же нам нужен список людей с датами рождения, не вхо­ дящими в этот диапазон (т. е. находящимися в точности за предела­ ми этого диапазона), то мы должны выполнить отрицание выраже­ ния:

PR_BIRTHDAY >= ’1.01.1960’ AND PR BIRTHDAY <= ‘31.12.1969’

В соответствии с законом де Моргана мы получаем оператор:23

SELECT PR_NAME2

AS "Имя",

PRJNAME3

AS "Отчество",

PR_NAME

AS "Фамилия",

PR_BIRTHDAY

AS "Дата рождения"

FROM PERSON

WHERE (PR_BIRTHDAY < '1.01.1960' OR PRJBIRTHDAY

> '31.12.1969')

Здесь нам нужно выполнить отрицание нашего выражения, за­ дающего условия для окладов сотрудников. Отрицанием для опера­ ции сравнения >= будет < (или !>= или Л>=), для операции <= отри­ цанием будет > (!<=, Л <=)• Конъюнкцию мы меняем на дизъюнк­ цию.

Если кому-то вдруг по непонятной причине не очень нравится использование фактов из математической логики, то в данном слу­ чае легко можно использовать вариант BETWEEN, что мы и делали раньше:

PR_BIRTHDAYBETWEEN '1.01.1960'AND '31.12.1969'

для задания первоначального диапазона и

PRJBIRTHDAY NOT BETWEEN '1.01.1960'AND '31.12.1969'

для дат рождения за пределами этого диапазона. Применение закона де Моргана в этом случае выполнит сам сервер базы данных.

Порядок выполнения логических операций

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

1.Выполняются действия в скобках.

2.Арифметические операции умножения и деления.

3.Арифметические операции сложения и вычитания.

4.Отрицание (NOT).

5.Конъюнкция (AND).

6.Дизъюнкция (OR).

Операции с одинаковым приоритетом выполняются слева на­ право.

В ряде случаев при выборке данных из базы с ними необходи­ мо произвести некоторые преобразования. Функция CAST обеспе­ чивает преобразование данных к явно указанному типу:

CAST (<val> AS <datatype>), где <val> - преобразуемое выра­ жение, <datatype> - явно указываемый тип данных.

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

В некоторых случаях преобразование типов является обяза­ тельным, например при использовании объединения запросов - UNION.

4. ОБОБЩЕНИЕ ДАННЫХ С ПОМОЩЬЮ АГРЕГАТНЫХ ФУНКЦИЙ

Запросы могут производить обобщенное групповое значение полей точно так же, как и значение одного поля. Это делается с по­ мощью агрегатых функций. Агрегатные функции производят оди­ ночное значение для всей группы таблицы. Имеется список этих функций:

Функция

Выполняемые действия

AVG

Возвращает среднее значение данных числовых столбцов

COUNT

Подсчитывает количество строк, удовлетворяющих заданно­

му условию

 

MIN

Находит минимальное значение столбца в группе строк

MAX

Находит максимальное значение столбца в группе строк

SUM

Суммирует числовые значения

Агрегатные

функции используются подобно именам полей

в предложении SELECT запроса, но с одним исключением, они бе­ рут имена поля как аргументы. Только числовые поля могут ис­ пользоваться с SUM и AVG. COUNT, МАХ и MIN, могут использо-