SQL 基础与进阶语句实战指南

小林子
小林子
发布时间:2026-10-15 | 4人浏览过
原创

掌握 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 学习及数据库优化的资料请关注本站其它相关文章!

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表