Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Белобжеский_Лекции_по_ББД.doc
Скачиваний:
3
Добавлен:
01.07.2025
Размер:
5.5 Mб
Скачать

Соединение с помощью sql

Чтобы получить атрибуты ЛичныйНомер, Имя и НазваниеПредмета для каждого сту­дента, мы должны соединить таблицу СТУДЕНТ с таблицей ЗАПИСЬ. Это делается следующими операторами:

SELECT СТУДЕНТ.ЛичныйНомер, СТУДЕНТ.Имя, ЗАПИСЬ.НазваниеПредмета

FROM СТУДЕНТ, ЗАПИСЬ

WHERE СТУДЕНТ.ЛичныйНомер = ЗАПИСЬ.НомерСтудента

Вспомните, что соединение — это комбинация трех операций: умножения, затем выборки и наконец (обычно) — проекции. В этом выражении оператор FROM производит перемножение отношений СТУДЕНТ и ЗАПИСЬ, а оператор WHERE про­изводит выборку. Значение выражения звучит так: «Выбрать из произведения отношений СТУДЕНТ и ЗАПИСЬ те строки, в которых значение атрибута ЛичныйНо­мер из отношения СТУДЕНТ равно значению атрибута НомерСтудента в отношении ЗАПИСЬ». Наконец, после выборки берется проекция на номер студента, имя и название предмета. Результат имеет следующий вид:

Предложение WHERE может содержать и другие квалификаторы помимо тех, которые непосредственно требуются для соединения. Например,

SELECT СТУДЕНТ.ЛичныйНомер, ЗАПИСЬ.НазваниеПредмета

FROM СТУДЕНТ. ЗАПИСЬ

WHERE СТУДЕНТ.ЛичныйНомер = ЗАПИСЬ.НомерСтудента

AND СТУДЕНТ.Имя = 'РАЙ'

AND ЗАПИСЬ.ПорядковыйНомер = 1

Здесь дополнительные квалификаторы — это условия СТУДЕНТ.Имя = 'РАЙ' и ЗАПИСЬ.ПорядковыйНомер = 1. Это выражение будет иметь своим результатом список учетных номеров всех студентов по имени Рай, кто записался первым на какой-либо предмет, и список соответствующих предметов.

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

SELECT СТУДЕНТ.ЛичныйНомер, ЗАНЯТИЯ.НазваниеПредмета, ЗАНЯТИЯ.Время. ЗАПИСЬ ПорядковыйНомер

FROM СТУДЕНТ, ЗАПИСЬ, ПРЕДМЕТ

WHERE СТУДЕНТ.ЛичныйНомер = ЗАПИСЬ.НомерСтудента

AND ЗАПИСЬ.НазваниеПредмета = ЗАНЯТИЯ.НазваниеПредмета

AND СТУДЕНТ.Имя = 'БЕЙКЕР'

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

200

BD445

ПСЯЗ

2

200

CS250

ПСЯ12

1

300

CS150

ПСЯЗ

1

Сравнение вложенного запроса и соединения

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

SELECT СТУДЕНТ Имя

FROM СТУДЕНТ. ЗАПИСЬ

WHERE СТУДЕНТ ЛичныйНомер = ЗАПИСЬ НомерСтудента

AND ЗАПИСЬ НазваниеПредмета = 'BD445'

Подобным же образом вопрос «Каковы имена студентов, занимающихся по понедельникам, средам и пятницам в 3 часа?» может быть представлен в виде за­проса

SELECT СТУДЕНТ.Имя

FROM СТУДЕНТ, ЗАПИСЬ, ЗАНЯТИЯ

WHERE СТУДЕНТ.ЛичныйНомер = ЗАПИСЬ.НомерСтудента

AND ЗАПИСЬ.НазваниеПредмета = ЗАНЯТИЯ.НазваниеПредмета

AND ЗАНЯТИЯ.Время = 'ПСЯЗ'

Хотя выражения с соединением во многих случаях могут составить альтерна­тиву вложенным запросам, они не способны заменить их в любой ситуации. На­пример, вложенные запросы со служебными словами EXISTS и NOT EXISTS (обсуж­даются ниже) нельзя представить с помощью соединений.

Не все соединения можно заменить вложенным запросом. Когда используется соединение, отображаемые столбцы могут относиться к любой из соединяемых таблиц, а вложенный запрос способен отобразить столбцы только той таблицы, которая указана в выражении FROM первого оператора SELECT. Предположим, на­пример, что мы хотим определить названия курсов, на которые записаны студен­ты. Мы можем выразить это в виде вложенного запроса:

SELECT DISTINCT НазваниеПредмета

FROM ЗАПИСЬ

WHERE НомерСтудента IN

(SELECT ЛичныйНомер FROM СТУДЕНТ WHERE Курс NOT = 'AC')

или в виде соединения:

SELECT DISTINCT НазваниеПредмета

FROM ЗАПИСЬ, СТУДЕНТ

WHERE ЗАПИСЬ.НомерСтудента = СТУДЕНТ.ЛичныйНомер

AND Курс NOT = 'АС'

Но если мы хотим знать и названия предметов, и номера курсов, на которых учатся студенты, мы должны использовать соединение. Вложенный запрос не подойдет, поскольку требуемые результаты происходят из разных таблиц, а имен­но названия предметов хранятся в таблице ЗАПИСЬ, а имена студентов — в табли­це СТУДЕНТ. Правильный ответ выдаст следующий запрос:

SELECT DISTINCT ЗАПИСЬ.НазваниеПредмета, СТУДЕНТ.Курс

FROM ЗАПИСЬ, СТУДЕНТ

WHERE ЗАПИСЬ.НомерСтудента = СТУДЕНТ.ЛичныйНомер

AND СТУДЕНТ.Курс NOT = 'AC'

Результат имеет следующий вид:

ВА200

С2

CS150

С4

ВА200

С1

BF410

С1

CS250

С1

ВА200

С4