Задать вопрос
  • Как работает GROUP BY?

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

    Например, пишу я такой SELECT и все нормально
    SELECT Trip.plane, Trip.id


    Ну да, тебе нужны отдельные самолёты, соответственно никакие группы не нужны. GROUP BY не требуется.

    Но при таком мне выдает ошибку
    SELECT Trip.plane, COUNT(Trip.plane) planes

    А вот теперь ты хочешь, поделив все имеющиеся самолёты на группы, собрав в каждую группу самолёты одного типа, посчитать в каждой группе количество самолётов. И для того, чтобы указать, по какому признаку нужно делить на группы, требуется GROUP BY.
    Ответ написан
    2 комментария
  • Откуда берется /*!40001 SQL_NO_CACHE */ в запросе при создании дампа?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Отвечу всё же на заданный вопрос:
    Откуда это берется вообще? /*!40001 SQL_NO_CACHE */ и как это убрать?

    Это - комментарий с фрагментом запроса, специфичным для MySQL.

    Помещается в тело запроса (в т.ч. в дамп) для того, чтобы запрос, использующий какую-либо специфичную для MySQL конструкцию, мог быть выполнен в другом SQL-диалекте без внесения изменений в текст запроса. Т.е. MySQL обрабатывает содержимое такого комментария так, словно этот фрагмент не закомментирован, тогда как другие СУБД проигнорируют этот фрагмент как комментарий.

    Опциональное пятизначное число указывает минимальную версию MySQL, начиная с которой содержимое комментария должно обрабатываться (в показанном фрагменте - это версия 4.00.01), на более младшей версии комментарий останется комментарием. При его отсутствии (используется только /*!) - код из комментария обрабатывается любой версией.

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

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

    Так что создаём Event Procedure, которая выгружает результат нужного запроса в файл в нужном формате, запускаем Event Scheduler... и всё.
    Ответ написан
    Комментировать
  • Какой алгоритм используется при возможности 2 неудачных попыток?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Для бОльшей понятности условия будем считать что у нас есть 2 предмета. Оба разбились - эксперименты кончились. И будем считать, что задача - получить ответ за минимальное количество бросков.

    Рассмотрим, что у нас есть только один предмет. Очевидно, что придётся его кидать с 1 метра, с 2, с 3... пока не разобьётся. Максимум будет 5000 бросков.

    Но у нас есть 2 предмета.

    Тогда мы можем бросить первый не с 1 метра, а сразу с какого-то N. Если он разобьётся, то придётся второй кидать с 1, 2, ... и по максимуму второй кинем N-1 раз. а всего будет N бросков.

    Но если он не разбился, то мы можем бросить первый уже с бОльшей высоты. Какой? Допустим, он разобьётся. Чтобы получить по максимуму те же N бросков, второй предмет мы уже может бросить N-2 раз, а, значит, первый предмет надо сбрасывать с высоты N+(N-1).

    Если первый снова не разбился, на следующем шаге его можно сбросить с высоты N+(N-1)+(N-2)... и так далее.

    Лишнего нам тоже не надо. А, значит, надо подобрать такое наименьшее N, при котором N-й бросок первого предмета будет с 5000 метров или выше.

    Итого - имеем N+(N-1)+(N-2)+...+1 >= 5000. Сумму арифметической прогрессии знаем, квадратные уравнения решать умеем. Получаем N=100.
    Ответ написан
    Комментировать
  • Как спроектировать базу данных слов?

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

    С точки зрения работы с СУБД хранение массива данных в виде CSV-значения - крайне неудачный вариант. И весьма проблемный в обработке. Впрочем, если речь идёт о достаточно статичном массиве данных в сотню записей - вариант допустимый.

    Нормализованная структура, удобная в обработке, может выглядеть, например, так (само собой, это только кусок для хранения слов и фраз):
    CREATE TABLE words (
        word_id INT AUTO_INCREMENT PRIMARY KEY,
        word VARCHAR(255) UNIQUE NOT NULL
    );
    
    CREATE TABLE phrase (
        phrase_id INT NOT NULL,
        FOREIGN KEY (phrase_id) REFERENCES phrases (phrase_id),
        word_id INT NOT NULL,
        FOREIGN KEY (word_id) REFERENCES words (word_id),
        word_position INT,
        PRIMARY KEY (phrase_id, word_position)
    );
    Ответ написан
  • Экспорт данных из QUIK по ODBC. Как налету преобразовывать VARCHAR-поля в правильные (DATE, DECIMAL, ENUM)?

    @Akina
    Сетевой и системный админ, SQL-программист.
    В тексте запроса ЛЮБЫЕ данные представлены как их строковые представления. Да что там - сам SQL-запрос есть строковый литерал.

    Поэтому следует озаботиться исключительно правильным представлением. Форматом. Если данные - число, то десятичным разделителем должна быть точка. Если это дата или строка - должны присутствовать обрамляющие кавычки, причём дата должна быть в формате, понятном текущей СУБД (предпочтительно YYYY-MM-DD - этот формат понимают все СУБД), а в строке должны быть экранированы все символы, являющиеся служебными. И т.п.

    Если выгруженные данные не соответствуют этому формату, то в запросе на добавление можно использовать не напрямую значение (и потом маяться дурью в процедуре/триггере), а, используя встроенные функции, преобразовать данные к правильному типу. Например, если в поле надо вставить число, а в выгрузке использована запятая в качестве разделителя, это будет
    INSERT ... VALUES ( ... , CAST(REPLACE(@value, ',', '.') AS DOUBLE), ...
    Ответ написан
    Комментировать
  • Как связать много сущностей к одной в результате?

    @Akina
    Сетевой и системный админ, SQL-программист.
    SELECT for_output
    FROM ( SELECT name AS film_name, name AS for_output
           FROM films
         UNION ALL
           SELECT films.name, comments.comment
           FROM films 
           JOIN comments USING (film_id) ) total
    ORDER BY film_name, film_name <> for_output
    Ответ написан
    Комментировать
  • Поиск дублируюших строк в Excel?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Условное форматирование решает элементарно.
    На скриншоте - правило для диапазона B:B. Аналогичное правило делается для A:A.

    614c4aefbbc3b950976031.png
    Ответ написан
    7 комментариев
  • Как сделать вложенность в json через SQL запрос?

    @Akina
    Сетевой и системный админ, SQL-программист.
    DEMO

    В общем, вложенные подзапросы либо цепь CTE, каждый со своим уровнем агрегирования.
    Ответ написан
    1 комментарий
  • Как правильно расчитать суммы по разным таблицам?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Это так называемый join multiplying. Для получения верного результата надо сначала агрегировать, и только потом связывать.

    PS. DISTINCT во всех запросах - лишний, ибо каждый из запросов гарантированно возвращает толко одну запись - ну и чего там ещё дистинктить?
    Ответ написан
  • Почему не работает связка коммутатор - медаконвертер?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Gigalink GL-MC-UTPF SC1F-18SM-1310 - стамегабитный (Режим работы оптического порта, Мбит/с - 100).
    Mikrotik S-53LC20D - гигабитный (Data Rate - 1.25G).

    Они не подружатся. Никогда.
    Ответ написан
    8 комментариев
  • Как найти количество простых чисел в массиве?

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

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

    Нет, конечно, можно и сразу нагенерить простых до миллиона, но смысл?
    Ответ написан
    Комментировать
  • Как настроить права в на запись для одного поля?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Да, в SQL Server имеется column-level security. Так что возможно настроить требуемые права доступа.

    См. напр. https://docs.microsoft.com/ru-ru/sql/relational-da...
    Ответ написан
  • Почему долгий запрос delete к таблице сильно тормозит запросы insert к другим таблицам?

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

    Организуйте удаление пакетами. Скажем, по 10к записей.
    CREATE PROCEDURE delete_rows()
    BEGIN
        SELECT @@autocommit INTO @autocommit;
        SET SESSION autocommit = ON;
        REPEAT
            DELETE FROM bigtable WHERE state=2 LIMIT 10000;
            SELECT SLEEP(1) INTO @tmp;
        UNTIL NOT ROW_COUNT() END REPEAT;
        SET SESSION autocommit = @autocommit;
    END
    Ответ написан
    Комментировать
  • Как правильно составить sql запрос с условием?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Схематично:
    SELECT orders.column,
           COALESCE(books.column, deposits.column) AS column
    FROM orders 
    LEFT JOIN books ON orders.type = 'book' AND orders.id = books.order_id
    LEFT JOIN deposits ON orders.type = 'deposit' AND orders.id = deposits.order_id
    Ответ написан
    1 комментарий
  • Почему 192.168.1.0/23 и 192.168.0.0/23 одно и то же?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Есть сеть 192.168.1.0/23

    Это ни фига не сеть. Это один хост. Узел с адресом 192.168.1.0 (и маской 255.255.254.0) из подсети 192.168.0.0/23.

    Для (под)сети в обязательном порядке выполняется равенство address AND mask = address.
    Ответ написан
    Комментировать
  • Как перемешать символы в сроке?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Ну так перемешай...
    SELECT string_agg(concat(substring('ABCDEFGHIJKLMNOPQRSTUVWXYZ', ceil(random() * 26)::integer, 1),
                             substring('abcdefghijklmnopqrstuvwxyz', ceil(random() * 26)::integer, 1),
                             substring('0123456789', ceil(random() * 10)::integer, 1),
                             substring('!#$%&()*+,-./:;<=>?@[]^', ceil(random() * 23)::integer, 1)
                             ),
                      '' ORDER BY RANDOM()
                      ) 
    FROM generate_series(1,8);
    Ответ написан
  • Как составить запрос к MYSQL?

    @Akina
    Сетевой и системный админ, SQL-программист.
    SELECT UserID, t1.CountMessage-t2.CountMessage
    FROM daily_exp_snapshots t1
    JOIN daily_exp_snapshots t2 USING (UserID)
    WHERE t1.date_added >= CURRENT_DATE
      AND t1.date_added < CURRENT_DATE + INTERVAL 1 DAY
      AND t2.date_added >= CURRENT_DATE - INTERVAL 1 DAY
      AND t2.date_added < CURRENT_DATE
    Ответ написан
    Комментировать
  • Программа для клонирование системного диска Linux с разделами, но под Windows?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Подходит абсолютно любая программа, которая умеет создать копию накопителя. Именно накопителя, физически, сектор за сектором, от первого до последнего, не обращая внимания на разделы, файловые системы и прочую шелуху верхних уровней.
    Ответ написан
    Комментировать
  • Показать все значения где другое значение count > 1?

    @Akina
    Сетевой и системный админ, SQL-программист.
    call_id, где есть больше одного значение value

    SELECT call_id
    FROM tablename
    GROUP BY call_id
    HAVING COUNT(DISTINCT value) > 1
    Ответ написан
    Комментировать