Добавил:
Рад, если кому-то помог Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Методички по лабам ПрБД, 2 курс 3 семестр (для ИВТ и т.п.) / ПБД_метод к лабам_часть 2_v03 [2022-2023]

.pdf
Скачиваний:
44
Добавлен:
09.10.2025
Размер:
6 Мб
Скачать
☆

Рис. 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