
- •1. Введение в бд
- •2. Теоретические основы бд
- •2.1 Базы данных
- •2.2. Архитектуры обработки информации
- •Ошибка! Ошибка связи.
- •Ошибка! Ошибка связи.
- •2.3 Модели баз данных
- •2.3.1 Иерархическая модель данных
- •Ошибка! Ошибка связи.
- •Ошибка! Ошибка связи.
- •2.3.2 Сетевая модель данных
- •Ошибка! Ошибка связи.
- •2.3.3 Реляционная модель данных
- •3. Реляционный подход к организации бд
- •3.1 Базовые понятия реляционных баз данных
- •Ошибка! Ошибка связи.
- •3.2 Фундаментальные свойства отношений
- •3.3 Взаимосвязь отношений
- •4. Реляционная алгебра
- •4.1 Обзор реляционной алгебры
- •Замкнутость реляционной алгебры
- •Отношения, совместимые по типу
- •4.2 Теоретико-множественные операторы
- •4.3 Специальные реляционные операторы
- •4.4 Зависимые реляционные операторы
- •4.5 Примитивные реляционные операторы
- •4.6 Запросы, невыразимые средствами реляционной алгебры
- •4.7 Кросс-таблицы
- •5. Проектирование бд
- •5.1. Цели и этапы проектирования
- •5.2 Уровни моделирования (проектирования) бд
- •5.3 Критерии оценки качества логической модели данных
- •5.4 Нормализация и ее необходимость
- •5.5 Теория нормализации
- •5.6 Элементы модели "сущность-связь"
- •Основные понятия er-диаграмм
- •Ошибка! Ошибка связи.
- •6. Элементы языка sql
- •6.1 Типы данных
- •6.2 Операторы dml (определения объектов базы данных)
- •6.2.1 Операторы работы с таблицами
- •6.3 Операторы dml (операторы манипулирования данными)
- •6.3.1 Примеры использования операторов манипулирования данными
- •Insert - вставка строк в таблицу
- •6.3.2 Update - обновление строк в таблице
- •6.3.3 Delete - удаление строк в таблице
- •6.3.4 Выбор данных из таблицы select
- •6.3.4.1 Общий синтаксис команды select
- •6.3.4.2 Примеры работы с использованием оператора select
- •Использование агрегатных функций в запросах
- •Использование агрегатных функций с группировками
- •Использование подзапросов
- •Использование объединения, пересечения и разности
- •6.3.4.3 Порядок выполнения оператора select
- •6.3.4.4 Реализация реляционной алгебры средствами оператора select (Реляционная полнота sql)
- •6.4 Объекты и концепции базы данных
- •6.4.1 Таблицы (Tables)
- •6.4.2 Столбцы (Columns)
- •6.4.3 Типы данных (Data types)
- •Тип данных blob
- •6.4.4 Домены (Domains)
- •6.4.5 Справочные ограничения целостности (Referential integrity constraints)
- •6.4.6 Индексы (Indexes)
- •6.4.7 Представления (Views)
- •6.4.8. Хранимые процедуры (Stored procedures)
- •6.4.9 Триггеры (Triggers)
- •6.4.10 Генераторы (Generators)
- •6.4.11 Защита (Security)
- •6.5 Операторы sql для работы с объектами бд
- •6.5.1 Представления
- •6.5.2 Хранимые процедуры
- •6.5.3 Генераторы
- •6.5.4 Триггеры
- •6.5.5 Индексы
- •6.6 Инструкции sql
- •7. Физическая организация и работа субд
- •7.1 Хранение данных
- •Ошибка! Ошибка связи.
6.3.4.2 Примеры работы с использованием оператора select
Отбор данных из одной таблицы
Пример. Выбрать все данные из таблицы поставщиков:
SELECT *
FROM A
Замечание. В результате получим новую таблицу (представление), содержащую полную копию данных из исходной таблицы P.
Пример. Выбрать все строки из таблицы поставщиков, удовлетворяющих некоторому условию:
SELECT *
FROM A
WHERE A.ID_SOTR > 2;
Замечание. В качестве условия в разделе WHERE можно использовать сложные логические выражения, использующие поля таблиц, константы, сравнения (>, <, = и т.д.), скобки, союзы AND и OR, отрицание NOT.
Пример. Выбрать некоторые колонки из исходной таблицы (указание списка отбираемых колонок):
SELECT A.ZAP
FROM A
Замечание.
1) В результате получим таблицу с одной колонкой, содержащую все наименования поставщиков. По сути, это вертикальный срез таблицы.
2) Если в исходной таблице присутствовало несколько поставщиков с разными номерами, но одинаковыми наименованиями, то в результатирующей таблице будут строки с повторениями - дубликаты строк автоматически не отбрасываются.
Пример. Выбрать некоторые колонки из исходной таблицы (указание списка отбираемых колонок) и условия:
select b.ZAP, B.FAM from b where B.FAM='Путин'
Пример. Выбрать некоторые колонки из исходной таблицы, удалив из результата повторяющиеся строки (ключевое слово DISTINCT):
select distinct b.FAM, b.ZAP from b where b.fam='Путин'
Замечание. Использование слова DISTINCT приводит к тому, что в результатирующей таблице будут удалены повторяющиеся строки.
Пример. Использование скалярных выражений и переименований колонок в запросах (ключевое слово AS…).
Создадим 2 таблицы «Сотрудники» и «Должности»
CREATE TABLE SOTRUDNIK ( ID_SOTR INTEGER NOT NULL, FAM CHAR(30) NOT NULL, YEARS DECIMAL(2) default 0, PRIMARY KEY (ID_SOTR) ); |
CREATE TABLE DOLGNOST ( ID_D INTEGER NOT NULL PRIMARY KEY, DOLG CHAR(10) NOT NULL, MONEY DECIMAL(5) default 0 ); |
Наполним их данными для примера только для таблицы «Должность»:
insert into dolgnost(id_d, dolg, money)
values(6, 'Доцент', 1500);
insert into dolgnost(id_d, dolg)/*зарплата в этой записи будет по умолчанию 0*/
values(1, 'Ассистент'); /*точки с запятой здесь обязательны*/
insert into dolgnost(id_d, money, dolg) /*порядок указания столбцов другой*/
values(4, 2000, 'Профессор');
commit /*фиксируем изменения*/
И некоторыми данными таблицу «Сотрудники»
insert into sotrudnik(id_sotr, fam, years)
values(1, 'Иванов', 3);
insert into sotrudnik (id_sotr, fam, years)
values(2, 'Путин', 1);
insert into sotrudnik (id_sotr, fam, years)
values(3, 'Сидоров', 4);
commit
А теперь возвращаемся к основной задаче:
select
sotrudnik.fam,
'=' as equ,
sotrudnik.years*sotrudnik.id_sotr as abstract_value
from sotrudnik
В результате получим таблицу с колонками, которых не было в исходной таблице:
fam |
equ |
abstract_value |
Иванов |
= |
3 |
Путин |
= |
2 |
Сидоров |
= |
12 |
Пример.Упорядочение результатов запроса (ключевое слово ORDER BY…):
SELECT
dolgnost.id_d,
dolgnost.dolg,
dolgnost.money
FROM dolgnost ORDER BY money
В результате получим таблицу, упорядоченную по полю money.
Пример. Упорядочение результатов запроса по нескольким полям с возрастанием или убыванием (ключевые слова ASC, DESC):
-
SELECT
dolgnost.id_d,
dolgnost.dolg,
dolgnost.money
FROM dolgnost
ORDER BY
money DESC,
id_d ASC
SELECT
dolgnost.id_d,
dolgnost.dolg,
dolgnost.money
FROM dolgnost
ORDER BY
money DESC,
id_d
получаем представление, в котором есть 3 столбца. Они упорядочены по убыванию столбца money, и по возрастанию id_d
тоже самое.
Замечание. Если явно не указаны ключевые слова ASC или DESC, то по умолчанию принимается упорядочение по возрастанию (ASC).
Отбор данных из нескольких таблиц
Пример. Естественное соединение таблиц (способ 1 - явное указание условий соединения):
SELECT
a.id_sotr,
b.fam
FROM a, b
WHERE a.id_sotr=b.id_sotr
Замечание. Соединяемые таблицы перечислены в разделе FROM оператора, условие соединения приведено в разделе WHERE. Раздел WHERE, помимо условия соединения таблиц, может также содержать и условия отбора строк.
Пример. Естественное соединение таблиц (способ 2 - ключевые слова JOIN… USING…):
SELECT
a.id_sotr,
b.fam
FROM a JOIN b USING id_sotr
Замечание. Ключевое слово USING позволяет явно указать, по каким из общих колонок
Аналогичным образом можно выполнить естественное соединение трех и более таблиц:
Пример. Прямое произведение таблиц:
SELECT *
FROM a, b
В результате получим следующую таблицу –произведение таблиц A и B, содержащую все столбцы исходных.
Замечание.
1) Т.к. не указано условие соединения таблиц, то каждая строка первой таблицы соединится с каждой строкой второй таблицы.
2) Т.к. указаны все столбцы (*), то в результирующей таблицы будут все столбцы исходных таблиц.
3) Столбцы, которые имеют одинаковое наименование в результирующей таблице (проеции) будут переименованы. В нашем примере переименован будет столбец id_sotr и fam таблицы B. Новыми именами будут id_sotr1 и fam1.
Пример. Соединение таблиц по произвольному условию
SELECT
sotrudnik.fam,
sotrudnik.years,
dolgnost.dolg,
dolgnost.money
FROM sotrudnik, dolgnost
WHERE sotrudnik.fam='Костров' AND dolgnost.money>=1500
В результате получим новую таблицу (декартово произведение), в которой строки: Фамилия, Стаж, Должность, Зарплата, но при условии, что фамилия - «Костров» и у человека зарплата от 1500 рублей.
Пример. Ответ на вопрос "какие дисциплины читают какими лекторами?" дает следующее экви-соединение или запрос:
SELECT
p.id_sotr,
p.fam,
pd.id_sotr,
pd.id_disp,
pd.volume,
FROM p, pd
WHERE p.id_sotr= pd.id_sotr;
Использование имен корреляции (алиасов, псевдонимов)
Иногда приходится выполнять запросы, в которых таблица соединяется сама с собой, или одна таблица соединяется дважды с другой таблицей. При этом используются имена корреляции (алиасы, псевдонимы), которые позволяют различать соединяемые копии таблиц. Имена корреляции вводятся в разделе FROM и идут через пробел после имени таблицы. Имена корреляции должны использоваться в качестве префикса перед именем столбца и отделяются от имени столбца точкой. Если в запросе указываются одни и те же поля из разных экземпляров одной таблицы, они должны быть переименованы для устранения неоднозначности в именованиях колонок результатирующей таблицы. Определение имени корреляции действует только во время выполнения запроса.
Пример. Отобрать все пары поставщиков таким образом, чтобы первый поставщик в паре имел статус, больший статуса второго поставщика:
-
SELECT
aa.fam AS fam_a,
aa.zap AS zap_a,
bb.fam AS fam_b,
bb.zap AS zap_b
FROM
a aa, b bb
WHERE aa.zap > bb.zap
SELECT
aa.fam AS fam_a,
aa.zap AS zap_a,
another_aa.fam AS fam_another_a,
another_aa.zap AS zap_another_a
FROM
a aa, a another_aa
WHERE aa.zap > another_aa.zap
В результате получим таблицу с заголовком:
fam_a |
zap_a |
fam_b |
zap_b |