Единое окно доступа к образовательным ресурсам

Введение в системы баз данных: Учебное пособие

Голосов: 3

В пособии рассматриваются основные понятия и определения, современное состояние технологий баз данных, архитектура СУБД, концепции проектирования БД, модели данных, реляционная модель данных, проектирование базы данных, физическая организация данных, управление реляционной базой данных, язык SQL, обеспечение функционирования баз данных.

Приведенный ниже текст получен путем автоматического извлечения из оригинального PDF-документа и предназначен для предварительного просмотра.
Изображения (картинки, формулы, графики) отсутствуют.
    СКЛАД, содержащая требуемый Код_дет и где s.Кол_дет > t.Количество.
Это формируется следующим образом:
      exists s in СКЛАД
      (s.Код_дет = t.Код_дет and s.Кол дет > t.Количество).
      Такое выражение читается: "Существует строка s в отношении
СКЛАД такая, что s.Код_дет = t.Код_дет и s. Код_дет > t.Количество".
      Приведенное выражение определяет строку t. Если оно истинно, то
есть для строки t существует такая строка s, то t.Hазв_дет помещается в
результирующее отношение. Если выражение ложно — то есть такой
строки s не существует — тогда t.Назв_дет не помещается в
результирующее отношение.
      Полное решение в реляционном исчислении выглядит следующим
образом:
      {t.Назв_дет ⎟ t in ПОТРЕБНОСТИ and exists s in СКЛАД (s.Код_дет =
t.Код_дет and s.Кол_дет > t.Количество )}.
      Оно описывает отношение, состоящее из одного столбца и
содержащее названия деталей, взятых из строк отношения
ПОТРЕБНОСТИ. Данное название помещается в отношение решения,
если его строка t удовлетворяет условию после знака "⎟".
      Рассмотрим подробнее вышеописанный механизм обработки
нескольких строк отношения ПОТРЕБНОСТИ, чтобы понять, как будет
применяться условие.
      Первая строка отношения ПОТРЕБНОСТИ (которая обозначена t)
имеет Назв_дет = А, и оно будет помещено в результирующее отношение,
если в отношении СКЛАД существует строка, в которой Код_дет = ‘01’, а
Кол_дет > t.Количество. Такая строка действительно существует, и она
обозначена как s. Итак, t удовлетворяет определяющему условию, поэтому
t.Hазв_дет помещается в отношение решения. Этот процесс должен
повториться для каждой строки отношения ПОТРЕБНОСТИ. Когда
закончена обработка первой строки, вторая строка обозначена t, и теперь
уже для нее ищется соответствующая строка s в отношении СКЛАД.
Такой строки не существует, поэтому Д не помещается в результирующее
отношение. Продолжая дальше обработку строк отношений по указанному
алгоритму, получим множество решения, которое составит новое
отношение, и будет выглядеть следующим образом:

      Назв_дет
      A
      В

     В реляционной алгебре для выполнения этого запроса требуется
соединение. Таким образом, было показано, как квантор существования



                                  102


используется в реляционном исчислении, для того чтобы выполнять
функцию соединения.

8.2.3. Квантор всеобщности
      Квантор всеобщности означает, что некоторое условие применяется
ко всем строкам или к каждой строке некоторого типа. Он используется в
тех же целях, что и операция деления реляционной алгебры.
Проиллюстрируем его применение тем же запросом, который
рассматривался в разделе, описывающем операцию деления. Пусть даны
два отношения:

     VEDOM                                            RASP
     Ном_зач_кн Фамилия Назв_дисц Дата              Назв_дисц   Дата
     02-Э-01    Иванов    Физика         10.01.03   Химия       14.01.03
     02-Э-01    Иванов    Химия          14.01.03   Физика      10.01.03
     02-Э-02    Сидоров   Физика         10-01.03
     02-Э-02    Сидоров   Химия          14.01.03
     О2-Э-О5    Коровин   Химия          14.01.03


     Требуется определить фамилии тех студентов, каждый из которых
сдавал все экзамены, перечисленные в отношении RASP. Необходимо
обратить внимание на то, что условие выбора студента содержит
определение каждый. В результирующее отношение нключаются только те
студенты, которые сдавали каждый экзамен. Если взглянуть на
полученный результат, то можно увидеть, что условию запроса
удовлетворяют только два студента.
     Полное решение в реляционном исчислении с использованием
квантора всеобщности FORALL таково:
     {t.Фамилия | t in VEDOM and s in RASP and
     FORALL s {t. Назв_дисц_на = s.Назв_дисц and t.Дата = s.Дата)},
     где t — кортеж отношения VEDOM;
     s — кортеж отношения RASP.
     Результат выполнения запроса:

      Фамилия
      Иванов
      Сидоров

     Имя студента из строки t таблицы VEDOM помещается в
результирующее отношение, если определяющее выражение истинно для
строки t, а определяющее выражение истинно, если для каждой строки s
отношения RASP должна существовать строка t в отношении VEDOM,


                                   103


удовлетворяющая условию, то есть в данном случае для каждой строки s
отношения RASP должна существовать строка t в отношении VEDOM с
одной и то же фамилией:
     Иванов присутствует в строках t (1) и t (2): t (1) соответствует s (2) и
     t (2) соответствует s (1);
     Сидоров присутствует в строках t (3) и t (4): t (3) соответствует s (2)
     и t (4) соответствует s (1);
     Коровин присутствует только в строке t (5): t (5) соответствует s (1),
     а для s (2) нет соответствующей строки t.
     Полное соответствие всем строкам отношения RASP есть только у
Иванова и Сидорова. Таким образом, они и вошли в результирующее
отношение.

9. Язык SQL

9.1. Оператор выбора SELECT. Формирование запросов к базе
данных
      Назначение оператора SELECT СОСТОИТ В выборке и отображении
данных одной или нескольких таблиц БД.
      Синтаксис оператора SELECT:
      SELECT [DISTINCT| ALL] {* ⎟ [<СПИСОК СТОЛБЦОВ>]} FROM
<СПИСОК ТАБЛИЦ>
      [WHERE <предикат-условие выборки или соединения;>] [GROUP
BY <список полей результата>]
      [HAVING <предикат-условие для группы>]
      [ORDER BY <список полей, по которым требуется упорядочить
ВЫВОД>]
      Поясним каждую фразу данного оператора.
Фраза SELECT:
   • наличие ключевого слова ALL (по умолчанию) означает, что в
      результирующую таблицу включаются все строки, удовлетворяющие
      условиям запроса, что может привести к появлению в
      результирующей таблице одинаковых строк;
   • ключевое слово DISTINCT предназначено для приведения таблицы в
      соответствие с принципами теории отношений, где предполагается
      отсутствие дубликатов строк;
   • символ "*" определяет очень часто встречаемую ситуацию, когда в
      результирующий набор включаются все столбцы из исходной
      таблицы
   • запроса.
Во фразе FROM задается перечень исходных таблиц запроса.
Во фразе WHERE определяются условия отбора строк результата или
условия соединения строк исходных таблиц, подобно операции условного


                                    104


соединения в реляционной алгебре. В качестве условий отбора могут быть
использованы следующие операторы:
   • сравнения " = , <>, >, <, >=, <=" — для сравнения результатов
      вычисления двух выражений; более сложные выражения строятся с
      помощью логических операторов AND, OR, NOT;
   • BETWEEN А AND В — предикат истинен, когда вычисленное значение
      выражения попадает в заданный диапазон;
   • IN — предикат истинен тогда, когда сравниваемое значение входит в
      множество заданных значений;
   • LIKE и NOT LIKE — предикаты, смысл которых противоположен,
      требуют задания шаблона, с которым сравнивается заданное
      значение;
   • IS NULL — предикат, применяющийся для выявления равенства
      значения некоторого атрибута неопределенному значению:
   • EXIST и NOT EXIST, используемые во встроенных подзапросах.
Во фразе GROUP BY задается список полей группировки.
Во фразе HAVING задаются предикаты-условия, накладываемые на каждую
группу.
Во фразе ORDER BY задается список полей упорядочения результата, то
есть список полей, который определяет порядок сортировки в
результирующей таблице.

9.1.1. Простые запросы
      Рассмотрим ряд простых запросов.

     Запрос 1
     Вывести номера телефонов кафедр университета.
     Результат такого запроса должен содержать только два столбца:
Name_kaf и Nom_telef, поэтому сам запрос должен выглядеть следующим
образом:
     SELECT Name_kaf, Nom_telef
     FROM kafedra;
     Результирующая таблица приведена ниже:

      Name_kaf                           Nom_telef
      Физики                             23-34-24
      Общей математики                   23-65-43
      Истории                            23-78-72
      Графики                            23-99-77
      Прикладной математики              23-66-62

     Запрос 2
     Вывести сведения о кафедре Графики. Запрос будет выглядеть
следующим образом:


                                 105


     SELECT *
     FROM kafedra
     WHERE Name_kaf = 'Графики';
     Ответ на такой запрос будет содержать только одну строку:

      Kod_kaf Name_kaf Nom_telef Nom_Auditoria Col_sotr Zav_kaf
      004     Графики  23-99-77  385           18       Фирсов C.C.

     Запрос 3
     Вывести сведения о кафедрах университета, находящихся па первом
этаже, учитывая тот факт, что номера аудиторий первого этажа лежат в
диапазоне от 1 до 99.
     Запрос будет выглядеть следующим образом:
     SELECT *
     FROM kafedra
     WHERE NonuAuditoria BETWEEN 1 AMD 99;
     Результат запроса:

      Kod_kaf Name_kaf         Nomtetef Nom_Auditoria Col_sotr Zavjcaf
      002     Общей математики 23-65-43 003           22       Махов
      005     Прикладной       23-66-62 028           24       Ляхова

      Запрос 4
      Вывести сведения о кафедрах университета в виде, отсортированном
по столбцу Name_kaf в порядке возрастания.
      Запрос будет выглядеть следующим образом:
      SELECT *
      FROM kafedra
      ORDER BY Namejtaf ASC;
      Результат данного запроса:

      Kod_kaf   Name_kaf     Nom_telef   Nom_Auditoria   Col_sotr   Zav__kal
      004       Графики      23-99-77    385             18         Фирсов
      003       Истории      23-78-72    465             16         Росс
      002       Общей ма     23-65-43    003             22         Махов
      005       Прикладной   23-66-62    028             24         Ляхова
      001       Физики       23-34-24    132             25         Иванов Т.М.

9.1.2. Агрегатные функции языка
      В стандарте языка SQL определено несколько агрегатных функций:
   • COUNT — возвращает количество значений в указанном столбце;
   • SUM — возвращает сумму значений в указанном столбце;
   • AVG — возвращает усредненное значение в указанном столбце;
   • MIN — возвращает минимальное значение в указанном столбце;
   • МАХ — возвращает максимальное значение в указанном столбце.

                                     106


      В качестве операнда данных функций может использоваться
наименование только одного столбца, и все они возвращают единственное
значение. С функциями SUM и AVG могут использоваться только числовые
поля. С функциями COUNT, MAX и MIN могут использоваться как числовые,
так и символьные поля. При вызове всех перечисленных выше функций,
кроме функции COUNT (*), осуществляется исключение всех пустых
значений» только после этого операция применяется к оставшимся
значениям столбца. Функция COUNT (*) призвана осуществлять подсчет
всех строк таблицы независимо от того, какие значения в них находятся.

      Запрос 5
      Подсчитать и вывести общее число кафедр университета. Запрос
будет выглядеть следующим образом:
      SELECT COUNT (*) AS count
      FROM kafedra;
      Ответ на данный запрос будет выглядеть:

      сount
      5

     Запрос 6
     Определить среднее число сотрудников, работающих на кафедрах
университета.
     Запрос будет выглядеть следующим образом:
     SELECT AVG(Col_sotr) AS avg
     FROM kafedra;
     Ответ на запрос:

      avg
      21

9.1.3. Группирование результатов
      Часто встречаются ситуации, когда в отчет необходимо поместить и
промежуточные результаты, опирающиеся на вычисления обобщенных
групповых значений. Для применения агрегатных функций в подобных
случаях предполагается предварительная операция группировки. Суть
операции группировки состоит в том, что все множество строк таблицы
разбивается на группы, в каждой из которых собираются строки, имеющие
одинаковые значения атрибутов, которые заданы в списке группировки.
Обработка такой информации реализуется путем применения агрегатных
функций уже к каждой отдельной группе и выдаче полученных итогов.
      В языке SQL для осуществления операции группировки в оператор
SELECT включается фраза GROUP BY. Запрос, в котором присутствует фраза




                                 107


GROUP BY, называется группирующим запросом, а столбцы, перечисленные
в этой фразе, называются группирующими столбцами.
      В дальнейшем в качестве примера будем работать с двумя БД: НИР и
Сессия.
      БД НИР состоит из одной таблицы, в которой хранится информация
о производимых выплатах специалистам за проделанную работу по
определенным этапам НИР: R= (ФИО, Этап, Начисления).
      Пусть таблица содержит следующие данные.
      r
      ФИО               Этап              Начисления (руб)
      Семенов Т.Т.      Этап 1            1000
      Просов С.М.       Этап 1            2000
      Мехова И.И.       Этап 1            500
      Семенов Т.Т.      Этап 2            500
      Просов С.М.       Этап 2            500
      Мехова И.И.       Этап 2            1000
      Просов С.М.       Этап 3            1000
      Мехова И.И.       Этап 3            1000
      Чемцов Я.Ю.       Этап 3            2000
      Чемцов Я.Ю.       Этап 4            2000
      Яров И.М.         Этап 4            3000

     БД Сессия включает в себя сводную таблицу, где представлены
экзаменационные оценки студентов, полученные ими в сессию по
определенным дисциплинам:
     S = (ФИО, Дисциплина, Оценка);
     s
              ФИО        Дисциплина                   Оценка
      Мур С.М.           Физика                         4
      Цуканов Т.Т.       Физика                         5
      Думская М.Т.       Физика                         3
      Дрозд Г.Р.         Физика                         4
      Мур С.М.           История                        4
      Цуканов Т.Т.       История                        5
      Думская М.Т.       История                        3
      Цуканов Т.Т.       Математика                     5
      Думская М.Т.       Математика                     4
      Дрозд Г.Р.         Математика                     5
      Петрова С.О.       Электротехника                 5
      Часов И.И.         Электротехника                 4
      Иванова Я.С.       Электротехника                 5
      Крисс Р.О.         Электротехника                 3
      Часов И.И.         Иностр. язык                   5
      Иванова Я.С.       Иностр. язык                   4
      Часов И.И.         Экономика                      4
      Иванова Я.С.       Экономика                      4
      Крисс Р.О.         Экономика                      5
      Фирсова Л.Р.       Экономика                      3


                                 108


     Cформируем к базам данных несколько запросов.

      Запрос 7
      БД НИР. Для каждого специалиста определить сумму, выплаченную
за работу по данной теме, и количество сделанных ему выплат.
      Для формирования запроса включим в предложение SELECT
следующую информацию: ФИО, COUNT (Начисления) AS count, SUM
(Начисления) AS sum, где в качестве имен для двух вычисляемых
столбцов используются псевдонимы. Группировку будем производить по
столбцу ФИО. Для того чтобы проще было просматривать результаты,
выводимые данные представим в отсортированном по столбцу ФИО виде
      SELECT ФИО, COUNT (Начисления) AS count, SUM (Начисления)
AS sum FROM r GROUP BY ФИО
      ORDER BY ФИО;
      Результат запроса:

      ФИО                     count      sum
      Мехова И.И.             3          2500
      Просов С.М.             3          3500
      Семенова Т.Т.           2          1500
      Чемцов Я.Ю.             2          4000
      Яров И.М.               1          3000

     Запрос 8
     БД Сессия. Для каждой дисциплины определить количество
студентов, сдавших экзамен.
     Запрос будет выглядеть следующим образом:
     SELECT Дисциплина, COUNT (*) AS count
     FROM s
     GROUP BY Дисциплина
     ORDER BY Дисциплина;
     Результат запроса:

     Дисциплина       count
     Иностр.язык      2
     История          3
     Математика       3
     Физика           4
     Экономика        4
     Электротехника   4

     Запрос 9




                                  109


     БД НИР. В условиях предыдущего запроса вывести информацию,
касающуюся только тех специалистов, которым производились
начисления более одного раза.
     Для вывода такой информации в текст предыдущего запроса
необходимо добавить фразу HAVING COUNT (Начисления! > 1. И в этом
случае весь запрос примет вид
     SELECT ФИО, СОШТ (Начисления) AS count, SUM (Начисления)
AS sum
     FROM r
     GROUP BY ФИО
     HAVING COUNT(Начисления) > 1
     ORDER BY ФИО,-
     Результаты выполнения запроса представлены ниже.

      ФИО                    count           sum
      Мехова И.И.            3               2500
      Просов С.М.            3               3500
      Семенов Т.Т.           2               1500
      Чемцов Я.Ю.            2               4000


9.1.4. Вложенные запросы
      Стандарт языка позволяет в тело одного оператора SELECT внедрять
другой оператор SELECT. Если внутренний оператор запроса помешен в
предложения WHERE И HAVING внешнего оператора SELECT, TO создается
ситуация вложенных запросов (подзапросов).

     Запрос 10
     БД НИР. Вывести список платежей, где величина единовременных
начислении превысила среднее значение.
     Запрос будет выглядеть следующим образом:
     SELECT ФИО, Этап, Начисления
     FROM r
     WHERE Начисления > (SELECT avg(Начисления) FROM r);
     Результат запроса:

      ФИО                  Этап      Начисления (руб)
      Просов С. М.         Этап 1    2000
      Чемцов Я.Ю.          Этап 3    2000
      Чемцов Я.Ю.          Этап 4    2000
      Яров И.М.            Этап 4    3200

9.1.5. Многотабличные запросы
      При работе с базами данных потребности пользователей не
ограничиваются только реализацией простых запросов данных из одной


                                    110


таблицы. Во многих случаях для получения ответа на запрос необходимо
объединить информацию из нескольких исходных таблиц. Для того чтобы
осуществить такое объединение в результирующей таблице, необходимо
выполнить операцию соединения, при которой объединение информации
из двух таблиц происходит посредством образования пар связанных строк,
выбранных из каждой таблицы. Таблицам можно присвоить имена-
псевдонимы, что бывает полезно для осуществления операции соединения
таблицы с самой собою и в ряде других ситуаций.
      Если в операторе SELECT указано более одного имени таблицы,
неявно подразумевается, что над перечисленными таблицами
осуществляется операции декартова произведения. Самый простой запрос
SELECT такого рода без необязательных частей выглядит следующим
образом:
      SELECT *
      FROM rl, r2;
      и соответствует декартову произведению таблиц r1 и r2.
      Выражение
      SELECT rl.A, r2.B
      FROM rl, r2;
      соответствует проекции декартова произведения двух таблиц на два
столбца А из таблицы r1 и В из таблицы r2.
      Рассмотрим базу данных, в которой хранится информация о
производимых выплатах специалистам за проделанную работу по
определенным этапам НИР. Пусть она состоит из трех отношений r1, r2 и
r3. Будем считать, что они представлены таблицами r1, r2 и r3
соответственно.

     R1 = (ФИО, Отдел);
     R2= (Отдел, Этап);
     R3= (ФИО, Этап, Начисления).


     r1                                    r2
     ФИО            Отдел                  Отдел         Этап
     Семенов Т.Т.   03                     03            Этап 1
     Просов СМ.     03                     03            Этап 2
     Мехова И.И.    03                     03            Этап 3
     Чемцов Я.Ю.    04                     04            Этап 3
     Яров И.М.      04                     04            Этап 4




                                 111



    
Яндекс цитирования Яндекс.Метрика