Сводные функции SQL в SQLite
Агрегаты сжимают множество строк в одно значение.
COUNT считает строки, SUM складывает
числа, MIN и MAX берут крайние
значения столбца.
Несколько функций можно запросить в одном SELECT
с псевдонимами для чтения из ResultSet:
import java.sql.DriverManager
fun main() {
DriverManager.getConnection("jdbc:sqlite:stats.db")
.use { connection ->
connection.createStatement().use { statement ->
statement.execute(
"""
CREATE TABLE IF NOT EXISTS loads (
id INTEGER PRIMARY KEY,
kg INTEGER NOT NULL
)
"""
)
statement.executeUpdate(
"INSERT INTO loads (kg) VALUES (10)"
)
statement.executeUpdate(
"INSERT INTO loads (kg) VALUES (25)"
)
statement.executeUpdate(
"INSERT INTO loads (kg) VALUES (15)"
)
val result = statement.executeQuery(
"""
SELECT
COUNT(*) AS cnt,
SUM(kg) AS total,
MIN(kg) AS light,
MAX(kg) AS heavy
FROM loads
"""
)
if (result.next()) {
println(result.getInt("cnt"))
println(result.getInt("total"))
println(result.getInt("light"))
println(result.getInt("heavy"))
}
}
}
}
Запись COUNT(*) не смотрит на NULL в отдельных
полях - считаются строки целиком. Для пустой таблицы
агрегаты всё равно вернут одну строку результата:
import java.sql.DriverManager
fun main() {
DriverManager.getConnection("jdbc:sqlite:stats.db")
.use { connection ->
val result = connection.createStatement()
.executeQuery("SELECT COUNT(*) AS cnt FROM loads")
if (result.next()) {
println(result.getInt("cnt"))
}
}
}
Создайте таблицу fees в club.db
с полем amount, добавьте четыре суммы
и выведите число строк, сумму, минимум и максимум.
Добавьте условие WHERE amount >= ? с
порогом 50 и выведите SUM
только по подходящим строкам.