Основы информатики
Рассмотрение основных операций реляционной алгебры: декартово произведения, объединения, пересечения, разности, симметричной разности, проекции, ограничения, соединения, деления. Анализ операторов манипулирования данными. Изучение квантора существования.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | лекция |
Язык | русский |
Дата добавления | 20.09.2017 |
Размер файла | 33,1 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
1. Операции над отношениями
Одним из основных преимуществ реляционной модели является ее однородность. Все данные рассматриваются как хранимые в таблицах, в которых каждая строка имеет один и тот же формат.
Схемой отношения R называется конечное множество имен атрибутов {A1,A2,...,AN}. Каждому множеству атрибута Ai ставится в соответствие множество Di , называемое доменом атрибута Ai, 1< i < N . Домены являются произвольными непустыми конечными или счетными множествами.
Обновление отношений. Что можно делать с отношениями? Содержимое отношений изменяется во времени. Предположим, что нужно поместить дополнительную информацию в отношение. Для этого вводится операция добавление, которая для отношения R(A1,А2,... ,АN) имеет вид:
ADD (R; A1=d1, A2=d2,.. .,AN=dN)
Пример.
ADD (Расписание; НОМЕР=117, ПУНКТ_ОТПРАВЛЕНИЯ=РИГА,
ПУНКТ_НАЗНАЧЕНИЯ=КИЕВ, ВРЕМЯ_ВЫЛЕТА=22.05,
ВРЕМЯ_ПРИБЫТИЯ=0.43)
Когда порядок имен атрибутов фиксирован, допустима более короткая запись:
ADD (Расписание; 117, РИГА, КИЕВ, 22.05, 0.43)
Результат операции может быть ошибочен, если: добавляемый кортеж не соответствует схеме определенного отношения; некоторые значения кортежа не принадлежат соответствующим доменам; описанный кортеж совпадает по ключу с кортежем, уже находящимся в отношении. Во всех случаях операция ADD оставляет отношение R неизменным и сообщает об ошибке.
Операция удаление: DEL (R; A1=d1, A2=d2, ..., AN=dN)
Если имена атрибутов упорядочены, то DEL (R; d1, d2, ..., di).
Например: DEL (расписание, 305, МОСКВА, СВЕРДЛОВСК, 21.50, 15.10)
Можно произвести удаление по ключу: DEL (расписание; 83).
Операция изменения: СН (R; В1=d1; B2=d2,..., Вm=dm; C1=e1, C2 =e2, ..., Cр=eр)
Пример.
СН (Расписание; НОМЕР=323, ПУНКТ_ОТПРАВЛЕНИЯ=МОСКВА, ПУНКТ_НАЗНАЧЕНИЯ=СВЕРДЛОВСК, ВРЕМЯ_ВЫЛЕТА=21.30, ВРЕ-МЯ_ПРИБЫТИЯ= 14.50)
Сокращенный вариант:
СН (расписание; ОМЕР=323, ВРЕМЯ_ВЫЛЕТА=21.30, ВРЕМЯ_ПРИБЫТИЯ=14.50)
Выполнение операций над отношениями
Для получения информации из отношений необходим язык манипулирования данными (ЯМД), способный выполнять соответствующие операции над отношениями. Наиболее важной частью ЯМД является его раздел для формулировки запросов.
Были разработаны три типа теоретических языков: реляционная алгебра, реляционное исчисление с переменными-кортежами, реляционное исчисление с переменными-доменами. Реальные языки (ISBL, SEQUEL, QBE и другие).
Реляционная алгебра. Основные операции реляционной алгебры можно разделить на традиционные и специализированные. Операции первой группы: декартово произведение, объединение, пересечение, разность, симметричная разность. Операции второй группы: проекция, ограничение, соединение, деление.
1. Объединение отношений R1 и R2
R = R1 R2 = {г | г R1 r R2 }
2. Разность отношений R1 и R2
R = R1 - R2 = {r r R1 r R2}
3. Декартово произведение отношений R1 и R2
R = R1 х R2 = {r1r2 r 1 R1 r 2 R2}
4. Проекция отношения R1 на компоненты i1, i2, ..., iR:
R = i1, i2, …,iR (R1 ),
где i1, i2, ..., iR номера столбцов отношения R1.
Деление - представляет процесс, соответствующий операции обратной к декартовому произведению.
(R1 R2 ) R2 = R1
2. Реляционные языки запросов
Существуют языки: ISBL - язык системы PRTV, QUEL -язык системы INGRES, SQL - язык системы System R; QBE - язык интерфейса высокого уровня в ряде СУБД, PIQUE - язык экспериментальной системы PITS. ISBL ос-нован на реляционной алгебре. QUEL и SQL - на исчислении кортежей. QBE -язык, основанный на исчислении доменов. PIQUE - похож на исчисление кортежей, но обеспечивает интерфейс со схемой помощью W-функций. квантор реляционный оператор
2.1 Язык SQL (Structured Query Language)
Язык был разработан в компании IBM в начале 70-х годов, его первой реализацией был продукт System R; впоследствии он был реализован в много-численных коммерческих продуктах как фирмы IBM, так и других изготовите-лей. Язык SQL стал Американским национальным стандартом (ANSI), Международным стандартом (ISO), стандартом системы UNIX (X/Open). Он используется для описания реляционных операций. Стандарты: SQL/89, SQL/92.
В реляционных системах выполняются как минимум 2 условия:
1. Данные воспринимаются пользователем как таблицы.
2. В распоряжении пользователя имеются операторы (например, для выборки данных), среди которых есть операторы SELECT, PROJECT и JOIN.
Операция SELECT предназначена для извлечения определенных строк из таблиц
Операция PROJECT предназначена для извлечения определенных столбцов из таблицы.
Операция JOIN предназначена для соединения двух таблиц на основе общих значений в общих столбцах.
Все эти операции могут быть сформулированы на языке SQL.
Пусть имеются 2 таблицы:
ОТДЕЛЫ (№ отдела, Наименование, Бюджет)
СЛУЖАЩИЕ (№ служащего, № отдела, Оклад)
1. SELECT:
SELECT № отдела, Наименование, Бюджет
FROM ОТДЕЛЫ
WHERE Оклад >400р.
2. PROJECT:
SELECT № отдела, Бюджет
FROM ОТДЕЛЫ
3. JOIN:
SELECT ОТДЕЛЫ.*, СЛУЖАЩИЕ.*
FROM ОТДЕЛЫ, СЛУЖАЩИЕ
WHERE ОТДЕЛЫ. № отдела = СЛУЖАЩИЕ. № отдела
Функции определения данных:
CREATE TABLE - оператор создания таблицы ;
CREATE INDEX - оператор создания индексной таблицы;
DROP TABLE - оператор удаления таблицы ;
DROP INDEX - оператор удаления индексной таблицы.
2.2 Операторы манипулирования данными
В языке SQL предусмотрено четыре предложения манипулирования данными: SELECT (выдать, выбрать), UPDATE (обновить), DELETE (удалить) и INSERT (включить).
Создадим БД Поставщиков (S), Деталей (Р) и Поставок (SP).
CREATE TABLE S
(НОМЕР_ПОСТАВЩИКА CHAR (5),
ИМЯ CHAR (20),
СОСТОЯНИЕ SMALLINT,
ГОРОД CHAR (15));
CREATE TABLE Р
(НОМЕР_ДЕТАЛИ CHAR (6),
НАЗВАНИЕ_ДЕТАЛИ CHAR (20),
ЦВЕТ CHAR (7),
ВЕС SMALLINT,
Город CHAR (15));
CREATE TABLE SP
(НОМЕР_ПОСТАВЩИКА CHAR (5),
НОМЕР_ДЕТАЛИ CHAR (6),
КОЛИЧЕСТВО INTEGER);
Содержимое базы данных представлено в табл. 2.1, 2.2, 2.3
Таблица 5.1 Поставщики(Р)
НОМЕР_ПОСТАВЩИКА |
ИМЯ |
СОСТОЯНИЕ |
ГОРОД |
|
S1S2S3S4S5 |
СашаДимаБоряКоляАлик |
2010302030 |
ЛипецкПермьПермьЛипецкАрзамас |
Таблица 5.2 Детали (P)
НОМЕР_ДЕТАЛИ |
НАЗВАНИЕ |
ЦВЕТ |
ВЕС |
ГОРОД |
|
Р1Р2Р3Р4Р5Р6 |
ГайкаБолтВинтВинтКулачокБлюм |
КрасныйЗеленыйГолубойКрасныйГолубойКрасный |
121717141219 |
ЛипецкПермьРигаЛипецкПермьЛипецк |
Таблица 5.3 Поставки (SP)
НОМЕР_ПОСТАВЩИКА |
НОМЕР_ДЕТАЛИ |
КОЛИЧЕСТВО |
|
S1S1S1S1S1S1S2S2S3S4S4S4 |
Р1Р2Р3P4P5P6P1P2P2P2P4P5 |
300200400200100100300400200200300400 |
2.3 Выборки
Основной операцией в языке SQL является отображение, синтаксически представляющее собой блок SELECT - FROM - WHERE (выбрать - из - где).
Структура оператора SELECT:
SELECT [DISTINCT] элементы
FROM таблица
[WHERE <предикат>]
[GROUP BY <поле> [HAVING <предикат>]]
[ORDER BY <поле>]
где: DISTINCT означает, что из таблицы результатов исключается дублирование.
GROUP BY поле - создаются группы, в которых указанное поле имеет одно и то же значение.
HAVING <предикат> - из результата будут исключены некоторые группы.
ORDER BY <поле> - результат будет отсортирован по указанному полю.
Выдать номера и состояния для поставщиков, находящихся в Перми:
SELECT НОМЕР_ПОСТАВЩИКА, СОСТОЯНИЕ
FROM S
WHERE ГОРОД= 'Пермь'
Результат: НОМЕР ПОСТАВЩИКА СОСТОЯНИЕ
S2 10
S3 30
Простая выборка. Выдать номера для всех поставляемых деталей:
SELECT НОМЕР_ДЕТАЛИ
FROM SP
Результат: НОМЕР ДЕТАЛИ
Р1
Р2
РЗ
Р4
Р5
Р6
Р1
Р2
Р2
P4
Р5
Выборка с исключением дубликатов.
SELECT DISTINCT НОМЕР_ДЕТАЛИ
FROM SP
Результат: НОМЕР ДЕТАЛИ
Р1
Р2
РЗ
Р4
Р5
Р6
SELECT DISTINCT - означает выбрать различные.
Выборка вычисляемых значений. Выдать номер и вес каждой детали:
SELECT НОМЕР_ДЕТАЛИ, ВЕС
FROM P
Результат: НОМЕР ДЕТАЛИ ВЕС
Р1 12
Р2 17
РЗ 17
Р4 14
Р5 12
Рб 19
Фраза SELECT (и фраза WHERE) может включать арифметические выражения, а также прочие имена полей. Можно, кроме того, осуществлять выборку просто констант.
SELECT НОМЕР_ДЕТАЛИ, 'Вес в граммах=', ВЕС
FROM P
Результат: НОМЕР ДЕТАЛИ ВЕС
. Р1 Вес в граммах= 12
Р2 Вес в граммах= 17
РЗ Вес в граммах= 17
Р4 . Вес в граммах= 14
Р5 Вес в граммах= 12
Р6 Вес в граммах= 19
Выдать полные характеристики для всех поставщиков:
SELECT *
FROM S
Результатом будет таблица S со всеми полями.
Ограниченная выборка. Выдать номера поставщиков, которые находятся в Перми и имеют состояние больше, чем 20.
SELECT НОМЕР_ПОСТАВЩИКА
FROM S
WHERE ГОРОД='Пермь' AND СОСТОЯНИЕ > 20
Результат: НОМЕР ПОСТАВЩИКА
S3
Условие или предикат, следующий за ключевым словом WHERE, может включать операторы сравнения =, <> (не равно), >, >, >=, , < и <=, булевские операторы AND (и), OR (или) и NOT (нет), а скобки указывают требуемый порядок вычислений.
Выборка с упорядочением. Выдать номера и состояния поставщиков, находящихся в Перми, в порядке убывания их состояния:
SELECT НОМЕР_ПОСТАВЩИКА
FROM S
WHERE ГОРОД='Пермь'
ORDER BY СОСТОЯНИЕ DESC
Результат: НОМЕР ПОСТАВЩИКА СОСТОЯНИЕ
S3 30
S2 10
Параметры:
ASC - возрастание, DECS - убывание, ORDER BY - упорядочить.
При упорядочивании можно указывать номер столбца:
SELECT НОМЕР_ДЕТАЛИ, ВЕС
FROM P
ORDER BY 2, НОМЕР_ДЕТАЛИ
В строке ORDER BY … цифра 2 означает ссылку на второй столбец результирующей таблицы.
Результат: НОМЕР_ДЕТАЛИ ВЕС
Р1 12
Р5 12
Р4 14
Р2 17
РЗ 17
Р6 19
Выборка с использованием BETWEEN (между). Выдать сведения о деталях, вес которых находится в диапазоне от 16 до 19 включительно:
SELECT НОМЕР_ДЕТАЛИ, НАЗВАНИЕ, ЦВЕТ, ВЕС, ГОРОД
FROM P
WHERE ВЕС BETWEEN 16 AND 19
Результат: НОМЕР ДЕТАЛИ НАЗВАНИЕ ЦВЕТ ВЕС ГОРОД
Р2 Болт Зеленый 17 Пермь
РЗ Винт Голубой 17 Рига
Р6 Шайба Красный 19 Липецк
Может также использоваться NOT BETWEEN.
Выборка с использованием IN .Выдать детали, вес которых 12,16,17.
SELECT НОМЕР _ДЕТАЛИ, НАЗВАНИЕ, ВЕС, ГОРОД
FROM P
WHERE ВЕС IN (12, 16,17)
Существует также предикат NOT IN (не принадлежит).
Выборка с использованием предиката LIKE (похоже на).Выдать все детали, название которых начинается с буквы В:
SELECT НОМЕР_ДЕТАЛИ, НАЗВАНИЕ, ЦВЕТ, ВЕС, ГОРОД
FROM P
WHERE НАЗВАНИЕ LIKE 'B%'
Обычно предикат LIKE имеет форму:
Имя столбца LIKE литерная строковая константа,
где имя столбца имеет тип CHAR.
Литеры:
- Литера " _ " (разрыв или подчеркивание) или " ? " - обозначает любую одиночную литеру.
- Литера " %" (процент) или " * " - обозначает любую последовательность из нескольких литер.
- Все другие литеры обозначают просто сами себя.
Примеры:
АДРЕС LIKE '% Брест %' будет приниматься истина, если АДРЕС содержит строку "Брест".
НОМЕР_ПОСТАВЩИКА LIKE 'S_ _' будет истина, если номер состоит из трех литер и первая из них литера S.
НАЗВАНИЕ LIKE '% К_ _ _' будет истина, если название состоит из четырех и более литер и трем последним из них предшествует литера К.
ГОРОД NOT LIKE '% Е %' будет истина, если значение литера не содержит литеры Е.
2.4 3апросы, использующие соединения
Способность соединять две или более таблицы в одну, представляет собой одну из наиболее мощных средств реляционных систем.
Простое эквисоединение. Выдать все комбинации информации о таких поставщиках и деталях, которые размещены в одном и том же городе: SELECT S.*,P.*
FROM S,P
WHERE S.ГОРОД == Р.ГОРОД
Будут выбраны все строки с одинаковыми городами. Это декартово произведе ние таблиц.
Варианты:
- WHERE S.ГОРОД Б<> Р.ГОРОД
- WHERE S.ГОРОД = Р.ГОРОД
AND S.СОСТОЯНИЕ = 20
При соединении необязательно чтобы было равенство. В случае равенства соединение называется эквисоединением.
В SELECT могут быть указаны выборочные поля, а не все. Выражение:
SELECT S.*, Р.* может быть записано: SELECT *
FROM S,P FROM S,Р
Но может быть записано и с указанием всех полей.
Так как при соединении возникают два одинаковых столбца (S.Город и Р.Город), то один столбец исключается и такое соединение называется естественным. Могут быть соединения и 3, 4 или любого числа таблиц.
Соединение с дополнительным условием. Выдать все комбинации информации о поставщиках и деталях, такие, что рассматриваемые поставщики и детали “соразмещены”. Опустить при этом поставщиков с состоянием 20:
SELECT *
FROM S, Р
WHERE S.ГОРОД = Р.ГОРОД
AND S.СОСТОЯНИЕ <>
Результат: НОМЕР_ПОСТАВЩИКА ИМЯ СОСТОЯНИЕ S.ГОРОД
S2 Дима 10 Пермь
S2 Дима 10 Пермь
S3 Боря 30 Пермь
S3 Боря 30 Пермь
НОМЕР_ДЕТАЛИ НАЗВАНИЕ ЦВЕТ ВЕС Р.ГОРОД
Р2 Болт Зеленый 17 Пермь
Р5 Кулачок Голубой 12 Пермь
Р2 Болт Зеленый 17 Пермь
Р5 Кулачок Голубой 12 Пермь
2.5 Подзапросы
Подзапросы представляют собой вложенные предложения SELECT. Именно такая возможность позволила назвать язык SQL структурированным.
Выдать фамилии поставщиков, поставляющих детали Р2:
SELECT ИМЯ
FROM S
WHERE НОМЕР_ПОСТАВЩИКА IN
(SELECT НОМЕР_ПОСТАВЩИКА
FROM SP
WHERE НОМЕР_ДЕТАЛИ = `P2');
Результат: ИМЯ
Саша
Дима
Боря
Коля
Этот подзапрос возвращает множество поставщиков, поставляющих деталь Р2:
S1, S2, S3, S4. Поэтому первоначальный запрос эквивалентен простому запросу :
SELECT ФАМИЛИЯ
FROM S
WHERE НОМЕР_ПОСТАВЩИКА IN (`S1','S2','S3','S4')
Номер поставщика здесь задан неявно. Для явного задания необходимо указать имя таблицы .
SELECT S.ИМЯ
FROM S
WHERE S.НОМЕР_ПОСТАВЩИКА IN
(SELECT SP.НОМЕР_ПОСТАВЩИКА
FROM SP
WHERE SP.HOMEP_ДЕТАЛИ='P2')
Этот же подзапрос может быть выражен и соединением:
SELECT S.ИМЯ
FROM S, SP
WHERE S.HOМЕР_ПОСТАВЩИКА = P.HOMEP_ПОСТАВЩИКА
AND SP.HOMEP_ДЕТАЛИ = 'P2'
Подзапросы с несколькими уровнями вложения
Выдать имена поставщиков, поставляющих красные детали:
SELECТ ИМЯ
FROM S
WHERE НО МЕР_ПОСТАВЩИКА IN
(SELECT НОМЕР_ПОСТАВЩИКА
FROM SP
WHERE НОМЕР_ДЕТАЛИ IN
(SELECT НОМЕР_ДЕТАЛИ
FROM P
WHERE ЦВЕТ = 'Красный'))
Результат: ИМЯ
Саша
Дима
Коля
2.7 Коррелированный подзапрос
Выдать имена поставщиков, которые поставляют деталь P2:
SELECT ФАМИЛИЯ
FROM S
WHERE `P2' IN
(SELECT НОМЕР_ДЕТАЛИ
FROM SP
WHERE НОМЕР_ПОСТАВЩИКА = S.НОМ ЕР_ПОСТАВЩИКА
В данном случае в предикате подзапроса
WHERE НОМЕР_ПОСТАВЩИКА = S. НОМЕР_ПОСТАВЩИКА задано не какое-то конкретное значение номера поставщика, а название поля S. НОМЕР_ПОСТАВЩИКА и алгоритм работы следующий.
Система проверяет первую строку таблицы S. Предположим, что это строка поставщика "S1". Тогда переменная S.HOMEP_ПОСТАВЩИКА в данный момент имеет значение "S1", и система обрабатывает внутренний запрос:
(SELECT НОМЕР_ДЕТАЛИ
FROM SP
WHERE НОМЕР_ПОСТАВЩИКА = ' S 1')
Далее система будет повторять обработку такого рода для следующего поставщика и т. д., пока не будут рассмотрены все строки таблицы S.
Такой подзапрос, как в этом примере, называется коррелированным. Для того чтобы сделать более ясной связь коррелированных подзапросов с внешними запросами, иногда вводят псевдонимы.
Например:
SELECT SX.ИМЯ
FROM S SX
WHERE 'P2' IN
(SELECT НОМЕР_ДЕТАЛИ
FROM SP
WHERE НОМЕР_ПОСТАВЩИКА = SX. НОМЕР_ПОСТАВЩИКА)
Здесь псевдонимом является имя SX, введенное во фразе FROM как альтернативное имя таблицы S, т. е.
- SX - это переменная, областью определения которой является множество записей таблицы S.
Поочередно для каждого возможного значения SX выполняется следующее:
1) вычисляется подзапрос и получается множество номеров деталей Р;
2) добавляется к результирующему множеству значение SX. ИМЯ, если
только P2 принадлежит множеству Р.
Некоторые считают более ясным использование двух различных символов для того, чтобы различать эти две различные функции.
Использование одной и той же таблицы в подзапросе и внешнем запросе. Выдать номера поставщиков, которые поставляют по крайней мере одну деталь, поставляемую поставщиком S2:
SELECT DISTINCT НОМЕР_ПОСТАВЩИКА
FROM SP
WHERE НОМЕР_ДЕТАЛИ IN
(SELECT НОМЕР_ДЕТАЛИ
FROM SP
WHERE НОМЕР_ПОСТАВЩИКА = 'S2')
Результат: НОМЕР ПОСТАВЩИКА
S1
S2
S3
S4
Решение этой задачи с использованием псевдонимов:
SELECT DISTINCT SPX.HOMEP_ПОСТАВЩИКА
FROM SP SPX
WHERE SPX.HOMEP_ДЕТАЛИ IN
(SELECT SPY.HOMEP_ДЕТАЛИ
FROM SP SPY
WHERE SPY.HOMEP_ПОСТАВЩИКА = ' S2')
Эквивалентный запрос с использованием соединения имеет вид:
SELECT DISTINCT SPX.HOMEP_ПОСТАВЩИКА
FROM SP SPX, SP SPY
WHERE SPX.HOMEP_ДЕТАЛИ=SPY.HOMEP_ДЕТАЛИ
AND SPY.HOMEP_ПОСТАВЩИКА = ' S2'
Случай, когда в коррелированном и внешнем запросе используется одна и та же таблица. Выдать номера всех деталей, поставляемых более чем одним поставщиком:
SELECT DISTINCT SPX.HOMEP_ДЕТАЛИ
FROM SP SPX
WHERE SPX.HOMEP_ДЕТАЛИ IN
(SELECT SPY.HOMEP_ДЕТАЛИ
FROM SP SPY
WHERE SPY.НОМЕР_ПОСТАВЩИКА<>SPX.НОМЕР_ПОСТАВЩИКА)
Результат: НОМЕР ДЕТАЛИ
Р1
P2
P4
P5
Подзапрос с оператором сравнения, отличным от IN. Выдать номера поставщиков, находящихся в том же городе, что и поставщик S 1:
SELECT НОМЕР_ПОСТАВЩИКА
FROM S
WHERE ГОРОД=
(SELECT ГОРОД
FROM S
WHERE НОМЕР_ПОСТАВЩИКА = ' S 1')
Результат: НОМЕР ПОСТАВЩИКА
Sl
S4
2.8 Квантор существования. Запрос, использующий EXISTS
Выдать фамилии поставщиков, которые поставляют деталь Р2:
SELECT ИМЯ
FROM S
WHERE EXISTS
(SELECT *
FROM SP
WHERE НОМЕР_ПОСТАВЩИКА = S.НОМЕР_ПОСТАВЩИКА AND НОМЕР_ДЕТАЛИ='Р2')
EXISTS (существует) представляет здесь квантор существования - понятие, заимствованное из формальной логики.
Квантор существования EXISTS (SELECT* FROM… WHERE….) принимает значение истина, если подзапрос выдает непустое множество и наоборот.
Запрос, использующий NOT EXISTS. Выдать имена поставщиков, которые не поставляют деталь Р2:
SELECT ИМЯ
FROM S
WHERE NOT EXISTS
(SELECT *
FROM SP
WHERE НОМЕР_ПОСТАВЩИКА = S.НОМЕР_ПОСТАВЩИКА AND НОМЕР_ДЕТАЛИ = 'P2')
NOT EXISTS (SELECT* FROM… WHERE….)
принимает значение истина, если подзапрос выдает пустое множество и наоборот.
2.9 Стандартные функции
В запросах могут использоваться следующие стандартные функции: COUNT число значений в столбце; SUM сумма значений какого-либо столбца; AVG среднее значение; MAX самое большое значение в столбце; MIN самое малое значение в столбце.
Выдать общее количество поставщиков:
SELECT СOUNT (*)
FROM S
Результат: 5
Выдать общее количество поставляемых деталей P2:
SELECT SUМ (Количество)
FROM SP
WHERE НОМЕР_ДЕТАЛИ = `P2'
Результат: 1000
Функция в подзапросе. Выдать номера поставщиков со значением поля СОСТОЯНИЕ меньшим, чем текущее максимальное состояние в таблице S:
SELECT НОМЕР_ПОСТАВЩИКА
FROM S
WHERE СОСТОЯНИЕ <
(SELECT MAX (СОСТОЯНИЕ)
FROM S)
Результат: НОМЕР ПОСТАВЩИКА
S1
S2
S3
2.10 Использование группировок (GROUP BY)
Вычислить общий объем поставок для каждой детали:
SELECT НОМЕР_ДЕТАЛИ, SUM (КОЛИЧЕСТВО)
FROM SP
GROUP BY НОМЕР_ДЕТАЛИ
Результат: НОМЕР ДЕТАЛИ
Р1 600
Р2 1000
РЗ 400
Р4 500
Р5 500
Р6 100
Запрос с использованием HAVING (Исключение всех групп, для которых не выполняется заданное условие). Выдать номера деталей, поставляемых более чем одним поставщиком:
SELECT НОМЕР_ДЕТАЛИ
FROM SP
GROUP BY НОМЕР_ДЕТАЛИ
HAVING COUNT (*) > 1
Результат: НОМЕР ДЕТАЛИ
Р1
Р2
Р4
Р5
2.11 Объединение с использованием UNION
Выдать номера деталей, которые имеют вес больше 16, либо поставляются поставщиком S2 (либо то и другое):
SELECT НОМЕР_ДЕТАЛИ
FROM P
WHERE ВЕС > 16
UNION
SELECT НОМЕР_ДЕТАЛИ
FROM SP
WHERE НОМЕР_ПОСТАВЩИКА = 'S2'
Результат: НОМЕР ДЕТАЛИ
Р1
Р2
РЗ
Р6
2.12 Операции обновления
UPDATE, DELETE, INSERT. Предложение UPDATE:
UPDATE таблица
SET поле = выражение [, поле = выражение]
[WHERE предикат]
Обновление одной записи. Изменить цвет детали Р2 на желтый, увеличить ее вес на 5 и установить значение города "неизвестный" (NULL):
UPDATE P
SET ЦВЕТ = 'Желтый',
ВЕС = ВЕС + 5,
ГОРОД = NULL
WHERE НОМЕР_ДЕТАЛИ = 'Р2'
Обновление множества записей. Удвоить состояние всех поставщиков, находящихся в Перми:
UPDATE S
SET СОСТОЯНИЕ = 2 * СОСТОЯНИЕ
WHERE ГОРОД = 'Пермь'
Обновление с подзапросом. Установить нулевой объем поставок для всех поставщиков из Перми:
UPDATE SP
SET КОЛИЧЕСТВО = 0
WHERE 'Пермь' =
(SELECT ГОРОД
FROM S
WHERE S.HOMEP_ПОСТАВЩИКА = SP. НОМЕР_ПОСТАВЩИКА)
Обновление нескольких таблиц. Изменить номер поставщика S2 на S9:
UPDATE S
SET НОМЕР_ПОСТАВЩИКА = 'S9'
WHERE НОМЕР_ПОСТАВЩИКА = 'S2'
UPDATE SP
SET НОМЕР_ПОСТАВЩИКА ='S9'
WHERE НОМЕР_ПОСТАВЩИКА = 'S2'
Здесь БД становится противоречивой после выполнения первой строчки UPDATE (нарушается целостность). Поэтому требуется второй UPDATE.
Предложение DELETE:
DELETE
FROM таблица
[WHERE предикат]
Пример 5.33. Удаление единственной записи.
Удалить поставщика S1:
DELETE
FROM S
WHERE НОМЕР_ПОСТАВЩИКА = ' S 1'
Удаление множества записей. Удалить всех поставщиков из Перми:
DELETE
FROM S
WHERE ГОРОД = 'Пермь'
Удалить все поставки:
DELETE
FROM SP
Удаление с подзапросом. Удалить все поставки для поставщиков из Риги:
DELETE
FROM SP
WHERE `Рига'=
(SELECT ГОРОД
FROM S
WHERE S .НОМЕР_ПОСТАВЩИКА = SP.HOMEP_ПОСТАВЩИКА)
Предложение INSERT:
INSERT
INTO таблица [(поле [, поле] ...)]
VALUES (константа [, константа] ...)
i я константа соответствует i-му полю.
Вставка единственной записи.
INSERT
INTO P (НОМЕР_ДЕТАЛИ, ГОРОД, ВЕС)
VALUES ('P5', 'Пермь',12)
Можно с опущенными именами полей:
INSERT
INTO P
VALUES ('P5', 'Кулачок', 'Голубой', 12, 'Пермь')
Вставка множества записей. Для каждой поставляемой детали получить ее номер и общий объем поставок, сохранить результат в БД:
CREATE TABLE ВРЕМЕННАЯ
(НОМЕР_ДЕТАЛИ CHAR(6),
ОБЪЕМ_ПОСТАВКИ INTEGER);
INSERT
INTO ВРЕМЕННАЯ (НОМЕР_ДЕТАЛИ, ОБЪЕМ_ПОСТАВКИ)
SELECT НОМЕР_ДЕТАЛИ, SUM (КОЛИЧЕСТВО)
FROM SP
GROUP BY НОМЕР_ДЕТАЛИ
Здесь предложение SELECT выполняется точно так же, как обычно, но результат не возвращается пользователю, а копируется в таблицу ВРЕМЕННАЯ.
2.13 Встроенный язык SQL
При включении операторов SQL в базовый язык программирования необходимо чтобы операторы SQL включались непосредственно в текст программы исходного языка программирования.
Во встроенном SQL, запросы делятся на два типа:
· Однострочные запросы,
· Многострочные запросы
Однострочный запрос во встроенном SQL вызвал необходимость модификации оператора SQL - SELECT. Здесь появляется дополнительный атрибут INTO. С помощью INTO, найденные значения полей базы данных передаются в переменные базового языка.
SELECT [ALL | DISTINCT] <список полей>
INTO <список переменных базового языка>
FROM <список исходных таблиц>
[WHERE <предикат>]
Пример. Пусть имеется отношение: STUD (NS, FIO, GR, SPEC)
DECLARE p1 int,
DECLARE p2 char(20), p3 char(4), p4 char(30)
SET p1=205
SELECT *
INTO p2, p3, p4
FROM STUD
WHERE NS=p1
Для реализации многострочных запросов, вводится новое понятие - понятие курсора. Для работы с курсором добавляется несколько новых операторов SQL.
DECLARE <имя курсора> CURSOR - объявление некоторого курсора, с помощью которого можно проводить обработку записей.
FOR <подзапрос>
OPEN <курсор> - оператор открытия курсора.
По команде OPEN происходит выполнение запроса.
FETCH <курсор> INTO <список переменных>, используется для выборки записей и передачи значений в список переменных.
CLOSE <курсор> - оператор закрытия курсора
Пример:
DECLARE q CURSOR
FOR SELECT *
FROM STUD
WHERE SPEC=”230102”
OPEN q
WHILE .T.
FETCH q INTO A, B, C, D,
DO PROC
END WHILE
CLOSE q
Пример. Пусть имеется БД, связанная с поставками изделий.
Поставщики S(NП, ФИО, Состояние)
Детали P(NД, НазваниеД, Цвет, Вес, Город)
Изделия J(NИ, НазваниеИз, Город)
Поставки SPJ(NП, NД, NИ, Количество)
Необходимо составить программу вывода записей поставщиков в порядке их номеров, при этом за каждой записью поставщика должны непосредственно следовать в порядке номеров изделий все записи изделий, для которых поставляет детали данный поставщик.
MAIN
DEFINE PS.* LIKE S.*
DEFINE PJ.* LIKE J.*
DECLARE CS CURSOR FOR
SELECT NП, ФИО, Состояние, Город
FROM S
ORDER BY NП
DECLARE CS CURSOR FOR
SELECT NИ, НазваниеИз, Город
FROM J
WHERE NИ IN
(SELECT NИ
FROM SPJ
WHERE NП=S.NП)
ORDER BY NИ
OPEN CS
LET V=”1”B
LET R=”1”B
WHILE V
IF STATUS=NOTFOUND
THEN MESSAGE “NO ROW FOUND”
EXIT WHILE
END IF
FETCH CS INTO PS.NP, PS.ФИО, PS.Состояние, PS.Город
DISPLAY PS.NP, PS.ФИО, PS.Состояние, PS.Город
OPEN CJ
WHILE R
FETCH CJ INTO PJ.NИ, PJ.НазваниеИз, PJ.Город
DISPLAY PJ.NИ, PJ.НазваниеИз, PJ.Город
END WHILE
CLOSE CJ
END WHILE
CLOSE CS
END MAIN
Динамический SQL. Если множество команд, которые может принимать программа, сравнительно невелико (например, бронирование мест на авиалиниях), то и множество возможных предложений SQL, выдаваемых программой, также будет небольшим и может быть зашито в программу.
Если же количество вариантов входных данных будет большим, то зашить их в программу не удается. В этом случае удобно динамически формировать предложения SQL.
Для динамического формирования SQL используются два основных предложения:
PREPARE - подготовить
EXECUTE - выполнить
Схема их использования состоит в следующем:
DEFINE Исходный-SQL CHAR
DECLARE Объектный-SQL оператор
Исходный-SQL=”DELETE FROM SP
WHERE количество<100”
PREPARE Объектный-SQL FROM Исходный-SQL
EXECUTE Объектный-SQL
Размещено на Allbest.ru
...Подобные документы
Механизм манипулирования реляционными данными. Теоретико-множественные и специальные реляционные операции. Объединение, пересечение, взятие разности и взятие декартова произведения отношений. Операция взятия проекции. Операции реляционной алгебры.
презентация [260,8 K], добавлен 06.01.2014Рассмотрение методов совершения основных операций (содержания, равенства, пересечения, объединения, разности, произведения, отрицания и дизъюнктивной суммы) над нечеткими множествами, их функциональных моделей и программной реализации решения задачи.
курсовая работа [486,8 K], добавлен 25.01.2010Реляционная алгебра как система операций над отношениями в реляционной модели данных. Теоретико-множественные операторы, синтаксис операций объединения, пересечения, вычитания и декартова произведения. Использование баз данных в вычислительной технике.
курсовая работа [46,7 K], добавлен 01.02.2015Внутренний язык СУБД для работы с данными. Результат компиляции DDL-операторов. Описание DML-языка, содержащего набор операторов для поддержки основных операций манипулирования содержащимися в базе данными. Организация данных и управление доступом в SQL.
лекция [131,0 K], добавлен 19.08.2013Соединения и теоретико-множественные операции над отношениями. Операции выборки, проекции и декартово произведение. Операция соединения по двум отношениям. Построение вычисляемых полей. Запросы модификации данных. Основные ограничения для доменов полей.
презентация [281,4 K], добавлен 14.10.2013Исследование основных операторов языка SQL. Изучение отличий операций произведения и соединения отношения. Выбор из базы данных запрошенной информацию и передача ее пользователю для работы. Список выборки оператора Select. Логическое выражение в опции.
презентация [48,2 K], добавлен 07.12.2013Классификации баз данных и СУБД. Технология модели "клиент-сервер". Особенности языка структурированных запросов SQL. Структура и назначение операторов определения, манипулирования и управления данными. Разработка реляционной БД, создание SQL запросов.
курсовая работа [1,4 M], добавлен 17.08.2015Рассмотрение основных понятий, единиц измерения и языка информатики. Изучение двоичной арифметики, логических элементов, алгоритмизации. Анализ базовой конфигурации компьютера, его программного обеспечения (системное, прикладное) и операционных систем.
контрольная работа [629,1 K], добавлен 11.02.2010Изучение областей использования вычислительной техники, истории систем управления данными во внешней памяти. Анализ разработки ряда стандартов в рамках языков описания и манипулирования данными. Обзор технологий по обмену данными между различными СУБД.
презентация [263,2 K], добавлен 30.05.2012Рассмотрение особенностей структурной и целостной частей реляционной модели базы данных, их функции. Знакомство с основными этапами разработки стратегии поддержания ссылочной целостности. Общая характеристика способов манипулирования реляционными данными.
курсовая работа [565,8 K], добавлен 25.04.2013Общие данные об основных операторах языка SQL. Интерактивный режим работы. Использование языка SQL для выбора информации из таблиц, для вставки, редактирования и удаления данных в них. Связь между операциями реляционной алгебры и операторами языка SQL.
реферат [146,5 K], добавлен 06.02.2015Создание базы данных в Visual FoxPro. Упорядочивание данных в таблицах. Определение отношений между таблицами и проверка условий целостности данных. Расширенные SQL-запросы и безусловная выборка значений. Использование квантора существования в запросах.
методичка [926,3 K], добавлен 30.09.2013Изучение и анализ функциональных возможностей СУБД. Структура языка реляционных БД SQL (Structured Query Language). Типы данных SQL. Операторы DDL - операторы определения объектов базы данных. Примеры использования операторов манипулирования данными.
курсовая работа [39,6 K], добавлен 21.07.2012Работа с хранящейся в базах данных информацией. Язык описания данных и язык манипулирования данными. Распространение стандартизованных языков. Структурированный язык запросов SQL. Язык запросов по образцу QBE. Применение основных операторов языка.
презентация [76,2 K], добавлен 14.10.2013Операции реляционной алгебры. Программы построения плана выполнения запроса. Разработка обучающей программы запросов с использованием реляционных операций. Проектирование программы обучения реляционной алгебре. Требования к программной документации.
курсовая работа [56,0 K], добавлен 25.11.2010Изучение сущности и основных функций программного интерфейса для обеспечения обмена данными между процессами, который называется сокет. Сокеты и UNIX. Атрибуты и именование сокета. Установка соединения (сервер, клиент). Обмен данными. Закрытие сокета.
презентация [99,1 K], добавлен 12.05.2013Объекты модели хранения данных базы данных ORACLE. Взаимосвязь между логическими структурами. Средства манипулирования данными языка SQL, данными языка SQL. Структура выполнения простейших запросов. Формирование критерия отбора. Сортировка данных.
презентация [120,1 K], добавлен 14.02.2014Основные подходы к организации данных в системах автоматизированной обработки информации. Требования к проектированию базы данных. Принципы включения операторов языка манипулирования данными в прикладную программу. Описание логической структуры БД.
реферат [104,2 K], добавлен 28.11.2011Алгебра матриц: задание численных и символьных элементов вектора и матрицы с и без применения шаблонов, использование векторных и матричных операторов и функций. Операции умножения и деления вектора и матрицы друг на друга и на скалярные числа.
практическая работа [107,0 K], добавлен 05.12.2009Основные понятия алгебры логики. Логические основы работы ЭВМ. Вычислительные устройства как устройства обработки информации. Основные формы мышления. Обзор базовых логических операций. Теоремы Булевой алгебры. Пути минимизации логических функций.
контрольная работа [62,8 K], добавлен 17.05.2016