Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ИОСУ лекции (мои).doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
4.74 Mб
Скачать

4. Оператор фиксации результатов работы с бд

COMMIT;

Данный оператор фиксирует результаты выполнения предшествующих операторов.

12. Выборка данных в sql

ОПЕРАТОР ВЫБОРКИ SELECT

Оператор выборки SELECT предназначен для описания и исполнения запросов к БД на выборку данных. Он является наиболее проработанным и идеологически важным оператором языка SQL. Основная форма оператора имеет вид:

SELECT <поля выборки>

FROM <таблицы>

WHERE <условия отбора записей>

GROUP BY <поля группирования>

HAVING <условия отбора группы>

Оператор описывает:

- откуда брать данные,

- каким требованиям должна удовлетворять отобранная информация,

- в каком виде представить результаты выборки.

Таким образом, в операторе SELECT определяется, «что должно быть получено», а не «как это получить», что показывает связь оператора SELECT с реляционным исчислением. Дополнительно оператор SELECT включает нереляционные операции.

Исполнение оператора SELECT можно представить последовательностью действий:

1) Формирование единой таблицы:

Формирование выполняется в соответствии с информацией, заданной фразой FROM. Во фразе FROM перечисляются через запятую входные элементы. Элементом может быть исходная таблица или соединение исходных таблиц.

Соединение таблиц задается в виде:

<таблица1> <вид соединения> JOIN <таблица2> ON <условие>

Вид соединения может принимать значения:

INNER – внутреннее соединение: содержит все соединения записей, для которых выполняется заданное условие

LEFT – левое внешнее соединение: к допустимым соединениям записей добавляются соединения с пустой строкой для записей таблицы 1, не имеющих соответствия в таблице 2. Таким образом, в таблицу соединения хотя бы однократно входят все записи таблицы 1 (левой таблицы соединения)

RIGHT – правое внешнее соединение: к допустимым соединениям записей добавляются соединения с пустой строкой для записей таблицы 2, не имеющих соответствия в таблице 1.

FULL – полное внешнее соединение: в результат соединения включаются все записи как левой, так и правой таблицы соединения.

После формирования соединений общая таблица образуется декартовым произведением полученных табличных элементов. Декартово произведение также образуется соединениями строк, но допустимыми являются все сочетания.

Пример:

Таблица «А_сотрудники» содержит сведения о сотрудниках фир­мы X:

Таб_ном

ФИО

01

Диго

02

Афанасьев

03

Сидоров

Таблица «Б_разработки» содержит информацию о том, какие программные продукты разработаны в фирме X и кто является авто­ром каждой разработки.

ФИО

Продукт

Диго

П1

Диго

П2

Афанасьев

П3

Чистов

П4

Если в предложении FROM перечислено несколько таблиц, то все они неявно считаются соединяемыми. Если тип соединения явно не задан, то считается, что каждая строка первой таблицы соединяется с каждой строкой второй таблицы. Такое соединение и называ­ется перекрестным.

Результат перекрестного соединения для приведенных выше таб­лиц представлен ниже.

Таб_ном

А_сотрудники.фио

Б_разработки.фио

Продукт

01

Диго

Диго

П1

01

Диго

Диго

П2

01

Диго

Афанасьев

ПЗ

01

Диго

Чистов

П4

02

Афанасьев

Диго

П1

02

Афанасьев

Диго

П2

02

Афанасьев

Афанасьев

ПЗ

02

Афанасьев

Чистов

П4

03

Сидоров

Диго

Ш

03

Сидоров

Диго

П2

03

Сидоров

Афанасьев

ПЗ

03

Сидоров

Чистов

П4

Запрос на SQL может иметь следующий вид:

SELECT а_сотрудники.таб_ном, а_сотрудники.фио, б_разработки.фио, б_разработки.продукт

FROM а_сотрудники, б_разработки;

Чаще всего при создании запросов используется тип соединения INNER JOIN, при котором соединенная таблица будет включать толь­ко те строки, для которых есть соответствующие друг другу значения полей связи в обеих таблицах.

Результат соединения типа INNER JOIN для приведенных выше таблиц представлен ниже.

Таб_ном

ФИО

Продукт

01

Диго

П2

01

Диго

П1

02

Афанасьев

ПЗ

Этот запрос показывает разработки, выполненные сотрудниками фирмы X.

На SQL такой запрос будет иметь следующий вид:

SELECT а_сотрудники.таб_ном, а_сотрудники.фио, б_разработки.продукт

FROM а_сотрудники INNER JOIN б_разработки

ON а_сотрудники.фио = б_разработки.фио;

При использовании соединения типа LEFT JOIN в результатную таблицу попадают все записи из первой таблицы и только те записи из второй таблицы, для которых есть соответствующие значения по­лей связи в первой таблице. Соединение типа LEFT JOIN для рас­сматриваемого примера даст в результате список всех сотрудников фирмы X с указанием их разработок:

Таб_ном

ФИО

Продукт

01

Диго

П2

01

Диго

П1

02

Афанасьев

ПЗ

03

Сидоров

Null

На SQL такой запрос будет выглядеть следующим образом:

SELECT а_сотрудники.таб_ном, а_сотрудники.фио, б_разработки.продукт

FROM а_сотрудники LEFT JOIN б_разработки

ON а_сотрудники.фио = б_разработки.фио;

При использовании соединения типа RIGHT JOIN, напротив, в результатную таблицу попадают все записи из второй таблицы и только те записи из первой таблицы, для которых есть соответствующие зна­чения полей связи во второй таблице. Соединение типа RIGHT JOIN для рассматриваемого примера даст в результате список всех продук­тов с указанием разработчика и его табельного номера:

Таб_ном

ФИО

Продукт

01

Диго

П1

01

Диго

П2

02

Афанасьев

ПЗ

Null

Чистов

П4

На SQL такой запрос будет выглядеть следующим образом:

SELECT а_сотрудники.таб_ном, б_разработки.фио, б_разработки.продукт

FROM а_сотрудники RIGHT JOIN б_разработки

ON а_сотрудники.фио = б_разработки.фио;

Во всех приведенных выше примерах предполагалось, что усло­вием соединения является равенство значений полей связи. Обычно именно этот тип сравнения и используется.

FULL JOIN для нашего примера даст следующий результат:

Таб_ном

ФИО

Продукт

01

Диго

П1

01

Диго

П2

02

Афанасьев

ПЗ

03

Сидоров

Null

Null

Чистов

П4