Вы видите копию треда, сохраненную 5 августа 2022 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
Туториалы на русском для тех, кто не умеет гуглить, не может в английский и вообще готов жрать что угодно:
SQL:
- MySQL, Postgres, SQL Server: https://metanit.com/sql/
- Синтаксис SQL кратко: https://learnxinyminutes.com/docs/ru-ru/sql-ru/
- Плейлисты по разным СУБД: https://www.youtube.com/c/SQLDeveloperBI/playlists
- Тоже плейлист, сортировка хуёвая: https://www.youtube.com/watch?v=EHvzvwAv7RU&list=PLY7PmJJFH5nT-lbFKxfbp3rw5BBuq5Azo[РАСКРЫТЬ][РАСКРЫТЬ][РАСКРЫТЬ]
- https://www.youtube.com/c/SQLDeveloperBI
NoSQL:
- MongoDB: https://metanit.com/nosql/mongodb/
- Cassandra: https://proselyte.net/tutorials/cassandra/
На инглише:
SQL:
- https://www.w3schools.com/sql/
Литература:
- Прибыл Фейерштейн. Oracle PL/SQL. Для профессионалов - если уметь исказть, можно найти бесплатно без СМС и на русском.
- Алан Бьюли. Изучаем SQL. - про MySQL, тоже легко находится. Довольно старая, но базовые вещи не сильно меняются.
- К. Дж. Дейт. Введение в системы баз данных - талмуд на овер 1000 страниц.
- Томас Кайт. Oracle для профессионалов - тоже талмуд.
Задачки для оттачивания sql-скилов:
- https://www.sql-ex.ru
- http://sql-tutorial.ru/
- https://www.codewars.com/?language=sql
ETL, OLAP, DWH и другие умные слова:
- https://www.youtube.com/watch?v=WPZuzDJXs-Q&list=PLhhjwMYxzolhP29LSPPwORVQxJX5OjYix[РАСКРЫТЬ][РАСКРЫТЬ][РАСКРЫТЬ]
- OLAP DAX Power BI: https://www.youtube.com/playlist?list=PLhhjwMYxzolhXuySjLR2_n-xb6VvWnjju
Прочее:
- https://dbdb.io/
- https://db.cs.cmu.edu/
- https://www.youtube.com/channel/UCHnBsf2rH-K7pn09rb3qvkA/playlists
- Сравнение диалектов SQL: http://troels.arvin.dk/db/rdbms/
- Как БД работают изнутри: https://habr.com/ru/company/mailru/blog/266811/
FAQ:
Q: Нужно ли знать английский?
A: Да.
Q: Что лучше, SQL или NoSQL?
A: Как обычно, зависит от задач. Нужна любой ценой скорость - бери NoSQL, нужна согласованность данных - SQL. У всего свои плюсы и минусы, и в обозримом будущем ни один подход не заменит другой полностью.
Q: Вопросы с лабами и задачками
A: Смело спрашивай, с вероятностью больше 50% ответят, но могут и обоссать.
Здесь мы:
- Негодуем, почему шапка - говно, и предлагаем коллективному ОПу идеи, как её улучшить.
- Разбираемся, почему PostgreSQL - не Oracle
- Пытаемся понять, зачем нужен Тырпрайс, если есть бесплатный опенсурс
- Обсуждаем, какие новые тенденции хранения данных появляются в современном цифровом обеществе
- Решаем всем тредом лабы для заплутавших студентов и задачки с sql-ex для тех, у кого завтра ПЕРВОЕ собеседование
- Анализируем, как работает поиск вконтакте
- И просто хорошо проводим время, обсирая чужой код, не раскрывая, как писать правильно
Не будет.
Спасибо конечно, но эту книгу я уже приметил . Расскажи лучше как сам вкатывался, что проблемы вызывало, как начинал.
Пофиксил
хуево у тебя с пеинтом, попробуй еще раз
>SQL:
- https://www.w3schools.com/sql/
хуже гайдов с метанита, но чет я теряюсь в метаните, там просто все прочесть?
На O'Relly можно крабить бесплатный триал, выбирай на свой вкус.
Как мне его мягко убедить, что у нас не те объемы и тормозит все из-за говнокода и кривой модели данных?
Таблицы еще маленькие, по логике не имеет смысла, и врядли в ближайшие годы этот смысл понадобится но он потестил и с партицированием быстрее((
Или не париться и пусть делает, раз так хочет?
1. Бизнес готов давать деньги на "ковыряние в табличках"? Обычно средства на это выделяются, когда все нахуй падает или приходит запрос от клиента, что у вас все хуево. Тем более партиционирование повлечет еще немалые изменение в коде апликухи, что тоже бьет по карману бизнеса;
2. Сравни время выполнения через СУБД и через апликуху. Если все так, как ты написал, то есть смысл тогда ковыряться в коде.
Не совсем по реквесту, но похую
https://blog.bradfieldcs.com/how-to-learn-about-database-systems-40c7432f471d
Умный человек может любые цифры представить как ему выгодно (и обмануть самого себя).
Придется тебе быть умнее.
Почитай книги.
Нет, оперировать и переставлять местами термины из гугла не достаточно. Выдвигай гипотезы. Измеряй. Делай выводы.
Совсем измельчал программист нынче
Ой, бери на себя поменьше.
Ты не прав. Мнения в треде не разделились. Они вообще не представляют собой какую-то выборку. Суть обсуждения в треде не позволяет делать выводы о количествах мнений. Это же не опрос каждого имеющего дело с базами данных. Люди публикуют мнение, когда видят, что ранее их мнение в треде еще не было представлено.
Вот в данном обсуждении взвешенный научный подход плохо представлен, поэтому я это и написал.
И да, в тот момент когда программистишки совсем запутываются, они приходят ко мне.
Какой хороший программер. Если БД хоть немного склонна к росту, то заложить секционирование в модель данных - это ОЧЕНЬ хорошая практика.
Ну и по-человечески, людей надо подбадривать. Если хочет человек что-то хорошее сделать и у него по остальным пунктам не полный безотлагательный пиздец, то пусть делает.
в чем дилемма ? не понято.
Что в твоей задаче нужно делать - то и делай.
Нет никакой "бест практис". Мозг включать - вот бест практис.
Как там смена на заводе?
Ну улицу и район точно нужно извлекать, номер дома хз, т.к как справочная информация не особо имеет смысл, но с другой стороны оставлять в фактах так как есть, тоже не дело. Извлекайте, шура.
Ну и какую проблему ты решишь таким извлечением? Смысл был бы, если бы адрес был не у всех событий, а так при любых действиям с событиями придётся делать лишний джойн, писать один лишний инсерт/аплейт, ебаться с объединением данных на уровне приложения. Можно хоть для каждого столбца завести по таблице, чтобы они все форенкеились с таблицей событий, где единственный столбец - ID, но что это тебе даст?
Номер транзакции Отправитель Получатель Сумма
1 Кабан Сычев Сотыга
2 Сычев Пориджная 0.5сотыги
3 Кабан Сычев 0.5сотыги
4 Сычев Пориджная 0.3сотыги
5 Пориджная Кабан 0.8сотыг
чтобы узнать сколько денег у Кабана, Сычева и Пориджной?
читай мануал по group by
transactions (debit_acc, credt_acc, amount)
select debit.debit_acc, credit.credit_amount - debit_amount balance
from (
select debit_acc, sum(amount) debit_amount
from trans debit
group by debit_acc
) debit
join (
select credit_acc, sum(amount) credit_amount
from trans credit
group by credit_acc
) credit on debit.debit_acc = credit.credit_acc;
Даст быструю аналитику по район/улица.
>Можно хоть для каждого столбца завести по таблице, чтобы они все форенкеились с таблицей событий
Ну так обычно в реляционных бд и делают, все кроме самих фактов выносят в отдельный справочник. Адрес это явно справочная информация.
И второй момент: у меня есть задача которая раз в час проходится по этой таблице и удаляет из нее все записи старше 90 минут (чтоб таблица не захламлялась старыми записями). Для этого сейчас на поле created_ts навешен обычный betree индекс, можно ли заюзать что-то более подходящее?
>insert into tab values (1,now());
так не можешь чтоль?
>можно ли заюзать что-то более подходящее?
Заюзывай, разрешаю.
Узнать что же на самом деле подходит в твоем случае, тебе придется самому.
Но ты можешь по своему зумерскому методу решения проблем копировать всякую хуйню с Двача и Stackoverflow.
Давай. Мы ждем.
1) Проставь default now() для строки нужной.
2) Я бы такие говна вобще в кеше хранил, в каком-нибудь redis
Суть вот в чем: есть таблица где хранятся: user_id, idem_key, created_ts
Это (очевидно) айдишник юзера, ключ идемпотентности и таймстемп. Когда юзер проводит транзакцию на перевод внутренней валюты другому юзеру, мы сохраняем в таблице строчку с соответствующими данными, на пару (user_id, idem_key) установлен индекс уникальности, так что если сохранится вторая такая пара, БД выдаст ошибку которую обработает приложение - это сделано для избежания дублей запросов с клиента. Эту идею я подсмотрел спиздил из статейки https://habr.com/ru/company/yandex/blog/442762/
По факту туда можно прикрутить Редис, но как его использовать в таком случае? Как очищать устаревшие данные в кеше?
Редис умеет в time to life
постгрес качай
Когда ты пердолишся таблицой как правило происходит её блокировка, чтоб пока ты читаешь/пишешь туда данных не напиахли
для этого и нужен TRANSACTION ISOLATION LEVEL .
Их 4(или 6, в зависимости от реализпации):
1) READ UNCOMMITTED - читаем как есть ничё не лочим. Если кто-то вставляет/удаляет, можем прочитать хуйпойми что.
2) READ COMMITTED - лочим только строки которые читаем, чтоб их не изменили.
3) REPETABLE READ - это когда в рамках одной транзакции нам надо сделать несколько чтений, если уровень изоляции ниже этого условно каждый селект будет накладывать свою блокировку. При этом режиме блокировка действует в рамках всей транзакции.
4) SERIALIZABLE - накладывает блокировку на строки ПЛЮС запрещает делать инсерты в таблицу. Т.е. в п3 мы залочили строки, но если нам напихали инсертов, появились новый строки.
Разумеется, ручной откат транзакций людям нужен. На каждую ситуацию есть свой потребитель.
Кроме того, serializable - самый тупейший, но рабочий способ избежать некоторых логических ошибок в приложениях.
Но ты так не делай. Изучай.
>>236446
спасибо, но это я и так знал, я не понимаю реального применения. У меня есть несколько потребителей Sql базы (см. приложения), каждый из них делает по 200-300 CRUD реквестов в секунду, на каком они уровне это делают, READ COMMITTED?
И хотел бы узнать хоть один реальный пример отказа транзакций. Единственное, что приходит на ум - это снятие дедлока/транзации с каскадным откатом (типо удаление зависимых данных).
> READ COMMITTED
По дефолту обычно да, в ОРМ можно указать уровень изоляции.
>И хотел бы узнать хоть один реальный пример отказа транзакций
1) Запись большого блока данных, чем делать 100 инсертов, лучше сделать одну транзакцию и в рамках неё исполнить все инстерты, и если у нас один инсерт фейлится, отменяем всю транзакцию.
2) Надо записать связанные данные, с одного счета списать на другой положить.
ты блядь совсем тупой? прочитал 5 раз и ничего не понял?
Представь ситуацию, когда ты два раза нажал в интернет-магазине кнопку Оплатить, а магазин писал такой тупень как ты и он исправно отправил два запроса в банк, но на карте у тебя только N денег, но товары стоят 2*N.
Ключ идемпотентности
on duplicate key update col=col
Дополнительная табличка post_id - tag_id.
это тебя в шараге такому учат, что 2 клика по кнопке создают 2 транзации? Пиздец тут советчики
потому, что тут есть адекватный анон, а не долбоеб, который не знает про дебаунсер
Даже не так, как можно сделать bulk upsert средствами именно sql?
Я имею ввиду что в некоторых бд(например в марии), есть встроенные механизмы чтоб это сделать, а в некоторых нет, если универсальный способ?
Вопрос в том, как происходит обновление данных в этом jsonb. Если нужно обновить 1 значение, как поведёт себя субд - будет переписывать весь столбец или есть какой то механизм, позволяющий апдейтить только часть? Судя по описанию jsonb_set() нужно обновлять весь столбец, но всё же я надеюсь на второй вариант.
с чего это ты решил, что функции связанные с json каким-то образом поменяют внутреннее устройство postgress ?
Просто поле. Просто меняется все целиком. Но есть кое-какие дополнительные функции.
Я, кстати, документацию даже не открывал. И так все понятно. Революция так просто не делается.
SQL Server, запросы звучат как:
1) Вывести средний срок доставки заказа для каждого месяца 2020 года. Заказ относим к месяцу по дате отправки.
Соответственно названия строк date_order_dispatch(дата отправки заказа), date_order_accepted(дата принятия заказа), Таблица с заказами orders
2) Для каждого склада вывести количество ожидающих выдачи заказов
Тут даже без понятия, что указывать, потому что есть просто таблица Склад, где только Название и Адрес
Через management studio да, могу
А чем не соответствует? Просто логические на русском, а физические имена на английском
Понял, путаница с таблицей Orders. Дата отправки и приемки вообще в других таблицах
select trunc(дата отправления заказа,'mm'),avg(дата доставки на склад назначения-дата отправления заказа) from история перемещений where дата отправления заказа>to_date('01.01.2020','dd.mm.yyyy') and дата отправления заказа<to_date('01.01.2020','dd.mm.yyyy') group by trunc(дата отправления заказа,'mm')
попробуй вот эту хуйню переписать с нормальными названиями таблиц и полей.
>>245077
вот второе какой же хуйнёй я занят в отпуске
select
склад.номер склада,count(*)
from склад join история перемещений on история перемещений.номер склада назначения=склад.номер склада left join выдача on склад.код адреса=выдача.код адреса выдачи and история перемещений.ID заказа=выдача.ID заказа where дата доставки на склад назначения<=sysdate and nvl(дата выдачи,sysdate+1)>sysdate group by склад.номер склада
>select trunc(дата отправления заказа,'mm'),avg(дата доставки на склад назначения-дата отправления заказа) from история перемещений where дата отправления заказа>to_date('01.01.2020','dd.mm.yyyy') and дата отправления заказа<to_date('01.01.2020','dd.mm.yyyy') group by trunc(дата отправления заказа,'mm')
Не распознал trunc:(
>select
>склад.номер склада,count(*)
>from склад join история перемещений on история перемещений.номер склада назначения=склад.номер склада left join выдача on склад.код адреса=выдача.код адреса выдачи and история перемещений.ID заказа=выдача.ID заказа where дата доставки на склад назначения<=sysdate and nvl(дата выдачи,sysdate+1)>sysdate group by склад.номер склада
nvl не распознает теперь
Попробуй заменить nvl на ifnull с такими же аргументами. Если и ifnull не найдёт, замени на isnull.
>>245099
>Не распознал trunc
>nvl не распознает теперь
Ну я в основном с ораклом работал поэтому и написал на оракле, гугли аналоги функций в твоей СУБД.
>>245100
> годы энтерпраза и прокачанный libastral.so.
Полтора годика в банке всего.
>>245104
Скорее всего не проканает, функции выглядят как будто вернут буль а не значение, разые что через кейс переписывать.
>>245103
>насчет ошибок буду до препода доебываться
Препод выкупит что запрос под другую среду написан и написал его не ты, шанс быть обоссанным огромен.
Погуглю, чтобы не обоссали, спасибо
Всю голову уже сломал, потому как с SQL особо дела не имел никогда.
Суть: есть таблица с полем Time (временная метка). От условного клиента приходит запрос на выборку записей с Time >= From и Time <= To. Первую и последнюю запись в этой выборке будем называть граничными, если Time == From или Time == To, иначе - внутренними (Time > From, Time < To). Также клиент передает флаг IncludeBounds, действующий следующим образом: если IncludeBounds == True и крайняя запись (первая или последняя) - внутренняя, то необходимо включить в выборку запись с временной меткой прямо перед ней/прямо после нее (для первой и последней записи соответственно). Диалект - PostgreSQL. Очень хочется выполнить всё это средствами запроса в SQL и не прекладывать фильтрацию крайних записей на клиента.
С меня сотни нефти, если подскажете, в какую сторону смотреть. Видел оконные функции в мануале по pgsql типа lag и lead, но никак не могу ввернуть их в свою развесистую логику.
Сделать view в котором уже будет lag и lead, и выбирать из него.
конечно
Да
1. С параллелизмом всё плохо, транзакции выполняются последовательно.
2. Нет хранимых процедур
Но если использовать sqlite по назначению, никаких подводных.
Это процедуры, и они хранимы.
На них можно программировать прямо в БД, это как функции/методы в обычных языках. Впрочем, некоторыми это считается плохим тоном.
То есть написать десктоп софтину с sqlite для своего офиса из 10 человек с небольшим количеством запросов это норм и проблем не будет?
Смотря что за софтина, но скорее всего норм.
Как бля такую ебалу на sql написать
https://boomin.ru/articles/insaydy-kak-proanalizirovat-portfel-ssudnoy-zadolzhennosti/
Вроде такие ебалы на sql не пишут, а обычно делают sql-запрос с вытягиванием данных в нужном формате для BI-тулзы типа Power BI Desktop. Есть ещё любители подушить своего питона с Pandas.
Если нужен sql, то советую писать не сразу весь огромный запрос, а итеративно через кучу промежуточных представлений на with ... as... Например, сначала рассуй свою основную сущность, от которой всё производится (инфа о кредитах одного человека, видимо) по месяцам, потом на основе этого представления делай ещё представление с уже конкретно интересующей сущностью (взятый в этом месяце краткосрочный кредит по месяцам), потом ещё представление с нужными параметрами для рассчёта интересующего параметра (например, количество краткосрочных кредитов в месяц, если нужно посчитать их процент), потом на основе всего уже финалочку: месяц есть, размер когорты есть, количество краткосрочных кредитов за месяц есть, осталось посчитать процент. Ну ты понел идею, и постгресовская рекурсия не понадобится.
У меня чуть кишка не выпала писать простенькую рекурсию с пересечением периодов просрочки по одному контрагенту на разных сделках, тут логика сложнее, вообще ёбнуться можно.
Да, я так и думаю по кусочкам данные вытащить. После загнать их в Excel или Power BI.
Power BI хорош, но у меня железо не может его переварить если там много данных.
В общем случае для каждого значения создаётся по новой записи в таблице:
id | value
1 | 1
2 | 3
3 | 10
4 | 100
Ещё некоторые СУБД поддерживают коллекции в колонках (массивы, json и т.д.), но там есть свои проблемы.
Живой пример файрфокс, с ублюдским зависанием при обращении к истории или закладкам
Я так понял, что это называется репликацией, но не нашел нормального пошагового гайда.
Для тебя - никак. Просто купи самый дорогой и большой сервер который можешь себе позволить. Не надо масштабировать СУБД (по крайней мере тебе)
Узнаешь что такое Настоящее АЙТИ, с легаси-фреймворками и выгоришь. Ты легко отделался, т-щ sql-аналитик.
Кстати, ты apache superset уже поставил? Зачем тебе вообще приложения писать, если есть apache superset ?
это просто формирование текста запроса на ходу, вплоть до формирование текста sql средствами sql.
Нихуя интересного. Кто-то сдался без боя не смогши написать обычный SQL иди написать приложение.
>Для тебя - никак.
Что ж ты так категорично, лол.
Мне для запуска двух WoW серверов надо было. Разобрался, кстати.
Да в частности никаких подводных, за 2–3 месяца наглаживания питона сможешь свободно свои данные вертеть в каком-нибудь пандасе. Питон вообще нужен только для датасатанизма и говноскриптов. А вот для погромирования в целом тебе такая прорва знаний понадобится, что охуеть не встать, лучше сначала выбери один стул из трёх: десктоп, мобилки или веб. Ну и долби эту область до посинения, там везде фрактал технологий, на всю жизнь хватит. Если ты ради денег всё это затеял, выбирай жабаскрипт и веб, бонусом потом получишь говнокод на мобилках. И как языки javascript и python это два брата-акробата. Питон, конечно, лучше задизайнен, но склонность к говнокоду они развивают одинаковую. Если же погромировать хочется из любви к искусству, то я бы брал десктоп и дотнет, туда Хайльсберг натаскал столько фич из разных языков и парадигм, что потом сможешь перекатиться куда душе угодно и всё тебе будет казаться знакомым.
все
["maryland", "prowler", "twitterpluck"]
Мы выбираем из таблицы entity только те строки где name равняет одному из тех что оказались в списке. Как это правильно сделать? Ебануть switch-case? Какой-то индекс к колонке стоит добавлять?
select * from entity where name in ('maryland', 'prowler', 'twitterpluck')
Для генерации списков такого вида и передачи их в запрос в твоём языке наверняка есть что-то готовое.
Индекс по name, конечно, нужен.
цель - построить модель БД, отобразить связи между сущностям.
задание такое - каждому студенту выдают базовый набор при поступлении на первый курс:
один учебник по истории;
один учебник по экономике;
один учебник по высшей алгбере;
один учебник по матанализу.
у каждого учебника есть индивидуальный номер из библиотеки и год выпуска книги.
Вопрос такой, какие связи тут использовать? изначально построил многие ко многим, но засомневался. сомневаюсь, потому что по сути один студент и одна книга по каждому предмету. не должно быть тут один ко одному?
есть у кого какие мысли?
students (id, name)
books (id, name, year)
book_copies (id, lib_number, book_id -> books.id, student_id -> students.id)
У тебя ведь есть в задаче индивидуальный номер учебника в библиотеке, это он и есть. Его можно было бы использовать как первичный ключ вместо book_copies.id, но если он не считается простым инкрементом счётчика и должен быть в определённом формате наподобие "2017/А/453-нд", лучше его хранить отдельно.
>Кстати, ты apache superset уже поставил? Зачем тебе вообще приложения писать, если есть apache superset ?
А в чем связь?
>>249625
>датасатанизма и говноскриптов
Учитывая что я собственно и не умею писать говноскрипты и не работаю в пандасе, то думаю начать с этого, чтобы освоиться немного.
Веб звучит интереснее
>"2017/А/453-нд"
А в чем смысол таких названий? чтобы получать максимум информации просто взглянув на название, и знать к какому модулю программы это относится, или что?
мимо
Подобные номера появились задолго до программирования, в каких-нибудь бумажных картотеках и документах часто такая нумерация, потому что нет удобной централизованной базы данных, которая бы нумеровала по счётчику, и приходится придумывать, как обеспечить уникальность номеров так, чтобы было более-менее удобно упорядочивать и искать. Такое юзается везде - учётные карточки в библиотеке, серия/номер паспорта, банковский счёт, номер телефона и т.д.
То есть даже в каких-то современных системах, это сделано для удобной системы карточек (если вдруг понадобится)?
По-разному делают, не только для удобства. Часто там, где внедряют ПО, уже есть классический учёт на бумажках, и приходится для сохранения "обратной совместимости" добавлять его поддержку. Где бизнес-процесс организуется с нуля, иногда могут обойтись без этого.
1. Таблица где все студенты
2. Таблица "виды учебников"
3. Таблица, где все учебники с номерами и ссылка на вид учебника
4. Таблица, где связано когда, кому и что выдано / возвращено. Ссылка на студента и ссылка на учебник.
С такой системой ты сможешь посчитать остатки учебников в библиотеке, узнать какие учебники на руках у конкретного студента в любой момент времени, узнать каких учебников студент недополучил/переполучил и т.д.
Нужно изучить postgres, так как формат степика ближе всего, нашел там https://stepik.org/course/97207/promo?next=
Нормально ли изучить по нему будет? Не попаду ли на косарик?
Зачем? Если так невмоготу читать книги, есть куча бесплатных курсов.
для полной картины
Нет, указание имени должно было работать, и хардкод айдишника с точки зрения читабельности - говнокод. Хуй знает что там за проблема, эта хреновина же нормальные сообщения об ошибках не выдает.
Иди нахуй, шиз
>2255734
этот прав, тебе надо привести сначала было в один регистр
where upper(category.name)='GOVNO'
ты старьем называешь "Кэри Миллсап, Джефф Хольт. Oracle: Оптимизация производительности"?
там вроде не поменялось нихуя. Как 20 лет назад он зумеров обоссывал и сейчас все актуально.
1864x720, 0:30
Написал генератор простых чисел на чистом sql. За 11 секунд строится последовательность до 1 миллиона.
На ум приходят только транзакции какие-нибудь
>Значение 1000000, указанное для параметра MAXRECURSION, превышает допустимый максимум 32767.
MSSQL. Стек вызовов не бесконечный.
Вроде в каких-то можно числовую последовательность функцией просто сгенерить. В postgres generate_series есть например.
Но я упор на быстроту делал.
А так переделал Having в краткий вариант c минимумом, вроде на секунду быстрее, показывает всегда 10 секунд так милионную последовательность. Но всё остальное оставил, как было. Так как так быстрее работать будет.
Надо рассматривать только цифры, которые оканчиваются на 1, 3, 7 или 9 и в условие соединения поставить делимость на 2 3 5 7. По этой причине лучше через UNION граничные условия отработать, так как числа 2 3 5 7 не попадут туда. А разница в производительности большая, если убрать это условие.
Еще числа надо проиндексировать, поместив во временную таблицу, так как оно потом само с собой соединяется.
Я проверял, что при установке индекса на колонку с числом во временной таблице, где все числа лежат, быстрее в 1,5 раза работает.
Без индекса 16 секунд, а с ним под 10.
>ты старьем называешь "Кэри Миллсап, Джефф Хольт. Oracle: Оптимизация производительности"?
Да.
>там вроде не поменялось нихуя
Хз, конечно, книга 2006 года, уже экзадаты хуедаты появились у которых свои фишки в оптимизации. Но если основы особо не поменялась, то спасибо, почитаю её.
Я со стака взял, самому лень.
С помощью анонов выше, я написал работающий вроде запрос. Препод сказал, что логика хуйня, но не суть. Мне нужно поставить правильное условие where.
Суть условия в том, что, если в таблице История_перемещений в строке Дата_доставки_на_склад_назначения есть заказ, а в таблице Выдача вообще нет этого заказа, то нужно его вывести.
То есть нужно вывести заказ, который приехал на склад (о нем есть запись в таблице История_перемещений) и у которого нет записи в таблице Выдача. Как это сделать?
Я всё ещё тупой, если что-то неправильно пишу сердечно прошу простить
Соединить таблицы левым соединением (где слева будет таблица выдача) и в where прописать "Выдача.<какое-то поле> is null"?
Пример
Ну смотри, вот получил ты джейсон с внешней системы, тебе его надо распарсить и разложить по столбцам, это будет правильный реляционный подход. Хранить же в отдельном столбце весь джсон имеет смысл, только если там какая-то дополнительная информация, например исходный не распаршеный джсон, или там комментарии и тех параметры, или например схема, т.е. данные которые возможно пригодятся пользователю, но поиск в которых ты не планируешь. Есть механизмы позволяющие работать джсонами внутри бд, но я более чем уверен работает этот медленно как говно, да если ты дотсанешь сначала 100 строк, потом заглянешь в джсон и как-то их отфильтруешь\выведешь только части джсона, да это валидный сценарий, а если ты достнёшь сто тысяч строк, и полезешь что-то искать в жсоне, то ты сам себе в жопу только выебешь.
а монга?
Все так. Но можно сделать индекс по вычисляемому полю и заебись залетает.
Стандартный программист конечно охуеет от такого...
Спасибо, только почему-то корректно сработало is not null
>2258828
Ну это в компетенции data-инженера. Таких персонажей я не встречал тут
Не знаю как это называется. Но я почему-то считаю это миксом бизнес аналитика и SQL девелопера, потому что нужно нихуево так разбираться в бизнес логиках, в том как устроены все данные, в качестве данных, в том, чтобы скрипт работал охуительно быстро и чтобы к бизнес логике даже самый прошаренный управленец не смог бы придраться. Ну пусть будет дата инженер, похуй.
Надоело горбатиться за копейки.
Это я, 150к получаю. И это не дата инженер, это ДВХ разработчик
Смотрите. Вот у меня есть таблица Clients. В ней есть всякая информация. Но есть поле(колонка) Port. Думаю можно догадаться, но я поясню. Port - это TCP-порт(1-65535) по которому с подключенным клиентом можно коммуницировать через мое приложение. Но не суть. А суть вот в чем. Я хочу, чтобы при добавлении в БД нового клиента этот порт присваивался. Порт должен быть уникальным, но с условиями: есть табличка ForbiddenPorts в которой, как нетрудно догадаться из названия - перечислены порты. Есть табличка: ServerSettings где есть всегда запись: StartPort - это минимальное значение порта который можно использовать и ServerPort - порт который использует сервер для подключения клиентов(может быть больше стартового, потому его тоже нельзя использовать).
Как на текущий момент делаю я. Я на уровне своего приложения все разруливаю. Но меня это смущает. Во-первых, пришлось жуткий велосипед с очередями реализовывать. Во-вторых, мне кажется, что с этим БД должна справляться быстрее.
Я знаю, что в большинстве СУБД - есть такая штука как триггеры. Вот я и хочу намутить триггер на вставку нового клиента. Вот только я чет не совсем понимаю как это делается.
если ты какую-то ебалу сетевую с длинным сроком жизни пишешь, то лучше сразу проектировать "порто-независимый" протокол, иначе клиенты все равно потом хлебнут горя с nat-ом и корпоративными админами.
Все это весело выглядит, но несерьезно.
Если это постгря, то собираешь все свои занятые порты через union и выбираешь из серии что-то не из них.
http://sqlfiddle.com/#!15/9eecb7db59d16c80417c72d1e1f4fbf1/42458
Всю это ебалу можно завернуть в скобки как значение при вставке.
Что конкретно-то? Выделять порты клиентам - это фича, которая в любом случае нужна. Выносить это на сторону базы, ну, да, я как-бы не хочу, но суть в том, что иначе - пришлось делать очень уродливый велосипед, с очередями и прочим и этот велосипед меня бесит своим наличием. Хочу чтоб в коде приложения просто было:
if(isNewClient){db.Add("ClientsTable", clientFactory.CreateNewClient(registrationRequest));}
А вместо этого там огромный уродливый монстр, который все равно лезет в базу, проверяет кто уже зарегался, ищет дырки, лезет смотреть кто заблокированные порты. Единственный плюс на стороне приложения, что я могу еще проверить что там система юзает в данный момент и если юзает - пропустить данный порт и пойти к следующему.
Значит затеял небольшой проект для себя - анализ аукциона в вов. Уже сейчас понимаю предметы отслеживаемые надо как-то группировать их по нужным мне критериям: количество, цена, если предмет можно переделать в другой которой можно продать дороже, если у предмета падает цена в течении какого-то периода, его давно было на ауке и тп.
Пока у меня только одна таблица с айдишником предмета и указанием по какому полю его фильтровать наличие\цена\количество и тд.
Как вот такое можно сделать нормальным способом? Запилить таблицу "Группы" где одно из полей отвечает за условие и потом айдишник записи присваивать отслеживаемым предметам?
*охуевает по-девопски
давай сначала.
Зачем ты выделяешь порты клиентам?
Что есть клиентское приложение?
Ты знаешь значение таких терминов как : http, json, websocket ?
> Зачем ты выделяешь порты клиентам?
Чтобы, сокет открыть. Что тут может быть непонятного?
> Что есть клиентское приложение?
Приложение, в котором реализована логика взаимодействия с сервером. Ну хули тут объяснять? Есть протокол. Есть PDU всякие. Есть логика приложения, построенная поверх этого протокола. Сидит-пердит, по таймеру просыпается, пытается зарегистрироваться, если да - погнали дальше делать штуки прикладного уровня, если нет - спим дальше.
> Ты знаешь значение таких терминов как :
Знаю. Но эти технологии к тому что я делаю - не относятся.
если ты какой-то железячник и впервые пишешь БД - просто не лезь в триггеры.
Никакого ускорения (которое ты считаешь важным) не будет.
у тебя уникальность порта подтверждается в момент его открытия для прослушивания. ну вот ориентируйся на это
Как эффективнее всего выучить уровни изоляции транзакций, когда я работаю с базой через Hibernate или Spring Data? Может быть есть какое-то мнемоническое правило?
SERIALIZABLE
REPEATABLE READ
READ COMMITTED
READ UNCOMMITTED
Их как минимум 4 вида. На собеседовании всегда спрашивают какую и когда использовать и начинают ворошить кишочки всяких спринг дат и прочих хибернейтов, плавно переходя к работе PostgreSQL
Спасибо. Нужно как-то заучить эти правила. Карточки в Anki создать что ли...
их не надо учить.
их надо понять
основное везде READ COMMITTED
c остальными хер ты встретишься.
Серриалайз при апдейтах юзают
На собеседованиях попускают и смеются в лицо, когда я не могу объяснить где какую использовать.
Почему говно, идеальная система: дружелюбный интерфейс, высокая надёжность, лёгкость настройки отчетов. Рекомендую записаться на курсы от Нетологии!
Очевидно потому-что само 1с негибкое говно, работающая с БД через залупу, да и вобще это не аналитическая система. Ты же не задаёшься вопросом почему в валенках не бегают кросс?
>>262648
Вот залил, 3-5 и 3-6 день про транзакции
https://rutracker.org/forum/viewtopic.php?t=6164123
ты хоть базу 1с открывал? там нет аналитики. Ни о каких кросс-запросах и речи нет. Работать быстро это в принципе не может.
Там с большим трудом можно разобрать все файлы словаря чтобы добраться до самих значений. А таблицы они называют "регистры" (Не спрашивай откуда я это знаю.)
Короче, это днина.
Однажды Эрнест Хемингуэй поспорил, что напишет самый короткий рассказ, способный растрогать любого. Он выиграл спор, написав всего 3 слова: «Аналаитика в 1С»
>Ни о каких кросс-запросах и речи нет
Да ладно ?! Можно подкллючать внешние источники через ODBC.
Там проблема в том, что отчеты слабо интерактивны. Мы данные с 1Са в BI выгружали все равно для более серьезной аналитики.
>А таблицы они называют "регистры"
Регистр - это один из видов объектов. Чё ты несешь.
> Работать быстро это в принципе не может.
Я базу и 4ТБ видел на 1Се (в связке с MSSQL). Дело не только в 1С, а в кривых руках.
П.С.
И называют они их регистрами, потому что прикладной разработчик оперируют объектными терминами, а не реальными таблицами СУБД. Не так часто на урокень СУБД приходиться опускаться. Обычно это задачи производительности, когда план запроса надо анализировать, который в реальности выполняется.
Внезапно, также как и в любых других технологиях.
Это по сути тот же ORM в нормальных ЯП, но не совсем.
П.С.П.С.П.С.
А аналитикой там как таковой не занимаются.
Это в первую очередь система для получения первичных данных, сводных отчетов и регламентированных.
А производить какую-то АНАЛИТИКУ ДАННЫХ с поиском закономерностей, крутить кубы и вот это вот всё - это не задача баз на системе 1С в принципе.
Есть дочерний продукт 1С:Аналитика (это не относится к платформе 1С - это стороння BI система от фирмы 1С) - вот там пытаются какое-то подобие сделать.
А аналитиками в 1С других людей называют.
Проблема терминов и не понимания, что для чего используется.
Сущности одного типа и лежат в одной таблице. Фильтры применяются ко всем сущностям, пагинация только по предкам.
>И называют они их регистрами, потому что прикладной разработчик оперируют объектными терминами, а не реальными таблицами СУБД. Не так часто на урокень СУБД приходиться опускаться. Обычно это задачи производительности,
Причем, если бы они это делали как средние разработчики изначально, сейчас бы любая дура с PowerBI наклепала бы отчетики - закачаешься.
Можно ли извлечь значение из таблицы, и сразу же сравнить его с имеющимся значением, чтобы получить true или false и выполнить, либо не выполнить следующий запрос?
Если да, то как?
Судя по всему, пизда дата инженерам скоро
В 1С, битрикс.
1280x720, 1:15
так уж повелось в айтишечке. Операционная система разграничивает процессы на основе идентификатора юзера.
Например ты мог бы сделать CREATE TABLE EXTERNAL FILE '/etc/passwd' и потом сделать select * from .
И это реально работавший случай в базах данных великого прошлого
>Например ты мог бы сделать CREATE TABLE EXTERNAL FILE '/etc/passwd' и потом сделать select * from .
Что произойдет? Какие-то пароли извлечет?
Ты как-то неправильно понимаешь информационную безопасность. Любая извлеченная информация повышает вероятность взлома.
Например, ну там будет юзер anna с очевидным паролем anna123.
А вообще в былые времена дельфятники (эта конструкция из Firebird) легко могли под root запускать бд на линупсе.
Люди простые и незнакомой среде не разбирались.
гранты обрабатывает БД оперируя своими объектами.
Вот только эти объекты из реальной жизни, а не теоретические. Они позволяют и файлы читать и внешние программы запускать.
Да я к бд отношения особо не имею. Я админиню домен как могу и хочу понимать смысл всего этого
Потому-что по дефолтным пользвотелем несекьюрно, и если тебе нужен доступ к информации на другой машине, отгребешь проблем.
Через мсскуль можно получить доступ к командной строке
Есть несколько сотен тысяч географических точек (широта/долгота). И они хранятся в БД.
Я знаю, что в монге есть возможность делать геозапрос (чтобы прям точки сортировались по удалению от центра, вся хуйня).
Есть ли что-то такое же на мускуле/постгрессе?
Если нет, то сильно ли сложно накрутить и будет ли это влиять на перформанс?
Не спрашиваю, "как" - я примерно представляю, как это может быть реализовано, просто у меня стоит выбор: либо реляционная БД, чтобы связывать мочу с говном, либо конкретно для геопоиска сделать чё-то вроде микросервиса с отдельной бд.
а бля в глаза долблюсь mysql, а mssql
Но как сделать так, чтобы запрос в случае, если несколько разных записей больше всех встречаются одинаковое кол-во раз, выводил бы их все?
А что у вас вместо квери сейчас, разрешите полюбопытствовать?
В постгресе есть огромный модуль работы с геоданными
>Есть ли что-то такое же на мускуле
ДА.
https://dev.mysql.com/doc/refman/5.7/en/spatial-analysis-functions.html
Неделю не заходил в тред - сутулые вообще от рук отбились.
>будет ли это влиять на перформанс?
будет. все подобные функции крайне хуево оптимизируются, но есть еще вот это : https://dev.mysql.com/doc/refman/5.7/en/create-table-secondary-indexes.html
Насколько она пригодна для использования в бекенде при написании небольших проектов или это вообще не ее область?
Смотря что за проект. Для небольших проектов вполне пригодна.
В принципе, здесь расписано всё: https://www.sqlite.org/whentouse.html
Не пригодна. Работать будет но зачем удивлять коллег? У нас тут на бал-маскарад, а серьезный бизнес.
но допустим, zabbix ее использует для хранения промежуточных данных на proxy и всем норм. Оффициальная (tm) конфигурация
Тут кого не пни, каждый первый - йоба хайлоадер, пилит проекты мирового уровня, ага.
дело не в этом. повторюсь еще раз: НЕ НАДО УДИВЛЯТЬ КОЛЛЕГ
Как согласовывать обновы кода с изменениями базы данных?
Вот есть у меня джанго-приложуха, я в ней меняю схемы БД на удаленном тест-серваке через миграции, затем через какое-то время на этот сервер я заливаю другой код, из более ранее ветки, и там же сцуко схемы БД будут другие из-за чего могут вылезать занятные ошибки на NOT-NULL CONSTRAINT и прочее. Как с таким справляться?
Обычно держат несколько тестовых серверов, каждый со своей схемой, и если накатили миграции, приложение на более старое обычно уже не обновляют, если надо что-то потестить со старым приложением, юзают другой сервер, который ещё не обновляли. Или восстанавливают дамп тестовой схемы, но это влечёт за собой последующую еблю с восстановлением тестовых данных.
Я наконец-то начал изучать веб-погроммирование, скачал купил книжку, дошло дело до темы баз данных. И на разделе с ознакомлением с SQLite я решил пройти метанит. Не потому, что считаю его крутым или потому что русек, а просто для чуть более детального ознакомления,в книге там совсем мало(оно и понятно). Не питаю иллюзий по поводу качества материала, просто, чтобы иметь представление на базовом уровне, что это вообще такое. Так вот, мне что-то это так понравилось, намного больше, чем дрочить код, что я решил у вас узнать, а есть ли вообще отдельная профессия для тех, кто любит дрочить бд? Я вроде слышал что-то такое, но к базам никогда не прикасался особо, поэтому не знаю. Какой вообще нужен стек знаний, нужно ли программировать на каком-то языке и если да, то на каком уровне, существуют ли джуны у вас, какой минимум знаний, есть ли сайты с рейтингом за решение задачек и т.д. Понятное дело, что скорее всего у меня потечёт жижа из анала, когда я столкнусь не с игрушечными примерами базового синтаксиса, но меня это не особо пугает.
Системных аналитиков вакансии посмотри, можно с голым SQL ебланить сидеть.
> а есть ли вообще отдельная профессия для тех, кто любит дрочить бд?
Есть администраторы баз данных (настройка, мониторинг, обслуживание и т.д.) и ещё разрабы на PL/SQL, T-SQL, PL/pgSQL. Админство лично мне представляется скучным и рутинным занятием, хотя кому как. PL/SQL и прочее - это в основном легаси из нулевых, когда бизнес-логику приложения писали целиком на хранимых процедурах, потихоньку уходит в прошлое, хотя вряд ли умрёт полностью.
Ну и тестировщики с аналитиками, но для них это прикладной инструмент, а не основное занятие.
Он по дефолту слушает localhost (127.0.0.1), а надо * (0.0.0.0)
https://manifold.net/doc/mfd9/enable_network_access_to_postgresql.htm
Понял, спасибо.
Для контейнеров дефолта ситуация когда БД хранится в томах
Посоветуйте пожалуйста хорошую книги по БД/SQL и тренажер по SQL задачкам, чтобы на собеседованиях не обсираться.
Хороший академический курс https://www.youtube.com/playlist?list=PLXPbT_PYOiRipfX8zrv_9EpnSOpK9P__j
раздражает как у чела микрофон о свитер трется
Там кстати, профессор советует книжку, которая тебе нужна https://www.amazon.com/Database-Management-Systems-Raghu-Ramakrishnan/dp/0072465638
Ебать, рагу рама кришна.
Таких чисто теоретических книг дохуя, кстати. Я все не соберусь такую попробовать читнуть.
Можете объяснить разницу, чем EXISTS отличается от обычного подзапроса IN например вот такой запрос:
SELECT company_name, contact_name, customer_id
FROM customers
WHERE EXISTS (SELECT customer_id FROM orders
WHERE customer_id = customers.customer_id
AND freight BETWEEN 50 AND 100)
Подзапрос тут делает выборку или просто ищет один совпадающий условию? Но как потом работает внешний WHERE если WHERE EXISTS вернул true?
да вроде ничем с точки зрения результата.
Очевидно, что может отличаться планами выполнения и скоростью.
Это важно для тебя? Вы там устроили сутулое побоище из-за SQL?
Ну как бы да, мне уже объяснили на стаке, надо стараться вникнуть в то что изучаешь и с чем работаешь разве нет?
Не советую. В них дохуя воды и/или слишком очевидные вещи описаны хотя может только для меня
Хуярь сериализуемые айдишники к каждой таблице, вот тебе и всё моделирование данных.
Правильно ли я понимаю, что в некотороых случаях (например десктопное приложение на ограниченное кол-во компьютеров) "сервером" в схеме может выступать СУБД?
Скажем, просто задать в постгрес количество подключений в 1000 пользователей и пусть данные из их клинтских программ обмениваются с БД.
Да, это называется двухзвенная архитектура. Так делали в девяностых и нулевых, сейчас редко так делают.
ну так если ты магазин уже освоил, то остальное по образу и подобию, ты же не бездумно скопировал, а понял, почему так? ну а более редкие случаи тут уже сам думай на основе полученных знаний, ну и просто по архитектуре общие сведения читай, книжек полно
братан, кажется тебе нужно разобраться чем Appication Sarvar отличается от Web Sarvar !
Я ждал этого момента 7 лет
Посмотри вот это видео :
https://www.youtube.com/watch?v=BcmUOmvl1N8&t=200s
Подозреваю, что должна быть какая-нибудь команда "ЗДЕЛОЙ ЗОЕБИСЬ", которая многократно ускорит поиск, но я о просто не знаю.
Нет такой команды, всякие эластиксёрчи изобрели не от хорошей жизни. Но что-то сделать можно.
https://www.lateral.io/resources-blog/full-text-search-in-milliseconds-with-postgresql
https://www.alibabacloud.com/blog/optimizations-with-full-text-search-in-postgresql_595339
Пытаясь в проектирование баз данных,
чет взбрела в голову следующая мысль...
А что если взять, да и сгенерить все возможные модули различных моделей данных, и на принципах модульного программирования - автоматизировать конструирование совершенно любой модели данных?
Можно так?
Если да, то что мешает заебенить на этих принципах - внезапно, МОДЕЛЬ ВСЕЛЕННОЙ?
> А что если взять, да и сгенерить все возможные модули различных моделей данных, и на принципах модульного программирования - автоматизировать конструирование совершенно любой модели данных?
> Можно так?
Нельзя. В базе данных хранятся данные, но не логика, которая тоже часть модели данных. Можно сгенерировать код хранимых процедур, но такой генератор написать ещё сложнее, чем сами процедуры.
> Если да, то что мешает заебенить на этих принципах - внезапно, МОДЕЛЬ ВСЕЛЕННОЙ?
Почему в этом треде такое засилье философов? Это не ты здесь регулярно спрашиваешь про наноборду и написание своей СУБД?
>Нельзя. В базе данных хранятся данные, но не логика, которая тоже часть модели данных.
Ну вот, глядя на пикчи со схемами данных, https://www.google.com/search?q=базы+данных+схемы+данны&tbm=isch
я подмечаю, что они состоят, из одинаковых элементов, как-бы из модулей, расположенных в разном порядке.
Собственно, идея в том, чтобы сгенерить всевозможные эти вот модули, добавить триггеры всякие, и сделать как-бы полный и универсальный набор модулей, соединяя которые, можно было бы быстро сконструировать и породить любую модель данных.
>Можно сгенерировать код хранимых процедур, но такой генератор написать ещё сложнее, чем сами процедуры.
Ты имеешь в виду, под видом данных, хранить SQL-запросы, или чо? И написать генератор, генерирующий все возможные sql-запросы, так-сказать полный набор их, выбирая из которого отдельные - можно реализовать любую логику?
Может даже так было бы проще, написать генератор, вместо того, чтобы ебаццо с написанием КАЖДОГО запроса. Но это не точно.
>> Если да, то что мешает заебенить на этих принципах - внезапно, МОДЕЛЬ ВСЕЛЕННОЙ?
>Почему в этом треде такое засилье философов?
Дык реальная, вроде, тема, не?
>Это не ты здесь регулярно спрашиваешь про наноборду и написание своей СУБД?
Ой бляяяяеееееееть. Я пытался сделать базу, получилось вот что:
https://github.com/username1565/nanoboard/tree/nanodb-sqlite/nanodb.exe-source/Database - файл nanodb.sqlite3.sql
Дело за малым. Переписать целый файл PostDB.cs вписав туда опциональное использование sqlite3, через System.Data.SQLite.dll, компилируемую из открытого кода:
https://github.com/username1565/System.Data.SQLite
Но это слишком много ебалы, особого интереса пердолиться - нет, но наработки некие есть, но они разбросаны по куче папок так, шо яебал. Да и вообще интереса, как такового там нет, поэтому я предпочитаю сутками пипсовать криптоговно на наебиржах, вместо пердолинга с этой бородой. Хотите делайте сами. Может я и сам сделал бы, если бы у меня бабло не спиздили тупые дешёвые крысы. А так, приходится отвлекаться от подобного хобби, на всякую, более насущную поебнятину сраную.
>Нельзя. В базе данных хранятся данные, но не логика, которая тоже часть модели данных.
Ну вот, глядя на пикчи со схемами данных, https://www.google.com/search?q=базы+данных+схемы+данны&tbm=isch
я подмечаю, что они состоят, из одинаковых элементов, как-бы из модулей, расположенных в разном порядке.
Собственно, идея в том, чтобы сгенерить всевозможные эти вот модули, добавить триггеры всякие, и сделать как-бы полный и универсальный набор модулей, соединяя которые, можно было бы быстро сконструировать и породить любую модель данных.
>Можно сгенерировать код хранимых процедур, но такой генератор написать ещё сложнее, чем сами процедуры.
Ты имеешь в виду, под видом данных, хранить SQL-запросы, или чо? И написать генератор, генерирующий все возможные sql-запросы, так-сказать полный набор их, выбирая из которого отдельные - можно реализовать любую логику?
Может даже так было бы проще, написать генератор, вместо того, чтобы ебаццо с написанием КАЖДОГО запроса. Но это не точно.
>> Если да, то что мешает заебенить на этих принципах - внезапно, МОДЕЛЬ ВСЕЛЕННОЙ?
>Почему в этом треде такое засилье философов?
Дык реальная, вроде, тема, не?
>Это не ты здесь регулярно спрашиваешь про наноборду и написание своей СУБД?
Ой бляяяяеееееееть. Я пытался сделать базу, получилось вот что:
https://github.com/username1565/nanoboard/tree/nanodb-sqlite/nanodb.exe-source/Database - файл nanodb.sqlite3.sql
Дело за малым. Переписать целый файл PostDB.cs вписав туда опциональное использование sqlite3, через System.Data.SQLite.dll, компилируемую из открытого кода:
https://github.com/username1565/System.Data.SQLite
Но это слишком много ебалы, особого интереса пердолиться - нет, но наработки некие есть, но они разбросаны по куче папок так, шо яебал. Да и вообще интереса, как такового там нет, поэтому я предпочитаю сутками пипсовать криптоговно на наебиржах, вместо пердолинга с этой бородой. Хотите делайте сами. Может я и сам сделал бы, если бы у меня бабло не спиздили тупые дешёвые крысы. А так, приходится отвлекаться от подобного хобби, на всякую, более насущную поебнятину сраную.
'start' это строка, тебе нужны бэктики `
>Если да, то что мешает заебенить на этих принципах - внезапно, МОДЕЛЬ ВСЕЛЕННОЙ?
>>282084
>А что если взять, да и сгенерить все возможные модули различных моделей данных, и на принципах модульного программирования - автоматизировать конструирование совершенно любой модели данных?
Количество объектов во Вселенной бесконечно.
Количество типов объектов - менее бесконечно.
количество ОТНОШЕНИЙ между объектами более бесконечно чем менее бесконечно количество типов.
Таким образом, это глупая идея. Не принесет тебе счастья, дорогая криптоманечька, воображающая себя программистом.
>Но это слишком много ебалы, особого интереса пердолиться - нет, но наработки некие есть, но они разбросаны по куче папок так, шо яебал
Чтобы приблизиться к гордому званию программиста, тебе нужно изучить что такое ORM.
Обрати внимание, что это не чудо и проблем они только добавляют, но вот количество кода уменьшают, да.
Так же в обязательно порядке обрати внимание на эту статью:
https://en.wikipedia.org/wiki/Object–relational_impedance_mismatch
Почему все залётные ебланы пытаются троить СВОЮ МЕГ ЁБА МОДЕЛЬ ВСЕЛЕННОЙ на sqlLite?
Верный признак шизофрении
Тогда уникальность столбца "salary" пропадает. Нужно что бы одновременно вытягивались уникальные значения и вся строка целиком.
Какие значения брать? Первые попавшиеся? Вот вернёт запрос Петю с зарплатой 500, но Васю он не покажет, хотя у него тоже 500, тебя это устраивает?
Короче, если устраивает, обычно это делают через оконные функции.
https://stackoverflow.com/questions/3800551/select-first-row-in-each-group-by-group
Да устроит.
В этом и смысл. Что бы он отобрал все записи у которых зарплата уникальная.
И вернул все столбцы целиком, а не только зарплату.
Как на скрине я красным дорисовал.
Есть идея - сделать биржу для бартерного обмена.
Суть в следующем. Есть сайт. На сайте регаются много юзеров.
Эти юзеры попадают в таблицу Users, в базе данных.
Каждый юзер имеет уникальные вещи, с их описаниями, попадающие в таблицу Properties.
Для каждой вещи, каждый юзер, имеет свой уникальный акк.
Для каждого акка, есть разные балансы, ну там доступный баланс, залоченный баланс, баланс ожидания.
Баланс - символизирует долю права собственности владения вещью.
Разные юзеры, по разным вещам, имеют разные доли права собственности, как-бы являясь акционерами вещи, а каждая вещь - это как-бы акционерное общество.
Дальше, юзеры могут передавать права владения вещью - другим юзерам, или менять их на права собственности владения другими вещами, либо по договорным ценам (через объявления), либо размещая ордера, сортируемые по цене, и выводящиеся как на бирже, с перекрытием ордеров.
Совокупность пар вещей, равна числу уникальных сочетаний по паре. Торговля всех вещей за все вещи, и любую вещь можно обменять на любую вещь, как целиком, так и наполовину, скажем.
Как только появляется заказ на покупку доли права собственности на владение вещью, владельцам достаточной доли - рассылаются уведомления.
Чтобы не срать спамом, можно было бы рассылать уведомления раз в неделю, скажем, обрезая все предложения до 10 наивыгоднейших, скажем, с сортировкой по убыванию ценности предложений.
Собственно, как спроектировать ебучую БД, и все эти триггеры-хуиггеры?
Продолжу идею.
Когда юзер открывает ордер на продажу части доли владения одной вещью, за какую-либо часть доли владения другой вещью (по указанной цене),
выставляемая на продажу часть доли владения первой вещи,
переводится с его доступного баланса, на его залоченный баланс, и висит, пока активен ордер.
Ордер - можно отменить. Тогда, с залоченного баланса, доля владения первой вещью, возвращается на доступный баланс.
Если юзер2 покупает долю влладения вещью1, за его долю владения вещью2, по указанной в ордере цене, и покупает, выставляя встречный ордер, то встречные ордера перекрываются, и происходит обмен долями владения вещью 1 и вещью2, между юзером1 и юзером2.
При этом, с залоченного баланса одного юзера, доля владения переводятся на доступный баланс другого юзера, и наоборот.
Всё это должно бы быть в виде одной обменной транзакции.
Юзер также может зарегистрировать право владения вещью (декларируя вещь, или подтверждая владение документами всякими, или тупо заводя бабло), и вывести - оформив заявку на вывод. При этом, с доступного баланса, право владения переводится на баланс ожидания, и висит там до окончания обнала права владения, и его материализации - то есть до обработки поданной заявки на вывод.
>Невозможно выполнить команду DROP DATABASE пока существует хоть одно подключение к заданной базе. Однако можно подключиться к любой другой, в том числе и template1. template1 может быть единственной возможностью при удалении последней пользовательской базы данных кластера.
Блять, как нахуй отключиться от бд? Там сука отсутствует такая кнопка, а подключается к бд автоматически при входе в pgAdmin4
При этом при подключении через терминал, pgsl требует ввести пароль для пользователя с именем пользователя компа!!! Что за бред нахуй? К нему не подходит мастер пароль, который я сделал при установке postgres, и не подходит пароль пользователя компьютера. Что за бред нахуй?
Я создаю бд, потом создаю таблицу, но она создается в бд postgres.
блять, подключился, на линуксе у нас значит будет параметр -u, а на винде -U блять, как удобно.
И все равно ни работает ни DROP DATABASE имя;
ни dropdb dbname
Как блять отключится и удалить её?
>Собственно, как спроектировать ебучую БД, и все эти триггеры-хуиггеры?
Не пихать всю логику приложения в БД.
Есть MSSQL база доставшаяся в наследство.
Планировщик по таймеру периодически запускает хранимую процедуру.
Хранимая процедура выполняется 4 минуты, и при запуске грузит процессор на 100% на 30 сек, дальше спад до 40%.
Соответственно в этот промежуток времени база данных "неохотно" выполняет другие запросы, и для некоторых время отклика возрастает выше 30 сек (что вызывает эксепшен у вызвавшего эту процедуру веб-приложения).
Посему вопрос:
1. можно ли как-то "замедлить" выполнение хранимой процедуры?
2. можно ли как-то выставить высокий приоритет некоторым запросам, чтобы БД выполняла их сразу при вызове?
хуеньги. Такая шняга просто обязана быть опенсорцной, и легкоподнимаемой, и шариться в открытом доступе через торренты в дарквебах.
Никак, так как процiдурки, жрущие 100% процессора - фича майкрософтоподелий.
>>284102
>обязана быть опенсорцной
Опенсорц это не значит, что тебе пердолики будут нахаляву воплощать твою очередную биткоиномечту.
>легкоподнимаемой
Даз нот компют в контексте опенсурца.
>в открытом доступе
>в дарквебах
Прими таблетки, наркоман.
Ну да щас мы побежим рисовать тебе схему хранения и на торренты выкладывать.
Можно попробовать разделить на процессорные группы и снизить фактор многопоточности
ЗАХОДИШЬ НА СОБЕСЕДОВАНИЕ
@
СИДИТ СЕНЬОР И ЭЙЧАРКА
@
СЕНЬОР НАЧИНАЕТ ДИКО ПРЫГАТЬ ВОКРУГ И ПРИГОВАРИВАТЬ ТИЛИ ТИЛИ ТЕСТО ЖЕНИХ И НЕВЕСТА
ну с 80к есть куда расти. Мне кажется до 150 вполне.
Повезло, чел. Не знаю что там с ними делают, но у нас на собесах были двое после гловбайта (одного даже взяли на свою голову), и оба были отбитые.
Какое-то вечное суечение, все время требуют внимания к себе, какие-то блять инфантильные хотелки вечно: дай мне ментора ой а где у вас печеньки. Все время пытаются как-то тупо наебать: челик сливался на простейших вопросах про отличия hash от merge join под соусом ну это неинтересно просто))).
Как будто взяли аутистов-омежкиных и имплантировали им социоблядское шило в жопу, худшее из двух миров.
> отличия hash от merge join
О, я как раз нихуя не понял нахуя мерж нужен, хеш понятно, 2 большие таблицы соединять, а мерж я сколько не пытался приткнуть везде только хуже делает.
Если тебе нужен весь целиком результат джойна больших таблиц, особенно когда готовых индексов нет, то там мерж лучше за счет последовательного io.
Мердж проводит сравнение по столбам по которым есть индекс, т.е. таблица должна быть упорядочена, и он по порядку сравнивает значения. При таком подходе, можно сравнивать только пары которые ещё не попадались.
Хеш джоин вычисляет хеш функцию, которая делит на группы таблицу и проводит сравнения в рамках эти
>Ну 2 исторических таблицы с 2002 года я хуй соединю в любом случае.
Ну да, я про кейсы когда нужно именно все поджойнить. Мерж тем и хорош что работает на любых размерах и любом количестве памяти за O(log n) сканирований.
Алсо, оказалось в википедии https://en.wikipedia.org/wiki/Hash_join приводятся решения для кейса когда хэш не влезает в память. Простое работает за O(n) сканирований что очевидно хуже на больших таблицах.
И там же есть Grace hash join, на первый взгляд там вообще ровно два скана, то есть О(1), кажется что вин и я пока не могу найти где подвох кроме ехидных перекосов. Интересно.
С чем эта хуйня может быть связана? Заебался уже
Зайти туда не через проводник, а из командной строки, а лучше добавь эту папку PATH.
И пишешь команду: psql -U postgres
Сэнк ю анонче, оно работает. Но всё равно интересно, какого хуя на других компах всё прекрасно и без консоли устанавливается и запускается, а вот именно мне приходится ебаться
Ты небось какую-нибудь галку при установке пропустил.
Если правильно понял, тебе нужен INSERT INTO YOURTABLE (<COLUMNS>) SELECT ...;
А в селекте любой запрос с case и CTE, генерирующий строки таблицы.
Нихерасе вы тут развели.
Merge хорош когда, данные уже в отсортированном виде поступают после предыдущего шага. Как раз после скана по идексу btree можно такую ситуацию получить. Но!
1.Нужно учитывать, что сама сортировка также требует памяти, и если выборка не помещается в память, то начинается запись на диск промежуточных результатов с последующей подкачкой.
2. Для merge два входных потока данных должны быть отсортированы.
При прочих равных hash должен выигрывать в большинстве случаев, если одна из таблиц помещается в память.
Grace Hash Join - алгоритм в котром зная - что ни одна таблица в память не поместится - мы разбиваем их на куски по ключу хэша на часть которая помещается в память - и остальные - которые улетают на диск. Происходит это для обеих таблиц, далее куски с одинаковыми хэшами загружаются и сравниваются. Этот алгоритм оптимизировали до Hybryd Grace Hash Join, который при первом проходе по внешней таблице - сразу джойнит строки найденные в сформированном батче hash таблицы - те что не нашел - скидывает на диск. Один проход таким образом экономится. Точнее часть, которая сджойнилась.
Загугли ROLLUP, CUBE, GROUPING
Есть MSSQL база, в хранимой процедуре которой выполняется простой селект на таблицы, находящиеся на связанном сервере, который тоже MSSQL.
Таблицы на связанном сервере периодически пополняются новыми данными.
Хранимая процедура выполняется с некоторой интовой переменной для поиска, и зачастую первые вызовы ничего не возвращают, так как данных еще нет, а после добавления данных на связанном сервере хранимая процедура возвращает результат.
Но иногда случается какой-то затык, и процедура продолжает ничего не возвращать в то время как данные у таблицах связанного сервера уже есть.
Такое чувство что процедура закешировала результат выдачи запроса, и не хочет сбрасывать кеш так как не видит изменения таблицы(потому что те лежат на связанном сервере а не в своей бд).
Подскажи, MS SQL вообще умеет в кеширование результатов выдачи запросов?
Можно ли отключить кеширование для одного запроса / хранимой процедуры?
Может можно как-то не явно отключить кеширование, например сносить план выполнения или еще чего?
Как правильно взаимосвязывать данные?
К бд обращаются несколько инстансов.
Seq? Таблица, которая инкрементирует счетчик? Что еще можно придумать?
1. А сортировать за тебя Вася будет?
2. Нахуя тебе индексы для хеша (в оракле точно
http://www.dba-oracle.com/t_how_to_index_hash_join_operation.htm )
Если память позволяет и сортировать не надо, проще всегда хешем ебашить. Кейс, когда всё на всё надо, и при этом обе таблицы здоровые - ебать редко бывает.
Тлдр: если хеш в память не помещается, то поместится по частям.
Если у тебя есть время на сортировки, значит и на хеш время будет.
А если создать таблицу (id bigserial, time datetime, uid uuid) и дерево индекс по time.
А потом select count from xxx where date = текущий час, если результат подходит, то инсертить еще одну сущность, иначе ошибка. Это дорого получится?
>Кейс, когда всё на всё надо, и при этом обе таблицы здоровые - ебать редко бывает.
Утенок, спок.
Может попробовать перестать бессмысленную хуйню делать?
Такими темпами можно бизнесу 1 таблицу со всеми полями выводить и не ебаться.
>Чтобы приблизиться к гордому званию программиста
Да пошёл ты нахуй, со своей гордостью - нельзя гордиться блядь.
И уж тем более, нахуй иди со своими званиями - ебал я козлосучую пирамиду, где заради звёздочек на пагону готовы убивать всякие гондоны козлосучие.
Тащемта, я уже давненько занимаюсь быдлоговнокодингом года, эдак с две-тыщи-хуйнадцатого.
>тебе нужно изучить что такое ORM.
Да, я вижу схемы данных, в sqlite expert professional, но когда ебическое число таблица там, то хуй отследишь связи, они не помещаются уже, блядь, в экран.
Тем не менее, я вижу одинаковые паттерны, как-бы, и одинаковые куски из взаимосвязанных таблиц, в сложной схеме, поэтому и взбрела в башку, как-бы, вышеизложенная мысль. Проектирование баз данных, из таких модулей, чем-то напоминает мне соединение сложных схем из логических элементов. Чем-то похоже, но я пока не могу понять, именно, чем.
В селекте можно вычислять выражения, а в выражении может быть что угодно, хоть вызов процедур и функций, умного названия у этого нет.
Реализация самих функций/процедур общего названия тоже не имеет, потому что не стандартизована и делается в разных СУБД по-разному, будь то "процедурные расширения SQL", UDF или что-то ещё.
Добро, я тебя услышал.
Тут ребятишки просто недавно в айти.
Когда это начало работать в Oracle, они назвали это pipelining functions.
Спасибо, помогло.
Таблица со счётчиком нормально, можно по дням партишнинг и дропать старые.
Почти наверняка там где-то есть кнопка "Сгенерировать DDL", которая выдаст тебе готовую команду.
Похоже на phpmyadmin. Найди там Экспорт и выбери sql. Открой как текст, и там где CREATE TABLE IF NOT EXISTS там эта таблица ебучая.
У него тёмная тема. Вот и не видит нихуя.
Чтобы O(log(N)) соблюдать. Например, если у тебя строится индекс по ID, который считается простым инкрементом, обычное дерево будет расти всё время вправо и будет по сути связным списком, поиск в котором за O(N). А так у тебя дерево каждый раз балансируется, и поиск будет намного быстрее.
А если это GUID, например, то как оно балансируется? Ну или индекс из двух колонок с рандомными строками / числами.
Через операцию сравнения.
> GUID
К примеру, лексикографически.
> индекс из двух колонок
Сначала сравнение по первой, а если равны, то по второй.
Я не понимаю, в чем проблема, данные в таблицы заносятся, но PHPAdmin не показывает их, не показывает структуру таблиц и ответ на mysql запросы.
Я посмотрел доступ у меня есть ко всему, пожалуйста, поясните.
Работаю на Wampserver
Зашел с гугла в яндекс браузер все заработало, хуй поймешь.
Какой индекс нужен если я планирую выбирать по data_start+data_end
>Какой индекс нужен если я планирую выбирать по data_start+data_end
Если они в дате, а не в датетайм, то нужна партиция
datetime
одни спрашивают какие им индексы на все случаи жизни создать.
другие им отвечают невпопад.
Что тут происходит вообще?
Это такой уровень понимания баз данных у программистов?
Тут фрондендеры которые лезут на бек
Создай стравполь strawpoll.com. Выяснишь что 90% программистов не знают теорию БД. Простенькие селекты максимум.
Ты лучше спроси про уровни изоляции транзакций. Вангую, что 90% оподливятся в рейтузы, т.к. не понимают какой уровень изоляции выбрать, чтобы не положить прод при создании аккаунта, например.
Read commited и блокировки.
ахуеть просто...прочь, прочь отсюда
А что не таз? Представь пользовалель яросно дрочил кнопку sign-up. Создались две конкурирующие транзакции c одинаковым мейлом. В конце транзакции выполяют insert into users. При read commited транзакция закончившаяся первой вставит email в БД, другая при инсерте вставленое увидит и обламается, потому что на поле email установлено unique. Блокировки непричем.
мимо
Read committed, естественно.
Есть таблица с товарами каждому товару может соответствовать несколько локаций, мне надо не размножить товар по локациям, а все локации соответствующие одному товару поместить в строчку с товаром(можно либо в разные столбцы, либо в один, непринципиально), как это сделать?
>Это такой уровень понимания баз данных у программистов?
Не проблема программистов, что в БД ходить в 2022-м можно только через строчные литералы или говно-ОРМ.
На плюсах много проектов, где вообще не используются реляционные СУБД. Изучать SQL нужно с чётким пониманием, что он тебе пригодится, иначе, если ты попасть на проект, где SQL не нужен, время будет потрачено впустую.
>sql
>время, потраченное впустую
Звучит как "выбери одно", честно говоря. Но тут зависит от того, насколько глубоко спускаться в кроличью нору, если на уровне select * from movies, то это никогда не бывает бесполезно, если ты в принципе работаешь программистом, а если на уровне уровней изоляции и проброса предикатов, тогда да.
чел ты совсем без мохгов в 22м20 вкатыватся через плюсы? Иди учи реакт и рисуй формочки. Тебе надо рынок труда для начала изучить, а не погромирование, валенок.
Есть где почитать про практики по переводу спредшитов в базы данных? Хочу какие-то направления посмотреть, обсуждения, не я же первый об этом подумал.
Насколько реальные рабочие задачи отличаются от теории и головоломок? Чего ожидать? К чему гото6?
нигде.
скажи кабанчику, что к использованию БигДаты и ИИ нужно 10 лет планомерно готовиться, как это произошло в X5, где в эксель прайс-лист просто не влезал, а не заебывать тебя экселем.
Нет никакой универсальной программы или методики
понятно, даун.
вот тебе код который ты искал:
import pandas as pd
df=pd.read_excel('123.xlsx')
df.to_sql()
Ты в программировании вообще ни гу-гу? Это же элементарная задача.
Если это просто один файл, то читаем его построчно и помещаем данные в соответствующие колонки в БД, сохраняем.
Или у тебя куча файлов с перекрестными ссылками друг на друга? Тогда заебёшься просто парсить/записывать, нужно что-то типа CRM писать, либо готовую брать.
>Или у тебя куча файлов с перекрестными ссылками друг на друга? Тогда заебёшься просто парсить/записывать, нужно что-то типа CRM писать, либо готовую брать.
О чём и разговор. Где про это почитать?
Но с пандасом мне ответ понравился. Чувствуется настоящий двачерский настрой.
Если у тебя там реально вагон файлов, то тебе тот пчел правильно сказал: твой дон кабаньо – хитрожопый пидор, а ты – наивный долбоёб.
Что такое CRM можешь узнать у поисковика.
Подскажите, как лучше всего сделать базу данных наноборды. А то там вот такая ебанина в SQLite: https://github.com/username1565/nanoboard/blob/nanodb-sqlite/nanodb.exe-source/Database/nanodb.sqlite3.sql
Я уже сам запутался, блядь.
В смысле как? Берёшь и переписываешь логику скулайтовых таблиц на условный постгрес. Если тебе ещё и данные перенести, то тут надо отдельный модуль на твоём любимом языке для миграции с одной бд в другую написать заодно. А если хочешь сделать форк с блэкджеком и шлюхами заместо бд, то и версирование этих миграций.
А нафиг постгресс? Сиквелайт норм, но мне кажется я срукожопил с таблицами, оптимизировать бы структуру бд, штоле.
>А нафиг постгресс?
Что ты там собрался оптимизировывать на скулайте? Он в конечном счёте синхронный, так что "оптимизировать" его можно только на уровне приложения.
Я имею в виду саму бд, ну там таблички-хуички, я же как видишь в проектировании БД дуб дубом, блядь. Наплодил хуйни из кучи таблиц и запутался в ней, лол.
Обращайся.
Кейсом создаешь агрегационное поле, потом по нему делаешь Group By, дальше всё тривиально.
select count(*), Date,
CASE
WHEN value = 0 THEN 0
WHEN value > 1 AND value < 10 THEN 1
ELSE 2
END AS Group_Count
Group by Group_Count, Date
Слушайте, я вот в методе бегу в базу за целой таблицей, а возвращаю из метода уже только 2 трети полей допустим. А можно брать из базы не целую таблицу, а сразу только нужные поля. Так вот, какой вариант лучше и почему?
Конечно же, из базы не следует тащить лишнее, но если ты точно знаешь, что данных будет немного, можешь забить и тащить всё.
Более высокая сложность запроса разве не повлияет на производительности? Или проще вытащить половину полей, чем все поля?
Сложный запрос оптимизирует СУБД, а в коде ты будешь проделывать то же самое вручную + оверхед на перегонку данных из БД в твоё приложение.
>Или проще вытащить половину полей, чем все поля?
В общем случае не сложнее. Хотя конечно никто не видел конкретно твой кейс, может у тебя данные отбираются не просто так, а с хитровыебанными неиндексированными условиями.
Ты в какой субд запросы пишешь?
К тому же не совсем понимаю как можно сгенерировать имена и фамилии... только если брать их из отдельного списка. Но если опустить этот момент и просто сделать заполнение рандомными символами
На твоём любимом языке наверняка есть пакет для генерации имён и прочих значений.
Здесь 4 значения только вывести нужно, по условию задачи, оконные не подходят, ну или у меня не хватает ума для этого
СУБД какая? Надо получить номер строки в подзапросе, если я это сделаю средствами оракла, а у тебя постгря например - тебя обоссут.
Я придумал как можно без оконок изъебнуться.
with p_numbered as
(select p1.PeriodID,count(p2.period_id) num,avg(Value) Value from from period_table p1 join period_table p2 on p2.period_id<=p1.period_id group by p1.Period_id)
select pn2.Period_id from p_numbered pn1 join p_numbered p2 on pn2.num=pn1.num-1 where not pn2.Value=pn1.Value
Точнее вот так
with table1 as
(
select 1 Period_id, 10 value union all
select 3, 10 union all
select 5, 20 union all
select 6, 20 union all
select 7, 10 union all
select 9, 40 union all
select 10, 40
)
select Period_id
from
(
select Period_id, value as value_1, coalesce(lag(value) over (order by Period_id), 123456) as value_2
from table1
) as a
where value_1 <> value_2
Так а что тебе мешало вместо with скопипастить эту залупу 2 раза?
Активе рекорд - это когда в один класс свалили дата маппер, саму сущность и связанную с ней бизнес-логику в лучших традициях ООП, где собака сама умеет лаять.
Есть задача вывести из базы имя пользователя и его последний комментарий. Работающее решение получилось
https://sqltest.net/#1649233
но мне не нравится что блок кода повторяется.
Как это можно сократить? Если пытаюсь в SELECT MAX(id) FROM ... вставить вместо кода алиас comm он пишет что "Table 'sqltest_tmp_db.comm' doesn't exist"
Реально ли найти потом работу по этому направлению или базы данных - это лишь вишенка к какому-нибудь торту из разработки и сисадминства?
Скорее всего когда выкатишься из универа, то из вакансий будут только полусисадминские РАБотки за мелкий прайс в рублях.
Скинь какие-нибудь методички/список обзорной литературы, чтобы на собеседованиях на бэенд не обсираться.
Чел либо учи иностранный язык украинский либо переквалифицируйся в каменьщика
(Автор этого поста был забанен. Помянем.)
What happened to English though?
Спикаю, спикаю, на 8 баллов IELTS пару лет назад было
Дальше-то что?
Питон учи.
это понятно, но что конкретно?
их дудосят украинцы?
Немецкий пидорашка Деда хотя бы съебался?
Пиратскими версиями пользуетесь что ли?
>их дудосят украинцы?
Вероятно. Форум rsdn.org периодически лежит. Хотя на sql.ru вроде закрыли политический раздел, что не нравится хохлам?
Аноны, есть задача по пику:
Вывести имена сотрудников и количество их подчиненных, у которых в подчинении более 10 человек.
И решение:
select e1.name, count(1) from employee e1 join employee e2 on e1.ID=e2.chief_id group by e1.id, e1.name having count(e1.id) > 3
Объясните, пожалуйста, что за e1? Почему тут просиходит объединение одной и той же таблицы from employee e1 join employee e2? Или что это вообще значит?
2003-12-22 хранится как 211, 15, 12, 22.
Что за кодировка для года?
Мне нужно распарсить дату из сырых байтов в проге, не хочу писать "UNIX_TIMESTAMP(имя поля)".
>>313974
select * from (
select sum(count), 'one' as unit from (
select count(unit), 'one' as unit from test1 where unit = 'ONE'
union all
select count(unit), 'one' as unit from test2 where unit = 'ONE'
) as i
union
select sum(count), 'two' as unit from (
select count(unit), 'two' as unit from test1 where unit = 'TWO'
union all
select count(unit), 'two' as unit from test2 where unit = 'TWO'
) as j
union
select sum(count), 'three' as unit from (
select count(unit), 'three' as unit from test1 where unit = 'THREE'
union all
select count(unit), 'three' as unit from test2 where unit = 'THREE'
) as k
) as u where u.sum > 6
select * from (
select sum(count), 'one' as unit from (
select count(unit), 'one' as unit from test1 where unit = 'ONE'
union all
select count(unit), 'one' as unit from test2 where unit = 'ONE'
) as i
union
select sum(count), 'two' as unit from (
select count(unit), 'two' as unit from test1 where unit = 'TWO'
union all
select count(unit), 'two' as unit from test2 where unit = 'TWO'
) as j
union
select sum(count), 'three' as unit from (
select count(unit), 'three' as unit from test1 where unit = 'THREE'
union all
select count(unit), 'three' as unit from test2 where unit = 'THREE'
) as k
) as u where u.sum > 6
Так вахтёр то анону так и не ответил, а я начал, но не успел прилетал фаршмарк от абу. Тхред и так почти сдох, и ещё вахтёры, ну раз вам ок, аривидерчи.
В общем дело такое, есть процедура которая добавляет запись, у нее поле с созданным айдишником IN/OUT, значит она по идее должна я его возвращать.
Если принтить его через DBMS, то всё ок. Вопрос в другом, мне нужно чтобы после выполнения процедуры вернулась запись с этим айдишником.
SELECT между Begin и End использовать не дает, returning к процедурам не применим, я хуй знает что блять делать
хуй знет, может поможет
https://dev.mysql.com/doc/internals/en/date-and-time-data-type-representation.html
Зачем мне лечиться? Я пишу на плюсах, поэтому у меня был выбор либо писать селект для каждой таблицы и захардкодить названия полей, либо написать селект для всех таблиц и предусмотреть функцию, которая распарсит дату потом.
>>321586
Я уже решил проблему виновата библиотека плюсовая, а не mysql, в самой бд дата это три инта, но спасибо
как лечить?
Ты случайно не из тех, кто учит питон для того, чтобы написать на нём бота для телеги?
Параметры в execute передаются не так. Вместо параметров ты должен писать %s, а вторым аргументом передать массив со значениями, и они поставляются в запрос сами.
> cur.execute("INSERT INTO test (num, data) VALUES (%s, %s)", [100, "abcdef"])
>Ты случайно не из тех, кто учит питон для того, чтобы написать на нём бота для телеги?
да
> cur.execute("INSERT INTO test (num, data) VALUES (%s, %s)", [100, "abcdef"])
спасибо!
это сродни разговора со стеной, да и я слишком ссу подобным заниматься. Бот уже рабочий для нужд университета, просто надо было базу прикрутить
Ты не понял. Рассылать от имени заказанных акков, а потом сразу донос в гебню.
Сажаю русню на 15 лет за смешные деньги.
>cur.execute("DELETE from users where chat_id=(%s) AND (button=(%s) OR floor=(%s) OR room=(%s) OR typeofproblem=(%s))", [message.chat.id, 'text', 1, 'text', 'text'])
где? Разные, только данные в них могут быть одинаковые в виде сообщения "text"
Смешно.
о помощи в решении задачки. Понимаю что нужно использовать конструкцию execute immediate и возможно задать loop через неявный курсор, но пока опыта мало в PL/SQL и осилить задачу не могу, буду благодарен если поможете разобраться.
Необходимо Во всех таблицах и вьюшках текущей схемы найти первые по алфавиту столбцы среди столбцов, имеющих типы данных не BLOB и не CLOB.
Найти минимальное значение, хранящееся в таком первом по алфавиту столбце каждой таблицы или вьюшки, привести его к строковому типу данных (в формате по умолчанию).
С помощью анонимного блока вывести в dbms_output отчёт о таблицах о вьюшках, их первых по алфавиту столбцах и минимальных значениях в этих столбцах.
Не использовать вспомогательных таблиц (не делать create table).
Минимальные значения столбцов следует определять непосредственно запросом к каждой таблице.
> вкатываюсь в oracle sql
Ахахахах, ты че, ебанутый, они же тютю из РФ, все на попенсорсы переходят и отказываются от оракла.
Посвятил этой хуйне лучшие годы жизни, кстати, так что слушай.
>Во всех таблицах и вьюшках текущей схемы
Достаточно представления user_tab_columns, там сразу и с вьюх и с таблиц столбцы.
>первые по алфавиту столбцы среди столбцов, имеющих типы данных не BLOB и не CLOB.
min(case when data_type not in ('CLOB', 'BLOB') then column_name end)
group by table_name
Собственно, по полученной инфе ты слепишь селект вида «таблица — первый по алфавиту столбец».
Далее начинается pl sql часть
declare
v_str varchar2(32767);
begin
for z in (тут селект из прошлого пункта) loop
execute immediate 'select to_char(min('||z.column_name||')) from '||z.table_name into v_str;
dbms_output.put_line(v_str);
end loop;
end;
Был рад помочь, но на уточняющие вопросы не отвечу.
Все писано по памяти и не проверено в жизни, может быть придется немного погуглить.
Пока.
а бля там кавычки <> не нужны
инструкции локальную базу (пикрил 2), с локальной базой код спокойно работал, а сейчас когда я вставил туда новый хост, пароль и имя бд (пикрил 2) на хероку бот не работает. Также если попытаться к бд на хероку подключиться с pgAdmin4, то там высвечиваются какие-то тысячи баз (пикрил 3) и все при попытке открытия выдают какую-то ошибку подключения (пикрил 4).
Как можно наиболее быстро решить проблему?
UserVideo содержит записи о том, что конкретный юзер уже посмотрел конкретное видео.
Пик1 запрос выводит все видео на канале 666, "отмечая" среди них те, которые юзер 5 уже посомтрел.
Но как написать запрос, если нет айди юзера, а есть его юзернейм? Пытаюсь что-то типа пик2, но выводит только те видео, которые посмотрел юзер, не выводя все видео канала целиком.
SELECT FROM "Channel" c
LEFT JOIN "Video" v ON v.channel_id = c.channel_id
LEFT JOIN "UserVideo" uv ON uv.video_id = v.video_id
AND uv.user_id = 5
WHERE c.channel_id = 666
смог подключиться через pgadmin благодаря этим ответам
https://stackoverflow.com/questions/11769860/connect-to-a-heroku-database-with-pgadmin
https://stackoverflow.com/questions/12663639/how-to-hide-databases-that-i-am-not-allowed-to-access/13298802#13298802
Понял, что на хероку моя локальная база экспортировалась нормально, тогда я совсем не понимаю почему у меня на компе к базе всё нормально подключается, а на хероку нет
Это норм чи ни?
SELECT * FROM "Channel" c
LEFT JOIN "User" u ON u.user_id = 5
LEFT JOIN "Video" v ON v.channel_id = c.channel_id
LEFT JOIN "UserVideo" uv ON uv.video_id = v.video_id
AND u.username = 'alex'
WHERE c.channel_id = 666
короче с ноута к базе хероку подключиться получается, а если запускать бота на самом хероку то бот не работает почему-то, без базы работает и на ноуте и на хероку
insert into
table_name (work_id)
values (select max(work_id)+1 from table_name)
Не работает из-за того что строка(
Как это поможет? Тут сам столбец с типом varchar, или расскажи поподробнее.
мне он пишет - веб морда доступна по http://127.0.0.1/pgadmin4, но она недоступна! Из моего компа, на котором виртуалка крутится.
Как можно сделать так чтобы была доступна?
И как можно адрес поменять веб морды?
И как сделать чтобы эта веб морда была доступна из интернета?
Помогите пожалуйста.
ну и залупа. Слишком много вариантов сломаться, чтобы угадать какой у тебя.
у меня, конечно, все работает в этой конфигурации, но я то Tier V Senior Devops. А у тебя не заработает.
может ты лучше docker desktop поставишь? там хотя бы все вопрос с маппингом портов не стоит, тк 127.0.0.1 по сути общий.
Кстати, чтобы подключиться ИЗ докера к сервису на компе, надо не "localhost:5432 указывать, а "host.docker.internal:5432"
Аноны, помогите, ебусь с этими базами целый день, как удалить все партиционирование с таблицы ? Так же, нужно еще б в INFORMATION_SCHEMA.PARTITIONS актуализировать данные, так как они почему-то не показывают правильно значение в TABLE_ROWS
Смержи все партиции в одну.
Что ему нужно? Я не разбираюсь в БД
Открыл базу в воркбенче, удалил ключи по другим таблицам. Там всего одна таблица грузилась на каждый бэкап. Все заработало.
так подключайся через админ с винды, в чем проблема?
Ты, похоже pgadmin разных версий попутал.
Был pgadmin3 , а сейчас парашный pgadmin4.
Впрочем, я ими обоими не пользуюсь.
туточки https://fias.nalog.ru/Updates
А потом просто нужно...
Выберите любую ячейку в диапазоне данных. Выберите Фильтр> данных. Выберите Текстовые фильтры или Числовое фильтры, а затем выберите сравнение, например Между. Введите условия фильтрации и нажмите кнопку ОК.
Выбери жизнь. Выбери работу. Выбери карьеру. Выбери семью. Выбери телевизор с большим экраном. Выбери стиральную машину,
Талмуд - это когда тысяча страниц.
делай задачки на sql-ex, там же есть подсказки
where колонка in ('aa', 'bb', 'cc')
При этом содержание скобок везде одинаковое. Из-за этого запрос выглядит громоздко и его неудобно править.
Как мне в начале запроса один раз привести этот список, а далее просто на него ссылаться?
Сейчас попробовал в начале запроса создавать временную таблицу, записывать в неё необходимые данные, а далее использовать конструкцию with (см. ниже), но время выполнения запроса увеличилось примерно в пять раз, что неприемлемо.
CREATE TEMPORARY TABLE code_table_temp(code_temp VARCHAR(80));
INSERT INTO code_table_temp VALUES
('aa'),
('bb'),
('cc)
...
...
...
with code as (select code_temp as code from code_table_temp)
select sum(case when колонка not in (select code from code) then...
with code as (select 'aa' as cd from dual
union
select 'bb' as cd from dual
union
select 'cc' as cd from dual
)
попробуй так
Можешь в двух словах пояснить, что это и чем отличается от описанного выше способа, пожалуйста?
>>334147
>Интерполяцией строк должно заниматься приложение, а не БД.
Да какое там приложение, я просто запросы для статистики делаю.
Если бы я это внутри какого-нибудь скрипта делал (что не умею), то там бы было понятно, как подстановку переменных сделать вместо тупого копирования.
>Можешь в двух словах пояснить, что это и чем отличается от описанного выше способа, пожалуйста?
Что вызывает вопрос, union? Просто загугли чел, это база, источников миллиард. Идея была в том чтобы не создавать таблицу, я даже не ебу даст ли это какой-то эффект.
При использование SELECT ... INTO, строки вставляются в строгом порядке, или согласно именам, т.е. если мы хотим поменять порядок вставки, нужно менять алиас или порядок колонок в селекте?
+----+---------+----------+
| Id | name_id | position |
+----+---------+----------+
| 1 | 1 | Master |
| 2 | 2 | Slave |
| 3 | 3 | Dude |
| 4 | 4 | Killer |
| 5 | 5 | Master |
| 6 | 5 | Dude |
| 7 | 6 | Slave |
| 8 | 3 | Master |
+----+---------+----------+
Affected rows: 8
Query result:
+----+---------+-----+
| Id | Name | Old |
+----+---------+-----+
| 1 | Tom | 12 |
| 2 | Lucy | 99 |
| 3 | Frank | 20 |
| 4 | Jane | 99 |
| 5 | Robert | 1 |
| 6 | Session | 20 |
+----+---------+-----+
Affected rows: 6
Query result:
+---------+-----+--------------------------+
| Name | Old | GROUP_CONCAT(s.position) |
+---------+-----+--------------------------+
| Jane | 99 | Killer |
| Lucy | 99 | Slave |
| Frank | 20 | Master,Dude |
| Session | 20 | Slave |
| Robert | 1 | Dude,Master |
+---------+-----+--------------------------+
Affected rows: 5
Есть две таблички, я их джойню, необходимо выбрать имя, возраст и роль всех одногодок.
SELECT n.Name, n.Old, GROUP_CONCAT(s.position)
FROM NAMES n
LEFT JOIN STATS s
ON n.Id = s.name_id
GROUP BY n.Name, n.Old
HAVING n.Old IN (
SELECT names.Old
FROM NAMES names
LEFT JOIN STATS stats
ON names.Id = stats.name_id
GROUP BY names.Old
HAVING COUNT(names.Old) > 1
)
ORDER BY n.Old DESC;
Но у меня выходит нечто громоздкое + если один и тот же человек встречается дважды - он становится одногодкой с самим собой.
Есть ли способ решить задачу, используя всего один селект? Предполагаю, копать надо в сторону селфджойна уже сделанного джойна?
SELECT * JOIN выглядит следующим образом
Query result:
+----+---------+-----+----+---------+----------+
| Id | Name | Old | Id | name_id | position |
+----+---------+-----+----+---------+----------+
| 1 | Tom | 12 | 1 | 1 | Master |
| 2 | Lucy | 99 | 2 | 2 | Slave |
| 3 | Frank | 20 | 8 | 3 | Master |
| 3 | Frank | 20 | 3 | 3 | Dude |
| 4 | Jane | 99 | 4 | 4 | Killer |
| 5 | Robert | 1 | 6 | 5 | Dude |
| 5 | Robert | 1 | 5 | 5 | Master |
| 6 | Session | 20 | 7 | 6 | Slave |
+----+---------+-----+----+---------+----------+
Affected rows: 8
Помогите, я в тупике
+----+---------+----------+
| Id | name_id | position |
+----+---------+----------+
| 1 | 1 | Master |
| 2 | 2 | Slave |
| 3 | 3 | Dude |
| 4 | 4 | Killer |
| 5 | 5 | Master |
| 6 | 5 | Dude |
| 7 | 6 | Slave |
| 8 | 3 | Master |
+----+---------+----------+
Affected rows: 8
Query result:
+----+---------+-----+
| Id | Name | Old |
+----+---------+-----+
| 1 | Tom | 12 |
| 2 | Lucy | 99 |
| 3 | Frank | 20 |
| 4 | Jane | 99 |
| 5 | Robert | 1 |
| 6 | Session | 20 |
+----+---------+-----+
Affected rows: 6
Query result:
+---------+-----+--------------------------+
| Name | Old | GROUP_CONCAT(s.position) |
+---------+-----+--------------------------+
| Jane | 99 | Killer |
| Lucy | 99 | Slave |
| Frank | 20 | Master,Dude |
| Session | 20 | Slave |
| Robert | 1 | Dude,Master |
+---------+-----+--------------------------+
Affected rows: 5
Есть две таблички, я их джойню, необходимо выбрать имя, возраст и роль всех одногодок.
SELECT n.Name, n.Old, GROUP_CONCAT(s.position)
FROM NAMES n
LEFT JOIN STATS s
ON n.Id = s.name_id
GROUP BY n.Name, n.Old
HAVING n.Old IN (
SELECT names.Old
FROM NAMES names
LEFT JOIN STATS stats
ON names.Id = stats.name_id
GROUP BY names.Old
HAVING COUNT(names.Old) > 1
)
ORDER BY n.Old DESC;
Но у меня выходит нечто громоздкое + если один и тот же человек встречается дважды - он становится одногодкой с самим собой.
Есть ли способ решить задачу, используя всего один селект? Предполагаю, копать надо в сторону селфджойна уже сделанного джойна?
SELECT * JOIN выглядит следующим образом
Query result:
+----+---------+-----+----+---------+----------+
| Id | Name | Old | Id | name_id | position |
+----+---------+-----+----+---------+----------+
| 1 | Tom | 12 | 1 | 1 | Master |
| 2 | Lucy | 99 | 2 | 2 | Slave |
| 3 | Frank | 20 | 8 | 3 | Master |
| 3 | Frank | 20 | 3 | 3 | Dude |
| 4 | Jane | 99 | 4 | 4 | Killer |
| 5 | Robert | 1 | 6 | 5 | Dude |
| 5 | Robert | 1 | 5 | 5 | Master |
| 6 | Session | 20 | 7 | 6 | Slave |
+----+---------+-----+----+---------+----------+
Affected rows: 8
Помогите, я в тупике
Запрос, если надо кому потыкать
CREATE TABLE NAMES(
Id integer PRIMARY KEY,
Name text,
Old integer
);
CREATE TABLE STATS(
Id integer PRIMARY KEY,
name_id integer,
position text
);
/ Create few records in this table /
INSERT INTO NAMES VALUES(1,'Tom', 12);
INSERT INTO NAMES VALUES(2,'Lucy', 99);
INSERT INTO NAMES VALUES(3,'Frank', 20);
INSERT INTO NAMES VALUES(4,'Jane', 99);
INSERT INTO NAMES VALUES(5,'Robert', 1);
INSERT INTO NAMES VALUES(6,'Session', 20);
INSERT INTO STATS VALUES(1, 1, "Master");
INSERT INTO STATS VALUES(2, 2, "Slave");
INSERT INTO STATS VALUES(3, 3, "Dude");
INSERT INTO STATS VALUES(8, 3, "Master");
INSERT INTO STATS VALUES(4, 4, "Killer");
INSERT INTO STATS VALUES(5, 5, "Master");
INSERT INTO STATS VALUES(6, 5, "Dude");
INSERT INTO STATS VALUES(7, 6, "Slave");
SELECT FROM STATS;
SELECT FROM NAMES;
SELECT n.Name, n.Old, GROUP_CONCAT(s.position)
FROM NAMES n
LEFT JOIN STATS s
ON n.Id = s.name_id
GROUP BY n.Name, n.Old
HAVING n.Old IN (
SELECT names.Old
FROM NAMES names
LEFT JOIN STATS stats
ON names.Id = stats.name_id
GROUP BY names.Old
HAVING COUNT(names.Old) > 1
)
ORDER BY n.Old DESC;
Запрос, если надо кому потыкать
CREATE TABLE NAMES(
Id integer PRIMARY KEY,
Name text,
Old integer
);
CREATE TABLE STATS(
Id integer PRIMARY KEY,
name_id integer,
position text
);
/ Create few records in this table /
INSERT INTO NAMES VALUES(1,'Tom', 12);
INSERT INTO NAMES VALUES(2,'Lucy', 99);
INSERT INTO NAMES VALUES(3,'Frank', 20);
INSERT INTO NAMES VALUES(4,'Jane', 99);
INSERT INTO NAMES VALUES(5,'Robert', 1);
INSERT INTO NAMES VALUES(6,'Session', 20);
INSERT INTO STATS VALUES(1, 1, "Master");
INSERT INTO STATS VALUES(2, 2, "Slave");
INSERT INTO STATS VALUES(3, 3, "Dude");
INSERT INTO STATS VALUES(8, 3, "Master");
INSERT INTO STATS VALUES(4, 4, "Killer");
INSERT INTO STATS VALUES(5, 5, "Master");
INSERT INTO STATS VALUES(6, 5, "Dude");
INSERT INTO STATS VALUES(7, 6, "Slave");
SELECT FROM STATS;
SELECT FROM NAMES;
SELECT n.Name, n.Old, GROUP_CONCAT(s.position)
FROM NAMES n
LEFT JOIN STATS s
ON n.Id = s.name_id
GROUP BY n.Name, n.Old
HAVING n.Old IN (
SELECT names.Old
FROM NAMES names
LEFT JOIN STATS stats
ON names.Id = stats.name_id
GROUP BY names.Old
HAVING COUNT(names.Old) > 1
)
ORDER BY n.Old DESC;
ты ебанутый? в SQL, как в практической реализации реляционной теории, не существует такого понятия как "порядок строк".
Как там оно вставляется ебать тебя не должно. Не используй это словосочетание.
В этом был смысл создания SQL и СУБД.
Но ты можешь написать к любому выражению ORDER BY.
Решил сам в итоге селфджойном, красота. Теперь осталось только EXPLAIN потыкать и мб слоулогом
В ORM же есть... пусть и создаёт строку с наиболее длинным значением
ПЕРЕКАТ >>2336742 (OP)
ПЕРЕКАТ >>2336742 (OP)
ПЕРЕКАТ >>2336742 (OP)
ПЕРЕКАТ >>2336742 (OP)
Они сами не знают
Если у тебя огромная таблица где много повторяющихся данных то изменения в этой таблице начнут занимать слишком много времени.
Вы видите копию треда, сохраненную 5 августа 2022 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.