Методички по лабам ПрБД, 2 курс 3 семестр (для ИВТ и т.п.) / ПБД_метод к лабам_часть 2_v03 [2022-2023]
.pdf
Рис. 30 – Результат запроса
Синтаксис предиката неопределенного значения IS NULL:
<выражение> IS NULL
IS NULL определяет, введено ли значение в поле и возвращает истину, если значение не было задано. Другие предикаты и операторы сравнения возвращают неопределённый результат (NULL), если хотя бы один из операндов имеет значение NULL. Значение NULL интерпретируется как "ложь".
Пример: Из таблицы Книги вывести название, издательство и серию книг, у которых серия не указана.
SELECT `Название`,`Серия`,`Издательство` FROM `книга` WHERE `Серия` is null
Рис. 31 – Результат запроса
Примечание:
Начиная с версии 2.2.3, для каждого поля, которое может быть пустым есть свой флажок «Null». До версии 2.2.3, необходимо было вводить «null» без кавычек в качестве значения поля. Начиная с версии 2.5.5, необходимо использовать флажок «Null», чтобы получить действительно значение «NULL», т.е. если вы введете «NULL» это будет означать, что вы хотите ввести слово «NULL» в поле, но не значение
31
3.2Пример создания SQL-запроса в phpMyAdmin
Запустите Denver, откройте вашу базу данных. Если вы делаете запрос по одной таблице, то выберите требуемую таблицу и перейдите на вкладку SQL.
Выборка данных из базовых таблиц выполняется с помощью команды SELECT, которая создает виртуальную рабочую таблицу. Рабочие таблицы не сохраняются в базе данных, для их повторного воспроизведения необходимо повторить соответствующую команду SELECT, поэтому в процессе работы рекомендуется создать дополнительно текстовый файлжурнал, в который будут заноситься все команды SELECT с соответствующими комментариями. Можно также сохранять запросы SELECT в системе phpMyAdmin с помощью команды вкладки SQL.
При переходе во вкладку SQL из какой-либо таблицы, будет создан простейший запрос, который будет отображать все данные из таблицы, также справа будет расположено меню, для быстрого вывода атрибутов (Рис. 32).
Рис. 32 – Вкладка SQL
Примечание:
Название атрибутов и текстовая информация берется в апострофы.
Рассмотрим несколько примеров.
Пример 1. Из таблицы Книги необходимо выбрать все книги серии Пуаро. Во вкладке SQL наберите запрос
32
SELECT * FROM `авторы` WHERE `Страна`='Кристи'
И нажмите на кнопку ОК. СУБД выведет информацию по данному запросу (Рис. 33).
Рис. 33 – Результат запроса «Книги серии Пуаро»
Примечание:
СУБД чувствительна к апострофам при указании текстового условия в разделе Where. Поэтому, если появляется сообщение об ошибке, то сначала проверьте синтаксис SQL-запроса и поэкспериментируйте с апострофами.
Пример 2. Из таблицы Книги необходимо выбрать название, тираж и количество страниц тех книг, у которых тираж выпуска от 5000 до 7000 и количество страниц меньше 300.
SELECT `Название` , `Тираж` , `Количество страниц` FROM `книга` WHERE (`Тираж`BETWEEN 5000 AND 7000) and `Количество страниц`<300
33
Рис. 34 – Результат запроса
Задание на выполнение лабораторной работы
В базе данных из лабораторной работы № 2 необходимо создать следующие типы запросов.
1)Простой запрос на выборку из одной таблицы:
−включить несколько полей таблицы;
−включить в запрос все поля с помощью знака «*» ;
−выбрать несколько полей, по которым сортируется вывод значений;
−создать два запроса с условиями отбора (AND, OR, NOT);
−создать запрос с вычисляемым полем;
−создать отсортированный по вычисляемому полю запрос, в котором определены несколько условий с помощью AND и OR;
−использовать в запросе параметр DISTINCT.
2)Создать запрос, используя предикат нахождения в диапазоне BETWEEN в условии отбора.
3)Создать запрос с выбором, используя предикат вхождения в список IN.
4)Создать запрос с выбором, используя предикат подобия LIKE.
5)Создать запрос с использованием предиката неопределённого значения IS NULL.
6)Создать запросы, содержащие в условии: NOT IN, NOT LIKE, NOT BETWEEN, IS NOT NULL.
34
Требования к отчету
Отчет должен включать описание всех запросов с соответствующими командами SELECT в текстовом формате и скриншотами результатов их выполнения, а также текстовый файл с командами SQL.
Лабораторная работа №4. SQL: группирующие запросы
Тема: Приобретение практических навыков выполнения SQLзапросов на группировку данных.
Цель лабораторной работы: Изучить SQL-запросы совместно с агрегатными функциями, а также группировку записи в web-интерфейсе phpMyAdmin.
4.1 Теоретические сведения
4.1.1Агрегирующие функции
Довольно часто требуется узнать, сколько записей соответствует тому или иному запросу, какова сумма значений некоторого числового столбца, его максимальное, минимальное и среднее значение. Для этого служат так называемые итоговые (статистические, агрегатные) функции. Агрегатные функции – особый класс функций, применяемых сразу к нескольким записям набора данных, но возвращающим одно значение. Обычно агрегатные функции используются в запросах с группировкой, но также встречается их применение и в запросах без группирования. В этом случае агрегатная функция обрабатывает все записи итогового набора.
Для подсчёта различных агрегированных значений (по группе записей таблицы) стандарт SQL включает функции агрегирования:
−COUNT(*) – определяет количество строк (записей) в результате;
−COUNT(<поле>) – подсчёт количества ненулевых значений поля;
−COUNT(distinct <поле>) – подсчёт количества разных значений поля;
−MAX(<поле>), MIN(<поле>) – определяет максимальное (минимальное) значение указанного поля в результирующем множестве;
−SUM(<поле>) – определяет арифметическую сумму значений указанного числового поля в результирующем множестве записей;
35
−SUM (distinct <поле>) – суммирование разных значений поля;
−AVG(<поле>) – определяет среднее арифметическое значений указанного числового поля в результирующем множестве записей;
−AVG (distinct <поле>) – среднее арифметическое разных значений поля.
При использовании итоговых функций в списке столбцов в операторе SELECT заголовки соответствующих им столбцов в результатной таблице имеют вид Expr1001, Expr1002 и т.д. (или что-нибудь аналогичное, в зависимости от реализации SQL). Однако можно задать заголовки для значений итоговых функций и других столбцов по усмотрению пользователя. Для этого достаточно после имени столбца в операторе SELECT указать выражение вида AS заголовок_столбца.
Count (параметр) – возвращает количество записей, указанных в параметре. Если требуется получить количество всех записей итогового набора, то в качестве параметра следует указать символ звездочки (*). Если в качестве параметра указать имя столбца, то функция вернет количество записей, в которых этот столбец имеет значения, отличные от NULL. Чтобы узнать, сколько различных значений содержит столбец, перед его именем следует указать ключевое слово DISTINCT.
Ниже приведено несколько примеров агрегирующих SQL-запросов.
Пример 1. По таблице Книги посчитать среднюю стоимость всех имеющихся книг.
SELECT AVG(`Стоимость`) AS `Средняя цена` FROM `книга`
Рис. 35 – Результат запроса
Пример 2. В таблице Книги найти название и стоимость самой дорогой книги
SELECT `Название`,`Стоимость` FROM `книга` WHERE `Стоимость`= SELECT MAX(`Стоимость`)FROM`книга`
36
Рис. 36 – Результат запроса
Пример 3. Вывести общую стоимость книг издательства Эксмо
SELECT SUM(`Стоимость`) AS `Общая стоимость книг Эксмо` FROM `книга`
WHERE `Издательство`='Эксмо'
Рис. 37 – Результат запроса
4.1.2Группировка записей
Предложение GROUP BY в инструкции SELECT задает столбцы, используемые для формирования групп из выбранных строк. Строки каждой группы содержат одно и то же значение заданного столбца (столбцов). Выражение за ключевым словом GROUP BY может быть простым полем таблицы, оно также может представлять собой произвольную операцию с полем. При перечислении нескольких полей или выражений, разделенных запятыми, группировка записей производится по совпадению значений во всех перечисленных выражениях. Появление секции GROUP BY в запросе SQL приводит к тому, что все записи с одинаковым значением выражений, заданных в предложении GROUP BY, группируются в одну запись. Если предложение GROUP BY расположено после предложения WHERE, то создаются группы из строк, выбранных после применения WHERE.
Необходимо понимать, что все целевые поля, указанные в секции SELECT, участвующие в запросе с группировкой, но не указанные в секции GROUP BY, доступны лишь при выборке через агрегатную функцию. Другими словами, при включении предложения GROUP BY в инструкцию SELECT список выбора может состоять только из выражений, указанных в предложении GROUP BY или из агрегатных функций.
Пример. Вывести количество книг, хранящихся в БД, для каждого издательства.
37
SELECT `Издательство`, COUNT(`IdТовара`) AS `Количество книг`
FROM `книга`
GROUP BY `Издательство`
Рис. 38 – Результат запроса
Секция GROUP BY указывает на то, что записи объединенного набора данных должны группироваться по имени издательства. Все записи с одинаковым названием издательства группируются, после чего функция count() подсчитывает в каждой группе количество непустых значений поля idТовара и возвращает результат – количество записей, объединенных в каждую группу для одного издательства.
4.1.3Оператор HAVING: отбор групп записей по условию
Предложение HAVING, за которым следует условие отбора, определяет группы строк, которые включаются в результатную таблицу. Условие отбора будет применяться к каждой из групп, сформированных с помощью секции GROUP BY. Если некоторая группа не удовлетворяет условию отбора, то она не включается в результатную таблицу.
Оператор HAVING очень похож на оператора WHERE, однако между собой они имеют существенное отличие: WHERE фильтрует данные до того, как они будут сгруппированы, а HAVING – осуществляет фильтрацию после группировки. Операторы WHERE и HAVING могут использоваться в одном предложении, но строки, которые были изъяты предложением WHERE, не будут включены в группу.
Пример. Вывести сгруппированное по издательствам количество книг, выпущенных в 2021 году.
SELECT `Издательство`, COUNT(`IdТовара`) AS `Количество книг`
FROM `книга`
GROUP BY `Издательство`, `Год издания` HAVING (`Год издания`) = '2021'
38
Рис. 39 – Результат запроса
4.2Пример агрегирующего SQL-запроса в phpMyAdmin
На вкладке SQL введите текст запроса и нажмите на кнопку ОК.
Пример. По данным таблицы Заказ посчитать, сколько заказов сделал каждый клиент.
SELECT `idКлиент` , COUNT( `idЗаказ` ) AS `Количество заказов`
FROM `заказ`
GROUP BY `idКлиент`
Рис. 40 – Результат запроса
Пример. Из таблицы Книги вывести отчет, показывающий количество книг, выпущенных каждым издательством и сгруппированных по сериям.
SELECT `Издательство`,`Серия`, COUNT(`IdТовара`) AS `Количество книг в серии`
FROM `книга`
GROUP BY `Издательство`,`Серия`
Рис. 41 – Результат запроса
39
Задание на выполнение лабораторной работы
Выполнить пять SQL-запросов, используя функции агрегирования и группировку записей, затем сохранив их в текстовой документе.
Требования к отчету
Отчет должен включать описание всех запросов с соответствующими командами SELECT в текстовом формате и скриншотами результатов их выполнения, а также текстовый файл с командами SQL.
Лабораторная работа №5. SQL: работа со связанными таблицами
Тема: Приобретение практических навыков использования языка SQL для выборки данных из связанных таблиц, работы с родительскими и дочерними таблицами, создания перекрестных запросов.
Цель лабораторной работы: Приобретение практических навыков использования языка SQL для работы со связанными таблицами
5.1Теоретические сведения
Запросы к одной таблице могут быть весьма информативными, но при работе в реальными базами данных чаще возникает необходимость работы не с одной, а сразу с несколькими таблицами БД. В секции FROM указывается источник данных – таблица или итоговый набор.
При использовании ссылок на имена полей, относящихся к разным источникам, может возникнуть неоднозначность. Предположим, команда SELECT получает исходные данные из таблиц Книга и Жанр. В каждой из этих таблиц имеется поле с именем idЖанр. Без дополнительных уточнений невозможно определить, к какой таблице относится ссылка на поле idЖанр в следующей команде:
SELECT `idЖанр`
FROM `книга`, `жанр`;
Для предотвращения неоднозначности в «полные» имена столбцов включается имя таблицы. При этом используется специальный синтаксис, называемый точечной записью (название связано с тем, что имя таблицы отделяется от имени поля точкой). Например, `книга`.`idЖанр` означает поле idЖанр таблицы Книга.
40
