- •Московский авиационный институт (Государственный технический университет)
- •Управление базами данных
- •4 Семестр
- •Лекция 1
- •Роль sql
- •Преимущества sql
- •Лекция 2
- •Лекция 3
- •Лекция 4
- •Структура предиката в предложении Where
- •Лекция 5
- •Лекция 6
- •Использование множества таблиц в одном запросе.
- •Лекция 7
- •Лекция 8
- •Представления (View)
- •Создание представлений (инструкция create view)
- •Лекция 9
- •Контроль над обновлением представлений (предложение with check option)
- •Лекция 10
- •Лекция 11
- •Триггеры
- •Лекция 12
- •Лекция 13
- •Лекция 14
- •Управление распределенными базами данных
- •Лекция 15
- •Лекция 16
- •Литература
Лекция 6
Составные условия отбора (AND OR NOT)
Для образования сложных условий отбора данных рассмотренные выше предикаты могут объединяться с использованием логических операций (AND OR NOT).
Т.к. в SQL принята трехзначная логика рассмотрим таблицы истинности этих операций для различных сочетаний аргументов.
AND |
T |
F |
Null |
T |
T |
F |
U |
F |
F |
F |
F |
Null |
U |
F |
U |
OR |
T |
F |
Null |
T |
T |
T |
T |
F |
T |
F |
U |
Null |
T |
U |
U |
NOT |
T |
F |
Null |
|
F |
T |
U |
Агрегатные функции в предложении select
Агрегатные функции применяются для обобщения значений 1-го поля, они дают единственное значение для целой группы строк таблицы.
Функции: COUNT() - определяет количество строк или значений поля, выбранных посредством запроса и не являющихся NULL - значениями.
COUNT(*) - общее количество строк, включая строки являющиеся NULL - значениями.
SUM(<имя поля>) - вычисляет арифметическую сумму всех выбранных значений данного поля.
AVG(<имя поля>) - вычисляет среднее значение для всех выбранных значений данного поля.
MAX(<имя поля>) - вычисляет наибольшее из всех выбранных значений данного поля.
MIN(<имя поля>) - вычисляет наименьшее для всех выбранных значений данного поля.
Функции агрегирования используются как имена полей в предложении SELECT, имена столбцов таблиц используются как аргументы этих функций.
Функции AVG, SUM работают только с числовыми типами данных. Функции COUNT, MAX, MIN могут использовать числовые и символьные поля в качестве аргументов. В случае применения MIN или MAX к символьным полям MIN выбирает 1-е значение (наименьшее) в соответствии с алфавитным порядком, MAX - последнее(наибольшее) значение в соответствии с алфавитным порядком.
EX:
Найти суммарный вес всех деталей:
SELECT SUM(Weight) From Parts
Агрегатные функции и Null значения
Использование множества таблиц в одном запросе.
На лаб. раб. мы рассматривали запросы выбирающие информация из нескольких таблиц.
Одна из наиболее важных черт запросов SQL состоит в их способности определять связи между множеством таблиц и отображать содержащуюся в них информацию в терминах этих связей в рамках одной команды.
Операция такого рода называется соединением (Join) и является одной из самых мощных операций для рел. баз данных.
При операции соединения таблицы перечисляются через запятую в предложении запроса FROM.
Предикат запроса может ссылаться на любой столбец любой из соединяемых таблиц и, следовательно, может использоваться для установления связей между ними. Обычно предикат сравнивает значения в столбцах различных таблиц для определения истинности условия WHERE.
Выполняя операцию соединения, необходимо генерировать все возможные сочетания строк для двух или более таблиц и проверять истинность предиката на каждом таком сочетании. Соединение, использующие предикаты, основанные на равенствах, называется эквисоединением. Фактически в соединении можно использовать любой оператор сравнения.
Наиболее часто встречающимся примером эквисоединения может служить операция соединения таблиц посредством ссылочной целостности.
Но в операции соединения могут участвовать любые столбцы различных таблиц (и даже одной и той же таблицы) не обязательно связанных отношением “предок - потомок”.
Выполнение операции соединения – декартово произведение.
Столбцами таблицы произведения являются все столбцы первой таблицы, за которыми следуют все столбцы второй таблицы.
Объединенную таблицу образуют пары тех строк из различных таблиц, у которых в связанных столбцах содержаться одинаковые значения. Если пара отсутствует (соответствующие значение еще не присвоено, т.е. имеет значение NULL), то стандартное SQL – объединение может привести к потере информации.
Рассмотренное объединение иногда называют внутренним объединением таблиц.
Внешнее объединение
В стандарте SQL 89 определено только внутренне объединение.
Построение внешнего объединения(объединения “сохраняющего информацию”)
1. Создать внутреннее объединение двух таблиц обычным образом.
2. Каждую строку первой таблицы, которая не имеет связи ни с одной строкой второй таблицы, добавить в результате запроса, присваивая всем столбцам второй таблицы значения NULL.
3. Каждую строку второй таблицы, которая не имеет связи ни с одной строкой первой таблицы, добавить в результате запроса, присваивая всем столбцам первой таблицы значения NULL.
4. Результирующая таблица является внешним объединением двух таблиц.
Полученное внешнее объединение называется полным внешним объединением. Оно симметрично по отношению к обеим таблицам. Существуют еще два типа внешних объединений, которые не симметричны относительно двух таблиц.
Левое внешнее объединение
Выполнить пункты 1 и 2, пункт 3 пропустить.(т.е. попадают в рез-т все несвязанные строки из левой таблицы). Обозначается *=.
Правое внешнее объединение
Выполнить пункты 1 и 3, пункт 2 пропустить.(т.е. попадают в рез-т все несвязанные строки из правой таблицы). Обозначается =*.
*=*
В sql2
Select * from tabl inner Join tbl2
On tabl.col1 = tabl2.col2
Или
Select * from tabl inner Join tbl2
Using (col1, col2)
Естественное соединение
Select * from tabl Natural Inner Join tbl2
Таблица, у которой все строки включаются в соединение, называется главной, а другая – вспомогательной.
Вложенные запросы
SQL позволяет выполнять вложенные подзапросы. Обычно внутренний запрос генерирует значения, которые тестируются на предмет истинности предиката. Пример:
Выбор всех записей в которых поле “имя”=<значение>
Старый вариант - использовался в лаб. работе
if !empty(thisform.combo2.value)
select nam
locate for nam_val = alltrim(thisform.combo2.value)
w_n_num=n_num
else
w_n_num=0
endif
select test_lb.uniq_id,fam.f_val as family, nam.nam_val as nam, otc.otc_val as otc,;
street.s_val as street, test_lb.bldn as bld, test_lb.bldn_kor as bld_k,;
test_lb.appr as appr, test_lb.telef as tel;
from test_lb, fam, nam, otc, street;
where nam.n_num=test_lb.name_ AND;
fam.f_num=test_lb.fam AND;
street.s_num=test_lb.street AND;
otc.otc_n=test_lb.sndname AND;
nam.n_num=w_n_num;
INTO table test
Новый вариант - с подзапросом:
select test_lb.uniq_id,fam.f_val as family, nam.nam_val as nam, otc.otc_val as otc,;
street.s_val as street, test_lb.bldn as bld, test_lb.bldn_kor as bld_k,;
test_lb.appr as appr, test_lb.telef as tel;
from test_lb, fam, nam, otc, street;
where nam.n_num=test_lb.name_ AND;
fam.f_num=test_lb.fam AND;
street.s_num=test_lb.street AND;
otc.otc_n=test_lb.sndname AND;
nam.n_num=(SELECT n_num
FROM Nam
WHERE Nam_val =‘Иван’);
INTO table test
Чтобы оценить внешний (основной) подзапрос, SQL должен оценить внутренний запрос в предложении WHERE. Эта оценка осуществляется так, как будто внутренний запрос является одиночным:
Просматриваются все строки таблицы Nam и выбираются строки для которых значение поля Nam_val=‘Иван’ для таких строк выбирается значение поля n_num. Выбранной оказывается одна строка.
Выбранное значение подставляется в предикат основного запроса. Затем основной запрос выполняется как обычный.
Преимущества: - сработает при изменении номера, более гибкий (годится для всех имен);
Подзапрос должен выбирать один и только один столбец, а тип данных этого столбца должен соответствовать типу значения указанному в предикате.
Контрольные вопросы
Перечислите функции агрегирования, используемые в предложении Select.
Опишите операцию соединения таблиц.
Особенности операции внешнего соединения таблиц.
Синтаксис SQL92 операции соединения таблиц.
