Доступ к готовым решениям

Переход в группу "Пользователь"

300.00
Одноразовый платёж
Быстрый переход в группу "Пользователи", без надобности написания постов и ожидания.

Покупка дает возможность:
Быть полноправным участником форума
Нормальное копирование кода
Создавать темы
Скачивать файлы
Доступ к архиву Pawno-Info

Мануал Запросы в MySQL

Vladislavspawn

Изучающий
Пользователь
Регистрация
20 Апр 2020
Сообщения
689
Лучшие ответы
16
Репутация
225
Награды
1
Здравствуйте, нашел одну тему "Основные запросы mysql" но там показывается лишь малая часть запросов.
Сегодня в данном мануале мы рассмотрим запросы в MySQL и так-же научимся их создавать.

Начнем пожалуй с самого главного. Как используются эти запросы? Что необходимо что бы их создавать?
- Запросы необходимы, что бы передавать информацию в базу данных. Создавать таблицу/удалять таблицу а так-же для обновления данных или что-то другого. Для запросов нам необходимо: Умение форматировать сами запросы (format) и сам mysql_connect. Рассмотрим так.
У меня есть mysql_connect(mysql, "host", "login", "password", "base"); - это пример!!! Значит в отправлении запроса то есть mysql_query или кодировка mysql_tquery мы будем использовать mysql (у всех по разному), то есть получится у нас как то так: mysql_query(mysql, query);
mysql - название нашего mysql_connect, query - то что мы отправляем. То есть format(query, sizeof(query), "INSERT INTO `accounts` (`id`, `name`, `password`) VALUES ('%s', '%s', '%s')", id, PlayerName, password); как то так.


И так, думаю пора начать. Расскажу я вам сейчас как именно создаются запросы, и об их типах:
-
Запросы создаются достаточно легко, нам нужно иметь код состоящий из 3-4 строчек.
C++:
new query[160]; // Создаем массив query в [] указываем количество символов которые использует массив.
format(query, sizeof(query), "INSERT INTO `giveleader` (`player`, `leaderka`) VALUES ('%s', '%s')", PlayerName(playerid), params[0]); // Сам запрос, тут: 133 символов
mysql_query(mysql, query); // тут 26 символов
return true;
Итог наших символов - 159, округлим до 160 и вставим результат символов в []
Что получается? Мы подаем запрос в базу данных, который создает новое поле в таблице giveleader с значениями player, leaderka. В которых будет указан ник игрока и запрошенная лидерка. Конечно же компилятор выдаст нам ошибки, что "params[0]" не задефайнен. Так-же у вас может выдать ошибку ещё и по PlayerName(playerid) в вашем случае вместо PlayerName нужно вставлять по своему моду (PN, PName, GetPlayerName, name). Как же избежать ошибки что params[0] не задефайнен? Правильно, нам нужна сама команда, через которую запрос будет отправляться.
C++:
CMD:giveleader(playerid, params[])
{
    if(sscanf(params, "s", params[0])) return SendClientMessage(playerid, -1, "Используйте /giveleader [Название организации]"); // Выводим текст пользователю в чат, если он написал пустое значение /giveleader
    new query[160]; // Создаем переменнуюq query в [] указываем количество символов которая использует переменная.
    format(query, sizeof(query), "INSERT INTO `giveleader` (`player`, `leaderka`) VALUES ('%s', '%s')", PlayerName(playerid), params[0]); // Сам запрос, тут: 133 символов
    mysql_query(mysql, query); // тут 26 символов
    return true;
}
Вот и простенький пример-код, как мы используем запросы в базу данных. Теперь перейдем к самим запросам:

C++:
SELECT * FROM `test` WHERE `test` = 'test' LIMIT 1
Этот запрос в базу данных, запрашивает какие поля необходимо выгрузить из базы данных и какое поле должно быть ОБЯЗАТЕЛЬНЫМ. Теперь немного разберем об LIMIT 1, он ограничивает загрузку. Возможно вы зададитесь вопросом почему это важно и зачем ставить LIMIT 1? Представьте, что у вас имеется в таблице около 300 тысяч каких-то полей например аккаунтов. Зашел новый игрок на наш сервер, необходимо теперь найти его аккаунт. Без LIMIT 1 база данных находит аккаунт игрока и продолжает поиск аккаунта. Почему так возникает? База данных может думать, что где-то ещё есть запись где обязательное поле совпадает. Это создает дополнительную нагрузку на базу данных.

C++:
UPDATE `test` SET `test` = 'test' WHERE `test2` = 'test2' LIMIT 1
Данный запрос в базу данных обновляет существующую запись, после SET указываются поля которые базе данных необходимо будет обновить, потом обязательное поле которое должно совпадать. И LIMIT 1 зачем он нужен объяснено уже выше.

C++:
INSERT INTO `test` (`test1`, `test2`) VALUES ('test5', 'test6')
Вот этот запрос создает уже поле, мы разобрали пример этого запроса немного выше где создавали команду /giveleader, когда запрос отправляется в таблице "test" в полях "test1", "test2" которые указаны в структуре таблицы, создает новое поле с значениями:
test1 = test5
test2 = test6


С простыми основами покончено, переходим к запросам поинтереснее.
C++:
SELECT * FROM (SELECT * FROM `test` WHERE `` = '' ORDER BY `id` DESC LIMIT 3) AST ORDER BY `id` ASC)
Данный запрос возвращает последние 3 записи и ставит их в обратном порядке. Например, у вас последние записи таковы:
Чтобы видеть скрытое содержание Зарегистрируйтесь на форуме!

Простой запрос
C++:
SELECT * FROM `test` WHERE `` = '' ORDER BY `id` DESC LIMIT 3
Вернул бы вам их в таком порядке:


  • OFNZdHdoOXBEbTA2NWovaGhHcE8ya0hDVFhFZUZCZkMxWGZqemx3UFg0bUl4bXUrZXpkbGN1cGRjTHlQQ2NxLzo6BFeNwxm6Dcy4Vs9fHXf7PQ==

  • UXZ6UW55TXVlK3pwQ0FKTVJxVjE3V01KU3BGbnpkOTZ2WTViU3VNZ3lDalNLNWxaZWU3bysyL1diaTdOSVlMcmpraE5ZbWNza0drS2FjZ0pIaWxPdG5BYVNNNFE1aUpaNWlkN3JuSy9wOVV0QnRCUngvVFFlOVVrcTIvZEVRVHMyazZ4WXFVK1ErTlR1ajR3cFA2dFc3RVlMMERNUWdMQ2xjNlZvc0Q1TjFtZmNxd1Fobzhyb3cyRFI2S0VONi9SOjqwAD2wbJmJGLQ1Rt8Y/ 5rO

  • NzVyOFQvS3NST243RFROdnl0YTNoZGR5MGJWVXpETm9Xams0VVc0SlVHU2NFL2phdzZHenJaNmxZa0hFakMrMWxnWjc4OGhvMXFiZEx2UXZ2aUczTm5QdngzWEU0TUxxakc1N2ZKanNRRE5ZRVA1TlY1Z2lSb3NBOHlqLzZ6K2lkVUxjaG8wL3RzK2doRDRidDhIRURBPT06OlQU08qclYsK5lc2A3ZI4S4=
Запрос выше развернет их наоборот:

  • NzVyOFQvS3NST243RFROdnl0YTNoZGR5MGJWVXpETm9Xams0VVc0SlVHU2NFL2phdzZHenJaNmxZa0hFakMrMWxnWjc4OGhvMXFiZEx2UXZ2aUczTm5QdngzWEU0TUxxakc1N2ZKanNRRE5ZRVA1TlY1Z2lSb3NBOHlqLzZ6K2lkVUxjaG8wL3RzK2doRDRidDhIRURBPT06OlQU08qclYsK5lc2A3ZI4S4=

  • UXZ6UW55TXVlK3pwQ0FKTVJxVjE3V01KU3BGbnpkOTZ2WTViU3VNZ3lDalNLNWxaZWU3bysyL1diaTdOSVlMcmpraE5ZbWNza0drS2FjZ0pIaWxPdG5BYVNNNFE1aUpaNWlkN3JuSy9wOVV0QnRCUngvVFFlOVVrcTIvZEVRVHMyazZ4WXFVK1ErTlR1ajR3cFA2dFc3RVlMMERNUWdMQ2xjNlZvc0Q1TjFtZmNxd1Fobzhyb3cyRFI2S0VONi9SOjqwAD2wbJmJGLQ1Rt8Y/ 5rO

  • OFNZdHdoOXBEbTA2NWovaGhHcE8ya0hDVFhFZUZCZkMxWGZqemx3UFg0bUl4bXUrZXpkbGN1cGRjTHlQQ2NxLzo6BFeNwxm6Dcy4Vs9fHXf7PQ==
Разберем теперь подробнее об новых неизвестных нам полей в запросе

ORDER BY - устанавливает по чему нужно сортировать. В данном случае мы сортируем по id, вы же можете поставить например время или дату.
DESC/ASC - устанавливает с начала или с конца.

Переходим к следующему запросу:
C++:
SLEECT * FROM `test` WHERE concat(``) LIKE '% %'
Этот запрос возвращает похожие записи, в concat мы перечисляем поля в которых нужно произвести поиск (через запятую перечисляем). После LIKE вы указываете что нужно искать между знаками %, что удобно с помощью такого? Например: делать команду поиска аккаунта толь по части ника, а не полностью. Например ник игрока Pawno_Info при вводе Pawno выдаст вам поле с его аккаунтом.

Так-же в MySQL имеются всем привычные операторы, которые почему-то многие не используют:

C++:
` ` > ` `
` ` < ` `
` ` <= ` `
` ` >= ` `
` ` != ` `
` ` = ` `
` ` = ` ` + num
` ` = ` ` - num
В MySQL так-же возможно использование AND - и OR - или. Работают они так же как в ЯСPawn && (AND) и || (OR)

Например, нам необходимо обновить поле где совпадают оба поля.
C++:
UPDATE `test` SET `Money` = `Money` + '20' WHERE `Login` = 's2s.k' AND `Password` = '123456'
Если совпадает только одно из полей:
C++:
UPDATE `test` SET `Money` = `Money` + '20' WHERE `Login` = 's2s.k' OR`Password` = '123456'
Теперь ко всем игрокам, у которых ник или пароль "123456" прибавится +20$ к деньгам.

Так-же можно использовать скобки, например - (true) or (true).
Теперь, если одно из скобок = true (правда), то прибавляется +20$ к деньгам. Можно создавать так сколько угодно скобок, это упростит работу что бы не создавать по тысячи запросов в базу данных.

Теперь, если нам необходимо удалить запись. Мы будем использовать оператора DELETE

C++:
DELETE FROM `test` WHERE `test1` = 'test2'
Мы удалим в таблице test все записи с структурой test1 с значением test2.

Так-же можно отправить несколько запросов сразу через ;

UPD1: Допустил ошибку в запросе, написал AS T хотя должно быть AST исправил.
 
Последнее редактирование:
Сверху Снизу