Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
LektsiiNovye.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
2.92 Mб
Скачать

Описание синтаксиса языка Transact-sql Управляющие конструкции

BEGIN...END

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

BEGIN    {<sql_statement>|<statement_block>} END

GOTO

Оператор безусловного перехода к метке.

:label GOTO label

IF...ELSE

Данная конструкция позволяет выполнить указанную последовательность команд только в случае соблюдения логического условия <boolean_expression>.

IF <boolean_expression>    {<sql_statement>|<statement_block>} [ELSE    {<sql_statement>|<statement_block>}]

Если значение boolean_expression истинно, то выполняется следующий оператор или блок операторов, если ложно, то оператор или блок после ключевого слова ELSE, если он существует.

CASE…END

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

CASE <input_expression> WHEN {<when_expression> | <boolean_expression>} THEN <result_expression> [… n] [ELSE <else_result_expression>] END

input_expression  определяет входное значение  имя переменной или скалярную функцию.

when_expression  указывает одно из возможных значений input_expression , если они совпадают, то конструкция возвращает указанный в этом блоке result_expression.

Если значение input_expression не соответствует ни одному из перечисленных в блоках WHEN – THEN возвращается значение, указанное в блоке ELSE.

COALESCE

Эта конструкция возвращает первое не пустое значение из списка параметров. В скобках перечисляется через запятую множество значений, конструкция возвратит первое же значение не равное NULL.

COALESCE (expression [… n])

WHILE ...BREAK & ... CONTINUE

С помощью этой конструкции в языке организовываются циклы.

WHILE <boolean_condition> {<sql_statement>|<statement_block>} [BREAK] {<sql_statement>|<statement_block>} [CONTINUE]

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

Цикл можно остановить, если в его теле выполнить команду BREAK, если же нужно начать цикл заново, не дожидаясь выполнения всех команд в теле цикла, необходимо выполнить команду CONTINUE . После этого цикл переходит к проверке логического условия.

DECLARE @Vint int SET @Vint=1 WHILE 1=1 BEGIN PRINT ‘квадрат ‘ + STR(@Vint) + ‘равен ‘ + STR(SQUARE(@Vint)) SET @Vint= @Vint+1 IF @Vint < 8 CONTINUE BREAK END

DECLARE

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

Логические операторы

BETWEEN

Предикат BETWEEN задаёт диапазон значений, для которого выражение принимает значение true. Разрешено также использовать конструкцию NOT BETWEEN.

SELECT КраткоеНазвание, ВысотаПомещения FROM СудаГрузовыеПомещения WHERE (ВысотаПомещения BETWEEN 2 AND 4)

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

SELECT КраткоеНазвание, ВысотаПомещения FROM СудаГрузовыеПомещения WHERE (ВысотаПомещения >= 2 AND ВысотаПомещения <=4)

Запрос с предикатом BETWEEN может иметь следующий вид:

SELECT ФИО FROM СправочникКомпанийСотрудники WHERE (ФИО BETWEEN N'A' AND N'Z')

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

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

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

SELECT ДатаЗаключенияДоговора FROM ДоговорыМорскихПеревозок WHERE (NOT (ДатаЗаключенияДоговора BETWEEN '1999-01-01' AND '1999-12-31'))

Запрос позволит получить список договоров, заключённых не в 1999 году.

IN

Оператор IN проверяет, входит ли заданное значение, предшествующее ключевому слову «IN» (например, значение столбца или функция от него) в указанный в скобках список. Если заданное проверяемое значение равно какому-либо элементу в списке, то предикат принимает значение true. Разрешено также использовать конструкцию NOT IN.

SELECT НазваниеРусское FROM dbo.Страны WHERE (НазваниеРусское IN (N'чили', N'США'))

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

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

SELECT НазваниеРусское, СчетчикПорта FROM Порты WHERE (СчетчикПорта IN (SELECT СсылкаСтрана FROM СправочникКомпаний))

LIKE

Оператор LIKE используется только с символьными данными. Он проверяет, соответствует ли данное символьное значение строке с указанной маской. В качестве маски используются все разрешенные символы (с учётом верхнего и нижнего регистров), а также специальные символы:

  • «%»  замещает любое количество символов (в том числе и 0),

  • «_»  замещает только один символ.

Разрешено также использовать конструкцию NOT LIKE.

SELECT НазваниеРусское FROM Порты WHERE (НазваниеРусское LIKE N'А%')

Запрос формирует список портов, русское название поторых начинается с буквы «А».

SELECT НазваниеРусское FROM Порты WHERE (НазваниеРусское LIKE N'____н')

Запрос формирует список портов, русское название поторых содержит 5 букв и последняя из них «н».

В случае, если требуется найти строку, которая содержит указанные выше специальные символы («%», «_») в качестве информационных символов используется ключевое слово ESCAPE. С его помощью определяется так называемый escape-символ, который, будучи поставленным перед символом «%» или «_», укажет, что этот символ является информационным. Escape-символ не может быть символом «\» (обратная косая черта) и, вообще говоря, должен представлять собой символ, никогда не появляющийся в упоминаемом столбце как информационный символ. Часто для этих целей используются символы «@» и «~».

SELECT НазваниеРусское FROM Порты WHERE НазваниеРусское LIKE N'%@_%' ESCAPE N'@')

Запрос позволяет получить список портов, в русском названии которых содержится "_" (знак подчеркивания).

IS NULL

В SQL-запросах NULL означает, что значение столбца неизвестно. Поисковые условия, в которых значение столбца сравнивается с NULL, всегда принимают значение unknown (и, соответственно, приводят к ошибке), в противоположность true или false, т.е.

WHERE dept_no = NULL

или даже

WHERE NULL = NULL

Предикат IS NULL принимает значение true только тогда, когда выражение слева от ключевых слов «IS NULL» имеет значение null (пусто, не определено). Разрешено также использовать конструкцию NOT IS NULL, которая означает «не пусто», «имеет какое-либо значение». Запрос позволяет получить список портов, для которых указано только латинское название.

SELECT НазваниеРусское, НазваниеПорта FROM Порты WHERE (НазваниеРусское IS NULL) AND (NOT (НазваниеПорта IS NULL))

EXISTS

EXISTS (<subquery>)

Этот оператор возвращает значение TRUE, если указанный подзапрос возвращает хотя бы одну строку, в противном случае возвращает FALSE.

declare @x bit if exists(SELECT НазваниеРусское, НазваниеПорта FROM dbo.Порты WHERE (НазваниеРусское IS NULL) AND (NOT (НазваниеПорта IS NULL))) set @x=1 else set @x=0

Переменная @x будет равна единице, если в таблице «Порты» есть хотя бы одна запись, удовлетворяющая условию отбора.

ALL

Expr{ = / <> / != / > / >= / !> / < / <= / !< } ALL (<subquery>)

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

if 1= ALL(SELECT НазваниеРусское, НазваниеПорта FROM dbo.Порты WHERE (НазваниеРусское IS NULL) AND (NOT (НазваниеПорта IS NULL))) set @x=1 else set @x=0

SOME, ANY

Scalar_expr{= / <> / != / > / >= / !> / < / <= / !<} SOME (<subquery>)

Scalar_expr{= / <> / != / > / >= / !> / < / <= / !<} ANY (<subquery>)

С помощью этих операторов можно сравнивать скалярную величину со всеми значениями в столбце таблицы. Разница между операторами ANY и SOME нет. Появление двух идентичных операторов, скорее всего, связано с необходимостью обеспечения обратной совместимости с предыдущими версиями. Если хотя бы в одной строке содержится значение, равное скалярной величине, то условие выполняется. Часто такой подход используется для получения ответа на вопрос, имеется ли в столбце нужное значение.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]