- •ОГЛАВЛЕНИЕ
- •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. Создание генераторов
- •ПРИМЕРЫ ЗАПРОСОВ
бится за один раз такое количество записей, поскольку просмотреть их вы просто физически не сможете, а во-вторых, выборка больших объемов данных на сервере приводит к увеличению сетевого тра фика и перегрузке сети.
Необязательное предложение GROUP BY <имя столбца> группирует найденные строки в соответствии со значением указан ного столбца.
Необязательное предложение HAVING <условия поиска> оп ределяет дополнительные условия поиска для использования в GROUP BY.
Необязательное предложение ORDER BY <список имен> по зволяет упорядочить найденные строки, указывая список имен столбцов (здесь опять же можно использовать уточненные имена в виде <имя таблицы>. <имя столбца>), а также направление сор тировки для каждого столбца — ключевые слова ASCENDING (по возрастанию) или DESCENDING (по убыванию).
Для разъяснения содержания запроса в любом месте может быть размещен комментарий - произвольный текст, ограниченный парой символов, спереди / *, сзади */ (так же как в языке С).
Синтаксис: |
|
/ ♦ т е к с т |
.*/ |
Текст комментария может занимать несколько строк.
Многие СУБД допускают удобный способ комментирования при помощи пары символов «—», текст от этой пары до конца стро ки будет считаться комментарием.
3. Простые варианты поиска данных
Рассмотрим вначале наиболее простые варианты использова ния оператора. Мы будем отыскивать данные каждый раз только в одной из таблиц базы данных.
Сразу после ключевого слова SELECT указывается список вы бора — список столбцов таблицы, литералов, констант или выра жений, которые попадут в результирующий набор данных.
В самом простом варианте оператора SELECT можно указать вместо списка отображаемых столбцов символ *, например:1
SELECT * FROM PERSON
Этот оператор возвращает все столбцы всех строк таблицы
PE R S O N .
|
|
|
|
Листинг 1 |
Выбор всех столбцов всех строк таблицы людей |
||||
PR_CODE |
PRJNAME |
PRJ4AME2 |
PRJNAME3 |
PR_BIRTHDAY |
1 |
Зеленина |
Надежда |
Александровна |
11.12.1965 |
2 |
Бычкопа |
Марина |
Валентиновна |
01.04.1957 |
3 |
Мельчакова |
Оксана |
Владимировна |
06.07.1978 |
4 |
Бычков |
Максим |
Владимирович |
08.09.1970 |
5 |
Попутько |
Павел |
Павлович |
05.05.1959 |
6 |
Лебедев |
Александр |
Анатольевич |
03.04.1977 |
7 |
Баранкина |
Елена |
Алевтиновна |
01.02.1952 |
8 |
Лядов |
Олег |
Владимирович |
07.06.1964 |
9 |
Вашкарина |
Лариса |
Вилльевна |
05.11.1980 |
10 |
Верхоланцева |
Анна |
Николаевна |
06.10.1991 |
11 |
Алексеев |
Юлий |
Альбертович |
19.09.1974 |
Следует исключить из списка коды личностей, которые обыч ному человеку ничего не говорят. Выполним оператор в следующем виде2:
SELECT PR_NAME, PR_NAME2, PR_NAME3, PR_BIRTHDAY FROM PERSON
Мы получим те же записи. Каждая будет содержать фамилию, имя, отчество и дату рождения человека.
Заголовки нам с вами, как проектировщикам таблиц нашей ба зы данных, понятны. Однако другим людям следует долго объяс нять, что это такое. Лучше сразу сформировать заголовки на рус ском языке. Выполните3:
SELECT PRJNAME2 |
AS "Имя", |
PRJNAME3 |
AS "Отчество", |
PR_NAME |
AS "Фамилия", |
PR_BIRTHDAYAS "Дата рождения"
FROM PERSON
Результат станет более понятным, заголовки содержат пра вильные тексты.
|
|
|
Листинг 1 |
|
Добавление осмысленных заголовков |
||
Имя |
Отчество |
Фамилия |
Дата роодения |
11адежда |
Александровна |
Зеленина |
11.12.1965 |
Марина |
Валентиновна |
Бычкова |
01.04.1957 |
Оксана |
Владимировна |
Мельчакова |
06.07.1978 |
Максим |
Владимирович |
Бычков |
08.09.1970 |
Павел |
Павлович |
Попутько |
05.05.1959 |
Александр |
Анатольевич |
Лебедев |
03.04.1977 |
Елена |
Алевтиновна |
Баранкина |
01.02.1952 |
Олег |
Владимирович |
Лядов |
07.06.1964 |
Лариса |
Вилльевна |
Вашкарина |
05.11.1980 |
Анна |
Николаевна |
Верхоланцева |
06.10.1991 |
Юлий |
1Альбертович |
Алексеев |
19.09.1974 |
Замечание. Обратите, пожалуйста, внимание на вид, в кото ром представляются операторы SELECT в этой главе. Вместо то го чтобы даже короткие операторы размещать на одной строке, старайтесь отдельные группы переносить на новые строки. SQL позволяют для ввода любого оператора использовать произвольное количество строк.
В списке выбора могут присутствовать не только имена столб
цов, но и константы или литералы (строки). Выполните следующий оператор4:
SELECT PR_NAME2 |
AS "Имя", |
PR_NAME3 |
AS "Отчество", |
'Фамилия:' |
AS "Текст", |
PR NAME |
AS "Фамилия", |
FROM PER7 ™ RTHMYAS "ДЗта Рожденм’
слх,кахРХ Х ь ^ Г „ ™ Г Г “ к Г - ’' T UбУДЭТ B° ВСеХ!
И присвоили заголовок «Текст». |
«Фамилия». Ему мы |
Добавление в результат выбора текстовой строки «Фамилия:»
Имя |
Отчество |
Текст |
Фамилия |
Дата рождения |
Надежда |
Александровна |
Фамилия: |
Зеленина |
11.12.1965 |
Марина |
Валентиновна |
Фамилия: |
Бычкова |
01.04.1957 |
Оксана |
Владимировна |
Фамилия: |
Мельчакова |
06.07.1978 |
Максим |
Владимирович |
Фамилия: |
Бычков |
08.09.1970 |
Павел |
Павлович |
Фамилия: |
Попутько |
05.05.1959 |
Александр |
Анатольевич |
Фамилия: |
Лебедев |
03.04.1977 |
Клена |
Алевтиновна |
Фамилия: |
Варанкина |
01.02.1952 |
Олег |
Владимирович |
Фамилия: |
Лядов |
07.06.1964 |
Лариса |
Вилльсвна |
Фамилия: |
Вашкарина |
05,11.1980 |
Анна |
Николаевна |
Фамилия: |
Верхоланцева |
06.10.1991 |
Юлий |
Альбертович |
Фамилия: |
Алексеев |
19.09.1974 |
Как это будет использоваться, покажем позднее, при исследо вании ключевого слова UNION.
В вывод может попадать не только столбец, но и результат ка ких-либо действий над столбцами: для примера, вместо имени, от чества и фамилии мы можем вывести один столбец, содержащий результат объединения имени, отчества и фамилии из таблицы PERSON, добавив между ними пробелы (соединение нескольких строк осуществляем при помощи операции конкатенации —II)5:
SELECT PR_NAME2 |
|| " || PR NAME3 II " |
II PR NAME |
AS "ФИО", |
~ |
- |
PR_BIRTHDAYAS "Дата рождения"
FROM PERSON
В результате выполнения запроса получим
Список людей с использованием соединения имени, отчества и фамилии при помощи операции конкатенации
ФИО |
Дата рождения |
Надежда Александровна Зеленина |
11.12.1965 |
Марина Валентиновна Бычкова |
01.04.1957 |
Оксана Владимировна Мельчакова |
06.07.1978 |
Максим Владимирович Бычков |
08.09.1970 |
Павел Павлович Попутько |
05.05.1959 |
Александр Анатольевич Лебедев |
03.04.1977 |
Елена Алевтиновна Варанкина |
01.02.1952 |
Олег Владимирович Лядов |
07.06.1964 |
Лариса Вилльевна Вашкарина |
05.11.1980 |
Анна Николаевна Верхоланцева |
06.10.1991 |
Юлий Альбертович Алексеев |
19.09.1974 |
3.1. Упорядочение результата запроса. Предложение ORDER BY
По определению результат отображения никак не упорядочива ется. Мы можем видеть, что в нашем случае он соответствует по рядку помещения записей в базу данных (это видно по возрастанию значения первичного ключа, кода человека), однако никакого по рядка реляционные базы данных не гарантируют.
Чтобы явно задать нужный нам порядок, в оператор следует ввести предложение ORDER BY. В предложении перечисляются имена столбцов таблицы или порядковые номера столбцов, указан ных в списке выбора. По умолчанию сортировка выполняется порядке, как если бы вы задали ключевое слово ENDING* однако для различных столбцов в одном и том же
чевое °^ювс»И DESCF^nh^r^^n " убывающий порадок, задав клю-
ESCENDING. Для ключевого слова ASCENDING
допустимо сокращение ASC, для DESCENDING — DESC
OR^ER&nRYOI/ < ER BY ИМебТ следУющий синтаксис:
l<ASC[ENDINe]\DbUC[ENDM3]]}Ua> 1 <НОШР столб«а>;
Помимо имен столбцов в этом предложении мы можем указать и порядковые номера столбцов в списке выбора. Столбцы в списке нумеруются начиная с единицы. Чтобы можно было использовать номера столбцов, вы должны явно перечислить столбцы в списке выбора. Вариант * в этом случае недопустим.
Что интересно, столбцы, по которым выполняется сортировка данных, вовсе не обязательно должны быть включены в состав вы бираемых столбцов, хотя и не совсем понятно, кому это может по надобиться. Такую сортировку допускают делать далеко не все ре ляционные базы данных.
Рассмотрим примеры с нашей таблицей людей. Введите и вы полните6:
SELECT PR_NAME2 |
AS "Имя", |
PR_NAME3 |
AS "Отчество", |
'Фамилия:' |
AS "Текст", |
PR_NAME AS "Фамилия",
PR_BIRTHDAYAS "Дата рождения"
FROM PERSON
ORDER PRJNAME, PRJNAME2;
Вначале выполняется упорядочение списка по столбцу |PRJNAME (фамилия), а затем внутри списка - еще и по PR NAME2 (имя). Второй уровень сортировки называется вложенной (nested) сортировкой. Количество уровней вложенности не ограничивается.
В нашем примере мы получили список, отсортированный по фамилиям в возрастающем порядке. Если несколько человек имеют одну и ту же фамилию, то строки упорядочиваются и по именам.. Если нужно, мы можем добавить еще один уровень сортировки - по отчествам.
Такая сортировка строковых полей называется сортировкой в лексикографическом порядке, когда порядок символов в точности соответствует расположению букв в алфавите соответствующего языка.
Зададим упорядочение не в виде имен столбцов, а указанием их номеров. Напомню, что столбцы в списке выбора нумеруются начиная с единицы, а в самом списке выбора нельзя указывать символ *7
SELECT PR_NAME2 |
AS "Имя", |
PRJNAME3 |
AS "Отчество", |
'Фамилия:' |
AS "Текст", |
PRJNAME |
AS "Фамилия", |
PRJBIRTHDA Y AS "Дата рождения"
FROM PERSON
ORDER BY PR_BIRTHDAY, PRJNAME
Получим следующий список, упорядоченный по датам рож дения.
|
|
|
Листинг 5 |
Список личностей, упорядоченный по дате рождения |
|||
Имя |
Отчество |
Фамилия |
Дата рождения |
Татьяна |
Валерьевна |
Веремчук |
23.08.1948 |
Татьяна |
Николаевна |
Некрасова |
04.12.1949 |
Елена |
Алевтиновна |
Варанкина |
01.02.1952 |
Татьяна |
Владимировна |
Хемлих |
25.10.1953 |
Татьяна |
Сергеевна |
Арсентьева |
10.09.1954 |
Татьяна |
Анатольевна |
Баландина |
11.01.1955 |
Кирил |
Владимирович |
Бешляга |
07.01.1956 |
Марина |
Валентиновна |
Бычкова |
01.04.1957 |
Людмила |
Александровна |
Блинова |
28.08.1957 |
Елена |
Александровна |
Беляева |
30.04.1958 |
Павел |
Павлович |
Попутько |
05.05.1959 |
Татьяна |
Викторовна |
Владысик |
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 |
Татьяна |
Геннадьевна |
Зырянова |
22.01.1970 |
Максим |
Владимирович |
Бычков |
08.09.1970 |