Базы данных на пальцах (для новичков)

volody00

Client
Регистрация
06.09.2016
Сообщения
929
Благодарностей
1 019
Баллы
93
Пишу статью по заявке @Konrod_m . Так-то не собирался участвовать, т.к. банально не знал, о чём написать. Ну раз уж идею для статьи подкинули, то быстренько публикуюсь в последний момент. Итак, без долгих предисловий погнали.

Зачем нужна БД

Я сам долгое время не пользовался БД и не понимал, а зачем она. Теперь же я не представляю, как без неё работать. Итак, представим, что у нас есть такая таблица с аккаунтами
A1.png
Логин, пароль, ссылка на стр, путь к профилю, статус, живой или нет, прокси, дата регистрации, последняя активность, предназначение, количество активных действий.
Итак, пусть у вас данные в обычной таблице excel. Как вы будете отбирать аккаунт, если вам хочется, скажем, отобрать вот такой:
Дай мне логин, пароль, путь к профилю от аккаунта, у которого возраст не менее 14 дней, он сейчас свободен, его предназначение является парсинг, его прокси сейчас не занят и он сделал менее 100 активных действий и при этом он должен быть использован позже всех. Если отбирать из таблицы, то у нас будет просто гора условий типа:
Код:
Если
{
     Если
     {
         если {}
     }
}
И т.д. Короче, нереально. В БД же всё делается одной строкой вроде:
SQL:
SELECT login, PASSWORD, link FROM db_vkaccounts WHERE STATUS='свободен' AND db_vkaccounts.CHECK='живой' AND destination='парсинг' AND kolPostov < 100 AND date_registration > '2021-02-07' ORDER BY last_activity LIMIT 1
И составлять такие запросы совсем несложно, в чём вы сможете убедиться далее.

Установка

1.png

2.png

3.png

Затем надо добавить свой айпи

4.png

Если у вас айпи меняется (как у меня), можете добавить диапазон. Например, я для основного ПК сделал так:

177.51.31.*

177.51.32.*

И т.д. до 39

Далее нам понадобится программка HeidiSQL - https://www.heidisql.com/download.php. Она нужна для того, чтобы видеть вашу БД в виде таблички. Там же будем тестировать SQL запросы.
5.png

Установка простая: жмем далее, далее и всё. Затем запускаем, жмем создать и заполняем данные как на скрине

6.png

Имя хоста следующее: mysql.вашЛогин.myjino.ru. Логин-пароль от самого jino.ru

Для создания новой БД жмем правой кнопкой мыши -> создать -> БД

7.png

Щелкаем по нашей БД правой кнопкой мыши -> создать таблицу

8.png

Дадим имя таблице, добавим 3 столбца, нажмем сохранить

9.png

Столбец id – это уникальный идентификатор нашей строки. Чтобы он работал корректно, нам надо сказать, что его значение обязательно должно быть уникальным (правая кнопка мыши по нему)

10.png

А также скажем, что он должен заполняться автоматически без нашего участия (правая кнопка мыши по нему

11.png

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

12.png

Жмем сохранить.

Кратко про типы данных. Я пользуюсь следующими:
  • Varchar – строки
  • Int – числа
  • TimeStamp – дата
  • Enum – перечисление (выбор из нескольких доступных вариантов)
Для добавления столбцов переходим на вкладку данные, жмем на плюсик (или кнопка INSERT) и заполняем имя и возраст (id заполнять не нужно, т.к. мы поставили, чтобы он заполнялся сам).

13.png

Переходим к практике

Начнем с выборок. На самом деле ничего сложного. Переходим во вкладку «Запрос» и составляем первый запрос (просто создайте аналогичную табличку, вставляйте каждый из этих запросов и смотрите, что происходит)

14.png

SQL:
/* Отбери все данные из таблицы zennolab */
SELECT * FROM zennolab
SQL:
/* Отбери данные из столбца name таблицы zennolab */
SELECT name FROM zennolab
P.S. бывает, если имя таблицы совпадает с ключевым словом, БД начинает ругаться. В этом случае можно прописывать имена полностью «таблица.название столбца»:

SQL:
/* Аналогичен предыдущему запросу */
SELECT zennolab.name FROM zennolab
SQL:
/* Отбери данные из столбца name таблицы zennolab, у которого id равен 5 */
SELECT zennolab.name FROM zennolab WHERE id=5
15.png
SQL:
/* Отбери данные из столбца name таблицы zennolab, у которого name равен Нина (обратите внимание, что когда у нас в столбце тип VARCHAR (строка), то надо заключать в одинарные кавычки) */
SELECT zennolab.name, zennolab.age FROM zennolab WHERE zennolab.name='Нина'
SQL:
/* Отбери данные из столбца name таблицы zennolab, у которого name НЕ равен Нина */
SELECT zennolab.name FROM zennolab WHERE NOT zennolab.name='Нина'
SQL:
/* Отбери данные из столбца name таблицы zennolab, у которого age больше 23 (для знаков больше или меньше столбец должен быть числовом (помните, что age у нас int)) */
SELECT zennolab.name FROM zennolab WHERE age > 23
SQL:
/* Отбери данные из столбца name таблицы zennolab, у которого age больше 23 И id больше 2 */
SELECT zennolab.name FROM zennolab WHERE age > 23 AND id > 2
SQL:
/* Отбери данные из столбца name таблицы zennolab, у которого age больше 23 ИЛИ id больше 2 */
SELECT zennolab.name FROM zennolab WHERE age > 23 OR id > 2
SQL:
/* Отбери данные из столбцов name, age таблицы zennolab */
SELECT zennolab.name, zennolab.age FROM zennolab
16.png

SQL:
/* Отбери данные из столбцов name, age таблицы zennolab, а затем отсортируй по возрасту */
SELECT zennolab.name, zennolab.age FROM zennolab ORDER BY age
SQL:
/* Отбери данные из столбцов name, age таблицы zennolab, а затем отсортируй по возрасту В ОБРАТНОМ ПОРЯДКЕ */
SELECT zennolab.name, zennolab.age FROM zennolab ORDER BY age DESC
16.2.png

SQL:
/* Отбери данные из столбцов name, age таблицы zennolab, где age больше 23 И id больше 2, затем отсортируй по столбцу age */
SELECT zennolab.name, zennolab.age FROM zennolab WHERE age > 23 AND id > 2 ORDER BY age
SQL:
/* Отбери данные из столбцов name, age таблицы zennolab и оставь только 1 результат */
SELECT zennolab.name, zennolab.age FROM zennolab LIMIT 1
17.png

SQL:
/* Отбери данные из столбцов name, age таблицы zennolab, оставь 2 результата начиная с 4 строки (счет идет с нуля, поэтому пишем 3) */
SELECT zennolab.name, zennolab.age FROM zennolab LIMIT 2 OFFSET 3
18.png



SQL:
/* Отбери данные из столбцов name, age таблицы zennolab, где age больше 23 И id больше 2 и оставь только 1 результат */
SELECT zennolab.name, zennolab.age FROM zennolab WHERE age > 23 AND id > 2 LIMIT 1
SQL:
/* Выведи уникальные значения из столбца name таблицы zennolab. Важно: нельзя отбирать больше 1 столбца. Если в столбце name будут одинаковые значения, то из всех них выведется один случайный. */
SELECT DISTINCT zennolab.name FROM zennolab
SQL:
/* Отбери данные из столбца name таблицы zennolab, у которого в name идет Ал… (что угодно) */
SELECT zennolab.name FROM zennolab WHERE zennolab.name LIKE 'Ал%'
19.png

SQL:
/* Первая буква любая, затем лексей. */
SELECT zennolab.name FROM zennolab WHERE zennolab.name LIKE '_лексей'
SQL:
/* Подсчитай количество строк в таблице zennolab */
SELECT COUNT(*) FROM zennolab
SQL:
/* Подсчитай сумму чисел в столбце age таблицы zennolab */
SELECT SUM(age) FROM zennolab
Хватит пока?



Запросы insert, update, delete

Вот так можно добавить данные в таблицу:

SQL:
INSERT INTO zennolab (name, age) VALUES('vacy','25');
20.png

Переходим во вкладку «данные», жмем f5 для обновления данных и видим нашу строку

21.png
SQL:
/* Пример вставки сразу нескольких значений */
INSERT INTO zennolab (name, age) VALUES('pety','24'), ('koly','42');
Теперь научимся изменять данные:
SQL:
/* Обнови данные в столбце name на nasty, в столбце age на 18 табл zennolab у которого id=8 */
UPDATE zennolab SET NAME='nasty', age='18' WHERE id=8
Здесь можно применять всё то, что мы применяли выше, например:
SQL:
UPDATE zennolab SET age='18' WHERE id < 6 AND age > 18
Удаление данных происходит следующим образом:
SQL:
/* Удали строку из табл zennolab у которой id=8 */
DELETE From zennolab WHERE id=8

Как пользоваться в ZennoPoster

Создаем кубик «добавить действие» -> «данные» -> «базы данных»

Создаем переменную, куда помещаем такую строку:

SQL:
Data source=то_что_мы_вводили_в_имя_хоста;UserId=логин_jino;Password=пароль_jino;database=имяБД;Charset=utf8;
Выбираем MySQLClient



22.png

Для select запросов выбираем тип запроса «обычный», для остальных «без ответа». Затем вводим текст запроса, выбираем разделители, выбираем куда кладем результат и можно запускать кубик

23.png

Вот и всё.
 
Тема статьи
Другое
Номер конкурса статей
Пятнадцатый конкурс статей

Для запуска проектов требуется программа ZennoPoster или ZennoDroid.
Это основное приложение, предназначенное для выполнения автоматизированных шаблонов действий (ботов).
Подробнее...

Для того чтобы запустить шаблон, откройте нужную программу. Нажмите кнопку «Добавить», и выберите файл проекта, который хотите запустить.
Подробнее о том, где и как выполняется проект.

Последнее редактирование модератором:

BAZAg

Client
Регистрация
08.11.2015
Сообщения
1 794
Благодарностей
2 466
Баллы
113
Спасибо!
Будем изучать базы данных.
А как обходить превышение количества подключений при работе в многопотоке?
 
  • Спасибо
Реакции: ParadoxRU

ZennoCat

Client
Регистрация
06.01.2020
Сообщения
46
Благодарностей
14
Баллы
8
Спасибо, то что нужно. Как раз изучал БД
 

Sanekk

Client
Регистрация
24.06.2016
Сообщения
999
Благодарностей
390
Баллы
63
Если бд стоит на хостинге а зенка на другом серваке, ну или домашнем компе, при отправке запросов к БД могут перехватить логин/пароль от БД?
 

soprano

Client
Регистрация
25.08.2011
Сообщения
866
Благодарностей
948
Баллы
93
В SQLite всё аналогично, синтаксис запросов такой же?
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 789
Благодарностей
5 721
Баллы
113
В SQLite всё аналогично, синтаксис запросов такой же?
базовый SQL одинаков для всех БД. однако есть конструкции различающиеся от базы к базе. это уже надо шерстить версию SQL для конкретной базы.
 
  • Спасибо
Реакции: soprano

marushin

Client
Регистрация
12.01.2015
Сообщения
189
Благодарностей
59
Баллы
28
Дельно, сам недавно подружил зенку с Access, масштабируемость и скорость поднялись в разы.
Собственно вопрос, что лучше/быстрее - MySQL или Access?
 

Kulya

Client
Регистрация
11.09.2016
Сообщения
177
Благодарностей
48
Баллы
28
Спасибо!
Будем изучать базы данных.
А как обходить превышение количества подключений при работе в многопотоке?
Я запросы обычно складываю в список, и потом пачкой отправляю.
 
  • Спасибо
Реакции: BAZAg

radv

Client
Регистрация
11.05.2015
Сообщения
3 820
Благодарностей
2 030
Баллы
113
Хоршая и полезная статья, особенно для новичков.
Работа с БД идет быстрее, чем с большими списками и таблицами.

В SQLite всё аналогично, синтаксис запросов такой же?
SQLite это файл с локальной БД, и можно использовать его рядом с проектом, т.е. хостинг для нее не нужен. Особенно если эту БД использует только один проект.
 

burhanov88

Client
Регистрация
08.04.2015
Сообщения
71
Благодарностей
23
Баллы
8
Если бд стоит на хостинге а зенка на другом серваке, ну или домашнем компе, при отправке запросов к БД могут перехватить логин/пароль от БД?
Могут если у вас соединение без сертификата, и вас прослушивают, но это неуловимый джо..... Можете отправлять по защищенному соединению сертификат или vpn
 

Supergrok

Client
Регистрация
05.03.2019
Сообщения
171
Благодарностей
156
Баллы
43
Спасибо, все никак не доходят руки осилить БД. Буду изучать
 

volody00

Client
Регистрация
06.09.2016
Сообщения
929
Благодарностей
1 019
Баллы
93
Спасибо!
Будем изучать базы данных.
А как обходить превышение количества подключений при работе в многопотоке?
не знаю даже, слишком много потоков не запускал. работал в 5 потоков, бывало, что некоторые запросы не проходили (выдавало ошибку, какую уже не помню). Сделал просто запрос в цикле и если не проходит, то беру паузу и посылаю снова. Проблема исчезла. Конечно, при работе в 100 потоков такое, вероятно, не прокатит.
 
  • Спасибо
Реакции: BAZAg

WebBot

Client
Регистрация
04.04.2015
Сообщения
1 774
Благодарностей
1 392
Баллы
113

Home_KreKer

Client
Регистрация
05.12.2016
Сообщения
160
Благодарностей
37
Баллы
28
Отличная работа, буквально год назад сидел и разбирался с БД. Всем бд :-)
 
Регистрация
13.04.2020
Сообщения
99
Благодарностей
10
Баллы
8
Отличное пособие по бд

а такой вопрос - изредка ловлю ошибку запроса из-за присутствия спецсимволов в какой-то из переменных. Делать проверку каждой переменной перед запросом в БД довольно муторно.Товарищь говорил, что есть методSQL который перед отправкой запроса убирает спецсимволы или конвертирует их как-то, а на выдаче обратно возвращает. Какое решение можно применить в данной ситуации?

Так-же пришли к решению, например, брать весь запрос в одну переменную - ее обрабатывать регуляркой и вставлять в строку запроса в экшене работы с бд.
(использую SQLite)


Интересно было бы узнать кто какрешает подобные кейсы :-)
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 789
Благодарностей
5 721
Баллы
113
Отличное пособие по бд

а такой вопрос - изредка ловлю ошибку запроса из-за присутствия спецсимволов в какой-то из переменных. Делать проверку каждой переменной перед запросом в БД довольно муторно.Товарищь говорил, что есть методSQL который перед отправкой запроса убирает спецсимволы или конвертирует их как-то, а на выдаче обратно возвращает. Какое решение можно применить в данной ситуации?

Так-же пришли к решению, например, брать весь запрос в одну переменную - ее обрабатывать регуляркой и вставлять в строку запроса в экшене работы с бд.
(использую SQLite)


Интересно было бы узнать кто какрешает подобные кейсы :-)
а что за спец символы ?
 

BAZAg

Client
Регистрация
08.11.2015
Сообщения
1 794
Благодарностей
2 466
Баллы
113
а такой вопрос - изредка ловлю ошибку запроса из-за присутствия спецсимволов в какой-то из переменных.
Какое решение можно применить в данной ситуации?
(использую SQLite)
Как-то так подобные проблемы решаются с SQLite:
C#:
string path = @"C:\Users\User\Desktop\mybd.db"; // путь к базе
string connect = string.Format(@"Dsn=SQLite3 Datasource;database={0};",path); // строка подключения к базе

string SQL = "INSERT INTO 'main'.'table' ('data') VALUES (?)";
var data = "Строка содержащая спец-символы...#${'}'";
var val = new System.Collections.Specialized.OrderedDictionary {{"data", data}}; // параметры запроса
var data_rez = ZennoPoster.Db.ExecuteNonQuery(SQL, val, ZennoLab.InterfacesLibrary.Enums.Db.DbProvider.Odbc, connect).ToString(); // запрос
Или, переводить строчку в HEX после чего добавлять в базу, а при получении данных в базы - использовать в запросе что-то вроде: SELECT UNHEX(`data`) FROM table;
 
Последнее редактирование:

Sanekk

Client
Регистрация
24.06.2016
Сообщения
999
Благодарностей
390
Баллы
63
Как-то так подобные проблемы решаются с SQLite:
C#:
string path = @"C:\Users\User\Desktop\mybd.db"; // путь к базе
string connect = string.Format(@"Dsn=SQLite3 Datasource;database={0};",path); // строка подключения к базе

string SQL = "INSERT INTO 'main'.'table' ('data') VALUES (?)";
var data = "Строка содержащая спец-символы...#${'}'";
var val = new System.Collections.Specialized.OrderedDictionary {{"data", data}}; // параметры запроса
var data_rez = ZennoPoster.Db.ExecuteNonQuery(SQL, val, ZennoLab.InterfacesLibrary.Enums.Db.DbProvider.Odbc, connect).ToString(); // запрос
Или, переводить строчку в HEX после чего добавлять в базу, а при получении данных в базы - использовать в запросе что-то вроде: SELECT UNHEX(`data`) FROM table;
А как в mysql такое делать?
А то реплейс регуляркой делаю, а тут оказывается можно как белый человек методы использовать)))
 

BAZAg

Client
Регистрация
08.11.2015
Сообщения
1 794
Благодарностей
2 466
Баллы
113
А как в mysql такое делать?
Точно также как и с SQLite подается словарь с параметрами, только в коде вместо:
ZennoLab.InterfacesLibrary.Enums.Db.DbProvider.Odbc
подавать нужно
ZennoLab.InterfacesLibrary.Enums.Db.DbProvider.MySqlClient
Также, вместо знаков вопроса - нужно указывать параметры @data
Для SQLite: string SQL = "INSERT INTO 'table' ('data') VALUES (?)";
Для MySQL: string SQL = "INSERT INTO 'table' ('data') VALUES (@data)";
Также, в строке подключения к MySQL нужно чтобы было: allowuservariables=True

Оказалось что не нужно собирать пример, так как на форуме уже есть уже готовый: ссылка на пример.
 
Последнее редактирование:

LifeIsCool

Client
Регистрация
12.12.2015
Сообщения
44
Благодарностей
4
Баллы
8

volody00

Client
Регистрация
06.09.2016
Сообщения
929
Благодарностей
1 019
Баллы
93
  • Спасибо
Реакции: LifeIsCool

juder

Client
Регистрация
05.08.2018
Сообщения
62
Благодарностей
21
Баллы
8
  • Спасибо
Реакции: LifeIsCool

seregakot

Client
Регистрация
19.03.2016
Сообщения
126
Благодарностей
63
Баллы
28
А подскажите как организовать хранение профилей в Бд
 

BAZAg

Client
Регистрация
08.11.2015
Сообщения
1 794
Благодарностей
2 466
Баллы
113
А подскажите как организовать хранение профилей в Бд
Профиль ►►► base64 ►►► db
Но, стоит заранее понимать, что если речь о профилях, которые содержат кеш и тп - то в итоге будут очень большие накладные расходы при получении и сохранении такого профиля. Я такую связку использую, когда мне нужно банально сохранять прокси, юзерагент, какие-то дополнительные настройки + куки.
 
Последнее редактирование:
  • Спасибо
Реакции: seregakot

WebBot

Client
Регистрация
04.04.2015
Сообщения
1 774
Благодарностей
1 392
Баллы
113
сами профили лучше хранить в файлах, а в БД вести их учет и хранить какую-то доп информацию позволяющую их бытро отфильтровывать - название файла, когда создан, тип, когда крайний раз использовался, сколько сайтов нагулял и тп
 
  • Спасибо
Реакции: dis210, one и seregakot

seregakot

Client
Регистрация
19.03.2016
Сообщения
126
Благодарностей
63
Баллы
28
сами профили лучше хранить в файлах, а в БД вести их учет и хранить какую-то доп информацию позволяющую их бытро отфильтровывать - название файла, когда создан, тип, когда крайний раз использовался, сколько сайтов нагулял и тп
Вы наверно правы , так и реализую .
 

LifeIsCool

Client
Регистрация
12.12.2015
Сообщения
44
Благодарностей
4
Баллы
8
Спасибо огромное @volody00, крутая статья для меня как для новичка, открывает новые горизонты в использовании zenno. Я создал БД на сервисе, что используете вы. У меня постоянно висит сообщение
Хостинг работает в демо-режиме с ограниченной функциональностью. До окончания тестового периода осталось 10 дней.
Пожалуйста, пополните счет, чтобы использовать все возможности хостинга.
Кто-нибудь подскажет, будет ли доступна моя ДБ после окончания 10-тидневного периода, если я не собираюсь пополнять баланс? Если период бесплатного использования ограничивается 10-тью днями, подскажите пожалуйста бесплатный аналог, буду очень признателен
 

volody00

Client
Регистрация
06.09.2016
Сообщения
929
Благодарностей
1 019
Баллы
93
Спасибо огромное @volody00, крутая статья для меня как для новичка, открывает новые горизонты в использовании zenno. Я создал БД на сервисе, что используете вы. У меня постоянно висит сообщение
Кто-нибудь подскажет, будет ли доступна моя ДБ после окончания 10-тидневного периода, если я не собираюсь пополнять баланс? Если период бесплатного использования ограничивается 10-тью днями, подскажите пожалуйста бесплатный аналог, буду очень признателен
да там 50-100 руб в месяц вроде. А так качай Open Server (https://ospanel.io/) и ставь там. БД будет у тебя на ПК. как установить и прописать строку для подключения на ютубе поищи, сейчас уже не помню.
 
  • Спасибо
Реакции: LifeIsCool
Регистрация
13.04.2020
Сообщения
99
Благодарностей
10
Баллы
8

volody00

Client
Регистрация
06.09.2016
Сообщения
929
Благодарностей
1 019
Баллы
93
спасибо всем, кто поддержал статью лайком. с 8 июня на ютуб канале будет выпущено несколько видео по БД, логически продолжающие данную статью.

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

P.S. "Соррян" за рекламу
 

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)