Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
DB-Lab4.pdf
Скачиваний:
67
Добавлен:
21.03.2016
Размер:
577.64 Кб
Скачать

1

Лабораторная работа №4

ИЗУЧЕНИЕ ОПЕРАТОРА ВЫБОРКИ SELECT ЗАПРОСЫ К ОТДЕЛЬНЫМ ТАБЛИЦАМ

Цель работы: Получить навыки создания запросов на выборку к отдельным таблицам БД на языке SQL.

Язык SQL

Язык структурированных запросов SQL (Structured Query Language) является стандартным средством, обеспечивающим взаимодействия прикладного программного обеспечения с реляционными базами данных. SQL поддерживается большинством современных СУБД, включая и MS Access. В настоящее время наиболее распространенной версий языка SQL является версия SQL-92, принятая как международный стандарт в 1992 году. В лабораторных работах будем использовать именно эту версию.

Язык SQL включает в себя два основных подмножества операторов: операторы для описания данных – DDL (Data Definition Language) и операторы для манипуляции данными DML (Data Manipulation Language).

Кподмножеству DDL относятся операторы создания (CREATE), удаления (DROP) и изменения (ALTER) различных объектов БД, таких как таблицы, представления, хранимые процедуры и др. В составе большинства систем управления базами данных (СУБД) имеются развитые средства для создания, изменения и удаления объектов БД:

конструкторы в MS Access, утилита Enterprise Manager в MS SQL Server и т. п. Они служат альтернативой операторам подмножества DDL и успешно применяются как начинающими, так и опытными пользователями.

Кподмножеству DML относятся операторы выборки (SELECT), добавления (INSERT), удаления (DELETE), модификация (UPDATE) записей таблиц. Альтернативой операторам подмножества DML является язык запросов по образцу QBE (Query By Example), который поддерживается многими современными СУБД. Как уже известно из предыдущей работы, язык QBE использует визуальный подход для организации доступа к информации в БД. Работа в нем осуществляется посредством задания образцов значений в шаблоне запроса. Хотя язык QBE является менее мощным средством построения запросов, чем язык SQL, его использование может оказаться полезным при первоначальном знакомстве с БД.

2

С учетом вышесказанного при построении простых запросов можно использовать средства языка QBE, а для построения более сложных запросов (например, с использованием подзапросов) следует применять операторы языка SQL.

Следует также отметить, что QBE-запрос перед выполнением преобразуется в запрос на языке SQL и лишь затем выполняется.

Для того, чтобы построить SQL запрос в СУБД MS Access,

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

далее выполнить пункт главного меню Вид–Режим SQL. При этом, если ранее был создан запрос с помощью языка QBE, можно наблюдать текст этого же запроса на языке SQL.

Оператор SELECT

Самым полезным и самым сложным в языке DML является оператор SELECT. Он позволяет производить выборки данных из таблицы и преобразовывать их к нужному виду для отображения. В общем случае результатом выполнения оператора SELECT является динамическая таблица. В данной лабораторной работе изучается именно этот оператор.

Синтаксис оператора SELECT выглядит следующим образом:

SELECT <список полей>

FROM <список таблиц>

[WHERE <спецификация выбора строк>] [GROUP BY <спецификация группировки>] [HAVNG <спецификация выбора групп>] [ORDER BY <спецификация сортировки>] [UNION <оператор SELECT>]

Подробно каждый из параметров оператора SELECT будет рассмотрен далее.

Для рассмотрения примеров, будет использована база данных, состоящая из трех таблиц, схема которой приведена на рисунке 1.

Рисунок 1 - Схема базы данных для рассмотрения примеров

3

Как видно из рисунка, таблицы Поставщики и Детали являются главными, а таблица Поставки – подчиненная с составным первичным ключом (на схеме заголовок столбца первичного ключа выделен жирным шрифтом)

Таблица Поставщики содержит информацию о поставщиках, а именно поле [Наименование поставщика] и поле [Номер поставщика], являющееся первичным ключом.

Таблица Детали содержит информацию о деталях, а именно: поля [Наименование детали], [Цена детали] и поле [Номер поставщика], являющееся первичным ключом.

Таблица 1. Поставщики

 

Таблица 2. Детали

 

 

 

Таблица Поставки содержит информацию о поставках, происходящих в настоящее время. Эта таблица содержит поля [Номер поставщика] и [Номер детали], являющиеся вместе первичным ключом таблицы, кроме того, эти поля являются внешними ключами для таблиц Поставщики и Детали соответственно. Также в таблице содержится поле Объем. Это поле содержит информацию о объеме поставки.

Таблица 3. Поставки

Предложения SELECT и FROM

После служебного слова SELECT перечисляются имена столбцов, значения которых будут входить в результат запроса. Столбцы в результирующей таблице размещены в том же порядке, в котором они указаны в предложении SELECT. Если имя столбца содержит пробелы, то оно должно быть заключено в квадратные скобки. При выборе данных из нескольких таблиц может возникнуть ситуация, когда столбцы имеют одинаковое название, в этом случае имя столбца задается в формате

4

SELECT <Имя таблицы>.<Имя столбца>

В предложении FROM указываются имена таблиц, которые содержат столбцы, указанные после служебного слова SELECT. Более подробно предложение FROM рассматривается в следующей лабораторной работе.

Пример: Получить информации о деталях.

1 способ:

SELECT [Номер детали], [Наименование детали], [Цена детали] FROM Детали

2 способ:

SELECT *

FROM Детали

Пример: Получить список номеров поставщиков, которые в настоящее время поставляют детали.

SELECT [Номер поставщика]

FROM Поставки

Исключить дублирующиеся значения позволяет использование параметра DISTINCT.

Пример: Получить список номеров поставщиков, которые в настоящее время поставляют детали, исключив повторяющиеся значения.

SELECT DISTINCT [Номер поставщика] FROM Поставки

5

Параметр DISTINCT можно указать только один раз для одного оператора SELECT. Альтернативой является ALL, Те есть показать все строки таблицы. Аргумент ALL стоит по умолчанию.

В предложении SELECT можно использовать вычисляемые поля. Для создания вычисляемых полей в операторе SELECT следует указать выражение, в котором можно использовать арифметические операции, а так же функции языка SQL.

Пример: Вывести информацию деталях с указанием цены в рублях и долларах, если курс доллара составляет 25 рублей за 1 доллар.

SELECT [Наименование детали],

[Цена детали] AS [Цена детали в рублях], [Цена детали]*25 AS [Цена детали в долларах]

FROM Детали

Ключевое слово AS позволяет задать псевдоним поля, т.е. название поля, которое будет использоваться в результирующей таблице. Если для вычисляемого поля не использовать псевдоним, СУБД автоматически назовет его мало понятным именем, например, Expr102.

Предложение WHERE

В этом предложении указывается условие выбора строк, которые помещаются в результирующую таблицу. При формировании условия могут использоваться следующие операции:

1.Сравнение значений атрибутов со скалярными выражениями, другими атрибутами и различными вычисляемыми выражениями: {<,>, =, <=, >= , <>}.

2.Логические операции: OR, AND, NOT.

3.Проверка значения на принадлежность множеству: IN.

4.Проверка значения на принадлежность диапазону: BETWEEN.

5.Проверка строкового значения на соответствие шаблону:

LIKE.

6. Проверка на наличие NULL значений: IS NULL, IS NOT NULL.

6

Пример: Вывести информацию о деталях, цена которых больше 20р.

SELECT *

FROM Детали

WHERE [Цена детали] > 20

Пример: Вывести информацию о поставщиках Иванове и Петрове.

SELECT *

FROM Поставщики

WHERE [Наименование поставщика] = 'Иванов'

OR [Наименование поставщика] = 'Петров'

Пример: Вывести название деталей, цена которых лежит в диапазоне от 10 до 20 руб.

SELECT [Наименование детали]

FROM Детали

WHERE [Цена детали] BETWEEN 10 AND 20

Пример: Вывести информацию о поставщиках с фамилией на "И":

SELECT *

FROM Поставщики

WHERE [Наименование поставщика] LIKE 'И*';

Пример: Вывести наименование детали, цена которой не указана:

SELECT [Наименование детали] FROM Детали

WHERE [Цена детали] IS NULL

7

Использование агрегатных функций

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

SUM – сумма всех значений поля;

AVG – среднее арифметическое значений поля;

MIN – минимальное значение поля;

MAX – максимальное значение поля;

COUNT – подсчет количества значений;

FIRST – первое значение;

LAST – последнее значение.

При этом стандартными функциями, т.е. реализованными в любой СУБД, являются: SUM, AVG, MIN, MAX и COUNT.

Функция COUNT может использоваться в двух вариантах:

1. COUNT(<имя столбца>) – в этом случае происходит подсчет с трок в таблице, в которых значение указываемые именем столбца не являются NULL-значениями.

2. COUNT(*) – в этом случае подсчет происходит с учетом NULLзначений.

Пример: Определить суммарное количество деталей, поставляемое всеми поставщиками:

SELECT SUM(Объём) AS [Суммарный объём]

FROM Поставки;

Так как столбца с именем SUM(объем поставки) нет в исходной таблице, то мы задаем имя

Пример: Определить количество потенциальных поставщиков:

SELECT COUNT(*) AS [Количество поставщиков]

FROM Поставщики;

8

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

Пример:

Определить максимальную поставку детали 1.

SELECT MAX(Объём) AS [Максимальный объём]

FROM Поставки

WHERE [Номер детали]=1;

Предложение GROUP BY

Использование GROUP BY предоставляет возможность разбивать таблицы на логические группы и применять агрегатные функции к каждой из этих групп. В результате получаем единственное значение для каждой группы.

Пример:

Определить суммарное количество деталей, поставляемых каждым поставщиком.

SELECT [Номер поставщика], SUM(Объём) AS [Суммарный объём] FROM Поставки

GROUP BY [Номер поставщика];

Если предложение GROUP BY расположено после WHERE, то группы создаются из строк, выбранных после применения WHERE.

Пример: Для каждой из деталей №1 и №2 определить количество поставщиков, которые их поставляют, а так же суммарный объем поставок.

9

SELECT [Номер детали], COUNT([Номер поставщика]) AS [Количество поставщиков],

SUM(Объём) AS [Суммарный объём] FROM Поставки

WHERE [Номер детали]=1 OR [Номер детали]=2 GROUP BY [Номер детали];

Все имена, перечисленные после слова SELECT должны присутствовать и в предложении GROUP BY за исключением тех случаев, когда имя аргумента является аргументом агрегатной функции.

В предложении GROUP BY могут быть указаны имена столбцов, не перечисленных в списке вывода.

Предложение HAVING

Определяет критерий, согласно которому отдельные группы, сформированные с помощью предложения GROUP BY, исключаются из результирующей таблицы. Выполнение HAVING исключает строки сходно с выполнение WHERE. Но WHERE исключает строки до выполнения группировки, а HAVING после. Поэтому предложение HAVING должно включать агрегатные функции.

Пример: Определить номера поставщиков, которые поставляют в сумме более 500 деталей:

SELECT [Номер поставщика], SUM(Объём) AS [Суммарный объём] FROM Поставки

GROUP BY [Номер поставщика] HAVING SUM(Объём)>500;

Пример: Вывести номера поставщиков, которые поставляют только одну деталь.

SELECT [Номер поставщика],

COUNT([Номер детали]) AS [Код детали]

FROM Поставки

GROUP BY [Номер поставщика]

HAVING COUNT([Номер детали])=1;

10

Предложение ORDER BY

При выполнении запроса СУБД выводит строки в случайном порядке. Предложение ORDER BY позволяет упорядочить выходные данные запроса в соответствии со значениями одного или нескольких столбцов. Можно создать возрастающий порядок с помощью ключевого слова ASC и убывающий с помощью ключевого слова DESC. По умолчанию принят возрастающий порядок.

Пример: Отсортировать таблицу Поставки в порядке возрастания значения [Номер поставщика], а строки с одинаковыми значениями [Номер поставщика] в порядке убывания значения поля Объем.

SELECT *

FROM Поставки

ORDER BY [Номер поставщика], Объём DESC;

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

Предложение UNION

Предложение UNION позволяет объединить выполнение двух запросов. При этом необходимо соблюдать следующие правила:

1.При объединении данных и столбцов с различными именами результирующему столбцу присваивается имя столбца из первого запроса.

2.Если типы данных в столбцах не совпадают, то для результирующего столбца подбирается тип данных, совместимый с исходными столбцами (в крайнем случае – символьный тип).

11

Пример: Получить номера деталей, цена которых больше 20 рублей, или суммарное поставляемое количество больше 1000.

SELECT [Номер детали]

FROM Детали

WHERE [Цена детали]>20

UNION

SELECT [Номер детали]

FROM Поставки

GROUP BY [Номер детали]

HAVING SUM(Объём)>1000

ORDER BY [Номер детали];

Пример: Вывести информацию о деталях, в том случае, если цена детали не указана записывать "Цена не указана"

SELECT [Номер детали], [Наименование детали], [Цена детали]

FROM Детали

WHERE [Цена детали] IS NOT NULL UNION

SELECT [Номер детали], [Наименование детали],

'Цена неизвестна' AS [Цена детали] FROM Детали

WHERE [Цена детали] IS NULL;

Пример: В связи со снижением цен деталей, задаваемых таблицей "скидки" вывести информацию в следующем виде:

Цена детали

Скидка

<15

5%

15 . . 25

10%

>25

20%

12

SELECT [Наименование детали],

[Цена детали] AS [Старая цена], '5%' AS Скидка,

[Цена детали]*0.95 AS [Новая цена] FROM Детали

WHERE [Цена детали]<15 UNION

SELECT [Наименование детали],

[Цена детали] AS [Старая цена], '10%' AS Скидка,

[Цена детали]*0.9 AS [Новая цена] FROM Детали

WHERE [Цена детали] BETWEEN 15 AND 25 UNION

SELECT [Наименование детали],

[Цена детали] AS [Старая цена], '20%' AS Скидка,

[Цена детали]*0.8 AS [Новая цена] FROM Детали

WHERE [Цена детали]>25;

13

Задание

Разработать запросы на языке SQL в соответствии с вариантом задания.

Вариант 1 Поставка товаров

1.Изучение предложения SELECT.

1.1.Вывести полную информацию обо всех потенциальных поставщиках.

1.2.Вывести информацию о наименовании и фирмепроизводителе товара.

1.3.Вывести информацию о двух первых хранимых записях о поставщиках.

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

1.5.Выполнить задание из п. 1.1.4 с указанием имен для вычисляемых полей.

1.6.Вычислить среднюю цену товара.

1.7.Найти минимальную цену товара.

1.8.Найти максимальную цену товара.

1.9.Найти количество потенциальных поставщиков.

2.Изучение предложения WHERE.

2.1.Вывести информацию обо всех товарах, цена которых меньше 100 рублей.

2.2.Вывести информацию обо всех товарах, цена которых меньше 1000 рублей, но больше 200 рублей, используя логические операции.

2.3.Выполнить предыдущее задание, используя операцию

BETWEEN.

2.4.Вывести информацию о следующих поставщиках: Мышкин, Кошкин, Рыбкин.

2.5.Вывести информацию о товарах, названия которых начинается с буквы Ц, Ч или Щ.

2.6.Вывести информацию о поставщиках, у которых указан телефон.

2.7.Вывести информацию о товарах, для которых не указана цена.

3.Изучение предложения GROUP BY.

3.1.Вывести количество товаров по каждой фирмепроизводителю.

14

3.2.Вывести минимальную цену товара для фирмпроизводителей, названия которых начинается с буквы А.

4.Изучение предложения HAVING.

4.1.Вывести названия фирм-производителей, которые представляют только один товар.

4.2.Выполнить предыдущий запрос для фирм-производителей, названия которых начинается с буквы А.

5.Изучение предложения ORDER BY.

5.1.Вывести список наименований потенциальных поставщиков в алфавитном порядке.

5.2.Вывести список наименований и цен товаров, отсортировав его по возрастанию цены товаров.

5.3.Вывести информацию о трех самых дешевых товарах.

6.Изучение предложения UNION.

6.1.Вывести информацию о товарах, названия которых начинается на буквы Ц, Ч или Щ.

6.2.Вывести полную информацию обо всех потенциальных поставщиках. Если телефон поставщика не указан, то в соответствующем столбце вывести строку: «отсутствует».

6.3.Вывести информацию о товарах, изменив цену товара в связи с сезонными скидками в соответствии со следующей таблицей:

Цена товара

Скидка

< 100

10%

100..1000

20%

> 1000

30%

Вариант 2 Киносеанс

1.Изучение предложения SELECT.

1.1.Вывести полную информацию обо всех существующих кинотеатрах города.

1.2.Вывести информацию о названии и годе выпуска кинофильма.

1.3.Вывести информацию о двух первых хранимых записях о кинотеатрах.

1.4.Вывести информацию обо всех существующих кинотеатрах, указав в поле «Телефон» междугородний код города перед номером телефона кассы.

1.5.Выполнить задание из п. 1.1.4 с указанием имен для вычисляемых полей.

15

1.6.Вычислить среднюю стоимость сеанса.

1.7.Найти год выпуска самого старого кинофильма.

1.8.Найти год выпуска последнего выпущенного кинофильма.

1.9.Найти количество существующих кинотеатров.

2.Изучение предложения WHERE.

2.1.Вывести информацию обо всех кинофильмах, выпущенных позже 2000 года.

2.2.Вывести информацию обо всех кинофильмах, выпущенных с

1990 по 2000 год.

2.3.Выполнить предыдущее задание, используя операцию

BETWEEN.

2.4.Вывести информацию о следующих кинотеатрах: «Дружба», «Мир», «Ока».

2.5.Вывести информацию о кинофильмах, названия которых начинается с буквы К, Л или М.

2.6.Вывести информацию о кинотеатрах, у которых указан телефон кассы.

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

3.Изучение предложения GROUP BY.

3.1.Вывести количество кинофильмов, выпущенных по каждой стране-производителю.

3.2.Вывести минимальный год выпуска кинофильма для странпроизводителей, названия которых начинается с буквы К.

4.Изучение предложения HAVING.

4.1.Вывести названия стран-производителей, которые представляют только один кинофильм.

4.2.Выполнить предыдущий запрос для стран-производителей, названия которых начинается с буквы К.

5.Изучение предложения ORDER BY.

5.1.Вывести список наименований существующих кинотеатров в алфавитном порядке.

5.2.Вывести список названий кинофильмов, отсортировав его по возрастанию года выпуска кинофильма.

5.3.Вывести информацию о трех самых старых кинофильмах.

6.Изучение предложения UNION.

6.1.Вывести информацию о кинофильмах, названия которых начинается с буквы К, Л или М.

6.2.Вывести полную информацию обо всех существующих кинотеатрах. Если телефон кассы не указан, то в соответствующем столбце вывести строку: «неизвестен».

16

6.3.Вывести информацию о сеансах, изменив стоимость сеанса в зависимости от времени его показа в соответствии со следующей таблицей:

Время сеанса

Скидка

до 12.00

30%

от 12.00 до 17.00

10%

после 17.00

0%

Вариант 3 Поликлиника

1.Изучение предложения SELECT.

1.1.Вывести полную информацию обо всех врачах поликлиники.

1.2.Вывести информацию о фамилиях и адресах пациентов.

1.3.Вывести информацию о двух первых хранимых записях о врачах.

1.4.Вывести полную информацию обо всех пациентах, добавив после года рождения последовательность символов «г.»

1.5.Выполнить задание из п. 1.1.4 с указанием имен для вычисляемых полей.

1.6.Вычислить среднюю стоимость приема.

1.7.Найти возраст самого пожилого пациента.

1.8.Найти максимальный номер кабинета.

1.9.Найти количество врачей, числящихся в поликлинике.

2.Изучение предложения WHERE.

2.1.Вывести информацию обо всех пациентах, родившихся после

1971 года.

2.2.Вывести информацию обо всех врачах, ведущих прием в кабинетах с 10 по 20.

2.3.Выполнить предыдущее задание, используя операцию

BETWEEN.

2.4.Вывести информацию о врачах, работающих по специальностям: терапевт, хирург, окулист.

2.5.Вывести информацию о врачах, фамилия которых начинается с буквы И, П или С.

2.6.Вывести информацию о врачах, у которых указан номер кабинета.

2.7.Вывести информацию о пациентах, у которых не указан адрес.

3.Изучение предложения GROUP BY.

3.1.Вывести количество врачей по каждой специализации.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]