Главная страница

Практическая работа 1. Проектирование базы данных


Скачать 2.91 Mb.
НазваниеПрактическая работа 1. Проектирование базы данных
Дата17.12.2022
Размер2.91 Mb.
Формат файлаpdf
Имя файлаbazy_dannykh._dlia_prakt_.pdf
ТипПрактическая работа
#849388
страница11 из 19
1   ...   7   8   9   10   11   12   13   14   ...   19
Тема 1. Создание запросов с использованием функций
Функции SQL подобны любым другим операторам языка в том смысле, что они производят действия с данными и возвращают результат в качестве своего значения.
Функции имеют тип, который определяется типом возвращаемого значения, поэтому можно говорить о числовых, строковых, временных функциях и т. д. От обычных операторов функции отличаются форматом представления:
имя_функции[(аргумент[, аргумент]...)]
Этот формат допускает, что функции могут иметь ноль, один или более аргументов, причем при отсутствии аргументов круглые скобки не используются.
Имеется два основных класса функций SQL: встроенные и определяемые пользователем.
Встроенными являются функции, предопределенные в SQL. Ко второму классу относятся функции, которые пишутся пользователями на специальном языке, обеспечивающем использование всех возможностей SQL. Каждая СУБД использует для этого свой собственный язык.
SQL Server содержит множество встроенных функций, а также поддерживает создание определяемых пользователем функций.
В SQL определено множество встроенных функций различных категорий. На этом уроке мы рассмотрим:
–агрегатные (или групповые) функции, оперирующие значениями столбцов множества строк и возвращающие одно значение;
–функции одной строки, использующие в качестве аргументов значения столбцов одной строки и возвращающие одно значение.

131
Встроенные функции (Transact-SQL)
SQL Server содержит множество встроенных функций, а также поддерживает создание определяемых пользователем функций. Категории встроенных функций перечислены на этой странице.
Типы функций
Функция
Описание
Функции, возвращающие наборы строк.
Возвращают объект, который можно использовать так же, как табличные ссылки в SQL-инструкции.
Агрегатные функции
Обрабатывают коллекцию значений и возвращают одно результирующее значение.
Ранжирующие функции
Возвращают ранжирующее значение для каждой строки в секции.
Скалярная функция (описывается далее)
Обрабатывают и возвращают одиночное значение. Скалярные функции можно применять везде, где выражение допустимо.
Скалярные функции
Категория функции
Описание
Функции конфигурации
Возвращают сведения о текущей конфигурации.
Функции преобразования
Поддержка приведения и преобразования типов данных.
Функции работы с курсорами
Возвращают сведения о курсорах.
Функции и типы данных даты и времени
Выполняют операции над исходными значениями даты и времени, возвращают строковые и числовые значения, а также значения даты и времени.
Логические функции
Выполнение логических операций.
Математические функции
Выполняют вычисления, основанные на числовых значениях, переданных функции в виде аргументов, и возвращают числовые значения.
Функции метаданных
Возвращают сведения о базах данных и объектах баз данных.
Функции безопасности
Возвращают данные о пользователях и ролях.
Строковые функции
Выполняют операции со строковым (char или varchar) исходным значением и возвращают строковое или числовое значение.
Системные функции
Выполняют операции над значениями, объектами и параметрами экземпляра SQL Server и возвращают сведения о них.
Системные статистические функции
Возвращают статистические сведения о системе.
Функции обработки текста и изображений
Выполняют операции над текстовыми или графическими исходными значениями или столбцами и возвращают сведения о
Агрегатные функции
Аргументами агрегатных функций могут быть как столбцы таблиц, так и результаты выражений над ними. Агрегатные функции и сами могут включаться в другие арифметические выражения. В стандарте SQL определены следующие виды

132 агрегатных функций: унарные, бинарные, инверсного распределения, гипотетические функции множеств.
Мы будем рассматривать только определенные в стандарте SQL унарные агрегатные функции. Их перечень представлен в табл. 1.1. Конкретные СУБД расширяют этот список.
AVG - среднее
MIN - минимум
CHECKSUM_AGG - Возвращает контрольную сумму значений в группе.
Значения NULL не учитываются.
SUM - сумма
COUNT - количество
STDEV – среднее квадратическое отклонение
COUNT_BIG - Возвращает количество элементов в группе.
STDEVP - Возвращает статистическое стандартное отклонение всех значений в указанном выражении.
GROUPING - Указывает, является ли указанное выражение столбца в списке
GROUP BY статистическим или нет. В результирующем наборе функция GROUPING возвращает 1 (статистическое выражение) или ноль (нестатистическое выражение).
VAR - дисперсия
GROUPING_ID - Представляет собой функцию, которая вычисляет уровень группирования.
VARP - Возвращает статистическую дисперсию для заполнения всех значений в указанном выражении.
MAX - максимум
Общий формат унарной агрегатной функции следующий:
имя_функции([ALL | DISTINCT] выражение) [FILTER (WHERE условие)]
где DISTINCT указывает, что функция должна рассматривать только различные значения аргумента, a ALL — все значения, включая повторяющиеся (этот вариант используется по умолчанию). Фраза FILTER позволяет дополнительно отобрать строки таблицы, столбец которой используется в качестве аргумента функции.
Агрегатные функции применяются во фразах SELECT и HAVING. Здесь мы рассмотрим их использование во фразе SELECT. В этом случае выражение в аргументе функции применяется ко всем строкам входной таблицы фразы SELECT. Кроме того, во фразе SELECT нельзя использовать и агрегатные функции, и столбцы таблицы (или выражения с ними) при отсутствии фразы GROUP BY, которую мы рассмотрим в теме 2.
Функция COUNT
Функция COUNT имеет два формата. В первом случае возвращается количество строк входной таблицы, во втором случае — количество значений аргумента во входной таблице:
C0UNT(*)
C0UNT([DISTINCT | ALL] выражение)
Простейший способ использования этой функции - подсчет количества строк в таблице (всех или удовлетворяющих указанному условию). Для этого используется первый вариант синтаксиса.

133
Создайте новый запрос, введите sql-запрос, выполните его, сохраните его в рабочую папку ЛАБ7_SQL под именем 1.sql.
Запрос 1. Информация о скольких преподавателях имеется в базе данных?
SELECT COUNT(*) AS "К-во преподавателей"
FROM TEACHER;
Чтобы выполнить sql-команду нажмите на панели редактора кнопку Выполнить. В результате выполнения данного кода будет подсчитано кол-во всех преподавателей.
Например,
Самостоятельно создать запрос 2. Сколько ассистентов не имеют телефонов?
Запросы с агрегатными функциями можно строить и с использованием нескольких таблиц, так как входная таблица и в этом случае будет только одна.
Самостоятельно создать запрос 3. Сколько кафедр на факультете математики и информатики?
Во втором варианте синтаксиса функции COUNT в качестве аргумента может быть использовано имя отдельного столбца. В этом случае подсчитывается количество либо всех значений в этом столбце входной таблицы, либо только неповторяющихся (при использовании ключевого слова DISTINCT).
Запрос 4. На скольких различных должностях работают преподаватели
кафедры «Компьютерные системы и сети»?
SELECT C0UNT(DISTINCT DOLGNOST)
FROM KAFEDRA d, TEACHER t
WHERE d.KOD_KAFEDRU = t.KOD_KAFEDRU AND
LOWER(d.NAME_KAFEDRU) = 'Компьютерные системы и сети';
Функция SUM
Эта агрегатная функция подсчитывает сумму значений аргумента для всех строк входной таблицы. Аргумент должен иметь числовой тип или быть временным промежутком. В качестве аргумента может выступать имя столбца или выражение над столбцами входной таблицы. В этой функции также допускается использовать ключевые слова DISTINCT и ALL. Приведем примеры.
Запрос 5. Какая суммарная ставка всех ассистентов?
SELECT SUM(Salary)
FROM TEACHER
WHERE LOWER(DOLGNOST) = 'ассистент';
Функция AVG

134
Агрегатная функция AVG подсчитывает среднее значение аргумента для всех строк входной таблицы. Аргумент должен иметь числовой тип или быть временным промежутком. В качестве аргумента может выступать имя столбца или выражение над столбцами входной таблицы. Допускается использовать ключевые слова DISTINCT и
ALL. Приведем ряд примеров.
Самостоятельно создать запрос 6. Какая средняя ставка среди всех преподавателей?
Самостоятельно создать запрос 7. Какое среднее значение ставки в вузе?
В данном запросе используйте ключевое слово DISTINCT, чтобы применить AVG не ко всем имеющимся в таблице TEACHER ставкам, а только к различным значениям ставки.
Функции MIN и MAX
Эти функции позволяют находить максимальное (МАХ) и минимальное (MIN) значения аргумента для всех строк входной таблицы. Хотя и в этом допускается использование ключевых слов DISTINCT и ALL, они не оказывают влияния на результат. Аргумент этих функций может быть любого типа, для которого определено упорядочение, то есть числовой, строковый и временной.
Запрос 8. Какова максимальная зарплата преподавателя ?
SELECT MAX(Salary + Rise)
FROM TEACHER;
Самостоятельно создать запрос 9. Когда в последний раз (максимальная дата приема на работу) принимали на работу преподавателя на кафедру информатики?
Выражения с использованием агрегатных функций
Агрегатные функции не только могут иметь выражение в своем аргументе, но и сами могут использоваться в выражениях.
Запрос 10. Вывести процентное соотношение суммарной ставки к суммарной
зарплате и наоборот.
SELECT SUM(Salary)*100/SUM(Rise) AS "Процент зарплаты к зарплате",
SUM(Rise)*100/SUM(Salary) AS "Процент зарплаты к ставке"
FROM TEACHER;
Однострочные функции
Напомним, что эти функции используют в качестве аргумента одно значение
(одного столбца одной строки таблицы) и возвращают в качестве своего результата также единственное значение. Мы рассмотрим эти функции по типам их аргументов.
Строковые функции
Эти функции используют в качестве аргумента строку символов и в качестве результата возвращают также символьную строку. Стандарт SQL предлагает варианты таких функций и для двоичных строк.
Функции UPPER, LOWER
Эти функции мы уже рассматривали и многократно использовали. Они имеют следующий формат:
UPPER(cтрокa)

135
LOWER(cтрокa)
Приведем для них примеры .
Запрос 11. Вывести фамилии всех преподавателей прописными буквами.
SELECT UPPER(NAME_TEACHER) AS "Все прописные”
FROM TEACHER;
Аналогично можно вывести все фамилии преподавателей строчными буквами.
Числовые функции над числами
Эти функции возвращают числовые значения на основании заданных в аргументе значений того же типа. Числовые функции используются для обработки данных, а также в условиях их поиска. Стандарт SQL предлагает ряд числовых функций с очевидной семантикой. Часть функций перечислены ниже:
ABS абсолютное значение
DEGREES Возвращает для значения угла в радианах соответствующее значение в градусах.
RAND – Возвращает псевдослучайное значение типа float от 0 до 1.
EXP экспонента
ROUND - Возвращает числовое значение, округленное до указанной длины или точности.
FLOOR
Возвращает наибольшее целое число, меньшее или равное указанному числовому выражению.
LOG логорифм
SIN - синус
LOG10 десятичный логорифм
SQRT – корень квадратный
PI число 3.14
SQUARE – квадрат числа
POWER
Возвращает значение указанного выражения, возведенное в заданную степень.
TAN - тангенс
Особой функцией является WIDTH_BUCKET, с помощью которой можно легко строить гистограммы:
WIDTH_BUCKET(число, миминум, максимум, количество)
Некоторые СУБД расширяют приведенный выше набор функций, включая другие числовые функции, например вычисления обычных и гиперболических тригонометрических функций.
Временные функции
Эти функции используют в качестве аргумента типы даты, времени, временной отметки или временного промежутка. Тип возвращаемого значения не всегда соответствует типу аргумента.
Функции даты и времени в Transact-SQL деляться на
Функции, получающие значения системной даты и времени
Функции, получающие компоненты даты и времени
Функции, получающие значения даты и времени из их компонентов
Функции, получающие разность даты и времени
Функции, изменяющие значения даты и времени

136
Функции, устанавливающие или получающие формат сеанса
Функции, проверяющие значения даты и времени.
Функции, получающие компоненты даты и времени.
Функция извлекает из операнда указанный компонент и возвращает его в виде числа.
DATENAME ( datepart , date )
Здесь date - это выражение временного типа, а datepart - временная единица, которая может иметь одно из следующих значений: YEAR, MONTH, DAY, HOUR,
MINUTE, SECOND и т.д.
DATEPART ( datepart,date ) - Возвращает целое число, представляющее указанный компонентdatepart указанной даты date.
DAY (date) - Возвращает целое число, представляющее день указанной даты date.
MONTH ( date ) - Возвращает целое число, представляющее месяц указанной даты date.
YEAR (date) - Возвращает целое число, представляющее год указанной даты date.
Рассмотрим пример.
Запрос 12. Вывести фамилии всех преподавателей родившихся в 1979 году.
SELECT Name_teacher, BIRTHDAY
FROM TEACHER
WHERE DATENAME(YEAR, BIRTHDAY)=1979;
Функции, получающие значения системной даты и времени
Функция CURRENT_TIMESTAMP - Возвращает значение типа datetime2(7), которое содержит дату и время компьютера, на котором запущен экземпляр SQL Server.
Смещение часового пояса не включается.
Эта функция возвращает текущую дату. Аргументов она не имеет.
Функция GETDATE ( ) Возвращает значение типа datetime2(7), которое содержит дату и время компьютера, на котором запущен экземпляр SQL Server. Смещение часового пояса не включается.
Функция GETUTCDATE ( )
Возвращает значение типа datetime2(7), которое содержит дату и время компьютера, на котором запущен экземпляр SQL Server.
Возвращаемые дата и время отображаются в формате UTC.
Многие СУБД существенно расширяют список функций, оперирующих датой и временем. Далее мы приведем некоторые из важных функций этого типа, которые используются в Oracle. Напоминаем, что тип DATE в Oracle содержит в себе как дату, так и время.
Функции, получающие значения даты и времени из их компонентов
Функция DATEADD (datepart, number , date )
Возвращает новое значение datetime, добавляя интервал к указанной части datepart заданной даты date.
Добавляет к дате, указанной в первом аргументе, количество месяцев второго аргумента.
Dateadd (компонент, кол-во , дата)
Здесь кол-во - это количество прибавляемых лет, месяцев, дней и т.д., а компонент
- временная единица, которая может иметь одно из следующих значений: YEAR,
MONTH, DAY, HOUR, MINUTE, SECOND.

137
Например, DATEADD(month, 1, '2006-08-30')
Запрос 13. Осуществить пересчет даты приема на работу преподавателя на
фамилию начинающуюся на букву C в сторону увеличения на 3 месяца.
SELECT NAME_TEACHER, DATA_HIRE AS ' Дата приема ',
DATEADD(month, 3, DATA_HIRE) AS ' Плюс 3 месяца '
FROM TEACHER
WHERE (NAME_TEACHER) LIKE 'С%';
Функция EOMONTH
EOMONTH (start_date [, month_to_add ])
Возвращает дату последнего дня того месяца, который указан в аргументе. Обычно используется для определения, сколько дней осталось до конца месяца.
LAST_DAY(дата)
Функция DATEDIFF
DATEDIFF ( datepart , startdate , enddate )
Возвращает количество пересеченных границ (целое число со знаком), указанных аргументом datepart, за период времени, указанный аргументами startdate и enddate.
Запрос 14. Например, если вы хотите узнать, сколько месяцев уже проработал
Статывка, можно выполнить такой запрос:
SELECT 'Статывка проработал ' ||
R0uND(DATEDIFF(month,GETDATE(), DATA_HIRE),1) ||
' месяцев' AS "Стаж Статывки"
FROM TEACHER
WHERE NAME_TEACHER LIKE 'Статыв%';
Функция NEXT_DAY
Возвращает ближайшую к первому параметру дату, в которой название дня недели совпадает с указанным во втором параметре.
NEХТ_DАУ(дата, день_недели)
Функции преобразования
Стандарт SQL предлагает единственную функцию преобразования данных из одного типа в другой — это функция CAST.
Функция CAST и CONVERT
Производит преобразование выражения, заданного первым аргументом, в тип, заданный вторым аргументом. Преобразование допускается только для определенных пар типов данных.
CAST ( expression AS data_type [ ( length ) ] )
CONVERT ( data_type [ ( length ) ] , expression [ , style ] )
Например
CAST(10.3496847 AS money)
CAST(10.6496 AS int)

138
Тема 2. Группировка и сортировка
В этом уроке мы рассмотрим еще три фразы предложения SELECT, а именно:
HAVING, GROUP BY и ORDER BY.
Первая из них позволяет группировать строки таблицы и применять к созданным группам агрегатные функции.
Рассмотрим простейшие варианты группировки. Фраза HAVING используется вместе с фразой GROUP BY и позволяет формулировать условия на группах строк для дополнительного отбора.
Наконец, фраза ORDER BY позволяет сортировать строки результирующей таблицы.
Запросы с группировкой строк
Часто при создании отчетов появляется необходимость в формировании промежуточных итоговых значений, то есть относящихся к данным не всей таблицы, а ее частей.
Именно для этого предназначена фраза GROUP BY. Она позволяет все множество строк таблицы разделить на группы по признаку равенства значений одного или нескольких столбцов (и выражений над ними).
Фраза GROUP BY должна располагаться вслед за фразой WHERE (если она отсутствует, то за фразой FROM).
Общий синтаксис фразы GROUP BY следующий:
GROUP BY выражение[, выражение]...
При наличии фразы GROUP BY фраза SELECT применяется к каждой группе, сформированной фразой группировки. В этом случае и действие агрегатных функций, указанных во фразе SELECT, будет распространяться не на всю результирующую таблицу, а только на строки в пределах каждой группы. Каждое выражение в списке фразы SELECT должно принимать единственное значение для группы, то есть оно может быть:
– константой;
– агрегатной функцией, которая оперирует всеми значениями аргумента в пределах группы и агрегирует их в одно значение (например, в сумму);
– выражением, идентичным стоящему во фразе GROUP BY;
– выражением, объединяющим приведенные выше варианты.
Рассмотрим возможности фразы GROUP BY, переходя от простых вариантов ее использования к более сложным.
Группировка по одному столбцу
Группировка по значениям одного столбца является самым простым вариантом использования фразы GROUP BY. Приведем примеры.
Запрос 15. Для каждого корпуса подсчитать количество находящихся в нем
кафедр.
SELECT NUM_KORPUSA AS “Корпус”,
СOUNT(*) AS "K-вo кафедр"
FROM KAFEDRA
GROUP BY NUM_KORPUSA ;
Самостоятельно создать запрос 16. Для каждой из должностей указать суммарный фонд заработной платы.

139
Если в запросе используются фразы и WHERE, и GROUP BY, строки, не удовлетворяющие условию фразы WHERE, исключаются до выполнения группировки.
Вследствие этого группировка производится только по тем строкам, которые удовлетворяют условию.
В случае многотабличных запросов сначала производится соединение таблиц, а затем их группировка. Приведем примеры.
Самостоятельно создать запрос 17. Для каждого факультета, расположенного в корпусе 1, вывести количество групп и общее количество студентов по каждой кафедре.
Группировка по нескольким столбцам
SQL позволяет группировать строки таблицы и по нескольким столбцам. В этом случае имена столбцов перечисляются во фразе GROUP BY через запятую.
Запрос 18. Для каждого факультета, расположенного в корпусе 1, вывести
сколько учится студентов по каждой группе.
SELECT f.Name_faculteta,
s."GROUP", count(s."GROUP") AS "Кол-во студентов в группе"
FROM FACULTET f, KAFEDRA d, STUDENT s
WHERE f.KOD_FACULTETA = d.KOD_FACULTETA AND
d.KOD_kafedru = s.KOD_kafedru AND
d.NUM_KORPUSA = '1'
GROUP BY f.Name_faculteta,s."GROUP";
Самостоятельно создать запрос 19. Для каждой кафедры и должности вывести суммарную и среднюю зарплату преподавателей.
Даже при группировке по двум и более столбцам этот вариант фразы GROUP BY обеспечивает только один уровень группировки. Так, приведенный выше запрос обеспечивает только одну итоговую строку для пары значений кафедра-должность.
Использование выражений
Хотя стандарт SQL не допускает группировку по выражениям над столбцами, некоторые СУБД такую возможность предоставляют. В этом случае во фразе SELECT также можно использовать выражение группировки, однако нельзя выводить по отдельности столбцы, участвующие в этом выражении.
Запрос 20. Для каждого значения зарплаты, не превышающего 1500, вывести это значение и количество преподавателей, такую зарплату получающих.
SELECT Salary + Rise, C0UNT(*)
FROM TEACHER
WHERE Salary + Rise <= 1500
GROUP BY Salary + Rise;
Вложение агрегатных функций
Если фраза GROUP BY в запросе отсутствует, то во фразе SELECT нельзя вкладывать агрегатные функции друг в друга. Например, следующий запрос приведет к ошибке:
SELECT AVG(MIN(Salary))
FROM TEACHER;
- - - - - - - - - - - - - - - - - - - - - - - - - - - - -

140
ORA-00978: вложенная групповая функция без GROUP BY
Однако при наличии фразы GROUP BY такое вложение допускается. Оно интерпретируется следующим образом: сначала для каждой группы выполняется вложенная агрегатная функция, затем к полученной таким образом промежуточной таблице применяется внешняя агрегатная функция. Двойное вложение, например
MAX(AVG(MIN(Salary))), недопустимо. Приведем пример.
Запрос 21. Вывести среднее значение среди минимальных и максимальных ставок для каждой группы преподавателей, занимающих одну должность, а также минимальное и максимальное значения среди средних ставок.
SELECT AVG(MIN(Salary)) AS AVG_MIN,
AVG(MAX(Salary)) AS AVG_MAX,
MIN(AVG(Salary)) AS MIN_AVG,
MAX(AVG(Salary)) AS MAX_AVG
FROM TEACHER
GROUP BY Dolgnost ;
Условие отбора групп
Предположим, что нужно вывести номера кафедр, у которых суммарное количество работающих профессоров более 1. Приведенная ниже формулировка запроса является неверной:
SELECT KOD_kafedru
FROM TEACHER
WHERE count(dolgnost) > 1 and dolgnost=’профессор’
GROUP BY KOD_kafedru;
- - - - - - - - - - - - - - - - - - - - - - - - - - - - -
WHERE count(dolgnost) > 3 and dolgnost=’профессор’;
*
Ошибка в строке 3;
CRA-00934: групповая функция здесь не разрешена
Дело в том, что фраза WHERE проверяет на соответствие условию строки исходных таблиц, а мы указали в ней агрегатную функцию. Для отбора строк среди полученных групп следует применять фразу HAVING. Она играет такую же роль для групп, что и фраза WHERE для исходных таблиц, и может использоваться лишь при наличии фразы GROUP BY. В предложении SELECT фразы WHERE, GROUP BY и
HAVING обрабатываются в следующем порядке.
Фразой WHERE отбираются строки, удовлетворяющие указанному в ней условию.
Фраза GROUP BY группирует отобранные строки.
Фразой HAVING отбираются группы, удовлетворяющие указанному в ней условию. В связи с вышесказанным, предыдущий запрос необходимо записать так.
Перепишем тогда запрос так:
Запрос 22. Вывести номера кафедр, у которых суммарное количество работающих профессоров более 1.
SELECT KOD_kafedru as "Номер кафедры" ,Count(*) as "Кол-во профессоров
на кафедре"
FROM TEACHER
WHERE dolgnost='профессор'
GROUP BY KOD_kafedru
having count(dolgnost) > 1 ;

141
Использование столбцов группировки во фразе HAVING
Рассмотрим использование во фразе HAVING условий отбора, заданных для группируемых столбцов (или выражений над ними). Для этого усложним предыдущий запрос.
Запрос 23. Вывести названия кафедр факультета математики и информатики, на которых работают один и более профессоров. Указать также количество профессоров и их суммарную зарплату.
SELECT d.Name_kafedru, Count(*), SUM(t.salary + t.Rise)
FROM FACULTET f, KAFEDRA d, TEACHER t
WHERE f.KOD_FACULTETA = d.KOD_FACULTETA AND
d.KOD_kafedru = t.KOD_kafedru AND
LOWER(f.Name_faculteta) = 'математики и информатики' AND
LOWER(t.Dolgnost ) = 'профессор'
GROUP BY d.Name_kafedru
HAVING COUNT(*) > 0;
Фраза HAVING без фразы GROUP BY
Выше мы указали, что фраза HAVING может использоваться лишь при наличии фразы GROUP BY. Из этого правила синтаксис SQL допускает только одно исключение: когда вся таблица интерпретируется как одна группа. В этом случае в списке фразы
SELECT можно использовать только константы, агрегатные функции и выражения над ними. Приведем примеры.
Запрос 24. Если суммарная зарплата всех преподавателей превышает 15 000, вывести их минимальную ставку, максимальную надбавку и суммарную зарплату.
SELECT MIN(Salary), MAX(Rise), SUM(Salary + Rise)
FROM TEACHER
HAVING SUM(Salary + Rise) > 15000;
При наличии фразы WHERE сначала производится отбор строк согласно ее условию, и только после этого применяется условие фразы HAVING.
Запрос 25. Если суммарная зарплата всех ассистентов превышает 2500, вывести их среднюю ставку, среднюю надбавку и суммарную зарплату.
SELECT AVG(Salary), AVG(Rise), SUM(Salary + Rise)
FROM TEACHER
WHERE LOWER(Dolgnost ) = 'ассистент'
HAVING SUM(Salary + Rise) > 2500;
На практике фраза HAVING очень редко используется без фразы GROUP BY, из- за чего такая возможность предоставляется не во всех СУБД.
Сортировка результирующих строк
Как мы уже отмечали, строки в таблицах базы данных неупорядочены. Также неупорядочены и строки результирующей таблицы запроса, однако для их упорядочения в предложении SELECT можно воспользоваться фразой ORDER BY. Она сортирует по значению указанных в ней столбцов (и выражений над столбцами) строки результирующей таблицы запроса. Синтаксис этой фразы следующий:
ORDER BY спецификация_сортировки[. спецификация_сортировки]...
где спецификация_сортировки имеет такой синтаксис:

142
выражение_сортировки [направление_сортировки] [положение_NULL]
Сортировать можно по столбцам (выражениям) тех типов, для которых определены операции сравнения. Это относится, в частности, к символьным строкам, числам и временным значениям. Можно указывать направление сортировки и место расположения строк, имеющих значение NULL для выражений сортировки.
Далее в этом уроке мы рассмотрим общие способы упорядочения результирующих строк.
Сортировка по столбцу или выражению
Сортировать строки результирующей таблицы запроса можно по отдельным столбцам, совокупности столбцов, а также по одному или нескольким выражениям над столбцами. Ниже рассматриваются все эти варианты.
Сортировка по столбцу
Простейший вариант сортировки - это сортировка по одному из столбцов результирующей таблицы.
Запрос 26. Вывести алфавитный список фамилий профессоров и доцентов.
SELECT NAME_TEACHER
FROM TEACHER
wheRE LOwER(Dolgnost ) =’профессор’ OR
LOWER(Dolgnost ) = 'доцент'
ORDER BY NAME_TEACHER;
Сортировка по выражению над столбцами
Упорядочивать строки можно не только по значению столбца, но и по значению выражения над столбцами.
Запрос 27. Вывести фамилии ассистентов и их зарплату по ее возрастанию.
SELECT Name_teacher, Salary + Rise
FROM TEACHER
WHERE LOWER(Dolgnost ) = 'асcистент’
ORDER BY Salary + Rise;
Направление сортировки
Во всех до сих пор приводимых примерах сортировка производилась в порядке возрастания значений. В SQL такой порядок определен по умолчанию. Однако есть возможность и явно указать направление сортировки с помощью ключевых слов ASC (по возрастанию) и DESC (по убыванию), которые следует располагать после имени сортируемого столбца (выражается).
Запрос 28. Вывести фамилии ассистентов и дату их приема на работу по возрастанию даты.
SELECT Name_teacher, Data_hire
FROM TEACHER
WHERE LOWER(Dolgnost) = 'ассистент'
ORDER BY Data_hire ASC;
Самостоятельно создать запрос 29. Вывести фамилии доцентов в обратном алфавитном порядке и их зарплату.

143
TP PT
1   ...   7   8   9   10   11   12   13   14   ...   19


написать администратору сайта