Список часто используемых функций проверки значений:
|
ISDATE(выражение) |
возвращает 1, если выражение имеет допустимое значение типа даты и времени, иначе возвращает значение 0 |
|
|
ISNUMERIC(выражение) |
возвращает 1, если выражение имеет допустимое значение числовой тип данных, иначе возвращает 0 |
|
|
ISNULL(выражение, замена) |
заменяет значение NULL указанным замещающим значением |
|
|
COALESCE(выражение[,...n ]) |
вычисляет аргументы по порядку и возвращает текущее зна- чение первого выражения, изначально не вычисленного как NULL. |
Особое место среди встроенных скалярных функций языка SQL занимают функции вы- вода, которые являются разновидностью CASE-выражений. Функция CASE проверяет значе- ние некоторого выражения, и в зависимости от результата проверки может возвращать тот или иной результат.
Выражение CASE имеет два формата:
простое выражение CASE для определения результата сравнивает выражение с набо- ром простых выражений;
поисковое выражение CASE для определения результата вычисляет набор логических выражений.
Оба формата поддерживают дополнительный аргумент ELSE.
Функция IIF(условие, выражение_если_истина, выражение_если_ложь) - возвращает одно из двух значений в зависимости от того, принимает логическое выражение значение true или false.
Практическая часть
Дана таблица Академики:
|
ФИО |
Дата_рождения |
Специализация |
Год_присвое- ния_звания |
|
|
Аничков Николай Николаевич |
1885-11-03 |
медицина |
1939 |
|
|
Бартольд Василий Владимирович |
1869-11-15 |
историк |
1913 |
|
|
Белопольский Аристарх Аполлонович |
1854-07-13 |
астрофизик |
1903 |
|
|
Бородин Иван Парфеньевич |
1847-01-30 |
ботаник |
1902 |
|
|
Вальден Павел Иванович |
1863-07-26 |
химик-технолог |
1910 |
|
|
Вернадский Владимир Иванович |
1863-03-12 |
геохимик |
1908 |
|
|
Виноградов Павел Гаврилович |
1854-11-30 |
историк |
1914 |
|
|
Ипатьев Владимир Николаевич |
1867-11-21 |
химик |
1916 |
|
|
Истрин Василий Михайлович |
1865-02-22 |
филолог |
1907 |
|
|
Карпинский Александр Петрович |
1847-01-07 |
геолог |
1889 |
|
|
Коковцов Павел Константинович |
1861-07-01 |
историк |
1906 |
|
|
Курнаков Николай Семёнович |
1860-12-06 |
химик |
1913 |
|
|
Марр Николай Яковлевич |
1865-01-06 |
лингвист |
1912 |
|
|
Насонов Николай Викторович |
1855-02-26 |
зоолог |
1906 |
|
|
Ольденбург Сергей Фёдорович |
1863-09-26 |
историк |
1903 |
|
|
Павлов Иван Петрович |
1849-09-26 |
физиолог |
1907 |
|
|
Перетц Владимир Николаевич |
1870-01-31 |
филолог |
1914 |
|
|
Соболевский Алексей Иванович |
1857-01-07 |
лингвист |
1900 |
|
|
Стеклов Владимир Андреевич |
1864-01-09 |
математик |
1912 |
Пример 1: Вывести ФИО академиков и длину ФИО: SELECT
ФИО
,LEN(ФИО) AS Количество_символов
FROM
Академики
Пример 2: Вывести список академиков, убрать лишние пробелы в ФИО: SELECT
TRIM(ФИО) AS ФИО
,Дата_рождения
,Специализация
,Год_присвоения_звания
FROM
Академики
Пример 3: Найти позиции буквы «о» в ФИО каждого академика. Вывести ФИО и по- зицию:
SELECT
ФИО
,CHARINDEX('о',ФИО) AS Позиция_о
FROM
Академики
Пример 4: Вывести ФИО и первые три буквы специализации каждого академика: SELECT
ФИО
,LEFT(Специализация, 3) AS Спец_3
FROM
Академики
Пример 5: Вывести ФИО и от второй до пятой буквы специализации каждого академика:
SELECT
ФИО
,SUBSTRING(Специализация, 2, 4) AS Спец_2_5
FROM
Академики
Пример 6: Вывести список академиков, заменить специализацию «лингвист» на «язы- ковед»:
SELECT
ФИО
,Дата_рождения
,REPLACE(Специализация, 'лингвист', 'языковед') AS Спец
,Год_присвоения_звания
FROM
Академики
Пример 7: Вывести список академиков, специализацию на верхнем регистре: SELECT
ФИО
,Дата_рождения
,UPPER(Специализация) AS Спец
,Год_присвоения_звания
FROM
Академики
Пример 8: Вывести ФИО академиков в правильном и обратном виде: SELECT
ФИО
,REVERSE(ФИО) AS ФИО_Обр
FROM
Академики Название
Пример 9: Вывести каждую специализацию 4 раза в одной строке. Убрать дубликаты: SELECT DISTINCT
REPLICATE(Специализация, 4) AS Спец_4
FROM
Академики
Пример 10: Вывести абсолютное значение тригонометрических функций на точке р: SELECT
ABS(COS(PI())) AS Косинус_Пи
,ABS(SIN(PI())) AS Синус_Пи
,ABS(TAN(PI())) AS Тангенс_Пи
,ABS(COT(PI())) AS КоТангенс_Пи
Пример 11: Вывести число 132.456, округленное с точностью от 3 до -3: SELECT
ROUND(123.456, 3) AS Окр3
,ROUND(123.456, 2) AS Окр2
,ROUND(123.456, 1) AS Окр1
,ROUND(123.456, 0) AS Окр0
,ROUND(123.456, -1) AS Окр_1
,ROUND(123.456, -2) AS Окр_2
,ROUND(123.456, -3) AS Окр_3
Пример 12: Вывести наименьшее целое число, которое больше или равно 123.456, и наибольшее целое число, которое меньше или равно 123.456:
SELECT
CEILING(123.456) AS Больше
,FLOOR(123.456) AS Меньше
Пример 13: Вывести квадратный корень, квадрат и куб числа 25: SELECT
SQRT(25) AS Корень
,SQUARE(25) AS Квадрат
,POWER(25, 3) AS Куб
Пример 14: Вывести текущую дату и время:
SELECT
GETDATE() AS Сейчас
Пример 15: Вывести день, месяц, год, час, минуту, секунду, номер квартала, номер не- дели, день года, день недели для текущей даты и времени:
SELECT
DAY(GETDATE()) AS День
,MONTH(GETDATE()) AS Месяц
,YEAR(GETDATE()) AS Год
,DATEPART(HOUR, GETDATE()) AS Час
,DATEPART(MINUTE, GETDATE()) AS Минута
,DATEPART(SECOND, GETDATE()) AS Секунда
,DATEPART(QUARTER, GETDATE()) AS Квартал
,DATEPART(WEEK, GETDATE()) AS Неделя
,DATEPART(DAYOFYEAR, GETDATE()) AS День_года
,DATEPART(WEEKDAY, GETDATE()) AS День_недели
Пример 16: Вывести дату 100 дней назад от текущей:
SELECT
DATEADD(DAY, -100, GETDATE()) AS День_100_Назад
Пример 17: Академик Игорь Евгеньевич Тамм родился 8 июля 1895 года. И.Е. Тамм скончался 12 апреля 1971 года. Вывести количество прожитых дней:
SELECT
DATEDIFF(DAY, '18950708', '19710412') AS Количество_прожитых_дней
Пример 18: Вывести ФИО и время года рождения каждого академика: SELECT
ФИО
, CASE MONTH(Дата_рождения) WHEN 3 THEN 'Весна' WHEN 4 THEN 'Весна' WHEN 5 THEN 'Весна' WHEN 6 THEN 'Лето' WHEN 7 THEN 'Лето' WHEN 8 THEN 'Лето' WHEN 9 THEN 'Осень' WHEN 10 THEN 'Осень' WHEN 11 THEN 'Осень' ELSE 'Зима'
END AS Времени_года FROM Академики
Пример 19: Вывести ФИО, дату рождения и знак зодиака каждого академика: SELECT
ФИО
, Дата_рождения
, CASE
WHEN (MONTH(Дата_рождения)=3 AND DAY(Дата_рождения) >= 21) OR (MONTH(Дата_рождения)=4 AND DAY(Дата_рождения) <= 20) THEN 'Овен'
WHEN (MONTH(Дата_рождения)=4 AND DAY(Дата_рождения) >= 21) OR (MONTH(Дата_рождения)=5 AND DAY(Дата_рождения) <= 21) THEN 'Телец'
WHEN (MONTH(Дата_рождения)=5 AND DAY(Дата_рождения) >= 22) OR (MONTH(Дата_рождения)=6 AND DAY(Дата_рождения) <= 21) THEN 'Близнецы'
WHEN (MONTH(Дата_рождения)=6 AND DAY(Дата_рождения) >= 22) OR (MONTH(Дата_рождения)=7 AND DAY(Дата_рождения) <= 22) THEN 'Рак'
WHEN (MONTH(Дата_рождения)=7 AND DAY(Дата_рождения) >= 23) OR (MONTH(Дата_рождения)=8 AND DAY(Дата_рождения) <= 21) THEN 'Лев'
WHEN (MONTH(Дата_рождения)=8 AND DAY(Дата_рождения) >= 22) OR (MONTH(Дата_рождения)=9 AND DAY(Дата_рождения) <= 23) THEN 'Дева'
WHEN (MONTH(Дата_рождения)=9 AND DAY(Дата_рождения) >= 24) OR (MONTH(Дата_рождения)=10 AND DAY(Дата_рождения) <= 23) THEN 'Весы'
WHEN (MONTH(Дата_рождения)=10 AND DAY(Дата_рождения) >= 24) OR (MONTH(Дата_рождения)=11 AND DAY(Дата_рождения) <= 22) THEN 'Скорпион'
WHEN (MONTH(Дата_рождения)=11 AND DAY(Дата_рождения) >= 23) OR (MONTH(Дата_рождения)=12 AND DAY(Дата_рождения) <= 22) THEN 'Стрелец'
WHEN (MONTH(Дата_рождения)=12 AND DAY(Дата_рождения) >= 23) OR (MONTH(Дата_рождения)=1 AND DAY(Дата_рождения) <= 20) THEN 'Козерог'
WHEN (MONTH(Дата_рождения)=1 AND DAY(Дата_рождения) >= 21) OR (MONTH(Дата_рождения)=2 AND DAY(Дата_рождения) <= 19) THEN 'Водолей'
WHEN (MONTH(Дата_рождения)=2 AND DAY(Дата_рождения) >= 20) OR (MONTH(Дата_рождения)=3 AND DAY(Дата_рождения) <= 20) THEN 'Рыбы'
END AS Знак_зодиака FROM Академики
Пример 20: Вывести список академиков. Для каждого академика, в зависимости от воз- раста, при присвоении звания вывести «молодой» или «старый» в дополнительном столбце:
SELECT
ФИО
,Дата_рождения
,Специализация
,Год_присвоения_звания
,IIF(Год_присвоения_звания - Year(Дата_рождения) <= 45, 'Молодой','Старый') AS Возраст_при_присвоении
FROM Академики
Задание
Вывести список академиков, отсортированный по количеству символов в ФИО.
Вывести список академиков, убрать лишние пробелы в ФИО.
Найти позиции «ов» в ФИО каждого академика. Вывести ФИО и номер позиции.
Вывести ФИО и последние две буквы специализации для каждого академика.
Вывести список академиков, ФИО в формате Фамилия и Инициалы.
Вывести список специализаций в правильном и обратном виде. Убрать дубликаты.
Вывести свою фамилию в одной строке столько раз, сколько вам лет.
Вывести абсолютное значение функций ??????2 (??) ? ?????? (3??) с точностью два знака 2 2 после десятичной запятой.
Вывести количество дней до конца семестра.
Вывести количество месяцев от вашего рождения.
Вывести ФИО и високосность года рождения каждого академика.
Вывести список специализаций без повторений. Для каждой специализации выве- сти «длинный» или «короткий», в зависимости от количества символов.
Лабораторная работа 5
Агрегатные функции
Цель работы
Изучить основы агрегации данных.
Изучить функцию MAX.
Изучить функцию MIN.
Изучить функцию SUM.
Изучить функцию AVG.
Изучить функцию COUNT.
Изучить группировки данных.
Изучить применение фильтрации в группировке данных.
Теоретическая часть
Агрегатные функции используются для получения обобщающих значений. Они, в от- личие от скалярных функций, оперируют значениями столбцов множества строк. К агрегат- ным функциям относятся:
SUM - вычисляет итог;
MAX - возвращает наибольшее значение;
MIN - возвращает наименьшее значение;
AVG - вычисляет среднее значение;
COUNT - вычисляет количество значений в столбце.
Аргументами функций выступают поля таблицы или результаты выражений над ними.
Вложенность не допускается.
Из агрегатных функций можно составлять любые выражения.
Для функций SUM и AVG столбец должен содержать числовые значения.
Для функций COUNT() можно указать аргумент * для подсчета всех строк без исключения.
По умолчанию вышеперечисленные пять функций учитывают все строки выборки для
вычисления результата. Но выборка может содержать повторяющиеся значения. Если необхо- димо выполнить вычисления только над уникальными значениями, исключив из набора зна- чений повторяющиеся данные, то для этого применяется оператор DISTINCT (кроме COUNT (*)). По умолчанию вместо DISTINCT применяется оператор ALL, который выбирает все строки. Так как этот оператор неявно подразумевается при отсутствии DISTINCT, то его можно не указывать.
Агрегатные функции можно применить не только на всю таблицу, но также на группу значений. Для этого применяется команда GROUP BY, которая пишется после WHERE. После команды GROUP BY перечисляется название столбцов, по которым следует группировать данные. Предложение GROUP BY указывает, что результаты запроса следует разделить на группы, применить агрегатную функцию по отдельности к каждой группе и получить для каж- дой группы одну строку результатов.
В качестве элемента группировки должен выступать любой возвращаемый элемент, указанный в предложении SELECT, кроме значений агрегатных функций.
Если столбец, по которому производится группировка, содержит значение NULL, то строки со значением NULL составят отдельную группу.
Команда HAVING <условие> применяется для фильтрации строк, возвращаемых при использовании предложения GROUP BY. HAVING пишется после GROUP BY, имеет такой формат, как WHERE, но в качестве значения используется значение, возвращаемое агрегат- ными функциями.
Практическая часть
Дана таблица Страны:
|
Название |
Столица |
Площадь |
Население |
Континент |
|
|
Австрия |
Вена |
83858 |
8741753 |
Европа |
|
|
Азербайджан |
Баку |
86600 |
9705600 |
Азия |
|
|
Албания |
Тирана |
28748 |
2866026 |
Европа |
|
|
Алжир |
Алжир |
2381740 |
39813722 |
Африка |
|
|
Ангола |
Луанда |
1246700 |
25831000 |
Африка |
|
|
Аргентина |
Буэнос-Айрес |
2766890 |
43847000 |
Южная Америка |
|
|
Афганистан |
Кабул |
647500 |
29822848 |
Азия |
|
|
Бангладеш |
Дакка |
144000 |
160221000 |
Азия |
|
|
Бахрейн |
Манама |
701 |
1397000 |
Азия |
|
|
Белиз |
Бельмопан |
22966 |
377968 |
Северная Америка |
|
|
Белоруссия |
Минск |
207595 |
9498400 |
Европа |
|
|
Бельгия |
Брюссель |
30528 |
11250585 |
Европа |
|
|
Бенин |
Порто-Ново |
112620 |
11167000 |
Африка |
|
|
Болгария |
София |
110910 |
7153784 |
Европа |
|
|
Боливия |
Сукре |
1098580 |
10985059 |
Южная Америка |
|
|
Ботсвана |
Габороне |
600370 |
2209208 |
Африка |
|
|
Бразилия |
Бразилиа |
8511965 |
206081432 |
Южная Америка |
|
|
Буркина-Фасо |
Уагадугу |
274200 |
19034397 |
Африка |
|
|
Бутан |
Тхимпху |
47000 |
784000 |
Азия |
|
|
Великобритания |
Лондон |
244820 |
65341183 |
Европа |
|
|
Венгрия |
Будапешт |
93030 |
9830485 |
Европа |
|
|
Название |
Столица |
Площадь |
Население |
Континент |
|
|
Венесуэла |
Каракас |
912050 |
31028637 |
Южная Америка |
|
|
Восточный Тимор |
Дили |
14874 |
1167242 |
Азия |
|
|
Вьетнам |
Ханой |
329560 |
91713300 |
Азия |