2.1.    Простейшие SELECT-запросы

Оператор SELECT (выбрать) языка SQLaBMeroi самым важ­ным и самым часто используемым оператором. Он предназначен для выборки информации из таблиц базы данных. Упрощенный синтаксис оператора SELECT выглядит следующим образом. SELECT [DISTINCT] <список атрибутов>

FROM <список таблиц>

[WHERE <условие выборки>]

[ORES! BY <список атрибутов>]

[GROUP BY <список атрибутов>]

[HAVING <условие>]

[UMON <выражение с оператором SELECT>J;

В квадратных скобках указаны элементы, которые могут отсутствовать в запросе.

Ключевое слово SELECT сообщает базе данных, что данное предложение является запросом на извлечение информации. После слова SELECT через запятую перечисляются наименования полей (список атрибутов), содержимое которых запрашивается.

Обязательным ключевым словом в предложении-запросе SELECT является слово FROM (из). За ключевым словом FROM указывается список разделенных запятыми имен таблиц, из ко­торых извлекается информация.

Например,

SELECTNAME, SURNAME FROM STUDENT;

Любой SQL-запрос должен заканчиваться символом «;» (точ ка с запятой).

Приведенный запрос осуществляет выборку всех значений ПОЛеЙ NAME И SURNAME ИЗ Таблицы STUDENT.

Его результатом является таблица следующего вида:

NAME

БиВ^АМЕ

Иван

Иванов

Петр

Петров

Вадим

Сидоров

Борис

Кузнецов

Ольга

Зайцева

Андрей

Павлов

Павел

Котов

Артем

Лукин

Антон

Петров

Вадим

Белкин

 

 

Порядок следования столбцов в этой таблице соответствует порядку полей NAME и SURNAME, указанному в запросе, а не их порядку во входной таблице STUDENT.

Если необходимо вывести значения всех, столбцов таблицы, то можно вместо перечисления их имен использовать символ «*» (звездочка).

SELECT *

FROM STUDENT;

В данном случае результатом выполнения запроса будет вся таблица STUDENT.

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

2tL_Простейшие SELECT-запросьг 25

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

SELECT CITY FROM STUDENT;

Его результатом будет таблица:

CITY Орел Курск Москва Брянск Липецк Воронеж Белгород Воронеж

NULL

Воронеж

Видно, что в таблице встречаются одинаковые строки (вы­делены жирным шрифтом).

Для исключения из результата SELECT-запроса повторяющих­ся записей используется ключевое слою DISTINCT (отличный). Если запрос SELECT извлекает множество полей, то DISTINCT ис­ключает дубликаты строк, в которых значения всех выбранных полей идентичны.

Предыдущий запрос можно записать в следующем виде.

SELECT DISTINCT CITY FROM STUDENT;

В результате получим таблицу, в которой дубликаты строк исключены.

CITY Орел Курск Москва Брянск Липецк Воронеж Белгород NULL

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

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

Пример

Написать запрос, выполняющий выборку имен (NAME) всех студентов с фамилией (SURNAME) Петров, сведения о которых находятся в таблице STUDENT. •

SELECT  SURNAME, NAME FROM STUDENT WHERE SURNAME = 'Петров';

Результатом этого запроса будет таблица:

SURNAME

NAME

Петров

Петр

Петров

Антон

В задаваемых в предложении WHERE условиях могут использо­ваться операции сравнения, определяемые операторами = (рав­но), > (больше), < (меньше), >= (больше или равно), ^(мень­ше или равно), <> (не равно), а также логические операторы AND, OR И NOT.

Например, запрос для получения имен и фамилий студен­тов, обучающихся на третьем курсе и получающих стипендию (размер стипендии больше нуля), будет выглядеть таким образом:

SELECT NAME, SURNAME FROM STUDENT

WHERE KURS = 3 AND STIPEND > 0;

Результат выполнения этого запроса имеет вид:

SURNAME

NAME

Петров

Петр

Лукин

Артем

Упражнения

1. Напишите запрос для вывода идентификатора (номера) предмета обучения, его наименования, семестра, в котором он читается, и количества отводимых на этот предмет часов для всех строк таб­лицы SUBJECT.

2. Напишите запрос, позволяющий вывести все строки таблицы EXAM_MARKS, в которых предмет обучения имеет номер (SUBJJD), равный 12.

3. Напишите запрос, выбирающий все данные из таблицы STUDENT, расположив столбцы таблицы в следующем порядке: KURS, SURNAME, NAME, STIPEND.

4. Напишите запрос SELECT, который выводит наименование пред­мета обучения (SUBJJSIAME) и количество часов (HOUR) для каждого предмета (SUBJECT) в4-мсеместре (SEMESTER).

5. Напишите запрос, позволяющий получить из таблицы EXAM_MARKS значения столбца MARK (экзаменационная оценка) для всех студен­тов, исключив из списка повторение одинаковых строк.

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

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

8. Напишите запрос, выполняющий выборку из таблицы SUBJECT названий всех предметов обучения, на которые отводится более 30 часов.

9. Напишите запрос, который выполняет вывод списка университе­тов, рейтинг которых превышает 300 баллов.

10. Напишите запрос к таблице STUDENT для вывода списка фамилий (SURNAME), имен (NAME)- и номера курса (KURS) всех студентов со стипендией, большей или равной 100, и живущих в Воронеже.

11. Какие данные будут получены в результате выполнения запроса? SELECT *

FROM STUDENT

WHERE  (STIPEND <   100 OR

NOT (BIRTHDAY >- '10/03/1980'

AND STODENTJD > 1003));

12. Какие данные будут получены в результате выполнения запроса? SELECT *

FROM STUDENT

WHERE NOT ((BIRTHDAY = 'M/03/Шг OR STIPEND > 100) AND STUDENTJD >- 1003);