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

Архив / Пособие_SQL

.pdf
Скачиваний:
55
Добавлен:
14.05.2015
Размер:
629.59 Кб
Скачать

ПетрГУ, кафедра прикладной математики и кибернетики

count(*)

5

После Select можно указать агрегатную функцию: count(<столбец>) – количество непустых значений столбца; sum(<столбец >) – сумма значений столбца;

avg(<столбец >) – среднее значение в столбце; min(<столбец >) – минимальное значение в столбце; max(<столбец >) – максимальное значение в столбце; count(*) – количество кортежей в таблице.

9. Получить минимальный и максимальной размер поставки детали номер 5.

Select min(n), max(n) From dp

Where id_d = 5

min(n)

max(n)

100

300

Получить минимальный и максимальной размер поставки детали номер 2. Select min(n), max(n)

From dp Where id_d = 2

min(n)

max(n)

200

200

Вэтом случае будут одинаковые значения.

10.Для каждой поставляемой детали получить номер детали и общий размер поставки. Упорядочить по убыванию размера поставки.

Select id_d, sum(n) From dp

Group by id_d

Order by sum(n) desc

id_d

sum(n)

или

id_d

sum(n)

5

600

 

5

600

3

300

 

1

300

1

300

 

3

300

2

200

 

2

200

4

100

 

4

100

Без группировки результирующая таблица будет содержать все кортежи таблицы dp.

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

Select id_d From dp Group by id_d

Having count(id_p) > 1

Условия, записанные после Where, проверяются для каждой записи таблицы, участвующей в запросе. Условия, записанные после Having, проверяются для каждой группы записей, определяемой различными значениями атрибутов, написанными после Group by.

Конспект лекций по дисциплине «Базы данных» (Язык SQL)

11

ПетрГУ, кафедра прикладной математики и кибернетики

12. Получить названия городов, в которых производятся детали, суммарный вес которых не превосходит 30, не считая деталей с названием «гвоздь».

Select d.city From d

Where d.name != ‘гвоздь’ Group by d.city

Having sum(weight)<=30

Рассмотрим выполнение этого запроса на схеме:

винт

М

12

 

 

 

 

 

 

 

 

 

 

 

 

 

 

винт

М

12

 

 

 

 

 

 

болт

СПб 17

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

болт

СПб 17

 

 

 

 

 

 

гайка Тула 17

 

 

 

 

 

М

 

М 26

 

 

 

гайка Тула 17

 

sum

 

М

 

 

 

 

 

 

 

 

гайка М

14

where

 

 

 

group by

СПб

(weight)

СПб 38

having

 

гайка М

14

шайба СПб 21

 

 

 

 

 

Тула

 

Тула 29

 

Тула

 

 

 

 

 

 

 

 

 

шайба СПб 21

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

гвоздь М

19

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

болт

Тула 12

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

болт

Тула 12

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Сначала опция «Where» отбирает записи, которые удовлетворяют условию «не считая деталей с названием гвоздь». Затем записи группируются по названию города и для каждого города формируется только одна результирующая запись (опция «Group by») (см. рисунок ниже). Для каждой группы рассчитывается суммарный вес деталей. Далее опция «Having» отбирает среди результирующих записей записи, для которых выполняется условие «суммарный вес не превосходит 30».

 

 

 

 

group by

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

винт

М

12

 

 

 

 

 

 

 

 

 

 

 

 

 

винт

М

12

 

гайка М

14

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

болт

СПб 17

 

 

 

 

 

 

 

 

 

 

 

 

 

М

 

 

 

 

 

 

 

 

 

гайка Тула 17

 

болт

СПб 17

 

 

 

СПб

 

 

 

 

 

 

 

 

 

гайка М

14

 

шайба СПб 21

 

 

Тула

 

 

 

 

 

 

 

 

 

шайба СПб 21

 

 

 

 

 

 

 

 

 

 

 

 

 

болт

Тула 12

 

гайка Тула 17

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

болт

Тула 12

 

 

Опция Group by используется, если после Select стоят названия нескольких столбцов и агрегатные функции, тогда после Group by должны быть записаны все названия столбцов, которые находятся в Select, кроме агрегатных функций.

Если после Select стоят только агрегатные функции, то Group by включать в запрос не нужно.

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

Select distinct p.pname From p, dp

Where (p.id_p = dp.id_p) and (dp.id_d = 5)

Этот же запрос можно сформулировать по-другому.

Select pname From p

Where id_p in ( Select id_p From dp

Where id_d = 5 )

Это запрос с подзапросом. Сначала выполняется подзапрос, который возвращает множество номеров поставщиков, поставляющих деталь номер 5. Затем для каждого поставщика проверяется,

Конспект лекций по дисциплине «Базы данных» (Язык SQL)

12

ПетрГУ, кафедра прикладной математики и кибернетики

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

Другой вариант запроса:

Select pname From p Where exists (

Select * From dp

Where (dp.id_p = p.id_p) and (id_d = 5) )

Этот запрос также с подзапросом, но он выполняется иначе, чем предыдущий. Подзапрос выполняется для каждой записи о поставщике, так как включает в себя ссылку на таблицу «поставщики» из внешнего запроса. Таким образом, выбирается очередная запись из таблицы «поставщики», для нее проверяется условие, включающее выполнение подзапроса, в который подставляется номер поставщика. Затем выбирается следующая запись, для нее также выполняется подзапрос с подстановкой номера поставщика, но уже другого из новой записи о поставщике.

Если в подзапрос включить кроме таблицы d таблицу p, то запрос вернет имена всех поставщиков, так как он не будет связан в запросом верхнего уровня и выполнится только один раз, а так как в таблице «поставки» есть хотя бы одна поставка детали номер 5, то он будет содержать записи, следовательно, функция exists() вернет значение «истина», не зависимо от поставщика, и все поставщики попадут в результирующую таблицу.

Функция exists() возвращает значение «истина», если результат подзапроса содержит хотя бы одну запись, иначе – функция возвращает значение «ложь».

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

Select pname From p

Where id_p not in ( Select id_p From dp

Where id_d = 5 )

Второй вариант запроса:

Select pname From p

Where not exists ( Select * From dp

Where (dp.id_p = p.id_p) and (id_d = 5) )

Этот запрос можно выполнить только с помощью подзапроса.

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

Select distinct p.pname

From p, dp

Where (p.id_p = dp.id_p) and (dp.id_d <> 5)

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

Select distinct p.pname From p, d, dp

Where (p.id_p = dp.id_p) and (dp.id_d = d.id_d) and (d.color = ‘красная’)

Конспект лекций по дисциплине «Базы данных» (Язык SQL)

13

ПетрГУ, кафедра прикладной математики и кибернетики

Второй вариант запроса:

Select pname From p

Where id_p in ( Select id_p From dp Where id_d in (

Select id_d From d

Where color = ‘красная’ ))

Количество вложений подзапросов может быть любым, но в некоторых реализациях, например в Access, установлено ограничение – не более двух вложенных подзапросов.

16. Получить номера поставщиков, статус которых меньше текущего максимального статуса в таблице «поставщики».

Select id_p From p

Where status < (

Select max(status) From p)

Но нельзя выполнить такой запрос:

Select id_p From p

Where status < ( MAX ( Select status From p) )

Формально этот запрос не может быть выполнен, так как нельзя сравнивать значение и отношение, возвращаемое подзапросом, но в данном случае это возможно. Если подзапрос гарантированно возвращает одно значение, то его результат можно сравнивать со значением столбца, иначе можно воспользоваться только операцией in (находится в множестве).

Аргументом агрегатной функции не может быть подзапрос! Аргументом агрегатной функции может быть только столбец таблицы (см. запрос № 8).

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

Select pname From p

Where not exists ( Select * From d

Where not exists ( Select * From dp

Where (p.id_p = dp.id_p) and (dp.id_d = d.id_d) ) )

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

18. Получить номера деталей, которые весят более 16 грамм или поставляются поставщиком номер 2.

Select distinct d.id_d From d, dp

Where (dp.id_d = d.id_d) and ((d.weight >16) or (dp.id_p = 2))

Конспект лекций по дисциплине «Базы данных» (Язык SQL)

14

ПетрГУ, кафедра прикладной математики и кибернетики

Второй вариант запроса:

Select id_d From d

Where weight >16 Union

Select id_d From dp Where id_p = 2

Union – операция объединения результатов двух запросов. Intersect – операция пересечения результатов двух запросов. Except – операция разности результатов двух запросов.

Результирующие таблицы запросов при выполнении операций объединения, пересечения и разности должны иметь одинаковую структуру.

19. Для более сложных запросов можно первоначально создать представление, а затем обратиться в запросе к представлению.

§ 6.4 Логические выражения для Where и Having

<столбец> between <значение 1> and <значение 2> – значение <столбца> находится между <значением 1> и <значением 2>, то есть значение <столбца> больше или равно <значению 1> и меньше или равно <значению 2>;

<столбец> in (<элемент 1>,<элемент 2>,…) – значение <столбца> находится в множестве элементов, перечисленных в скобках;

<столбец> in (<подзапрос>) – значение <столбца> находится в множестве, полученном в результате <подзапроса>;

<столбец> like <строка-маска> – значение <столбца> соответствует маске: «%» – набор символов, «_» – единичный символ;

<столбец> is Null – значение <столбца> пусто;

<столбец> <сравнение> {Some | Any} <подзапрос> – значение <столбца> <сравнимо> хотя бы с одной строкой, возвращаемой <подзапросом>;

<столбец> <сравнение> All <подзапрос> – значение <столбца> <сравнимо> со всеми строками, возвращаемыми <подзапросом>;

Exists ( <подзапрос> ) – функция возвращает значение «истина», если результат <подзапроса> содержит хотя бы одну строку, иначе – значение «ложь»;

Unique ( <подзапрос> ) – функция возвращает значение «истина», если результат <подзапроса> содержит только различные строки, если результат <подзапроса> содержит хотя бы две одинаковые строки, то функция возвращает значение «ложь».

<подзапрос 1> Contains <подзапрос 2> – возвращает значение «истина», если первый подзапрос содержит все значения второго подзапроса (= Not Exists (<подзапрос 2> Except <подзапрос 1>)). Например, получить имена поставщиков, поставляющих все красные детали: Select p.pname From p Where (Select id_d From dp Where dp.id_p=p.id_p) Contains (Select id_d From d Where color=’красный’)

SQL имеет трехзначную логику: истина, ложь, неопределенно.

Условие 1

Условие 2

Условие 1 AND

Условие 1 OR

NOT Условие 2

 

 

Условие 2

Условие 2

 

true

true

true

true

false

true

false

false

true

true

true

unknown

unknown

true

unknown

false

true

false

true

 

false

false

false

false

 

false

unknown

false

unknown

 

unknown

true

unknown

true

 

unknown

false

false

unknown

 

unknown

unknown

unknown

unknown

 

Конспект лекций по дисциплине «Базы данных» (Язык SQL)

15

ПетрГУ, кафедра прикладной математики и кибернетики

§6.5 Формулировки запросов для самопроверки

1.Получить названия деталей, которые производятся в городах, названия которых содержат букву «а».

2.Получить названия деталей, средний вес которых не превосходит значения 13.

3.Получить названия деталей, вес которых находится в диапазоне от 12 до 18.

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

5.Получить имена поставщиков, поставляющих детали с номерами 1,2,4,5,80.

6.Получить уникальные названия городов, в которых производятся детали, или живут поставщики.

7.Получить список уникальных названий городов с указанием «деталь», если это город, в котором производится деталь, и с указанием «поставщик», если это город, в котором живет поставщик.

8.Получить список уникальных названий городов, в которых производится хотя бы одна деталь, но не живет ни один поставщик.

9.Получить суммарный объем всех поставок поставщиков с номерами 1 и 2.

10.Получить имена поставщиков, номера которых либо находятся в диапазоне от 1 до 4, либо эти поставщики не поставляют ни одной детали.

Конспект лекций по дисциплине «Базы данных» (Язык SQL)

16

ПетрГУ, кафедра прикладной математики и кибернетики

 

 

 

СОДЕРЖАНИЕ

 

§ 1

Введение

...........................................................................................................................

2

§ 2

Типы данных ....................................................................................................................

2

§ 3

Команды .......................................................................................определения данных

3

 

§ 3.1

Домены ..................................................................................................................

3

 

§ 3.1.1 ...........................................................................................

Создание домена

3

 

§ 3.1.2 ........................................................................................

Изменение домена

3

 

§ 3.1.3 ..........................................................................................

Удаление домена

3

 

§ 3.2

Таблицы .................................................................................................................

3

 

§ 3.2.1 .........................................................................................

Создание таблицы

3

 

§ 3.2.2 ........................................................................................

Удаление таблицы

4

 

§ 3.2.3 ...................................................................Изменение структуры таблицы

4

§ 4

Ограничения .....................................................................................................................

4

 

§ 4.1

Создание ..........................................................................................ограничения

4

 

§ 4.2

Удаление .........................................................................................ограничения

5

§ 5

Команды .........................................................................................обновления данных

5

 

§ 5.1

Операция ...........................................................................................добавление

5

 

§ 5.2

Операция ...............................................................................................удаление

5

 

§ 5.3

Операция .............................................................................................изменение

5

§ 6

Команда выборки ...............................................................................................данных

6

 

§ 6.1 Таблицы .......................для демонстрации работы команды выборки данных

6

 

§ 6.2 Команда ....................................................................................выборки данных

6

 

§ 6.3

Примеры ................................................................................................запросов

6

 

§ 6.4 Логические ....................................................выражения для Where и Having

15

 

§ 6.5 Формулировки .....................................................запросов для самопроверки

16

Конспект лекций по дисциплине «Базы данных» (Язык SQL)

17