таблица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 |
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.