
Работа с MySQL. Типы таблиц. Основы SQL. Создание баз данных и таблиц. Удаление базы данных. Выбор базы данных
Плоские файлы реализуют лишь базовые функции при работе с данными и представляют собой примитивные текстовые базы данных, лишенные собственных средств программирования, возможностей поиска и фильтрации данных. Все это с лихвой компенсирует база данных MySQL — одна из лучших баз данных по скорости доступа к данным, ставшая стандартом в Wed.
Примечание. MySQL является базой данных с открытым кодом и доступна для свободной загрузки с сайта http://www.mysql.com как в виде кодов, так и в откомпилированном виде для различных операционных систем, включая Windows и Linux.
Примечание. Полное справочное руководство на русском языке можно найти на официальном сайте MySQL по адресу http://dev.mysql.com/doc/mysql/ru/index.html.
Работа с базой данных имеет как свои преимущества, так и недостатки. К достоинствам можно отнести значительное упрощение кода(иногда в 2 — 3 раза) по сравнению с файловыми вариантами веб-приложений, что сокращает время разработки и упрощает процесс отладки. К недостаткам причисляется зависимость приложения не только от работоспособности веб-сервера, но и от работоспособности сервера баз данных. Вероятность того, что один из серверов может выдти из строя, выше по сравнению, если бы работа веб-приложений зависила только от одного сервера. Кроме того, непосредственная работа с файловой системой осуществляется быстрее по сравнению со случаем, когда в качестве посредника для работы с ней выбирается СУБД. Так поисковая система Google, известная высокой скоростью обработки запросов, основана на модели интерпретируемый язык, не может достич производительности баз данных, реализованных на С.
Типы таблиц
СУБД MySQL в настоящее время поддерживает несколько видов таблиц: ISAM, MyISAM, MERGE, HЕAP, BDB и InnоDB.
Изначально СУБД MySQL планировалась как одна из баз данных и поддерживала единственный тип таблицы —ISAM, который обеспечивает индексно-последовательный метод доступа. Для ускорения выполнения запросов дескриптор ISAM не поддерживает транзакции и ряд операторов SQL.
Тип таблиц ISAM является устаревшим. Он применялся в ранних версиях MySQL, использование его в настоящее время нежелательно, т.к. в будущем его поддержка может быть удалена. Этот вид таблиц был заменен на новый — MyISAM, являющейся стандартным типом по умолчанию. Основные преимущества по сравнению с таблицами типа ISAM заключаются в следующем:
поддерживается больший размер таблиц;
содержимое таблиц хранится в платформонезависимом формате;
более эффективная работа с индексами и атрибутом AUTO_INCREMENT;
более эффективная проверка целостности таблицы;
поддержка полнотекстового поиска с использованием индекса FULLTEXT
Таблицы MERGE предназначены для объединения нескольких таблиц MyISAM в одну, позволяя при помощи одного запроса обращатся ко всем таблицам, входящим в ее состав. Главным преимуществом такого объединения является то, что итоговая таблица может превышать предельный размер, установленный для таблиц MyISAM.
Таблицы HЕAP — это временные таблицы, предназначенные для хранения в в оперативной памяти. Для повышения эффективности в них применяются только строки фиксированной длины.
Таблицы типа BDB поддерживаются дескриптором Berkeley DB, разработанным компанией Sleepycat. Дескриптор BDB обеспечивает:
обработку таблиц с использованием транзакций;
автоматическое восстановление после сбоев;
блокирование на уровне страниц, обеспечивающее хорошую производительность при обработке паралельных запросов.
Таблицы типа InnоDB являются самыми новыми, недавно добавленными в СУБД MySQL. Этот тип таблиц поддерживается дескриптором InnоDB, котрый был разработан компанией Innobase Oy. Он обеспечивает следующие возможности:
обработку таблиц с использованием транзакций;
автоматическое восстановление после сбоев;
поддержку ключей, в том числе каскадное удаление;
блокирование на уровне строк, обесперчивающее хорошую производительность при обработке параллельных запроссов;
распределение таблиц по нескольким файлам или даже разделам диска, что позволяет выходить за пределы, установленные файловой системой
.
Основы SQL
Язык структурированных запросов SQL(Structure Query Language) позволяет выполнять различные операции с базами данных: создавать таблицы, помещать, обновлять и удалять из них данные, производить запросы из таблиц и т.д. Эти операции будут рассмотрены нами далее.
Примечание. Несмотря на то, что последний стандарт SQL принят в 1992 году, на сегодняшний день нет ни одной базы данных, где бы он полностью выполнялся. Более того, в различных базах данных часть операций осуществляется по разному. Мы будем придерживаться диалекта SQL, характерного для СУБД MySQL, поэтому не все запросы могут выполняться для других баз данных.
Примечание. В состав дистрибутива MySQL входит консольный клиент mysql, найти который можно в каталоге /mysql/bin. Это не единственное средство общения с базой данных. На сайте http://www.mysql.com доступны для свободной загрузки некоторые графические клиенты, такие как MySQL Control Center, MySQL Query Browser и др.
Создание баз данных и таблиц
Данные любой СУБД организованы в многоуровневые структуры. На верхнем уровне расположена база данных, в состав которой входят таблицы. Каждая таблица разделена на столбцы и строки, на пересечении которых содержатся значения данных. Каждый столбец имеет свой собственный тип.
Примечание. MySQL не поддерживает каталоги баз данных, как это свойственно для некоторых СУБД.
Создание базы данных
В СУБД MySQL создание базы данных сводится к созданию нового подкаталога в каталоге данных С:\mysql\Data. Создание базы данных средствами SQL осуществляется при помощи оператора CREATE DATABASE.
CREATE DATABASE [IF NOT EXISTS] db_name;
Здесь db_name является именем создаваемой базы данных. Для того чтобы создать новую базу данныхforum, наберите в строке-приглашении клиента mysql эту команду и укажите название базы данных.
Пример.
Создание базы данных forum
После выполнения запроса, загляните в каталог С:\mysql\Data и убедитесь в создании нового каталога forum.
Примечание. Здесь и далее, для создания наглядных примеров используется улита Mysql Command Line Client, хотя это не совсем правильно, т.к. при запуске улиты эти способом нет возможности вводить какие-либо параметры. Кроме того, для работы с другими улитами, входящими в поставку Mysql, неоходим доступ к Командной строке. Как работать с командной строкой мы рассматривали в самом начале раздела, в статье "Установка и настройка Mysql".
Примечание. Каждый запрос MySQL в клиенте mysql завершается точкой с запятой(;). При выполнении запросов из РНР-скрипта отсутствие завершающей точки с запятой не приводит к ошибке.
Примечание. Клиент mysql расположен в каталоге bin базы данных MySQL. По умолчанию при установке MySQL создается два пользователя: анонимный, в качестве имени котрого выступает пустая строка, и суперпользователь, имя которого — root. Для анонимного пользователя по умолчанию разрешен не полный набор SQL-опраторов, поэтому из-под него может не получиться создать базу данных. Тогда клиент mysqlследует загрузить с правами суперпользователя: mysql-u root.
Не обязательная ключевая фраза IF NOT EXISTS сообщает, что базу данных следует создавать, только если база данных с таким именем отсутствует, что позволяет предотвратить завершение запроса ошибкой. Особенно это актуально при использовании SQL в РНР-скриптах.
Для того чтобы убедиться, что база данных успешно создана, можно выполнить команду SHOW DATABASES, которая покажет, какие базы данных существуют в вашей системе
.
Просмотр созданных баз данных
mysql >show databases;
Как видим, среди различных баз данных присутствует и только что созданная база данных forum.
Примечание. Команда SHOW является внутренней командой MySQL, отсутствующей в стандарте SQL и не поддерживаемой другими базами данных. Далее по мере рассмотрения других операторов SQL будут приведены иные варианты использования команды SHOW.
Примечание. Изначально в MySQL присутствуют только две базы данных: mysql и test.
В базах данных information_schema и mysql хранится информация об учетных записях, системный каталог привлегий пользователей СУБД MySQL, региональные настройки и т.д. База данных test является пустой и создается при установке MySQL вместе с системными базами данных information_schema и mysql. Базы данных forum и wet были созданы с помощью запроса.
Примечание. База данных mysql является реальной базой данных, а information_schema — виртуальной, именно поэтому в каталоге данных нет подкаталога с соответствующим именем.
Удаление базы данных
Удаление баз данных можно осуществить с помощью оператора DROP DATABASE. Команда удаляет базу данных со всеми таблицами, входящими в ее состав.
DROP DATABASE database_name
Удаление базы данных wet
mysql >drop database wet;
После выполнения команды drop database можно убедиться, что из директории данных C:\mysql\data была удалена директория wet.
Если производится попытка создания уже существующей базы данных, возвращается ошибка.
Примечание. Так как имя базы данных — это имя каталога, то чувствительность к регистру определяется конкретной операционной системой. Так в операционной системе Windows имена wet и Wet будут обозначать одну и туже базу данных, в то время как в UNIX-подобной операционной системе это будут две разные базы данных.
Часто такое поведение нежелательно, особенно в больших дампах, размещенных в sql-файлах, которые выполняются в пакетном режиме. Для предотвращения ошибки оператор CREATE DATABASE можно снабдить конструкцией IF NOT EXISTS, при наличии которой база данных создается, если она еще не существует, если существует — ни каких действий не производится.
Использование конструкции IF NOT EXISTS
После удаления базы данных wet первый оператор CREATE DATABASE возвращает ответ, в котором говорится о том, что была задействована одна строка(1 row affected ), т.е. база данных создается. Второй операторCREATE DATABASE возвращает сообщение, что запрос не затронул ни одной строки (0 row affected), т.е. база данных не создается, однако и ошибка не выдается.
Точно такой же механизм разработан для оператора DROP DATABASE. Добавление ключевого слова IF EXISTS удаляет базу данных, если она существует, и не производит ни каких действий, если база данных отсутствует.
Использование конструкции IF EXISTS
Специального SQL-оператора, предназначенного для переименования базы данных, не существует, но эту операцию легко осуществить, переименовав каталог базы данных.
При создании базы данных можно указать кодировку, которая будет назначаться таблицам и столбцам по умолчанию. Для этого после имени базы данных следует указать конструкцию DEFAULT CHARASTER SET, которая имеет следующий синтаксис:
DEFAULT CHARACTER SET charset_name;
где charset_name — имя кодировки, например, ср1251, которая обозначает русскую Windows-кодировку.
Назначение кодировки по умолчанию
CREATE DATABASE DEFAULT CHARACTER SET cp1251;
Указание кодировки приводит к созданию в каталоге базы данных С:\mysql\data\wet\ файла db.opt следующего содержания:
default-character-set=cp1251 default-collation=cp1251_general_ci
Выбор базы данных
Для того, чтобы начать работать с таблицами, необходимо сообщить MySQL, с какой базой данных вы намерены работать. Это осуществляется при помощи команды USE:
USE db_name;
Здесь db_name — название выбранной базы данных. Выберем созданную базу forum.
Выбор базы данных
Примечание. При работе с клиентом mysql базу данных можно выбрать непосредственно при загрузке, передав имя базы данных в качестве параметра, к примеру: mysql forum.
В программах, обращающихся к MySQL-серверу, для выбора базы данных используется функцияmysql_select_db().
Типы данных MySQL. Числовые данные. Строковые данные
Типы данных MySQL
Таблицы состоят из столбцов и строк. Тип данных поля определяется столбцом.
MySQL поддерживает несколько типов данных.
Числовые данные — к ним относятся целые числа, не содержащие дробной части (например, 243), а также вещественные числа, состоящие из последовательности цифр, разделенных точкой (например, 46.35).
Строковые данные — последовательность символов, заключенных в одинарные или двойные кавычки: 'Hello world', '243', "MySQL". В качестве стандарта в SQL определяются одинарные кавычки, поэтому для совместимости с другими базами данных рекомендуется использовать именно их.
Календарные данные — специальный тип для обозначения даты и времени. Может принимать различную форму, например строковую "2009-03-14" или числовую 20090314. Основной характеристикой этого типа данных является их хранение ведином внутреннем формате, позволяющем осуществлять сложения и вычитания, независимо от внешнего представления.
NULL — специальный тип данных, обозначающий отсутствие информации.
Числовые данные
Числовые данные делятся на точечные (BOOLEAN, INTEGER и DECIMAL) и приближенные (FLOAT, REAL и DOUBLE PRECISION).
Таблица. Характеристики и занимаемый объем точечных типов |
||
Тип |
Объем памяти |
Диапазон |
TINYINT[(M)] |
1 байт |
от -128 до 127 (от -27до 27-1) от 0 до 255 (от 0 до 28-1) |
SMALLINT[(M)] |
2 байта |
от -32768 до 32767 (от- 215до 215>-1) от 0 до 65535 (от 0 до 216-1) |
MIDIUMINT[(M)] |
3байта |
от- 8388608 до 8388608 (от -223до 223-1) от 0 до 16777215 (от 0 до 224-1) |
INT[(M)] INTEGER[(M)] |
4 байта |
от - 2147683648 до 2147683648 (от 0 до -231 до 231) от 0 до 4294967295(от 0 до 232-1) |
BIGINT[(M)] |
8 байт |
(от -263 до 263-1) (от 0 до 264) |
BIT[(M)] |
(М+7)/8 байт |
от 1 до 64 битов, в зависимости от М |
BOOL, BOOLEAN |
1 байт |
Либо 0, либо 1 |
DECIMAL[(M[,D])], DEC[(M[, D)]], NUMERUC[(M[,D)]] |
М+2 байта |
Повышенная точность; зависит параметров М и D |
Примечание. Здесь и далее необязательные элементы синтаксиса будут заключаться в квадратные скобки, т.е. запись TINYINT[(M)] обозначает, элемент может быть записан и как TINYINT, и как TINYINT(M).
Из таблицы видно, СУБД MySQL имеет пять целых типов: TINYINT, SMALLINT, MIDIUMINT, INT, BIGINT. Различие между ними заключается в диапазоне величин, которые можно хранить в столбцах такого типа. Чем больше диапазон значений у типа данных, тем больше памяти для него требуется.
Примечание. Тип данных INT имеет синоним INTEGER.
Целые типы данных могут быть объявлены положительными. Для этого после объявления типа следует использовать ключевое слово UNSIGNED. В этом случае элементам данного столбца нельзя будет присвоить отрицательные значения, а допустимый диапазон, который может принять тип, удваивается. Так, тип TINYINTможет принимать значения от -128 до 127, TINYINT UNSIGNED — от 0 до 255.
При объявлении целого типа задается количество отводимых под число символов М (от 1 до 255). Это необязательное указание количества выводимых символов используется для дополнения пробелами слева от выводимых значений символов, меньших, чем заданная ширина столбца. Однако ограничений ни на диапазон величин, ни на количество разрядов не налагается. Если число символов, необходимых для вывода числа, превышает М, под столбец будет выделено больше символов. Если дополнительно указан необязательный атрибут ZEROFILL, свободные позиции по умолчанию заполняются нулями слева. Например,для столбца, объявленного как INT(5) ZEROFILL, величина 4 отражается как 00004.
Тип BIT[(M)] предназначен для хранения битовых полей. Параметр М указывает число битовых значений, которое может принимать поле (от 1 до 64). Если параметр М не указан, то по умолчанию принимает значение 1.
Примечание. Тип BIT добавлен в MySQL, начиная с версии 5.0.3.
Тип BOOLEAN является синонимом для TINYINT(1). Значение 1 рассматривается как истина (true), а 0 как ложь (false).
Тип DECIMAL, а также его синонимы NUMERUC и DEC предназначены для величин повышенной точности, например для денежных данных. Требуемая точность задается при объявлении столбца данных одного из этих типов, например:
salary DECIMAL(5, 2)
В этом примере цифра 5 определяет общее число символов, отводимых под число, а цифра 2 задает количество знаков после запятой. Следовательно, в этом случае интервал величин, которые могут храниться в столбце salary, составляет от -99,99 до 99.99(в действительности для данного столбца MySQL обеспечивает возможность хранения чисел вплоть до 999.99, поскольку допускается не хранить знак для положительных чисел).
Примечание. Первый параметр М может принимать максимальное значение равное 64, второй D — 30.
Величины типов DECIMAL, NUMERUC и DEC храняться как стороки, а не как двоичные числа с плавающей точкой, чтобы сохранить точность представления этих величин в десятичном виде. Если второй параметр равен 0, то величины DECIMAL и NUMERUC не содержат десятичного знака или дробной части.
Для представления вещественных типов в СУБД MySQL имеется три типа: FLOAT, DOUBLE, DECIMAL.
Примечание. Тип DOUBLE имеет два синонима: PRECISION и REAL. Тип DECIMAL имеет синоним NUMERIC.
Таблица. Характеристики приближенных типов |
||
Тип |
Объем памяти |
Диапазон |
FLOAT[(M, D)] |
4 байта |
Минимальное значение +1.175494351*1039 Максимальное значение +3.402823466*1038 |
DOUBLE[(M, D)], REAL[(M, D)] DOUBLE PRECISION[(M, D)] |
8 байт |
Минимальное значение +2.225073858072014*10308 Максимальное значение +1.797693134862315*10308 |
Диапазон вещественных чисел помимо максимального значения имеет также минимальное значение, которое характеризует точность данного типа. Параметр М задает число символов для отображения всего числа, а D — для его дробной части.
Числовые типы данных с плавающей точкой также могут иметь параметр UNSIGNED. Как и в целочисленных типах, этот атрибут предотвращает хранение в отмеченном столбце отрицательных величин, но в отличие от целочисленных типов, максимальный интервал для величин остается прежним.
Примечание. Приближенные числовые данные могут задаваться в обычной форме, например 45.67, и в так называемой научной нотации, например 5.456Е-02 или 4.674Е+04. Символ Е указывает на то, что число перед ним следует умножить на 10 в степени указанной после Е. То есть приведенные числа можно записать как 0.05456 и 46740. Такой формат введен для удобства записи, т.к. числа в 300 степени неудобно представлять в обычном десятичном виде.
При выборе столбцов для формирования структуры таблицы необходимо обращать внимание на размер, занимаемый тем или иным типом данных: если значения, размещаемые в базе данных, никогда не будут выходить за пределы 100, не следует выбирать тип TINYINT. Если же вполях столбца предполагается хранить только целочисленные данные, то применение атрибута UNSIGNED позволит увеличить диапазон в два раза.
Ниже представлен оператор CREATE TABLE, создающий таблицу tb1 с двумя полями:
num1 — целочисленное поле типа INT;
num2 — поле для вещественных чисел, тип FLOAT.