Сложные запросы используемые в MySQL
Всего лишь пару лет назад, в проектах, которые предусматривали работу с базами данных и построением статистики, основным изобилием используемых SQL-запросов, преобладало в основном множество запросов, ориентированных на стандартную выборку данных и нечасто можно было увидеть другие, которые безо всяких сомнений можно было бы отнести к “эксклюзиву”. Хотя сложность запроса и зависит от количества используемых таблиц, но если мы всего лишь возьмем и выведем данные полей трех или более таблиц имеющих стандартное объединение, то явная сложность такого запроса не выйдет за пределы стандартной.
В данной статье по мере возможности будут рассматриваться те запросы, примеры которых мне найти не удалось и которые, по моему мнению, не относятся к классу простых.
Сравнение данных за две даты
Хотя данная статистика из рода задач довольно редко встречаемых, но все-таки необходимость в ее получении иногда существует. И получить такую статистику ничуть не сложнее других.
Работать мы будем с двумя таблицами, структура которых представлена ниже:
Структура таблицы products
Структура таблицы statistics
Дело в том, что стандарт языка SQL допускает использование вложенных запросов везде, где разрешается использование ссылок на таблицы. Здесь вместо явно указанных таблиц, благодаря использованию псевдонимов, будут применяться результирующие таблицы вложенных запросов с имеющейся связью один – к – одному. Результатом каждой результирующей таблицы будут данные о количестве произведенных заказов некоего товара за определенную дату, полученные путем выполнения запроса на выборку данных из таблицы statistics по требуемым критериям. Иными словами мы свяжем таблицу statistics саму с собой. Пример запроса:
В итоге имеем такой результат:
Подстановка нескольких значений из другой таблицы
Необходимость в данном запросе не является повседневной, но возникает не совсем уж и редко. Самый распространенный пример, это обычная сетевая игра. Где создается сессия на два игрока. Соответственно в таблице с данными об играх имеются два поля с идентификаторами зарегистрированных игроков. Для того чтобы вывести информацию об имеющихся играх, мы не можем обойтись стандартным объединением таблицы с данными об игроках и таблицы об имеющихся играх. Так как мы имеем два поля с идентификаторами неких игроков. Но мы можем обратиться опять за помощью к псевдонимам таблиц.
Демонстрация данного запроса будет происходить на другом примере, а не на примере сетевой игры. Это чтобы не создавать заново все необходимые таблицы. В качестве данных возьмем таблицу products из примера “сравнение данных за две даты” и создадим еще одну недостающую таблицу replace_com, структура которой представлена ниже:
Предположим, что у нас есть некий компьютерный салон и мы проводим модификации некоторых компьютерных составляющих, а все операции по замене комплектующих заносим в базу данных. В таблице replace_com интересующими нас полями являются: sProductID и rProductID. Где sProductID – идентификатор заменяемого модуля, а rProductID – идентификатор заменяющего модуля. Запрос, реализующий вывод данных о совершенных операциях выглядит следующим образом:
Результирующая таблица данных:
Вывод статистики с накоплением по дате
Предположим, что у нас имеется склад с некими товарами. Товары периодически поступают, и нам бы хотелось видеть в отчете остатки товаров по дням. Поскольку данные о наличии товаров необходимо накапливать, то мы введем пользовательскую переменную. Но есть одно небольшое “но”. Мы не можем использовать в запросе переменные пользователя и группировку данных одновременно (вернее можем, но в итоге получим, не то, что ожидаем), но мы можем использовать вложенный запрос, вместо явно указанной таблицы. Данные в таблице будут предварительно сгруппированы по дате. И уже затем на основе этих данных мы произведем расчет статистики с накоплением.
На первом этапе требуется установить переменную и присвоить ей нулевое значение:
MySQL запросы — как единственно верный способ вывода данных
Как только человек начинает работать с множеством данных, возникает необходимость их каким-либо образом упорядочивать и архивировать, поэтому рано, или поздно приходит мысль о создании такого виртуального архива, как база данных, в которой и будет храниться вся необходимая информация. Тогда можно прибегнуть, к примеру, к такой программе, как Microsoft Access .
Создав в ней базу данных, кажется, что дело уже сделано, но уже совсем скоро появится необходимость, которую диктует современная жизнь — это возможность пользоваться всеми данными заключенными в базе через интернет с других компьютеров.
MySQL представляет собой наиболее популярную и распространенную СУБД для сети интернет. Данная СУБД не предназначена для того, чтобы работать с большим количеством информации, но ее возможности позволяют справляться со всеми задачами, необходимыми для работы интернет сайтов как скромных, так и ресурсов приличных размеров.
Чтобы обращаться и собственно работать с БД MySQL существуют определенные команды, которые обычно обозначают как запросы MySQL . Именно с помощью запросов можно выполнять такие манипуляции с базой как удаление, сортировка, изменение, добавление, получение и т.д.
Какими бывают MySQL запросы?
Все существующие команды MySQL можно разделить на простые или легкие для понимания и запоминания и сложные запросы.
Простые запросы MySQL — это команды, для исполнения которых достаточно одной таблицы, так как они производят манипуляции только с одной таблицей из базы.
Сложные запросы MySQL — это команды, которые могут затрагивать одновременно две или даже больше таблиц из одной базы данных.
Чтобы более детально разобраться, в чем же заключается различия между запросами — давайте рассмотрим каждый вид команд по отдельности.
Простые MySQL запросы
Существует два запроса, которые можно назвать максимально или супер простыми.
« Show databases; » — данный запрос выведет на экран список всех имеющихся баз данных.
« Show tables in bd; » — данная команда позволит узнать количество и наименования всех таблиц, которые есть в базе данных под названием bd .
Ну а теперь от супер простых запросов перейдем просто к простым.
Запросы MySQL типа Select
Зная значение слова select , можно понять, что все команды, связанные с данным словом, будут направлены на выбор и просмотр информации хранящейся только в одной таблице принадлежащей к базе.
« SELECT count(*) FROM cart; » — данный запрос позволит узнать, сколько записей содержится в упомянутой таблице:

Запрос « SELECT * FROM cart; » — позволит просмотреть все данные, которые имеются в таблице cart из базы данных:

« SELECT * FROM cart LIMIT 2,3; » — с помощью данного запроса можно выбрать блок данных и вывести его. В данном случае выбраны 3 записи на вывод, начиная со второй строчки. Такой запрос может быть очень полезен для создания блоков со страницами для навигации:

« SELECT * FROM people ORDER BY number; » — данная команда позволит вывести все поля таблицы под названием people в соответствии с полем number в порядке увеличения его значений:

« SELECT * FROM people ORDER BY number DESC; » — данный запрос позволяет выбрать все строки той же таблицы people , только упорядоченные не так как в предыдущем примере, а по убыванию:

« SELECT * FROM people ORDER BY number LIMIT 5; » — этот запрос выбирает из таблицы people только 5 строк, которые располагаются в соответствии с увеличением значения поля number :

« SELECT * FROM people WHERE name=’Anna’; » — данный запрос делает выборку полей таблицы people , в которых в роли значения поля name указана переменная Anna :

« SELECT * FROM people WHERE name LIKE ‘An% ‘;» — выводит только те поля таблицы people , в которых в полях под названием name начинается с букв An :

« SELECT * FROM people WHERE name LIKE ‘%na’ ORDER BY number ;» — запрос выводит данные таблицы people только тогда, когда значение поля name оканчивается буквами na , причем данные выводятся упорядоченными в соответствии с увеличением значения поля number :

« SELECT name, last_name FROM people; » — выводит на экран только данные таблицы people заключенные в полях last_name и name :

« SELECT DISTINCT site FROM cart; » — команда выводит только не повторяющиеся значения поля site из таблицы cart . К примеру, если таблица будет содержать только три значения sit.ru, sit.ru, wi-de.ru , то после работы данной команды будет выведено только два значения — sit.ru и wi-de.ru :

« SELECT * from people where age in (12,15,18); » — данный запрос выведет на экран только те данные из таблицы people , у которых в качестве значения поля под названием age будут указаны цифры 12, 15 или 18:

Запросы MySQL типа Insert
Данные виды запросов к базе данных позволяют вставить необходимую информацию в таблицу. То есть, посредством команд insert можно вставить в таблицу строку, добавив тем самым информацию к базе данных.
« INSERT into cart (sit, des) values (‘sit.ru’, ‘Sit-разработка сайтов’) » — данный запрос позволит вставить в таблицу базы под названием cart еще одну строку, у которой в поле sit будет значение sit.ru а в поле des значение Sit -разработка сайтов.
Запросы MySQL типа Update
Данный вид запросов занимается изменением данных уже имеющихся в базе.
« UPDATE cart set sit = ‘do.com’ where » — запрос изменит значение, записанное в поле sit таблицы cart , в строке, номер id которой равен 3, на значение do.com .
Запросы MySQL типа Delete
Запросы данного типа позволяют производить удаление записей таблицы, являющейся частью базы данных.
« DELETE from cart where » — данной командой удаляется вся информация из строки, id которой соответствует 3 в таблице cart .
Сложные запросы MySQL
Как уже было сказано ранее, сложный тип запросов — это запросы, которые способны одновременно задействовать две или даже больше двух таблиц в базе. Для того чтобы осознать принципы построения подобных команд рассмотрим хотя бы некоторые из них.
« SELECT DISTINCT name FROM people, address WHERE people.adress_no = ads.addr_no AND city LIKE ‘L%’; » — запрос сортирует и выводит все уникальные значения, записанные в поле name таблицы people , которые проживают по адресу с названием, начинающимся на букву L в соответствии со значением поля addr_no из таблицы баз под названием ads .
Данный запрос иначе может быть введен так:
« SELECT DISTINCT name FROM people p, ads a WHERE p.adress_no = a.addr_no AND city LIKE ‘L%’; ».
Оба этих запроса выведут на экран одно и то же. Если присмотреться, то подобные запросы не слишком то и сложны, главное точно знать наименование таблицы и через точку указать наименование поля, или же дать таблицам сокращенные имена для удобства и скорости ввода.
« SELECT her.char_name, her.cnt, char_temp.ClassName FROM char_temp, her WHERE char_temp.ClassId = her.class_id Order by char_temp.ClassName; » — Данный запрос позволяет вывести на экран данные из полей char_name , и cnt таблицы базы под названием her и поля ClassName из таблицы char_temp благодаря тому, что значения полей ClassId таблицы char_temp и class_id таблицы her имеют одинаковые идентификаторы. Данные выводятся в упорядоченном виде по полю ClassName таблицы char_temp .
В сокращенном виде данная команда будет выглядеть так: « SELECT char_name, cnt, ClassName FROM her left join char_temp on her.class_id=char_temp.ClassId; ».
Если суть построения команд для вас стала понятной, то вы без труда сможете составлять сложные запросы, используя не только команду SELECT , но и команды UPDATE, DELETE, INSERT и другие.
Вложенные запросы MySQL
Во время работы с таблицами баз данных, особенно в деле разработки сайтов, зачастую возникает необходимость работать с множеством различных таблиц, пользуясь сложными запросами, но в иных случаях такое использование запросов может быть крайне неудобно и даже чересчур сложно. Да и к тому же множество запросов может сделать сайт слишком медленным.
Именно для того, чтобы избежать таких проблем MySQL делает возможным включение одного запроса в состав другого. Такие двойные запросы называются вложенные запросы или подчиненные. В подобных запросах оператор SELECT , который располагается внутри запроса, заключается в круглые скобки.
Сначала выполняется запрос, который располагается в скобках, а затем с теми данными, которые этот запрос предоставил, работает главный запрос.
Рассмотрим на примере. Допустим, в нашей базе данных есть две таблицы. Первая таблица под названием Cat :

И вторая таблица под названием STR :

Наша задача заключается в том, чтобы с помощью вложенного запроса взять данные обеих таблиц и в итоге вывести на экран информацию о том, к какому имени раздела, сколько статей относиться.
Выглядеть данный запрос будет следующим образом: « SELECT (SELECT COUNT(*) FROM `STR` WHERE STR.category_id = cat.id) as `count`, cat.name FROM cat/ ».
Первым будет выполняться запрос в скобках ( SELECT COUNT(*) FROM ` STR ` WHERE STR.category_id = cat.id ), который предоставит информацию обо всех категориях, а в нем уже сделаем выборку для того, чтобы вычислить количество страниц, предназначенных для указанных категорий, посредством запроса « SELECT (*) as `count`, cat.name FROM cat ».
Быстрота вывода результатов запроса
Для того чтобы однотипные запросы к базе данных выполнялись быстрее, возникла необходимость в том, чтобы производить кэширование MySQL запросов.
Данный процесс позволяет пред выполнением того или иного запроса проверить наличие его результата в кэше, и если данные результаты есть, вывести их, не выполняя мероприятия по выполнению полученного запроса.
Если же данных в кэше не обнаружено, тогда запрос выполняется, и его результаты записываются, чтобы при следующем подобном запросе не задействовать механизмы его выполнения. Таким образом, время отклика сервера значительно сокращается и сервер не перегружается даже в случае огромного количества однотипных запросов.
PHP и MySQL
СУБД MySQL — это одна из множества баз данных, поддерживаемая языком программирования PHP . Запросы к MySQL во время создания веб-страниц это обычное дело, потому что основная информация как раз таки и хранится в таблицах базы данных и чтобы вывести ее на экран, необходимы PHP запросы к MySQL .
Для того чтобы работать с MySQL в документах PHP предусмотрен специализированный алгоритм действий:
- Установка соединения с базой данных при помощи команды mysql_connect();
- Выбор необходимой базы данных командой mysql_select_db();
- PHP запросы к MySQL через команду mysql_query();
- Обработка результата запроса mysql_fetch_array();
- Закрытие соединения с базой данных или отключение от сервера БД mysql_close();
Из всего описанного можно понять, что работать с базами MySQL не так то и сложно, главное — суметь понять и правильно строить запросы к нужной информации.
Если вы освоите правила построения запросов MySQL , тогда ваш сайт будет работать гораздо быстрее, и даже в случае если его одновременно будут использовать множество пользователей, это не сможет существенно отразиться на скорости открытия страниц.
Что такое сложный запрос mysql
Эта статья будет полезна как для начинающих пользователей базы данных (БД) mysql, так и для профессионалов. Потому что мы будем рассматривать как простые mysql запросы, так и сложные mysql запросы. Если вы начинающий программист и не знаете, о чем идет речь, в пару словах попытаемся объяснить.
MySQL запрос – это обращение к базе данных MySQL, с помощью которого мы можем реализовать: получение, изменение, удаление, сортировку, добавление, и другие манипуляции с данными базы.
Все mysql запросы поделены на простые и сложные запросы. Нами также выделена категория очень простых запросов, структура которых очень понятна и не требует дополнительных разъяснений.
Простые mysql запросы – запросы в которых участвует одна таблица базы данных.
Сложные mysql запросы – запросы в которых могут участвовать две и более таблиц БД.
Подробнее о базе данных mysqlвы можете узнать на страницах статей нашего сайта. А сейчас перейдем ближе к теме.
Очень простые mysql запросы
Выведет список всех баз.
Покажет список всех таблиц в базе данных base_name.
Простые mysql запросы
Зная структуру БД, таблиц в БД и полей, можно посылать следующие запросы в MySQL.
Select запросы – слово select, говорит само за себя, и становится понятно, что пользуясь данными запросами, мы будем выбирать (читать) информацию из БД.
SELECT count(*) FROM table_name;
Выведет количество всех записей в таблице
Выбирает все записи из таблицы БД
Выбирает 3 записи из таблицы, начиная с 2 записи. Этот запрос полезен при создании блока страниц навигации.
Пример mysql запроса
Выберет все записи из таблицы person в порядке возрастания значений поля number.
Пример mysql запроса
Выбирает все записи из person, но уже в порядке убывания (т.е. в обратном порядке).
Пример mysql запроса
Выбирает 5 записей из таблицы person, в порядке возрастания.
Пример mysql запроса
Выбирает все записи из таблицы person, где поле name соответствует значению Anna.
Пример mysql запроса
Выбирает все записи из таблицы person, в которой значения поля nameначинаются с An.
Пример mysql запроса
Выбирает все записи из таблицы person, где name заканчивается на na, и упорядочивает записи в порядке возрастания значения number.
Пример mysql запроса
Выбирает все значения полей nameи last_name из таблицы person.
Пример mysql запроса
Выбирает уникальные (DISTINCT) значения поля siteиз таблицы table_name. Например, при 5 значениях поля site: sitear.ru, sitear.ru, sitear.ru, yaveterinar.ru, wi-korporaciya.ru; выведет только 3 уникальные значения: sitear.ru, yaveterinar.ru, wi-korporaciya.ru;
Пример mysql запроса
Выведет все записи таблицы personв которых значения поля age будет равно 12 или 15 или 18.
Пример mysql запроса
Выберет максимальное значение age из таблицы person.
Пример mysql запроса
Выберет минимальное значение age из таблицы person.
Пример mysql запроса
Insert запросы – данные запросы позволяют вставить запись в таблицу БД. Другими словами создать строку в таблице или добавить информацию в таблицу БД.
insert into table_name(site, description) values (‘sitear.ru’, ‘SiteAR – созданиесайтов’)
Вставит в таблицу table_name, а точнее в поля site и description данной таблицы, соответствующие значения.
Update запросы — направлены на изменение уже имеющихся данных в таблице БД.
update table_name set site = ‘domain.com’ where
Изменяет значение поля site на domain.com в таблице table_name где id равен 3.
Delete запросы – удаляют записи из таблицы БД.
delete from table_name where
Удаляет запись из table_name где id равен 3.
Сложные mysql запросы
Как уже упоминалось раньше, сложные mysql запросы, работают более, нежели с одной таблицей БД. Данные mysql запросы, мы будем рассматривать более в индивидуальном порядке, так как они сложные и их будет немного.
Выводит все уникальные фамилии людей (last_name), которые живут в городе с названием на букву L. (предполагаем, что в таблице address есть поля address_no, city).
Данные примеры сложных mysql запросов, выведут один и тот же результат. Запросы не очень то и сложные, нужно только указать имя таблицы БД, а потом, через точку указать поле таблицы. Или же можно, как во втором примере, дать короткие имена таблицам (p для person, adr для address). Результат запросов будет один и тот же.
Берем из таблицы heroes поле char_name, из heroes поле count, из таблицы char_templates поле ClassName, где char_templates.ClassId и heroes.class_id имеют общий идентификатор и сортируем запрос по имени класса героев.
Таким же образом, можно подавать сложные mysql запросы с помощью update, insert, delete и др.
Примеры SQL-запросов в MariaDB (MySQL)
В инструкции мы рассмотрим пример запросов MySQL/MariaDB, которые будут интересны новичкам или опытным пользователям в качестве шпаргалки.
Все запросы, за исключением выборки, несут потенциальную опасность для данных, которые хранятся в базе. Перед началом работы с рабочей базой, сделайте резервную копию.
Простые примеры использования SELECT
> SELECT <fields1> FROM <table> [JOIN <table2>] [ WHERE <conditions> ORDER BY <fields2> LIMIT <count> ]
* где fields1 — поля для выборки через запятую, также можно указать все поля знаком *; table — имя таблицы, из которой вытаскиваем данные; conditions — условия выборки; fields2 — поле или поля через запятую, по которым выполнить сортировку; count — количество строк для выгрузки.
* запрос в квадратных скобках не является обязательным для выборки данных.
1. Обычная выборка данных
> SELECT * FROM users
* в данном примере мы получаем список всех записей из таблицы users.
2. Выборка данных с объединением двух таблиц (JOIN)
SELECT u.name, r.* FROM users u JOIN users_rights r ON r.user_id=u.id
* в данном примере идет выборка данных с объединением таблиц users и users_rights. Объединяются они по полям user_id (в таблице users_rights) и id (users). Извлекается поле name из первой таблицы и все поля из второй.
3. Выборка с интервалом по времени и/или дате
Варианты запросов и примеров могут быть самые разные. Мы рассмотрим те, с которыми чаще всего приходилось иметь дело автору.
а) известна точка начала и определенный временной интервал:
> SELECT * FROM users WHERE date >= DATE_SUB(NOW(), INTERVAL 1 HOUR)
* будут выбраны данные за последний час (поле date).
б) известны дата начала и дата окончания:
> SELECT * FROM users WHERE date >= '2017-10-25' AND date <= '2017-11-25'
* выбираем данные в промежутке между 25.10.2017 и 25.11.2017.
в) известны даты начала и окончания + время:
> SELECT * FROM users WHERE DATE(date) BETWEEN '2018-03-25 00:15:00' AND '2018-04-25 15:33:09';
* выбираем данные в промежутке между 25.03.2018 0 часов 15 минут и 25.04.2018 15 часов 33 минуты и 9 секунд.
г) вытаскиваем данные за определенные месяц и год:
> SELECT * FROM study WHERE MONTH(date) = 4 AND YEAR(date) = 2018
* извлечем данные, где в поле date присутствуют значения для апреля 2018 года.
д) текущая дата минут год:
> SELECT * FROM study WHERE date < (CURDATE() — INTERVAL 1 YEAR)
* мы получим данные, которые имеют в колонке date дату, старше одного года.
4. Выборка максимального, минимального и среднего значения
> SELECT max(area), min(area), avg(area) FROM country
* max — максимальное значение; min — минимальное; avg — среднее.
5. Использование длины строки
> SELECT * FROM users WHERE CHAR_LENGTH(name) = 5;
* данный запрос должен показать всех пользователей, имя которых состоит из 5 символов.
6. Использование лимитов (LIMIT)
Применяется для ограничения количества выводимых результатов. Синтаксис:
<основной запрос> LIMIT [<число2>,] <число1>
* где число1 — сколько результатов вернуть; число2 — сколько результатов пропустить, необязательный параметр — если его не писать, то отсчет начнется с первой строки.
а) извлечь максимум 15 строк:
> SELECT * FROM users LIMIT 15;
б) выбрать строки с 16 по 25 (запрос со смещением):
> SELECT * FROM users LIMIT 15, 10;
* 15 строк пропускаем, 10 извлекаем.
Примеры более сложных запросов или используемых редко
1. Объединение с группировкой выбранных данных в одну строку (GROUP_CONCAT)
> SELECT GROUP_CONCAT(DISTINCT CONVERT(id USING 'utf8') SEPARATOR ', ') as ids FROM users
* из таблицы users извлекаются данные по полю id, все они помещаются в одну строку, значения разделяются запятыми.
2. Группировка данных по двум и более полям
> SELECT * FROM users GROUP BY CONCAT(title, '::', birth)
* итого, в данном примере мы сделаем выгрузку данных из таблицы users и сгруппируем их по полям title и birth. Перед группировкой мы делаем объединение полей в одну строку с разделителем ::.
3. Объединение результатов из двух и более таблиц (UNION)
а) простой вариант использования UNION:
> (SELECT id, fio, address, 'Пользователи' as type FROM users)
UNION
(SELECT id, fio, address, 'Покупатели' as type FROM customers)
* в данном примере идет выборка данных из таблиц users и customers.
б) если нам нужно использовать WHERE после UNION, запрос будет сложнее:
> SELECT * FROM (
(SELECT id, fio, address, 'Пользователи' as type FROM users)
UNION
(SELECT id, fio, address, 'Покупатели' as type FROM customers)
) as U
WHERE U.address LIKE "Садовая%"
4. Выборка средних значений, сгруппированных за каждый час
SELECT avg(temperature), DATE_FORMAT(datetimeupdate, '%Y-%m-%d %H') as hour_datetime FROM archive GROUP BY DATE_FORMAT(datetimeupdate, '%Y-%m-%d %H')
* здесь мы извлекаем среднее значение поля temperature из таблицы archive и группируем по полю datetimeupdate (с разделением времени за каждый час).
5. Использование операторов IF и CASE
Данные операторы позволяют определять исход запроса исходя из условия.
а) выбрать пол мужской или женский:
SELECT IF(sex = 'm', 'мужчина', 'женщина') as sex FROM people
* в данном примере мы возвращаем слово «мужчина», если поле sex равно 'm', иначе — «женщина».
б) заменяем идентификатор времени года более понятным человеку значением:
SELECT CASE season_id WHEN 1 THEN 'зима' WHEN 2 THEN 'весна' WHEN 3 THEN 'лето' WHEN 4 THEN 'осень' ELSE 'неправильный идентификатор времени года' END as season FROM ` seasons
* в данном примере мы используем оператор CASE. Если 1, то вернем слово «зима», если 2 — «весна» и так далее.
Вставка (INSERT)
> INSERT INTO <table> (<fields>) VALUES (<values>)
> INSERT INTO <table> VALUES (<values>)
* где table — имя таблицы, в которую заносим данные; fields — перечисление полей через запятую; values — перечисление значений через запятую.
* первый вариант позволит сделать вставку только по перечисленным полям — остальные получат значения по умолчанию. Второй вариант потребует вставки для всех полей.
1. Вставка нескольких строк одним запросом:
> INSERT INTO cities (`name`, `country`) VALUES ('Москва', 'Россия'), ('Париж', 'Франция'), ('Фунафути' ,'Тувалу');
* в данном примере мы одним SQL-запросом добавим 3 записи.
2. Вставка из другой таблицы (копирование строк, INSERT + SELECT):
Синтаксис при копировании строк из одной таблицы в другую выглядит так:
> INSERT INTO <table1> SELECT * FROM <table2> WHERE <условие для select>;
* где table1 — куда копируем; table2 — откуда копируем.
а) скопировать все без разбора:
> INSERT INTO cities-new SELECT * FROM cities;
* в данном примере мы скопируем все строки из таблицы cities в таблицу cities-new.
б) скопировать определенные столбцы строк с условием:
> INSERT INTO cities-new (`name`, `country`) SELECT `name`, `country` FROM cities WHERE name LIKE 'М%';
* извлекаем все записи из таблицы cities, названия которых начинаются на «М» и заносим в таблицу cities-new.
в) копирование с обновлением повторяющихся ключей.
Если копировать таблицы несколько раз, то может возникнуть проблема повторения первичного ключа. В базах данных значения таких ключей должны быть уникальными и при попытке вставить повтор мы получим ошибку «Duplicate entry 'xxx' for key 'PRIMARY'». Чтобы новые строки вставить, а повторяющиеся обновить (если есть изменения), используем «ON DUPLICATE KEY UPDATE»:
> INSERT INTO cities-new SELECT * FROM cities ON DUPLICATE KEY UPDATE `name`=VALUES(`name`), `country`=VALUES(`country`);
* в данном примере, как и в предыдущих, мы копируем данные из таблицы cities в таблицу cities-new. Но при совпадении значений первичного ключа мы будем обновлять поля name и country.
Обновление (UPDATE)
* где table — имя таблицы; field — поле, для которого будем менять значение; value — новое значение; conditions — условие (без него делать update опасно — можно заменить все данные во всей таблице).
Обновление с использованием замены (REPLACE):
UPDATE cities SET name = REPLACE(name, 'Масква', 'Москва');
UPDATE cities SET name = REPLACE(name, 'Масква', 'Москва') WHERE country = 'Россия';
UPDATE cities SET name = REPLACE(name, 'Ма', 'Мо') WHERE name = 'Масква';
Если мы хотим перестраховаться, результат замены можно сначала проверить с помощью SELECT:
SELECT REPLACE(name, 'Ма', 'Мо') FROM cities WHERE name = 'Масква';
Удаление (DELETE)
> DELETE FROM <table> WHERE <conditions>
* где table — имя таблицы; conditions — условие (как и в случае с UPDATE, использовать DELETE без условия опасно — СУБД не запросит подтверждения, а просто удалит все данные).
Более сложный вариант — удаление данных с объединением таблиц. Запрос будет такого вида:
> DELETE u FROM users u JOIN users_rights r ON r.user_id=u.id WHERE r.admin='1'
* в данном примере мы удалим записи только из таблицы users (u), которые при объединении с таблицей users_rights будут соответствовать условию r.admin='1'.
Создание таблицы
> CREATE TABLE <table> (<field1> <options1>, <field2> <options2>) <table options>
> CREATE TABLE IF NOT EXISTS `users_rights` (
`id` int(10) unsigned NOT NULL,
`user_id` int(10) unsigned NOT NULL,
`rights` int(10) unsigned NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
* где table — имя таблицы (в примере users_rights); field1, field2 — имя полей (в примере создается 3 поля — id, user_id, rights); options1, options2 — параметры поля (в примере int(10) unsigned NOT NULL); table options — общие параметры таблицы (в примере ENGINE=InnoDB DEFAULT CHARSET=utf8).
Использование запросов в PHP
Подключаемся к базе данных:
mysql_connect ('localhost', 'login', 'password') or die ("MySQL connect error");
mysql_select_db ('db_name');
mysql_query("SET NAMES 'utf8'");
* где подключение выполняется к базе на локальном сервере (localhost); учетные данные для подключения — login и password (соответственно, логин и пароль); в качестве базы используется db_name; используемая кодировка UTF-8.
Также можно создать постоянное подключение:
mysql_pconnect ('localhost', 'login', 'password') or die ("MySQL connect error");
* однако есть вероятность достигнуть максимально разрешенного лимита хостинга. Данным способом стоит пользоваться на собственных серверах, где мы сами можем контролировать ситуацию.
* в PHP выполняется автоматически, кроме постоянных подключений (mysql_pconnect).
Запрос к MySQL (Mariadb) в PHP делается функцией mysql_query(), а извлечение данных из запроса — mysql_fetch_array():
$result = mysql_query("SELECT * FROM users");
while ($mass = mysql_fetch_array($result)) <
echo $mass[name] . '<br>';
>
* в данном примере выполнен запрос к таблице users. Результат запроса помещен в переменную $result. Далее используется цикл while, каждая итерация которого извлекает массив данных и помещает его в переменную $mass — в каждой итерации мы работаем с одной строкой базы данных.
Используемая функция mysql_fetch_array() возвращает ассоциативный массив, с которым удобно работать, но есть еще альтернатива — mysql_fetch_row(), которая возвращает обычный нумерованный массив.
Экранирование
При необходимости включения в строку запроса спецсимвола, например, %, необходимо использовать экранирование с помощью символа обратного слэша — \
> SELECT * FROM producrions WHERE kpd = '100\%'
* если выполнить такой запрос без экранирования, знак %, будет восприниматься как любое количество символов после 100.
Использование переменных
Пременные задаются с помощью знака собаки, например:
> SET @number = 101;
* мы создали переменную number со значением 101.
Теперь можно применить переменную в запросе, например:
> INSERT INTO users (`user_number`, `user_name`) VALUES (@number, CONCAT('Пользователь ', @number));