Условие выборки указывается во фразах where и having.

 

В условие выборки включается следующее:

1) Операции сравнения: =, <, >, ! =, < >, >=, <=, !>, !<.

2) Диапазоны (between и not between).

3) Списки (in, not in).

4) Символы сравнения (like, not like).

5) Неопределенные значения (is null, is not null).

6) Комбинации из логических операторов: and, or, not.

7) Условия соединения таблиц.

8) Подзапросы.

 

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

where <выражение1> <операция сравнения> <выражение2>

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

select * from titleauthor where royaltyper < 50

 

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

<выражение1> [not] between <выражение2> and <выражение3>

Условие считается выполненным, если <выражение1> равно или больше, чем <выражение2> и равно или меньше, чем <выражение3>. Если используется опция not, то условие считается выполненным, если <выражение1> меньше <выражения2> или больше <выражения3>. Например:

select title_id, total_sales from titles where total_sales between 4095 and 12000

 

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

<выражение> [not] in (<список значений>)

Условие удовлетворяется, если <выражение> равно одному из значений, указанных в <списке значений>. Если используется опция not, то не равно ни одному из значений из <списка>. Например:

select au_name, state from authors where state in (‘CA’, ‘IN’, ‘MD’)

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

 

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

<имя колонки> [not] like <символьная строка>

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

1) символ “%” - представляет любую строку, состоящую из 0 или более символов;

2) символ “_” (подчеркивания) - представляет любой одиночный символ;

3) [<описатель>] - определяет диапазон или множество символов, в которые должен входить одиночный символ;

4) [^<описатель>] - определяет диапазон или множество символов, в которые не должен входить одиночный символ.

То есть <описатель> задается двумя способами:

а) в виде диапазона: r1-r2, например: [a-f]

б) в виде множества: r1r2…, например: [abcdef]

Условие not like является истинным, если ложно соответствующее условие like.

Примеры:

1) like ‘M%’ - строка начинается на М;

2) like ‘%er’ - строка заканчивается на er;

3) like ‘%en%’ - строка имеет подстроку en в любом месте;

4) like ‘___ryl’ - строка имеет в длину 6 символов и заканчивается на ryl;

5) like ‘[CK]ars[eo]n’ - строка имеет в длину 6 символов, начинается либо с С, либо с K, а пятый символ - либо e, либо o;

6) like ‘[M-Z]ing’ - 4хсимвольная строка, заканчивается на ing, а начинается с буквы, принадлежащей диапазону от M до Z;

7) like ‘M[^C]%’ - строка начинается на M, а в качестве второй буквы (цифры) берется любой символ, отличный от C.

 

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

<имя колонки> is [not] null

 

В структуре where отдельные условия могут соединяться логическими операторами and, or и not. Операция and(и) используется для определения двух и более условий, которые одновременно удовлетворяются в отбираемых строках, например:

select * from quotations where qonorder > 0 and suppno = 54

Оператор or(или) используется для определения двух и более условий, которое обеспечивает отбор строк, удовлетворяющих по крайней мере одному из этих условий, например:

select * from authors where au_fname = ‘Anne’ or au_fname = ‘Ann’

Оператор not используется для определения отрицания условия, например:

select * from authors where not state = ‘CA’

Для группирования условий могут быть использованы скобки, например:

select * from quotations where suppno = 61 and (purtno = 221 or purtno = 222)

 

Структура group by определяет группы совпадающих значений в указанных колонках. Максимальное количество колонок (выражений) равно 16. В ответе на запрос возвращается только одна результирующая строка для каждой группы. Почти всегда в структуре group by используются агрегатные функции. Например, функция count(*) оценивает количество строк в группе. Если какие-либо строки в группируемой колонке содержат null значения, то каждая такая строка рассматривается как принадлежащая отдельной группе, содержащей одну строку.

Пример:

select nazvanie_goroda from vuz_gorod where cod_stran = ‘01’ group by nazvanie_goroda

 

Структура having определяет одно или более условий, накладываемых на группы, т. е. заставляет СУБД возвращать результат только для тех групп, которые удовлетворяют заданному <условию поиска>. Having - это то же самое для структуры group by, что и where для структуры select.

Пример:

select nomer from poss group by nomer having count(*) > 1

 

Сортировка значений полей по возрастанию или убыванию осуществляется с помощью структуры order by, в которой перечисляются через запятую либо названия колонок, либо номера этих колонок в списке полей SELECT. Опция asc определяет сортировку по возрастанию, а опция desc - по убыванию. Если опция не определена, то предполагается упорядочение по возрастанию.

Пример:

select cod_vuza,nazvanie_vuza from vuz_gorod where cod_stran = ‘01’ order by 1

 

Структура compute используется с агрегатными функциями для получения в отчетах дополнительных записей, содержащих итоговые значения по каждой группе значений полей. С помощью структур compute можно подсчитать итоговые значения и для подгрупп, а также можно задавать несколько структур compute для одной группы. В структуре compute используются следующие агрегатные функции: sum, avg, min, max, count (sum и avg используются только для числовых колонок). Элемент данных, следующий за одной из этих функций, должен быть заключен в круглые скобки.

 

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

 

Функция avg вычисляет среднее среди отобранных значений элемента. Эта функция предназначена только для числовых колонок и может быть использована с ключевым словом distinct. При вычислении среднего null значения игнорируются.

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

Функция max находит наибольшее среди отобранных значений элемента. Эта функция может быть применена к колонке любого типа и null значения игнорируются.

Функция min находит наименьшее среди отобранных значений элемента и также может быть применена к колонке любого типа, null значения игнорируются.

Функция count используется одним из двух способов:

n count(distinct <имя колонки>) возвращает число, равное количеству отличных друг от друга строк, удовлетворяющих условию поиска;

n count(*) возвращает число, равное количеству строк, удовлетворяющих условию поиска.

 

Правила использования структуры compute:

 

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

2) поля в структуре compute должны обязательно присутствовать в списке выборки;

3) в операторе select, использующего compute, нельзя применять структуру into;

4) при использовании compute by обязательно присутствие структуры order by, при этом список полей в compute by либо идентичен списку полей в order by, либо является его подмножеством с сохранением следования полей слева направо, начинающегося с одного и того же выражения и без пропусков каких-либо выражений.

Пример: если указывается order by a, b, c , то можно использовать:

compute <агр. функция> (<имя колонки>) by a, b, c

compute <агр. функция> (<имя колонки>) by a, b

compute <агр. функция> (<имя колонки>) by a

и нельзя использовать:

compute <агр. функция> (<имя колонки>) by b,c

compute <агр. функция> (<имя колонки>) by a, c

compute <агр. функция> (<имя колонки>) by c

5) для подсчета общих итогов используется compute без by.

Примеры:

1) если в compute после by указывается больше одного поля, то группа значений разбивается на подгруппы и агрегатная функция подсчитывается на нижнем уровне группирования:

select type, pub_id, price from titles

order by type, pub_id, price

compute sum(price) by type, pub_id

2) если агрегатную функцию нужно подсчитать на каждом уровне группирования, то необходимо использовать compute больше одного раза:

select type, pub_id, price from titles

order by type, pub_id, price

compute sum(price) by type, pub_id

compute sum(price) by type

Кроме того, в структуре compute можно указывать одну и ту же агрегатную функцию для нескольких колонок, а также разные агрегатные функции для различных колонок.

3) если необходимо подсчитать только общие итоги, которые печатаются в конце отчета, то надо использовать compute без by:

select type, price,advance from titles

where price > $20

compute sum(price), sum(advance)

 

Оператор union

 

Оператор union служит для объединения двух и более запросов в один, для которого

можно использовать структуры order by и compute. Синтаксис оператора:

<запрос1>

[union [all] <запрос N>]…

[<структура order by>]

[<структура compute>]

где <запрос1>: select <список выборки>

[<структура into>]

[<структура from]

[<структура where>]

[<структура group by>]

[<структура having>]

а <запрос N>: select <список выборки>

[<структура from]

[<структура where>]

[<структура group by>]

[<структура having>]

Пример:

select * from t1 union select * from t2

Оператор union, по умолчанию, уничтожает дублируемые записи из результата запросов. Если используется опция all, то все записи включаются в отчет.

 

Правила использования оператора union:

 

1) все списки выборки в операторе union должны иметь одинаковую структуру (одинаковое количество однотипных выражений);

2) заголовки колонок в отчете по объединенному запросу берутся из первого запроса;

3) структуру into можно использовать только в первом запросе;

4) структуры order by и compute можно указывать только после последнего запроса для сортировки и подсчета итогов в объединенном запросе;

5) структуры group by и having можно использовать только в индивидуальных запросах;

6) оператор union можно использовать в операторе insert, например:

insert into tour

select city, state from stores

union

select city, state from authors

7) нельзя использовать union в операторе create view;

8) нельзя использовать опцию browse в предложениях select оператора union.

 

 

Встроенные функции

 

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

- системные функции, которые применяются к системным таблицам БД;

- строковые функции, которые применяются к значениям следующих типов: char, nchar, varchar, nvarchar, binary, varbinary;

- текстовые функции, которые применяются к значениям типа text и image;

- математические функции (тригонометрические, геометрические и др.);

- функции даты, которые применяются к значениям типа datetime и smalldatetime;

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

 

 

Системные функции

 

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

select <имя функции> (<аргумент[ы]>)

 

Таблица 1

 

Функция Аргумент(ы) Результат
1) col_name ( <ид. объекта>, <ид. колонки>) имя колонки
2) col_length (“<имя объекта>”, “<имя колонки>”) длина колонки в таблице
3) data_pgs (<ид. объекта>, {doampg | ioampg}) количество страниц, занимаемое таблицей или индексом (не включаются страницы, используемые внутренними структурами)
4) datalength (<выражение>) длина выражения в байтах
5) db_id (“<имя БД>”) номер идентификатора БД
6) db_name (<номер ид. БД>) имя БД
7) host_id () номер идентификатора главного процесса
8) host_name () имя текущей главной ЭВМ
9) index_col (“<имя объекта>”, <ид. индекса>, <ключ>) имя колонки индекса
10) isnull (<выражение>, <значение>) замена заданного значения null значением
11) object_id (“<имя объекта БД>”) номер идентификатора объекта БД
12) object_name (<ид. объекта БД>) имя объекта БД
13) reserved_pgs (<ид. объекта>, {doampg | ioampg}) количество страниц, занимаемое таблицей или индексом (включаются страницы, используемые внутренними структурами
14) rowcnt (doampg) количество записей в таблице
15) sused_id ([“<имя клиента>”]) номер идентификатора клиента
16) sused_name ([<ид. клиента>]) имя клиента
17) tsequal (<вр. метка>, <вр. метка2>) сравнивает значения временных меток измененной записи; <вр. метка> - временная метка после выборки записи для просмотра; <вр. метка2> - временная метка сохраненной записи после обновления
18) used_pgs (<ид. объекта>, doampg, ioampg) общее количество страниц, занимаемое таблицей и ее индексом (включаются страницы, используемые внутренними структурами)
19) user_id ([“<имя пользов.>”]) номер идентификатора пользователя
20) user_name ([<ид.пользователя>]) имя пользователя
21) valid_name (“<строка>”) возвращает 0, если <строка> содержит недопустимые символы или длиной больше 30 байт, и не 0 - в противном случае

 

Примеры:

1) select x = col_length (“titles”, “title”)

2) select length = datalength (pub_name), pub_name from publishers

3) select name from sysusers where name = user_name(1)

Строковые функции

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

Синтаксис вызова строковых функций:

select <имя функции> (<аргументы>)

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

select (<выражение> + <выражение> [ + <выражение>]…)

Обозначение типов аргументов в таблице2:

1) char_expr - типы char, varchar, nchar и nvarchar;

2) expression - типы char_expr и типы binary и varbinary;

3) pattern - типы данных char_expr, которые можно включать в сопоставление с образцами;

4) approx_numeric - типы float, real и double precition;

5) integer_expr - типы tinyint, smallint и int;

6) start - тип integer_expr;

7) length - тип integer_expr.

Таблица 2

Функция Аргумент(ы) Результат
1) ascii (char_expr) код ASCII для первого символа в выражении
2) char (integer_expr) преобразует цифру, занимающую 1 байт в символ длиной 1 байт
3) charindex (expression1, expression2) ищет первое вхождение выражения1 в выражение2 и возвращает номер позиции; если не находит вообще, то возвращает 0
4) char_length (char_expr) количество символов в строке или тексте
5) difference (char_expr1, char_expr2) разность между двумя значениями типа soundex (см. ниже)
6) lower (char_expr) преобразует большие буквы в маленькие
7) ltrim (char_expr) убирает начальные пробелы
8) patindex (“%pattern%”, char_expr [using {bytes | chars | characters}]) возвращает номер первой позиции вхождения pattern в char_expr или 0, если вхождения нет
9) replicate (char_expr, integer_expr) возвращает строку типа char_expr, содержащуюся в аргументе1 и повторяемую <аргумент2> раз (max длина строки 255 байт)
10) reverce (char_expr) реверс строки, например: “abcd” - “dcba”
Функция Аргумент(ы) Результат
11) right (char_expr, integer_expr) возвращает часть строки, состоящей из <аргумента2> символов, считая справа
12) rtrim (char_expr) убирает замыкающие пробелы
13) soundex (char_expr) возвращает четырехсимвольный код символьной строки, состоящий из римских букв
14) space (integer_expr) возвращает строку из указанного количества пробелов
15) str (approx_numeric [, length [, decimal]]) символьное представление числа с плавающей точкой; length устанавливает общее число знаков, а decimal - число знаков после десятичной точки; если length и decimal не указываются, то по умолчанию length=10, а decimal=0
16) stuff (char_expr1, start, length, char_expr2) удаляет length символов из expr1, начиная с start, а затем вставляет expr2 в expr1, начиная с start; если expr2=null, то только удаляет
17) substring (expression, start, length) выделение подстроки в expression длиной length, начиная с start
18) upper (char_expr) преобразование маленьких букв в большие
19) + expression + expression конкатенация двух и более символьных или бинарных выражений

Примеры:

 

1) select au_lname, substring (au_fname, 1, 1) from authors

2) select charindex(“wonderful”, notes), patindex(“wonderful”, notes) from titles

where title_id = “TC3218”

3) select stuff(“abc”, 2, 3, “xyz”)

4) select (“abc” + “def”)

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

5) select substring(pub_id + title_id, 1, 6) from titles where price > $20

 

 

Текстовые функции

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

Таблица 3

 

Функция Аргумент(ы) Результат
1) patindex (“%pattern%”,char_expr [using {bytes | chars | characters}]) возвращает числовое представление значения первой позиции первого вхождения pattern в символьную строку или 0 - если pattern не найден
2) textptr (<имя текстовой колонки>) возвращает указатель на текст (16байтное двоичное число)
3) textvalid (“<имя таблицы>..<имя колонки>”, <указатель на текст>) возвращает 1, если указатель допустимый и 0 - в противном случае
4) set textsize {n | 0} задает max длину в байтах для колонки типа text/image в select-предложении; если 0, то max длина равна 32 K

Пример:

 

declare @val varbinary(16)

select @val = textptr(blurb) from texttest

Математические функции

Общий синтаксис вызова математической функции:

<имя функции> (<аргументы>)

Типы аргументов:

1) approx_numeric - это типы float, real и double precition;

2) integer - типы tinyint, smallint и int;

3) numeric - это типы approx_numeric, numeric, dec, decimal, все integer и money;

4) power - это типы numeric, approx_numeric и money.

 

Таблица 4

 

Функция Аргумент(ы) Результат
1) abs (numeric) абсолютное значение аргумента
2) acos (approx_numeric) арккосинус (в радианах)
3) asin (approx_numeric) арксинус (в радианах)
4) atan (approx_numeric) арктангенс (в радианах)
5) atn2 (approx_numeric1, approx_numeric2) арктангенс деления аргумента1 на аргумент2
6) ceiling (numeric) округление до ближайшего целого, большего или равного аргументу
7) cos (approx_numeric) косинус (в радианах)
8) cot (approx_numeric) котангенс (в радианах)
9) degrees (numeric) преобразование радианов в градусы
10) exp (approx_numeric) число e в степени аргумент
11) floor (numeric) округление до ближайшего целого, меньшего или равного аргументу
12) log (approx_numeric) натуральный логарифм
13) log10 (approx_numeric) десятичный логарифм
14) pi () число пи
15) power (numeric, power) преобразование числа типа numeric в число типа power
16) radians (numeric) преобразование градусов в радианы
17) rand ([integer]) функция random на отрезке [0;1] или для числа типа integer
18) round (numeric, integer) округление числа типа numeric до числа из integer знаков
19) sign (numeric) знак числа
20) sin (approx_numeric) синус (в радианах)
21) sqrt (approx_numeric) квадратный корень
22) tan (approx_numeric) тангенс (в радианах)

Примеры:

1) select ceiling(123.45) => 124.

2) select round(123.4545,2) => 123.4500

Функции даты (времени)

Таблица 5

 

Часть даты Аббревиатура Значения
1) год 1) yy 1) 1753¸9999
2) квартал 2) qq 2) 1¸4
3) месяц 3) mm 3) 1¸12
4) день года 4) dy 4) 1¸366
5) день 5) dd 5) 1¸31
6) неделя 6) wk 6) 1¸54
7) день недели 7) dw 7) 1¸7 (1-Sunday)
8) час 8) hh 8) 0¸23
9) минута 9) mi 9) 0¸59
10) секунда 10) ss 10) 0¸59
11) миллисекунда 11) ms 11) 0¸999

 

Таблица 6

 

Функция Аргумент(ы) Результат
1) getdate ( ) Текущая системная дата и время
2) datename (datepart, date) часть даты как строка ASCII
3) datepart (datepart, date) часть даты как целое число
4) datediff (datepart, date, date) количество времени между 2-мя датами в частях даты
5) dateadd (datepart, number, date) дата, получаемая прибавлением частей даты к другой дате

Примеры:

1) select getdate();

2) select datediff(month, pubdate, ”Nov 30 1985”) from titles;

3) select dateadd(day, 3, pubdate) from titles