Задать вопрос
Ответы пользователя по тегу SQL
  • Разделение ответственности или производительность?

    mayton2019
    @mayton2019
    Bigdata Engineer
    А где проблема вообще? Ну будет 2 нотификации. Но они ведь нацеленные на своего потребителя?
    Тот кому надо их и прочитает. Или тут экономят сетевой трафик? Короче непонятно.
    Ответ написан
  • Как получить непересекающиеся строки между двумя запросами с group by?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Используй except:
    select * from ....
    except
    select * from ....
    Ответ написан
    Комментировать
  • Как sql запрос для phpmyadmin оформить в php?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Ты его и для admin неоптимально сделал. Зачем 7 раз переписывать каждый документ. Вот будет у тебя база в 100 Гб - значит перепишешь почти терабайт.

    Сделай

    UPDATE wp_posts SET post_content = REPLACE(REPLACE(.... (post_content, '<pre><code>', '</code></pre>', '').......))))
    Ответ написан
    1 комментарий
  • Как понять порядок столбцов в таблице в SQL (MS SQL)?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Ну любой API который работает с metadata из курсора - всегда выдаст тебе колонки именно в том порядке
    как и выдает фактический запрос. Для JDBC там была своя процедура https://www.baeldung.com/jdbc-database-metadata

    Да и даже еслиб ты не знал про метадату - можно просто выбрать запрос который выдает 1 строку и взать из него типы полей тоже через какой- то API (JDBC/ODBC).
    Ответ написан
    Комментировать
  • Как лучше оптимизировать вывод данных?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Как лучше реализовать логику получения данных. Получить все данные за один запрос, хранить их и на основе выбора пользователя, фильтровать и выводить нужные ему данные.

    Делай как тебе проще код писать. Наперед ни один архитектор не знает как лучше. Улучшение - это процесс итеративный. Но сначала тебе нужно поймать какой-то инцедент. Например performance issue. И уже начиная от этого улучшать.

    Пока у тебя такого инцедента нет - делай максимально простой код и это будет правильное решение.
    Ответ написан
    Комментировать
  • Как оптмизировать INSERT-SELECT SQL запрос?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Как всегда автор не указывает тип dbms. Ох-ох-ох..

    Запрос состоит из двух функционалов. Один - это собственно выборка - и другой это вставка.
    Скорее всего медленно работает выборка в части соединения двух таблиц.
    INSERT INTO tabel0 (row_1, row_2, row_3, row_4)
    SELECT oa.row_5,
           oa.row_6,
           oa.row_7,
           nw.row_8
    FROM table1 t1
           LEFT JOIN table2 t2 on t2.row_9 = t1.row_10
    WHERE t2.row_11 IS NOT NULL;

    Вот здесь где идет join по row_9 и row_10 надо построить индексы по этим полям.
    Потом прогнать analyze по обоим таблицам.

    И запустить еще раз.

    Вставка тоже может тормозить по разным условиям (триггеры, instead-of триггеры, сложные констрейнты
    или просто сложные типы данных наподобие xml/json которые требуют много I/O). Но для начала
    надо хотя-бы с выборкой разобраться.
    Ответ написан
    3 комментария
  • Как сделать категории в интернет магазине?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Для выскоконагруженных интернет магазинов нет прямого доступа к категориям в БД.
    Они (категории) кешируются на стороне приложения и NGinx.

    Категории меняются редко. Ну вряд-ли в течение дня. Скорее всего на следующий день.
    Поэтому форма хранения их в таблице должна выбираться из удобства внесения изменений.
    Вот попробуйте Adjacency List. Самый первый и самый очевидный вариант.

    И не надо быть перфекционистом и ковырять грязь из под ногтей. Просто потеряте кучу времени.
    Ответ написан
    Комментировать
  • Надо ли что-то еще делать для избежания SQL инъекций?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Нет. Ничего больше не нужно делать. Вообще не нужно делать никаких действий которые нельзя доказать или как-то протестировать. Иначе программирование превращается в черную магию и колдунство.
    Ответ написан
    Комментировать
  • Как создать sql песочницу?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Первое. Песочницы можно создавать с помощью Docker.

    Второе. Настройками нужно ограничить настолько чтоб пользователь мог только лишь решить задачу leetcode
    и получить корректный ответ. Должны быть квоты на память, процессор и диск. Должны быть квоты
    на время исполнения query
    . Любая попытка превысить квоту - должна моментально прерывать сессию
    пользователя и перегружать контейнер.

    Проблема всех песочниц в том что они предлагают в чистом виде SQL-инжекцию. И это принципиально нерешаемо. Вобщем не забываем про fork-bomb и прочие трюки которые могут даже в условно безопасной
    песочнице создавать проблемы.
    Ответ написан
    Комментировать
  • Как использовать структуры данных на практике?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Программисты, будучи студентами на 1-2 курсе изучают алгоритмы и структуры данных (АСД) чтобы
    писать более эффективные программы. При этом задача использования DBMS им еще не ставиться.
    На этом этапе они учатся оптимизировать и понимать разницу между o(1), o(n^2), o(lon(n)) и т.п.
    алгоритмической сложностью. Сложность определяет, как будет работать выбранный алгоритм
    при очень резком (шквальном) росте исходных данных. И если ты это не учил, то ты сто процентов
    напишешь фигню и твой алгоритм никогда не завершиться, какой-бы мощностьи процессор у тебя
    ни стоял. И вот чтобы дать анализ такой ситуации, как раз и нужны знания АСД. А работа на пределе
    мощностей сегодня везде. Игры. Рендеринг 3д. Майнинг. Обучение языковых моделей.

    Работая с MySQL ты этого не видишь т.к. часть алгоритмов скрыта от тебя под фасадом SQL API.
    Но тебе и недоступны вышеперечисленные задачи. Их стек - шире чем тот что ты используешь.
    И если ты собираешся всю жизнь работать на PHP/MySQL то скорее всего АСД тебе действительно не
    нужны.
    Ответ написан
    9 комментариев
  • Как использовать декартовое произведение между двумя запросами?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Как всегда автор не указывает тип DBMS. В некоторых есть такой либеральный синтаксис что
    можно просто писать

    Oracle:
    SELECT * FROM tab1, tab2
    и это будет фактически работать как cross join. А в некоторых надо явно писать.

    SQL-92
    SELECT * FROM tab1 CROSS JOIN tab2
    Ответ написан
    1 комментарий
  • Как удалить предложение в столбце с типом TEXT?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Могу дать просто несколько советов как упростить работу с текстом.
    1) У тебя слишком много всего наворочено в одной строке. Разбей запрос на части.
    Например сначала сделай просто SELECT того что ты хочешь удалять. Почему это важно?
    Если ты ошибешся и сделаешь слишком либеральный квантор - то удалишь те строки которые
    удалять было не надо. И назад дороги нет.

    SELECT * 
    FROM 
     `sonnik` 
    WHERE 
     SUBSTRING_INDEX(SUBSTRING_INDEX(`text`, '\n', find_in_set('женщине или мужчине', `text`)), '\n', -1) 
              LIKE 'Сонник %' 
     AND text LIKE '%Сонник %';

    И просматривай глазами кандидатов на удаление.

    2) Вот это выражение 'женщине или мужчине' слишком строгое. В реальном тексте может
    быть многообразие склонений падежей и вообще слова могут быть с переносом через
    дефис на новую строку. Поэтому надо искать лемму или основу слова типа "жен".... "муж"

    И лучше использовать предикат ILIKE для регистро-независимого сравнения.

    3) И как всегда я выражаю своё ворчание по поводу этого тега SQL. Что такое SQL? MySQL? Postgres? Там возможности текстового поиска разные. Есть всякие текстовые индексы и прочие функции FTS.
    Ответ написан
  • Какой должен быть синтаксис у SQL запроса при конфликте?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Вот тут примеры и синтаксис пишут

    https://wiki.postgresql.org/wiki/UPSERT
    Ответ написан
    Комментировать
  • Можно ли в SQL-запросе использовать перебор значений конкретного поля с разделителем и без него?

    mayton2019
    @mayton2019
    Bigdata Engineer
    В классическом SQL нет возможности работать с массивами и списками внутри одной ячейки. Фактически - это таблица не удовлетворяющая 1НФ и поэтому она не имеет право на жизнь.

    Explode. Да, верно. Функция explode разворачивает строки на 90 градусов и позволяет посмотреть на participantid как на дочерние строки от основной таблицы. Но объем обработки как-бы возрастает и если вы передаете эти развернутые стороки на клиента то соотв. растет размер трафика. И работать с такой опухолью не лучше т.к. уникальность по PK/UK переносится на эксплоднутые атрибуты.

    Как с этим бороться? Никак. Надо переделывать софт.

    Like не работает. Это да. Это - проблема.
    Ответ написан
    3 комментария
  • Использование sql lite 3 и telebot одновременно несколькими людьми, будет ли ошибка?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Да все будет в порядке. Проскочит как сквозняк. Главное длительных транзакций не делать.
    И архитектура у SQLite - такая. Один процесс который держит открытым файлы sqlite.

    Вообще так вопросы спрашивать нельзя. Потому-что тут ответы и да и нет и оба верные.
    И автор должен быть в теме как работает мультипоточка в Питоне. Иначе получается
    как в анекдоте про "активного читателя" который пишет письма в "Академию Наук про
    подземный стук".
    Ответ написан
    Комментировать
  • Будут ли просадки по производительности при реализации фильтров интернет магазина через sql intersect?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Данный фильтр - слишком избыточен. Его можно переписать через

    SELECT * FROM products WHERE id IN (
        SELECT product_id FROM filters_products WHERE 
            (filter_id = 1 AND filter_value BETWEEN 1000 AND 4000)
          OR
            (filter_id = 3 AND (filter_value = 'Intel® Core™ i5 11400F' OR filter_value = 'AMD Ryzen 5 5600G'))
          OR
            (filter_id = 2 AND filter_value = 6)
    );

    В оригинальном запросе стоял INSERSECT и по идее надо было заменять предикаты на AND.
    Но я поставил OR поскольку мне кажется что автор тоже ошибается и INSERSECT - это
    слишком строгий фильтр и пересечение с ключами 1-2-3 даст пустоту. И скорее всего
    там надо объединение а не пересечение.

    Просадки-шмосадки... Будут или нет. Никто не знает. Смотрим execution план в двух вариантах. И сравниваем.

    Еще раз я призываю всех SQL писателей - указывать целевую dbms.
    Ответ написан
    8 комментариев
  • Зачем надо (1) в COUNT?

    mayton2019
    @mayton2019
    Bigdata Engineer
    С практической точки зрения - надо смотреть план исполнения запроса. Там будет указан тип сканирования и предикат как БД фильтрует строки. Если план для
    SELECT (1)
    не отличается от
    SELECT (*)
    то тогда можно считать что это - одно и тоже.

    Почему обсуждение теоретического SQL я считаю здесь вредным и бесполезным? Потому что ни я ни
    кто либо из присуствтующих стандарт SQL не читал. Это - закрытый и платный документ. И
    обычно нам достается не текст стандарта а текст самой реализации на Oracle/PG/MySQL.
    Вот и говорим о реализации а не о стандарте. А реализации бывают разные. В оракле например
    требуется фейковая табличка dual для пустых безтабличных запросов. В других dbms
    - фейковая табличка не нужна. Синтаксис другой.

    Если кто-либо из присуствующих читал стандарт SQL и знает как объявлено поведение count() - то прошу
    привести хотя-бы цитату.
    Ответ написан
    1 комментарий
  • Почему попытка обратиться к только что созданной таблице вызывает ошибку "no such table"?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Слушай автор давай табличку по другому переделаем. Вот так

    CREATE TABLE IF NOT EXISTS warning(id INT, user_id INT, count INT);


    А то твое изделие зашкварно совсем.
    Ответ написан
    Комментировать
  • Почему я получаю данную ошибку?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Мне кажется ты смешал в кучу две разные технилогии. Bind variables. Это вставка специальных переменных
    в тело DML/DQL запроса вместо значений. Это поддерживается на уровне БД. Это важно для БД потому что идет компилляция текста запроса для повторного его исполнения много раз.

    И интерполяция строк. Это просто тупо генерация новой строки. К базам не имеет отношения.
    Это поддерживается Python например. Строковой интепорляцией ты можешь сделать первую часть запроса.

    Сделать нечто вроде
    "UPDATE emp SET ename=? WHERE empid=?"
    (кстати в синтаксисе у тебя скорее всего была ошибка)

    И потом уже вместо вопросительных знаков добавить bind variables.
    Ответ написан
    Комментировать
  • Как реализовать удалённую БД с подключением через C#?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Держать удалённую БД имеет смысл только если ей пользуется много людей одновременно. Если для себя - ну поставь SQLite или Express на ноутбук и живи себе припевающи.

    Раз в недельку делай backup на свой удаленный диск чтоб не потерять.
    Ответ написан
    Комментировать