本文将SQL学习分为四个系统化阶段,每个阶段都配有实战代码和概念图解,协助初学者循序渐进掌握数据库技能。
学习目标:掌握基本的增删改查操作,理解数据库基本概念
-- 基本查询结构
SELECT column1, column2 FROM table_name WHERE condition;
-- 实际示例:查询员工信息
SELECT employee_id, name, salary
FROM employees
WHERE department = '技术部'
ORDER BY salary DESC
LIMIT 10;代码解析:
-- 插入数据
INSERT INTO employees (name, department, salary)
VALUES ('张三', '技术部', 15000);
-- 更新数据
UPDATE employees
SET salary = 16000
WHERE name = '张三';
-- 删除数据
DELETE FROM employees
WHERE employee_id = 1001;-- 分组统计示例
SELECT
department,
COUNT(*) as employee_count,
AVG(salary) as avg_salary,
MAX(salary) as max_salary
FROM employees
GROUP BY department
HAVING AVG(salary) > 10000;学习重点:掌握表间关系和各种连接方式
-- 内连接:只返回匹配的记录
SELECT
e.name,
d.department_name,
p.project_name
FROM employees e
INNER JOIN departments d ON e.department_id = d.department_id
INNER JOIN projects p ON e.project_id = p.project_id;
-- 左外连接:返回左表所有记录
SELECT
e.name,
d.department_name
FROM employees e
LEFT JOIN departments d ON e.department_id = d.department_id;-- 标量子查询
SELECT name, salary,
(SELECT AVG(salary) FROM employees) as avg_salary
FROM employees;
-- 关联子查询:查找每个部门工资最高的员工
SELECT
department,
name,
salary
FROM employees e1
WHERE salary = (
SELECT MAX(salary)
FROM employees e2
WHERE e2.department = e1.department
);-- 排名和分区计算
SELECT
name,
department,
salary,
RANK() OVER (PARTITION BY department ORDER BY salary DESC) as dept_rank,
AVG(salary) OVER (PARTITION BY department) as dept_avg_salary
FROM employees;-- 第一范式:原子性
CREATE TABLE students (
student_id INT PRIMARY KEY,
name VARCHAR(50),
-- 违反1NF:将多个电话号码放在一个字段中
-- phones VARCHAR(200) -- 错误示范
-- 符合1NF:单独的电话表
);
CREATE TABLE student_phones (
student_id INT,
phone_type VARCHAR(20),
phone_number VARCHAR(20),
PRIMARY KEY (student_id, phone_type),
FOREIGN KEY (student_id) REFERENCES students(student_id)
);
-- 第三范式:消除传递依赖
CREATE TABLE orders (
order_id INT PRIMARY KEY,
customer_id INT,
customer_name VARCHAR(100), -- 违反3NF,应移到客户表
total_amount DECIMAL(10,2)
);-- 创建合适的索引
CREATE INDEX idx_employee_department ON employees(department);
CREATE INDEX idx_employee_salary ON employees(salary DESC);
-- 复合索引
CREATE INDEX idx_department_salary ON employees(department, salary);
-- 查看查询执行计划
EXPLAIN ANALYZE
SELECT * FROM employees
WHERE department = '技术部' AND salary > 10000;-- 用户购买行为分析
SELECT
u.user_id,
u.name,
COUNT(o.order_id) as order_count,
SUM(o.amount) as total_spent,
AVG(o.amount) as avg_order_value
FROM users u
LEFT JOIN orders o ON u.user_id = o.user_id
WHERE o.order_date >= CURRENT_DATE - INTERVAL '30 days'
GROUP BY u.user_id, u.name
HAVING COUNT(o.order_id) >= 3;
-- 商品销售排名
SELECT
p.product_name,
p.category,
SUM(oi.quantity) as total_sold,
RANK() OVER (ORDER BY SUM(oi.quantity) DESC) as sales_rank
FROM products p
JOIN order_items oi ON p.product_id = oi.product_id
GROUP BY p.product_id, p.product_name, p.category;-- 月度财务汇总
SELECT
EXTRACT(YEAR FROM transaction_date) as year,
EXTRACT(MONTH FROM transaction_date) as month,
transaction_type,
SUM(amount) as total_amount,
LAG(SUM(amount)) OVER (
PARTITION BY transaction_type
ORDER BY EXTRACT(YEAR FROM transaction_date),
EXTRACT(MONTH FROM transaction_date)
) as prev_month_amount
FROM financial_transactions
GROUP BY
EXTRACT(YEAR FROM transaction_date),
EXTRACT(MONTH FROM transaction_date),
transaction_type;# 使用Python操作数据库示例
import pandas as pd
import sqlalchemy
# 创建数据库连接
engine = sqlalchemy.create_engine('mysql+pymysql://user:pass@localhost/db')
# 执行SQL查询
query = """
SELECT department, AVG(salary) as avg_salary
FROM employees
GROUP BY department
"""
df = pd.read_sql(query, engine)
# 数据分析和可视化
print(df.describe())
df.plot(kind='bar', x='department', y='avg_salary')工具类型 | 推荐工具 | 适用场景 |
数据库系统 | MySQL, PostgreSQL | 学习实践 |
图形化工具 | DBeaver, Navicat | 可视化操作 |
在线练习 | LeetCode SQL, HackerRank | 刷题提升 |
文档资源 | SQL官方文档, W3School | 语法查询 |
-- 第一周:基础语法
-- 每日练习2小时,完成20个基础查询
-- 第二周:多表查询
-- 重点练习JOIN和子查询,完成复杂业务逻辑
-- 第三周:高级特性
-- 掌握窗口函数和性能优化技巧
-- 第四周及后来:项目实战
-- 结合实际数据集进行综合练习记住:SQL看似简单,但深度掌握需要系统学习和大量实践。按照这个四阶段路线,坚持学习,你必定能成为SQL高手!
本文内容会持续更新,提议收藏关注获取最新学习资源