Можно попросить еще 2 минорных изменения: NetCracker->Netcracker. И подпись к первому фото на
Для того что-бы выполнить, TRUNCATE нужно иметь права DROP ANY TABLE. Потому всегда думал, что в этом случае старая таблица отправляется в корзину, а на его месте создается такая же.
Перечитал документацию. Действительно, там другой механизм удаления. В результате ни Rollback ни Flashback не работает. «You cannot roll back a TRUNCATE TABLE statement, nor can you use a FLASHBACK TABLE statement to retrieve the contents of a table that has been truncated.»
Хорошее решение. Спасибо. Многое почерпнул для себя. Сказывается, то на MySQL я написал всего десятка два запросов.
1) Если прицельно смотреть на решение, сразу бросается в глаза, что оно работает до тех пор пока GROUP BY ym, кроме группировки выполняет еще и сортировку. Это характерно только для MySQL и может поменяться в любой момент.
2) Как только мы захотим, чтобы в списке дат не было пропусков решение нужно менять полностью.
3) В моем, действительно боле неуклюжем, запросе:
а) сомневаюсь, что будет индекс включающий только дату и сумму. Хотя-бы потому что MySQL сразу засунет туда и первичный ключ, и мы получим ту же самую таблицу повторенную еще раз.
в) DATE_FORMAT, вероятно, и так убьет попытки оптимизатора применить индекс, если индекс не по вычислимой колонке с DATE_FORMAT.
г) вероятно, на одну дату приходится много записей, потому сомнительно, чтобы index sacn + row fetch давал бы выигрыш. Но, тут действительно нужно смотреть на план запроса.
д) соглашусь, рост сета, но запрос легко исправить:
select start.day, sum(records.amount)
from (select DATE_FORMAT(created_at, ’%Y-%m-%d’) day from data_table group by 1) start,
(select DATE_FORMAT(created_at, ’%Y-%m-%d’) day, sum(amount) amount from data_table group by 1) records
where start.day >= records.day
group by start.day;
В этом случае nested loop будет гоняться по двум небольшим таблицам в памяти. Первый запрос легко заменить на другой эмиттер дат, например stackoverflow.com/...eries-equivalent-in-mysql
5) Давай согласимся, что как раз для этого и были придуманы оконные функции. И, слава Богу, они появились и в MySQL
Сбила с толку фраза
текущем месяце
. В сумму шли только данные из того-же месяца, что и дата.
Убираем «and DATE_FORMAT(dates.created_at, ’%Y-%m-01′) = DATE_FORMAT(data_table.created_at , ’%Y-%m-01’)» из
Это Вы о оконных функциях или рекурсивных запросах? Можно и так и так. И то и то есть в mysql.
docs.microsoft.com/...-and-unknown-transact-sql
в других БД ( постгре, оракл) тоже самое
Плюс еще и в том, что TRUNCATE можно откатить, а значит эта команда поддерживает транзакции.
TRUNCATE, как и остальной DDL транзакционен только в Постгре. Исправьте, меня если я не прав.
Тот же Оракл, городят костыли с корзиной для удаленных таблиц.
В Postgres обычно хранят в text, все равно в TOAST уедет. varchar нужен, только чтобы ограничить длину строки.
1. Что вернет условие 2 <> NULL
?
такое условие возвращает UNDEFINED. Выглядит оно как False, только потому-что условия where и having пропускают дальше только истинные значения.
3. Выполнится ли этот запрос?
Как ни странно, тут поведение MySQL вполне правильное, из-за опциональной фичи из срандрата SQL T301, Functional dependencies. Слава Богу, другие производители не спешат ее внедрять. Хотя в том же MS SQL можно ее включить.
4. Почему не выполнится этот запрос?
Запрос выполнится в MySQL. Потому-что у него парсер лох. Этот же парсер проигнорирует inline объявление foreign key и разрешит on в cross join.
Другие БД — молодцы.
5. Имеет ли значение порядок колонок в составном индексе?
Объяснение — ересь. Всех по этому поводу нужно отправлять на use-the-index-luke.com
Если говорить о каверзных вопросах и MySQL, то нужно спрашивать про его дурную реализацию, когда в индекс включается не адрес строки, а целиком первичный ключ.
6. Какая разница между TRUNCATE TABLE table_name и DELETE FROM table_name?
Как следствие первого пункта, команда TRUNCATE не вызывает срабатывание триггеров и правил внешних ключей, то есть, очищая таблицу таким способом, можно не бояться каскадного удаления или изменения данных в других таблицах.
— то есть данные в БД станут не консистентными?
Тот же Постгре и Оракл не даст сделать TRUNCATE если есть данные связанные по внешним ключам
В отличие от DELETE команда TRUNCATE не транзакционная. То есть, если в момент ее вызова, таблица table_name будет заблокирована какой-либо транзакцией — может возникнуть ошибка.
А тут кандидата нужно попросить привести примеры DDL и DML команд. TRUNCATE, действительно DDL команда. А транзакции это про DML, куда, внезапно, относится и SELECT. Если вдаваться в деали — в Постгре DDL тоже транзакционен и TRUNCATE можно откатить.
7. Какая разница между типами CHAR и VARCHAR?
Для типа CHAR используется статическое распределение памяти, из-за чего операции с ним быстрее, чем с VARCHAR.
из за страничной организации таблиц это далеко не всегда так и сильно зависит от длины данных. В большинстве случаев хранить данные комплектнее более выгодно, чем выравнивать их. Потому что стоимость чтения с диска больше стоимости разбора блока данных процессором.
Боле того, в том же Постгре все, что длиннее N символов автоматом хранится в TOAST таблице, а все, что длиннее 2000 автоматом архивируется.
8. Какая разница между типами VARCHAR и NVARCHAR?
Давай еще спросим:
1) Почему («AAA» = «aaa») может быть true
2) Почему (some_long_string = some_other_long_string ) может быть true, даже если строки разные
3) Почему column_name = ’STRING’ и column_name like ’STRING’ могут давать разные результаты
9. Какая разница между UNION и UNION ALL?
Забыл, что UNION делает сортировку данных.
10. Какая разница между выражениями WHERE и HAVING?
страх и ужас.
Если задавать «каверзные» вопросы, тогда:
сколько будет
select 1 from any_table where 1!=1 having count(*)=0;
Бідний Острів Нуль en.wikipedia.org/wiki/Null_Island