Смекни!
smekni.com

Информационные системы 3 (стр. 8 из 14)

<имя столбца> типа CHAR.

<строковая константа> - это образец, в котором:

- "_" - любой одиночный символ,

- "%" - любое количество любых символов, в том числе нулевое, остальные символы означают сами себя.

Тема 7. Выборка данных. Соединение

Операция, в которой выборка данных проводится более чем из одной таблицы называется "соединение". Результирующая таблица также называется соединением.

Простое эквисоединение

Пример:

Выбрать все данные о поставщиках и деталях, размещенных в одном и том же городе, то есть соразмещенных.

SELECT S.*, P.* FROM S, P WHERE S.gorod=P.gorod;

Очевидно, что нужные данные получаются из двух таблиц S и P - они указаны в части FROM, а условие соединения записывается в части WHERE.

Поля таблицы "S" Поля таблицы "P"
nomer familia kapital gorod nomer nazvan zvet ves gorod
S1 Смит 20 Лондон P1 Гайка Красный 12 Лондон
S1 Смит 20 Лондон P4 Винт Красный 14 Лондон
S1 Смит 20 Лондон P6 Блюм Красный 19 Лондон
S2 Джонс 10 Париж P2 Болт Зеленый 17 Париж
S2 Джонс 10 Париж P5 Кулачок Голубой 12 Париж
S3 Блейк 30 Париж P2 Болт Зеленый 17 Париж
S3 Блейк 30 Париж P5 Кулачок Голубой 12 Париж
S4 Кларк 20 Лондон P1 Гайка Красный 12 Лондон
S4 Кларк 20 Лондон P4 Винт Красный 14 Лондон
S4 Кларк 20 Лондон P6 Блюм Красный 19 Лондон

Поставщик из Сарова не попал в результирующую таблицу, так как в этом городе не хранятся никакие детали. Аналогично, результат не содержит детали P3, так как ее город - Рим.

Некоторые замечания

- Оба столбца в условии соединения должны быть либо числовыми, либо строковыми.

- Совсем не обязательно, чтобы столбцы в условии соединения назывались одинаково, хотя это бывает часто.

- В случае операции равенства ("=") в условии соединения, оно называется эквисоединением; в условии соединения могут быть и другие операции.

- Часть WHERE может включать и другие дополнительные условия, помимо условия соединения.

- Можно предусмотреть выборку не всех, а некоторых столбцов; кроме того, первоначальный оператор можно еще более упростить:

SELECT * FROM S, P WHERE S.gorod=P.gorod;

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

- Можно образовать соединение любого числа таблиц.

Соединение по условию "больше, чем"

Пример:

Выбрать все данные о поставщиках и деталях таких, что город поставщика следует за городом, где хранится деталь в алфавитном порядке.

SELECT S.*, P.* FROM S, P WHERE S.gorod > P.gorod;

Соединение с дополнительным условием

Пример:

Выбрать все комбинации номеров поставщиков, номеров деталей и состояний такие, что поставщик и деталь соразмещены. Опустить поставщиков с капиталом 20.

SELECT S.nomer, P.nomer, S.kapital FROM S, P

WHERE (S.gorod = P.gorod) AND (kapital <> 20);

S.gorod = P.gorod - условие соединения

kapital <> 20 - дополнительное условие

Результат:

nomer nomer kapital
S2 P2 10
S2 P5 10
S3 P2 30
S3 P5 30

Соединение таблицы с ней самой

Пример:

Выбрать все пары номеров поставщиков такие, что оба поставщика находятся в одном и том же городе.

SELECT PERV.nomer, VTOR.nomer FROM S PERV, S VTOR

WHERE PERV.gorod = VTOR.gorod;

Таблица S дважды упоминается в части FROM, чтобы различать два ее упоминания вводятся произвольные псевдонимы.


Результат:

nomer nomer
S1 S1
S1 S4
S2 S2
S2 S3
S3 S3
S3 S2
S4 S4
S4 S1
S5 S5

Можно привести этот результат в порядок, если расширить часть WHERE.

SELECT PERV.nomer, VTOR.nomer

FROM S PERV, S VTOR

WHERE (PERV.gorod = VTOR.gorod) AND (PERV.nomer < VTOR.nomer);

Последнее условие ("<") даст двоякий эффект:

а) оно исключает пары номеров вида (x,x);

б) гарантирует, что пары вида (x,y) и (y,x) не будут появляться одновременно.

Результат:

nomer nomer
S1 S4
S2 S3

Тема 8: Выборка. Подзапрос

Подзапрос - это SELECT, который вложен во внешний оператор SELECT.

Обычно подзапросы требуются для выборки значений, когда во внешнем запросе применяется операция принадлежности (IN).

Простой подзапрос

Пример:

Выбрать фамилии поставщиков, которые поставляют деталь P2.

SELECT familia FROM S

WHERE nomer IN (SELECT nomer_s FROM SP WHERE nomer_p = 'P2')

Результат:

familia
Смит
Джонс
Блейк
Кларк

При обработке полного запроса сначала обрабатывается подзапрос. Этот подзапрос возвращает множество номеров поставщиков поставляющих деталь P2, а именно множество: ('S1', 'S2', 'S3', 'S4').

Поэтому первоначальный запрос эквивалентен следующему простому запросу:

SELECT familia FROM S WHERE nomer_s IN ('S1', 'S2', 'S3', 'S4');

Задачу из примера можно решить, применяя соединение.

SELECT familia FROM S, SP WHERE (S.nomer = SP.nomer_s) AND (nomer_p = 'P2');

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

Пример:

Выбрать фамилии поставщиков, которые поставляют, по крайней мере, одну красную деталь.

SELECT familia FROM S WHERE nomer_s IN

(SELECT nomer_s FROM SP WHERE nomer_p IN

(SELECT nomer FROM P WHERE zvet = 'красный'))

Результат:

familia
Смит
Джонс
Кларк

Если использовать соединение трех таблиц, то результат следующий:

Результат:

familia
Смит
Джонс
Кларк
Смит
Смит

Подзапрос с операцией отличной от IN

Пример:

Выбрать номера поставщиков, находящихся в том же городе, что и поставщик S1.

SELECT nomer FROM S WHERE gorod =

(SELECT gorod FROM S WHERE nomer = 'S1');

Результат:

nomer
S1
S4

Если заранее известно, что подзапрос возвратит в точности 1 значение, то вместо IN можно употребить операцию сравнения (=, <>, >, ...). Однако, если подзапрос вернет более одного значения, то возникнет ошибка.

Стандартные функции

На вопросы типа "сколько строк в таблице?" отвечают стандартные функции языка SQL (агрегирующие функции):

COUNT - количество строк

SUM - сумма значений в столбце

AVG - среднее арифметическое по значениям в столбце

MAX - наибольшее значение в столбце

MIN - наименьшее значение в столбце

SUM и AVG применяются только к столбцам числового типа.

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

Специальный вид функции COUNT(*) предназначен для подсчета всех строк в таблице, без исключения дубликатов.

Функция в части SELECT

Пример:

Подсчитать общее количество поставщиков.

SELECT COUNT(*) FROM S

Результат:

COUNT
5

Функция в части SELECT с исключением дубликатов

Пример:

Подсчитать общее количество поставщиков, поставляющих детали.

SELECT COUNT(DISTINCT nomer_s) FROM SP;

Результат:

COUNT
4

Функция в части SELECT с условием в части WHERE

Пример:

Подсчитать общее количество поставляемых деталей P2 (сколько деталей по всем поставкам?).

SELECT SUM (kol) FROM SP WHERE nomer_p = 'P2';

Результат:

SUM
1000

Группирование записей

Пример:

Требуется подсчитать общее количество поставляемых деталей по каждому виду деталей. То есть, по каждому виду выдать номер детали и суммарный объем поставок.

SELECT nomer_p, SUM(kol) FROM SP GROUP BY nomer_p;

Результат:

nomer_p SUM
P1 600
P2 1000
P3 400
P4 500
P5 500
P6 100

Как исполняется такой оператор?

1) Часть GROUP BY перекомпоновывает таблицу, указанную в части FROM в группы, таким образом, чтобы в каждой группе все строки имели одно и то же значение в столбце, указанном в GROUP BY.

2) К каждой группе перекомпонованной таблицы (а не к каждой исходной строке) применяется часть SELECT.

Каждое выражение в части SELECT должно принимать единственное значение для группы. То есть, оно может быть либо самим столбцом в части GROUP BY, либо арифметическим выражением, содержащим такой столбец, либо константой, либо функцией (например, SUM), которая сводит разные значения к одному.

Тема 9. Обновление строк в таблице

Оператор обновления (модификации) строк в одной таблице имеет вид:

UPDATE <имя таблицы>

SET <имя столбца> = <выражение>{, <имя столбца> = <выражение>}

[ WHERE <условие> ];

Все строки в таблице, которые удовлетворяют <условию>, изменяются в соответствии с присваиваниями в части SET.

Примеры:

Обновление единственной строки

Изменить цвет детали P2 на желтый и увеличить ее вес на 5.

UPDATE P SET zvet='желтый', ves=ves+5 WHERE nomer='P2';

Обновление нескольких строк

UPDATE S SET kapital=kapital*2 WHERE gorod='Лондон'

Обновление нескольких таблиц

Изменить номер поставщика с S2 на S9.