Изменение типов
Некоторые агрегирующие функции работают только с числовыми типами данных. Потому такой запрос не выполнится для books:
Скопировать кодSQL
SELECT
AVG(pages) AS average
FROM
books;
Взгляните на таблицу:
books
Данные в выборке выглядят как числа, но в базе данных хранятся как строки. В жизни такое встречается часто — обычно из-за ошибок проектирования базы данных.
Изменим тип данных столбца в самом SQL-запросе. Типы преобразуют конструкцией CAST (от англ. «преобразование»):
Скопировать кодSQL
CAST (название_столбца AS тип_данных)
Название_столбца — это поле, тип данных которого нужно преобразовать. Тип_данных — тип, в который данные нужно перевести. Есть и другая форма записи:
Скопировать кодSQL
название_столбца :: тип_данных
Осталось познакомиться с типами данных в SQL.
Числовые типы данных
integer — целочисленный тип, аналогичный типу int в Python. В SQL диапазон целых чисел от -2147483648 до 2147483647.
real — число с плавающей точкой, как float в Python. Точность числа типа real до 6 десятичных разрядов.
Строковые типы данных
'Практикум' — значение строкового типа, в SQL запросе его заключают в одинарные кавычки.
varchar(n) — строка переменной длины, где n — ограничение. Этот тип данных похож на string в Python, но в отличие от него ограничен по длине: в поле можно занести любую строку короче, чем n символов.
text — строка любой длины. Полный аналог string в Python.
Дата и время
Любые вводимые значения даты или времени заключают в одинарные кавычки.
timestamp — дата и время. В формате timestamp чаще всего хранят события, происходящие несколько раз за день. Например, логи пользователей сайта.
date — дата.
Логический
boolean — логический тип данных. В SQL есть три варианта значений TRUE — «истина», FALSE — «ложь» и NULL — «неизвестно».
Вы изучили распространённые типы данных. Есть и много других. Вы можете познакомиться с ними самостоятельно в
документации.
Вернёмся к «нерешаемой» задаче. Найдём среднее число страниц двумя способами:
Скопировать кодSQL
SELECT
AVG(pages :: integer) AS average
FROM
books;
или:
Скопировать кодSQL
SELECT
AVG (CAST(pages AS integer)) AS average
FROM
books;
Скопировать кодSQL
428,7058824
В данных о молочной продукции тоже есть ошибка. Данные поля weight записаны как строки, хотя на самом деле это числа. По такому поводу стоит написать баг-репорт. А пока исправьте эту ошибку локально, в запросе.