- •ОГЛАВЛЕНИЕ
- •3. Простые варианты поиска данных
- •3.2. Использование ключевого слова DISTINCT
- •3.3. Предложение WHERE
- •4.1. Использование DISTINCT с COUNT
- •4.3. Предложение HAVING
- •5.2. Внешние соединения
- •6. ИСПОЛЬЗОВАНИЕ ПОДЗАПРОСОВ В ОПЕРАТОРАХ SQL
- •6.4. Использование оператора EXISTS
- •6.5. Использование варианта IN с подзапросами
- •6.6. Использование NOT EXISTS
- •8. ДОБАВЛЕНИЕ ДАННЫХ. КОМАНДА INSERT
- •8.1. Добавление отдельной строки
- •9. ОБНОВЛЕНИЕ УЖЕ ИМЕЮЩИХСЯ ДАННЫХ.
- •КОМАНДА UPDATE
- •10. УДАЛЕНИЕ ДАННЫХ ИЗ ТАБЛИЦ. КОМАНДА DELETE
- •11. ГЕНЕРАТОРЫ И ИХ ИСПОЛЬЗОВАНИЕ
- •11.1. Создание генераторов
- •ПРИМЕРЫ ЗАПРОСОВ
Юлий |
Альбертович |
Алексеев |
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 (заодно упорядочим вывод поимени) :
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, могут использо-