В предложении SELECT указывается список столбцов, которые должны быть возвра- щены запросом. Можно указать исходные элементы или вычисляемые поля во время выпол- нения запроса.
Конструкция DISTINCT | ALL исключает / разрешает вывод повторяющихся строк.
Конструкция ALL используется по умолчанию.
* означает вывод всех столбцов указанной таблицы. В случае, если выборка произво- дится из нескольких таблиц, перед символом звездочки может указываться имя таблицы.
SQL-запрос может содержать вычисляемые столбцы, значения которых могут опреде- лятся на основе значений данных, хранящихся в БД конструкции. Вычисляемым столбцам следует давать название с помощью ключевого слова AS.
Вычисляемый столбец можно создать как: <Новое поле> = <выражение>
Если название столбца состоит из нескольких слов, разделенных пробелами, следует их записать в квадратных скобках: [].
Сортировка данных выполняется с помощью команды ORDER BY, которая добавля- ется в конец запроса, после чего перечисляется список столбцов. Для каждого столбца указы- вается тип сортировки ASC | DESC (ascending - по возрастанию | descending - по убыванию). ASC - по умолчанию, можно не указывать.
Конструкция TOP <N> позволяет выбрать определенное количество строк из таблицы. Дополнительный оператор PERCENT позволяет выбрать процентное количество строк из таб- лицы. Дополнительный оператор WITH TIES позволяет выбрать все строки с такими же свой- ствами.
Конструкция OFFSET <N> ROWS указывает число строк, которые необходимо пропу- стить, прежде чем будет начат возврат строк из выражения запроса.
Конструкция FETCH NEXT <N> ROWS ONLY указывает число строк, возвращаемых после обработки предложения OFFSET.
На языке T-SQL регистр не имеет значение (case insensitive).
Практическая часть
Дана таблица Академики:
|
ФИО |
Дата_рождения |
Специализация |
Год_присвоения_ звания |
|
|
Аничков Николай Николаевич |
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
FROM
Академики
Пример 2: Вывести ФИО и дату рождения всех академиков: SELECT
ФИО, Дата_рождения
FROM
Академики
Пример 3: Создайте вычисляемое поле «Информация», содержащее информацию об академиках в таком виде: «Академик Петров Петр Петрович, специализация: математика»:
SELECT
'Академик ' + ФИО + ', специализация: ' + Специализация AS Информация
FROM
Академики
Пример 4: Вывести ФИО академиков и номер следующего года после присвоения звания: SELECT
ФИО
,[Через год] = Год_присвоения_звания + 1
FROM
Академики
Пример 5: Выведите список специализаций, убрав дубликаты: SELECT DISTINCT
Специализация
FROM
Академики
Пример 6: Вывести список академиков, отсортированный по возрастанию года присво- ения звания:
SELECT
FROM
Академики
ORDER BY
Год_присвоения_звания
Пример 7: Вывести список академиков, отсортированный в обратном алфавитном по- рядке по полю «Специализация» и в алфавитном порядке по полю «ФИО»:
SELECT
FROM
Академики
ORDER BY
Специализация DESC
,ФИО ASC
Пример 8: Вывести первые две строки из списка академиков, отсортированного в ал- фавитном порядке по полю «ФИО»:
SELECT TOP 2
FROM
Академики
ORDER BY
ФИО ASC
Пример 9: Вывести первые 30% строк из списка академиков, отсортированного по воз- растанию года присвоения звания:
SELECT TOP 30 PERCENT
FROM
Академики
ORDER BY
Год_присвоения_звания
Пример 10: Вывести из таблицы «Академики», отсортированной по возрастанию года присвоения звания, список академиков, у которых год присвоения звания - один из первых четырех в отсортированной таблице:
SELECT TOP 4 WITH TIES
FROM
Академики
ORDER BY
Год_присвоения_звания
Пример 11: Вывести, начиная с третьего, список академиков, отсортированный в алфа- витном порядке ФИО:
SELECT
FROM
Академики
ORDER BY
ФИО
OFFSET 2 ROWS
Пример 12: Вывести, начиная с третьего и до десятого, список академиков, отсортиро- ванный в алфавитном порядке ФИО:
SELECT
FROM
Академики
ORDER BY
ФИО
OFFSET 2 ROWS
FETCH NEXT 8 ROWS ONLY
Задание
Вывести ФИО, специализацию и дату рождения всех академиков.
Создать вычисляемое поле «О присвоении звания», которое содержит информацию об академиках в виде: «Петров Петр Петрович получил звание в 1974».
Вывести ФИО академиков и вычисляемое поле «Через 5 лет после присвоения звания».
Вывести список годов присвоения званий, убрав дубликаты.
Вывести список академиков, отсортированный по убыванию даты рождения.
Вывести список академиков, отсортированный в обратном алфавитном порядке специализаций, по убыванию года присвоения звания, и в алфавитном порядке ФИО.
Вывести первую строку из списка академиков, отсортированного в обратном ал- фавитном порядке ФИО.
Вывести фамилию академика, который раньше всех получил звание.
Вывести первые 10% строк из списка академиков, отсортированного в алфавитном порядке ФИО.
Вывести из таблицы «Академики», отсортированной по возрастанию года присво- ения звания, список академиков, у которых год присвоения звания - один из первых пяти в отсортированной таблице.
Вывести, начиная с десятого, список академиков, отсортированный по возраста- нию даты рождения.
Вывести девятую и десятую строку из списка академиков, отсортированного в ал- фавитном порядке ФИО.
Лабораторная работа 3
Фильтрация данных
Цель работы
Изучение основ фильтрации данных.
Изучение операций сравнения.
Изучение логических операторов.
Изучение BETWEEN.
Изучение LIKE.
Изучение NULL.
Изучение IN.
Теоретическая часть
Для фильтрации данных применяется оператор WHERE. Синтаксис: WHERE <усло- вие>. В условиях поле таблицы сравнивается с константой или с выражением. Символьные константы пишутся в одинарных кавычках. Числовые константы и названия столбцов пишутся без кавычек.
Чтобы строка попала в результат, условие должно быть истинно. В условиях использу- ются операции сравнения. В Transact-SQL применяются следующие операции сравнения:
= - равенство; <> или != - неравенство;
< - меньше; > - больше;
!< - не меньше; !> - не больше;
<= - меньше или равно;
>= - больше или равно.
Можно использовать несколько условий для фильтрации данных. Для объединения их в одно выражение используются логические операторы. В Transact-SQL применяются следу- ющие логические операторы:
AND - логическое умножение или конъюнкция (И). Бинарный оператор, объединяет два условия; если оба условия истинны, результат - истина, иначе - ложь.
OR - логическое сложение или дизъюнкция (ИЛИ). Бинарный оператор, объединяет два условия; если хотя бы одно из этих условий истинно, то общее условие оператора OR также будет истинно.
NOT - логическое отрицание или инверсия (НЕ). Унарный оператор, применяется к одному условию. Если выражение в этой операции ложно, то общее условие истинно.
Самый высокий приоритет у оператора NOT. Самый низкий - у OR. Если эти опера- торы встречаются в одном выражении, то сначала выполняется NOT, потом AND, а затем OR. При записи условий использование скобок - хороший тон программирования.
Оператор BETWEEN используется для сравнения с диапазоном от начального и до ко- нечного значения. Начальное и конечное значения включены в промежуток.
Оператор LIKE используется для сравнения с шаблоном строки. Для определения шаб- лона применяются специальные символы:
% - любая последовательность символов, в том числе пустая;
_ - любой символ;
[ ] - символ, который указан в квадратных скобках; [ - ] - символ из определенного диапазона;
[ ^ ] - символ, который не указан после символа ^.
В базах данных, для обозначения неизвестного значения, используется понятие NULL. Для проверки неизвестного значения нельзя использовать операторы сравнения. Допускается только IS NULL или IS NOT NULL.
Оператор IN используется для сравнения с набором значений. Список значений указы- вается в скобках.
Практическая часть
Дана таблица Страны:
Таблица
|
Название |
Столица |
Площадь |
Население |
Континент |
|
|
Австрия |
Вена |
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 |
Азия |