作为一个程序员,不掌握SQL怎么行?掌握SQL是数据管理和分析的必备技能,本教程将带你系统学习SQL的核心命令和实用技巧,从入门到精通。

什么是SQL?
SQL(Structured Query Language)是用于管理和操作关系型数据库的标准语言。通过SQL,你可以:
- 创建和管理数据库和表
- 插入、更新和删除数据
- 查询和分析数据
- 设置访问权限
- 管理事务
SQL主要分为四类命令:
- DDL(数据定义语言) - 创建/修改数据库结构
- DML(数据操作语言) - 操作数据
- DQL(数据查询语言) - 查询数据
- DCL(数据控制语言) - 控制访问权限
一、数据库操作
创建数据库
CREATE DATABASE school_db;查看所有数据库
SHOW DATABASES;选择数据库
USE school_db;删除数据库
DROP DATABASE school_db;二、表操作
创建表
CREATE TABLE students (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50) NOT NULL,
age INT CHECK (age >= 15),
email VARCHAR(100) UNIQUE,
enrollment_date DATE DEFAULT CURRENT_DATE
);查看表结构
DESCRIBE students;修改表结构
-- 添加新列
ALTER TABLE students ADD COLUMN major VARCHAR(50);
-- 修改列类型
ALTER TABLE students MODIFY COLUMN age SMALLINT;
-- 删除列
ALTER TABLE students DROP COLUMN email;删除表
DROP TABLE students;三、数据操作(CRUD)
插入数据
INSERT INTO students (name, age, enrollment_date)
VALUES
('张三', 18, '2023-09-01'),
('李四', 19, '2023-08-25'),
('王五', 17, '2023-09-05');查询数据
-- 查询所有列
SELECT * FROM students;
-- 查询特定列
SELECT name, age FROM students;
-- 带条件查询
SELECT * FROM students WHERE age > 18;更新数据
UPDATE students
SET age = 20
WHERE name = '张三';删除数据
DELETE FROM students
WHERE name = '王五';四、高级查询技巧
排序结果
SELECT * FROM students
ORDER BY age DESC, name ASC;限制结果数量
SELECT * FROM students
ORDER BY enrollment_date DESC
LIMIT 5;模糊查询
SELECT * FROM students
WHERE name LIKE '张%';聚合函数
SELECT
COUNT(*) AS total_students,
AVG(age) AS average_age,
MIN(enrollment_date) AS earliest_enrollment,
MAX(age) AS max_age
FROM students;分组统计
SELECT
major,
COUNT(*) AS student_count,
AVG(age) AS avg_age
FROM students
GROUP BY major
HAVING COUNT(*) > 5;五、表连接
创建课程表
CREATE TABLE courses (
course_id INT PRIMARY KEY AUTO_INCREMENT,
course_name VARCHAR(50),
instructor VARCHAR(50)
);
CREATE TABLE enrollments (
student_id INT,
course_id INT,
enrollment_date DATE,
FOREIGN KEY (student_id) REFERENCES students(id),
FOREIGN KEY (course_id) REFERENCES courses(course_id)
);内连接
SELECT s.name, c.course_name
FROM students s
INNER JOIN enrollments e ON s.id = e.student_id
INNER JOIN courses c ON e.course_id = c.course_id;左连接
SELECT s.name, c.course_name
FROM students s
LEFT JOIN enrollments e ON s.id = e.student_id
LEFT JOIN courses c ON e.course_id = c.course_id;六、子查询
单行子查询
SELECT * FROM students
WHERE age > (SELECT AVG(age) FROM students);多行子查询
SELECT * FROM courses
WHERE course_id IN (
SELECT course_id FROM enrollments
GROUP BY course_id
HAVING COUNT(*) > 30
);七、索引优化
创建索引
-- 单列索引
CREATE INDEX idx_student_name ON students(name);
-- 复合索引
CREATE INDEX idx_student_age_name ON students(age, name);
-- 唯一索引
CREATE UNIQUE INDEX idx_unique_email ON students(email);查看索引
SHOW INDEX FROM students;删除索引
DROP INDEX idx_student_name ON students;八、视图
创建视图
CREATE VIEW student_summary AS
SELECT
s.id,
s.name,
COUNT(e.course_id) AS courses_enrolled
FROM students s
LEFT JOIN enrollments e ON s.id = e.student_id
GROUP BY s.id, s.name;使用视图
SELECT * FROM student_summary
WHERE courses_enrolled > 3;删除视图
DROP VIEW student_summary;九、事务管理
START TRANSACTION;
-- 一系列操作
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;
-- 提交事务
COMMIT;
-- 或回滚事务
-- ROLLBACK;十、最佳实践
- 命名规范:使用有意义的表名和列名(如
student_id而非sid) - **避免SELECT ***:只选择需要的列
- 使用参数化查询:防止SQL注入攻击
- 索引优化:为经常查询的列创建索引
- 定期备份:使用
mysqldump或类似工具
mysqldump -u username -p database_name > backup.sql常见错误处理
权限问题
-- 授予权限
GRANT SELECT, INSERT ON school_db.* TO 'user'@'localhost';
-- 撤销权限
REVOKE INSERT ON school_db.* FROM 'user'@'localhost';保留关键字冲突
-- 使用反引号包裹关键字
CREATE TABLE `user` (
`id` INT PRIMARY KEY,
`name` VARCHAR(50)
);学习资源推荐
- SQLZoo - 交互式SQL学习平台
- W3Schools SQL教程 - 基础到进阶教程
- SQL Fiddle - 在线SQL测试环境
- LeetCode数据库题库 - 实战练习题
通过本教程,你已经掌握了SQL的核心概念和常用命令。持续练习是提高SQL技能的关键 - 尝试创建自己的数据库项目,解决实际问题,你将成为SQL专家!

