SQL进阶指南:从基础查询到高级计算

110 阅读4分钟

SQL进阶指南:从基础查询到高级计算

前言

SQL(Structured Query Language)作为关系型数据库的标准查询语言,不仅仅是一个简单的数据查询工具,更是数据处理和分析的强大武器。本文将系统地介绍SQL的核心概念、基础查询到高级计算,帮助读者更好地掌握SQL的使用技巧。

目录

  1. SQL基础概念
  2. 基本查询操作
  3. SQL中的计算操作
  4. 高级查询技巧
  5. 性能优化建议

一、SQL基础概念

1.1 SQL的分类

SQL语言主要分为四大类:

  • 数据查询语言(DQL)

    • 主要指SELECT语句
    • 用于从数据库中检索数据
  • 数据操作语言(DML)

    • INSERT:插入数据
    • UPDATE:更新数据
    • DELETE:删除数据
  • 数据定义语言(DDL)

    • CREATE:创建数据库对象
    • ALTER:修改数据库对象
    • DROP:删除数据库对象
  • 数据控制语言(DCL)

    • GRANT:授予权限
    • REVOKE:撤销权限

1.2 数据类型

常见的SQL数据类型包括:

  • 数值类型

    • INT:整数
    • DECIMAL/NUMERIC:精确数值
    • FLOAT:浮点数
  • 字符串类型

    • CHAR:固定长度
    • VARCHAR:可变长度
    • TEXT:长文本
  • 日期时间类型

    • DATE:日期
    • TIME:时间
    • TIMESTAMP:时间戳

二、基本查询操作

2.1 SELECT语句基础

-- 基本查询结构
SELECT [DISTINCT] column1, column2, ...
FROM table_name
WHERE condition
GROUP BY column
HAVING group_condition
ORDER BY column [ASC|DESC]
LIMIT n;

2.2 条件查询

-- 比较运算符
SELECT last_name, salary
FROM employees
WHERE salary > 12000;

-- BETWEEN运算符
SELECT last_name, salary
FROM employees
WHERE salary BETWEEN 5000 AND 12000;

-- IN运算符
SELECT last_name, department_id
FROM employees
WHERE department_id IN (20, 50);

2.3 排序和分组

-- 多字段排序
SELECT last_name, salary, commission_pct
FROM employees
WHERE commission_pct IS NOT NULL
ORDER BY salary DESC, commission_pct DESC;

-- 分组查询
SELECT department_id, 
       COUNT(*) as emp_count,
       AVG(salary) as avg_salary
FROM employees
GROUP BY department_id
HAVING AVG(salary) > 10000;

三、SQL中的计算操作

3.1 算术运算

-- 基本算术运算
SELECT 
    last_name,
    salary,
    salary * 12 AS annual_salary,
    salary + 2000 AS increased_salary
FROM employees;

-- 处理除零情况
SELECT last_name,
       CASE 
           WHEN bonus = 0 THEN 0 
           ELSE salary / bonus 
       END AS salary_to_bonus_ratio
FROM employees;

3.2 日期计算

-- MySQL日期计算
SELECT 
    last_name,
    hire_date,
    CURDATE() AS today,
    DATEDIFF(CURDATE(), hire_date) AS days_worked
FROM employees;

-- Oracle日期计算
SELECT 
    last_name,
    hire_date,
    SYSDATE AS current_date,
    TRUNC(SYSDATE) - hire_date AS days_worked,
    ADD_MONTHS(hire_date, 6) AS six_months_after_hire
FROM employees;

3.3 字符串操作

-- Oracle字符串操作
SELECT 
    last_name,
    first_name,
    last_name || ' ' || first_name AS full_name,
    LENGTH(last_name) AS name_length
FROM employees;

-- MySQL字符串操作
SELECT 
    last_name,
    first_name,
    CONCAT(last_name, ' ', first_name) AS full_name,
    CHAR_LENGTH(last_name) AS name_length
FROM employees;

四、高级查询技巧

4.1 子查询

-- 相关子查询
SELECT last_name, salary
FROM employees e1
WHERE salary > (
    SELECT AVG(salary)
    FROM employees e2
    WHERE e2.department_id = e1.department_id
);

4.2 表连接

-- 内连接
SELECT e.last_name, d.department_name
FROM employees e
INNER JOIN departments d 
ON e.department_id = d.department_id;

-- 左外连接
SELECT e.last_name, d.department_name
FROM employees e
LEFT JOIN departments d 
ON e.department_id = d.department_id;

4.3 窗口函数

-- 排名函数
SELECT 
    last_name,
    salary,
    department_id,
    RANK() OVER (
        PARTITION BY department_id 
        ORDER BY salary DESC
    ) AS salary_rank
FROM employees;

4.4 公用表表达式(CTE)

WITH dept_avg_salary AS (
    SELECT department_id, 
           AVG(salary) as avg_salary
    FROM employees
    GROUP BY department_id
)
SELECT e.last_name,
       e.salary,
       d.avg_salary,
       e.salary - d.avg_salary as salary_diff
FROM employees e
JOIN dept_avg_salary d
ON e.department_id = d.department_id;

五、性能优化建议

5.1 索引使用

  • 在经常用于查询的字段上创建索引
  • 避免在索引字段上使用函数
  • 复合索引注意最左前缀原则

5.2 查询优化

  • 避免SELECT *,只查询需要的字段
  • 使用EXPLAIN分析查询计划
  • 合理使用索引和表连接

5.3 注意事项

  • NULL值的处理
  • 大数据量的分页查询优化
  • 避免子查询,尽量使用连接
  • 使用合适的数据类型

总结

SQL是一个强大的数据操作语言,掌握了本文介绍的这些概念和技巧,你就能够:

  1. 编写高效的数据查询语句
  2. 处理各种类型的数据计算
  3. 实现复杂的数据分析需求
  4. 优化查询性能

不断实践和探索这些特性,你会发现SQL远比想象中的更加灵活和强大。

参考资料

  1. SQL官方文档
  2. 《SQL必知必会》
  3. 《高性能MySQL》

本文首发于掘金,作者:敲代码的玉米C 转载请注明出处!