SQL для начинающих
Представляю Вашему вниманию вольный перевод статьи SQL for Beginners
Все больше современных веб-приложений взаимодействуют с базами данных, обычно используя язык SQL. К счастью для нас, этот язык довольно прост в изучении. В этой статье мы начнем изучение основ SQL-запросов и их взаимодействие с базой данных MySQL.
Что вам нужно
SQL (структурированный язык запросов) - язык разработанный для взаимодействия с реляционными системами управления базами данных (СУБД), таких как MySQL, Oracle, Sqlite и другими. Для выполнения SQL-запросов из этой статьи, я полагаю, что у вас установлен MySQL. Так же рекомендую использовать phpMyAdmin как визуальное средство отображения для MySQL.
Следующие приложения позволят легко установить MySQL и phpMyAdmin на ваш компьютер:
Приступим к выполнению запросов в командной строке. WAMP уже содержит ее в консоли MySQL. Для MAMP, возможно потребуется прочитать вот это.
CREATE DATABASE: Создание базы данных
Наш самый первый запрос. Мы создадим базу данных, с которой будем работать.
Первым делом откройте консоль MySQL и залогинтесь. Для WAMP, по-умолчанию, используется пустой пароль. Для MAMP пароль должен быть "root".
После входа напечатайте вот этот запрос и нажмите Enter:
CREATE DATABASE my_first_db;
Обратите внимание, точка с запятой (;) добавляется в конце запроса, так же как в конце строки в коде.
Так же, ключевые слова CREATE DATABASE нечувствительны к регистру, как и все ключевые слова в SQL. Но мы будем писать их в верхнем регистре для улучшения читаемости.
На заметку: набор символов и порядок сопоставления
Если вы хотите установить набор символов и порядок сопоставления по-умолчанию, используйте подобный запрос:
CREATE DATABASE my_first_db DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
Здесь вы найдете список поддерживаемых наборов символов и сопоставлений в MySQL.
SHOW DATABASES: Список всех баз данных
Этот запрос используется для отображения всех баз данных.
DROP DATABASE: Удалить базу данных
С помощью этого запроса вы можете удалить существующую базу данных.
Будьте осторожны с этим запросом, потому что он не выводит никаких предупреждений. Если у вас есть таблицы и данные в базе данных, запрос удалит их все в одно мгновение.
USE: Выбор базы данных
С технической точки зрения это не запрос. Это "оператор" и не требует точки с запятой в конце.
Он сообщает MySQL, что нужно выбрать базу данных по-умолчанию и работать с ней до конца сессии. Теперь мы готовы создать таблицы и остальное в этой базе данных.
Что такое таблица базы данных?
Вы можете думать о таблице в базе данных как о обычной таблице или как о csv-файле, который имеет структурированные данные.
Как в этом примере, в таблице есть имена строк и столбцы с данными. Используя SQL-запросы мы можем создать эту таблицу. Еще мы можем добавлять, считывать, изменять и удалять данные.
CREATE TABLE: Создать таблицу
Этим запросом мы можем создать таблицу в базе данных. К сожалению документация по MySQL не очень дружелюбна к новым пользователям. Структура этого запроса может быть очень сложной, но мы начнем с простого.
Следующий запрос создает таблицу с двумя столбцами.
CREATE TABLE users ( username VARCHAR(20), create_date DATE );
Обратите внимание, мы можем записать запрос на нескольких строках и использовать Tab для отступа.
С первой строкой все просто. Мы создаем таблицу с именем users. Далее, в скобках, перечисляются столбцы таблицы через запятую. После каждого имени столбца идет тип данных, например, VARCHAR или DATE.
VARCHAR(20) означает, что столбец строкового типа и может быть не более 20 символов в длину. DATE - тип данных предназначенный для хранения дат в формате: 'YYYY-MM-DD'.
Первичный ключ
Перед тем как выполним этот запрос, мы должны вставить столбец user_id, который будет первичным ключом (PRIMARY KEY). Не вдаваясь в подробности, вы можете думать о первичном ключе как о способе распознать каждую строку данных в таблице.
Запрос становится таким:
CREATE TABLE users ( user_id INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(20), create_date DATE );
INT - 32х битный целочисленный тип (числовой). AUTO_INCREMENT автоматически создает новый номер id каждый раз при добавлении строки данных. Оно не обязательно, но с ним удобнее.
Этот столбец может быть не целочисленным, хотя это самый распространенный тип данных. Столбец с первичным ключом не обязателен, но рекомендуется его использовать для улучшения производительности и архитектуры базы данных.
Давайте выполним запрос:
SHOW TABLES: Список всех таблиц
Запрос позволяет получить список всех таблиц в текущей базе данных.
EXPLAIN: Показать структуру таблицы
Используйте этот запрос для того, чтобы посмотреть структуру существующей таблицы.
В результате показаны поля (столбцы) и их свойства.
DROP TABLE: Удалить таблицу
Как и DROP DATABASES, этот запрос удаляет таблицу и ее содержимое без каких либо предупреждений.
ALTER TABLE: Изменить таблицу
Такой запрос может иметь сложную структуру, потому что может совершать множественные изменения в таблице. Посмотрим на простые примеры.
Добавляем столбец
ALTER TABLE users ADD email VARCHAR(100) AFTER username;
Благодаря читабельности SQL, этот запрос не нуждается в объяснении.
Удаляем столбец
Удалить так же просто. Используйте запрос с осторожностью, данные удаляются без предупроеждений.
Заново добавим поле email, позже оно еще понадобится:
ALTER TABLE users ADD email VARCHAR(100) AFTER username;
Изменение столбца
Иногда вам может понадобится изменить свойства столбца, для этого не обязательно его удалять и создавать опять.
Этот запрос переименовывает поле username в user_name и изменяет его тип с VARCHAR(20) на VARCHAR(30). Такие изменения не влияют на данные в таблице.
INSERT: Добавляем данные в таблицу
Давайте добавим записи в таблицу, используя запросы.
Как вы можете видеть, VALUES() содержит список значений, разделенный запятыми. Строковые значения заключаются в одинарные кавычки. Значения должны следовать в порядке, заданном при создании таблицы.
Обратите внимание, первое значение равно NULL для первичного ключа, поле которого мы назвали user_id. Все потому что поле отмечено как AUTO_INCREMENT и id генерируется автоматически. Первая строка данных будет иметь id равный 1. Следующая добавленная строка - 2 и т.д.
Альтернативный синтаксис
Вот другой синтаксис вставки строк.
На этот раз мы использовали ключевое слово SET вместо VALUES. Отметим несколько вещей:
- Столбец может быть опущен. Например, мы не присвоили значение полю user_id, потому что оно отмечено как AUTO_INCREMENT. Если не присвоить значение полю с типом VARCHAR, то по-умолчанию оно примет значение пустой строки (если другое значение по-умолчанию не было задано при создании таблицы).
- К каждому столбцу можно обращаться по имени. Поэтому поля могут идти в любом порядке, в отличии от предыдущего синтаксиса.
Альтернативный синтаксис номер 2
Вот еще один пример.
Как и раньше к полям можно обращаться по имени, они могут идти в любом порядке.
LAST_INSERT_ID()
Используйте этот запрос для того, чтобы получить id последней вставленной строки.
NOW()
Пришло время показать вам как использовать функции MySQL в запросах.
Функция NOW() возвращает текущую дату. Используйте ее для автоматического добавления текущей даты в поле с типом DATE.
Обратите внимание, что мы получили предупреждение от MySQL, но это не так важно. Причина в том, что функция NOW() фактически возвращает информацию о времени.
Мы создали поле create_date, которое может содержать только дату, но не время, поэтому данные были усечены. Вместо NOW() мы могли бы использовать CURDATE(), которая возвращает только текущую дату, но в конечном итоге результат был бы тем же.
SELECT: Получение данных из таблицы
Очевидно, что данные которые мы записали бесполезны пока мы не можем их прочитать. На помощь приходит запрос SELECT.
Простейший пример использования запроса SELECT для чтения данных из таблицы:
Звездочка (*) означает, что мы хотим получить все столбцы таблицы. Если вам надо получить только определенные столбцы, используйте что-то вроде этого:
Условие WHERE
Чаще всего мы хотим получить только определенные строки, а не все. Например, давайте получим E-mail адрес пользователя nettuts.
Он подобен условию IF. WHERE позволяет задать условие в запросе и получить нужный результат.
Для условия равенства используется одиночный знак (=), а не двойной (==), который, возможно, вы используете в программировании.
Так же вы можете использовать другие условия:
AND и OR используются для комбинирования условий:
Обратите внимание, числовые значения не нужно заключать в кавычки.
IN()
Применяется для сравнения с несколькими значениями.
LIKE
Позволяет задавать шаблон для поиска.
Знак процента (%) используется для задания шаблона.
Условие ORDER BY
Используйте это условие, если хотите чтобы результат возвращался отсортированным:
По-умолчанию задан порядок ASC (по возрастанию). Добавьте DESC для сортировки в обратном порядке.
LIMIT … OFFSET …
Можно ограничивать количество возвращаемых строк.
LIMIT 2 берет две первых строки. LIMIT 1 OFFSET 2 берет одну строку, после первых двух. LIMIT 2, 1 означает тоже самое, только первое число это смещение, а второе - ограничивает количество строк.
UPDATE: Обновление данных в таблице
Этот запрос используется для обновления данных в таблице.
В большенстве случаев UPDATE используется вместе с WHERE, для того чтобы обновить определенные строки. Если условие WHERE не задано, то изменения будут применены ко всем строкам.
Для ограничения изменяемых строк, можно использовать LIMIT.
DELETE: Удаление данных из таблицы
Как и UPDATE, этот запрос часто используется совместно с условием WHERE.
TRUNCATE TABLE
Для удаления содержимого из таблицы, используйте такой запрос:
DELETE FROM users;
Для повышения производительности используйте TRUNCATE.
TRUNCATE также сбрасыват счетчик поля AUTO_INCREMENT, поэтому вновь добавленные строки будут иметь id равный 1. При использовании DELETE этого не произойдет и счетчик будет дальше рости.
Экранирование строковых значений и специальные слова
Строковые значения
Некоторые символы нужно экранировть, иначе могут быть проблемы.
Обратный слэщ (\) используется для экранирования.
Это очень важно по причинам безопасности. Любые пользовательские данные, перед записью в базу данных, должны быть экранированы. В PHP используйте функцию mysql_real_escape_string() или подготовленные запросы.
Специальные слова
Поскольку в MySQL много зарезервированных слов, таких как SELECT или UPDATE, во избежании противоречий, заключайте имена столбцов и таблиц в кавычки. Причем нужно использовать не обычные кавычки, а обратные (`).
Допустим, по каким то причинам, вы хотите добавить столбец с именем delete:
Заключение
Спасибо за прочтение статьи. Надеюсь я сумел показать вам, что язык SQL очень функционален и легок в изучении.