【SQL语句大全】:掌握20年DBA总结的99条高频SQL写法,效率提升300%

第一章:SQL语句大全概述

SQL(Structured Query Language)是用于管理和操作关系型数据库的标准语言。它不仅支持数据的增删改查,还能定义数据库结构、控制访问权限以及维护数据完整性。掌握全面的SQL语句对于数据库开发、运维和数据分析至关重要。

SQL语句的主要分类

SQL语句通常分为以下几类,每类对应不同的数据库操作场景:
  • DDL(数据定义语言):用于定义或修改数据库结构,如创建表、修改表结构等。
  • DML(数据操作语言):用于操作表中的数据,包括插入、更新和删除记录。
  • DQL(数据查询语言):以 SELECT 为核心,用于检索数据。
  • DCL(数据控制语言):用于管理用户权限,如 GRANT 和 REVOKE。
  • TCL(事务控制语言):用于管理事务,如 COMMIT、ROLLBACK。

常用SQL语句示例

以下是一个典型的建表与数据插入语句示例:
-- 创建用户表
CREATE TABLE users (
  id INT PRIMARY KEY AUTO_INCREMENT,
  name VARCHAR(50) NOT NULL,
  email VARCHAR(100) UNIQUE,
  created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);

-- 插入一条用户记录
INSERT INTO users (name, email) VALUES ('张三', 'zhangsan@example.com');
上述代码首先使用 DDL 语句创建一个名为 users 的表,包含主键、姓名、邮箱和创建时间字段;随后通过 DML 语句插入一条用户数据。

SQL执行逻辑说明

在执行这些语句时,数据库引擎会先解析语法,检查对象是否存在,然后应用相应的存储引擎操作。例如,INSERT 语句会在表中新增一行,并触发默认值填充(如 CURRENT_TIMESTAMP)。
语句类型关键字示例用途
DDLCREATE, ALTER, DROP定义数据库结构
DMLINSERT, UPDATE, DELETE操作数据记录
DQLSELECT查询数据

第二章:数据查询与筛选优化

2.1 SELECT语句基础与别名使用技巧

在SQL查询中,SELECT语句是获取数据的核心工具。最基本的语法结构包括指定字段和数据源表:
SELECT employee_id, first_name, last_name 
FROM employees;
该语句从employees表中检索三个字段的数据。若字段名较长或需增强可读性,可使用别名(Alias)简化输出列名。
别名的使用方法
通过AS关键字为字段或表达式设置别名:
SELECT employee_id AS "员工编号", 
       salary * 12 AS "年收入"
FROM employees;
此处将计算后的年薪显示为“年收入”,提升结果可读性。别名也可省略AS,直接书写名称,但建议保留以增强代码清晰度。
  • 别名仅在查询结果中生效,不影响原始数据
  • 支持中文别名,便于团队理解
  • 可用于函数表达式、连接字段等复杂场景

2.2 WHERE条件过滤与运算符高效组合

在SQL查询中,WHERE子句是实现数据筛选的核心工具。通过合理组合比较运算符(如=>INLIKE)与逻辑运算符(ANDORNOT),可精准定位目标数据集。
常用运算符组合示例
SELECT user_id, name, age 
FROM users 
WHERE age >= 18 
  AND (city = 'Beijing' OR city IN ('Shanghai', 'Guangzhou'))
  AND register_date LIKE '2023-%';
上述语句筛选出成年且来自指定城市的用户。其中: - age >= 18 使用比较运算符; - ANDOR 构建复合条件; - IN 提升多值匹配效率; - LIKE 实现模式匹配,限定年份注册记录。
性能优化建议
  • 优先使用索引列作为过滤条件
  • 避免在条件字段上使用函数导致索引失效
  • 利用括号明确逻辑优先级,提升可读性

2.3 排序与分页:ORDER BY与LIMIT实践

在处理数据库查询结果时,排序与分页是提升用户体验和系统性能的关键操作。通过 `ORDER BY` 可对结果集按指定列排序,结合 `LIMIT` 可实现高效的数据分页。
基础语法结构
SELECT id, name, created_at 
FROM users 
ORDER BY created_at DESC 
LIMIT 10 OFFSET 20;
该语句按创建时间倒序排列用户数据,跳过前20条记录并取接下来的10条,常用于实现分页功能。`DESC` 表示降序,`ASC`(默认)为升序;`LIMIT 10` 控制返回数量,`OFFSET 20` 指定偏移量。
性能优化建议
  • 在排序字段上建立索引,如 `created_at`,以避免全表扫描
  • 避免大偏移量的 `OFFSET`,可采用“游标分页”(基于上一页最后一条记录的值)提升效率
  • 复合查询中确保索引覆盖排序与过滤字段

2.4 聚合函数与GROUP BY性能优化策略

在处理大规模数据聚合时,合理使用索引和优化 GROUP BY 执行路径至关重要。数据库引擎通常会通过排序或哈希表实现分组操作,选择合适的策略可显著提升查询效率。
避免全表扫描
为参与 GROUP BY 和 WHERE 条件的列建立复合索引,可减少数据扫描量。例如:
CREATE INDEX idx_sales_date_product ON sales (sale_date, product_id);
该索引支持按销售日期和产品分组的聚合查询,避免临时表和文件排序。
优化聚合计算
优先使用索引覆盖扫描,使查询仅通过索引即可完成。若查询仅需统计数量:
SELECT product_id, COUNT(*) FROM sales GROUP BY product_id;
确保 product_id 有索引,数据库可直接从索引页读取键值并计数,大幅减少 I/O 开销。
  • 尽量减少 GROUP BY 后的字段数量
  • 避免在聚合字段上使用函数包装
  • 考虑使用物化视图预计算高频聚合结果

2.5 HAVING过滤与查询逻辑层级设计

在SQL查询中,HAVING子句用于对分组后的结果进行过滤,常与GROUP BY配合使用。与WHERE不同,HAVING作用于聚合函数,实现更复杂的条件筛选。
执行顺序解析
SQL查询的逻辑执行顺序决定了HAVING的位置:
  1. FROM → JOIN → ON
  2. WHERE
  3. GROUP BY
  4. HAVING
  5. SELECT
  6. ORDER BY
代码示例与分析
SELECT department, AVG(salary) AS avg_sal
FROM employees
GROUP BY department
HAVING AVG(salary) > 8000;
该语句先按部门分组,计算平均薪资,再通过HAVING过滤出平均薪资超过8000的部门。WHERE无法在此场景使用,因其不能引用聚合函数。
性能优化建议
  • 优先在WHERE中过滤无效行,减少分组数据量
  • 避免在HAVING中使用复杂表达式

第三章:多表关联与复杂查询构建

3.1 内连接与外连接的应用场景解析

在数据库查询中,内连接(INNER JOIN)和外连接(LEFT/RIGHT JOIN)适用于不同的业务逻辑场景。
内连接:获取交集数据
当需要仅返回两表中匹配的记录时,使用内连接。例如订单与用户表关联查询有效订单:
SELECT u.name, o.order_id 
FROM users u 
INNER JOIN orders o ON u.id = o.user_id;
该语句仅返回存在对应用户的订单,确保数据完整性。
外连接:保留非匹配记录
左外连接可用于统计所有用户及其订单数,即使某用户无订单:
SELECT u.name, COUNT(o.order_id) 
FROM users u 
LEFT JOIN orders o ON u.id = o.user_id 
GROUP BY u.id;
此时,未下单用户仍会出现在结果中,订单计数为0,适用于报表类场景。
连接类型适用场景
INNER JOIN数据必须同时存在于两表
LEFT JOIN以左表为主,补充右表信息

3.2 子查询的执行机制与改写优化

子查询在SQL执行中常被视为独立单元,由内向外逐层求值。数据库优化器会根据上下文决定是否将子查询展开为等价的JOIN操作,以提升执行效率。
执行流程解析
对于相关子查询,外部行每变动一次,子查询便重新执行一次,性能开销较大。而非相关子查询仅执行一次,结果缓存复用。
常见改写策略
  • 将IN子查询改写为Semi-Join
  • 将EXISTS转换为反连接(Anti-Join)以过滤数据
  • 将标量子查询提升为LEFT JOIN
-- 原始语句
SELECT name FROM employees e 
WHERE salary > (SELECT AVG(salary) FROM employees WHERE dept = e.dept);

-- 改写后
SELECT e.name 
FROM employees e 
JOIN (SELECT dept, AVG(salary) AS avg_sal FROM employees GROUP BY dept) t
ON e.dept = t.dept AND e.salary > t.avg_sal;
改写后避免了相关子查询的重复计算,通过预聚合与JOIN实现等价逻辑,显著降低执行代价。

3.3 UNION与EXISTS在复杂业务中的实战用法

在处理多源数据整合时,UNION 能有效合并多个查询结果集。例如,在用户行为分析中需合并登录日志和交易日志:
-- 合并登录与交易事件流
SELECT user_id, 'login' AS event_type, timestamp 
FROM login_logs 
WHERE timestamp > '2024-01-01'
UNION
SELECT user_id, 'transaction', create_time 
FROM orders 
WHERE create_time > '2024-01-01'
ORDER BY timestamp DESC;
该查询将两类事件统一为时间序列流,便于后续分析用户转化路径。 而 EXISTS 更适用于存在性判断场景,如筛选出有订单记录的活跃用户:
-- 检查用户是否存在订单
SELECT u.user_id, u.email 
FROM users u 
WHERE EXISTS (
    SELECT 1 FROM orders o 
    WHERE o.user_id = u.user_id 
    AND o.status = 'paid'
);
相比 IN 子句,EXISTS 在大表关联时性能更优,因其一旦匹配即返回真值,支持早期终止。

第四章:数据操作与事务控制

4.1 INSERT语句批量插入性能提升方案

在高并发数据写入场景中,单条INSERT语句的逐条插入方式效率低下。通过批量插入可显著减少网络往返和事务开销。
使用多值INSERT提升吞吐量
INSERT INTO users (id, name, email) VALUES 
(1, 'Alice', 'alice@example.com'),
(2, 'Bob', 'bob@example.com'),
(3, 'Charlie', 'charlie@example.com');
该方式将多行数据合并为一条SQL语句,减少了语句解析和执行的开销。建议每批次控制在500~1000条,避免日志过大或锁竞争。
优化策略对比
方法吞吐量(行/秒)适用场景
单条INSERT~500低频写入
批量INSERT~15,000批量导入
LOAD DATA INFILE~50,000大文件导入

4.2 UPDATE与DELETE的安全写法与回滚设计

在执行数据修改操作时,安全的UPDATE与DELETE语句必须结合事务控制与条件约束,防止误操作导致数据丢失。
使用事务保障操作可回滚
BEGIN TRANSACTION;

UPDATE users 
SET status = 'inactive' 
WHERE id = 1001 AND version = 2;

-- 验证更新影响行数
SELECT ROW_COUNT(); -- 应返回预期值

-- 确认无误后提交,否则 ROLLBACK
COMMIT; -- 或 ROLLBACK;
通过显式事务包裹操作,可在发现问题时回滚。WHERE子句应包含足够精确的条件,如主键与版本号,避免误改其他记录。
软删除替代硬删除
  • 使用is_deleted标记代替DELETE语句
  • 保留原始数据,便于后续恢复
  • 配合定时归档策略清理历史数据
操作前备份关键数据
操作类型推荐前置动作
UPDATE备份原记录到日志表
DELETE插入副本至archive表

4.3 TRUNCATE与DROP的合理选择与影响分析

在数据库维护过程中,TRUNCATE 与 DROP 是两种常见的数据清除手段,但其应用场景和影响差异显著。
操作特性对比
  • TRUNCATE:快速清空表中所有数据,保留表结构,重置自增列。
  • DROP:删除整个表结构及数据,释放存储空间,不可逆。
执行效率与日志影响
TRUNCATE TABLE user_log;
该操作属于 DDL 操作,仅记录元数据变更,日志开销小,执行迅速。适用于临时表清理。
DROP TABLE backup_data;
彻底移除表对象,需重新建表才能使用,适合废弃表的资源回收。
选择建议
场景推荐操作
清空数据,保留结构TRUNCATE
不再需要表定义DROP

4.4 事务控制:BEGIN、COMMIT与ROLLBACK实战

在数据库操作中,事务是确保数据一致性的核心机制。通过 `BEGIN`、`COMMIT` 和 `ROLLBACK` 可精确控制事务的执行边界。
事务基本流程
使用 `BEGIN` 启动事务,后续操作处于临时状态,直到明确提交或回滚。

BEGIN;
UPDATE accounts SET balance = balance - 100 WHERE user_id = 1;
UPDATE accounts SET balance = balance + 100 WHERE user_id = 2;
COMMIT;
上述代码先开启事务,完成转账后提交。若中途出错,可执行 `ROLLBACK` 撤销所有变更,保障账户总额一致性。
异常处理策略
  • 遇到约束冲突或系统异常时,应立即回滚
  • 长事务需设置超时,避免锁资源占用
  • 建议在应用程序中结合 try-catch 使用事务控制语句

第五章:附录与高频语句速查表

常用 Git 操作命令速查
  • git clone <repository-url>:克隆远程仓库到本地
  • git checkout -b feature/login:创建并切换到新分支
  • git add .:暂存所有变更文件
  • git commit -m "fix: 登录逻辑漏洞":提交带规范类型的消息
  • git push origin HEAD:推送当前分支到远程对应分支
Go 语言并发模式示例

// 启动多个 worker 并通过 channel 协调任务
func worker(id int, jobs <-chan int, results chan<- int) {
    for job := range jobs {
        fmt.Printf("Worker %d processing job %d\n", id, job)
        results <- job * 2
    }
}

func main() {
    jobs := make(chan int, 100)
    results := make(chan int, 100)

    // 启动 3 个 worker
    for w := 1; w <= 3; w++ {
        go worker(w, jobs, results)
    }

    // 发送 5 个任务
    for j := 1; j <= 5; j++ {
        jobs <- j
    }
    close(jobs)

    // 收集结果
    for a := 1; a <= 5; a++ {
        <-results
    }
}
常见 HTTP 状态码参考表
状态码含义典型场景
200OK请求成功,返回资源数据
404Not Found请求的资源不存在
500Internal Server Error服务器内部异常,如空指针
Kubernetes 常用 kubectl 命令
  1. kubectl get pods -n staging:查看指定命名空间下的 Pod 状态
  2. kubectl logs pod/my-app-7f9b8c6d5-xyzab:获取 Pod 日志用于排查启动失败
  3. kubectl exec -it my-pod -- /bin/sh:进入容器内部调试环境变量或文件系统
【博士论文复现】【阻抗建模、验证扫频法】光伏并网逆变器扫频与稳定性分析(包含锁相环电流环)(Simulink仿真实现)内容概要:本文档是一份关于“光伏并网逆变器扫频与稳定性分析”的Simulink仿真实现资源,重点复现博士论文中的阻抗建模与扫频法验证过程,涵盖锁相环和电流环等关键控制环节。通过构建详细的逆变器模型,采用小信号扰动方法进行频域扫描,获取系统输出阻抗特性,并结合奈奎斯特稳定判据分析并网系统的稳定性,帮助深入理解光伏发电系统在弱电网件下的动态行为与失稳机理。; 适合人群:具备电力电子、自动控制理论基础,熟悉Simulink仿真环境,从事新能源发电、微电网或电力系统稳定性研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①掌握光伏并网逆变器的阻抗建模方法;②学习基于扫频法的系统稳定性分析流程;③复现高水平学术论文中的关键技术环节,支撑科研项目或学位论文工作;④为实际工程中并网逆变器的稳定性问题提供仿真分析手段。; 阅读建议:建议读者结合相关理论教材与原始论文,逐步运行并调试提供的Simulink模型,重点关注锁相环与电流控制器参数对系统阻抗特性的影响,通过改变电网强度等件观察系统稳定性变化,深化对阻抗分析法的理解与应用能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值