- •Информационное обеспечение систем управления
- •Содержание
- •1 Архитектуры обработки данных. 8
- •2 Способы организации данных. 10
- •3 Язык sql как язык работы с реляционными базами. 12
- •4 Данные и взаимосвязи. 13
- •5 Основы методологии idef1x 19
- •Insert into тклиент 46
- •1Архитектуры обработки данных.
- •1.1Архитектура хост/терминал.
- •1.2А рхитектура файл/сервер.
- •1.3Архитектура клиент/сервер.
- •1.4Многозвенная архитектура.
- •2Способы организации данных.
- •2.1Сетевая модель данных
- •2.2Реляционная модель данных.
- •3Язык sql как язык работы с реляционными базами.
- •4Данные и взаимосвязи.
- •4.1Объекты.
- •4.2Первичные ключи. Что выбрать в качестве первичных ключей для каждой из таблиц?
- •4.3Нормализация данных.
- •4.3.1Первая нормальная форма.
- •4.3.2 Вторая нормальная форма.
- •4.3.3Третья нормальная форма.
- •4.4Типы данных.
- •4.4.1Числовые целые типы данных.
- •4.4.2Числовые типы данных с плавающей точкой.
- •4.4.3Символьные типы данных.
- •4.4.4. Типы данных date, time и datetime.
- •4.4.5Специальные типы данных.
- •5Основы методологии idef1x
- •5.1Предназначение idef1x
- •5.2Сущности в idef1x и их атрибуты.
- •5.3Связи между сущностями
- •5.4Идентификация сущностей. Представление о ключах.
- •5.5Классификация сущностей в idef1x. Зависимые и независимые сущности.
- •5.6Типы связей между сущностями. Идентифицирующие и неидентифицирующие связи.
- •5.7Преимущества idef1x
- •5.8Модель «склад» в нотации idef1x
- •6.1Структура запроса, основные ключевые слова и операторы
- •6.1.1 Список основных операторов sql
- •6.1.2 Список основных ключевых слов sql
- •6.2Оператор select
- •6.2.1Предложение select
- •6.2.2Предложение from
- •6.2.2.1Повторяющиеся строки (ключевое слово distinct).
- •6.2.3Предложение where
- •6.2.4Условия поиска.
- •6.2.4.2Составные условия поиска (and, or и not)
- •6.2.4.3Проверка на принадлежность диапазону значений (between)
- •6.2.4.4Проверка на членство в множестве (in)
- •6.2.4.5Проверка на равенство значению null (is null)
- •6.2.4.6Проверка на соответствие шаблону (like)
- •6.2.4.7Подстановочные знаки
- •6.2.5Сортировка результатов запроса (предложение order by)
- •6.2.6 Агрегатные функции
- •6.2.6.1Вычисление суммы столбца (sum)
- •6.2.6.2Вычисление экстремумов (min и max)
- •6.2.6.3Вычисление среднего значения (avg)
- •6.2.6.4Вычисление количества значений в столбце (count)
- •6.2.7Запросы с группировкой (предложение group by)
- •6.2.8Условия поиска групп having
- •6.3Работа с несколькими таблицами
- •6.3.1Объединение при помощи оператора where
- •6.3.2Внутренние и внешние объединения
- •6.4 Вложенные запросы
- •6.4.1Исходная база данных
- •6.4.2Вложение запросов.
- •6.4.3Оператор exists
- •6.5Объединение множества запросов в один
- •6.5.1Когда можно выполнить объединение запросов ?
- •6.5.2Использование union с order by.
- •6.6Команды модификации данных
- •6.6.1Ввод значений (insert)
- •6.6.1.1Вставка пустых указателей (null)
- •6.6.1.2Именование названий столбцов для вставки
- •6.6.1.3Вставка результатов запроса
- •6.6.2Удаление строк из таблиц (delete)
- •6.6.3Изменение значений поля (update)
- •6.6.4Использование подзапросов для команд модификации данных
- •6.6.4.1Использование подзапросов в insert
- •6.6.4.2Использование подзапросов с delete
- •6.7Модификация структуры данных
- •6.7.1Команда сreate table
- •6.7.2Команда alter table.
- •6.7.3Команда drop table
6.4.2Вложение запросов.
SQL позволяет вкладывать запросы друг в друга. Внешний запрос использует значения, которые генерируются во внутреннем запросе.
Предположим, необходимо извлечь всю информацию о банке с которым
работает Киров.
Вот один из способов решения:
SELECT * FROM БАНКИ
WHERE IDN =(SELECT IDN_БАНКА FROM КЛИЕНТ WHERE ИМЯ=‘Киров’)
Выходные данные:
-
IDN
РЕКВИЗИТЫ
323
Менатеп
Чтобы оценить основной запрос, SQL должен оценить внутренний запрос ( или подзапрос) в предложении WHERE . Подзапрос оценивается так как если бы он был основным запросом: просматриваются все строки таблицы Клиент и выбираются те строки , для которых значение поля имя равно Киров, для таких строк выбираются значения поля IDN_БАНКА.
В результате выбранной оказывается строка с IDN_БАНКА = 323 . SQL подставляет его в предикат основного запроса вместо подзапроса, теперь предикат читается следующим образом:
WHERE IDN =323
После этого основной запрос выполняется как обычный, его результат показан
выше.
Если указать просто:
WHERE IDN =323
можно освободиться от подзапроса , но использование подзапроса
делает процедуру более гибкой .
В следующем примере использование подзапроса обязательно.
Получить все банки, которые не используются клиентами:
SELECT * FROM Банки
WHERE
(SELECT COUNT(*) FROM Клиент WHERE
Клиент.Idn_банка =
Банки.Idn) = 0
Еще один пример, когда необходимо использовать подзапрос:
Для каждой группы товаров найти товар с минимальной ценой, вывести название группы, название товара, цену:
SELECT Г.НАЗВАНИЕ, М НАЗВАНИЕ, П.ЦЕНА
FROM Группы Г, МАТ.ЦЕННОСТИ М, ПЕРЕМЕЩЕНИЕ П
W
HERE
М.IDN_ГРУППЫ
= П.IDN_ГРУППЫ
AND М.IDN_МАТ.ЦЕН. = П.IDN_МАТ.ЦЕН.
AND Г.IDN = П.IDN_ГРУППЫ
AND П.ЦЕНА = (SELECT MIN (ЦЕНА) FROM Перемещение ПВНУТР
W
HERE
П.IDN_ГРУППЫ
= ПВНУТР.IDN_ГРУППЫ
)
6.4.3Оператор exists
EXISTS ( существует ) оператор, генерирующий значения «истина» или «ложь». Его мoжно применять отдельно в предикате или комбинировать с другими выражениями с помощью операторов AND, OR, NOT .Этот оператор оценивает подзапрос как истинный, если подзапрос генерирует выходные данные, а в противном случае как ложный, иными словами оператор EXISTS возвращает значение «истина», если подзапрос возвращает хотя бы одну строку. В отличие от прочих операторов и предикатов, он не может принимать значения unknown (неизвестный). Например, нужно извлечь данные из таблицы Клиент в том случае, если один (или более) клиент из нее работает с банком МММ:
SELECT * FROM КЛИЕНТ
WHERE EXISTS
(SELECT * FROM КЛИЕНТ WHERE IDN_банка = 311)
Выходные данные:
-
IDN
IDN_ГОРОДА
ИМЯ
РЕКВИЗИТЫ
IDN_БАНКА
204
101
Петров
--------------
311
205
104
Кузнецов
--------------
314
206
102
Иванов
--------------
317
208
104
Золин
--------------
311
210
105
Киров
--------------
323
212
103
Павлов
--------------
317
215
105
Петренко
--------------
318
Внутренний запрос выбрал все данные обо всех клиентах, работающих с МММ.
Т.к. такие клиенты существуют , оператор EXISTS отметил, что подзапрос генерирует выходные данные, и принимает значение «истина». В данном случае тот же результат можно было получить проще, однако, бывают случаи, когда без EXISTS не обойтись.
Вывести название группы, если в ней есть товар, цена которого > 20.
SELECT ГРУППЫ.НАЗВАНИЕ
FROM ГРУППЫ
WHERE EXISTS
(
SELECT
ЦЕНА FROM
ПЕРЕМЕЩЕНИЕ
WHERE ЦЕНА> 20
AND ГРУППЫ.IDN = ПЕРЕМЕЩЕНИЕ.IDN_ ГРУППЫ)
Oператор EXISTS отметил ,что подзапрос генерирует выходные данные, и принимает значение «истина» для групп газ. вода и сигареты.
Выходные данные:
-
НАЗВАНИЕ
Газ. вода
Сигареты
Приведем еще один вариант для примера из предыдущего раздела:
Получить все банки, которые не используются клиентами:
SELECT * FROM Банки
WHERE NOT EXISTS
(SELECT * FROM Клиент WHERE
Клиент.Idn_банка =
Банки.Idn)
