🤔 Задачка о группах — решение
Увидев задачку о группах, коллега написал мне:
> Человек, порочащий олимпиадное программирование, просит решить задачку ЗА ОДИН запрос. Зачем?
Справедливо. Действительно, главное в решении — не формальное количество запросов, а время на понимание. Поэтому давайте решим без олимпиадного ажиотажа, спокойно и по шагам:
https://antonz.ru/sql-groups/
Увидев задачку о группах, коллега написал мне:
> Человек, порочащий олимпиадное программирование, просит решить задачку ЗА ОДИН запрос. Зачем?
Справедливо. Действительно, главное в решении — не формальное количество запросов, а время на понимание. Поэтому давайте решим без олимпиадного ажиотажа, спокойно и по шагам:
https://antonz.ru/sql-groups/
🌤️ SQLite-песочница в браузере
Чего мне всегда не хватало, так это аналога JSFiddle / CodePen для SQL. Онлайн-песочницы, в которой можно быстро проверить запрос и поделиться с другими.
Да, есть SQL Fiddle и DB Fiddle, но оба весьма неудобные, на мой взгляд.
Вот чего хотелось:
— Возможность загрузить готовую базу, а не писать SQL для создания таблиц.
— Подключать как локальные базы, так и удаленные (по url).
— Сохранять базу и запросы в облаке.
— Бесплатно и без регистрации.
— Свежайшая версия SQLite.
— Минимализм.
В общем, сделал сам:
sqlime.org
Чего мне всегда не хватало, так это аналога JSFiddle / CodePen для SQL. Онлайн-песочницы, в которой можно быстро проверить запрос и поделиться с другими.
Да, есть SQL Fiddle и DB Fiddle, но оба весьма неудобные, на мой взгляд.
Вот чего хотелось:
— Возможность загрузить готовую базу, а не писать SQL для создания таблиц.
— Подключать как локальные базы, так и удаленные (по url).
— Сохранять базу и запросы в облаке.
— Бесплатно и без регистрации.
— Свежайшая версия SQLite.
— Минимализм.
В общем, сделал сам:
sqlime.org
Написал на хабр, как устроена sqlite-песочница в браузере. Если вы немного знакомы с js, может быть интересно → https://habr.com/ru/post/580240/
Табличные выражения 👍
Прием №1, чтобы писать хорошие читаемые SQL-запросы — это табличные выражения (CTE). Люди их боятся, а зря.
Любой подзапрос:
Механически превращается в CTE:
Вот и вся наука, не надо читать увесистую книгу по SQL или проходить курсы.
Существует миф, что «CTE медленные», но на современных СУБД это не так. Да и вообще — как с любым утверждением о медленности чего-либо, всегда можно сравнить два варианта (подзапрос и CTE), если сомневаешься.
Кроме обычных CTE бывают еще рекурсивные — вот это реально злые ребята. А обычные прекрасны, используйте их.
Прием №1, чтобы писать хорошие читаемые SQL-запросы — это табличные выражения (CTE). Люди их боятся, а зря.
Любой подзапрос:
select a, b, c
from (X)
where e = f
Механически превращается в CTE:
with cte_name as (X)
select a, b, c
from cte_name
where e = f
Вот и вся наука, не надо читать увесистую книгу по SQL или проходить курсы.
Существует миф, что «CTE медленные», но на современных СУБД это не так. Да и вообще — как с любым утверждением о медленности чего-либо, всегда можно сравнить два варианта (подзапрос и CTE), если сомневаешься.
Кроме обычных CTE бывают еще рекурсивные — вот это реально злые ребята. А обычные прекрасны, используйте их.
Мат. статистика в SQLite
Из коробки SQLite поддерживает только min(), max() и avg(). Но с помощью расширения stats легко посчитать медиану, моду, процентили и стандартное отклонение:
Из коробки SQLite поддерживает только min(), max() и avg(). Но с помощью расширения stats легко посчитать медиану, моду, процентили и стандартное отклонение:
select
median(num_pages),
mode(num_pages),
percentile_90(num_pages),
percentile_95(num_pages),
percentile_99(num_pages),
stddev(num_pages)
from books;
Найти максимально похожую строку
Подписчик задал интересный вопрос:
Есть строка в переменной str1.
Есть sqlite3 и 600,000 строк внутри.
Как найти макимально приближенно похожую строку в базе? Точного сходства с str1 в базе нет!
Посмотрим на упрощенном примере. Допустим, у нас есть таблица
Хотим найти сотрудника, чье имя больше всего похоже на Вера. Как это сделать?
Если бы в SQLite была функция, которая считает похожесть между двумя строками, все было бы просто:
Но такой функции нет. Значит, либо искать расширение, в котором она найдется, либо подключить функцию из любимого языка программирования. На питоне, например, сделать это несложно:
Теперь можно выполнить наш запрос:
Он вернет самое похожее имя:
Ровно то, что мы хотели. Для 600К строк, правда, отработает не слишком быстро.
Подписчик задал интересный вопрос:
Есть строка в переменной str1.
Есть sqlite3 и 600,000 строк внутри.
Как найти макимально приближенно похожую строку в базе? Точного сходства с str1 в базе нет!
Посмотрим на упрощенном примере. Допустим, у нас есть таблица
employees
, а в ней столбец name
:sqlite> select name from employees;
Дарья
Борис
Елена
Ксения
Леонид
Марина
Иван
Вероника
Григорий
Анна
Хотим найти сотрудника, чье имя больше всего похоже на Вера. Как это сделать?
Если бы в SQLite была функция, которая считает похожесть между двумя строками, все было бы просто:
select
name,
similarity(name, 'Вера') as sim
from employees
order by sim desc
limit 1
Но такой функции нет. Значит, либо искать расширение, в котором она найдется, либо подключить функцию из любимого языка программирования. На питоне, например, сделать это несложно:
import sqlite3
from difflib import SequenceMatcher
def similarity(a, b):
ratio = SequenceMatcher(None, a.lower(), b.lower()).ratio()
return round(ratio, 2)
db = sqlite3.connect("employees.db")
db.create_function("similarity", 2, similarity)
Теперь можно выполнить наш запрос:
cursor = db.execute(query)
result = cursor.fetchall()
print(result)
Он вернет самое похожее имя:
[('Вероника', 0.67)]
Ровно то, что мы хотели. Для 600К строк, правда, отработает не слишком быстро.
Вижу подзапрос → меняю на CTE
Многие студенты (да и не только студенты) обожают многоуровневые SQL-запросы. Пожалуйста, пожалуйста, пожалуйста, не пишите их. Используйте табличные выражения: https://antonz.ru/cte/
Многие студенты (да и не только студенты) обожают многоуровневые SQL-запросы. Пожалуйста, пожалуйста, пожалуйста, не пишите их. Используйте табличные выражения: https://antonz.ru/cte/
Возможно, странный вопрос, но все равно задам. Вы понимаете, как работают индексы в базе данных?
Final Results
5%
Знаю все нюансы
53%
Понимаю в общих чертах
29%
Знаю только, что индекс ускоряет запросы
13%
Вообще без понятия
Нечеткое сравнение строк и фонетика
Пока готовлю заметку про поиск похожих строк, сделал новое расширение для SQLite. Вот что в нем есть.
Сравнение строк по похожести:
— Расстояние Левенштейна
— Расстояние Дамерау — Левенштейна
— Расстояние Хэмминга
— Сходство Джаро — Винклера
— Оптимальное выравнивание строк
— Расстояние Spellcheck
Фонетические коды:
— Soundex
— Refined Soundex
— Spellcheck
И транслитерация (привет → privet).
https://github.com/nalgeon/sqlean/blob/main/docs/fuzzy.md
Пока готовлю заметку про поиск похожих строк, сделал новое расширение для SQLite. Вот что в нем есть.
Сравнение строк по похожести:
— Расстояние Левенштейна
— Расстояние Дамерау — Левенштейна
— Расстояние Хэмминга
— Сходство Джаро — Винклера
— Оптимальное выравнивание строк
— Расстояние Spellcheck
Фонетические коды:
— Soundex
— Refined Soundex
— Spellcheck
И транслитерация (привет → privet).
https://github.com/nalgeon/sqlean/blob/main/docs/fuzzy.md
Быстрый поиск похожих слов на SQL
(готовое решение)
Я что-то закопался с подробной статьей про поиск похожих слов, так что вот пока готовое решение на SQLite.
Напомню, что задача в общем виде такая:
— Человек ввел произвольное слово.
— Мы хотим найти наиболее похожее слово из готового словаря.
— И сделать это быстро.
Полный перебор по словарю работает хорошо, но медленно.
Чтобы сделать быстро, понадобится расширение spellfix.
Подключаем расширение:
Создаем таблицу для словаря:
Загружаем в нее данные:
И ищем похожие слова:
Например:
Изи!
Позже отдельно распишу, как и почему все работает. И как сделать самостоятельно на любой базе.
(готовое решение)
Я что-то закопался с подробной статьей про поиск похожих слов, так что вот пока готовое решение на SQLite.
Напомню, что задача в общем виде такая:
— Человек ввел произвольное слово.
— Мы хотим найти наиболее похожее слово из готового словаря.
— И сделать это быстро.
Полный перебор по словарю работает хорошо, но медленно.
Чтобы сделать быстро, понадобится расширение spellfix.
Подключаем расширение:
.load ./spellfix
Создаем таблицу для словаря:
create virtual table dictionary using spellfix1;
Загружаем в нее данные:
insert into dictionary(word)
select ... from ...;
И ищем похожие слова:
select word
from dictionary
where word match ?
limit 1
Например:
sqlite> select word from dictionary where word match 'абривиатура' limit 1;
аббревиатура
sqlite> select word from dictionary where word match 'рассчет' limit 1;
расчет
sqlite> select word from dictionary where word match 'дорга' limit 1;
дорога
Изи!
Позже отдельно распишу, как и почему все работает. И как сделать самостоятельно на любой базе.
500 учеников на курсе про «окошки»!
Зашел сегодня на «Степик» и увидел, что на курс по оконным функциям записались уже 500 человек. Когда его делал, совсем не рассчитывал на такую популярность.
Вообще, курс про «окошки» появился как спин-офф моего большого курса «SQLite для аналитики». Там был модуль «оконные функции», и он мне самому так понравился, что на его основе сделал отдельный курс.
Судя по всему, получилось неплохо, потому что студентов много и отзывы очень позитивные. Люди находят курс без всякой рекламы. Полностью прошли курс 40% участников — это очень недурно для онлайн-формата. Выпускники пишут, что стали регулярно использовать «окошки» в повседневной работе — лучший результат, что я могу представить.
Признаться, мне курс тоже нравится. Сам использую его как конспект, когда не уверен, как что-то работает.
Зашел сегодня на «Степик» и увидел, что на курс по оконным функциям записались уже 500 человек. Когда его делал, совсем не рассчитывал на такую популярность.
Вообще, курс про «окошки» появился как спин-офф моего большого курса «SQLite для аналитики». Там был модуль «оконные функции», и он мне самому так понравился, что на его основе сделал отдельный курс.
Судя по всему, получилось неплохо, потому что студентов много и отзывы очень позитивные. Люди находят курс без всякой рекламы. Полностью прошли курс 40% участников — это очень недурно для онлайн-формата. Выпускники пишут, что стали регулярно использовать «окошки» в повседневной работе — лучший результат, что я могу представить.
Признаться, мне курс тоже нравится. Сам использую его как конспект, когда не уверен, как что-то работает.
SQLite 3.37
Тут у sqlite вышла новая версия! Да какая — теперь он научился проверять типы данных (двадцать лет ругали, что не проверяет).
Написал обзор основных изменений:
https://habr.com/ru/news/t/592085/
Тут у sqlite вышла новая версия! Да какая — теперь он научился проверять типы данных (двадцать лет ругали, что не проверяет).
Написал обзор основных изменений:
https://habr.com/ru/news/t/592085/
Хабр
Что нового в SQLite 3.37
В отличие от 3.35 , релиз 3.37 принес не так много изменений. Но среди них — одно из важнейших за всю историю: «строгий» режим таблиц, в котором движок следит, чтобы данные в столбце соответствовали...
Датасет слов английского языка
Обнаружил, что у Оксфордского университета есть списки распространенных слов и выражений английского языка. Доступны в традиционно «удобном» формате — html-амбразуре на сайте либо PDF.
Извлек их и сделал нормальные наборы данных в CSV.
Атрибутика:
— слово
— часть речи
— уровень (A1, A2, B1, B2, C1)
— ссылка на подробное определение
— ссылка на озвучку в ogg
https://github.com/nalgeon/words
Обнаружил, что у Оксфордского университета есть списки распространенных слов и выражений английского языка. Доступны в традиционно «удобном» формате — html-амбразуре на сайте либо PDF.
Извлек их и сделал нормальные наборы данных в CSV.
Атрибутика:
— слово
— часть речи
— уровень (A1, A2, B1, B2, C1)
— ссылка на подробное определение
— ссылка на озвучку в ogg
https://github.com/nalgeon/words
Если вы написали отличную статью, о которой никто не знает
В русскоязычном айти есть несколько «селебрити», которых все читают и обсуждают. И намного больше малоизвестных ребят, которые пишут классные статьи. У селебрити и так все отлично, а вот остальным я бы хотел помочь найти свою аудиторию.
Поэтому провожу эксперимент! Готов опубликовать ссылку на вашу статью, если она мне понравится. Бесплатно. Знаменитостью это вас не сделает, но статью точно увидит больше людей.
Все условия
В русскоязычном айти есть несколько «селебрити», которых все читают и обсуждают. И намного больше малоизвестных ребят, которые пишут классные статьи. У селебрити и так все отлично, а вот остальным я бы хотел помочь найти свою аудиторию.
Поэтому провожу эксперимент! Готов опубликовать ссылку на вашу статью, если она мне понравится. Бесплатно. Знаменитостью это вас не сделает, но статью точно увидит больше людей.
Все условия
Быстрый поиск похожих слов на SQL
Написал статью о том, как искать похожие слова и исправлять опечатки на большом словаре (1.5 млн записей).
Попутно вы узнаете, как считать расстояние между словами, что такое фонетические коды, и как использовать фонетику и расстояния для моментального поиска (<50 мс).
https://antonz.ru/similar-words/
Написал статью о том, как искать похожие слова и исправлять опечатки на большом словаре (1.5 млн записей).
рассчет → расчет
сонце → солнце
абривиатура → аббревиатура
Попутно вы узнаете, как считать расстояние между словами, что такое фонетические коды, и как использовать фонетику и расстояния для моментального поиска (<50 мс).
https://antonz.ru/similar-words/
antonz.ru
Быстрый поиск похожих слов на SQL
Фонетика, расстояния и никакого LIKE.
SQLite GUI
По запросу «sqlite gui» в гугле на первой позиции стоит программа «DB Browser for SQLite». На мой взгляд, она плоха примерно всем, и такая популярность ничем не оправдана.
Если вы работаете под Windows, обратите внимание на sqlite-gui. Она легкая, быстрая, удобная, и с кучей приятных дополнительных фич вроде настраиваемых шорткатов, генератора данных и даже встроенного REST API сервера.
А еще автор (к сожалению, не знаю даже его имени) пишет классные статьи про SQLite на хабре.
По запросу «sqlite gui» в гугле на первой позиции стоит программа «DB Browser for SQLite». На мой взгляд, она плоха примерно всем, и такая популярность ничем не оправдана.
Если вы работаете под Windows, обратите внимание на sqlite-gui. Она легкая, быстрая, удобная, и с кучей приятных дополнительных фич вроде настраиваемых шорткатов, генератора данных и даже встроенного REST API сервера.
А еще автор (к сожалению, не знаю даже его имени) пишет классные статьи про SQLite на хабре.
Читаем и пишем файлы прямо из SQLite
У CLI-утилиты
Пишем в файл:
Читаем:
Выводим содержимое каталога:
Для любителей делать все на свете, не покидая SQL ツ
У CLI-утилиты
sqlite
есть встроенные функции writefile
и readfile
. Я их немного доработал и оформил в виде расширения fileio.Пишем в файл:
select writefile('hello.txt', 'hello world');
Читаем:
select readfile('hello.txt');
Выводим содержимое каталога:
select * from lsdir('.');
Для любителей делать все на свете, не покидая SQL ツ
Unix timestamp
SQLite 3.38 получит функцию даты/времени в формате unix timestamp! А пока он не вышел, можно попробовать в моем расширении isodate:
https://github.com/nalgeon/sqlean/issues/27#issuecomment-998138191
SQLite 3.38 получит функцию даты/времени в формате unix timestamp! А пока он не вышел, можно попробовать в моем расширении isodate:
select unixepoch('2021-12-22 12:34:45');
1640176485
https://github.com/nalgeon/sqlean/issues/27#issuecomment-998138191
Все расширения SQLite
Мне очень нравится SQLite. Это миниатюрная встраиваемая база, которая отлично подходит как для исследовательского анализа данных, так и в качестве хранилища для небольших приложений.
Но есть у нее один недостаток: маловато встроенных функций по сравнению с PostgreSQL или Oracle.
К счастью, авторы заложили в SQLite механизм расширений, на котором можно сделать почти все что угодно. В результате интернет заполнен обрывочными расширениями, которые добавляют функцию-другую.
Мне хотелось большой системности.
Так появился проект sqlean — в нем я собираю вместе недостающие в SQLite функции, распределяю их по модулям, рефакторю код, пишу тесты и документацию. Получается что-то вроде стандартной библиотеки, как в Python или Go, только для SQLite.
Там есть регулярные выражения, работа с файлами, мат. статистика, поддержка CSV. Даже массивы есть! (почти как в постгресе).
Планирую по каждому модулю написать отдельную статью, а пока вот краткий обзор:
https://antonz.ru/sqlean/
Мне очень нравится SQLite. Это миниатюрная встраиваемая база, которая отлично подходит как для исследовательского анализа данных, так и в качестве хранилища для небольших приложений.
Но есть у нее один недостаток: маловато встроенных функций по сравнению с PostgreSQL или Oracle.
К счастью, авторы заложили в SQLite механизм расширений, на котором можно сделать почти все что угодно. В результате интернет заполнен обрывочными расширениями, которые добавляют функцию-другую.
Мне хотелось большой системности.
Так появился проект sqlean — в нем я собираю вместе недостающие в SQLite функции, распределяю их по модулям, рефакторю код, пишу тесты и документацию. Получается что-то вроде стандартной библиотеки, как в Python или Go, только для SQLite.
Там есть регулярные выражения, работа с файлами, мат. статистика, поддержка CSV. Даже массивы есть! (почти как в постгресе).
Планирую по каждому модулю написать отдельную статью, а пока вот краткий обзор:
https://antonz.ru/sqlean/