• Насколько сложный пароль стоит иметь от БД?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Слишком абстрактный вопрос. И ответ такой же - возможно, имеет.

    Настоящий же ответ зависит от конкретных условий и списка потенциальных угроз, от которых следует защититься. Согласись, если это сервер домашней сети, не подключённый к Инету, то смыслу наворачивать на него суперсложный пароль - ноль. Если это непатченная ОС, торчащая голым задом в Инет, то тоже - ибо если хакнут, то скорее всего всю ОС, а сервер БД пойдёт просто за компанию.

    С другой стороны, показанные два пароля отличаются разве что тем, что второй проще запомнить и набрать. Длина-то у них одинаковая, и использованные категории символов совпадают... А по сложности они практически не отличаются - второй на прямую попытку взлома по словарю не поддастся.
    Ответ написан
  • Как выбрать только те записи, которые не пересекаются и только те, которые пересеклись?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Используем [NOT] EXISTS
    SELECT *
    FROM user_friend uf1
    WHERE [NOT] EXISTS ( SELECT NULL
                         FROM user_friend uf2
                         WHERE uf2.friend_user_id = uf1.user_id )

    При WHERE EXISTS выбираются пары друзей (записи, имеющие обратную пару), при WHERE NOT EXISTS - записи, не имеющие обратной пары.

    Если для записей, имеющих обратную, нужна только одна пара из двух - добавляем во WHERE внешнего запроса ещё одно условие AND friend_user_id > user_id.
    Ответ написан
    Комментировать
  • Восстановить таблицы в базе mysql?

    @Akina
    Сетевой и системный админ, SQL-программист.
    1. Переместить файлы таблицы.
    2. Создать пустую таблицу, скопировав CREATE TABLE с другого сервера максимально близкой версии.
    3. DISCARD TABLESPACE.
    4. Заменить файлы на сохранённые.
    5. IMPORT TABLESPACE.

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

    Если всё равно не получается - бэкапить всё, что бэкапится, после чего удалить сервер и поставить заново, затем вернуть бэкап. Бэкап базы MySQL предварительно внимательно просмотреть и вычистить оттуда всё, связанное с проблемными таблицами, в отдельные файлы. При необходимости - аккуратно восстанавливать и то, что убрано, но по одному запросу за раз, и хорошо подумав, какие это может повлечь последствия.
    Ответ написан
    Комментировать
  • Как производить переиндексацию в таблице SQLite?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Вопрос - следствие абсолютного непонимания сути первичного индекса.

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

    Обрати особое внимание - в течение времени жизни именно таблицы. Не записи! То есть то, что запись удалена, ни на что не влияет - отсутствующее значение первичного индекса идентифицирует факт, что запись существовала, но была удалена.

    Если тебе очень нужна непрерывная нумерация записей - то для реализации этой функции следует создать дополнительное поле в таблице, и уже в нём заниматься нумерациями, перенумерациями и сжатиями. Или (что более правильно), рассчитывать такое значение непосредственно в запросе, в тот момент, когда это значение потребовалось. А с учётом того, что в подавляющем большинстве случаев на это значение никакой функции, кроме удобства просмотра, не возлагается, его можно вообще не считать. Как правило, средства отображения набора записей на клиенте имеют встроенную функцию нумерации записей по порядку - вот и пользуйся.
    Ответ написан
    Комментировать
  • Откуда в MySQL Workbench постоянно берется схема mydb и как от нее избавиться?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Очень мешает откуда-то самопроизвольно возникающая схема mydb, которую я не могу удалить.

    Проверьте свойства (подключения, профиля) - возможно, именно это имя БД указано как база по умолчанию. И добрый Workbench, чтобы не плеваться ошибками на несуществующую БД, просто создаёт её. Или БД по умолчанию вообще не указана, и Workbench вытаскивает это имя откуда-то из своего загашника с дефолтными значениями.

    таблицы стали создаваться именно в ней, а не в той схеме с которой я работаю

    Если при создании таблицы указано её имя с указанием имени БД (CREATE TABLE dbname.tablename ( .. );) - таблица будет создана именно в указанной БД. Если же имя БД не указать - таблица создаётся в текущей БД. Почему у Вас именно эта БД текущая, и почему Вы не меняете её перед созданием таблиц запросом USE - это именно к Вам вопросы, и именно Ваша вина в том, что таблицы создаются "не там".
    Ответ написан
    2 комментария
  • Как посчитать ФИО в колонках с неправильным порядком?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Пример реализации для MySQL 8+:
    WITH 
    cte1 AS ( SELECT id, col1 val FROM test UNION ALL 
              SELECT id, col2 FROM test UNION ALL
              SELECT id, col3 FROM test ),
    cte2 AS ( SELECT id, GROUP_CONCAT(val ORDER BY val) FIO
              FROM cte1 
              GROUP BY id )
    
    SELECT test.id, test.col1, test.col2, test.col3, GROUP_CONCAT(cte2_2.id) ids
    FROM test
    JOIN cte2 cte2_1 USING (id)
    JOIN cte2 cte2_2 USING (FIO)
    GROUP BY test.id, test.col1, test.col2, test.col3

    Вывод:

    id	col1		col2		col3		ids
    1	Иванов		Иван		Иванович	1,2
    2	Иван		Иванович	Иванов		1,2
    3	Петров		Сергей		Алексеевич	3,4,5
    4	Петров		Сергей		Алексеевич	3,4,5
    5	Сергей		Алексеевич	Петров		3,4,5
    DEMO

    Если нужна ещё и нормализация (т.е. строго в col1 сунуть фамилию, в col2 имя...) - наилучшим вариантом считаю загрузку справочников имён, отчеств и фамилий (вполне доступные справочники) и их использование для категорирования. 99% записей будут полностью обработаны по ним, а оставшийся десяток записей (где два или все три значения отсутствуют в справочниках) можно и вручную обработать, вернее, пополнить справочник, чтобы при втором запуске все 100% были распознаны и категорированы корректно.

    выполняться будет на MS SQL Server, версию не могу сказать.

    Для MS SQL вместо GROUP_CONCAT будет STRING_AGG(column) [WITHIN GROUP ( ORDER BY column)]. https://docs.microsoft.com/ru-ru/sql/t-sql/functio...
    Ответ написан
    3 комментария
  • Как получить количество записей перед определенной записью в mysql с сортировкой по полю varchar?

    @Akina
    Сетевой и системный админ, SQL-программист.
    мне надо сделать подсчет количества записей перед определенной записью.
    Но обязательно с сортировкой по полю varchar asc.

    SELECT COUNT(*)
    FROM table
    WHERE varchar_column <= @value_in_definite_row

    Или строгое неравенство, если саму "определённую запись" не учитывать.
    Ответ написан
    7 комментариев
  • Как вывести значение поля до выполнения UPDATE, вместе со значением после UPDATE?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Добавь в источник данных копию изменяемой таблицы, связанную по первичному ключу или иному уникальному полю/выражению, и оттуда возьми исходное значение.

    DEMO
    Ответ написан
    Комментировать
  • Обращение к записи БД требует некоторой обработки. Что лучше: обработать в скрипте, который обратился, или в хранимой процедуре в БД?

    @Akina
    Сетевой и системный админ, SQL-программист.
    что эффективнее: хранить в записи список id объектов, которые должны быть обработаны при обращении к этой записи, в виде строки (скрипт будет парсить строку и отрабатывать каждый id), либо сделать триггер и хранимую процедуру (MySQL), которая возьмёт эту работу на себя?

    Ни то ни другое.

    Если тебе нужна канава, и есть экскаватор, то взять из его ремнабора лопату и ей копать канаву - голимая дурь. Это что касается обработки в скрипте - сервере БД сделает то же на порядок быстрее и эффективнее.

    Но есть ещё косяк - в том, как хранятся данные. Упаковка набора данных в одну запись в виде CSV-списка - это тоже дурь в подавляющем большинстве случаев. Умные люди не зря придумали нормальные формы, которые позволяют обрабатывать данные максимально эффективным образом.

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

    Насчёт триггера - сильно сомнительно, что он нужен. Триггер - это реакция на изменение данных, тогда как, судя по описанию, сигналом на обработку будет явное действие оператора без изменения данных, типа нажатия кнопки в форме. По-моему, будет достаточно если не запроса, то хранимой процедуры.
    Ответ написан
    2 комментария
  • Как по ходу программы менять значение по умолчанию в БД SQL?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Значение по умолчанию (если это не автогенерируемое значение, например, автоинкремент или штамп текущего времени) - это страховка, которая при правильном программировании не должна использоваться вообще.

    Присваивайте нужное значение явно.
    Ответ написан
    3 комментария
  • Выдача двух IP-адресов одному ПК от одного DHCP-сервера на MikroTik - возможно ли?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Адрес, выдаваемый по DHCP, выдаётся для определённого аппаратного (МАС) адреса.

    Сетевой адаптер (что реальный, что виртуальный) имеет только один МАС - соответственно ему будет выделен только один IP.
    Ответ написан
    1 комментарий
  • Как получить только первые строки из групп строк отсортированной таблицы?

    @Akina
    Сетевой и системный админ, SQL-программист.
    SELECT prices.* 
    FROM prices
    JOIN ( SELECT size, MAX(`date`) AS `date`
           FROM prices 
           WHERE price
    --       AND `date` <= @some_date
           GROUP BY size ) AS last_nonzero_date USING (size, `date`);

    Запрос предполагает, что (size, `date`) - уникально.

    Если для size все цены нулевые (или NULL) - запись для такого размера не будет выведена.

    Если нужно состояние на определённую дату - раскомментировать WHERE.
    Ответ написан
    Комментировать
  • Возможно ли составить такой SQL запрос?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Ничто не мешает использовать оконный вариант агрегатных функций. Кроме слишком старой версии СУБД, не поддерживающей оконные функции, конечно.
    SELECT MIN(`min_price`) OVER () as `min_price`, 
           MAX(`max_price`) OVER () as `max_price`, 
           `item_id` as `id`
    FROM `product_table` 
    WHERE `id` IN (SELECT  тут запрос)

    Получишь все нужные id, и в каждой строке - нужные MIN и MAX.

    ======================


    Akina, да, версия 5.7.21 и она, я так понимаю, не поддерживает оконные функции.


    SELECT t2.min_price, 
           t2.max_price, 
           t1.item_id as id
    FROM product_table t1
    CROSS JOIN ( SELECT MIN(min_price) AS min_price, 
                 MAX(max_price) AS max_price
                 FROM product_table ) t2
    WHERE t1.id IN (SELECT  тут запрос)
    Ответ написан
  • Возможно ли создать отчёт Excel с помощью SQL?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Excel вполне и сам может получить данные с сервера, причём не только из таблиц, но и результат выполнения запросов любой сложности. Так что SQL тут в общем и не нужен - задача вполне решается средствами VBA. Открыл в Excel файл отчёта, жмакнул кнопку обновления данных, подождал - и наслаждайся готовым результатом.
    Ответ написан
    4 комментария
  • Как автоматизировать запуск sql скриптов?

    @Akina
    Сетевой и системный админ, SQL-программист.
    MySQL имеет собственный встроенный планировщик (MySQL 8.0 Reference Manual / Stored Objects / ...), который может делать практически что угодно. Создаёшь Event Procedure, задаёшь периодичность выполнения - остальное сервер сделает сам. Вообще без помощи/управления со стороны.

    Народ обычно любит предлагать внешние планировщики (как правило CRON) - настоятельно не рекомендую, если требующий выполнения код есть чистый SQL. Другое дело когда надо выполнять скрипты на иных языках или внешние приложения - тут да, без крона скорее всего не обойтись. Хотя и тут есть способ - подключить внешний модуль с требуемым функционалом.

    Есть папка, которая хранит в себе sql файлы для создания бд, таблиц в этой бд, импорт данных в эти таблицы.
    Как автоматизировать запуск этих sql скриптов?

    Создание БД, таблица, начальное наполнение - это как бы одноразовое действие. Нафига их шедулить?
    Ответ написан
    3 комментария
  • Как удалить одинаковые записи?

    @Akina
    Сетевой и системный админ, SQL-программист.
    нужно удалить записи с одинаковыми date и user_id

    DELETE t1.*
    FROM tablename t1
    JOIN tablename t2 USING (date, user_id)
    WHERE t1.id > t2.id


    а лучше не создавать их

    CREATE UNIQUE INDEX indexname ON tablename (date, user_id)

    Выполнить строго после удаления дубликатов - иначе упадёт по ошибке.
    Ответ написан
    Комментировать
  • Как получить список чатов по дате отправки сообщений?

    @Akina
    Сетевой и системный админ, SQL-программист.
    SELECT CASE WHEN sender_id = 1
                THEN receiver_id
                ELSE sender_id 
                END AS buddy
    FROM message
    WHERE 1 IN (sender_id, receiver_id)
    GROUP BY buddy
    ORDER BY MAX(sent_at)


    Ну и соответственно
    SELECT user.username
    FROM user
    JOIN ( SELECT CASE WHEN sender_id = 1
                       THEN receiver_id
                       ELSE sender_id 
                       END AS id,
                  MAX(sent_at) sent_at
           FROM message
           WHERE 1 IN (sender_id, receiver_id)
           GROUP BY 1 ) ids USING (id)
    ORDER BY ids.sent_at
    Ответ написан
    3 комментария
  • Как задать связи разного вида с помощью Foreign key?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Любой внешний ключ (FOREIGN KEY в структуре таблицы) задаёт связь типа 1:N (если локальное выражение внешнего ключа не может быть NULL) либо (0-1):N.

    Задание связи 1:1 (и соответственно (0-1):1) требует дополнительного ограничения уникальности на локальной стороне.

    Задание связи M:N требует дополнительной связующей таблицы.

    В данном случае "задание связи" == "создание правила контроля целостности и непротиворечивости данных, контролируемое на стороне сервера соответствующей подсистемой".
    Ответ написан
    Комментировать
  • Postgre Sql DISTINCT массив с ORDER BY?

    @Akina
    Сетевой и системный админ, SQL-программист.
    DISTINCT - это фактически частная форма GROUP BY. А потому к ней относятся все ограничения для GROUP BY в части использования полей источника данных в оконных функциях, выражениях пост-отбора и сортировки.

    Посему используйте поле выходного набора для сортировки.
    SELECT DISTINCT (regexp_split_to_array(commend, E'\\s+'))[:3] AS first_3_words
    FROM orders 
    ORDER BY first_3_words[2];
    Ответ написан
  • Как написать SQL запрос для среза непустых значений?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Общее решение:
    SELECT DISTINCT
           key,
           FIRST_VALUE(value1) OVER (PARTITION BY key 
                                     ORDER BY CASE WHEN value1 IS NULL 
                                                   THEN 1 
                                                   ELSE 0 END, id DESC) AS value1,
           FIRST_VALUE(value2) OVER (PARTITION BY key 
                                     ORDER BY CASE WHEN value2 IS NULL 
                                                   THEN 1 
                                                   ELSE 0 END, id DESC) AS value2,
           FIRST_VALUE(value3) OVER (PARTITION BY key 
                                     ORDER BY CASE WHEN value3 IS NULL 
                                                   THEN 1 
                                                   ELSE 0 END, id DESC) AS value3
    FROM tablename
    -- WHERE key IN ( {список значений} )


    Однако я полностью согласен с тем, что сказал Роман Юрьевич Ипатьев,
    переписать таблицу в нормальную форму
    Ответ написан
    Комментировать