История развития баз данных. Основные понятия и определения. Архитектура базы данных. Физическая и логическая независимость, страница 15

таблица1.поле1 и таблица2.поле2

1) INNERJOIN  – объединяет записи двух таблиц при выполнении условия;

2) LEFTJOIN  – создаёт левое внешнее объединение, при котором все записи из первой (левой) таблицы включаются в результат, даже если во второй правой таблице нет соответствующих записей по условию;

3) RIGHTJOINсоздаёт правое внешнее объединение,  при котором все записи из второй правой таблицы включаются в результат;

Пример 1:

Получить список дипломников с указанием руководителя.

SELECT sname, pname,

FROM студентINNER JOIN 

Преподаватель ON pnum = spdp;

Результат:

sname

pname

C-1

П-1

C-2

П-1

C-3

П-2

Пример 2:

Получить список студентов и их руководителей при его наличии.

SELECT sname, pname,

FROM студентLEFT JOIN 

Преподаватель ONpnum = spdp;

Результат:

sname

pname

C-1

П-1

C-2

П-1

C-3

П-2

C-4

Если соединяется более двух таблиц, то используются вложенные операции JOIN:

FROM таблица1 INNERJOIN (таблица2 INNERJOIN (таблица3 ON условие_объединения 2_3) ON условие_объединения 1_2);

3. Вложенные подзапросы.

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

Пример:

Пусть известна фамилия преподавателя и требуется получить список его дипломников.

SELECT sname FROM студент

WHERE  spdp = (SELECT pnum FROM Преподаватель WHERE pname = «П-1»);

Результат:

sname

C-1

C-2

В данном примере, чтобы выполнить основной (внешний) запрос, SQL сначала выполняет внутренний запрос (подзапрос) в предложении WHERE основного запроса. В результате, будет получен код преподавателя с его фамилией. Затем выполняется основной запрос в предложении WHERE и, в результате, будет получена таблица. Существенным в этом случае является то, что подзапрос возвращает не более одного значения.

Пример:

Пусть требуется получить фамилии дипломников для определённой кафедры:

SELECT sname FROM студент

WHERE  spdp = (SELECT pnum FROM Преподаватель WHERE pcaf = «K-1»);

Результат:

Запрос такого типа приведёт к ошибке, потому что будет возвращать 2 значения.

Иногда проблему единственности можно решить с помощью параметра DISTINCT в предложении SELECT.

Пример:

Пусть требуется получить фамилию преподавателя, принимавшего экзамен 11.01.01:

SELECT pname FROM Преподаватель

WHERE  pnum = (SELECT DISTINCT opnum FROM оценкаWHERE odate = «11/01/01»);

Результат:

pname

П-1

Без параметра DISTINCT запрос был бы ошибочным, потому что возвращал бы 2 значения, хотя и совпадающие. С помощью DISTINCT эта ошибка устраняется. Однако, в данном примере возможна ошибка, если 2 преподавателя принимают экзамен в один день. Следует отметить, что по стандарту SQL логические выражения с использованием подзапросов должны иметь вид:

WHERE скаларное_выражение = (подзапрос),

а не наоборот.

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

Пример:

Получить коды студентов, имеющих у преподавателя П-1 оценки не ниже среднего бала, полученного всеми студентами у этого преподавателя:

SELECTosnum, odate, ocenFROM оценка WHEREocen >= (SELECTAVG (ocen) FROM оценка WHEREopnum = (SELECTpnumFROM Преподаватель WHEREpname = «П-1»)); ANDopnum = (SELECTpnumFROM Преподаватель WHEREpname = «П-1»)

Результат:

osnum

odate

ocen

001

10/01/01

5

002

11/01/01

4