Это копия, сохраненная 22 апреля 2021 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
в котором мы
-Выслушиваем, почему в шапке по-прежнему отсутствует инфа для вкативания
-Разбираемся, почему PostgreSQL - не Oracle
-Пытаемся понять, зачем нужен Тырпрайс, если есть бесплатный опенсурс
-Обсуждаем, какие новые тенденции хранения данных появляются в современном цифровом обещстве
-Решаем всем тредом лабы для заплутавших студентов и задачки с sql-ex для тех, у кого завтра ПЕРВОЕ собеседование
-Анализируем, как работает поиск вконтакте
-Игнорируем конкаренси-шизика, не понимающего, зачем базы данных нужны
-И просто хорошо проводим время, обсирая чужой код, не раскрывая, как писать правильно
Поехали!
Предыдущий тонет здесь: >>1638710 (OP)
спасибо, няша
Нет.
Бля, тредом промахнулся.
Мне бы для постгреса.
почему ты думаешь, что люди с сертификатом могут быть чем-то полезны в интернете?
так и не делай, лол.
Используй google spreadsheets. Данные в программу закачивай через веб в виде csv. Результаты тоже через api в гугл-таблицы выдавай.
с того самого момента как функции ДБА может выполняет любой нетупой программист?
с того самого момента, как государственное ИТ,где смотрели бы на сертификаты, стало скопищем долбоебов, а деньги платят лишь на зарубежных галерах?
Предстоит собес на жуниор дата инженера.
1 вариант) Таблица A: столбец id инт, столбец b_id - массив интов. Таблица b: столбец id int. Нужно поджоинить по элементам массива b_id таблицу b по индексам.
2 вариант) Таблица А, таблица Б: столбец id - инт. таблица С: столбец a_id int, столбец b_id int. Ну и через таблицу С джоиним таблицу Б.
Массив интов не меняется, как и таблица С.
Что думаете по этому поводу и почему?
Замеры провести не получается =(. Не умею я это делать
Мне кажется, разворачивание массива затратнее. Да и выглядит второй вариант лучше.
откуда вы блять лезите
Т.е. сделать select с разбивкой на этот интервал на всю таблицу (до 5000; 5000-10000; 10000-15000...)
Я не работал с SQL ранее.
Пожалуйста помогите.
или делить на 5000 и смотреть целую часть, и на основании этого ставить метку. Смотря что там в исходных данных и какой конкретно результат нужен.
В новой таблице intervals_table делаешь два столбца start_interval и end_interval, заполняешь интервалами. Потом select * from prices_table join intervals_table on prices_table.price between intervals_table.start_interval and intervals_table.end_interval order by prices_table.price.
лучше сделать доп поле id в каждой таблице, а на столбец реальных данных повесить индекс с уникальностью
Делаю первичные ключи любого типа, и даже многоколоночные. Большинство таблиц не-связок конечно всё-таки с числовым id, потому что в данных нет уникальности. Но там где можно, почему нет? Нахуя ещё одна колонка с индексом? Это очевидное васянство из разряда обязательной аббревиатуры типа в названии колонки.
>>787717
>>787723
>>787810
>>787964 - просмотрел эту штуку, но я слишком toopoi неопытный гумманитарий для таких колдунств.
Вот к чему пристаковерфловил:
SELECT 5000 ( priceAmount / 5000 ) AS start_range,
5000 ( priceAmount / 5000 ) + 5000 AS end_range,
count(*) AS COUNT
FROM price
GROUP BY priceAmount / 5000
Оно считает группы, но завязано на наличие существующих цен.
Поэтому если не будет цен в промежутке определенном, то он не будет создавать этот промежуток в результирующей таблице и ставить ему 0 в подсчете вхождений.
Я ведь правильно понимаю, что это человеку понятно, если диапазон пустой, то там нет вхождений, а вот роботу это будет непонятно, т.к. он должен обрабатывать подряд все статистические данные? И придется создавать костыли потом, если понадобится считать пустые интервалы (хотя я хз, что там будет потом и какая хотелка будет).
Какая логика считается правильной - больше данных это нормально или не париться о пропущенных значениях?
По поводу создания временной таблицы интервалов:
Я не понял как это делать (пытаяюсь вызвать хоть что-то, ругается на селект из #таблицы, хотя она и считается созданной нормально), но придерживаюсь такой логики, что ее нужно заполнять для СТАРТовых от нуля + 5000, а для КОНЕЧных от 5000 + 5000 и заканчивать таблицу на максимальном значении цены + 5000 , которое есть в таблице с ценами.
Руками такую таблицу интервалов заполнять не вариант, а как вот это все вышеописанное зациклить хз.
Чет у меня от логики картинка
<
DROP TABLE #tmp
CREATE TABLE #tmp
(ID INT IDENTITY(1,1),value_current int,value_next int)
DECLARE @step int
set @step=5000
WHILE @step < 9000000
BEGIN
INSERT INTO #tmp
(value_current,value_next)
VALUES (@step,@step+5000)
set @step=@step+5000
END;
SELECT *
FROM #tmp
Ну тут временная таблица, а себе генирируй постоянную. С другой стороны там записей ты всего пару тыщ лол не думаю что твоя шарага яхтами торгует, и временной хватит. Как джоинить анон выше уже писал. Если нужны пустые интервал делаешь левое соединение.
Кстати вот хороший вариант без всяких временных таблиц.
Select
Range as [Score Range],
Count(*) as [Number of Occurences]
from
Ranges r inner join Scores s on s.Score between r.LowerLimit and r.UpperLimit
group by Range
Я вкатываюсь в джанго, отдельно sql не изучал, только поверхностно. Ну вот, создаю я бд для хранения бронирований в гостинице. В ней должны быть данные о клиенте (фио, емейл, телефон итд), дата его заселения, дата выезда, где он забронировался (сайт отеля, букинг итд), категория номера и цена. Я правильно понимаю, что у меня будет одна основная таблица со всем этим, но повторяющиеся данные вынесены в другие таблицы и связаны с основной через foreign key? То есть все данные о клиенте будут в таблице "клиенты" и в основной будет просто id из той. Источник брони и категории тоже.
Но вот до меня не очень допирает, а как собственно делаются запросы к таким бд? Вот если мне нужно вывести все данные о брони, что нужно прописать, чтоб взялись данные из таблиц, связанных внешними ключами? Я прост не знаю как загуглить, сорян, наверное тупой вопрос конечно.
Вот есть у нас что-то вроде:
SELECT op_entries., op_entries_status.
FROM op_entries
LEFT OUTER JOIN op_entries_status ON op_entries.id = op_entries_status.op_id AND op_entries_status.order_id = 3
Я понимаю когда условие ON одно, что-то типо "ON table_1.id == table_2.key" но что означают эти AND и в особенности OR?
?
Я с БД знакомился лишь год назад в универе, сейчас приперло разобраться почему некоторые query возвращают пустой результат. Что такого-то? Ты что ли сам с пеленок SQL ебашить начал?
Та же логика, что у where. Можешь считать это where подзапроса к второй таблице.
Или так, джойны в анси89:
select cheta from huita1, huita2 where huita1.fid = huita2.id and huita2.da = 1;
Спасибо.
Зашквар спрашивать элементарные вещи по базовым дисциплинам. Просто берешь и читаешь учебник. Там все ответы.
Sql - это абсолютно необходимое знание айтишника.
Так у тебя наитупейший вопрос, по простой бинарной логике. Если ты неспособен понять таких вещей или экстраполировать их на другую область, то лучше иди копай ямы или принтеры носи.
Оно просто проходит по каждому ряду. Если выражение в ON возвращает true - джойнит, иначе - не джойнит.
мб поможет
Таблица в которую пишутся результаты распознавания имеет еще 2 колонки - foreign key с таблицами:
Project (пик 1)
Server (пик 2)
Нужно составить sql запрос, который выведет: дату(можно задать промежуток дат), результат распознавания (АО, человек, положительно-отрицательно), далее для каждого результата распознавания: кол-во за каждую дату (если указан промежуток), длительность всех аудио, проект и сервер.
Ах, да, это Postgres.
Наебался. interval
Вроде написал запрос. Только на синтаксис ругается, на запятую в 4 -й строке. Подскажите как пофиксить, пожалуйста
Я хуею, додик нашёл буратину который напишет ему запрос, а сам блядь даже запятую убрать не в состоянии
Шрифт, скорее всего, Hack, а подсветка - вот эта хуита: carbon.now.sh
Чел, мы тут тхреад не могли перекатить две недели, а ты о какой-то шапке спрашиваешь.
Посоветуйте курс на ораклового ДБА нормальный, чтобы КОТИРОВАЛСЯ
Типа разные СУБД вообще. Если тебя конкретно запросы интересуют, а не внутрянка, то базовый SQL по спеке везде плюс-минус одинаковый, отличаются специфическими функциями. Работа со строками, с датами и т.д.
А вот если тебе нужно погромирование и SP, то тут кардинальные отличие начинается, погугли как выглядит pl-sql (oracle) и t-sql (mssql).
Ваши родители москвичи? Вы живете в столице?
Не надейся особо на местных, тут редко что-то подсказывают или советуют.
Твердый и решительный бамп
Соси хуй, мань.
Теорию читаю, но не особо понятно.
Я так понимаю out можно вызывать из другой процедуры?
Как вытащить таргетно каждую запись за 1 запрос?
Если id у тебя ещё и primary key, то для него скорее всего создан индекс. Поэтому обхода всех записей не будет, каждая запись найдётся на O(logN).
ебанутый вопрос.
ты на одном и том же сервере раскидал таблички в разных БД?
или запустил 4 раза mysqld, но на одном сервере?
В теории, во втором случае МОЖЕТ возрасти параллелизм.
Но скорее, в твоем тупом случае, никак не изменится, только устанешь переписывать программы.
Есть application который состоит из нескольких модулей (могут быть запущены или не использоваться). Есть бизнес логика, разделенная в соответствие с задачами. Вот и хочу понять, есть резон все в одной схеме ебашть и засирать таблицами, которые могут быть просто мертвым грузом или же разделить на схемы в соответствие с модулями приложения)
проще говорят модули: A, B,C,D
И будет соответственно 4 БД на одном сервере: A_DB, B_DB, C_DB, D_DB. Проще будет дампы делать по идее и управлять правами.
Про нагрузку я уже понял, или интансы запускать или сосать писю, так как ынтерпрайз решение не дадут. Только PG как вариант
Просто клади в разные файловые группы. Процессор и память можно маштабировать бесконечно.
Это для кол-во работает Select count(distinct(чек) as кол-во чек from t1 where = месяц
По логике я должен просто сделать так
Select AVG(count(distinct(чек)) as кол-во чек from t1 where = месяц
Или select avg(Select count(distinct(чек) as кол-во чек from t1 where = месяц) as GGG from t1
Хэлп ми
Ещё нужен GROUP BY day_of_week.
SELECT Месяц, ДеньНедели, AVG([Кол-во чек])
FROM govno
GROUP BY Месяц, ДеньНедели
то ли ты вобще какую-то хуйню наитупейшую спросил, то ли задания не понял
>>797928
Кол-во чек подсчитывается как сумма уникальных значений
count(distinct № чек).
Теперь мне нужно сделать как среднее количество чеков за день недели. Например среднее кол-во чеков за все понедельники месяца 228, дальше среднее кол-во чеков за все понедельники месяца разбивка на магазины в первом 226 во втором 229 в третьем 250 и тд.
Я бы хотел сделать это все одним запросом, но как тупое решение нахожу создании новой таблицы в которой будет хранится кол-во чеков за период
Столбец Дата связан с таблицей Календарь, там хранятся дни недели. Дни неделю я джойню и группирую
with govno
as
(
SELECT Дата , COUNT(DISTINCT Чек) as Zalupa
FROM GOVNO
GROUP BY Дата
)
SELECT z.Месяц, z.Дата,z.ДеньНедели, AVG(Zalupa) as Zalupa
FROM GOVNO as g inner join ТАБЛИЦА_КАЛЕНДАЯ as z
on g.Дата=z.Дата
group by z.Месяц, z.Дата,z.ДеньНедели
Манга по базам данным - нормальная вводная книга или лучше взять что-то более фундаментальное?
Ты не сможешь масштабировать или ускорить бд просто переименованием баз. Это не так делается.
Как делают взрослые дяди, если ресурсов на репликацию нет?
Чёт как-то долго. Ты там индексы не перестраиваешь на каждый инсерт? Поиграй с параметрами при взятии дампа.
Можно было бы хранить base64 или file:///ссылками прямо в базе, но какое-то внутреннее чутьё меня останавливает.
Вместо базы mysql 8.0, если вдруг это важно.
храни url, в чём проблема?
> сколько бд вести?
База около 25 гигов. Миллиарды записей. Но на то она и база ведь. Мог и в блокнотик записывать, коль так сложно это всё. 21 век на дворе. Видимо где-то я что-то не не так делаю.
>>798517
>Покажи запрос бекапа\востановления
mysqldump --all-databases --compact --single-transaction -u root -p xxxxxxxxxxxxxxxx > bkp.sql
его потом в другую базу:
mysql -f -uroot -p < bkp.sql
И висит уже больше суток. Пара ошибок в процессе вылезло по датам, но ничего серьезного.
Это же не дело.
Была пуста, сначала ещё --no-data залил с созданием таблиц, потом фулл дамп. Вопрос вобщем-то не в этом, а в том, можно ли как-то не тупыми запросами в базу её бэкапить (честно, видится это как самый идиотский способ, который только можно придумать), а бэкапить одним куском, бинарно, то, на чём она лежит, или типа того? Может в том же разделе создать файл с виртуальным разделом, например в btrfs и среплицировать в него, а оттуда уже снапшотом куда угодно... Что-то мне подсказывает, что давно есть много полезных опенсорсных утилит на эту тему.
Есть набор Отделов (каждый Отдел представлен своей таблицей), к каждом Отделу приписаны Сотрудники (с помощью Foreigh Key), для каждого отдела надо сделать "таблицу соответствий" по типу id_сотрудника -> приоритет_сотрудника
Как это лучше всего намутить? Пока что вижу лишь закинуть поле JSON внутрь Отдела и представить ключи id-шниками Сотрудников и значения - приоритетом
>>799791
Сделай join table employees_departments employee_id, department_id, priority с уникальным индексом по первым двум колонкам
Эдгар Кодд и Кристофер Дэйт как бы говорят, что суррогатный ключ (а это как раз Id исключительно для ключа) - зло. Не совсем с этим согласен, но да, если есть поле, уникальное и неизменяемое со временем, то быть ему ключом. Пример - уникальный код товара. Плохой пример - номер паспорта. А вообще, лучше почитать про нормальные формы, хотя бы про первые три, например тут: https://metanit.com/sql/tutorial/2.2.php, осознать их и уже потом решать, нужен суррогатный ключ или хватит натурального.
Знаешь как в postgres поставить check constraint на json-поле? Мне надо проверять чтобы любое значение по ключу было числом, большим нуля
Как меня уже заебало это нытье НУ ТАМ ЖЕ ЕЩЁ ДАТА НЕИЗВЕСТНА, ПОЭТОМУ NULL - пошли нахуй петухи, у них пол базы данных обосрано в NULL.
Почему ты так переживаешь по этому поводу? Базка-то работает? Нагрузку держит? Пользователи счастливы?
Во-во. Понаберут зумерье всякое а потом расхлебвают
Большие Дяди с Большими писями по такой херне не загоняются
это и есть нормальный способ.
когда делаешь бекап, следует думать не о том как его сделать, а как его будет восстанавливать нанятый после тебя за еду эникей.
в смысле просто сконвертировать его в строку или под сериализацией понимается что-то еще?
Да.
А считать можно подзапросом по количеству разделителей(запятых). Ну или n+1
Верно ли я понимаю, что при выполнении:
INSERT INTO таблица () VALUES ();
триггер сработает на каждую вставляемую строку, а не единожды в конце этой команды? Если да, можно ли в мускуле добиться поведения триггера как во втором варианте?
Сап, котики! Прошу помощи. Скорее поставить мне мозги, чем написать за меня запрос хотя запрос с объяснением будет в тему.
Есть БД "ШКОЛА" (пилил в oracle developper).
(PK) - первичный ключ, (FK) - внешний ключ.
Сущности в БД:
-classes (классы) [Id (PK), Lvl (название класса 1А, 2Б...), QtyStudents (кол-во учащихся]
-subjects (предметы) [Id (PK), Subj_Name (Матем, Русский...), Teacher_Id]
-teachers (учителя) [Id (PK), Last_name, First_Name, Middle_Name]
-lessons (уроки "занятия") [Id (PK), Lesson_Date, Teacher_Id (FK), Class_Id (FK), Subj_Id (FK), Fullness (посещаемость на этом уроке)]
Только таблица lessons связана с тремя остальными через внешний ключ. Оставшиеся три таблицы между собой не связаны (например teachers не связана напрямую с subjects).
Надо написать запрос, который выводит:
фамилию и имя учителя, предмет за месяц, с наименьшей посещаемостью. Т.е. одну строку с наименьшим значением (Fullness/QtyStudents) 100%.
Джва часа рожал, нашел как выбрать минимальный процент. Но, как его обернуть в запрос, чтобы подтянулась фамилия, имя и предмет - не осилил. Плеас, хэлп.
Вот этот селект выводит минимальный процент посещаемости:
SELECT MIN(100l.Fullness/c.Qty_Students)
FROM lessons l JOIN classes c ON (l.Class_Id = c.Id)
JOIN teachers t ON (l.teacher_id = t.Id)
JOIN subjects s ON (l.Subj_Id = s.Id);
Пытаюсь обернуть вот так:
SELECT t.Last_Name, t.First_Name, s.Subj_Name,
(
SELECT MIN(prc)
FROM
(SELECT 100*l.Fullness/c.Qty_Students prc
FROM lessons l JOIN classes c ON (l.Class_Id = c.Id)
JOIN teachers t ON(l.teacher_id = t.Id)
JOIN subjects s ON (l.Subj_Id = s.Id)
)
)
FROM lessons l join classes c ON (l.class_id = c.id)
JOIN teachers t ON (l.Teacher_Id = t.Id)
JOIN subjects s ON (l.Subj_Id = s.Id)
WHERE l.Lesson_Date > to_date('2020-11-01', 'YYYY-MM-DD')
AND l.Lesson_Date < to_date('2020-11-30', 'YYYY-MM-DD');
Выводит все фамилии, имена, предметы и напротив каждого пишет один и тот же минимальный процент. Типа:
Иванов, Иван, Матем, 55%
Петров, Петя, Литра, 55%
Сычёв, Вася, Русиш, 55%
Сап, котики! Прошу помощи. Скорее поставить мне мозги, чем написать за меня запрос хотя запрос с объяснением будет в тему.
Есть БД "ШКОЛА" (пилил в oracle developper).
(PK) - первичный ключ, (FK) - внешний ключ.
Сущности в БД:
-classes (классы) [Id (PK), Lvl (название класса 1А, 2Б...), QtyStudents (кол-во учащихся]
-subjects (предметы) [Id (PK), Subj_Name (Матем, Русский...), Teacher_Id]
-teachers (учителя) [Id (PK), Last_name, First_Name, Middle_Name]
-lessons (уроки "занятия") [Id (PK), Lesson_Date, Teacher_Id (FK), Class_Id (FK), Subj_Id (FK), Fullness (посещаемость на этом уроке)]
Только таблица lessons связана с тремя остальными через внешний ключ. Оставшиеся три таблицы между собой не связаны (например teachers не связана напрямую с subjects).
Надо написать запрос, который выводит:
фамилию и имя учителя, предмет за месяц, с наименьшей посещаемостью. Т.е. одну строку с наименьшим значением (Fullness/QtyStudents) 100%.
Джва часа рожал, нашел как выбрать минимальный процент. Но, как его обернуть в запрос, чтобы подтянулась фамилия, имя и предмет - не осилил. Плеас, хэлп.
Вот этот селект выводит минимальный процент посещаемости:
SELECT MIN(100l.Fullness/c.Qty_Students)
FROM lessons l JOIN classes c ON (l.Class_Id = c.Id)
JOIN teachers t ON (l.teacher_id = t.Id)
JOIN subjects s ON (l.Subj_Id = s.Id);
Пытаюсь обернуть вот так:
SELECT t.Last_Name, t.First_Name, s.Subj_Name,
(
SELECT MIN(prc)
FROM
(SELECT 100*l.Fullness/c.Qty_Students prc
FROM lessons l JOIN classes c ON (l.Class_Id = c.Id)
JOIN teachers t ON(l.teacher_id = t.Id)
JOIN subjects s ON (l.Subj_Id = s.Id)
)
)
FROM lessons l join classes c ON (l.class_id = c.id)
JOIN teachers t ON (l.Teacher_Id = t.Id)
JOIN subjects s ON (l.Subj_Id = s.Id)
WHERE l.Lesson_Date > to_date('2020-11-01', 'YYYY-MM-DD')
AND l.Lesson_Date < to_date('2020-11-30', 'YYYY-MM-DD');
Выводит все фамилии, имена, предметы и напротив каждого пишет один и тот же минимальный процент. Типа:
Иванов, Иван, Матем, 55%
Петров, Петя, Литра, 55%
Сычёв, Вася, Русиш, 55%
Есть мнение что задачи нужно решать, собирая данные как пирамидку. Ага смотрим тебе, тебе нужно найти что-то по учителям, делаем селект из учителей. Смотрим не хватает уроков, джоиним уроки и тд.
Соотвественно просто сначала обогащаешь таблицу нужными полями т.е просто джоинишь ВСЕ таблицы.
Потом добавляешь вычисляемое поле которое выделает часть месяца из даты, и большую таблицу группируешь по месяцу+учителю, в групировки делаешь наполняемость на количество, или что ты там посчитать хотел.
ты в яндекс гуглишь?
сделай триггер FOR EACH ROW
Когда-то давно в mysql это не работало, но сейчас все ок.
Больной ублюдок, я бы за такое ногами пиздил.
Я как раз склоняюсь в сторону монги, естественно она будет лучше для таких задач, но накатывать ее на сервер, разбираться, ебаться с ней и перепиливать код под нее - для меня тот еще гемор, потому и спрашиваю, может мускуль тоже неплохо справится с подобным.
Короче посмотрю как оно будет работать на мускуле, если накроется медным тазом, придется всё перепердоливать.
>придется всё перепердоливать.
Всё равно придётся рано или поздно. Лучше сразу сделать нормально.
>Соотвественно просто сначала обогащаешь таблицу нужными полями т.е просто джоинишь ВСЕ таблицы.
угу, понимаю
>Потом добавляешь вычисляемое поле которое выделает часть месяца из даты
Что подразумевается под "вычисляемым полем"? Оно в секции SELECT или WHERE?
Я всегда зажимаю шифт, мне норм.
Если должны обрабатываться данные только одного какого-то месяца, то просто сортируем сведённые данные по "посещаемости" и берем первую запись.
-- псевдокод:
SELECT TOP 1 "процент посещаемости", фамилия, имя ...
FROM T1 JOIN T2 ....
WHERE месяц N
ORDER BY "процент посещаемости"
Ну ёбана, ты что совсем деревянный? Вычисляемое - ещё одно поле в таблице, которое получено из существующих полей(например стобец2 * стобец2 ). В WHERE только фильтры, новые данные в таблицу ты не добавишь.
Как там в 2008?
>>804904
>>804930
Спасибо, няши. Я почти-почти допинал.
Сейчас у меня выводятся ФИО, предмет и последний столбец - с минимальной явкой. Но мне теперь нужно, чтобы выводилась только одна строка с минимальным значением в последнем столбце. Прописываю последней строкой
having min(yavka);
select t.Last_Name, t.First_Name, s.Subj_Name,
min(100*l.Fullness/c.Qty_Students) as yavka
from lessons l join classes c on (l.Class_Id = c.Id)
join teachers t on (l.teacher_id = t.Id)
join subjects s on (l.Subj_Id = s.Id)
where l.Lesson_Date > to_date('2020-11-01', 'YYYY-MM-DD')
and l.Lesson_Date < to_date('2020-11-30', 'YYYY-MM-DD')
group by t.Last_Name, t.First_Name, s.Subj_Name
having min(yavka);
Пишет "invalid relational operator"
Но если последнюю строку переписать на сравнение например фамилии с каким-нибудь учителем, то все работает (остается одна строка, но не та, которая мне нужна)
having t.Last_Name = 'Ivanov';
>>804930
> ты что совсем деревянный? Вычисляемое - ещё одно поле..
я просто новенький и пока путаюсь в терминах... "вычисляемое" там или еще какое. уменьшаемое, вычитаемое, слагаемое - помню. Вычислемеое - нет))
Ну точнее тебе нужно сделать сортировку, потом вывести первую строчку, что-то типа:
select top 1
from govno
where min(100l.Fullness/c.Qty_Students)
Но в оракле функции топ вроде нет, но есть аналаги гугли oracle top
GROUP BY не требуется. Как я уже писАл, сортировка и топ 1:
select t.Last_Name, t.First_Name, s.Subj_Name,
--min убираем
(100l.Fullness/c.Qty_Students) as yavka
from lessons l join classes c on (l.Class_Id = c.Id)
join teachers t on (l.teacher_id = t.Id)
join subjects s on (l.Subj_Id = s.Id)
where l.Lesson_Date > to_date('2020-11-01', 'YYYY-MM-DD')
and l.Lesson_Date < to_date('2020-11-30', 'YYYY-MM-DD')
order by yavka -- сортировка
FETCH FIRST ROW ONLY;
Ну а если очень-очень хочется c GROUP BY , то можно так:
select t.Last_Name, t.First_Name, s.Subj_Name,
min(100l.Fullness/c.Qty_Students) as yavka
from lessons l join classes c on (l.Class_Id = c.Id)
join teachers t on (l.teacher_id = t.Id)
join subjects s on (l.Subj_Id = s.Id)
where l.Lesson_Date > to_date('2020-11-01', 'YYYY-MM-DD')
and l.Lesson_Date < to_date('2020-11-30', 'YYYY-MM-DD')
group by t.Last_Name, t.First_Name, s.Subj_Name
having min(100*l.Fullness/c.Qty_Students) IN (
SELECT MIN(100l.Fullness/c.Qty_Students)
FROM lessons l JOIN classes c ON (l.Class_Id = c.Id)
JOIN teachers t ON (l.teacher_id = t.Id)
JOIN subjects s ON (l.Subj_Id = s.Id)
);
GROUP BY не требуется. Как я уже писАл, сортировка и топ 1:
select t.Last_Name, t.First_Name, s.Subj_Name,
--min убираем
(100l.Fullness/c.Qty_Students) as yavka
from lessons l join classes c on (l.Class_Id = c.Id)
join teachers t on (l.teacher_id = t.Id)
join subjects s on (l.Subj_Id = s.Id)
where l.Lesson_Date > to_date('2020-11-01', 'YYYY-MM-DD')
and l.Lesson_Date < to_date('2020-11-30', 'YYYY-MM-DD')
order by yavka -- сортировка
FETCH FIRST ROW ONLY;
Ну а если очень-очень хочется c GROUP BY , то можно так:
select t.Last_Name, t.First_Name, s.Subj_Name,
min(100l.Fullness/c.Qty_Students) as yavka
from lessons l join classes c on (l.Class_Id = c.Id)
join teachers t on (l.teacher_id = t.Id)
join subjects s on (l.Subj_Id = s.Id)
where l.Lesson_Date > to_date('2020-11-01', 'YYYY-MM-DD')
and l.Lesson_Date < to_date('2020-11-30', 'YYYY-MM-DD')
group by t.Last_Name, t.First_Name, s.Subj_Name
having min(100*l.Fullness/c.Qty_Students) IN (
SELECT MIN(100l.Fullness/c.Qty_Students)
FROM lessons l JOIN classes c ON (l.Class_Id = c.Id)
JOIN teachers t ON (l.teacher_id = t.Id)
JOIN subjects s ON (l.Subj_Id = s.Id)
);
Ну тащемта да, если ему нужно для одного месяца. Но логично бы было предположить, что нужна таблица с топом для каждого месяца.
Запись лога не тормозит практически.
Тормозит фиксация , тк тебе придется включить binlog , а sync_binlog Default Value = 1
Сама репликация :
>Replication is asynchronous by default
Тоже не должна тормозить на бытовом уровне понимания.
В реальности все очень зависимо от разных штук.
не так страшно как об этом думают яваскрипт-макаки
>
Indexing a Generated Column to Provide a JSON Column Index
Почитай это
https://dev.mysql.com/doc/refman/8.0/en/create-table-secondary-indexes.html
Помогите понять, может ли Postgres в параллельное обновление нескольких колонок одной строки без локов?
Например, представьте схему:
```
create table foo (
id int
val1 int
val1_updated_at timestamp
val2 int
val2_updated_at timestamp
)
```
Есть два типа апдейтов:
```
update foo
set val1 = ??? and val1_updated_at = ???
where id = 1
```
и
```
update foo
set val2 = ??? and val2_updated_at = ???
where id = 1
```
При одновременном выполнении таких апдейтов, вызовет ли это проблемы с целостностью данных?
Помогите понять, может ли Postgres в параллельное обновление нескольких колонок одной строки без локов?
Например, представьте схему:
```
create table foo (
id int
val1 int
val1_updated_at timestamp
val2 int
val2_updated_at timestamp
)
```
Есть два типа апдейтов:
```
update foo
set val1 = ??? and val1_updated_at = ???
where id = 1
```
и
```
update foo
set val2 = ??? and val2_updated_at = ???
where id = 1
```
При одновременном выполнении таких апдейтов, вызовет ли это проблемы с целостностью данных?
[code]
create table foo (
id int
val1 int
val1_updated_at timestamp
val2 int
val2_updated_at timestamp
)
[/code]
Не слушай этого перфекциониста. Сделай, чтобы работало, пойми корнер кейсы, покрой тестами, а потом переделаешь нормально.
Есть довольно сложная база, в ней имеется таблиц 20. Раз в неделю мы делаем по ней некий отчёт и вьюху, которую требует отдел долбоёбов. Им время от времени не нравится, и они просят переделать/сделать другую вьюху с другими параметрами.
Каждый раз прогонять требуемые запросы - жопоебля, так как один такой запрос будет на нашем ебаном сервере часа два грузиться. Вопрос: существуют ли какие-то тулзы, которые по аналогии с Excel могут интуитивно делать необходимые этому отделу долбоёбов запросы? Или, если нет, как можно решить эту проблему? Была идея напилить свой скрипт на питоне, который будет в соответствии с выбранными столбцами посылать необходимый запрос SQL и возвращать на выходе CSVшник, но пока не очень представляю как это сделать.
Сам Excel не предлагайте, он будет нереально виснуть от объёма базы
Также не предлагайте Power BI, уже пробовали, он под такое изза своей сложности тоже не заточен
Заранее спасибо
Powerquery, repoting service
>Вопрос: существуют ли какие-то тулзы, которые по аналогии с Excel могут интуитивно делать необходимые этому отделу долбоёбов запросы?
да.
power bi и tableau.
>Power BI, уже пробовали, он под такое изза своей сложности
в таком случае может вам всей фирмой нахуй пойти?
Вы просто ленивые долбоебы. Это лучше из возможных решений.
>Каждый раз прогонять требуемые запросы - жопоебля, так как один такой запрос будет на нашем ебаном сервере часа два грузиться
и че так долго то?
Возможно, вам нужна колоночная аналитическая бд.
типа clickhouse или vertica. И автоматический процесс доставки данных в нее.
В CH сложно вкатываеться?
В правильности первого я практически не сомневаюсь, второе вызывает вопросы, а третье мне непонятно
*в 2 надо
Бампану вопрос. Очень лень писать тест интеграционный с многопоточностью, поднимать докер, писать бойлерплейт и проч.
Чот я особо не вникал, но на первый взгляд задачи эллементарные, за на 10 баллов селект из одной таблицы, на 50 групировка с каунтом
ОП, добавь в шапку: https://dbdb.io/
Да и вообще можно весь Карнеги Меллон добавить:
https://db.cs.cmu.edu/
https://www.youtube.com/channel/UCHnBsf2rH-K7pn09rb3qvkA/playlists
Отвык от уебанское двачевской разметки.
- https://db.cs.cmu.edu/
- https://www.youtube.com/channel/UCHnBsf2rH-K7pn09rb3qvkA/playlists
ХакерРанк, ЛитКод (нужна премиум подписка), куча всего. В гугле забанили?
Вроде довольно большая бесплатная коллекция задач: https://www.hackerrank.com/domains/sql
На литкоде нет "бесплатной подписки". Так-то да, он бесплатен, но когда я смотрел последний раз (около месяца назад), почти все вопросы на SQL были под замком.
https://leetcode.com/problemset/database/
Я не очень умный, но я пытаюсь :c
В идеале вообще в песочнице было б таблицу создать и там тыкать, да.
Прособесудейте меня по MS SQL немного плиз.
Я не троллю, анон, никогда таким не занимался. Это слишком легко или невозможно?
Кому ты будешь писать додик? Золотову? Кто тебе даст доступ к бд ФНС с гостайной и личными данными?
На сайте же можно скачивать выписки, вот я и думал, что можно автоматизировать это через SQL.
Ладно, спасибо за ответ, продолжу делать через webdriver.
Какой, нахуй, лефт, долбоёб?
`AND phone_number LIKE ''+7905%"`
Обрати внимание на `%`.
И да, там везде должен быть AND.
В условиях задачи явно сказано - номер начинающейся на +7905, если паттерн был в середине, или там плюса не было, другой разговор. А с учётом того что вариант с лефтом более предпочтителен like, и в условиях задачи нам не двусмысленно намекают что его можно использовать. Он блять WHERE написать не может, а если у него спросят В ЧЁМ ПРЕИМУЩЕСТВО LIKE или ЧТО ОЗНАЧАЕТ ПРОЦЕНТ, он просто будет стоят и жидко обтекать.
А потом такие хуесосы как ты на продакшене везде свой ссаный полнотекстовый поиск пихают и удивляются, почему всё так хуёва работает.
Может я тупой, но куда ты там ЛЕФТ впихнёшь? Причём там ЛЕФТ вообще?
https://stackoverflow.com/a/24603325
https://stackoverflow.com/a/17701264
Вывод: лайк работает лучше, если есть индекс.
Идиот здесь ты. В чём, по-твоему, противоречие?
Есть две простенькие таблицы: id,id2 и id2,name
Надо вывести id,name двумя способами
И тут я сел в лужу ибо не понимаю что это за способы? То есть про join я в курсе, конечно же. А ещё как их объединить можно, через что?
Всратых способов можно много придумать.
1. select id, name from t1, t2 where t1.id2 = t2.id2 -- тоже джоин, но неявный
2. select id, (select name from t2 where t2.id2 = t1.t2) from t1
3. Написать какую-нибудь процедуру, где вложенным циклом проходишься по обеим таблицам и вручную джоинишь.
Жоин и подзапрос же
База для дискорд бота. В дискорде есть сервера (таблица guild), пользователи (user), роли пользователей на сервере (role). Пик № 1
У сервера может быть много пользователей и ролей. Пользователь может состоять на многих серверах и иметь много ролей. Не могу придумать схему базы. Пока остановился на двух вариантах
Первый кажется проще: пик № 2, тут все связи хранятся в одной таблице. Насколько это правильно?
Второй кажется логичнее: пик № 3, но чтобы сформировать простой запрос, понадобится вереница из джоинов.
Как будет правильнее?
Средний пик - это результат джойна guild_user, guild_role и user_role с третьего.
Второй вариант быстрее (результат джойна уже в готовой таблице) третий займет меньше байтиков под хранение. Но если юзеров у тебя не на терабайт, никакой реальной разницы нет.
Когда оно хочет присвоить новый порядковый номер счёту или другой писульке, оно, вместо того чтобы пользоваться родным механизмом секвенсов делает так:
select number from отдельная_индусотабличка_с_последними_присвоенными_номерами FOR UPDATE
Потом соответственно update number=number+1
Как исключить блокировки? Пилить родной секвенс для каждой таблицы, представляющий документ долгий мартышкин труд, их много.
Просто убрать for update - возможное дублирование сгенеренного номера.
Спасибо
Зочем вообще нужен ваш SQL, кроме как ради разогрева климата?
Мне кажется, что вы все дармоеды, пока нормальные поцаны архитектурят хайперформанс базы на сырых key-value движках сидите тут и дрочите.
Как думаешь, что сильнее разогреет атмосферу: SQL-запросы или производство огромного количества более ёмких дисков, чтобы вместить всю эту ненормализованную поеботу?
Это значит есть говнозапрос, который работает неприемлимое количество времени, или вообще не отрабатывает, так как требует недопустимое количество ресурсов - ты берешь и переписываешь его так, что он начинает отрабатывать за приемлимое количество времени, или отрабатывать вообще.
По статьям, литературе
- начальный уровень это базовые статьи по оптимизации, зачем нужны индексы, какие бывают индексы, когда их стоит и не стоит использовать, какие есть базовые способы доступа к данным в чем их отличия и преимущества, типы джоинов и их алгоритмы, типы объединений, способы аггрегаций, партиционирование/шардирование, способы организации данных на диске (колоночное/строковое) вычислительные сложности перечисленных алгоритмов. Все это довольно легко гуглится. Оснавная часть задач сводится к этим знаниям, если разработчики которые писали код - не обладают высокой кваллификацией.
- более продвинутый это уже специализация на конкретной бд. Какие операции из первого пункта лучше и эффективнее выполняются на движке определенной бд, а какие хуже. Предпочтение каким операциям следует отдавать, для данной бд исходя из ресурсов, которые ей доступны на сервере.Умение читать планы запросов и понимать. Понимать в каком месте запроса потенциальная проблема в потреблении ресурсов/скорости выполнения. Понимать какого плана следует достичь для оптимизации, как этого достичь с помощью изменения самого запроса/хинтов. Источники - статьи по оптимизаторам запросов конкретной бд, официальная документация бд. Если в команде более-менее толковые разработчики, то будут возникать в основном задачи такого типа.
- еще потяжелее, это уже углубление в движок бд и то как он взаимодействует с ОС. Тут требуется глубокое знание движка, возможно чтенте исходников бд, если она опенсорсная, понимание и знание некоторых принципов работы ос. Как работает кэширование и внутренние системные буферы бд, какие области памяти выделяются, какие типы памяти использутся, для чего они используются, как устроено хранение данных в файловой системе, логирование транзакций, откат транзакций, какие структуры данных для этого используются, какие процессы пораждаются бд, и какие функции выполняют, как организовано взаимодействие между этими процессами. Но на этом уровне редко попадаются задачи, обычно для их решения приглашают представителей компании, которая занмается разработкой/поддержкой бд.
Помимо этого может быть оптимизация на уровне ЕТЛ процесса или приложения, котрое взаимодествует с бд, путем уменьшения объема обрабатываемых данных/количества операций над ними при получении аналогичного результата, но это уже немного другая тема.
Это значит есть говнозапрос, который работает неприемлимое количество времени, или вообще не отрабатывает, так как требует недопустимое количество ресурсов - ты берешь и переписываешь его так, что он начинает отрабатывать за приемлимое количество времени, или отрабатывать вообще.
По статьям, литературе
- начальный уровень это базовые статьи по оптимизации, зачем нужны индексы, какие бывают индексы, когда их стоит и не стоит использовать, какие есть базовые способы доступа к данным в чем их отличия и преимущества, типы джоинов и их алгоритмы, типы объединений, способы аггрегаций, партиционирование/шардирование, способы организации данных на диске (колоночное/строковое) вычислительные сложности перечисленных алгоритмов. Все это довольно легко гуглится. Оснавная часть задач сводится к этим знаниям, если разработчики которые писали код - не обладают высокой кваллификацией.
- более продвинутый это уже специализация на конкретной бд. Какие операции из первого пункта лучше и эффективнее выполняются на движке определенной бд, а какие хуже. Предпочтение каким операциям следует отдавать, для данной бд исходя из ресурсов, которые ей доступны на сервере.Умение читать планы запросов и понимать. Понимать в каком месте запроса потенциальная проблема в потреблении ресурсов/скорости выполнения. Понимать какого плана следует достичь для оптимизации, как этого достичь с помощью изменения самого запроса/хинтов. Источники - статьи по оптимизаторам запросов конкретной бд, официальная документация бд. Если в команде более-менее толковые разработчики, то будут возникать в основном задачи такого типа.
- еще потяжелее, это уже углубление в движок бд и то как он взаимодействует с ОС. Тут требуется глубокое знание движка, возможно чтенте исходников бд, если она опенсорсная, понимание и знание некоторых принципов работы ос. Как работает кэширование и внутренние системные буферы бд, какие области памяти выделяются, какие типы памяти использутся, для чего они используются, как устроено хранение данных в файловой системе, логирование транзакций, откат транзакций, какие структуры данных для этого используются, какие процессы пораждаются бд, и какие функции выполняют, как организовано взаимодействие между этими процессами. Но на этом уровне редко попадаются задачи, обычно для их решения приглашают представителей компании, которая занмается разработкой/поддержкой бд.
Помимо этого может быть оптимизация на уровне ЕТЛ процесса или приложения, котрое взаимодествует с бд, путем уменьшения объема обрабатываемых данных/количества операций над ними при получении аналогичного результата, но это уже немного другая тема.
Для каждой задачи есть свой инструмент.
Время отклика не единственная и не основная задача для многих субд. Думаю далеко не все key-value могут похвастаться поддержкой acid, и серьезно проработанной fault-tolerance.
Плюс порог вхождения, sql проще выучить, значит проще найти специалистов - для владельца продукта это тоже важно. Плюс при значительном объеме оперативки когда вся база может быть закэширована, и скорость не является первостепенным фактором, то зачем эксперементировать на чьих-то костылях, когда есть проверенное годами решение.
Спасибо анон, я так понял что половина из начального это работа админа БД, но разрабу это тоже надо, а есть какие-то мастхэвыные статьи/книги?
Когда собеседования прохожу отвечаю:
По индексам я отвечаю что могут по одному полю или по нескольким, ускоряют выборку но замедляют инсерт/апдэйт/дэлит и работать с ними надо исходя из этого.
По джойнам(видимо имеется ввиду inner, left, right и т.д.) тоже, недавно спросили про физический и логический джойн, я впервые про это слышал. И лёгкий гуглеж толком не пояснил мне ответ че к чему.
Типы объединений если это UNION/UNION ALL, хз что про это рассказать, стакает таблицы друг к другу по полям.
Агрегации count/sum/avg тут офк он группирует по заданным полям и вычисляет заданные агрегации.
Может что-то еще дополнительно надо рассказывать?
да нет никаких "админов БД", кроме как в очень крупных и совковых конторах.
Всегда его функцию будет выполнять разработчик.
Как тебе "Админ БД" примет решение какие данные удалять и как изменять алгоритм? Без привязки к продукту это все не работает.
Концепт простой (повторить для каждой субд):
1. Изучи где здесь команда чтобы посмотреть план. Найди там числа просмотренных строк - N (K,L,M,...)
2. Сделай так чтобы NKL*M был поменьше
3. Если нихуя не получилось и в запросе есть Group by - ставишь кликхаус.
4. Если нихуя не получилось в оперативных запросах - ставишь redis или еще какой-нибудь кеш.
Это все.
Ну это смотря как распределены задачи и ответсвенность в команде, бывает что этим занимаются разработчики, бывает что админы. Например разработчики пишут - абы не было синтаксических ошибок, а админы отлавливают самые жуткие вещи и говорят что нужно переписать. Бывает что этим целиком занимаются разработчики, а админы просто рубят сессии неудовлетворяющие определенным требованиям. В общем поразному бывает.
По индексам к примеру - как влияет селективность запроса, на эффективность использования индекса. Нет смысла вычитывать пол таблицы через индекс, простой скан в большинстве случаев пройдет быстрее. Для каких значений индексной селективности какой тип индекса лучше выбирать, стандартное деление btree/bitmap. Выборку они могут ускорять не всегда. По джоинам например - что есть такие гадкие вещи, как cross-join. Основные типы выполнения джоинов внутри бд: hash-join, merge-join, nestedloop. Но это уже ближе ко второму пункту из поста. По объединениям, что union, к примеру скорее всего будет использовать сортировку, чтобы убрать дубликаты, соответсвенно union all отработает быстрее, так как просто прочитает и склеит две таблицы - но результат может отличаться от union.
По литратуре - у oracle довольно хорошо все эти темы расписаны в официальной документации, но это лонгрид и оракловая специфика, хотя +/- везде все похоже, потом только нужно будет подтянуть специфику другой базы.
https://docs.oracle.com/database/121/TGSQL/toc.htm
. У postgres тоже есть хорошие статьи по оптимизатору и стоимости операций, на там как-то разбросана немного информация по разделам.
https://www.postgresql.org/docs/10/performance-tips.html
https://www.postgresql.org/docs/10/using-explain.html
По книгам не подскажу, не встречал и не искал. Статьи на хабрах иногда неплохие пишут
Адекватно спроектированная KV база (не вчерашним MySQL-PHP-васяном) будет на максимум на 15-20% больше аналогичной SQL базы, только вот кроме процессора (самого энергоёмкого и тепловыделяющего элемента в серверах без гпу), который требует охлаждения (в отличие от HDD/SSD), эта SQL база ещё будет жрать заметно больше оперативки, и так по кругу.
>>813009
>Думаю далеко не все key-value могут похвастаться поддержкой acid
Ну, уже есть LMDB/FoundationDB/и ещё кто нибудь.
>и серьезно проработанной fault-tolerance
Смотря что именно под этим понимать, но опять же — вопрос времени.
>Плюс при значительном объеме оперативки когда вся база может быть закэширована
При таком объёме можешь расслабить булки — ты вклад в глобальное потепление не делаешь, лул.
> Адекватно спроектированная KV база
Адекватно спроектировать можно и реляционную базу, применяя по необходимости денормализацию и key-value, построенные поверх реляционной БД. В реальных приложениях никто не дрочит на 6 нормальных форм, там ищут компромисс. А пока ты прикрутишь к своей KV-базе всевозможные обёртки, ACID, констреинты, триггеры. вьюхи, выделять тепла это станет ровно столько же, разница будет лишь в том, что то, что раньше делала СУБД, теперь будет делать приложение, и в сумме ничего не изменится.
>Например разработчики пишут - абы не было синтаксических ошибок, а админы отлавливают самые жуткие вещи и говорят что нужно переписать. Бывает что этим целиком занимаются разработчики, а админы просто рубят сессии неудовлетворяющие определенным требованиям.
Какие же вы пидоры.
Золотые бессмертные строки как нельзя лучше подходят к данному моменту:
Когда значение, хранимое в кеше, становится неактуальным, то есть значение в базе более новое. И нужно обновлять кеш.
Самое популярное для лаб - модель магазина (ну или интернет-магазина). Таблиц можно придумать сколько хочешь. А за игоры некоторые преподы могут и нахуй послать.
Ого, спасибо за такой быстрый ответ. У меня просто воображение плохое, и каждое такое задание "придумайте себе задание" меня вводит в ступор. Модель магазина звучит универсально, ведь можно любой магазин сделать + разобраться в довольно таки прикладной теме.
Чаю тебе.
Обычно, когда мне не хватало в вузе фантазии, я гуглил что-то в духе "лабораторные по базам данных варианты заданий". Но не всегда работало, один из наших преподов вообще сказал нам делать что угодно, но не магазин, ибо надоело.
Бери adventure works от мс
В твоем варианте только через тригеры на удаление. На чистом SQL ты этого не сделаешь.
Но судя по описанию ты там игру клепаешь. Может тебе стоит немного переработать архитектуру. Почитай про паттерн Entity component system https://en.wikipedia.org/wiki/Entity_component_system и вот еще http://cowboyprogramming.com/2007/01/05/evolve-your-heirachy/
Спасибо, любопытная инфа.
А они точно должны в одной таблице храниться, эти твои inventory? Inventory транспорта и игрока не могут иметь разную структуру? Или их структура не может изменяться независимо?
На пике - причина креша целого постгреса. Контекст - aws_s3.table_import_from_s3.
Правильно ли я понимаю, что если внутри расширения что-то валится с exit code > 0, то вся база падает нахуй?
Предполагаемый исходник расширения:
https://github.com/chimpler/postgres-aws-s3/blob/master/aws_s3--0.0.1.sql
Но это не точно.
На мускуле я выключал ONLY_FULL_GROUP_BY (по дурости, маленький был).
А сейчас в постгресе не могу совершить запрос.
Есть поле balance, мне нужно вывести его как на 2ом скриншоте, (чтобы было 330 - 2), сам запрос выглядит как на 3м скриншоте, но ругается, что нужно в груп бай и баланс добавить, но так запрос некорректный, помогите правильно составить блин
Мне нужны категории, чтобы все что в диапазоне 3300-3399 было в категории 3300, второй столбец это количество входящих туда записей.
Ну и так со всеми категориями, получается
Делай через with. Первой итерацией считаешь сумму, можно сразу через case по группам распределить, потом делаешь group by по группам. Подзапросом тоже можно.
какой кейс еще, я не буду знать всех значений, но мне нужно чтобы каждое значение попадало в свою категорию, выше я скинул скрин рабочий на мускуле, но там был выключен ONLY_FULL_GROUP_BY в постгресе нужно группировать все значения, но так запрос выдает неправильные данные, значит он изначально был написан неверно(?), вот я и пришел за помощью.
Еще раз скажу
Входные данные
3366
3323
7621
7677
7692
То что я хочу получить запросом
330 - 2
760 - 3
Ебтить ты обьясняльщицследующий раз сразу иди нахуй с таким ТЗ
SELECT balance, count(*)
from(
SELECT test,
balance/100 as balance
FROM GOVNO) as q
group by balance
дякую, анон, извини за тз
Нихуя это так не работает, у херочек в методичках написано, что если занижаешь ожидаемую зарплату, то не умеешь оценивать себя, а значит, доверия к тебе быть не может, и мы вам перезвоним.
Давай разбираться, в большинстве вакансий (на вскидку 75%-85%) работодатель не указывает ни вилки, ни потолока. Но в компании такого не может быть, потому что выделяется ставка, экономисты сидят считают затраты на стаф. Отсюда два вывода: вакансия фейковая, либо они ищут кого дешевле(может быть смотрят на цена качество). В рашке, например, нельзя определить стоимость труда по рынку, потому что никто зарплат не пишет, а по тому, как договариваются надо проводить опросы кто честно скажет.
Понятное дело МРОТ никто не попросит. Но попросят к примеру 5 челиков 50к, 60к, 75к, 80к, 85к соответственно, так у трёх последних шансов просто мизер будет, потому что на первых двух будут витязи ипотеки со спиногрызами.
Может кто-нибудь посоветовать учебник по MySQL? Мне нужно хорошо освежить познания в нём, чтобы на собеседованиях пояснять с ноги все типичные вопросы. У меня есть парочка, но они датированы 2000 и 2003 годами.
Возьми свежий учебник Ивана Смузина «react sql на микросервисах»
Хорошая подача материала в мемчиках, примеры из жизни зумеров, в поларок купон деливериклаб.
php тоже изучать по учебнику 2003 года? Что там было, php 4, верно? Берёшь учебник, учишь от корки до корки, а потом на собеседовании у тебя про какие-то лямбды спрашивают, замыкания, магические методы, статическое связывание и всякое ооп. А ты такой гордо "В php этого всего НЕТ! Я точно знаю, так в учебнике написано."
Что такое коннект к базе данных, и сколько он живет.
В чем суть, при старте приложения но ноде, я в одном из модулей создаю объект - или коннект, или пул коннектов с лимитом около 10.
Коннект с базой - это некое постоянное соединение? Или это просто объект с настройками, который при каждом вызове стучится в базу данных, делает то что должен и закрывается?
Далее в вызывающем коде я из этого объекта ( или из пула получаю 1 из 10 ) получаю соединение, выполняю запрос, получаю ответ, в в конце вызываю языковую конструкцию которая "закрывает" что ли соединени.
А если его вручную не закрывать - что получится?
А сколько в одну единицу времени может быть соединений?
Как найти группу, если в ней есть более 10 человек с возрастом = 19, например?
Есть база данных с сотрудниками. В ней хранится таблица department - представляет отделы, в таблице employee соответственно хранятся записи о сотрудниках, один сотрудник может быть записать сразу в несколько отделов (или не записан ни в один). Суть в чем: для каждого отдела надо создать "таблицу" вроде той что на пикриле, то есть каждому из сотрудников из этого отдела надо поставит ьв соответствие Проект и некий числовой идентификатор (как хорошо он выполннял работу), как блин такое в реляционках мутить? Знаю чт ов Postgresql есть поле json, пока смотрится логичнее всего: захуярить внутрь таблицы department поле json где ключи будут идентификаторами сотрудников, которые в своб очередь буду ссылать на другой json... В реляционной модели такое можно сделать?
Count
Надо добавить в шапку, пусть хоть какая-то шапка будет.
Всего одна новая таблица в которой: employee_id, project_id, score
То есть каждая строка состоит из трех этих колонок (ну еще ключ ForeignKey с constraint чтобы было отношение 1-1 к department)
> SELECT huntaname.body
Синтакис подсвечивает это слово, но чот я нихуя не смог нагуглить на эту тему
Мань, 5 минут в гугле
1)select t.name from table t без as лол
2)select table.name from table без as лол
В селекте или алиас стоит или у тебя таблица huntaname называется, а body там - атрибут.
Ну тогда скрин скидывай. А body может быть чем угодно, вдруг у тебя "синтаксис" подсвечивает вообще все атрибуты.
Никак. В этом суть популярности облаков. Заранее ничего не известно в программной индустрии. Все слишком сложно увязано.
Только 1сники рискуют с потолка цифры выдавать. Или когда ты планируешь очередную копию давно известного тебе софта.
И в чем польза индексирования нескольких полей в таблице?
В книжках по базам данных, от субд зависит.
SQL это всего лишь язык. Базка в общем случае делает всё как ты сказал: берёт таблицу, всю перелопачивает, по WHERE всё отсеивает и отдаёт. Если джойны, то создаёт временную таблицу на джойнах и всё то же самое. То есть результат всегда должен совпадать с наивной реализацией.
А вот как это всё оптимизируется это уже более интересный вопрос. Почти везде для оптимизации нужны индексы. Индекс это по сути сортировочка всех строк в определённом порядке по определённым полям. Если условия в WHERE совпадают с тем как создан один из индексов, то бд сможет оптимизировать запрос с помощью этого индекса: она по сути не заглядывает в строки, а ищет только в индексе. Индекс никогда не нужно перебирать от начала до конца чтобы что-то в нём найти.
> польза индексирования нескольких полей
Там логически сортировка другая получается. Потому что каждое из полей ты можешь ASC или DESC, и комбинации полей будут идти друг за другом в разном порядке.
какой нахуй capacity planning?
у тебя каждый раз неизвестная система!
если любишь ебанутые англоязычные псевдоуспешные аббревиатуры вот изучи: https://en.wikipedia.org/wiki/No_free_lunch_theorem
если кому интересно нашел видос от чела из майкрософта
https://www.youtube.com/watch?v=VCQ-VMG8Bao
Странный вопрос. БД принципиально подключается к бэкенду можно и к фронтенду, но не важно. Если у тебя бэкенд на ПХП, то никак без ПХП ты этого не сделаешь, будь то вручную или косвенно через цмски и движки.
Пиздец ты мудачина.
Попробуй для начала Google Forms и Google Sheets использовать в качестве "базы данных".
Через год приходи в тред.
Ты не разбираешься в теме. Не пиши здесь больше и не вводи людей в заблуждение. Информация по capacity planning, а так же документация к СУБД дают исчерпывающую информацию по выбору оборудования и тюнинга самой СУБД под конкретные нагрузки.
хочу на sql
Прорешал задач сорок на sql-ex, буду дальше их добивать, они там реально сложнее
Задачки это хорошо, но есть ощущение что я просто дрочу на месте без прогресса. Куда смотреть дальше, чтобы получать знания приближенные к реальности? Написать приложение на комп с работой баз данных?
Может почитать что-то про правильные построения самих бд?
Скачиваешь книгу Куликова “Работа MYSQL, MS SQL SERVER и ORACLE в примерах”. Тут определяешься с базой данных. Если это SQL Server, то скачиваешь на торренте данную СУБД. Если Oracle, то скачиваешь образ для WMvare с их сайта, или используешь их online СУБД.
Далее. Находишь в зависимости от СУБД серьезные книжки.
можно подумать ты разбираешься.
тебе просто удалось угадать поведение субд для 3.5 приложений с которым тебе довелось работать.
Найди работу в интеграторе. В реальности на СУБД такие вещи пилят (особенно если это oracle или sql server), что ты охуеешь такое с нуля писать.
Что значит "работа в интеграторе"?
Что ещё надо знать для устройства на работу по базам данных? Кроме синтаксиса у самих бд
Значит работа в аутсорс конторе, котора продаст твою жопу банку, где ты увидишь код написанный поколениями с самописными etl-системами, очередями и пакетами хранимок на 10k строк.
> Кроме синтаксиса у самих бд
Лiл. Ничего. https://docs.oracle.com/database/121/ARPLS/toc.htm - но со временем будешь узнавать больше из этого списка.
>>Ничего
Типо я вот порешал задачи на сайтах, и такой красивый могу претендовать на джуна? Звучит слишком просто, или мне по началу за такую должность только на воду без хлеба хватит денег?
Я проходил собес по бд, но жидко обосрался от нервов и там пришлось бы изучать type script
Реально тебе дело говорят - иди работай. Без опыта работы на реальном проекте - чем бы ты ни занимался в свободное время - тебе по началу будут предлагать на "хлеб и воду", очень маленький шанс, что кто-то тебе даст ставку мидла, потому-что ты дома что-то делал.
Задачи решаешь - иди работай, перед собесом на конкретную вакансию подтяни просто знания по особенностям работы конкретной базы которая указана в вакансии, типы там всякие, функции работы со строками, числами датами, оптимизацию немного погугли в все. Дальше можно дома заниматься изысканиями и исследованиями если работа - фуфел оказалась, и уже на следующем собесе рассказывать, что ты такими крутыми штуками на работе занимался)
Проблема только в том, что я не безработный студент на шее у мамки, и пиздец как не хочется сидеть въебывать джуном за 15к, когда я сейчас деградирую за 30.
Хотя с другой стороны я понимаю что за просто так мне только хуй за щеку присунут.
Мне сначала 50к предложили. Через 2 месяца я ушёл на 70к, потом 90к, сейчас вот оффер на 140к.
2 года опыта работы, а sql-ex я так и не добил, но когда-нибудь сертификат там я получу.
>Реально тебе дело говорят - иди работай
Проблема таких советов - не факт что работа даст скилл и опыт.
Потому что без скилла и опыта возьмут максимум на галеру или там в госконтору. Ни там, ни там ничего правильного делать не получится.
А в конторы, где можно получить полезный (ключевое) опыт не берут без этого опыта.
Я сейчас тружусь в такой конторе. Пишу в одиночку серьезный софт обеспечивающий полный жизненный цикл организации (учет и оперирование всего что происходит), так как предыдущий морально устарел лет на 20, не соответствует никаким требованиям, дико не удобен и совершенно не пригоден для допиливания. Поэтому собрались и решили сделать по новому модно и молодежно.
Как бы у меня уже есть опыт разработки приложения от пустого окошка, до конечного разворачивания на говнокомпах (у нас до сих пор есть несколько с Windows XP из-за привязанных к ним железках). Более ста одновременных подключений пользователей. Базы данных по 40гб (ведь их-то нельзя было резать, вся история должна быть доступна)
И...
Я даже до собеседований на джуна (но с зарплатой выше чем мне платят сейчас, ясен пень речь не про конторки с 20к деревяных оплатой) нигде еще дойти не могу - мы вам перезвоним.
Я хз как быть
Ну я сужу по своему опыту - и могу сказать, что когда у меня был начальный уровень - практически любые задачи давали мне полезный опыт - если я не делал их на отъебись и побыстрее. И конечно это должны были быть реальные задачи - а не "заполни формочку нарисуй квадратик".Просто сидел и разбирался, почему не работает, как сделать лучше, как правильно, как другие люди делают и почему так, а не иначе.
И ты найдешь такие задачи с большой долей вероятности, как во всяких яндексах, так и в энтерпрайзах. В энтерпрайзах если повезет иногда можно заниматься параллельно своими делами и исследованиями. А в яндексах если не повезет - сидеть и несколько лет херячить запросы к api.
Просто в яндексах создаются более комфортные условия, и обучению и развитию сотрудника уделяется больше внимания до определенного этапа.
И если ты занимаешься кодингом, я не переходил бы на твоем месте чисто в sql. Если интересны базы и работа с данными - посмотри в сторону highload.
Судя по описанию того что ты делаешь - ты работаешь на каком-то производстве/предприятии не в милионнике, я угадал? Если да - попробуй поискать удаленку в ДС-ах, может получится проще и быстрее
Я выбрал такую схему: таблица с тестами, таблица с вопросами и таблица с вариантами ответов. У каждого варианта ответа есть id вопроса в котором он используется и у каждого вопроса есть id теста в котором он используется.
Вроде выглядит адекватно, но я не представляю как мне теперь по id теста вытащить за один запрос все вопросы к этому тесту и все варианты ответов к этим вопросам. Я так понимаю нужно юзать join или как?
БД - PostgreSQL, если это важно
https://ru.wordpress.org/plugins/quiz-maker/
Пхп - это язык, где программирование доведено до примитивизма. Если возникла какая-то проблема, нужно первым делам искать нужно даже не ответ на StackOverflow, а плагин для WordPress.
Но да ладно. К примеру, есть tests (id, title) и questions (id, text, test_id). Можно написать select * from tests, questions where tests.id = questions.test_id and test.id = (id теста), здесь выполнится неявный join, и у тебя будет результат:
tests.id | title | questions.id | text | test_id
1 | тест1 | 1 | вопрос1 | 1
1 | тест1 | 2 | вопрос2 | 1
1 | тест1 | 3 | вопрос3 | 1
Как видишь, вопросы разные, но название теста и его id одинаковые, то есть некоторые данные дублируются. Далее добавить к запросу answers, и всё.
id: string
children: string[]
И еще какие-то поля.
В children хранится список id. Может быть несколько уровней вложенности. Как за один запрос вытащить все дерево сущностей начиная с какого-то id? В монге для такого можно сделать DBRef на ту же коллекцию.
Важная деталь - данные хранятся в эластике, но треда по nosql тут вроде нет.
Хочу вот чем поинтересоваться, правильной ли дорогой собственно говоря иду? Может кто из вас подкинет здравых мыслей.
Вводная: Пашу инженером конструктором на околосовковом предприятии. Неплохо знаю САПР со стороны технологов конструкторов. Знаю о существовании служб, занимающихся сопровождением САПР и КТТП.
Есть желание: перейти из сферы машиностроения через сопровождение САПР в айти. Так как на текущем месте и должности развиваться в айти не вижу возможности.
Задача общая исходя из советов грамотных товарищей и самоопределения: грести в Девопс.
Для этого решил начать с изучения sql поэтому сюда и пишу собственно
Предложили: изучать sql с помощью книги sql для чайников (т.к. в sql не разбираюсь. Только в универе что-то делал) плюс читать документацию по PostgreSQL. Также предложили пройти пару курсов в интернете.
Вопрос: правильная ли стратегия? Может что-то упускаю? Нужно ли что-то координально менять и глядеть как-то по другому на это вот все дело?
Также хочу попросить полезные источники информации для начинающего в области sql.
Пригодится любая информация.
Антоша никогда не изучай ничего по книгам ДЛЯ ЧАЙНИКОВ
Надо знать, что за БД, в зависимости от диалекта там может быть что угодно. Тогда, может, кто-нибудь знающий подскажет.
Devops помоему слабо связан с sql. Если базы данных на проекте нет, то никак. Если хочешь в devops - то тебе надо грести скорее в unix-админы, получать там базовые знания по администрированию, а потом на это накладывать знания о всяких приблудах типа docker-ов, ansibl-ов, jenkins-ов и git
> Его, к сожалению, нет.
Ну и забей тогда.
> Допустим, в каких случаях тот запрос сможет что-то выдать?
Если СУБД поддерживает такой синтаксис. Ничего конкретнее сказать нельзя.
Это похоже на внешнюю таблицу. По указанному пути должен лежать скорее всего файл в определенном формате, например csv. Вроде в sqlserver такой синтаксис возможен, но путь тут юниксовый указан
Цэ тестовое, я б забил.
Нет блять, 0.
Тут столкнулся с необходимостью вытащить из БД большой объем данных.
К примеру, у меня есть такой запрос:
SELECT ID, Name, Birthday
FROM Ants
WHERE ID LIKE '4464558'
OR ID LIKE '5645647'
OR ID LIKE '5431546'
OR ID LIKE '2678654'
OR ID LIKE '8864587'
Проблема в том, что в данной конкретной задаче этих ID не пять штук, а 30000, они уникальны, не повторяются, не соответствуют никаким диапазонам.
Я написал этот запрос с 30 тысячами OR и понимаю, что такой запрос - это ебланство. Но не понимаю, каким образом должен выглядеть нормальный запрос при необходимости вытащить данные именно при таких условиях. Толкните в нужную сторону.
А еще SQL Server Management Studio просто зависает после открытия такого большого запроса.
Так не будет работать, есть ограничение на количество условий в where. Тебе нужна оберка которая будет скармливать запрос частями
Если эти ID можно выбрать селектом из базы, тогда это просто (join, или cte, или `ID in (select id from ...)`, ит.п.)
Если же они вне базы, тогда только по частям.
Можно через IN, но тоже хуйня.
Взрослый вариант это сделать временную таблицу с твоими айдишниками, а потом заджойнить с нужной.
Кури, что такое temporary table короче.
>делаю по работе только select по определенному запросу, в котором меняю where в зависимости от служебной необходимости
Совсем дегенерат? Кем работаешь?
FROM employees
WHERE position = 'Software Developer'
GROUP BY department
HAVING COUNT(position) < 5
Посоны, нормально высрал? Проверить негде бля.
вроде ок
А какие знания были,когда 50к получал?
Что касается актуальности, то функционал веб-приложения реализуется через браузер, полностью поддерживает расширения CSS и полный набор HTML-тегов, а также отсутствует привязка к стандартной библиотеке. Обеспечена концепция детализации и перекрестная фильтрация. Встроен аппарат статистики и анализа данных, возможность построения 3D моделей. Обеспечена высокоуровневая защита данных через соответствие паттерну.
>-Игнорируем конкаренси-шизика, не понимающего, зачем базы данных нужны
Это что за индивид?
Мне видеокурс Заура Трегулова очень помог "SQL с нуля до сертификата Oracle" - на скорости х1.5 - х2 самое то!
Например в скрипте
update test_table
set
description = code,
code = replace(lower(code), ' ', '-');
могу ли я быть уверен, что всегда сначала обновится description, а потом после этого code?
Слева-направо выполняется, про гарантии хуй знает, надо курить доки конкретного сорта дб.
https://dev.mysql.com/doc/relnotes/mysql/8.0/en/news-8-0-22.html
>MySQL now implements derived condition pushdown for eligible queries.
блядь! не прошло и 20 лет! ну теперь то весь говновеб залетает!
>The InnoDB memcached plugin is deprecated and support for it will be removed in a future MySQL version.
Вот это я вообще не понял. Кому он мешал?
Хотя и не использовал, но тенденция все портить меня давно не радует.
>From MySQL 8.0.22, the statements START SLAVE, STOP SLAVE, SHOW SLAVE STATUS, SHOW SLAVE HOSTS and RESET SLAVE are deprecated.
Ну а это вообще пиздец.
Ладно хоть для совместимости старые операторы и статусы работают.
select maker from (select PC.model, PC.speed, Product.model, product.maker
from PC LEFT JOIN product on Product.model = PC.model where pc.speed >= 450)
В скобках же должна создаться новая таблица.
Задача с sql-ex.ru: Найдите производителей ПК с процессором не менее 450 Мгц. Вывести: Maker
После скобок надо имя какое-нибудь этой таблице дать.
Я любую букву пишу.
Вобще, переусложнённый запрос, хватило бы:
SELECT Product.maker
FROM PC
LEFT JOIN Product ON Product.model=PC.model
WHERE PC.speed >= 450;
да кому они нужны? индусов дохуя
Для каждого из летавших пассажиров определить количество дней в апреле 2003 года, попавших в интервал между датами первого и последнего вылета пассажира включительно.
Вывести имя пассажира и количество дней.
Сделал вот такой запрос:
SELECT name,
CASE
WHEN DATEDIFF(DAY, mdate1, '2003-04-30') > 0 THEN DATEDIFF(DAY, mdate, mdate1)+1
ELSE CASE
WHEN DATEDIFF(DAY, mdate, '2003-04-30')+1 > 0 THEN DATEDIFF(DAY, mdate, '2003-04-30')+1
ELSE 0
END
END
FROM
(SELECT sl1.id_psg,
mdate,
mdate1
FROM (
(SELECT id_psg,
min(date) AS mdate
FROM pass_in_trip
WHERE id_psg in
(SELECT id_psg
FROM passenger)
GROUP BY id_psg) sl1
INNER JOIN
(SELECT id_psg,
max(date) AS mdate1
FROM pass_in_trip
WHERE id_psg in
(SELECT id_psg
FROM passenger)
GROUP BY id_psg) sl2 ON sl1.id_psg = sl2.id_psg)) sl3
INNER JOIN passenger ON sl3.id_psg = passenger.id_psg;
На тренировочной базе сошлось, а на тестовой (4) несовпадения.
ЧЯДНТ.
Для каждого из летавших пассажиров определить количество дней в апреле 2003 года, попавших в интервал между датами первого и последнего вылета пассажира включительно.
Вывести имя пассажира и количество дней.
Сделал вот такой запрос:
SELECT name,
CASE
WHEN DATEDIFF(DAY, mdate1, '2003-04-30') > 0 THEN DATEDIFF(DAY, mdate, mdate1)+1
ELSE CASE
WHEN DATEDIFF(DAY, mdate, '2003-04-30')+1 > 0 THEN DATEDIFF(DAY, mdate, '2003-04-30')+1
ELSE 0
END
END
FROM
(SELECT sl1.id_psg,
mdate,
mdate1
FROM (
(SELECT id_psg,
min(date) AS mdate
FROM pass_in_trip
WHERE id_psg in
(SELECT id_psg
FROM passenger)
GROUP BY id_psg) sl1
INNER JOIN
(SELECT id_psg,
max(date) AS mdate1
FROM pass_in_trip
WHERE id_psg in
(SELECT id_psg
FROM passenger)
GROUP BY id_psg) sl2 ON sl1.id_psg = sl2.id_psg)) sl3
INNER JOIN passenger ON sl3.id_psg = passenger.id_psg;
На тренировочной базе сошлось, а на тестовой (4) несовпадения.
ЧЯДНТ.
Пиздуй гуглить валенок, такую хуйню даже спрашивать стыдно
Я так понимаю таблица у нас имеет вид
Дата_полёта|ФИО
Вот моё виденье:
1) Делаем выборку только за апрель
2) Групируем по фамилиям.
3) Выбираем максимальную и минимальную дату полёта и считаем количество дней между ними.
А ёбана, код отклеился
SELECT
name,
datediff(dd,max(date),min(date)) as КоличествоДней
from fly
where date>='20030501'
and date<='20030530'
group by name
Вот скажем есть таблица где 2 колонки: имя (varchar) и возраст (integer). В таблице уже есть некоторые записи, как мне вставить туда новые записи так чтобы в случае совпадения имен уже существующая строчка перезаписывалась?
Только именно адекватных, не нужно блять олимпиадной ебалы. В принципе обычно спрашивают что-нибудь на джойн + группировка. Такое уже на уровне подкорки просто из практики. Но боюсь если хоть чуть посложнее спросят, то поплыву. Вот хочу просто хоть немного потренироваться.
MERGE
Возможно платиновый вопрос но как в постгресе удалить БД вместе со всеми связанными джобами? Весь гугл перерыл а даже намека не нашел. Для MSSQL все просто а тут какой-то затык.
>Какой опцией в SQL обозначается выборка по различным значениям?
Подскажите что имеется ввиду вообще?
Я знаю только отношения 1:1 1:M и M:M. А тут значков явно больше.
Ты nullable не учел
А, я понял. Спасибо.
select items.id, items.price, count(purchases.item_id), sum(items.price), /Тут должны быть проценты/ from purchases
inner join items on items.id = purchases.item_id
where date BETWEEN '20190101' and '20200101'
group by items.id
order by sum(-items.price)
limit 10;
В чем принцип работы CRM-систем? (везде где ни читаю какая-то инфоцыганская херня для манагеров и продаванов) Чем отличается от облачной БД? И каков вообще принцип функционирования этой херни?
Ну прост. Собираешь данные о клиентах и все. Не забываешь им перезванивать. Смотришь отчеты.
Это тебе может кажется пургой, а люди простейшего накопления информации не делают.
По сутт принципа нет. Есть некое название типа ПО по предметной области.
получил повышение на работе, теперь работаю с и стал единственным ответственным за бд
много всего навалилось, пока работаю с готовыми отчетами/запросами от предыдущего человека, первое время он помогал если возникали вопросы и трудности
мои знания в скл закончились года два назад на курсе по бд когда получал вышку, естественно тогда забивал хуй и делал минимум чтобы получить зачет/экз/сдать курсач
сейчас нужны знания на случай чп (вдруг че сломается или понадобится написать новый запрос/отчет)
да и мой предшественник посоветовал изучить это дело сам он практиковался на sql-ex.ru и съябывать на место получше как сделал он сам, благо ресурсы соответствуют чтобы расти
то есть ты ещё два года назад был студентом, а теперь работаешь и уже успел получить повышение, да ещё без особых знаний?
чо-та начинаю верить дефицитошизикам из соседнего треда
да не, почему
всякое бывает. видел в провинции мелкую конторку, начальство которой пилило бабло на заказиках от гос-ва. у них был похожий принцип набора кадров
хз че за дефицитошизики, не был в соседнем треде
устроился еще студентом на линию тп, получил образование - перевели в отдел внедрения, там как раз попал в подчинение челику на чье место я попал, сейчас он ушел, а я на его место
история смешная на самом деле, в работе все нравилось, кроме отношений с ним, он все время меня дрочил, загружал работой бывало я заметно перерабатывал относительно других. я его просто ненавидел и хотел уволиться, все время казалось что это личная неприязнь, продолжалось около года. в итоге когда он увольнялся - посоветовал меня на свое место, меня даже без лишних вопросов повысили (был 5 минутный диалог с начальником, вопросы в стиле "Вот Имя тебя советовал, говорил ты хорошо работаешь и справляешься, ну как справишься?")
щас благодарен тому челику, ну и хочу послушаться его совета и вкатиться и дальше развиваться в этой области
к тому же рабочее место есть, так скажем условный трамплин, для начала нужно обучиться чтобы хотяб соответствовать своей должности, а дальше развиваться и съябывать
ну и вопрос повторю: sql-ex.ru + sql-tutorial.ru ? или что-то еще посоветуете?
ты попал в точку
Братан, это задача про цветные принтеры?
Посмотрел свое решение, и походу ты слишком усложняешь.
Плюс там же к каждой задаче есть рекомендованые темы
Блядь, результат получил верный, но теперь на проверочной базе тест не прошел. Ты сколько примерно эту задачку решал? Я сижу второй день, и у меня чувство, что я тупой, как валенок.
Конкретно ее решил скорее всего быстро. Но над другими езадачами аналогично сидел пару дней и пытлася решить.
Я не знаю, я решал без группировки)
Сорян, что фотография, не с домашнего пека сижу. Ну я понял, что там груп бай можно заменить дистинктом. Коварная штука этот проверочный набор данных, приходится визуализировать возможную проблему.
>дб господ
Удачи трудоустраиваться в "Рога и Копыта" за 40к - дрочить sql query день и ночь под очередное гавно, выкаченное еще 8 лет назад
Блядь, откуда вы такие берётесь. У меня один друг работает в повер биай, говорит что там скл джуны от 60к начинают, при этом приходят ебла, которые с нулевыми знаниями просят 200к, хотя он сам 200к получает, правда он в питоне разбирается ещё. Знакомая тян пришла на 40к в банк системным аналитиком вообще с нулевыми знаниями, не по знакомству. Через год повысили до 70к при том, что она хуи пинала.
Двач какая-то депрессивная зона всего самого хуевого.
Просто ошибка выжившего, джуны которые на 100к вкатились(как я например) просто не будут об этом писать.
Ну чёт я скорее поверю, что ошибка выжившего это 40к после года опыта работы. Я конструктором 67 на руки получаю после двух лет опыта.
Есть таблица с продажами, [1..x] магазинов, [1..y] наименований товаров, есть таблица с планами на следующий год.
Задача сводится к сведению таблицы в одну с показателями:
дата, магаз, товар, продажа, план/null, продажа прошлого года/null и несколько расчётов по последним трём колонкам.
Проблема заключается в очень долгом выполнении запроса; задача предполагает использовать UNION / UNION ALL для решения, но я даже примерно не могу представить, нахуя он тут нужен.
Первым пробовал вариант с join'ами каждого нужного поля -> время выполнения стремится к бесконечности.
Вторым пробовал WITH (собрать таблицу) и вытаскивать данные из неё. В таблице данные уже прошли через все процедурные фильтры (дата, магазин).
conn.execute( sqlalchemy.sql.text(<SQL>).bindparams(<параметры>) )
Можно подробнее про подзапрос?
У меня код такого плана
SELECT ...
FROM ...
LEFT JOIN ...
ARRAY_REMOVE(ARRAY_AGG(DISTINCT LOWER(lists.name))) AS goods
WHERE ...
ORDER BY ...
Сортировка важнее, но главное, чтобы не пришлось передрючивать уже имеющийся запрос с ног на голову.
SELECT *
FROM (<твой запрос>) AS Z
WHERE ...
ORDER BY ...;
`AS Z` - это обязательно, хотя буква - на выбор
Вот это я и имел ввиду под "передрючиванием", не подходит. array_agg(...) в сортировку тоже никак не впихнуть?
Верно ли я понял, что CTE - это такой ловкий способ писать вложенные запросы? Напромер:
WITH Z AS (<мой запрос>)
SELECT *
FROM Z
WHERE ...
ORDER BY ...;
>>1850231 →
да
Подключаюсь к удаленной постгресовской бд на сервере, лог/пасс есть, подключение проходит, отображается вся база, таблицы, колонки, список ролей, диспетчер сессий. Но данные не отображаются вообще, т.к. ни один запрос (SELECT в т.ч.) не проходит, ошибка SQL Error [42501]: ERROR: permission denied. Как фиксить? Права на запросы есть
Было: Animal.Name
Должно стать: Animal.[Name]
Есть ли готовый скрипт/функция ms sql менеджера/регулярка которая сделает это? Вообще, что угодно подойдёт, пусть хоть сайт в интернете.
Всё верно, права потом пофиксил админ базы и всё заработало
Есть ли простой и легкий способ разобрать эти данные по столбцам в другую таблицу ТОЛЬКО средствами SQL?
Если ты уверен, что в значениях нет символов кавычек, можешь попробовать превратить эту строку в JSON массив через замену и конкатинацию, и далее использовать табличную функцию json_each для её разбиения.
Ап вопросу.
ниасилил, сделал питоном.
SQL Error [2200M]: ERROR: could not parse XML document
Подробности: line 1: Extra content at the end of the document
<node>1</node><node>2</node><node>3</node>
^
select *
from xmltable('$n' passing (('<node>'+replace('1;2;3',';','</node><node>')+'</node>')::xml)
columns "Value" int path 'node') vals
https://www.sql-ex.ru/learn_exercises.php?LN=14
Вот решение, думай сам где проебался
"Ответ верный, а решение неверное" грубо говоря означает что твой текущий код подогнан к текущей базе данных
Тоже бы про перекат послушал. Бамп.
Знаю админа бд одного мощного - он в сингапур перекатился, потом выкатился назад. Грустно и скучно стало на чужбине.
Мне в гермашке как-то вакансию с релокейтом предагали, но по деньгам не интересно было.
По базам редко такие вакансии проскакивают. И это не етль - а администрирование + оптимизация/разработка, проектирование интеграций с бд и потоков данных обычно
Админы вообще ещё живы, лол? Я думал они все передохли с приходом облаков. А в оптимизацию я тоже умею, в разработку - тем более.
Тут есть чистые базовики? Мб ДБАшники? Как должность называется? Какие задачи выполняете? Сколько уже работаете? Сколько получаете?
Я понимаю что спецом, но мне как понять в какую сторону копать? Получается мне надо придумывать какие-то дополнительные данные, которые своим запросом я не отсекаю. А могли бы намекнуть.
слыш, для не-дс нормально
этож не рякт или гейос
вакансий мало, да ещё злобный энтерпрайз небось
мимо-чел
А нахера вы опущи позволяете платить вам меньше кабанчику в мухосрани, когда он наоборот экономит на аренде офиса неебацца сколько, снимая его в мухосрани а не в дс, а работу вашу один хуй продаёт заграничным заказчикам, что кобаньствуя в москве, что кобаньствуя в мухосрани вашей?
Надо для каждого id оставить три последних записи, остальные удалить.
Row number по юзеру, с сортировкой по дате(только с desc не проебись)
Живее всех живых.
Какая разница, облако - не облако? Ну будет админ сидеть на строне облака а не на стороне клиента. Экспертиза все равно нужна.
Тех кто чисто внутри БД что-то делает - таких наверно нет. Обычно это работа/настройки и на стороне ОС и на стороне БД. Сильные админы обычно еще и в unix-ах хорошо шарят.
В ДС норм админ на энтерпрайзе может 200к и больше получать. Скорее даже не меньше 200.
Я 6 лет отработал чисто на базах, начинал с etl - потом ушел в более системную область. Когда ты работаешь etl-щиком то все твои задачи в основном сосредоточены внутри бд и ограничены самой бд - через 2 года мне стало скучно. Сейчас у меня много технических задач на уровне взаимодействия бд и ОС и другим ПО. Много времени может занимать разбор багов внутри бд, поиск обходных путей. Сложно выделить какой-то конкретный тип задач. Есть кластер с одной или несколькими бд к которому есть определенные требования и ты должен сделать так, что-бы он функционировал и удовлетворял этим требованиям и следить за этим - отсюда проистекают всевозможные задачи)
В должности никак не отражено, что я работаю именно с бд.
Года два-три назад зп перевалила за 200
Нарисовал такую табличку вроде все правильно, но моя ссылка - primartkey одинаковая а одинкавых ключей небывает
Не отправляется с телефона в общем таблица такая
Ссылка Данные. Событие
1F. 20000. Размер
1F. 2. Уровень
>потом ушел в более системную область
Круть, а предыдущий опыт тебе как-то помогает в новых задачах или, может, помог при трудоустройстве?
Пизда рулю. Накосячил немного с SEQUENCE в Postgresql, захотел ее удалить чтоб заменить другой но во время DROP SEQUENCE ожидаемо выскочило:
cannot drop sequence operators_id_seq because other objects depend on it
Потому что эта последовательность уже приписана к колонке id в той таблице operators... Мне надо удалить ее и заменить другой, как это сделать, не стирая саму таблицу?
postgre рулю
Как сделать правильно связь многие ко многим между Route и Worker. По одной стороне через Team сделал, но вот через Company не пойму как лучше организовать. Потому что вроде выглядит все логично
И не могу еще к третьей нормальной форме это все привести, типа атрибут airplane_type в сущности Route или в сущности class атрибут number_of_seats и т.п.
Чисто пишу запросики для отчетиков, зп 100к нск
В кликзхаусе вроде не чистый скуль, а сильно урезанный, все сложное типа джоинов и оконных функций ненужно.
Есть две таблицы(500мб и 30мб размерами), из 30мб таблицы сделана view_1.
Затем, через union all, соединяю две таблицы и view_1 в одну жирную view. Запросы к этой жирной view занимают довольно приличное время - десятки секунд. Собственно, отсюда и вопрос - в какую сторону смотреть и что делать для оптимизаци.
Направление я менял в рамках одного места работы, поэтому для трудоустройства наверно нет. О том помагает ли предыдущий опыт в текущих задачах - частично да, частично нет. Знание каких-то конкретных etl инструментов мне сейчас не требуется, но базовые какие-то принципы - да нужны
Вот такая хуйня получилась.
Сделал "SELECT *" т.к. подобный запрос в БД шлет tableau и выкачивает данные себе. Последний раз этот запрос занял 2 часа и потом просто отсоединилось, не закончив.
Ебать, добавил составные индексы и все летает. Охуенна.
>Сделал "SELECT *" т.к. подобный запрос в БД шлет tableau и выкачивает данные себе.
И не похуй ли, если они к себе Extract делают?
так зачем ему делать, если они обычно просто данные линейно выкачивают?
Просто интересно. Они не хотят выкачивать?
Данные он выкачивает из таблицы, вместо таблицы у меня view. Соответственно когда он начинает "выкачивать данные" он обращается к этой вьюхе и там начинаются вычесления для того что бы вернуть в табло данные в виде готовой таблицы. И вот уже эти вычисления при построении вьюхи производились слишком долго.
row_number() и потом фильтр по нему, точнее говоря. Нет, я не могу от него пока избавиться, я не могу выразить условие иначе.
По идее нет. Во всяком случае это на прядок быстрее подзапросов и групбааев используемых для решения таких же кейсов.
Пробуй через with с фильтрами, плюс можешь поддержать индексами. Декомпозируй и смотри за сколько выполняются куски, ищи самую медленную часть, смотри план запроса по ней.
Можно сделать генератор скрипта, по виду:
SELECT "UPDATE @TABLENAME SET" ZALUPA "WHERE" TABLENAME.ROW1
FROM @TABLENAME
Таким образом он тебе нарежет запросов, а ты просто запустишь батчем
Посоветуйте годных базовых книг/курсов по базам данных.
Пасиб анон, заценим
Все, я разобрался
Чел ну ты хуйню спрашиваешь, предлагаешь лечить по фотографии. Пиздуй смотри логи\нагрузку на систмеу\на бд\план запросов.
Логи чего именно смотреть?
Это подзапрос. Не всё возможно сделать через having, и не всё удобно через него делать.
> Идешь на сайт orelly, регаешся тебе дают триал на недели с доступом ко всем книгам. Через неделю регаешь новую почту. Там даже подтверждение не нужно, просто на несуществующую можно регать
Спасибо. Я смотрю там все на ингрише, там локализованные на русском версии книг есть вообще? Просто толку мне пердолиться с триалами если там только версия на английском, которая у меня и так есть
Как ты будешь фильтровать оконные или аналитические ф-ци не в терадате?
А им разве кредитка не нужна там?
Я просто хотел еще и на Packpub подписаться. Есть хорошие книженции там по не очень популярным технологиям
>Решаем всем тредом лабы для заплутавших студентов и задачки с sql-ex для тех, у кого завтра ПЕРВОЕ собеседование
Ребята, это чисто я, ток собеседование на стажера дата-аналитика в понедельник...
sql будет не мейн темой, но сказали, шо надо уметь делать простые запросы и знать базовую теорию насколько базовую, не сказали
Подскажите, что лучше: порешать литкодовские изи или sql-ex задачки? (времени на то и другое нет)
И ещё бы где-то найти инфу в супер сжатом виде по внутреннему устройству бд, индексам, транкзакциям, уровням изоляций итд
Сейчас читаю книгу lerning sql. Там встретился такой пример
SELECT groups.name, COUNT(*) num_customers
FROM
(SELECT SUM(a.avail_balance) cust_balance
FROM account a INNER JOIN product p
ON a.product_cd = p.product_cd
WHERE p.product_type_cd = 'ACCOUNT'
GROUP BY a.cust_id) cust_rollup
INNER JOIN
(SELECT 'Small Fry' name, 0 low_limit, 4999.99 high_limit
UNION ALL
SELECT 'Average Joes' name, 5000 low_limit,
9999.99 high_limit
UNION ALL
SELECT 'Heavy Hitters' name, 10000 low_limit,
9999999.99 high_limit) groups
ON cust_rollup.cust_balance
BETWEEN groups.low_limit AND groups.high_limit
GROUP BY groups.name;
отдельно подзапросы выполняются все ок. С синтаксисом тоже ок. Даже если в глаза не ебаться и прочитать запрос то все в порядке.
Но мускуль ругается на
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'groups
on cust_rollup.cust_balance between groups.low_limit and groups.hig' at line 14
Я чет понять не могу где там ошибка
Сейчас читаю книгу lerning sql. Там встретился такой пример
SELECT groups.name, COUNT(*) num_customers
FROM
(SELECT SUM(a.avail_balance) cust_balance
FROM account a INNER JOIN product p
ON a.product_cd = p.product_cd
WHERE p.product_type_cd = 'ACCOUNT'
GROUP BY a.cust_id) cust_rollup
INNER JOIN
(SELECT 'Small Fry' name, 0 low_limit, 4999.99 high_limit
UNION ALL
SELECT 'Average Joes' name, 5000 low_limit,
9999.99 high_limit
UNION ALL
SELECT 'Heavy Hitters' name, 10000 low_limit,
9999999.99 high_limit) groups
ON cust_rollup.cust_balance
BETWEEN groups.low_limit AND groups.high_limit
GROUP BY groups.name;
отдельно подзапросы выполняются все ок. С синтаксисом тоже ок. Даже если в глаза не ебаться и прочитать запрос то все в порядке.
Но мускуль ругается на
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'groups
on cust_rollup.cust_balance between groups.low_limit and groups.hig' at line 14
Я чет понять не могу где там ошибка
> Есть запрос
> SELECT * FROM employee WHERE sex = 'm' AND salary > 300 AND age = 20
> Нужно сделать индекс КОНКРЕТНО БУКВАЛЬНО ПОД ЭТОТ запрос, чтобы именно такой запрос был супер-быстрым
Короче, как я понял, здесь фишка в том что нужен определенный составной индекс.
Я ответил что типа сделаем index(salary, sex) и отдельно index(age). Я не знаю почему я решил age выносить отдельно. И я до сих пор не догоняю, как правильно. У нас же типа btree, в составном индексе будет сортировка по вложенным полям... блять, тут есть вообще разница в порядке полей? И вообще смысл в составном индексе?
Да, еще следом был вопрос "а если хотим сортировать по created_at".
Я вот сейчас подумал, что мы можем сделать partial-индекс index(id) WHERE по этому условию. А для сортировки добавить отдельный index(created_at). Не?
Благодарю.
Я не могу понять, так left outer join и left join это одно и то же или разное? Почти везде пишут, что это одно и то же, но тогда к чему испльзовать именно конструкцию со словом outer?
Потому что в SQL есть больше одного способа сделать что угодно. Те же AS и IS.
Первый вариант полная форма, но если мы используем left, сразу становится понятно что это outer, т.к. направленных inner-ов не бывает. Можно сравнить с AS, писать не обязательно и с пробелом работает. Использование outer удобно на этапе обучения.
Вероятно, не актуально, но решения некоторых задач на sql-ex можно найти в гугле :3
Триггер выполнится единожды для всего запроса, весь набор будет лежать в inserted
Это копия, сохраненная 22 апреля 2021 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.