SQL进阶指南:从基础查询到高级计算
前言
SQL(Structured Query Language)作为关系型数据库的标准查询语言,不仅仅是一个简单的数据查询工具,更是数据处理和分析的强大武器。本文将系统地介绍SQL的核心概念、基础查询到高级计算,帮助读者更好地掌握SQL的使用技巧。
目录
- SQL基础概念
- 基本查询操作
- SQL中的计算操作
- 高级查询技巧
- 性能优化建议
一、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是一个强大的数据操作语言,掌握了本文介绍的这些概念和技巧,你就能够:
- 编写高效的数据查询语句
- 处理各种类型的数据计算
- 实现复杂的数据分析需求
- 优化查询性能
不断实践和探索这些特性,你会发现SQL远比想象中的更加灵活和强大。
参考资料
- SQL官方文档
- 《SQL必知必会》
- 《高性能MySQL》
本文首发于掘金,作者:敲代码的玉米C 转载请注明出处!