← Назад к вопросам

Как узнать среднее значение в SQL

1.0 Junior🔥 131 комментариев
#Базы данных и SQL

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Как узнать среднее значение в SQL

Для вычисления среднего значения в SQL используется агрегирующая функция AVG(). Это одна из основных статистических функций в SQL.

Базовый синтаксис

SELECT AVG(колонка) FROM таблица;

Пример:

SELECT AVG(salary) FROM employees;

Это вернет среднюю зарплату всех сотрудников.

AVG() с WHERE условием

Вычисление среднего для подмножества данных:

SELECT AVG(salary) 
FROM employees 
WHERE department = "IT";

AVG() с GROUP BY

Среднее значение для каждой группы:

SELECT department, AVG(salary) as avg_salary
FROM employees
GROUP BY department;

Результат:

department | avg_salary
IT         | 75000
HR         | 50000
Sales      | 60000

AVG() с HAVING

Фильтрация групп по среднему значению:

SELECT department, AVG(salary) as avg_salary
FROM employees
GROUP BY department
HAVING AVG(salary) > 60000;

Вернет только отделы со средней зарплатой более 60000.

Округление результата

SELECT ROUND(AVG(salary), 2) as avg_salary
FROM employees;

Используется функция ROUND() для округления до 2 знаков.

AVG() с DISTINCT

Среднее уникальных значений:

SELECT AVG(DISTINCT salary) as avg_unique_salary
FROM employees;

Исключает дублирующиеся значения при расчете.

Несколько агрегирующих функций

SELECT 
    AVG(salary) as avg_salary,
    MIN(salary) as min_salary,
    MAX(salary) as max_salary,
    COUNT(*) as employee_count
FROM employees;

AVG() в Java с JDBC

public class EmployeeDAO {
    
    public double getAverageSalary() {
        String sql = "SELECT AVG(salary) as avg_salary FROM employees";
        
        try (Connection conn = getConnection();
             Statement stmt = conn.createStatement();
             ResultSet rs = stmt.executeQuery(sql)) {
            
            if (rs.next()) {
                return rs.getDouble("avg_salary");
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return 0;
    }
    
    public double getAverageSalaryByDepartment(String department) {
        String sql = "SELECT AVG(salary) FROM employees WHERE department = ?";
        
        try (Connection conn = getConnection();
             PreparedStatement pstmt = conn.prepareStatement(sql)) {
            
            pstmt.setString(1, department);
            ResultSet rs = pstmt.executeQuery();
            
            if (rs.next()) {
                return rs.getDouble(1);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return 0;
    }
}

AVG() с JPAQuery (Spring Data)

@Repository
public interface EmployeeRepository extends JpaRepository<Employee, Long> {
    
    @Query("SELECT AVG(e.salary) FROM Employee e")
    Double getAverageSalary();
    
    @Query("SELECT AVG(e.salary) FROM Employee e WHERE e.department = :dept")
    Double getAverageSalaryByDepartment(@Param("dept") String department);
}

Частые ошибки

Ошибка 1: NULL значения

AVG() игнорирует NULL значения:

-- Правильно: NULL значения исключены
SELECT AVG(salary) FROM employees;

-- Для включения NULL как 0
SELECT AVG(COALESCE(salary, 0)) FROM employees;

Ошибка 2: Type mismatch

AVG() работает только с числовыми типами:

-- Неправильно
SELECT AVG(name) FROM employees; -- Ошибка!

-- Правильно
SELECT AVG(CAST(age AS DECIMAL)) FROM employees;

Производительность

Для больших таблиц добавляй индексы:

CREATE INDEX idx_department ON employees(department);
CREATE INDEX idx_salary ON employees(salary);