MySQL. Библиотека профессионала - Аткинсон Л
..pdfГлава Типы данных, переменные и выражения
Поскольку некоторые символы имеют специальное назначение, для включения их в строку необходимо применять управляющие последовательности. Как правило, об ратная косая черта заставляет синтаксический анализатор проигнорировать следую щий символ. Есть также ряд управляющих последовательностей, начинающихся с об ратной косой черты и заменяющих собой непечатаемые символы наподобие символа новой строки (\п). Однако вполне допускается вводить символы новой строки и табу ляции нажатием клавиш <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