- •Лабораторная работа 4
- •Цели лабораторной работы
- •Описание и примеры
- •Основные фразы запроса: select и from Фраза select
- •Фраза from
- •Фраза where
- •Использование простых условий Использование операторов сравнения
- •Логические операторы
- •Выражение над столбцами во фразе where
- •Специальные операторы Оператор in
- •Оператор between
- •Оператор like
- •Операторы is null и is not null.
- •Варианты заданий
- •Вариант 1
- •Вариант 2
- •Вариант 3
- •Вариант 4
- •Вариант 5
- •Вариант 6
- •Вариант 7
- •Вариант 8
- •Вариант 9
- •Вариант 10
- •Вариант 11
- •Вариант 12
- •Вариант 13
- •Вариант 14
- •Вариант 15
- •Вариант 16
- •Вариант 17
- •Вариант 18
- •Контрольные вопросы
- •Приложения Приложение a. Операторы sql Oracle
- •Унарные и бинарные операторы
- •Старшинство операторов
- •Арифметические операторы
- •Оператор конкатенации
- •Операторы сравнения
- •Логические операторы
- •Теоретико-множественные операторы
- •Приложение b. Выражения
- •Простые выражения
Фраза from
Фраза FROM содержит имя таблицы или список имен таблиц, которые используются для выбора данных.
Одна таблица. В простейшем случае используется одна таблица. Все предыдущие примеры использовали одну таблицу.
Много таблиц. Если вы задаете список таблиц во фразе FROM, то все строки первой таблицы конкатенируются со всеми строками второй таблицы. Например, запрос:
SELECT *
FROM FACULTY, DEPARTMENT;
производит конкатенацию всех строк таблицы FACULTY со всеми строками таблицы DEPARTMENT. Этот запрос эквивалентен операции декартова произведения реляционной алгебры.
Соединение двух таблиц. Чтобы получить семантически осмысленный результат, следует соединить строки факультетов со теми строками кафедр, которые принадлежат этим факультетам.
Используя столбец FacNo, который присутствует в обоих таблицах, вы может соединить факультеты только с их кафедрами с помощью условия фразы WHERE, как это показано в следующем запросе:
SELECT *
FROM FACULTY, DEPARTMENT
WHERE FACULTY.FacNo = DEPARTMENT.FacNo;
Такое соединение называется экви-соединением, так как оно производится по равенству значений двух столбцов из различных таблиц.
Соединение многих таблиц. Вы можете соединять столько таблиц, сколько необходимо, например, в следующем запросе выводятся факультеты с их преподавателями:
SELECT FACULTY.Name, TEACHER.Name
FROM FACULTY, DEPARTMENT, TEACHER
WHERE FACULTY.FacNo = DEPARTMENT.FacNo AND DEPARTMENT.DepNo = TEACHER.DepNo;
Обратим внимание, что столбцы таблицы DEPARTMENT не выводятся, она используется только для соединения факультетов с преподавателями. (Логические операторы будут обсуждены далее).
Указание необходимых столбцов.Когда используется более, чем одна таблица, вы можете указать в качестве выходных столбцы из различных таблиц. В случае необходимости имена столбцов могут быть уточнены именами таблиц. Имена столбцов также могут быть переименованы с помощью алиасов, как это сделано в следующем запросе:
SELECT FACULTY.Name AS Faculty_name,
DEPARTMENT.Name AS Department_name,
DEPARTMENT.Fund AS Department_fund
FROM FACULTY, DEPARTMENT
WHERE FACULTY.FacNo = DEPARTMENT.FacNo;
Соединение по условию, отличающемуся от равенства. Экви-соединение использует оператор равенства (=) во фразе WHERE для соединения таблиц, в не экви-соединениях используются другие операторы отношений. Например, в следующем примере выводятся кафедры, которые имеют фонд финансирования, превышающий фонд финансирования его факультета:
SELECT DEPARTMENT.Name, DEPARTMENT.Fund
FROM FACULTY, DEPARTMENT
WHERE FACULTY.Fund < DEPARTMENT.Fund;
Обратите внимание, что хотя для получения необходимого ответа мы соединяем две таблицы, однако в результат попадают столбцы только из таблицы DEPARTMENT.
Имена-синонимы (алиасы) для таблиц. Во фразе FROM с именем таблицы может быть связано другое имя, которое выступает в качестве ее синонима (алиаса). Такие имена могут использоваться в любом месте запроса для ссылки на таблицу. Синтаксис определения алиаса таблицы следующий:
table_name table_alias_name
Например, предыдущий запрос может быть представлен следующим образом:
SELECT d.Name, d.Fund
FROM FACULTY f, DEPARTMENT d
WHERE f.Fund < d.Fund;
В этом примере использование алисов таблиц является факультативным, однако имеются такие запросы, в которых нельзя обойтись без алиаслов таблиц.
Соединение таблицы с самой собой.Таблица может быть соединена с самой собой. В этом случае алиасы таблиц являются обязательными, так как необходимо различать две различных копии таблицы. В следующем запросе мы получаем пары групп, которые имеют одинаковый рейтинг:
SELECT G1.Num, G2.Num, G1.Rating
FROM SGROUP G1, SGROUP G2
WHERE G1.GrpNo = G2.GrpNo;
Внешнее соединение (оuter join). Внешнее соединение расширяет возможности обычного соединения. Внешнее соединение возвращает все строки, которые удовлетворяют условию соединения, а также строки одной из таблиц, для которых не нашлось строки из другой таблицы, которые бы удовлетворили условию соединения. Такие строки не возвращаются обычным соединением. Для того, чтобы произвести внешнее соединение таблиц A и B с получением в результате ВСЕХ строк таблицы A, следует применить оператор внешнего соединения (+) ко всем столбцам таблицы В. Для всех тех строк таблицы А, для которых не нашлось совпадающих строк из таблицы В, Oracle возвращает значение NULL для всех тех выражений из списка SELECT, которые используют столбцы из В. В следующем примере мы получаем список факультетов и их кафедр, причем имена кафедр присутствуют даже в том случае, когда у них нет факультетов – в этом случае вместо имени факультета выводится значение NULL:
SELECT FACULTY.Name AS FacName, DEPARTMENT.Name AS DepName, DEPARTMENT.Fund AS DepFund
FROM FACULTY, DEPARTMENT
WHERE FACULTY.FacNo = DEPARTMENT.FacNo (+);
Таблица DUAL. Oracle имеет в своем составе таблицу DUAL, которая не содержит ни строк ни столбцов. Она доступна всем пользователям. Она используется в том случае, когда вы хотите вывести какие-либо значения, которые не выбираются (или не вычисляются) из значений какой-либо таблицы. Например, в следующем запросе выводится текущая системная дата:
SELECT SYSDATE FROM DUAL;
Естественно, что для получения этой даты вы можете воспользоваться любой существующей таблицей, например:
SELECT SYSDATE FROM LECTURE;
однако в этом случае количество выводимых значений системной даты будет равно количеству сток в таблице LECTURE.