Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
SQL97-4E.DOC
Скачиваний:
3
Добавлен:
05.11.2018
Размер:
3.3 Mб
Скачать

4.1. Выборка данных из единственной таблицы

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

SELECT * FROM Student

WHERE Ndep=100

Nstud Cname Ndep Niq Nteach

3467589 Отличников К.Л. 100 99 210

7459876 Дубинин У.У. 100 41 410

2227778 Мозгов О.Г. 100 100 220

При выборке каждая строка исходной таблицы Student проверяется на выполнение условия Ndep=100 и включается в результирующую таблицу лишь в случае его выполнения. Порядок следования полей, равно как и порядок следования строк, в запросе определен не был, поэтому те и другие могут быть расположены в произвольном порядке, причем этот порядок от запроса к запросу способен изменяться. Для того, чтобы поля в таблице следовали в строго определенном порядке, необходимо явно задать список полей, причем не обязательно всех:

SELECT Ndep, Nstud, Cname FROM Student

WHERE Ndep=100 OR Ndep=200

Ndep Nstud Cname

100 3467589 Отличников К.Л.

200 5934508 Середняков А.Д.

100 7459876 Дубинин У.У.

100 2227778 Мозгов О.Г.

200 5934512 Папуасов М.Ю.

Если требуется упорядочить по какому-либо правилу строки результирующей таблицы, используется предложение ORDER BY, позволяющее установить порядок следования строк в соответствии со значениями одного или нескольких столбцов. Следующий запрос требует упорядочения списка студентов двух факультетов в первую очередь по коду факультета в порядке убывания, что определяется наличием ключевого слова DESC. Фамилии студентов каждого факультета располагаются в алфавитном порядке (в явном виде это требование задается с помощью ключевого слова ASC, которое используется по умолчанию):

SELECT Nstud, Cname, Ndep FROM Student

WHERE Ndep=100 OR Ndep=200

ORDER BY Ndep DESC, Cname

Nstud Cname Ndep

5934512 Папуасов М.Ю. 200

5934508 Середняков А.Д. 200

7459876 Дубинин У.У. 100

2227778 Мозгов О.Г. 100

3467589 Отличников К.Л. 100

Тот же самый запрос можно сформировать несколько иначе, указывая в предложении ORDER BY вместо имен столбцов результирующей таблицы их порядковые номера:

SELECT Nstud, Cname, Ndep FROM Student

WHERE Ndep=100 OR Ndep=200

ORDER BY 3 DESC, 2

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

SELECT "Средний интеллект", AVG(Niq) FROM Student

WHERE NOT Ndep=100

Exp_1 Avg_niq

Средний интеллект 54,00

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

Замечание: согласно стандарту ANSI SQL использование агрегатных функций (SUM, MIN, MAX, AVG и др.) в качестве аргументов других функций не допускается. Кроме того, не допускается использование агрегатных функций в предложении WHERE.

Представленные пять запросов требовали вывода сведений лишь о студентах определенных факультетов, поэтому в состав команды SELECT было включено предложение WHERE и использованы операция логическое “или”(OR) и логическое отрицание (NOT). Допусти-

мо задание и более сложных условий по стандартным правилам формирования логических выражений с использованием операции логическое “и”(AND) и всех операций отношения (=, >, >=, <, <=, <>).

Кроме стандартных логических операций SQL допускает использование специальных операторов IN, BETWEEN, LIKE.

Оператор IN позволяет определить, принадлежит ли некоторое значение заданному множеству - в этом случае результатом операции будет значение “истина”, в противном - “ложь”. Например, второй из запросов можно сформулировать таким образом (в скобках указываются элементы множества):

SELECT Nstud, Cname, Ndep FROM Student

WHERE Ndep IN (100, 200)

Nstud Cname Ndep

3467589 Отличников К.Л. 100

5934508 Середняков А.Д. 200

7459876 Дубинин У.У. 100

2227778 Мозгов О.Г. 100

5934512 Папуасов М.Ю. 200

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

Несколько иначе действует оператор BETWEEN. Вместо перечисления элементов множества он задает границы интервала, в который должно попадать значение. Синтаксис оператора:

BETWEEN <нижняя граница> AND <верхняя граница >

Оператор BETWEEN чувствителен к порядку задания границ интервала: <нижняя граница> должна быть не больше, чем <верхняя граница> в соответствии с числовым или текстовым порядком.

Допустим, требуется найти всех студентов математического факультета, фамилии которых начинаются с букв от “А” до “Н”. Такой запрос можно записать так:

SELECT Cname FROM Student

WHERE (UPPER(Cname) BETWEEN ‘А’ AND ‘Н’)

AND Ndep=100

Cname

Дубинин У.У.

Мозгов О.Г.

При использовании BETWEEN следует помнить, что границы интервала включаются в него. Если необходимо исключить границы, то запрос станет несколько сложнее, например, в таком случае, когда надо выбрать студентов, показатель интеллекта которых больше 30, но менее 50:

SELECT Cname FROM Student

WHERE ( Niq BETWEEN 30 AND 50 )

AND NOT Niq IN ( 30, 50 )

Cname

Дубинин У.У.

Замечание: разумеется, предложение WHERE можно записать проще с использованием операций отношения. Приведенное здесь предложение - просто пример, демонстрирующий возможности операторов BETWEEN и IN.

Оператор LIKE применим исключительно к текстовым значениям, так как используется для поиска подстроки. При его использовании допустимо применение масок (шаблонов) двух видов:

“_” (подчеркивание) - маскирует один символ. Например, тексту “ст_л” соответствуют “стал”, “стол”, “стул”;

“%”(процент) - маскирует последовательность символов произвольной длины. Например, при сравнении с текстом “к%о%и%” результат “истина” будет получен для текстов “крокодил”, “керосин” и др.

Каждая маска в одной символьной строке может применяться неоднократно. Например, поиск всех студентов, в фамилии которых есть буква “и”, выполняется по запросу:

SELECT * FROM Student

WHERE LOWER(Cname) LIKE ‘%и%’

Nstud Cname Ndep Niq Nteach

3467589 Отличников К.Л. 100 99 210

4678455 Двоечников Н.Е. 300 30 410

7459876 Дубинин У.У. 100 41 410

В одной строке одновременно могут применяться разные маски, как, например, в случае поиска студента, фамилия которого начинается на букву “Д”, а третьей буквой является буква “б”:

SELECT * FROM Student

WHERE Cname LIKE ‘Д_б%’

Nstud Cname Ndep Niq Nteach

7459876 Дубинин У.У. 100 41 410

Обратите внимание, что в последнем примере регистр, на котором записаны буквы, имеет значение, так как не используются функции UPPER или LOWER.

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

SELECT Ndep, COUNT(*) FROM Student

GROUP BY Ndep

Ndep Cnt

100 3

200 2

300 2

а запрос:

SELECT Ndep, Nteach, COUNT(*) FROM Student

GROUP BY Ndep, Nteach

Ndep Nteach Cnt

100 210 1

100 220 1

100 410 1

200 310 2

300 410 2

предоставляет сведения о том, сколько студентов на данном факультете имеют одного и того же научного руководителя.

Замечание: вместо звездочки в качестве аргумента функции COUNT можно указать имя или номер конкретного поля в результирующей таблице, например, COUNT(Ndep) или COUNT(1) - результат будет тот же.

Как отмечалось выше, в предложении WHERE недопустимо (согласно стандарта ANSI SQL) использовать агрегатные функции. Например, для того, чтобы отобрать факультеты, на которых минимальный интеллект студента не ниже некоторого заданного, скажем, 50, нельзя сформировать запрос вида:

SELECT Ndep, MIN(Niq) FROM Student

WHERE MIN(Niq)>=50

GROUP BY Ndep

Здесь следует использовать предложение HAVING, которое определяет условие, согласно которому некоторые группы исключаются из результата. Так запрос, удовлетворяющий нашим требованиям, можно записать так:

SELECT Ndep, MIN(Niq) FROM Student

GROUP BY Ndep

HAVING MIN(Niq)>=50

Ndep Min_Niq

200 58

Упражнения к разделу 4.1

1. Сформулируйте запрос, который позволит получить сведения о наименованиях предметов и объемах занятий по ним только для предметов с объемом занятий не менее 50 часов.

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

3. Не используя операции отношения, сформулируйте запрос, который позволит получить все сведения о предметах с объемом занятий от 40 до 70 часов.

4. Не используя операции отношения, сформулируйте запрос, который позволит получить расположенные в алфавитном порядке сведения о предметах (только наименования), занятия по которым ведут преподаватели математического и экономического факультетов (определяются кодами преподавателей).

5. Сформулируйте запрос, который позволит получить сведения о суммарном объеме занятий каждого преподавателя. Сведения упорядочить по убыванию объема занятий.

6. Сформулируйте запрос, который позволит получить сведения о преподавателях с суммарным объемом занятий более 50 часов. Сведения упорядочить по возрастанию объема занятий, а при равном объеме - по кодам преподавателей в порядке убывания.

7. Сформулируйте запрос, который позволит получить сведения о предметах, в названиях которых имеется фрагмент ‘информ’ или ‘эконом’.

8. Определите средний, минимальный и максимальный объемы занятий по предметам, для которых объем занятий лежит в диапазоне от 35 до 85 часов.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]