Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

MySQL. Библиотека профессионала - Аткинсон Л

..pdf
Скачиваний:
165
Добавлен:
24.05.2014
Размер:
10.41 Mб
Скачать

Глава Типы данных, переменные и выражения

Поскольку некоторые символы имеют специальное назначение, для включения их в строку необходимо применять управляющие последовательности. Как правило, об ратная косая черта заставляет синтаксический анализатор проигнорировать следую щий символ. Есть также ряд управляющих последовательностей, начинающихся с об ратной косой черты и заменяющих собой непечатаемые символы наподобие символа новой строки (\п). Однако вполне допускается вводить символы новой строки и табу ляции нажатием клавиш <Enter> и соответственно. Оба варианта продемонст рированы в табл. 10.1. Обратите внимание на что в обоих случаях строка "Line One Line Two разбивается на две части.

С помощью управляющей последовательности

Путем нажатия клавиши

 

SELECT

"Line

Two";

 

SELECT

"Line One

 

 

 

 

 

 

TWO";

 

I

Line One

 

 

 

 

 

 

Line Two

|

 

 

I

Line One

 

 

 

 

 

 

Line Two

|

 

I

Line One

 

 

 

 

 

 

Line Two

|

 

 

I

Line One

 

 

 

 

 

 

Line Two

I

 

1

row in

set

(0 . 00

sec)

 

 

 

 

 

 

 

 

 

1

row in

set

(0 . 00 sec)

Если одним из символов строки является кавычка, то в соответствии со стандар том SQL ее нужно удвоить. В MySQL то же самое применимо и в отношении двойных кавычек.

При работе со строками важно помнить о таком символе, как NUL (ASCII код — Он обозначает конец строки в C++ —языке, на котором написана программа MySQL. Включение его в середину строки может привести к непредсказуемым последствиям.

Допустимые управляющие последовательности перечислены в табл. 10.2.

Код

Описание

\ или

Позволяет поставить двойные кавычки внутри строки, которая са

 

ма заключена в двойные кавычки

или

Позволяет поставить одинарную кавычку внутри строки, заклю

 

ченной в одинарные кавычки

 

Используется в выражениях оператора для отмены специаль

 

ного назначения символа %

0

Соответствует символу NUL (ASCII код О)

Соответствует символу возврата на одну позицию ("забой") Соответствует символу перевода строки (ASCII код 10) Соответствует символу возврата каретки (ASCII код

Типы данных

 

Соответствует символу горизонтальной табуляции (ASCII код

 

Отменяет специальное назначение символа \

\_

Используется в выражениях оператора для отмены специаль

 

ного назначения символа

Те, кто знакомы сязыком могут что вместо управляющих последова тельностей можно использовать ASCII коды. Но это не так. грамма MySQL воспринимает только те коды, которые перечислены в табл. 10.2.

Допускается запись строк в виде. Такие строки не нужно брать в кавычки. Нужно лишь добавить к строке префикс Ох (большая буква X претируется неправильно). Пример такой строки показан в листинге 10.2. В MySQL версии 4.0 будет поддерживаться форма записи строк, соответ ствующая стандарту ANSI: прописная литера X, за которой следует строка шестнадца теричных символов, заключенная в одинарные кавычки, например X 4CG5GFGE

SELECT Ox4C656F6E AS

Числа

Числовые литералы записываются в виде цепочек цифр без каких либо кавычек. Числу может предшествовать знак минус, а если это дробное число, то оно будет держать десятичную точку. Максимальная разрядность целых 64 бита, т.е. числа, большие чем будут представляться неправильно.

MySQL понимает научную запись дробныхчисел. Это означает, что после мантис сы числа можно указывать символ экспоненты и показатель степени. Например, за пись 1.2е+3 соответствует числу 1200 Чтобы не возникало неоднозначности, показателю степени должен предшествовать знак "плюс" или "минус".

Шестнадцатеричные литералы, участвующие в числовых операциях, будут претироваться как числа. Для этого они приводятся к целочисленному типу (листинг 10.3).

Глава Типы данных, переменные и выражения

Значения NULL

В язык SQL введено понятие отсутствующего значения, записываемого как NULL. Это не то же самое, что 0 или пустая строка. Если одним из операндов выражения явля ется значение NULL, результат также будет равен NULL. Отсюда следует, что проверку на равенство значению NULL необходимо выполнять с помощью специальных операторов IS NULL или либо функции ISNULL но нестандартного оператора

Переменные

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

В MySQL переменные не требуют инициализации. Если происходит обращение к определенной переменной, ей присваивается значение NULL. По окончании сеанса менные автоматически удаляются. Об управлении памятью можно не заботиться, но обходимо помнить отом, что приложение способно формировать пул соединений. В этом случае переменная будет оставаться в памяти до завершения всей группы сеансов.

Переменные могут использоваться везде, где допускается имя столбца, в том числе в предложениях SELECT и WHERE. Соответствующий пример показан в листинге 10.4. Запрещается указывать переменные в предложениях LIMIT и IGNORE, а также ис пользовать переменные для именования столбцов.

SET

2;

Query OK,

0 rows affected (0.00 sec)

SELECT ID, Name

FROM item

WHERE ID

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

Операторы

Разрешается присваивать переменной значение прямо в инструкции SELECT. Для этого предназначен оператор Правым операндом может быть произвольное вы ражение, допустимое в списке возвращаемых столбцов. Эта особенность программы демонстрируется в листинге 10.5. Обратите внимание на то, что строка выражения стала надписью столбца в таблице результатов.

mysql> SELECT

ID

FROM item

 

WHERE Name

 

| @Special_Item

ID |

I

1 row in set (0.00 sec)

SELECT ID, Name

FROM item

WHERE ID

I ID | Name |

I 3 I Brush |

1 row in set (0.00 sec)

В показанном примере условию отбора соответствует одна строка. Если же запрос извлекает несколько строк, то столько же раз будет меняться значение переменной. Операция присваивания в предложении SELECT выполняется тогда, когда строка форматируется и посылается клиенту. Следовательно, в предложении WHERE будет

использовано то значение переменной, которое записалось в нее последним.

Операторы

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

За исключением оператора присваивания, все остальные операторы делятся на четыре категории: арифметические, реляционные (операторы сравнения), логиче ские и побитовые. Арифметические операторы выполняют простейшие математиче ские операции. Реляционные операторы предназначены для сравнения значений. С помощью логических операторов строятся булевы выражения. Побитовые ры работают с битовым представлением чисел.

Если оба операнда принадлежат к одному и тому же типу, тип результата опреде ляется тривиально. Строки, участвующие в арифметических выражениях, преобра зуются в числа. Несовпадениетипов в операциях сравнения решается следующим

Глава Типы данных, переменные и выражения

разом: строки преобразуются в

целые в числа с плавающей запятой, а

числа — в значения даты/

 

Если оба операнда равны

результатом выражения тоже будет NULL. В случае

булевых выражений значению NULL соответствует значение Исключение со ставляет оператор

Арифметическиеоператоры

К арифметическим операциям относятся сложение, вычитание, умножение и де ление. Добавление к числу знака "минус" называется отрицанием. Операция деления по модулю возвращает остаток от целочисленного деления двух Существующие арифметические операторы перечислены в табл. 10.3.

Оператор

Операция

 

Сложение

 

Вычитание и унарное отрицание

*

Умножение

 

Деление

%

Деление по модулю

Арифметическими операндами могут быть только числа. В некоторых языках про граммирования поддерживается идея сложения строк, но в MySQLстроки, входящие в состав арифметических выражений, будут преобразованы в числа. Если корректное преобразование невозможно, значением строки будет число 0. В случае необходимо сти целые числа будут преобразованы в числа с плавающей запятой, как показано в листинге 10.6.

Оператор возвращает число с плавающей точность которого на две цифры выше, чем количество цифр после запятой у самого точного из операндов. Например, результат операции 10/3 будет равен 33, а операции

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

Операторы

Операторы сравнения

Реляционные операторы, иначе называемые операторами сравнения (табл. 10.4), возвращают булевы значения TRUE (истина) или FALSE (ложь). Если булево значение стоит в списке возвращаемых столбцов или в правой части оператора присваивания, то оно будет преобразовано в 1 (TRUE) или О (FALSE).

Оператор

Проверка

 

Меньше

 

Больше

 

Меньше или равно (не больше)

 

Больше или равно (не меньше)

BETWEEN минимум AND максимум

Принадлежность диапазону

IN

Членство в множестве

NOT IN

Отсутствие членства в множестве

 

Равно

 

Не равно (допускается сравнение со значе

 

нием NULL)

 

Соответствие шаблону

NOT

Несоответствие шаблону

RLIKE

Соответствие регулярному выражению

NOT REGEXP, NOT RLIKE

Несоответствие регулярному выражению

 

Не равно

IS NULL

Равно NULL

IS NOT NULL

He равно NULL

Строка, сравниваемая с числом, сама будет преобразована в число. Если коррект ное преобразование невозможно, вместо строки будет подставлено значение 0. Це лые числа, сравниваемые с числами с плавающей запятой, будут приведены к соответ

ствующему типу.

 

Если в операции сравнения участвует значение

программа MySQL

попытается привести к этому типу второй операнд. Такое преобразование возможно для строки или числа, состоящих из восьми цифр. Первые четыре цифры считаются номером года, следующие две — номером месяца, а последние две — номером дня. В случае, когда операнд представлен в другом формате, произойдет противополож ное преобразование: значения даты/времени — в строку или число. Столбцы типов и DATE всегда сравниваются в строковом виде.

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

Глава Типы данных, переменные и выражения

по умолчанию. Ключевое слово BINARY заставляет учитывать регистр при сортиров ке строк.

Оператор BETWEEN является упрощенным вариантом комбинации операторов и Таким образом, инструкции, показанные в листинге 10.7, являются эквивалентными.

SELECT

SELECT

ListPrice

FROM invoice_sku

FROM

invoice_sku

WHERE ListPrice 50

WHERE ListPrice BETWEEN 50 AND 100

AND ListPrice 100

 

Операторы IN и NOT

IN принимают в скобках группу разделенных запятыми зна

чений, задающих допустимое множество. Если левый операнд совпадает с одним из значений в скобках, результат проверки будет истинным. В списке должны быть ука заны литералы или имена столбцов. В отличие от некоторых СУБД, в MySQL не до пускается указывать в скобках запрос. Подчиненные запросы появятся в MySQLвер сии4.1.

Значения, указанные в скобках, приводятся к типу левого операнда. Если, напри мер, целое число сравнивается с группой чисел с плавающей запятой, то последние будут округлены. Это означает, что проверка 5 IN окажется ис тинной, а проверка 5 О IN (3.2,

Оператор проверяет равенство операндов, а операторы и о — их неравенст во. Если любой из операндов равен NULL, то результат проверки также будет равен NULL, а не TRUE или FALSE, как можно предположить. К примеру, инструкция

SELECT 17 NULL

вернет NULL, а не 0. Инструкция

SELECT NULL = NULL

тоже вернет NULL. Чтобы избежать такого поведения, пользуйтесь оператором специфичным для MySQL. Результат инструкции

SELECT NULL NULL

равен Аналогичные проверки выполняют операторы IS NOT NULL. Операторы и NOT сравнивают левый операнд с шаблоном, указанным в

правом операнде. Метасимвол % в шаблоне соответствует произвольному числу сим волов, а метасимвол — одиночному символу. Остальные символы воспринимаются буквально. Если необходимо выполнить сравнение с самим символом % или его нужно защитить от интерпретации с помощью обратной косой черты.

Строка шаблона анализируется дважды. При этом на первом проходе последова тельности \_ и \\ будут заменены соответствующими литералами, а вот остальные управляющие последовательности не распознаются, поэтому \п превратится в а не в символ новой строки. Проверка обычных управляющих последовательностей выполня ется на втором проходе. Это означает, что в данном случае символы обратной косой черты необходимо удваивать. Таким образом, чтобы вставить в шаблон символ табуля ции, следует записать \\\t. Обратной косой черте соответствует запись \\\\ .

Операторы

Всего этого можно избежать, если воспользоваться предложением ESCAPE, кото рое задает символ, служащий началом управляющих последовательностей в данном конкретном операторе LIKE. В листинге 10.8 приведены примеры выражений с опе ратором LIKE, каждое из которых является истинным. Выражения с оператором LIKE чувствительны к регистру символов только в том когда левый операнд помечен ключевым словом BINARY.

SELECT

LIKE

 

SELECT

LIKE

 

SELECT

LIKE

 

SELECT

LIKE

 

SELECT

LIKE

ESCAPE '^';

Оператор сравнивает левый операнд с регулярным выражением, стоящим справа. В регулярных выражениях применяется специальный язык описания шаблонов, спецификация которого содержится в стандарте 1003.2. Они всегда чувствитель ны к регистру символов. Регулярные выражения также подвержены двойному синтак сическому анализу, но предложение ESCAPE в операторе REGEXP не поддерживается.

На самом верхнем уровне регулярное выражение состоит из одного или несколь

ких блоков, разделенных вертикальной чертой

Этот символ аналогичен операто

ру OR в SQL, т.е. сравниваемая строка может

соответствовать любой из ветвей.

В табл. 10.5 приведен ряд примеров.

 

Регулярное выражение

Чему соответствует

apple

apple

 

apple ball

apple

ball

begin | end |break

begin, end илиbreak

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

Существуют и более точные модификаторы. Они записываются в фигурных скоб ках. Если в скобках стоит одно число, конструкция должна встречаться указанное ко личество раз. Число с запятой означает, что конструкция встречается как минимум указанное количество раз. Два числа, разделенных задают диапазон "от и до". Соответствующие примеры приведены в табл. 10.6.

Глава 10. Типы данных, переменные и выражения

Регулярное выражение

Чему соответствует

...

ab, abb,

abbb

abb, abbb,

Атомарная конструкция представляет собой последовательность символов, часть из которых имеет специальное назначение, а часть интерпретируется буквально. Ме тасимвол соответствует произвольному символу. Метасимвол обозначает начало строки, а метасимвол $ — ее конец. Если необходимо отменить интерпретацию спе циального символа, поставьте перед ним обратную косую черту. Разрешается группи ровать конструкции с помощью круглых скобок, чтобы всевыражение в скобках стало атомарной конструкцией.

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

Помимо списков и диапазонов в квадратных скобках можно указывать классы сим

волов. Имена классов окружаются двоеточиями, например

что

значит

"все символы алфавита". Допустимые классы таковы:

alpha, blank,

 

digit,

и

 

 

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

Регулярное

Чему соответствует

 

выражение

 

 

с

Любая

строка, начинающаяся с а и заканчи

 

вающаяся на с:

и т.д.

Любая строка, начинающаяся с а

Любая строка, содержащая буквы a, и с и заканчивающаяся

на х, ах, и т.д.

Операторы 131

у

bay или boy; возможна альтернативная запись bay | boy

 

Любая строка, не содержащая Z или z

 

Любая цифра; возможна альтернативная запись [0 9]

*

Любое слово, начинающееся с а

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

Логические операторы (табл. 10.8) работают с булевыми величинами. Обратите внимание на то, что у каждого оператора есть две формы записи: словесная и сим вольная.

Оператор

Операция

AND,

Логическое умножение (И)

OR, |

Логическое сложение (ИЛИ)

NOT,

Логическое отрицание (НЕ)

Те, кто не знакомы с логическими операциями, могут обратиться к табл. 10.9. Бу левы переменные и содержат значения "истина" или "ложь", что составляет четы ре комбинации.

р

q

 

 

 

Ложь

Ложь

Ложь

Ложь

Истина

Ложь

Истина

Ложь

Истина

Истина

Истина

Ложь

Ложь

Истина

Ложь

Истина

Истина

Истина

Истина

Ложь

Побитовыеоператоры

Побитовые операторы (табл. 10.10) работают с числами как с цепочками битов. Напомним, что двоичное число состоит из нулей и единиц, причем позиция каждой цифры соответствует степени числа 2, начиная с нулевой. Например, десятичное 9 в двоичной форме записывается как 1001