10.01.2011

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;

консоль MySQL

Обратите внимание, точка с запятой (;) добавляется в конце запроса, так же как в конце строки в коде.

Так же, ключевые слова 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 последней вставленной строки.

LAST_INSERT_ID

NOW()

Пришло время показать вам как использовать функции MySQL в запросах.

Функция NOW() возвращает текущую дату. Используйте ее для автоматического добавления текущей даты в поле с типом DATE.

NOW

Обратите внимание, что мы получили предупреждение от MySQL, но это не так важно. Причина в том, что функция NOW() фактически возвращает информацию о времени.

Мы создали поле create_date, которое может содержать только дату, но не время, поэтому данные были усечены. Вместо NOW() мы могли бы использовать CURDATE(), которая возвращает только текущую дату, но в конечном итоге результат был бы тем же.

SELECT: Получение данных из таблицы

Очевидно, что данные которые мы записали бесполезны пока мы не можем их прочитать. На помощь приходит запрос SELECT.

Простейший пример использования запроса SELECT для чтения данных из таблицы:

Пример запроса SELECT

Звездочка (*) означает, что мы хотим получить все столбцы таблицы. Если вам надо получить только определенные столбцы, используйте что-то вроде этого:

Пример запроса SELECT

Условие WHERE

Чаще всего мы хотим получить только определенные строки, а не все. Например, давайте получим E-mail адрес пользователя nettuts.

Условие WHERE

Он подобен условию IF. WHERE позволяет задать условие в запросе и получить нужный результат.

Для условия равенства используется одиночный знак (=), а не двойной (==), который, возможно, вы используете в программировании.

Так же вы можете использовать другие условия:

Условия

AND и OR используются для комбинирования условий:

AND и OR

Обратите внимание, числовые значения не нужно заключать в кавычки.

IN()

Применяется для сравнения с несколькими значениями.

IN()

LIKE

Позволяет задавать шаблон для поиска.

LIKE

Знак процента (%) используется для задания шаблона.

Условие ORDER BY

Используйте это условие, если хотите чтобы результат возвращался отсортированным:

ORDER BY

По-умолчанию задан порядок ASC (по возрастанию). Добавьте DESC для сортировки в обратном порядке.

LIMIT … OFFSET …

Можно ограничивать количество возвращаемых строк.

LIMIT

LIMIT 2 берет две первых строки. LIMIT 1 OFFSET 2 берет одну строку, после первых двух. LIMIT 2, 1 означает тоже самое, только первое число это смещение, а второе - ограничивает количество строк.

UPDATE: Обновление данных в таблице

Этот запрос используется для обновления данных в таблице.

UPDATE

В большенстве случаев UPDATE используется вместе с WHERE, для того чтобы обновить определенные строки. Если условие WHERE не задано, то изменения будут применены ко всем строкам.

Для ограничения изменяемых строк, можно использовать LIMIT.

UPDATE

DELETE: Удаление данных из таблицы

Как и UPDATE, этот запрос часто используется совместно с условием WHERE.

DELETE

TRUNCATE TABLE

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

DELETE FROM users;

Для повышения производительности используйте TRUNCATE.

TRUNCATE

TRUNCATE также сбрасыват счетчик поля AUTO_INCREMENT, поэтому вновь добавленные строки будут иметь id равный 1. При использовании DELETE этого не произойдет и счетчик будет дальше рости.

Экранирование строковых значений и специальные слова

Строковые значения

Некоторые символы нужно экранировть, иначе могут быть проблемы.

Экранирование строк

Обратный слэщ (\) используется для экранирования.

Это очень важно по причинам безопасности. Любые пользовательские данные, перед записью в базу данных, должны быть экранированы. В PHP используйте функцию mysql_real_escape_string() или подготовленные запросы.

Специальные слова

Поскольку в MySQL много зарезервированных слов, таких как SELECT или UPDATE, во избежании противоречий, заключайте имена столбцов и таблиц в кавычки. Причем нужно использовать не обычные кавычки, а обратные (`).

Допустим, по каким то причинам, вы хотите добавить столбец с именем delete:



Заключение

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