SQL стал намного проще для людей, которые любят Pandas

Мотивация

В мире, где с 1974 года доминирует SQL, в 2008 году появился Pandas, предлагающий привлекательные функции, такие как встроенная визуализация и гибкая обработка данных. Он быстро стал популярным инструментом для исследования данных, затмив собой SQL.

Но не обманывайтесь, SQL по-прежнему держит свои позиции. Это второй по востребованности и третий по скорости роста язык для науки о данных (см. здесь). Таким образом, в то время как Pandas привлекает всеобщее внимание, SQL остается жизненно важным навыком для любого специалиста по данным.

Давайте узнаем, как легко выучить SQL, если вы уже знаете Pandas.

Подключение к базе данных

Настройка рабочей области SQL и подключение к образцу базы данных может быть настоящей головной болью. Во-первых, вам нужно установить предпочитаемый вариант SQL (PostgreSQL, MySQL и т. д.) и загрузить SQL IDE. Выполнение их здесь отвлекло бы нас от цели статьи, поэтому мы воспользуемся ярлыком.

В частности, мы будем напрямую запускать SQL-запросы в Jupyter Notebook без дополнительных шагов. Все, что нам нужно сделать, это установить пакет ipython-sql с помощью pip:

pip install ipython-sql

После установки запустите новый сеанс Jupyter и выполните эту команду в блокноте:

%load_ext sql

и все готово!

Чтобы проиллюстрировать, как работают основные операторы SQL, мы будем использовать базу данных Chinook SQLite, которая имеет 11 таблиц.

Чтобы загрузить набор данных и его 11 таблиц как отдельные переменные в нашу среду, мы можем запустить:

%sql sqlite:///data/chinook.db

Оператор начинается со встроенной магической команды %sql, которая сообщает интерпретатору ноутбука, что мы будем запускать команды SQL. За ним следует путь, по которому находится загруженная база данных Chinook.

Допустимые пути всегда должны начинаться с префикса sqlite:/// для баз данных SQLite. Выше мы подключаемся к базе данных, хранящейся в папке «data» текущего каталога. Если вы хотите передать абсолютный путь, префикс должен начинаться с четырех косых черт — sqlite:////.

Если вы хотите подключиться к другой разновидности базы данных, вы можете обратиться к этой отличной статье.

Первый взгляд на таблицы

Первое, что мы всегда делаем в Pandas, — это используем функцию .head() для первого просмотра данных. Давайте узнаем, как это сделать в SQL:

Первое ключевое слово в приведенном выше запросе — SELECT. Это эквивалентно оператору скобок в Pandas, где мы выбираем определенные столбцы. Но за ключевым словом SELECT следует * (звездочка). * — это оператор SQL, который выбирает все (все строки и столбцы) из таблицы, указанной после ключевого слова FROM. LIMIT используется для минимизации возвращаемого результата. Таким образом, приведенный выше запрос эквивалентен функции df.head().

Если вы не хотите выбирать все столбцы, вы можете указать одно или несколько имен столбцов после ключевого слова SELECT:

Эквивалентная операция Pandas:

tracks[['Name', 'Composer', 'UnitPrice']].head(10)

Другое полезное ключевое слово в SQL — DISTINCT. Добавление этого ключевого слова перед именем любого столбца возвращает его уникальные значения:

Комментарии в SQL пишутся с двойным дефисом.

Подсчет количества строк

Точно так же, как Pandas имеет атрибут .shape в своих DataFrames, SQL имеет функцию COUNT для отображения количества строк в таблице:

%%sql

SELECT COUNT(*) FROM tracks

Более полезной информацией будет подсчет количества уникальных значений в определенном столбце. Мы можем сделать это, добавив ключевое слово DISTINCT в COUNT:

Фильтрация результатов с помощью предложений WHERE

Просто смотреть и считать строки довольно хромой. Давайте посмотрим, как мы можем фильтровать строки на основе условий.

Во-первых, давайте посмотрим на песни, которые стоят больше доллара:

Условные операторы записываются в предложении WHERE, которое всегда следует после FROM и перед ключевыми словами LIMIT. Использование условий очень похоже на то, как мы это делаем в Pandas, но я осмелюсь сказать, что версия SQL более читабельна.

Вы также можете использовать функцию COUNT при использовании условных выражений. Например, давайте посмотрим, сколько песен стоит от 1 до 10 долларов:

Выше мы связали два условия логическим оператором AND. Аналогично используются и другие логические операторы (ИЛИ, НЕ).

Теперь давайте посмотрим на все счета, в которых в качестве города выставления счетов указан Париж илиБерлин:

Для оператора равенства в SQL требуется только один знак "=" (равно). Оператор неравенства представлен операторами ‘!=’ или ‘‹›’:

Упрощенная фильтрация с помощью BETWEEN и IN

Подобные условные операторы используются очень часто, и их запись с помощью простых логических значений становится громоздкой. Например, в Pandas есть функция .isin(), которая проверяет, принадлежит ли значение списку значений.

Если бы мы хотели выбрать счета для пяти городов, нам пришлось бы написать пять связанных условий. К счастью, SQL поддерживает аналогичный оператор IN, такой как .isin(), поэтому нам не нужно:

Список значений после IN следует указывать в виде кортежа, а не списка. Вы также можете отменить условие с помощью ключевого слова NOT:

Другой распространенной операцией фильтрации числовых столбцов является выбор значений в пределах диапазона. Для этого можно использовать ключевое слово BETWEEN, эквивалентное pd.Series.between():

Проверка на нули

В каждом источнике данных есть пропущенные значения, и базы данных не являются исключением. Точно так же, как есть несколько способов исследовать отсутствующие значения в Pandas, существуют определенные ключевые слова, которые проверяют наличие нулевых значений в SQL. Следующий запрос подсчитывает количество строк с пропущенными значениями в BillingState:

Вы можете добавить ключевое слово NOT между IS и NULL, чтобы отбросить пропущенные значения определенного столбца:

Лучшее сопоставление строк с LIKE

В предложении WHERE мы отфильтровали столбцы на основе точных текстовых значений. Но часто нам может понадобиться отфильтровать текстовые столбцы на основе шаблона. В Pandas и чистом Python мы использовали бы регулярные выражения для сопоставления с образцом, которые очень эффективны, но для освоения регулярных выражений требуется время.

В качестве альтернативы SQL предлагает подстановочный знак «%» в качестве заполнителя для соответствия любому символу 0 или более раз. Например, строка «gr%» соответствует словам «greet», «groom», «greed» и «%ex%» соответствует любому тексту с «ex» в середине и т. д. Давайте посмотрим, как использовать ее с SQL:

Приведенный выше запрос находит все песни, начинающиеся с «B». Строка, содержащая подстановочный знак, должна идти после ключевого слова LIKE.

Теперь давайте найдем все песни, в названии которых есть слово «красивая»:

Вы также можете использовать другие логические операторы рядом с LIKE:

В SQL есть много других подстановочных знаков, которые имеют разные функции. Вы можете увидеть полный список и их использование здесь.

Агрегатные функции в SQL

Также возможно выполнять основные арифметические операции над столбцами. Эти операции называются агрегатными функциями в SQL, и наиболее распространенными из них являются AVG, SUM, MIN, MAX. Их функциональность должна быть ясна из их названий:

Агрегатные функции дают только один результат для столбца, в котором вы их использовали. Это означает, что вы не можете выполнять агрегирование по одному столбцу и выбирать другие неагрегированные столбцы:

Вы можете так же легко комбинировать агрегатные функции с условными операторами, используя предложения WHERE:

Также можно использовать арифметические операторы, такие как +, -, *, / в столбцах и простые числа. При использовании со столбцами операция выполняется поэлементно:

Одно замечание об арифметических операциях: если вы выполняете операции только с целыми числами, SQL считает, что вы ожидаете целое число в качестве ответа:

%%sql
SELECT 10 / 3

Вместо того, чтобы возвращать 3,33…, результат равен 3. Чтобы получить результат с плавающей запятой, вы должны использовать в запросе хотя бы одно число с плавающей запятой или использовать все числа с плавающей запятой, чтобы быть в безопасности:

%%sql
SELECT 10.0 / 3.0

Используя эти знания, рассчитаем среднюю продолжительность песни в минутах:

Если вы обратите внимание на приведенный выше столбец, его имя написано как «запрос, использованный для создания этого столбца». Из-за этого поведения использование длинных вычислений, таких как определение стандартного отклонения или дисперсии столбца, может быть проблемой, поскольку имя столбца будет таким же большим, как и сам запрос.

Чтобы избежать этого, SQL допускает использование псевдонимов, подобно тому, как операторы импорта имеют псевдонимы в Python. Например:

Использование ключевого слова as после одного элемента в операторе SELECT сообщает SQL, что мы используем псевдоним. Вот еще примеры:

Вы можете так же легко использовать псевдонимы для столбцов с длинными именами.

Упорядочивание результатов в SQL

Так же, как в Pandas есть метод sort_values, SQL поддерживает упорядочение столбцов с помощью предложения ORDER BY. Передача имени столбца после предложения сортирует результаты в порядке возрастания:

Упорядочим таблицу треков по возрастанию имени композитора. Обратите внимание, что оператор ORDER BY всегда должен стоять после предложения WHERE. Также можно передать два или более столбца в ORDER BY:

Вы также можете изменить порядок, передав ключевое слово DESC после каждого имени столбца:

Приведенный выше запрос возвращает три столбца после упорядочения UnitPrice и Compose в порядке убывания и имени в порядке возрастания (ASC — ключевое слово по умолчанию).

Группировка в SQL

Одной из самых мощных функций Pandas является функция groupby. Вы можете использовать его, чтобы преобразовать стол практически в любую форму, которую вы хотите. Его очень близкий родственник в SQL — предложение GROUP BY можно использовать для достижения той же функциональности. Например, следующий запрос подсчитывает количество песен в каждом жанре:

Разница между GROUP BY в SQL и groupby в Pandas заключается в том, что SQL не позволяет выбирать столбцы, которые не были указаны в предложении GROUP BY. Например, добавление дополнительного свободного столбца в приведенный выше запрос приводит к ошибке:

Однако вы можете выбрать столько столбцов в операторе SELECT, сколько хотите, если вы используете для них какой-либо тип агрегатной функции:

Приведенный выше запрос включает почти все темы, которые мы изучили до этого момента. Мы группируем как по идентификатору альбома, так и по идентификатору жанра, и для каждой группы мы рассчитываем среднюю продолжительность и цену песни. Мы также эффективно используем псевдонимы.

Мы можем сделать запрос еще более мощным, упорядочив его по средней продолжительности и количеству жанров:

Обратите внимание на то, как мы используем псевдонимы агрегатных функций в предложении ORDER BY. После того как вы назовете столбец или результат агрегатной функции псевдонимом, вы сможете ссылаться на них только по псевдониму для остальной части запроса.

Использование условных выражений с HAVING

По умолчанию SQL не разрешает условную фильтрацию с использованием агрегатных функций в предложении WHERE. Например, мы хотим выбрать только те жанры, в которых количество песен превышает 100. Попробуем сделать это с предложением WHERE:

Правильный способ фильтрации строк на основе результатов агрегатных функций — использование предложения HAVING:

Предложение HAVING обычно используется с GROUP BY. Всякий раз, когда вы хотите отфильтровать строки с помощью агрегатных функций, используйте предложение HAVING!

Все изображения созданы мной лично.

Краткое содержание

К настоящему времени вы должны были понять, насколько мощным может быть SQL и насколько более читабельным он становится по сравнению с Pandas. Несмотря на то, что мы узнали тонну, мы едва поцарапали поверхность.

Для практических задач я рекомендую Data Lemur или LeetCode, если вы любите приключения.

Понравилась эта статья и, скажем прямо, ее причудливый стиль написания? Представьте себе, что у вас есть доступ к десяткам таких же, написанных блестящим, обаятельным, остроумным автором (кстати, это я :).

Всего за 4,99 $ членства вы получите доступ не только к моим историям, но и к сокровищнице знаний от лучших и самых ярких умов на Medium. А если вы воспользуетесь моей реферальной ссылкой, то получите мою сверхновую благодарность и виртуальную пятерку за поддержку моей работы.