实用的SQL实例
好的!为了帮助你更好地理解和掌握SQL,以下是几个实用的SQL实例,涵盖了基础查询、复杂查询、窗口函数、事务管理、数据库优化等内容。
1. 基本查询操作
查询所有记录
假设有一个表 students,包含学生信息:
| id | name | age | grade |
|---|---|---|---|
| 1 | Alice | 20 | A |
| 2 | Bob | 22 | B |
| 3 | Charlie | 21 | A |
| 4 | Dave | 23 | C |
查询所有学生的信息:
SELECT * FROM students;
查询特定列
查询所有学生的姓名和年龄:
SELECT name, age FROM students;
使用WHERE条件筛选
查询所有年龄大于21岁的学生:
SELECT * FROM students WHERE age > 21;
排序数据
查询所有学生并按年龄升序排序:
SELECT * FROM students ORDER BY age ASC;
限制结果
查询前两名学生的姓名和年龄:
SELECT name, age FROM students LIMIT 2;
2. 聚合函数与分组
使用聚合函数
计算所有学生的平均年龄:
SELECT AVG(age) AS average_age FROM students;
使用GROUP BY分组
按成绩分组,统计每个成绩等级的人数:
SELECT grade, COUNT(*) AS student_count FROM students GROUP BY grade;
结合HAVING筛选
查询成绩为”A”的学生平均年龄大于21岁的人数:
SELECT grade, AVG(age) AS average_age
FROM students
GROUP BY grade
HAVING grade = 'A' AND AVG(age) > 21;
3. 连接查询(JOIN)
假设有两张表:students 和 courses,学生选课信息如下:
students 表:
| id | name |
|---|---|
| 1 | Alice |
| 2 | Bob |
courses 表:
| student_id | course |
|---|---|
| 1 | Math |
| 1 | Science |
| 2 | History |
INNER JOIN
查询每个学生所选的课程:
SELECT students.name, courses.course
FROM students
INNER JOIN courses ON students.id = courses.student_id;
LEFT JOIN
查询每个学生及其选的课程,如果没有选课则显示NULL:
SELECT students.name, courses.course
FROM students
LEFT JOIN courses ON students.id = courses.student_id;
4. 窗口函数
假设有一个 sales 表,记录销售数据:
| salesperson | sales_amount | sale_date |
|---|---|---|
| John | 500 | 2024-01-01 |
| Jane | 600 | 2024-01-02 |
| John | 700 | 2024-01-03 |
| Jane | 800 | 2024-01-04 |
使用 ROW_NUMBER() 排名
按销售金额降序排名:
SELECT salesperson, sales_amount, ROW_NUMBER() OVER (ORDER BY sales_amount DESC) AS rank
FROM sales;
使用 LEAD() 和 LAG() 比较前后行数据
比较每个销售员当前和上一天的销售额差:
SELECT salesperson, sales_amount, LAG(sales_amount) OVER (PARTITION BY salesperson ORDER BY sale_date) AS previous_sales,
sales_amount - LAG(sales_amount) OVER (PARTITION BY salesperson ORDER BY sale_date) AS sales_difference
FROM sales;
5. 事务管理
假设有一个银行账户的 accounts 表:
| account_id | balance |
|---|---|
| 1 | 1000 |
| 2 | 2000 |
开始事务
START TRANSACTION;
UPDATE accounts SET balance = balance - 100 WHERE account_id = 1;
UPDATE accounts SET balance = balance + 100 WHERE account_id = 2;
COMMIT; -- 提交事务
如果中途出现错误,可以使用 ROLLBACK 进行回滚:
START TRANSACTION;
UPDATE accounts SET balance = balance - 100 WHERE account_id = 1;
UPDATE accounts SET balance = balance + 100 WHERE account_id = 2;
-- 假设此时发生错误
ROLLBACK; -- 回滚事务
6. 索引与查询优化
假设你有一个表 employees,包含大量员工数据,你可以创建索引来提高查询效率。
创建索引
CREATE INDEX idx_employee_name ON employees(name);
使用 EXPLAIN 分析查询
当查询执行较慢时,可以使用 EXPLAIN 查看查询的执行计划:
EXPLAIN SELECT * FROM employees WHERE name = 'John';
EXPLAIN 将展示查询是否利用了索引、表扫描的顺序等信息。
7. 复杂查询与子查询
子查询在 SELECT 中使用
查询每个学生和他们所选课程数量:
SELECT students.name,
(SELECT COUNT(*) FROM courses WHERE courses.student_id = students.id) AS course_count
FROM students;
子查询在 WHERE 中使用
查询销售额大于某个平均值的销售员:
SELECT salesperson
FROM sales
WHERE sales_amount > (SELECT AVG(sales_amount) FROM sales);
总结
这些实例展示了从简单查询到复杂查询的多种SQL用法,包括聚合函数、连接查询、窗口函数、事务管理等。通过不断实践这些操作,你可以提升SQL的应用能力,逐步应对更复杂的数据库操作。要特别注意的是,理解和掌握SQL的优化技巧,能够帮助你应对大数据量和高并发的查询需求。
[…] 通过这些系统化的学习,你将能够快速掌握SQL,并能够在实际项目中灵活运用SQL解决各种数据处理和分析问题。实用的SQL实例可参照这边文章:实用的sql实例/ […]