一、引言
在本学期的《MySQL 数据库技术》课程学习中,我们接触到了丰富多样的 SQL 语句,这些语句是操作 MySQL 数据库的核心工具。为了更好地掌握它们,本文将对各类 SQL 语句进行系统性的知识整理,涵盖使用规范、应用规则、易错点以及实用实战案例等方面。
二、数据定义语言(DDL)
(一)CREATE 语句
- 使用规范:用于创建数据库、表、视图、索引等数据库对象。
- 创建数据库:
CREATE DATABASE database_name; - 创建表:
CREATE TABLE table_name (column1 datatype, column2 datatype,...);
- 创建数据库:
- 应用规则:创建表时需明确各列的数据类型,如
INT(整数)、VARCHAR(可变长度字符串)、DATE(日期)等 ,并合理设置主键、外键等约束。 - 易错点:数据类型选择不当可能导致存储异常;定义主键时若未确保唯一性和非空性,会引发错误。
- 实例演示
-- 创建名为test_db的数据库 CREATE DATABASE test_db; -- 在test_db数据库中创建students表 USE test_db; CREATE TABLE students ( student_id INT PRIMARY KEY, student_name VARCHAR(50), age INT );(二)ALTER 语句
- 使用规范:用于修改已存在数据库对象的结构,如添加列、修改列的数据类型、删除列等。
- 添加列:
ALTER TABLE table_name ADD column_name datatype; - 修改列:
ALTER TABLE table_name MODIFY column_name new_datatype; - 删除列:
ALTER TABLE table_name DROP column_name;
- 添加列:
- 应用规则:修改列数据类型时要注意数据兼容性,避免数据丢失或转换错误。
- 易错点:在生产环境中直接使用
ALTER TABLE修改表结构可能影响业务连续性,且修改数据类型时若存在不兼容数据会报错。 - 实例演示
-- 向students表添加gender列 ALTER TABLE students ADD gender VARCHAR(10); -- 修改age列数据类型为BIGINT ALTER TABLE students MODIFY age BIGINT; -- 删除gender列 ALTER TABLE students DROP gender;(三)DROP 语句
- 使用规范:用于删除数据库、表、视图、索引等对象。
- 删除数据库:
DROP DATABASE database_name; - 删除表:
DROP TABLE table_name;
- 删除数据库:
- 应用规则:删除操作不可逆,执行前需谨慎确认。
- 易错点:误删重要数据库或表会造成严重数据丢失,且无简便恢复方法(除非有备份)。
- 实例演示
-- 删除test_db数据库 DROP DATABASE test_db; -- 删除students表(假设在其他数据库中已创建) DROP TABLE students;三、数据操作语言(DML)
(一)INSERT 语句
- 使用规范:用于向表中插入数据。
- 插入完整行:
INSERT INTO table_name (column1, column2,...) VALUES (value1, value2,...); - 插入部分列:
INSERT INTO table_name (column1, column3) VALUES (value1, value3);
- 插入完整行:
- 应用规则:插入值的数据类型和顺序要与列定义匹配,对于有默认值的列,若不指定值则会使用默认值。
- 易错点:值的数量与列的数量不匹配、数据类型不匹配会导致插入失败。
- 实例演示
-- 向students表插入一条完整记录 INSERT INTO students (student_id, student_name, age) VALUES (1, 'Alice', 20); -- 只插入student_id和student_name INSERT INTO students (student_id, student_name) VALUES (2, 'Bob');(二)UPDATE 语句
- 使用规范:用于修改表中已存在的数据。
- 基本语法:
UPDATE table_name SET column1 = value1, column2 = value2,... WHERE condition;
- 基本语法:
- 应用规则:
WHERE子句用于限定修改范围,若无WHERE子句则会修改表中所有行。 - 易错点:忘记写
WHERE子句可能导致全表数据被错误修改。 - 实例演示
-- 将students表中student_id为1的学生年龄改为21 UPDATE students SET age = 21 WHERE student_id = 1;(三)DELETE 语句
- 使用规范:用于删除表中的数据行。
- 基本语法:
DELETE FROM table_name WHERE condition;
- 基本语法:
- 应用规则:同样通过
WHERE子句指定删除条件,若无WHERE子句将删除表中所有数据。 - 易错点:误删数据且无备份时难以恢复,使用时务必谨慎。
- 实例演示
-- 删除students表中student_id为2的学生记录 DELETE FROM students WHERE student_id = 2;四、数据查询语言(DQL) - SELECT 语句
(一)基本查询
- 使用规范:
SELECT column1, column2,... FROM table_name; - 应用规则:可选择特定列查询,也可用
*查询所有列;可使用AS关键字为列或表取别名。 - 易错点:查询所有列(
SELECT *)可能导致性能问题,尤其是表结构复杂、列数多的情况。 - 实例演示
-- 查询students表的所有列 SELECT * FROM students; -- 查询student_name和age列,并给列取别名 SELECT student_name AS name, age AS student_age FROM students;(二)条件查询
- 使用规范:
SELECT column1, column2,... FROM table_name WHERE condition; - 应用规则:
WHERE子句中可使用比较运算符(=,>,<,>=,<=,!=)、逻辑运算符(AND,OR,NOT)、模糊匹配(LIKE)、范围判断(BETWEEN... AND...)、空值判断(IS NULL,IS NOT NULL)等。 - 易错点:模糊匹配时通配符使用不当,如
%和_含义混淆;逻辑运算符优先级理解错误可能导致条件判断错误。 - 实例演示
-- 查询年龄大于20的学生姓名和年龄 SELECT student_name, age FROM students WHERE age > 20; -- 查询姓名以'A'开头的学生 SELECT student_name FROM students WHERE student_name LIKE 'A%'; -- 查询年龄在18到22之间的学生 SELECT student_name, age FROM students WHERE age BETWEEN 18 AND 22;(三)分组查询
- 使用规范:
SELECT column1, aggregate_function(column2) FROM table_name GROUP BY column1; - 应用规则:常用聚合函数有
SUM(求和)、AVG(求平均值)、COUNT(计数)、MAX(求最大值)、MIN(求最小值) ;GROUP BY子句用于指定分组依据。 - 易错点:在
SELECT子句中出现未在GROUP BY中指定的非聚合列可能导致错误(不同数据库规则有差异)。 - 实例演示
-- 按年龄分组,统计每个年龄的学生人数 SELECT age, COUNT(student_id) AS student_count FROM students GROUP BY age; -- 计算每个年龄学生的平均年龄(实际无意义,仅作演示) SELECT age, AVG(age) AS avg_age FROM students GROUP BY age;(四)连接查询
- 内连接(INNER JOIN)
- 使用规范:
SELECT column1, column2,... FROM table1 INNER JOIN table2 ON table1.column = table2.column; - 应用规则:用于获取两个表中满足连接条件的行,连接条件通常是两表中相关列相等。
- 易错点:连接条件错误可能导致结果集数据不准确。
- 实例演示
-- 假设存在scores表,有student_id和score列,查询学生姓名和对应成绩 SELECT s.student_name, sc.score FROM students s INNER JOIN scores sc ON s.student_id = sc.student_id; - 左连接(LEFT JOIN)
- 使用规范:
SELECT column1, column2,... FROM table1 LEFT JOIN table2 ON table1.column = table2.column; - 应用规则:返回左表(
table1)的所有行和右表(table2)满足连接条件的行,若右表无匹配行则用NULL填充。 - 易错点:对左连接和内连接结果差异理解不清,可能导致选择错误连接类型。
- 实例演示
-- 查询所有学生姓名及对应成绩(即使无成绩记录也显示学生信息) SELECT s.student_name, sc.score FROM students s LEFT JOIN scores sc ON s.student_id = sc.student_id; - 右连接(RIGHT JOIN)
- 使用规范:
SELECT column1, column2,... FROM table1 RIGHT JOIN table2 ON table1.column = table2.column; - 应用规则:与左连接相反,返回右表的所有行和左表满足连接条件的行,左表无匹配行时用
NULL填充。 - 易错点:同左连接易错点,混淆不同连接类型的结果。
- 实例演示
-- 假设需求变为以scores表为主,查询成绩及对应学生姓名(即使学生信息缺失也显示成绩记录) SELECT s.student_name, sc.score FROM students s RIGHT JOIN scores sc ON s.student_id = sc.student_id;(五)子查询
- 使用规范:子查询是在一个
SELECT语句中嵌套另一个SELECT语句,可用于WHERE子句、FROM子句等。- 在
WHERE子句中:SELECT column1, column2,... FROM table_name WHERE column IN (subquery);
- 在
- 应用规则:子查询结果可作为条件判断依据,如
IN、ANY、ALL等操作符可与子查询配合使用;相关子查询会根据外部查询的每一行来执行。 - 易错点:相关子查询可能导致性能问题,因为其执行次数较多;子查询结果集过大也可能影响性能。
- 实例演示
-- 查询成绩高于平均成绩的学生姓名和成绩 SELECT student_name, score FROM students s JOIN scores sc ON s.student_id = sc.student_id WHERE sc.score > (SELECT AVG(score) FROM scores);五、数据控制语言(DCL)
(一)GRANT 语句
- 使用规范:用于授予用户对数据库对象的权限。
- 基本语法:
GRANT privilege_type ON object_name TO user_name;
- 基本语法:
- 应用规则:
privilege_type可包括SELECT、INSERT、UPDATE、DELETE等权限;object_name可以是数据库、表等;user_name指定被授权用户。 - 易错点:授予过多权限可能带来安全风险,如将
ALL PRIVILEGES随意授予普通用户。 - 实例演示
-- 授予user1用户对students表的SELECT权限 GRANT SELECT ON students TO user1;(二)REVOKE 语句
- 使用规范:用于收回用户已被授予的权限。
- 基本语法:
REVOKE privilege_type ON object_name FROM user_name;
- 基本语法:
- 应用规则:与
GRANT语句对应,明确要收回的权限、对象和用户。 - 易错点:误收回关键权限可能影响业务正常运行,操作前需确认。
- 实例演示
-- 收回user1用户对students表的SELECT权限 REVOKE SELECT ON students FROM user1;六、总结与反思
通过对各类 SQL 语句的整理,我们对 MySQL 数据库操作有了更系统的认识。在学习过程中,我发现自己对复杂连接查询和性能优化方面还存在不足。对于连接查询,尤其是多表连接时,连接条件的准确设置和不同连接类型的选择还需进一步练习;在性能优化上,子查询和索引的合理使用理解不够深入。后续我将通过更多实战项目来加强这些方面的学习,同时定期复习 SQL 语句的使用,不断提升自己在 MySQL 数据库操作方面的能力。
希望这篇博文能对大家理解和掌握 SQL 语句有所帮助,也欢迎大家在评论区交流学习心得和遇到的问题。
- 使用规范:
- 使用规范:
- 使用规范:

835

被折叠的 条评论
为什么被折叠?



