Главная » Как правильно вставить

Как правильно вставить команды sql в c

hr6134 8 июля в 13:35 177k

В этом руководстве мы рассмотрим основные sql команды на примере небольшой задачи. При прочтении желательно сидеть за консолью mysql и вводить все запросы для большей наглядности.

Постановка задачи

table1: user_id (INT(5), PRIMARY KEY), username (VARCHAR(50), INDEX)
table2: phone_id (INT(5), PRIMARY KEY), user_id (INT(5), INDEX), phone_number (INT(10), INDEX)
table3: room_id (INT(5), PRIMARY KEY), phone_id (INT(5), INDEX), room_number(INT(4) INDEX)

Необходимо выбрать номер комнаты в которой сидит пользователь с ником qux…

Подготовка данных для задачи


Для создания баз данных и таблиц используются операторы CREATE DATABASE и CREATE TABLE, соответственно (для удаления DROP DATABASE и DROP TABLE). В конце каждой команды ставится точка с запятой (;). Сначала создадим базу с именем article:


Мы используем ключевые слова IF NOT EXISTS для того, чтобы не возникала ошибка, если указанная база данных или таблица уже существует (в дальнейшем IF NOT EXISTS для простоты будем опускать).
Теперь необходимо создать таблицы:


Разберём эти команды по порядку. После CREATE TABLE указывается имя таблицы, далее в скобках следуют имена полей с типами и атрибутами, перечисленные через запятую и указания ключей. Первой командой мы создаём таблицу с именем table1 и полями user_id, username. Поле user_id имеет целочисленный тип (INT) и длину 5-ть знаков, не может равняться нулю и обладает атрибутом auto_increment (при создании каждой записи, значение в этом поле создаётся автоматически и увеличивается на единицу), к тому же оно является первичным ключём. [ Первичный ключ (primary key) представляет собой один из примеров уникальных индексов и применяется для уникальной идентификации записей таблицы. Никакие из двух записей таблицы не могут иметь одинаковых значений первичного ключа. ] Поле username имеет символьный тип (длина 255 символов) и является индексом. Вторая и третья команды аналогичны первой.

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


Теперь необходимо добавить данные в таблицы. Для добавления записей используется оператор INSERT.


В поле user_id мы ничего не добавляем так как оно автоматически создаётся при каждом INSERT`е (вспоминаем про магический атрибут auto_increment). После названия таблицы в скобках (далее будем называть эти скобки кортежём) указывается список полей, которым мы будем присваивать значения. После VALUE указываются сами значения. Они должны стоять на соответствующих позициях в кортеже.
Такими же командами добавляем пользователей bar, baz, qux.
Для проверки используем команду:

[1]
Саму команду SELECT мы рассмотрим подробнее позже.
Далее заполним таблицы table2 и table3.

[2]
Здесь полю user_id присваивается значение 2, а полю phone_number — 200. Если поменять местами названия полей или значения в кортежах, то результат измениться. Например:

[3]
Теперь полю user_id присваивается значение 200, а phone_number – 2.
Предположим, мы ошиблись при добавлении значений (использовали команду [3] вместо [2]), не надо рваться удалять таблицу или всю базу — значение можно изменить с помощью оператора UPDATE.


После SET мы указываем поля, значения которых необходимо изменить, и соответственно новые значения через знак равно. Оператор WHERE мы видим впервые. Он необходимо для наложения ограничений на запрос. В данном случае изменения будут применяться не ко всем строкам таблицы, а только к тем у которых значение поля phone_id равно '1'.
Остальные данные добавляются по аналогии (что добавлять можно посмотреть вверху страницы).

Решение


Базу данных и таблицы мы создали. Теперь можно заняться решением самой задачи. Выборка в базе данных производится с помощью оператора SELECT, с которым мы немного знакомы по команде [1]. Рассмотрим его подробнее. В общем виде он выглядит так:
SELECT названия_полей FROM названия_таблиц WHERE условие [ORDER BY, LIMIT]
Где ORDER BY и LIMIT дополнительные опции.
Попробуем применить его. Выберем все значения поля username из таблицы table1.


и отсортируем их


Как видно, ORDER BY используется для сортировки по одному из полей, указанных после оператора SELECT. По умолчанию делается возрастающая сортировка, если хотим использовать сортировку в обратном порядке то после поля необходимо добавить DESC:


Так как нам нужны все значения, то оператор WHERE можно не использовать. Ещё один пример: выбираем значения полей phone_id и user_id из таблицы table2, где phone_number равен '200'.


LIMIT выводит строки в указанном диапазоне (нижняя граница не включается). Если первый аргумент не указан, то он считается равным 0.

Как мы можем видить, все три наши таблицы связаны. table1 и table2 через поле user_id, а table2 и table3 через phone_id. Для того, чтобы связать их в одно целое по указанным столбцам, необходимо воспользоваться оператором JOIN. JOIN, в переводе на великий и могучий, означает «объединять», то есть собирать из нескольких кусочков единое целое. В базе данных MySQL такими «кусочками» служат поля таблиц, которые можно объединять при выборке. Объединения позволяют извлекать данные из нескольких таблиц за один запрос. В зависимости от требований к результату, MySQL позволяет производить три разных типа объединения:
1. INNER JOIN (CROSS JOIN) — внутреннее (перекрёстное) объединение
2. LEFT JOIN — левостороннее внешнее объединение
3. RIGHT JOIN — правостороннее внешнее объединение

INNER JOIN позволяет извлекать строки, которые обязательно присутсвуют во всех объединяемых таблицах.
Попробуем написать запрос:

[4]
С помощью оператора USING мы указываем поле по которому будут связаны таблицы. Его использование возможно только если поля имеют одинаковое название. В противном случае необходимо использовать ON, так как показано ниже:


LEFT/RIGHT JOIN позволяют извлекать данные из таблицы, дополняя их по возможности данными из другой таблицы. Чтобы показать разницу с INNER JOIN нам сначала необходимо будет добавить ещё одно поле в таблицу table1.


А теперь используем команду [4], только заменим INNER JOIN на LEFT JOIN, а qux на quuz:

Новый пользователь получил user_id=5. Это значение отсутствует в других таблицах, поэтому в результате мы получили NULL. При INNER JOIN результат был бы пустой, так как выводятся только значения, которые есть во всех таблицах. Здесь же таблицы table1 и table2 дополняются значением из table3, даже если его и нет.

Аппендикс


Ниже приводятся примеры команд с небольшими пояснениями:

Удалить строку с user_id равным 1 из таблицы table1:

Переименовываем таблицу table1 в nya:

Переименовать поле user_id в id (таблица table1):

Меняем тип и атрибут поля phone_number:

Просмотр описания таблицы table1:

Добавляем поле abra типа DATE:

Выбираем из table3 все значения поля room_id, для которых room_number начинается с цифры 3 (% означает любое количество любых символов; like проверяет совпадение символьной строки с заданным шаблоном):

P.S.


1. Часть материала про join`ы взята из статьи MySQL немного о JOIN'ах .
2. Задача встретилась на одном из собеседований, которые я проходил. Она достаточно синтетическая, но хорошо подходит для описания материала.
3. Описания конструкций операторов намеренно упрощены для более лёгкого восприятия новичками. Для всех остальных есть Справочное руководство по MySQL

Справочник по MySQL. SQL. Вставка строки в таблицу INSERT

Команда MySQLINSERT производит вставку новых строк в таблицу.

Синтаксис команды INSERT

Общие положения работы команды INSERT:

tbl_name - Задает имя таблицы, в которую будет вставлена новая строка. На момент запуска команды INSERT таблица с таким именем должна существовать в базе данных. LOW_PRIORITY - Если указан этот параметр, то вставка новой записи будет отложена до тех пор, пока другие сценарии не закончат чтение из этой таблицы. Надо отметить, что если таблица часто используется, то при указании этого параметра может пройти достаточно много времени, прежде чем данная команда будет выполнена. DELAYED - Если указан этот параметр, то после выполнения команды INSERT сценарий сразу же получит ответ от БД о успешной вставке новой записи, а запись будет вставлено только после завершения использования данной таблицы другим сценарием. Это может быть удобно, если требуется высокая скорость работы скрипта. Данный параметр работает только с таблицами типа ISAM и MyISAM. Следуем отметить, что если таблица, в которую происходит вставка записи, в данный момент не используется другими запросами, то команда INSERT DELAYED будет работать медленнее, нежели INSER. Так что рекомендуется использовать параметр DELAYED только при большой нагрузке на таблицу. IGNORE - Если некоторые поля таблицы имеют ключи PRIMARY или UNIQUE, и производится вставка новой строки, в которой эти поля имеют дублирующее значение, то действие команды аварийно завершается и выдается ошибка №1062 ( Duplicate entry 'val' for key N ). Если в команде INSERT указано ключевое слово IGNORE, то вставка записей не прерывается, а строки с дублирующими значениями просто не вставляются.

Если MySQL был сконфигурирован с использованием опции DONT_USE_DEFAULT_FIELDS, то команда INSERT будет генерировать ошибку, если явно не указать величины для всех столбцов, которые требуют значений не-NULL.

Для того, чтобы узнать значение, присвоенное полю с ключом AUTO_INCREMENT, можно воспользоваться функцией mysql_insert_id().

Для добавления новых записей в существующую таблицу при помощи команды INSERT существует три основных синтаксиса:

INSERT. VALUES - В этом случае в команде четко указывается порядок следования устанавливаемых полей и их значений. Следующая команда вставит в таблицу users новую запись, присвоив полям name. age. country. city значения Evgen. 26. Russia. Ryazan соответственно: Если для поля или группы полей, присутствующих в таблице, не установить значение, то используется значение, установленное по умолчанию при создании таблицы: После выполнения этой команды поле country получит значение по умолчанию. Если при выполнении команды INSERT не были указаны названия полей, то в VALUES() должны быть указаны значения для всех полей таблицы. Если список полей таблицы заранее не известен, то его можно узнать при помощи команды: Результатом этой команды будет таблица примерно следующего содержания: Здесь обработав полученные данные в поле Field можно получить все поля таблицы. INSERT. SET - В этом случае в команде каждому полю, присутствующему в таблице, присваивается значение в виде имя поля='значение'. Следующий пример по результату идентичен первому примеру для INSERT. VALUE. Так же, как и с INSERT. VALUES. если одному или нескольким полям не задать значение, то установится значение по умолчанию. В качестве значений полям можно присваивать не только значения, но и выражения. В выражениях разрешено использовать значения полей таблицы, которые уже были установлены в этой команде: или INSERT. SELECT - Такой синтаксис позволяет внести в таблицу большое количество записей за один раз, причем из разных таблиц. Следующий пример запишет в таблицу users_new все записи из таблицы users. в которых поле country равно Russia . Если для таблицы, в которую происходит вставка записей, не указан список полей, то значения для всех полей будут определены на основании результата работы SELECT. Если некоторые поля не определены, то для них будут принято значение по умолчанию. Особенности синтаксиса INSERT. SELECT:
  • Имя таблицы, в которую вставляются записи, не должна присутствовать в списке таблиц FROM части SELECT. т.к. это может привести к ошибке вставки (ведь условие WHERE части SELECT может найти записи, которые уже вставлены этой командой ранее).
  • Другим сценариям запрещено производить вставку в таблицы, учавствующие в запросе, во время выполнения этого запроса.
  • Столбцы AUTO_INCREMENT работают, как обычно.

Добавить страницу в закладки:

Источник: http://www.spravkaweb.ru/mysql/sql/insert

6.4.3. Синтаксис оператора INSERT

Оператор INSERT вставляет новые строки в существующую таблицу. Форма данной команды INSERT. VALUES вставляет строки в соответствии с точно указанными в команде значениями. Форма INSERT. SELECT вставляет строки, выбранные из другой таблицы или таблиц. Форма INSERT. VALUES со списком из нескольких значений поддерживается в версии MySQL 3.22.5 и более поздних. Синтаксис выражения col_name=expression поддерживается в версии MySQL 3.22.10 и более поздних.

tbl_name задает таблицу, в которую должны быть внесены строки. Столбцы, для которых заданы величины в команде, указываются в списке имен столбцов или в части SET.

Если не указан список столбцов для INSERT. VALUES или INSERT. SELECT. то величины для всех столбцов должны быть определены в списке VALUES() или в результате работы SELECT. Если порядок столбцов в таблице неизвестен, для его получения можно использовать DESCRIBE tbl_name.

Любой столбец, для которого явно не указано значение, будет установлен в свое значение по умолчанию. Например, если в заданном списке столбцов не указаны все столбцы в данной таблице, то не упомянутые столбцы устанавливаются в свои значения по умолчанию. Установка значений по умолчанию описывается в разделе Раздел 6.5.3, «Синтаксис оператора CREATE TABLE ».

Вы также можете использовать ключевое слово DEFAULT для того, чтобы установить столбец в его значение по умолчанию (новшество в MySQL 4.0.3). Это облегчает написание INSERT. присвающим значения всем, за исключением одного-двух, столбцам, т.к. такой ситнаксис позволяет вам обойтись без указания списка столбцов, которые оператор INSERT должен обновить.

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

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

Выражение expression может относится к любому столбцу, который ранее был внесен в список значений. Например, можно указать следующее:

Но нельзя указать:

Если указывается ключевое слово LOW_PRIORITY. то выполнение данной команды INSERT будет задержано до тех пор, пока другие клиенты не завершат чтение этой таблицы. В этом случае данный клиент должен ожидать, пока данная команда вставки не будет завершена, что в случае интенсивного использования таблицы может потребовать значительного времени. В противоположность этому команда INSERT DELAYED позволяет данному клиенту продолжать операцию сразу же. See Раздел 6.4.4, «Синтаксис оператора INSERT DELAYED ». Следует отметить, что указатель LOW_PRIORITY обычно не используется с таблицами MyISAM. поскольку при его указании становятся невозможными параллельные вставки. See Раздел 7.1, «Таблицы MyISAM ».

Если в команде INSERT со строками, имеющими много значений, указывается ключевое слово IGNORE. то все строки, имеющие дублирующиеся ключи PRIMARY или UNIQUE в этой таблице, будут проигнорированы и не будут внесены. Если не указывать IGNORE. то данная операция вставки прекращается при обнаружении строки, имеющей дублирующееся значение существующего ключа. Количество строк, внесенных в данную таблицу, можно определить при помощи функции C API mysql_info().

Если вы указываете ON DUPLICATE KEY UPDATE (новшество в MySQL 4.1.0), и производится вставка строки, которая вызывает ошибку дублирующегося первичного ( PRIMARY ) или уникального ( UNIQUE ) ключа, то вполняется UPDATE старой строки.

Если a определяется как UNIQUE и уже содержит 1. то тогда вышеуказанная команда будет аналогична следующей:

Внимание: если столбец b также является уникальным ключем, то UPDATE переписывается как:

и если несколько записей соответствуют a=1 OR b=2 только одна запись будет обновлена! В общем случае, следует избегать использования ON DUPLICATE KEY на таблицах со множеством уникальных ( UNIQUE ) ключей.

Когда используется ON DUPLICATE KEY UPDATE. опция DELAYED будет проигнорирована.

Если MySQL был сконфигурирован с использованием опции DONT_USE_DEFAULT_FIELDS. то команда INSERT будет генерировать ошибку, если явно не указать величины для всех столбцов, которые требуют значений не- NULL. See Раздел 2.3.3, «Типичные опции configure ».

С помощью функции mysql_insert_id можно найти величину, использованную для столбца AUTO_INCREMENT. See Раздел 8.4.3.31, « mysql_insert_id() ».

Если задается команда INSERT. SELECT или INSERT. VALUES со списками из нескольких значений, то для получения информации о данном запросе можно использовать функцию C API mysql_info(). Формат этой информационной строки приведен ниже:

Duplicates показывает число строк, которые не могли быть внесены, поскольку они дублировали бы значения некоторых существующих уникальных индексов. Указатель Warnings показывает число попыток внести величину в столбец, который по какой-либо причине оказался проблематичным. Предупреждения возникают при выполнении любого из следующих условий:

Внесение NULL в столбец, который был объявлен, как NOT NULL. Данный столбец устанавливается в значение, заданное по умолчанию.

Установка числового столбца в значение, лежащее за пределами его допустимого диапазона. Данная величина усекается до соответствующей конечной точки этого диапазона.

Занесение в числовой столбец такой величины, как '10.34 a'. Конечные данные удаляются и вносится только оставшаяся числовая часть. Если величина вовсе не имеет смысла как число, то столбец устанавливается в 0.

Внесение в столбцы типа CHAR. VARCHAR. TEXT или BLOB строки, превосходящей максимальную длину столбца. Данная величина усекается до максимальной длины столбца.

Внесение в столбец даты или времени строки, недопустимой для данного типа столбца. Этот столбец устанавливается в нулевую величину, соответствующую данному типу.

Источник: http://phpclub.ru/mysql/doc/insert.html

Источники: http://m.habrahabr.ru/post/123636/, http://www.spravkaweb.ru/mysql/sql/insert, http://phpclub.ru/mysql/doc/insert.html




Комментариев пока нет!

Поделитесь своим мнением




Статьи по теме