
- •Классификация субд [5]
- •Функции субд
- •Централизованная архитектура
- •Технология с сетью и файловым сервером (архитектура «файл-сервер»)
- •Технология «клиент-сервер»
- •Трехзвенная (трехуровневая) архитектура
- •Реляционная модель данных
- •Методология idef1x
- •Определение отношения, домена, кортежа, реляционной базы данных, ключей
- •Связи между отношениями (таблицами)
- •Базовые теоретико-множественные операции реляционной алгебры
- •Специальные операции реляционной алгебры
- •Аномалии обновления
- •Первая Нормальная Форма
- •Определение функциональной зависимости
- •Функциональные зависимости отношений и математическое понятие функциональной зависимости
- •Вторая Нормальная Форма
- •Определение
- •3Нф (Третья Нормальная Форма)
- •Алгоритм нормализации (приведение к 3нф)
- •Реляционная модель данных: сравнение нормализованных и ненормализованных моделей.
- •16, Сравнение нормализованных и ненормализованных моделей
- •Null-значения
- •Потенциальные ключи
- •Целостность сущностей
- •Внешние ключи
- •Целостность внешних ключей
- •Замечания к правилам целостности сущностей и внешних ключей
- •Операции, которые могут нарушить ссылочную целостность
- •Для родительского отношения
- •Для дочернего отношения
- •20, Целостность реляционных данных: стратегии поддержания ссылочной целостности.
- •Стратегии поддержания ссылочной целостности
- •Операторы ddl (Data Definition Language) - операторы определения объектов базы данных
- •Create table – создать таблицу
- •Оператор check
- •Определение первичных и альтернативных ключей с помощью оператора alter
- •Операторы drop
- •Выборка данных
- •Сортировка результатов
- •Встроенные функции sql
- •Средства модификации данных языка sql
- •Вставка данных – insert
- •Изменение данных – update
- •Удаление данных – delete
- •Выборка данных
- •Представления
- •Применение представлений
- •Обновление представлений
- •Триггеры
- •Хранимые процедуры
- •Большая безопасность и меньший сетевой трафик.
- •Sql можно оптимизировать
- •Совместное использование кода:
- •Структура памяти эвм
- •Представление экземпляра логической записи
- •Организация обмена между оперативной и внешней памятью
- •Структуры хранения данных во внешней памяти эвм
- •Назначение и проверка полномочий, проверка подлинности
- •Средства защиты базы данных
- •Архитектура системы безопасности ms sql Server
- •34.Роли сервера
- •35, Права доступа
- •36, Необходимость в атомарных транзакциях
- •П , Параллельная обработка транзакций
- •Проблема потерянного обновления
- •Блокировка ресурсов
- •Блокировочная терминология
- •Сериализуемые транзакции
- •Взаимная блокировка
- •Оптимистическая и пессимистическая блокировки
- •Объявление характеристик блокировки
- •Свойства транзакций
- •Атомарность
- •Долговечность или устойчивость
- •Согласованность
- •Изолированность транзакции. Уровни изоляции
- •Типы курсоров
Сортировка результатов
Сортировка результатов осуществляется с помощью команды ORDER BY.
По умолчанию сортировка в SQL производится в порядке возрастания. Для явного указания порядка сортировки можно использовать ключевые слова ASC (по возрастанию) и DESC (по убыванию).
Листинг 25
SELECT Имя, Отдел
FROM СОТРУДНИК
ORDER BY Отдел DESC, Имя ASC;
Встроенные функции sql
В SQL имеется пять встроенных функций: COUNT, SUM, AVG, MАХ и MIN. Они выполняют различные действия над результатами оператора SELECT. Функция COUNT работает вне зависимости от типа данных столбца, а функции SUM, AVG, MAX и MIN оперируют только числовыми столбцами (Integer, Numeric и т. д.).
Группировать результаты можно, используя предложение GROUP BY.
Кроме случаев с использованием ключевых слов GROUP BY, имена столбцов не могут смешиваться со встроенными функциями. Например, следующий оператор недопустим:
Листинг 26
SELECT Название, SUM(МакТрудозатраты)
FROM ПРОЕКТ
WHERE ИдПроекта<1500;
Зато допустим оператор:
Листинг 27
SELECT Отдел, COUNT(*)
FROM СОТРУДНИК
GROUP BY Отдел;
Для отбора строк в группе по определенному критерию служит конструкция HAVING. Например, если нас интересуют только те группы, в которых имеется более одной записи:
Листинг 28
SELECT Отдел, COUNT(*)
FROM СОТРУДНИК
GROUP BY Отдел
HAVING COUNT(*) > 1;
Вместе с ключевым словом GROUP BY можно использовать и предложение WHERE. Однако здесь имеет место неоднозначность. Если условие в предложении WHERE применяется до формирования групп, результат будет иным, чем когда это условие применяется к уже сформированным группам. Для устранения этой неоднозначности стандарт SQL устанавливает, что в случаях, когда предложения WHERE и GROUP BY используются одновременно, первым должно применяться условие, записанное в предложении WHERE. Рассмотрим, например, следующий оператор:
Листинг 29
SELECT Отдел, COUNT(*)
FROM СОТРУДНИК
WHERE ТабельныйНомер < 600
GROUP BY Отдел
HAVING COUNT(*) > 1;
Задание 1. Для данных из таблиц 1-3 сравнить результаты запросов в листинге 17 и 18.
ОСНОВЫ ЯЗЫКА SQL: ЧТЕНИЕ ДАННЫХ ИЗ НЕСКОЛЬКИХ ТАБЛИЦ С ПРИМЕНЕНИЕМ ВЛОЖЕННЫХ ЗАПРОСОВ.
Чтение данных из нескольких таблиц с применением вложенных запросов. Чтение данных из нескольких таблиц может осуществляться посредством вложенных запросов или соединений. Если все данные, которые должны войти в результат, содержатся в одной таблице, то можно использовать вложенные запросы. Если результаты принадлежат двум или более таблицам, необходимо использовать операцию соединения.
Задание 2. Требуется узнать имена сотрудников, проработавших в рамках любого из своих назначений более 115 часов. Имена сотрудников хранятся в таблице СОТРУДНИК, а количество отработанных ими часов – в таблице НАЗНАЧЕНИЕ.
Ответ
SELECT DISTINCT Имя
FROM СОТРУДНИК
WHERE ТабельныйНомер IN
(SELECT НомерСотрудника
FROM НАЗНАЧЕНИЕ
WHERE ФактТрудозатраты > 115)
Вложенность запросов может быть расширена до трех, четырех и более уровней.
Задание 3. Требуется узнать имена сотрудников, проработавших более 100 часов в проекте, который оплачивается бухгалтерией.
Ответ
Шаг 1. Идентификаторы проектов, оплачиваемых бухгалтерией, можно узнать при помощи следующего запроса:
SELECT ИдПроекта
FROM ПРОЕКТ
WHERE Отдел = 'Бухгалтерия';
Шаг 2. Номера сотрудников, проработавших более 100 часов в рамках этих проектов, возвратит такой оператор:
SELECT НомерСотрудника
FROM НАЗНАЧЕНИЕ
WHERE ФактТрудозатраты > 100 AND ИдПроекта IN
(SELECT ИдПроекта
FROM ПРОЕКТ
WHERE Отдел = 'Бухгалтерия');
Шаг 3. Имена сотрудников, номера которых мы только что узнали, можно определить с помощью следующего оператора:
SELECT DISTINCT Имя
FROM СОТРУДНИК
WHERE ТабельныйНомер IN
SELECT НомерСотрудника
FROM НАЗНАЧЕНИЕ
WHERE ФактТрудозатраты > 100 AND ИдПроекта IN
(SELECT ИдПроекта
FROM ПРОЕКТ
WHERE Отдел = 'Бухгалтерия');
24. Основы языка SQL: чтение данных из нескольких таблиц с помощью операции соединения.
Чтение данных из нескольких таблиц с помощью операции соединения. Вложенные запросы подходят для обработки нескольких таблиц до тех пор, пока результаты (столбцы в предложении SELECT) относятся к одной и той же таблице. Если же нам нужно извлечь данные из двух или более таблиц, при помощи вложенного запроса это сделать не удастся. Вместо этого необходимо использовать операцию соединения (join).
Основная идея здесь — создать новое отношение, связав между собой содержимое двух или более исходных отношений.
Листинг 30
SELECT Имя, ФактТрудозатраты
FROM СОТРУДНИК, НАЗНАЧЕНИЕ
WHERE ТабельныйНомер = НомерСотрудника;
Смысл этого оператора заключается в том, что создается новая таблица с двумя столбцами Имя и ФактТрудозатраты. Эти столбцы берутся соответственно из таблиц СОТРУДНИК и НАЗНАЧЕНИЕ при условии, что столбец ТабельныйНомер в таблице СОТРУДНИК равен столбцу НомерСотрудника в таблице НАЗНАЧЕНИЕ.
Листинг 31. Соединить информацию о проектах и назначениях.
SELECT Название, ФактТрудозатраты
FROM ПРОЕКТ, НАЗНАЧЕНИЕ
WHERE ПРОЕКТ.ИдПроекта = НАЗНАЧЕНИЕ.ИдПроекта;
Внимание! Строки, для которых не выполнено условие равенства, не включаются в результат соединения.
Альтернативный синтаксис соединения. В стандарте SQL-92 введен альтернативный синтаксис соединения, ставший весьма популярным, поскольку его легче интерпретировать. Здесь вместо WHERE используются ключевые слова JOIN и ON:
Листинг 32
SELECT Имя, ФактТрудозатраты
FROM СОТРУДНИК JOIN НАЗНАЧЕНИЕ
ON СОТРУДНИК.ТабельныйНомер = НАЗНАЧЕНИЕ.НомерСотрудника;
Внешние соединения. Строки, не удовлетворяющие условиям соединения, не будут включены в результат. Чтобы все строки таблицы вошли в результат соединения, можно использовать операцию внешнего соединения.
В одном из приведенных ранее примеров мы столкнулись с тем, что при выполнении соединения могут быть потеряны данные. В частности, если строка имеет значение, которое не удовлетворяет условию, заданному в предложении WHERE, эта строка не будет включена в результат соединения. Мы потеряли при соединении строку 'КВ4 Анализ портфеля', поскольку в таблице НАЗНАЧЕНИЕ не оказалось строки с таким же значением ИдПроекта, как в предложении WHERE. Такая потеря может быть нежелательной, и для предотвращения подобных ситуаций был введен специальный тип соединения — внешнее соединение (outer join).
Если нужно построить соединение таким образом, чтобы в результаты вошла каждая строка таблицы слева от ключевого слова JOIN, даже если для этой строки не имеется соответствия во второй таблице, то необходимо использовать следующий синтаксис:
Листинг 33
SELECT Название, ФактТрудозатраты
FROM ПРОЕКТ LEFT JOIN НАЗНАЧЕНИЕ
ON ПРОЕКТ.ИдПроекта = НАЗНАЧЕНИЕ.ИдПроекта;
Смысл этого оператора в том, что строки таблицы ПРОЕКТ соединяются со строками таблицы НАЗНАЧЕНИЕ, как и раньше, но теперь, если какая-то строка в таблице слева от ключевого слова JOIN (здесь это таблица ПРОЕКТ) не имеет соответствия в таблице, находящейся справа, эта строка все равно будет включена в результат. Такое соединение называется левым внешним соединением (left outer join).
Задание 4. Написать результат выполнения запроса для данных из табл. 1–3.
В последней строке результата столбец 'КВ4 Анализ портфеля' соединен с пустым столбцом.
Правое внешнее соединение (right outer join) функционирует аналогичным образом, только в результат включаются все строки таблицы, находящейся справа от ключевого слова JOIN:
Листинг 34
SELECT Название, ФактТрудозатраты
FROM ПРОЕКТ RIGHT JOIN НАЗНАЧЕНИЕ
ON ПРОЕКТ.ИдПроекта = НАЗНАЧЕНИЕ.ИдПроекта;
Внешние соединения могут быть вложенными. Например, мы можем соединить все три таблицы следующим образом:
Листинг 24
SELECT ПРОЕКТ.Название, ФактТрудозатраты, СОТРУДНИК.Имя
FROM ((ПРОЕКТ LEFT JOIN НАЗНАЧЕНИЕ
ON ПРОЕКТ.ИдПроекта, НАЗНАЧЕНИЕ.ИдПроекта)
LEFT JOIN СОТРУДНИК
ON СОТРУДНИК.ТабельныйНомер =НАЗНАЧЕНИЕ.НомерСотрудника);
25, ОСНОВЫ ЯЗЫКА SQL: СРЕДСТВА МОДИФИКАЦИИ ДАННЫХ ЯЗЫКА SQL.