Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Базы данных Шехтман.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
2.7 Mб
Скачать

6.3. Язык запросов

SELECT [ALL | DISTINCT] (<Список полей>|*)

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

[WHERE <Предикат – условие выборки или соединения>]

[GROUP BY <Список полей результата>]

[HAVING <Предикат – условие для групп>]

[ORDER BY <Список полей – как упорядочить>]

WHERE - предикаты сравнения {= <> < > >= <=}

  • предикат [NOT] BETWEEN A and B

  • предикат [NOT] IN множество (перечисление или встроенный запрос)

  • предикат сравнения с образцом [NOT] LIKE (_, % , остальные символы изображают сами себя)

  • предикат сравнения IS [NOT] NULL (NULL – неопр. 2 поля с значением NULL не равны). 2-значная логика расширяется до 3-значная логика

    A

    B

    NOT A

    A AND B

    A OR B

    TRUE

    NULL

    FALSE

    NULL

    TRUE

    FALSE

    NULL

    TRUE

    FALSE

    NULL

    NULL

    TRUE

    NULL

    NULL

    TRUE

    NULL

    FALSE

    NULL

    FALSE

    NULL

    NULL

    NULL

    NULL

    NULL

    NULL

  • предикат существования [NOT] EXIST – к подзапросам

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

SELECT * FROM R1, R2 – декартово произведение.

SELECT R1.A, R2.B FROM R1, R2 – проекция декартова произведения на атрибуты соответствующих таблиц. При этом дубликаты сохраняются в отличие от операции проектирования реляционной алгебры.

WHERE - ключевое слово, за которым следует предикат (горизонтальная фильтрация):

6.4. Простые запросы на выборку данных.

Основная форма запроса:

SELECT <желаемые атрибуты>

FROM <одно или несколько отношений>

WHERE <условия, накладываемые на кортежи отношений>

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

R1 = (FIO, D, O)

R2 = (FIO, G)

R3 = (G, D)

Домен атрибута D (Дисциплина) – все дисциплины в ВУЗе, домен атрибута G (Группы) – все группы в ВУЗе. Пусть в них хранится следующая информация:

R1

FIO

D

O

А

БД

5

Б

БД

4

В

БД

NULL

Г

Англ

3

Б

Англ

5

R2

FIO

G

А

ИСЭ

Б

ИАС

В

ИСЭ

Г

ИСЭ

R3

G

D

ИСЭ

БД

ИСЭ

Англ

ИСЭ

Матем

ИАС

БД

ИАС

Англ

Будем считать, что пустое значение в поле R1.O (которое обозначается NULL) означает, что студент пришел на экзамен, но не сдавал его.

1. Список имен студентов, сдавших на 5 экзамен по курсу “базы данных”:

Запрос на языке реляционной алгебры:

(R1[ Оценка=5 Дисциплина = “БД”]) [ФИО]

Эквивалент на SQL:

SELECT FIO FROM R1 WHERE D = ‘БД’ AND O = 5

2. Перечислить группы в ВУЗе:

R3[G]

Может показаться, что запрос SELECT G FROM R3 эквивалентен алгебраическому выражению. Однако это не так! Сравним результаты:

Алгебра

ИСЭ

ИАС

SQL

ИСЭ

ИСЭ

ИСЭ

ИАС

ИАС

Разница связана с тем обстоятельством, что в реляционной алгебре используются истинные множества (в них один и тот же кортеж не может присутствовать дважды – вспомним определение отношения!), в то время как в SQL – мультимножества (в них кортеж может многократно дублироваться). Это связано с необходимостью решить проблему эффективного исполнения запросов. Поэтому эквивалентом алгебраического выражения является следующий запрос:

SELECT DISTINCT G FROM R3 – запрос на SQL

Слово DISTINCT позволяет в явной форме указать необходимость убрать дубли из результрующего отношения.

3. Кто должен сдавать экзамен по курсу “базы данных”?

R2 [R3.G = R2.G R3.D = ‘базы данных’] R3) [FIO]

SELECT FIO FROM R2, R3 WHERE R2.G = R3.G AND R3.D = ‘БД

4. Кто должен сдавать экзамены (и какие):

SELECT FIO, D FROM R2, R3 WHERE R2.G = R3.G

5. Кто не имеет оценки (и по какой дисциплине), но приходил на экзамен

SELECT FIO, D FROM R1 WHERE O IS NULL

6. Кто провалил 2 или больше экзаменов?

R1 [R1.ФИО = R1’.ФИО R1.Дисциплина <> R1’.Дисциплина

R1.Оценка <= 2 R1’.Оценка <= 2] R1’) [ФИО]

SELECT DISTINCT a.FIO

FROM R1 a, R1 b

WHERE a.FIO = b.FIO AND a.D <> b.D AND a.O <= 2 AND b.O <= 2

В данном примере понадобилось ввести 2 имени для обозначения одного и того же отношения, т.е. синонимы. Как показано здесь, этого можно добиться путем указания синонима сразу после имени таблицы в разделе FROM. В случае переименования таблицы все ее поля, на которые мы ссылаемся в любой части запроса необходимо предварять синонимом: если написано FROM R1 a то следует писать a.FIO а не R1.FIO.

Раздел WHERE может включать условия, в которых строка сравнивается с образцом.

7. Выбрать студентов, фамилия которых начинается с А:

SELECT FIO FROM R2 WHERE FIO LIKE ‘А%’

8. Выбрать группы, в название которых входит буквосочетание ‘МИ’:

SELECT G FROM R1 WHERE G LIKE ‘%МИ%’

В SQL действует трехзначная логика: TRUE, FALSE, UNKNOWN. Когда значение сравнивается с NULL, результат сравнения равен UNKNOWN. Но запрос SELECT выбирает кортеж для результирующего отношения только при условии, что результат условия в разделе WHERE равен TRUE (а не FALSE или UNKNOWN).

Чтобы понять как работают AND, OR, NOT в 3-х значной логике, можно использовать следующую модель:

  1. TRUE=1, FALSE=0, UNKNOWN=½.

  2. AND соответсвует операции определения минимума MIN, OR- взятия макимума MAX, NOT(x) = 1-x.

Пример.

TRUE AND (FALSE OR NOT(UNKNOWN)) = MIN(1, MAX(0, (1-½))) = MIN(1, MAX(0, ½)) = MIN(1, ½) = ½ = UNKNOWN

9. Пусть дано отношение S содержащее данные:

ТОВАР

ЦЕНА

БАНАНЫ

NULL

Запрос SELECT * FROM S WHERE ЦЕНА > 50 OR ЦЕНА <= 50 не включит показанный кортеж, т. к. результат вычисления условия в разделе WHERE для этого кортежа равен UNKNOWN.