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

db / Лекции / 6 семестр / Языки запросов_раздел_1_5-1_6

.pdf
Скачиваний:
44
Добавлен:
23.03.2015
Размер:
381.68 Кб
Скачать

Обратите внимание, что в результирующей таблице значения отсутствую-

щего столбца принимают значение NULL.

1.4.8 Соединение с использованием фразы FROM

Все рассмотренные выше типы и способы соединения таблиц можно осу-

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

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

струкции.

Уточненное соединение предполагает явное задание условия соединения.

Для этого можно использовать два варианта - фразу USING, с помощью кото-

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

таблица [INNER | {FULL | LEFT | RIGHT} [OUTER]] JOIN таблица {ON условие | USING

(список_столбцов)}

Естественное соединение выполняется по равенству значений всех пар од-

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

таблица NATURAL [INNER | {FULL | LEFT | RIGHT} [OUTER]] JOIN таблица

Перекрестное соединение эквивалентно декартовому произведению таб-

лиц. Его синтаксис самый простой:

таблица CROSS JOIN таблица

1.4.9 Итоги лекции

Усвоив материал этого урока, студенты научились:

соединять таблицы по равенству и по произвольному условию;

соединять три и более таблицы;

производить самосоединение таблицы;

строить асимметричные запросы;

строить запросы к иерархическим данным;

выполнять внешние соединения таблиц.

1.5 Использование функций (9)

1.5.1 Аннотация к лекции

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

ях и т. д.

От обычных операторов функции отличаются форматом представления:

имя_функции[(аргумент[, аргумент]...)]

Этот формат допускает, что функции могут иметь ноль, один или более ар-

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

Имеется два основных класса функций SQL: встроенные и определяемые пользователем. Встроенными являются функции, предопределенные в SQL. Ко второму классу относятся функции, которые пишутся пользователями на спе-

циальном языке, обеспечивающем использование всех возможностей SQL.

Каждая СУБД использует для этого свой собственный язык. В Oracle, напри-

мер, таким языком является PL/SQL.

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

На этом уроке мы рассмотрим:

агрегатные (или групповые) функции, оперирующие значениями столб-

цов множества строк и возвращающие одно значение;

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

1.5.2 Агрегатные функции

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

ся в другие арифметические выражения. В стандарте SQL определены следую-

щие виды агрегатных функций: унарные, бинарные, инверсного распределения,

гипотетические функции множеств.

Мы будем рассматривать только определенные в стандарте SQL унарные агрегатные функции. Их перечень представлен в табл. 5.1. Конкретные СУБД расширяют этот список (в Oracle, например, определено около 30 агрегатных функций).

Стандартные унарные агрегатные функции

 

Имя

Возвращаемое значений

1

COUNT

Количество значений в столбце или строк в таблице

2

SUM

Сумма

3

AVG

Среднее

4

MAX

Максимум

5

MIN

Минимум

6

VAR_P0P

Дисперсия генеральной совокупности

7

STDDEV_P0P

Среднее квадратичное отклонение дисперсии гене-

 

 

ральной совокупности

8

VAR_SAMP

Выборочная дисперсия

9

STDDEV_SAMP

Среднее квадратичное отклонение выборочной дис-

 

 

персии

10

EVERY

TRUE, если все значения TRUE

11

ANY, SOME

TRUE, если хотя бы одно значение TRUE

Общий формат унарной агрегатной функции следующий:

имя_функции([А1_1_ | DISTINCT] выражение) [FILTER (WHERE условие)]

где DISTINCT указывает, что функция должна рассматривать только раз-

личные значения аргумента, a ALL — все значения, включая повторяющиеся

(этот вариант используется по умолчанию). Например, функция AVG с ключе-

вым словом DISTINCT для строк столбца со значениями 1, 1, 1 и 3 вернет 2, а

при наличии ключевого слова ALL вернет 1,5. Фраза FILTER позволяет допол-

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

К сожалению, эта возможность реализована не во всех СУБД, использова-

ние условий в унарной агрегатной функции аналогично использованию усло-

вий во фразе WHERE.

Запрос. Информация о скольких преподавателях имеется в базе данных?

SELECT COUNT(*) AS "К-во преподавателей"

FROM TEACHER;

Запрос. Какая суммарная ставка всех ассистентов?

SELECT SUM(Salary)

FROM TEACHER

WHERE LOWER(Post) = 'ассистент';

Запрос. Сколько профессоров в вузе и какова их суммарная зарплата?

SELECT COUNT(*), SUM(Salary + Rise)

FROM TEACHER

WHERE LOWER(Post) = 'профессор';

Запрос. Сколько студентов пятого курса на факультете информатики?

SELECT SUM(Quantity)

FROM FACULTY f, DEPARTMENT d, SGROUP g

WHERE f.FacPK = d.FacFK AND

d.DepPK = g.DepFK AND Year = 5;

Запрос. Какова максимальная зарплата преподавателя ?

SELECT MAX(Salary + Rise)

FROM TEACHER;

Запрос. Когда в последний раз принимали на работу преподавателя на ка-

федру программирования?

SELECT MAX(Hiredate)

FROM DEPARTMENT d, TEACHER t

WHERE d.DepPK - t.DepFK AND

LOWER(d.Name) = 'программирование';

Запрос. Какая разница между минимальной и максимальной зарплатой у

доцентов?

SELECT MAX(Salary + Rise) – MIN(Salary + Rise)

FROM TEACHER

WHERE LOWER(Post) = ‘доцент’;

MAX(SALARY+RISE)-MIN(SALARY+RISE)

1.5.3 Однострочные функции

Напомним, что эти функции используют в качестве аргумента одно значе-

ние (одного столбца одной строки таблицы) и возвращают в качестве своего ре-

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

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

держит только один столбец с именем DUMMY типа VARCHAR(l) и только одну строку со значением 'X', т.к. никакой таблицы для следующих примеров нам не нужно вообще, так как результат запроса полностью определяется со-

держанием фразы SELECT. 1.5.3.1 Строковые функции

Функция SUBSTRING

Выбирает подстроку указанной длины из заданной строки, начиная с задан-

ной позиции. Если длина не задана, подстрока выбирается до конца строки.

SUBSTRING(стpoкa, начало[, длина])

Функции UPPER, LOWER

Эти функции мы уже рассматривали и многократно использовали. Они имеют следующий формат:

UPPER(cтрокa)

LOWER(cтрокa)

Функция TRIM

Эта функция возвращает строку аргумента, удаляя указанный символ из начала и/или конца строки. Ключевые слова LEADING (в начале), TRAILING (в конце) и BOTH (с обеих сторон) указывают, где именно удаляются символы.

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

TRIM([[LEADING | TRAILING | BOTH] [символ] FR0M] строка)

1.5.3.2 Числовые функции Эти функции возвращают числовые значения на основании заданных в ар-

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

ки данных, а также в условиях их поиска. Стандарт SQL предлагает ряд число-

вых функций с очевидной семантикой. Они перечислены в следующей таблице.

 

Функция

Описание

1

ABS(число)

Абсолютное значение

2

MOD(число, делитель)

Остаток от деления

3

LN(число)

Натуральный логарифм

4

EXP(число)

Экспоненциальная функция

5

POWER(число, степень)

Возведение числа в степень

6

SQRT(число)

Квадратный корень

7

FLOOR(число)

Округление до целого числа вниз

8

CEILING(число)

Округление до целого числа вниз

9

ROUND(число, точность)

Округление до указанного количества знаков по-

 

 

сле запятой

1.5.3.3 Временные функции

В данном подпункте рассмотрены некоторые часто-используемые функции

MS ACCESS для работы с временными типами.

 

 

Функция

Описание

 

1

CURDATE

Текущая дата

 

2

MONTH(дата)

Месяц года

 

3

CURTIME

Текущее время

 

4

YEAR(дата)

Год

 

5

HOUR(время)

Час

 

6

DAYOFMONTH(дата)

День месяца

 

7

MINUTE(время)

Минута

 

8

MONTHNAME(дата)

Имя месяца

 

9

DAYOFWEEK(дата)

Номер дня недели

 

10

SECOND(время)

Секунда

 

11

DAYNAME(дата)

Название дня недели

1.5.3.4 Функции преобразования

Стандарт SQL предлагает единственную функцию преобразования данных из одного типа в другой – это функция CAST.

Функция CAST производит преобразование выражения, заданного первым аргументом, в тип, заданный вторым аргументом. Преобразование допускается только для определенных пар типов данных.

CAST(выражение AS тип)

в некоторых СУБД вместо функции используется соответствующее выра-

жение:

CAST выражение AS тип

Запрос. Вывести имя, зарплату как число и зарплату как строку

SELECT Name AS "Фамилия",

Salary AS "Зарплата как число",

CAS(Salary AS varchar(1O)) AS "Зарплата как строка" FROM TEACHER;

1.5.4 Итоги лекции (урока)

Усвоив материал этого урока, студенты научились:

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

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

использовать строковые функции;

использовать числовые функции;

использовать временные функции;

использовать функции преобразования.

1.6 Группировка и сортировка (10)

1.6.1 Аннотация к лекции

В этом уроке мы рассмотрим еще три фразы предложения SELECT, а

именно: HAVING, GROUP BY и ORDER BY. Первая из них позволяет группи-

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

В нашем курсе мы рассмотрим простейшие варианты группировки, дополни-

тельные возможности фразы GROUP BY предлагается вынести на самостоя-

тельное изучение.

Фраза HAVING используется вместе с фразой GROUP BY и позволяет формулировать условия на группах строк для дополнительного отбора.

Фраза ORDER BY позволяет сортировать строки результирующей таблицы.

1.6.2 Запросы с группировкой строк

1.6.2.1 Понятие группировки строк Описанные в предыдущем уроке агрегатные функции применялись ко всей

таблице. Однако часто при создании отчетов появляется необходимость в фор-

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

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

должна располагаться вслед за фразой WHERE (если она отсутствует, то за фразой FROM). Общий синтаксис фразы GROUP BY следующий:

GROUP BY выражение[, выражение] ...

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

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

Рассмотрим возможности фразы GROUP BY, переходя от простых вариан-

тов ее использования к более сложным. 1.6.2.2 Группировка по одному столбцу

Группировка по значениям одного столбца является самым простым вари-

антом использования фразы GROUP BY. Приведем примеры.

Запрос. Для каждого корпуса подсчитать количество находящихся в нем

кафедр.

SELECT Building AS "Корпус",

COUNT(*) AS "К-во кафедр"

FROM DEPARTMENT

GROUP BY Building;

Если в запросе используются фразы и WHERE, и GROUP BY, строки, не удовлетворяющие условию фразы WHERE, исключаются до выполнения груп-

пировки. Вследствие этого группировка производится только по тем строкам,

которые удовлетворяют условию.

Запрос. Для каждого корпуса подсчитать количество аудиторий с количе-

ством мест больше 30.

SELECT Building AS "Корпус",

COUNT(*) AS "K-во аудиторий"

FROM ROOM

WHERE Seats > 30

GROUP BY Building;

В случае многотабличных запросов сначала производится соединение таб-

лиц, а затем их группировка. Приведем примеры.

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

ния их кафедр.

SELECT f.Name AS "Факультет",

SUM(d.Fund) AS "Фонд кафедр"

FROM FACULTY f, DEPARTMENT d

WHERE f.FacPK = d.FacFK

GROUP BY f.Name;

Запрос. Для каждого факультета, расположенного в корпусе 6, вывести количество групп и студентов пятого курса.

SELECT f.Name, Count(*), SUM(Quantity)

FROM FACULTY f, DEPARTMENT d, SGROUP g

WHERE f.FacPK = d.FacFK AND

d.DepPK = g.DepFK AND f.Building = '6' AND Year = 5 GROUP BY f.Name;

1.6.2.3 Группировка по нескольким столбцам

SQL позволяет группировать строки таблицы и по нескольким столбцам. В

этом случае имена столбцов перечисляются во фразе GROUP BY через запятую.

Запрос. Вывести количество лекций, читаемых доцентами по неделям.

SELECT t.Name, l.Week, Count(*)

FROM TEACHER t, LECTURE l

WHERE t.TchPK = l.TchFK AND LOWER(t.Post)= 'доцент' GROUP BY t.Name, l.Week;

Запрос. Для каждой кафедры и должности вывести суммарную и среднюю

зарплату преподавателей.

SELECT d.Name AS "Кафедра", t.Post AS "Должность",

SUM(t.Salary + t.Rise) AS "Сумма зарп.",

ROUND(AVG(t.Salary + t.Rise), 1) AS "Сред, зарп."

FROM DEPARTMENT d, TEACHER t

WHERE d.DepPK = t.DepFK

GROUP BY d.Name, t.Post;

1.6.2.4 Использование выражений

Хотя стандарт SQL не допускает группировку по выражениям над столб-

цами, некоторые СУБД такую возможность предоставляют. В этом случае во

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

Запрос. Для каждого значения зарплаты, не превышающего 800, вывести это значение и количество преподавателей, такую зарплату получающих.

SELECT Salary + Rise. COUNT(*)

FROM TEACHER

WHERE Salary + Rise <= 800

GROUP BY Salary + Rise;

1.6.3 Условие отбора групп

Предположим, что нужно узнать номера корпусов, суммарное количество мест в аудиториях которых превышает 100. Приведенная ниже формулировка запроса является неверной:

SELECT Building

FROM ROOM

WHERE SUM(Seats) > 100

GROUP BY Building;

-------

Ошибка в строке 3:

ORA-00934: групповая функция здесь не разрешена

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

зоваться лишь при наличии фразы GROUP BY. В предложении SELECT фразы

WHERE, GROUP BY и HAVING обрабатываются в следующем порядке.

1.Фразой WHERE отбираются строки, удовлетворяющие указанному в ней условию.

2.Фраза GROUP BY группирует отобранные строки.

3.Фразой HAVING отбираются группы, удовлетворяющие указанному в ней условию.

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

Запрос. Указать корпуса, суммарное количество мест в аудиториях кото-

рых превышает 100.