SQL 基础与进阶语句实战指南
掌握 SQL 是进行数据处理的基础。本文从数据库对象创建、数据增删改、复杂查询逻辑到用户权限管理四个维度,整理了最常用且实用的 SQL 语句结构。
1. DDL 数据定义语言:构建数据库骨架
数据定义语言(DDL)用于定义或修改数据库的结构。在使用前需确保已理解相关参数的含义,特别是涉及删除操作时务必谨慎。
第1步:数据库管理与配置
此部分操作针对数据库实例本身,用于创建环境或调整全局属性。
- 创建:使用
CREATE DATABASE。推荐配合IF NOT EXISTS防止重复创建报错。 - 查看:使用
SHOW DATABASES列出所有库;使用SHOW CREATE DATABASE db_name查看特定库的定义信息。 - 修改:使用
ALTER DATABASE修改字符集(如CHARACTER SET utf8)。 - 删除:使用
DROP DATABASE db_name。警告:此操作将永久移除该数据库及其中的所有内容,执行前请确认备份。
第2步:表结构的定义与维护
表是数据存储的基本单元,以下代码展示了创建学生表及管理其结构的标准化流程。
-- 创建表:指定字段名、类型及约束
CREATE TABLE student(
id INT,
name VARCHAR(32),
age INT,
score DOUBLE(4,1),
birthday DATE,
insert_time TIMESTAMP
);
-- 查看表结构描述
DESC student;
-- 查看完整的建表语句
SHOW CREATE TABLE student;
-- 修改表名(重命名)
ALTER TABLE student RENAME TO new_student;列级操作:
- 添加列:
ALTER TABLE table_name ADD column_name data_type; - 删除列:
ALTER TABLE table_name DROP column_name;
表级删除:
-- 安全删除(不存在也不报错) DROP TABLE IF EXISTS student;
2. DML 数据操作语言:数据增删改
数据操作语言(DML)用于对表中存储的具体数据进行维护。执行更新或删除前,强烈建议备份关键数据或先使用 SELECT 验证影响范围。
第1步:插入数据 (INSERT)
根据是否需要指定列名,分为全列插入和部分列插入两种模式。
-- 指定列名插入(推荐,更清晰且允许忽略非空默认值列)
INSERT INTO student(name, age, score) VALUES('张三', 20, 95.5);
-- 全列插入(必须按表结构顺序提供所有值)
INSERT INTO student VALUES(1, '李四', 22, 88.0, '2000-01-01', NOW());
-- 批量插入示例
INSERT INTO student(name, age) VALUES('王五', 19), ('赵六', 21);第2步:删除数据 (DELETE & TRUNCATE)
条件删除:必须配合 WHERE 子句,否则将清空全表。建议使用事务回滚测试。
-- 删除年龄为 20 的学生 DELETE FROM student WHERE age = 20; -- 警告:以下语句将删除表中所有数据 DELETE FROM student;
快速清空:若需保留表结构但极速清除所有数据,可使用 TRUNCATE。它通常比 DELETE 更快,因为它直接重置了表的自增计数器和数据文件。
第3步:修改数据 (UPDATE)
无条件修改:会更新所有行的指定字段,风险极高。
-- 将所有学生的分数加 5 分 UPDATE student SET score = score + 5;
有条件修改:
-- 将姓名'张三'的年龄改为 21 UPDATE student SET age = 21 WHERE name = '张三';
3. DQL 数据查询语言:检索与分析
数据查询语言(DQL)是 SQL 中最常用的部分,包含过滤、排序、聚合及复杂的关联操作。
第1步:基础过滤与匹配
使用逻辑运算符组合条件。推荐使用 ANSI 标准的 AND/OR/NOT 代替 &&//|| 以提高兼容性。
- 区间与集合:
BETWEEN...AND(闭区间)、IN(值列表)。 - 模糊匹配:使用
LIKE。%代表任意长度字符,_代表单个字符。例如:NAME LIKE '马%'查找姓马的人。 - 空值判断:使用
IS NULL或IS NOT NULL(不能用 = 判断 null)。 - 去重:使用
DISTINCT返回唯一值。
第2步:排序与分页
- 排序:
ORDER BY 字段 [ASC|DESC]。默认为升序(ASC),降序使用 DESC。支持多字段排序。 - 分页:
LIMIT offset, count。公式:起始索引 = (页码 - 1) * 每页条数。注:LIMIT是 MySQL 方言,Oracle 和 PostgreSQL 语法不同。
第3步:聚合函数
对列数据进行纵向计算,常与 GROUP BY 配合使用。
| 函数 | 作用 |
|---|---|
| COUNT() | 计数(忽略 NULL) |
| SUM() | 求和 |
| AVG() | 平均值 |
| MAX() / MIN() | 最大值 / 最小值 |
第4步:分组查询 (GROUP BY)
将数据按指定字段分组。在 SELECT 列表中,只能出现分组字段或聚合函数。
-- 查询各部门的平均工资和人数 SELECT dept_id, AVG(salary), COUNT(id) FROM emp GROUP BY dept_id;
HAVING 子句:用于对分组后的结果进行过滤(不同于 WHERE 对原始行过滤)。
-- 仅显示平均工资大于 8000 的部门 SELECT dept_id, AVG(salary) avg_sal FROM emp GROUP BY dept_id HAVING avg_sal > 8000;
第5步:多表连接 (JOIN)
关系型数据库的核心能力,通过公共字段关联多个表。
- 内连接 (INNER JOIN):只返回两个表中联结字段相等的行。
SELECT e.name, d.dept_name FROM emp e INNER JOIN dept d ON e.dept_id = d.id;
- 左外连接 (LEFT JOIN):返回左表所有记录,右表无匹配则填充 NULL。
- 右外连接 (RIGHT JOIN):返回右表所有记录,左表无匹配则填充 NULL。
第6步:子查询
嵌套在其他查询中的查询语句,用于动态获取比较值或临时表。
-- 场景:查找工资高于公司平均工资的员工 SELECT * FROM emp WHERE salary > (SELECT AVG(salary) FROM emp);
- 单行单列结果:可作为条件比较(=, >, <)。
- 多行单列结果:配合
IN使用,如查找属于特定部门ID的员工。 - 多行多列结果:可作为虚拟表参与 JOIN 查询。
4. DCL 数据控制语言:安全管理
DCL 用于管理数据库用户的访问权限,保障数据安全。
第1步:用户账户管理
- 创建用户:
CREATE USER 'username'@'host' IDENTIFIED BY 'password'; - 删除用户:
DROP USER 'username'@'host';
第2步:权限分配与控制
遵循最小权限原则,不应随意授予 ALL 权限。
- 授予权限:
GRANT privilege_list ON database.table TO 'user'@'host'; - 撤销权限:
REVOKE privilege_list ON database.table FROM 'user'@'host'; - 查看所有权限:
SHOW GRANTS FOR 'user'@'host';
总结
SQL 语句的学习重在逻辑而非死记硬背。建议在实际操作中优先使用显式的 INNER JOIN 替代隐式连接以提高可读性,并在执行 DELETE 和 UPDATE 时养成先 SELECT 验证条件的习惯。
以上就是 SQL 常用语句大全的详细内容,更多关于 SQL 学习及数据库优化的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













