SQL核心语法与实战应用指南
1. DDL(数据定义语言)
(1) 创建表(CREATE TABLE)
-- 创建学生表
CREATE TABLE students (student_id INT PRIMARY KEY AUTO_INCREMENT, -- 主键,自增name VARCHAR(50) NOT NULL, -- 非空约束age INT CHECK (age >= 16), -- 检查约束(年龄≥16)email VARCHAR(100) UNIQUE, -- 唯一约束enrollment_date DATE DEFAULT CURRENT_DATE -- 默认值
);-- 创建课程表(外键关联学生表)
CREATE TABLE courses (course_id INT PRIMARY KEY,course_name VARCHAR(50),student_id INT,FOREIGN KEY (student_id) REFERENCES students(student_id) -- 外键约束
);
(2) 修改表结构(ALTER TABLE)
-- 添加列
ALTER TABLE students ADD COLUMN gender CHAR(1);-- 修改列数据类型
ALTER TABLE students MODIFY COLUMN age SMALLINT;-- 删除列
ALTER TABLE students DROP COLUMN email;-- 重命名表
ALTER TABLE students RENAME TO learners;
(3) 删除表(DROP TABLE)
-- 删除表(不可恢复)
DROP TABLE courses;-- 仅删除数据,保留表结构
TRUNCATE TABLE students;
2. DML(数据操作语言)
(1) 插入数据(INSERT)
-- 插入单条数据
INSERT INTO students (name, age, email)
VALUES ('张三', 18, 'zhangsan@example.com');-- 插入多条数据
INSERT INTO students (name, age)
VALUES ('李四', 20), ('王五', 19);
(2) 更新数据(UPDATE)
-- 更新所有行的age列
UPDATE students SET age = age + 1;-- 条件更新
UPDATE students SET email = 'lisi@example.com' WHERE name = '李四';
(3) 删除数据(DELETE)
-- 删除特定行
DELETE FROM students WHERE age < 18;-- 删除所有数据(慎用!)
DELETE FROM students;
(4) 查询数据(SELECT)
-- 基本查询
SELECT name, age FROM students;-- 条件查询(WHERE)
SELECT * FROM students WHERE age > 18 AND name LIKE '张%';-- 排序(ORDER BY)
SELECT * FROM students ORDER BY age DESC;-- 分页(LIMIT)
SELECT * FROM students LIMIT 10 OFFSET 5; -- 跳过前5条,取10条
3. 高级查询
(1) 连接查询(JOIN)
连接类型 | 说明 | 示例 |
---|---|---|
INNER JOIN | 返回两表匹配的行 |
SELECT s.name, c.course_name
FROM students s
INNER JOIN courses c ON s.student_id = c.student_id;
| LEFT JOIN | 返回左表所有行,右表不匹配则为NULL |
SELECT s.name, c.course_name
FROM students s
LEFT JOIN courses c ON s.student_id = c.student_id;
| FULL JOIN | 返回两表所有行(MySQL不支持,可用UNION模拟) |
SELECT s.name, c.course_name
FROM students s
LEFT JOIN courses c ON s.student_id = c.student_id
UNION
SELECT s.name, c.course_name
FROM students s
RIGHT JOIN courses c ON s.student_id = c.student_id;
(2) 子查询(Subquery)
-- WHERE子句中的子查询
SELECT name FROM students
WHERE student_id IN (SELECT student_id FROM courses WHERE course_name = '数学');-- FROM子句中的子查询(派生表)
SELECT avg_age.name FROM
(SELECT name FROM students WHERE age > 18) AS avg_age;-- SELECT子句中的子查询
SELECT name, (SELECT COUNT(*) FROM courses WHERE student_id = s.student_id) AS course_count
FROM students s;
(3) 聚合函数(GROUP BY + HAVING)
-- 统计每个年龄段的学生人数
SELECT age, COUNT(*) AS student_count
FROM students
GROUP BY age;-- 筛选分组结果(HAVING)
SELECT age, COUNT(*) AS student_count
FROM students
GROUP BY age
HAVING COUNT(*) > 5; -- 只显示人数>5的组-- 常用聚合函数
SELECT AVG(age) AS avg_age, -- 平均值MAX(age) AS max_age, -- 最大值MIN(age) AS min_age, -- 最小值SUM(age) AS total_age -- 总和
FROM students;
4. 实际应用场景
(1) 电商系统查询
-- 查询订单总金额大于1000的用户
SELECT u.user_name, SUM(o.amount) AS total_amount
FROM users u
JOIN orders o ON u.user_id = o.user_id
GROUP BY u.user_id
HAVING SUM(o.amount) > 1000;
(2) 数据分析(窗口函数)
-- 计算每个学生的年龄排名
SELECT name, age,RANK() OVER (ORDER BY age DESC) AS age_rank
FROM students;
总结
SQL类别 | 核心操作 | 典型用途 |
---|---|---|
DDL | CREATE , ALTER , DROP | 定义和管理表结构 |
DML | INSERT , UPDATE , DELETE , SELECT | 数据增删改查 |
高级查询 | JOIN , 子查询 , GROUP BY , 聚合函数 | 复杂数据分析 |
掌握这些SQL语法后,可以灵活操作数据库,适用于:
- 业务系统开发(如用户管理、订单查询)
- 数据分析(如统计报表、数据透视)
- 数据库优化(如索引设计、查询性能调优)