Реализация языка SQL в СУБД MySQL


Студент нанимается на лето подработать в
университете, его спрашивают:
- Языком владеешь?
- Я в совершенстве владею языком!
- Отлично, будешь наклеивать марки на конверты.

Функции

select_expression может содержать следующие функции и операторы:

+ - * / Арифметические действия.
% Остаток от деления (как в C)
| & Битовые функции (используется 48 бит).
- Смена знака числа.
( ) Скобки.
BETWEEN(A,B,C) (A >= B) AND (A <= C).
BIT_COUNT() Количество бит.
ELT(N,a,b,c,d) Возвращает a, если N == 1, b, если N == 2 и т. д. a,b,c,d строки.

ПРИМЕР:

ELT(3,"First","Second","Third","Fourth")
вернет "Third".

FIELD(Z,a,b,c) Возвращает a, если Z == a, b, если Z == b и т. д. a,b,c,d строки.

ПРИМЕР:

FIELD("Second","First","Second","Third","Fourth")
вернет "Second".

IF(A,B,C) Если A истина (!= 0 and != NULL), то вернет B, иначе вернет C.
IFNULL(A,B) Если A не null, вернет A, иначе вернет B.
ISNULL(A) Вернет 1, если A == NULL, иначе вернет 0. Эквивалент ('A == NULL').
NOT ! NOT, вернет TRUE (1) или FALSE (0).
OR, AND Вернет TRUE (1) или FALSE (0).
SIGN() Вернет -1, 0 или 1 (знак аргумента).
SUM() Сумма столбца.
= <> <= < >= > Вернет TRUE (1) или FALSE (0).
expr LIKE expr Вернет TRUE (1) или FALSE (0).
expr NOT LIKE expr Вернет TRUE (1) или FALSE (0).
expr REGEXP expr Проверяет строку на соответствие регулярному выражению expr.
expr NOT REGEXP expr Проверяет строку на соответствие регулярному выражению expr.

select_expression может также содержать один или большее количество следующих математических функций.

ABS() Абсолютное значение (модуль числа).
CEILING() ()
EXP() Экспонента.
FORMAT(nr,NUM) Форматирует число в формат '#,###,###.##' с NUM десятичных цифр.
LOG() Логарифм.
LOG10() Логарифм по основанию 10.
MIN(),MAX() Минимум или максимум соответственно. Должна иметь при вызове два или более аргументов, иначе рассматривается как групповая функция.
MOD() Остаток от деления (аналог %).
POW() Степень.
ROUND() Округление до ближайшего целого числа.
RAND([integer_expr]) Случайное число типа float, 0 <= x <= 1.0, используется integer_expr как значение для запуска генератора.
SQRT() Квадратный корень.

select_expression может также содержать одну или больше следующих строковых функций.

CONCAT() Объединение строк.
INTERVAL(A,a,b,c,d) Возвращает 1, если A == a, 2, если A == b... Если совпадений нет, вернет 0. A,a,b,c,d... строки.
INSERT(org,strt,len,new) Заменяет подстроку org[strt...len(gth)] на new. Первая позиция строки=1.
LCASE(A) Приводит A к нижнему регистру.
LEFT() Возвращает строку символов, отсчитывая слева.
LENGTH() Длина строки.
LOCATE(A,B) Позиция подстроки B в строке A.
LOCATE(A,B,C) Позиция подстроки B в строке A, начиная с позиции C.
LTRIM(str) Удаляет все начальные пробелы из строки str.
REPLACE(A,B,C) Заменяет все подстроки B в строке A на подстроку C.
RIGHT() Get string counting from right.
RTRIM(str) Удаляет хвостовые пробелы из строки str.
STRCMP() Возвращает 0, если строки одинаковые.
SUBSTRING(A,B,C) Возвращает подстроку из A, с позиции B до позиции C.
UCASE(A) Переводит A в верхний регистр.

И наконец несколько просто полезных функций, которые тоже можно применить в select_expression.

CURDATE() Текущая дата.
DATABASE() Имя текущей базы данных из которой выполняется выбор.
FROM_DAYS() Меняет день на DATE.
NOW() Текущее время в форматах YYYYMMDDHHMMSS или "YYYY-MM-DD HH:MM:SS". Формат зависит от того в каком контексте используется NOW(): числовом или строковом.
PASSWORD() Шифрует строку.
PERIOD_ADD(P:N) Добавить N месяцев к периоду P (в формате YYMM).
PERIOD_DIFF(A,B) Возвращает месяцы между A и B. Обратите внимание, что PERIOD_DIFF работает только с датами в форме YYMM или YYYMM.
TO_DAYS() Меняет DATE (YYMMDD) на номер дня.
UNIX_TIMESTAMP([date]) Возвращает метку времени unix, если вызвана без date (секунды, начиная с GMT 1970.01.01 00:00:00). При вызове со столбцом TIMESTAMP вернет TIMESTAMP.

date может быть также строкой DATE, DATETIME или числом в формате YYMMDD (или YYYMMDD).

USER() Возвращает логин текущего пользователя.
WEEKDAY() Возвращает день недели (0 = понедельник, 1 = вторник, ...).

Групповые функции в операторе select:

Следующие функции могут быть использованы в предложении GROUP:

AVG() Среднее для группы GROUP.
SUM() Сумма элементов GROUP.
COUNT() Число элементов в GROUP.
MIN() Минимальный элемент в GROUP.
MAX() Максимальный элемент в GROUP.

Здесь MIN() и MAX() могут принимать строку или число в качестве аргумента. Эти функции не могут использоваться в выражении, хотя их параметр может быть выражением:

ПРИМЕР: "SUM(value/10)" нормально, но вот "SUM(value)/10" уже нет!


Присоединения

Свойство объединения SQL дает способность определить связи между таблицами и отыскивать) информацию, основанную на этих связях.

Связи перечисляются в предложении FROM запроса SELECT. Каждая связь отделяется запятой.

ПРИМЕР:


$ mysql mysql



Welcome to the mysql monitor. Commands ends with ; or \g.

Type 'help' for help.





mysql> SELECT db.user, db.delete_priv, user.user, user.delete_priv

    -> FROM db,user WHERE db.user = user.user;


Этот запрос соединит таблицы db и user посредством поля user. Это распечатает что-то вроде следующего:



+------+-------------+------+-------------+

| user | delete_priv | user | delete_priv |

+------+-------------+------+-------------+

|mke   | N           | mke  | N           |

+------+-------------+------+-------------+

Первые два поля фактические db.user и db.delete_priv , последние два user.user и user.delete_priv.

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

Вы можете объединить до пятнадцати таблиц в одном объединении.

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

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


Псевдонимы

СУБД MySQL поддерживает концепцию псевдонимов для таблиц и полей.

Псевдонимы для таблиц являются стандартной частью языка SQL.

ПРИМЕР:

SELECT A.user,A.select_priv,A.insert_priv,A.update_priv FROM user A

В этом примере использован псевдоним таблицы, чтобы сократить ваш запрос, объявляя псевдоним, который короче имени таблицы. Вы используете псевдоним в первой части выбора, и определяете это в FROM, определяя реальное имя таблицы, пробел и псевдоним. Если Вы имеете больше чем одну таблицу, для которой Вы желаете создать псевдоним, просто добавьте запятую после каждой пары имя/псевдоним таблицы.

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

Псевдонимы для полей таблицы - специфическое для MySQL расширение.

ПРИМЕР:

SELECT user.user AS "User Name", user.delete_priv AS "Delete" FROM user;
Одно хорошее дело, которое делают псевдонимы поля - это то, что они позволяют Вам определять более дружественные метки для вашего вывода. Результат вышеупомянутого запроса мог бы окончательно выглядеть примерно так:



+-----------+--------+

| User Name | Delete |

+-----------+--------+

| root      | Y      |

| mke       | N      |

| dummy     | N      |

| admin     | N      |

+-----------+--------+

Хороший совет - брать псевдонимы в кавычки, в данном примере "Delete" вызвало бы ошибку синтаксического анализа при применение без кавычек. (Это потому, что DELETE является ключевым словом SQL.


INSERT INTO

СИНТАКСИС:

INSERT INTO table [(column_name, ...)] VALUES (expression,...) ||
INSERT INTO table [(column_name, ...)] SELECT ...

ОПИСАНИЕ:

Вставляет данные в таблицу.

ПРИМЕР:

INSERT INTO Customer(customer_name,customer_contact) VALUES("Joes Wholesale","Joe Smith")

Этот запрос создаст новую запись в таблице Customer, которая будет содержать автоматически сгенерированный customer_id, и значения, определенные в запросе. Все другие поля будут пустыми (NULL).

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

Вы должны иметь права доступа insert для использования этой команды.


LOAD DATA INFILE

СИНТАКСИС:

LOAD DATA INFILE syntax

ОПИСАНИЕ:

Команды, для чтения данных из текстового файла.

ПРИМЕР:

LOAD DATA INFILE 'customer.tab' [REPLACE | IGNORE] INTO TABLE Customer [fields [terminated by ',' [optionally] enclosed by '"' escaped by '\\' ]] [lines terminated by '\n'] [(field list)]

Для записи в текстовый файл используйте:
SELECT ... INTO OUTFILE 'customer.tab' fields terminated by ',' enclosed by '"' escaped by '\\' lines terminated by '\n' .

"fields terminated by" Имеет значение по умолчанию \t.
"fields [optionally] enclosed by" Имеет значение по умолчанию ".
"fields escaped by" Имеет значение по умолчанию '\\'.
"lines terminated by" Имеет значение по умолчанию '\n'.

"fields terminated by" и "lines terminated by" могут быть больше, чем 1 символом.

Если "fields terminated by" и "fields enclosed by" являются пустыми строками, то размер строки будет фиксированным. То есть, будет производиться чтение полей одной длины.

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

Если указаны "optionally" в "enclosed by" и Вы не используете фиксированный размер строк, только строки с этим символом будут включены в команду SELECT ... INTO.

Если "escaped by" не пусто, то следующие символы будут снабжены префиксом: "escaped by", ASCII 0, и первый символ из "fields terminated by", "fields enclosed by" и "lines terminated by".

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

Некоторые ситуации, которые не поддерживаются LOAD DATA INFILE:

Все строки читаются в таблицу. Если строка имеет слишком мало полей, остальная часть полей в таблице устанавливается в значения по умолчанию.

По соображениям безопасности textfile должен находиться в каталоге баз данных или быть читаемым всеми.

Если "FIELDS ENCLOSED BY" не пустое, то NULL читается как значение NULL. Если "FIELDS ESCAPED" не пустое, то \N тоже читается как значение NULL. Note Обратите внимание, что это БОЛЬШАЯ N, верхний регистр!

Когда запрос LOAD DATA выполнен, Вы можете получить следующую строку информации, используя функцию C API mysql_info().

@result{Records: 1 Deleted: 0 Skiped: 0 Warnings: 0}

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

Вы должны иметь права доступа select и insert таблице user для использования этой команды.


SET OPTION

СИНТАКСИС:

SET OPTION SQL_VALUE_OPTON=value, ...

ОПИСАНИЕ:

Меняет или устанавливает опции MySQL. Опции действуют только в пределах текущего сеанса.

MySQL поддерживает следующие опции (в этой версии пока одну):

SQL_SELECT_LIMIT=value Максимальное число записей, которое возвращает SELECT. Если SELECT имеет параметр LIMIT, то используется значение из этой опции.


UPDATE

СИНТАКСИС:

UPDATE table SET column=expression,... WHERE where_definition

Здесь where_definition:




where_definition:

  where_expr or where_expr [AND | OR] where_expr



Здесь where where_expr имеет формат:

where_expr:

  column_name [> | >= | = | <> | <= | < ]

  column_name_or_constant or

  column_name LIKE column_name_or_constant or

  column_name IS NULL or column_name IS NOT NULL or (where_definition)

ОПИСАНИЕ:

Обновляет одно или несколько полей в таблице MySQL.

ПРИМЕРЫ:

UPDATE Widget_Table SET widgets_on_hand=widgets_on_hand - 300 where widget_id=3;

Этот запрос вычтет 300 из значения widgets_on_hand для widget = 3.

DELETE FROM Purchase_Order_Item WHERE purchase_order = 456

Этот запрос удалит все записи из Purchase_Order_Item, которые имеют значение 456 для purchase_order. Обратите внимание, что вообще Вы НИКОГДА не должны бы удалять данные из этого сорта базы данных. Вы создаете базы данных, чтобы следить за информацией, и даже плохая информация могла бы стать полезной в некотором случае. Гораздо лучше иметь некоторый тип кода состояния, который Вы используете, когда данные стали недопустимыми по каким-либо причинам.

Вы также хотели бы удалять запись в Purchase_Order для purchase_order 456. Важно убедиться, что, когда Вы удаляете информацию, Вы избавляетесь от всех ссылок к этой информации. Иначе Вы закончите с разрушенной базой данных.

Вы должны иметь права доступа update для использования этой команды.


SHOW

СИНТАКСИС:

SHOW DATABASES [LIKE wild]
SHOW KEYS FROM table_name
SHOW TABLES [FROM database] [LIKE wild]
SHOW [COLUMNS|FIELDS] FROM table [FROM database] [LIKE wild]

ОПИСАНИЕ:

Отображает информацию о базе данных MySQL. "wild" эквивалент регулярному выражению для SQL LIKE.

ПРИМЕР:


$ mysql WidgetDB



Welcome to the mysql monitor.  Commands ends with ; or \g.

Type 'help' for help.



mysql> SHOW fields FROM Widget_Table from WidgetDB;



6 rows in set (0.34 sec)

+--------------------+--------------+------+-----+---------+----------------+

| Field              | Type         | Null | Key | Default | Extra          |

+--------------------+--------------+------+-----+---------+----------------+

| widget_id          | mediumint(8) |      | PRI | 0       | auto_increment |

| widget_name        | char(60)     |      | MUL |         |                |

| widget_color_id    | mediumint(8) |      | MUL | 0       |                |

| widget_size_id     | mediumint(8) |      |     | 0       |                |

| widgets_on_hand    | smallint(5)  |      |     | 0       |                |

| widget_price       | float(8,2)   |      |     | 0.00    |                |

| commission_percent | float(4,2)   |      |     | 0.00    |                |

+--------------------+--------------+------+-----+---------+----------------+



mysql>

Первые два поля довольно очевидны. Null будет содержать YES, если это поле может быть равным NULL, Key сообщает имеет ли это поле индекс, Default сообщает Вам значение по умолчанию, которое будет назначено этому полю, если там ничего не окажется после выполнения команды INSERT, Extra указывает другие атрибуты поля, такие как AUTO_INCREMENT, например.


О строках

Примеры правильных строк:

' в строке записывается как ''.

" в строке записывается как "".

Пример, чтобы прояснить ситуацию:



mysql> select 'hello',"'hello'",'""hello""','''h''e''l''l''o''',"hel""lo";





1 rows in set (0.01 sec)



+-------+---------+-----------+-------------+--------+

| hello | 'hello' | ""hello"" | 'h'e'l'l'o' | hel"lo |

+-------+---------+-----------+-------------+--------+

| hello | 'hello' | ""hello"" | 'h'e'l'l'o' | hel"lo |

+-------+---------+-----------+-------------+--------+


О числах


Имена таблиц и столбцов

Вы можете использовать только набор символов ISO8859-2 (или набор символов который Вы определили при компиляции начальном выборе конфигурации и компиляции пакета), символ подчеркивания, и 0-9 в именах столбцов.

Дефисы, пробелы и другие специальные символы не могут использоваться, поскольку они сделали бы невозможным использование таблицы или столбца в операторе SELECT.

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

Локальное оглавление.

На главную страничку.


Banner.Novgorod.Ru