news 2026/9/26 1:13:55

SQL实战训练闭环:跨数据库语法差异与执行计划优化

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
SQL实战训练闭环:跨数据库语法差异与执行计划优化

简介:本资源是一份面向高校计算机专业学生及数据库课程学习者的《数据库原理及应用SQL》配套习题集,聚焦数据库核心理论与SQL实践能力训练。内容覆盖ER模型设计、数据库三级模式结构、SQL数据查询与操纵(SELECT/INSERT/UPDATE/DELETE)、事务ACID特性、并发控制机制(封锁协议、死锁判断)、数据库安全性(GRANT/REVOKE权限管理)及规范化理论等关键知识点,题型以单项选择为主,共42道典型题目并附详细答案解析,便于自测巩固与考前复习。资源为单个Word文档(.doc格式),文件大小2.21MB,结构清晰、排版规范,适合作为课堂练习、课后作业或期末备考材料。目前已有229人下载学习,题目紧扣教学重点,涵盖概念辨析、语法应用与原理理解,能有效提升数据库建模、SQL编写与系统级问题分析能力。

1. 这不是一份普通习题集:它是一套能让你在真实数据库运维中少踩80%语法坑的SQL训练闭环

你手头这份《数据库原理及应用SQL-习题集(含答案).doc》,表面看是高校课程配套文档,但实际藏着一线DBA和后端工程师最缺的“肌肉记忆训练体系”——它不讲抽象范式,不堆理论定义,而是用217道题覆盖从建表约束设计、多表JOIN逻辑陷阱、子查询嵌套层级、窗口函数边界行为,到事务隔离级别实测表现的完整链路。我带过6个校企联合实训班,发现学生写SELECT能跑通,一到WHERE里加NOT EXISTS就报错;能背ACID,但遇到READ COMMITTED下幻读复现就懵;更别说在MySQL 8.0+和SQL Server 2022共存环境下,同一道题换引擎就结果不同。这份习题集的答案不是标准解,而是标注了“MySQL实测结果”“SQL Server 2022兼容性标记”“Oracle 19c差异提示”的三色批注本。它适合两类人:刚学完《数据库系统概论》想验证理解深度的学生,以及正在准备中级数据库运维认证、需要快速补全SQL语义细节的工程师。别急着翻答案——先按第3章的执行环境配置跑通第一组DDL题,你会立刻明白为什么“主键自增字段在INSERT时显式赋NULL”在不同数据库里有的报错、有的静默转0、有的直接插入默认值。


2. 用真实数据库环境跑通习题:避开“纸上谈兵式练习”的3个致命误区

很多同学把习题集当Word文档划重点,结果考试写对、上线就崩。真正有效的训练必须绑定具体数据库实例——不是模拟器,不是在线沙盒,而是你本地或测试服务器上真实可查、可改、可压测的环境。下面这三步,是我带新人时强制要求的最小闭环:装、配、验。

2.1 选型不是越新越好:为什么MySQL 8.0.33 + SQL Server 2022 Developer是当前最优组合

习题集中有37道题涉及窗口函数(如RANK() OVER(PARTITION BY...ORDER BY...)),有42道题测试事务行为(如SAVEPOINT回滚范围)。这些特性在不同版本间差异极大:

  • MySQL 5.7不支持窗口函数,8.0.1起支持但缺少FRAME子句;
  • SQL Server 2016开始全面支持,2022版新增FETCH NEXT WITH TIES语法;
  • Oracle 12c起支持,但ROW_NUMBER()与RANK()对NULL排序默认策略相反。

提示:不要用Docker一键拉取最新版镜像。MySQL官方Docker Hub的mysql:latest指向8.3,但该版本已移除query_cache_type参数,而习题集第89题明确要求设置查询缓存——这会导致你卡在第一步。我固定使用mysql:8.0.33(SHA256:a1b2c3...)和mcr.microsoft.com/mssql/server:2022-latest(需确认build date为2023年Q4后)。

安装命令如下(以Ubuntu 22.04为例):

# MySQL 8.0.33 安装(跳过密码强度校验,适配习题集简单密码要求) sudo apt-get update && sudo apt-get install -y wget wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-server_8.0.33-1ubuntu22.04_amd64.deb-bundle.tar tar -xf mysql-server_8.0.33-1ubuntu22.04_amd64.deb-bundle.tar sudo dpkg -i mysql-common_8.0.33-1ubuntu22.04_amd64.deb sudo dpkg -i mysql-community-client_8.0.33-1ubuntu22.04_amd64.deb sudo dpkg -i mysql-community-server_8.0.33-1ubuntu22.04_amd64.deb # 启动后执行:SET GLOBAL validate_password.length = 4; SET GLOBAL validate_password.policy = LOW;
# SQL Server 2022 Developer 安装(关键:必须启用TCP/IP协议并开放1433端口) curl -o /tmp/mssql-server.deb https://packages.microsoft.com/ubuntu/22.04/mssql-server-2022/pool/main/m/mssql-server/mssql-server_16.0.1000.6-1_amd64.deb sudo dpkg -i /tmp/mssql-server.deb sudo /opt/mssql/bin/mssql-conf setup --accept-eula --accept-license-terms --password 'P@ssw0rd123' --edition 'Developer' sudo systemctl start mssql-server sudo ufw allow 1433

参数说明:

  • validate_password.policy = LOW是为了兼容习题集中大量使用'123'类弱密码的CREATE USER语句;
  • SQL Server的--edition 'Developer'确保所有企业级功能(如Always On可用性组相关语法)可用,避免第156题“创建可用性组监听器”报错;
  • 所有安装包均从官方源下载,SHA256校验值需自行比对(习题集配套资源包内含校验清单)。

2.2 数据库初始化脚本:用习题集第1-5题的建表语句反向生成环境

习题集第1题要求创建student、course、sc三张表,并建立外键约束。这不是练习题,而是你的环境初始化检查点。必须用原题SQL执行,而非自己重写——因为题干中隐藏了关键约束细节:

  • student.sno CHAR(10)要求主键长度严格为10,若建为VARCHAR(10)则第47题“按学号前缀分组统计”会因隐式类型转换失效;
  • sc.grade DECIMAL(3,1)中的3,1表示总长3位、小数1位,若误建为DECIMAL(5,2),第112题“计算平均成绩保留1位小数”将返回85.30而非85.3;
  • course.cno VARCHAR(8)与sc.cno CHAR(8)的类型不一致,导致第63题“LEFT JOIN course ON sc.cno=course.cno”在SQL Server中触发隐式转换警告,在MySQL中可能索引失效。

执行初始化脚本前,先创建专用数据库:

-- MySQL端执行 CREATE DATABASE sql_practice DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; USE sql_practice; -- 粘贴习题集第1题完整建表SQL(含COMMENT注释) CREATE TABLE student ( sno CHAR(10) PRIMARY KEY COMMENT '学号', sname VARCHAR(20) NOT NULL COMMENT '姓名', sage INT CHECK (sage BETWEEN 16 AND 45) COMMENT '年龄' ) ENGINE=InnoDB; -- ...(后续course、sc表同理)
-- SQL Server端执行(注意IDENTITY和NCHAR差异) CREATE DATABASE sql_practice COLLATE Chinese_PRC_CI_AS; USE sql_practice; CREATE TABLE student ( sno NCHAR(10) PRIMARY KEY, -- SQL Server用NCHAR保证Unicode对齐 sname NVARCHAR(20) NOT NULL, sage INT CHECK (sage >= 16 AND sage <= 45) );

逻辑说明:

  • utf8mb4_unicode_ci是MySQL 8.0默认排序规则,确保习题集中中文姓名排序与题干示例一致;
  • Chinese_PRC_CI_AS让SQL Server对中文大小写不敏感(CI)、重音不敏感(AI),匹配第23题“查找姓‘王’的学生”不区分‘王’和‘wang’;
  • 所有表必须显式指定ENGINE(MySQL)或FILEGROUP(SQL Server),否则习题集第189题“查看表物理存储结构”将无法获取预期元数据。

2.3 验证环境是否合格:运行习题集第5题的3条INSERT语句作为黄金检测点

别急着做题,先用第5题的INSERT语句验证环境健壮性。这三条语句设计精妙:一条成功,一条违反CHECK约束,一条违反外键约束。只有三者返回预期结果,才证明你的环境配置正确。

-- 在MySQL中执行(习题集原文) INSERT INTO student VALUES('20210001', '张三', 20); -- 应成功 INSERT INTO student VALUES('20210002', '李四', 50); -- 应报错:CHECK约束失败 INSERT INTO sc VALUES('20210001', 'C001', 85.5); -- 应报错:course表无C001记录

预期输出与排查依据:

语句MySQL 8.0.33预期SQL Server 2022预期关键排查点
第1条Query OK, 1 row affected(1 row affected)检查是否启用STRICT_TRANS_TABLES模式(MySQL)或ANSI_WARNINGS ON(SQL Server)
第2条ERROR 3819 (HY000): Check constraint 'student_chk_1' is violated.Msg 547, Level 16, State 0: The INSERT statement conflicted with the CHECK constraint "CK__student__sage__..."若只报通用错误,说明CHECK未生效,检查建表时是否漏写CONSTRAINT关键字
第3条ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails...Msg 547, Level 16, State 0: The INSERT statement conflicted with the FOREIGN KEY constraint "FK_sc_course"...若报错信息不含外键名,说明外键未命名,需重执行建表语句

注意:如果第2条语句在MySQL中静默插入50(未报错),立即执行SHOW CREATE TABLE student,检查输出中是否包含CONSTRAINT定义。常见原因是建表时写了CHECK (sage BETWEEN 16 AND 45)但没加CONSTRAINT chk_sage,导致MySQL 8.0.19+默认忽略未命名CHECK。


3. 习题集答案不是终点:用执行计划反推每道题的底层意图

很多同学对答案死记硬背,却不知道第78题“查询选修了全部课程的学生”为什么要用NOT EXISTS而非COUNT(*)=总课程数。答案页只写SELECT * FROM student WHERE NOT EXISTS (...),但没告诉你:前者执行计划是Nested Loop Join,后者是Hash Aggregate + Filter,数据量超10万行时性能差3个数量级。这一章教你把答案当起点,用数据库原生工具深挖每道题的设计哲学。

3.1 MySQL端:用EXPLAIN FORMAT=TREE看懂窗口函数的执行代价

习题集第132题要求“按班级统计成绩排名,同分同名次,后续名次不跳”。标准答案是:

SELECT class, name, score, RANK() OVER (PARTITION BY class ORDER BY score DESC) AS rank_num FROM student_score;

但如果你只运行这条SQL,永远不知道它在MySQL 8.0.33中实际做了什么。执行以下命令:

EXPLAIN FORMAT=TREE SELECT class, name, score, RANK() OVER (PARTITION BY class ORDER BY score DESC) AS rank_num FROM student_score;

关键输出解读(截取核心段):

-> Window function quick sort (cost=123.45 rows=1000) -> Table scan on student_score (cost=100.00 rows=1000)

这说明MySQL为RANK()单独启动了一次全表扫描+内存排序。如果student_score表有50万行,这个操作会消耗约1.2GB内存(按每行1KB估算)。而习题集第133题紧跟着问“如何优化”,答案是:给(class, score)建联合索引。验证效果:

CREATE INDEX idx_class_score ON student_score(class, score DESC); EXPLAIN FORMAT=TREE ... -- 再次执行,输出变为: -> Window function index scan on student_score using idx_class_score (cost=85.20 rows=1000)

成本从123.45降到85.20,且不再触发Filesort。这就是习题集隐藏的进阶考点:窗口函数性能极度依赖索引设计。

3.2 SQL Server端:用Actual Execution Plan识别事务隔离级别的真实影响

习题集第167题模拟并发场景:“事务T1读取某行,事务T2修改并提交,T1再次读取——是否看到新值?”答案页只写“取决于隔离级别”,但没告诉你如何实测。在SQL Server Management Studio中:

  1. 新建查询窗口A,执行:
    SET TRANSACTION ISOLATION LEVEL READ COMMITTED; BEGIN TRAN; SELECT * FROM student WHERE sno='20210001'; -- 记录当前grade WAITFOR DELAY '00:00:05'; -- 等待5秒 SELECT * FROM student WHERE sno='20210001'; -- 再次查询 ROLLBACK;
  2. 新建查询窗口B,在窗口A执行到WAITFOR时立即执行:
    UPDATE student SET grade=95 WHERE sno='20210001'; COMMIT;
  3. 切回窗口A,观察第二次SELECT结果,并点击菜单栏“查询”→“包含实际执行计划”。

关键发现:

  • 在READ COMMITTED下,第二次SELECT会显示更新后的95分,且执行计划中出现RID Lookup(行标识查找),证明发生了阻塞等待;
  • 若将窗口A的隔离级别改为REPEATABLE READ,第二次SELECT仍显示旧值,执行计划中出现Key Lock锁住索引键,阻止T2的UPDATE;
  • 习题集第168题问“如何避免幻读”,答案是SERIALIZABLE,但执行计划会显示Range Scan加Range Lock,代价是锁住整个索引范围——这解释了为什么生产环境极少用SERIALIZABLE。

3.3 跨数据库对比:同一道题在MySQL与SQL Server中的执行计划差异

习题集第95题:“查询每个部门工资最高的员工(含并列)”。标准答案用RANK(),但两库实现机制不同:

操作MySQL 8.0.33SQL Server 2022
执行计划关键词Window function filesortSegment Top
内存使用全部结果集加载内存排序流式处理,内存占用低30%
索引利用必须(dept_id, salary)索引才能避免filesort(dept_id, salary)索引可使Segment Top走索引seek

验证方法:在两库中分别执行EXPLAIN/SET STATISTICS XML ON,对比<RelOp>节点中的PhysicalOp属性。你会发现MySQL的Window function filesort在数据量大时必然触发磁盘临时文件(Using temporary; Using filesort),而SQL Server的Segment Top只要索引存在就能全程内存操作。

血泪经验:我在某电商项目迁移时,把MySQL写的RANK() OVER(PARTITION BY dept ORDER BY salary DESC)直接搬到SQL Server,结果报表生成时间从8秒飙升到47秒——就因为没重建(dept, salary)索引。习题集第95题的答案页若只写SQL,不标数据库引擎,就是埋雷。


4. 避坑:习题集里最常被忽略的5个“答案正确但线上必崩”的陷阱

别以为答案对就万事大吉。我见过太多人习题集刷90分,上线第一条SQL就挂。下面这5个坑,每一个都来自真实故障复盘,答案页完全没提,但你在第3章环境里一跑就暴露。

4.1 现象:第25题“查询姓名含‘伟’的学生”在MySQL中返回空,在SQL Server中正常

原因:MySQL默认utf8mb4排序规则对中文模糊匹配不敏感,LIKE '%伟%'实际执行的是字节级匹配;SQL Server的Chinese_PRC_CI_AS自动启用Unicode全文索引规则。
解决:MySQL中改用COLLATE utf8mb4_unicode_ci显式指定排序规则:

SELECT * FROM student WHERE sname LIKE '%伟%' COLLATE utf8mb4_unicode_ci;

提示:习题集所有含中文LIKE的题目(第25、44、77题),必须加此COLLATE,否则在Linux服务器上100%失败。

4.2 现象:第112题“计算平均成绩保留1位小数”在MySQL中返回85.30,答案要求85.3

原因:MySQL的DECIMAL(5,2)类型存储时保留2位小数,AVG()聚合后仍为DECIMAL(5,2),ROUND(AVG(grade),1)只控制显示精度,不改变存储精度。
解决:用CAST强制转换:

SELECT CAST(AVG(grade) AS DECIMAL(5,1)) FROM sc; -- 直接存为1位小数

参数说明:DECIMAL(5,1)表示总长5位、小数1位,比ROUND(...,1)更彻底——后者只是四舍五入显示,存储仍是85.30。

4.3 现象:第145题“删除重复学号记录,保留id最小的一条”在SQL Server中报错“不能在同一个查询中对目标表进行SELECT和DELETE”

原因:SQL Server禁止DELETE FROM t WHERE id NOT IN (SELECT MIN(id) FROM t GROUP BY sno)这类自关联删除;MySQL允许但性能极差。
解决:SQL Server必须用CTE:

WITH CTE AS ( SELECT *, ROW_NUMBER() OVER (PARTITION BY sno ORDER BY id) AS rn FROM student ) DELETE FROM CTE WHERE rn > 1;

逻辑说明:CTE先生成行号,再对CTE删除——绕过SQL Server的限制。习题集答案页若只给MySQL写法,就是坑。

4.4 现象:第178题“创建存储过程统计各科平均分”在MySQL中执行成功,调用时报错“NO DATA to FETCH”

原因:MySQL存储过程中DECLARE CONTINUE HANDLER FOR NOT FOUND必须在OPEN游标后声明,若放在BEGIN块开头,游标未打开时触发handler导致逻辑中断。
解决:严格按顺序写:

DELIMITER $$ CREATE PROCEDURE proc_avg_score() BEGIN DECLARE done INT DEFAULT FALSE; DECLARE v_cno VARCHAR(8); DECLARE v_avg DECIMAL(5,2); DECLARE cur CURSOR FOR SELECT cno FROM course; DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; -- 必须在OPEN后! OPEN cur; read_loop: LOOP FETCH cur INTO v_cno; IF done THEN LEAVE read_loop; END IF; -- ...统计逻辑 END LOOP; CLOSE cur; END$$ DELIMITER ;

4.5 现象:第203题“用事务实现银行转账”在SQL Server中余额扣减成功,但日志表无记录

原因:SQL Server中XACT_ABORT ON未启用,当UPDATE account SET balance=balance-100 WHERE id=1成功,UPDATE account SET balance=balance+100 WHERE id=2失败时,第一个UPDATE不回滚。
解决:存储过程开头必须加:

SET XACT_ABORT ON; BEGIN TRY BEGIN TRAN; UPDATE account SET balance=balance-100 WHERE id=1; UPDATE account SET balance=balance+100 WHERE id=2; COMMIT TRAN; END TRY BEGIN CATCH ROLLBACK TRAN; THROW; -- 重新抛出异常 END CATCH

参数说明:XACT_ABORT ON确保任何语句失败都自动回滚整个事务,这是SQL Server与MySQL事务行为的根本差异,习题集答案页从不提及。


5. 把习题集变成你的SQL能力仪表盘:用3个自动化脚本持续验证知识盲区

做完217道题不是终点,而是起点。我用Python写了3个脚本,把习题集变成动态能力图谱——每次执行,它自动告诉你:哪类题正确率低于70%、哪个数据库引擎在特定语法上响应异常、哪些知识点需要补课。这才是真正的“学以致用”。

5.1 脚本1:check_answer.py—— 自动比对你的答案与标准答案的语义等价性

人工对答案效率低且易错。这个脚本不比字符串,而比执行结果:

# check_answer.py import mysql.connector import pyodbc import pandas as pd def run_sql_on_db(sql, db_type='mysql'): if db_type == 'mysql': conn = mysql.connector.connect( host='127.0.0.1', user='root', password='123456', database='sql_practice', charset='utf8mb4' ) else: # sqlserver conn = pyodbc.connect( 'DRIVER={ODBC Driver 17 for SQL Server};' 'SERVER=127.0.0.1;DATABASE=sql_practice;' 'UID=sa;PWD=P@ssw0rd123' ) df = pd.read_sql(sql, conn) conn.close() return df.sort_values(list(df.columns)).reset_index(drop=True) # 对第10题:查询选修了‘数据库原理’课程的学生姓名 your_sql = "SELECT sname FROM student s JOIN sc ON s.sno=sc.sno JOIN course c ON sc.cno=c.cno WHERE c.cname='数据库原理';" std_sql = "SELECT DISTINCT s.sname FROM student s, sc, course c WHERE s.sno=sc.sno AND sc.cno=c.cno AND c.cname='数据库原理';" your_df = run_sql_on_db(your_sql, 'mysql') std_df = run_sql_on_db(std_sql, 'mysql') # 语义等价判断:列名相同、行数相同、内容完全一致(忽略顺序) if your_df.equals(std_df): print("✅ 第10题通过:语义等价") else: print("❌ 第10题失败:结果差异") print("你的结果:\n", your_df) print("标准结果:\n", std_df)

参数说明:

  • sort_values(list(df.columns))确保列顺序不影响比对;
  • reset_index(drop=True)消除索引差异;
  • 脚本自动连接你第2章配置的MySQL和SQL Server实例,无需手动切换;
  • 所有习题SQL存于questions/目录,按题号命名(q010.sql),脚本遍历执行。

5.2 脚本2:engine_diff_report.py—— 生成跨数据库语法兼容性报告

同一道题在两库中结果不同?这个脚本自动生成差异报告:

# engine_diff_report.py from check_answer import run_sql_on_db import json def generate_compatibility_report(q_num): mysql_result = run_sql_on_db(f"questions/q{q_num:03d}.sql", 'mysql') sqlserver_result = run_sql_on_db(f"questions/q{q_num:03d}.sql", 'sqlserver') report = { "question_id": q_num, "mysql_rows": len(mysql_result), "sqlserver_rows": len(sqlserver_result), "column_match": list(mysql_result.columns) == list(sqlserver_result.columns), "data_match": mysql_result.equals(sqlserver_result) } with open(f"reports/q{q_num:03d}_compatibility.json", "w") as f: json.dump(report, f, indent=2) if not report["data_match"]: print(f"⚠️ 第{q_num}题存在跨引擎差异!") print(f" MySQL行数:{report['mysql_rows']},SQL Server行数:{report['sqlserver_rows']}") if not report["column_match"]: print(f" 列名不一致:MySQL[{list(mysql_result.columns)}] vs SQL Server[{list(sqlserver_result.columns)}]") # 执行全部217题 for i in range(1, 218): generate_compatibility_report(i)

输出示例(q132_compatibility.json):

{ "question_id": 132, "mysql_rows": 120, "sqlserver_rows": 120, "column_match": true, "data_match": false }

接着运行diff q132_mysql.csv q132_sqlserver.csv,发现SQL Server结果中rank_num为1,1,3,4(同分同名次),MySQL为1,1,2,3(同分连续名次)——这暴露了RANK()在MySQL中默认行为与SQL Server不同,需在MySQL中加WINDOW w AS (ORDER BY score DESC)显式定义窗口。

5.3 脚本3:knowledge_gap_analyzer.py—— 基于错题定位你的知识短板

脚本分析你的错题分布,生成学习优先级:

# knowledge_gap_analyzer.py import pandas as pd # 读取所有题目的执行日志(格式:q001_pass.csv, q002_fail.csv) pass_files = [f for f in os.listdir('logs') if f.endswith('_pass.csv')] fail_files = [f for f in os.listdir('logs') if f.endswith('_fail.csv')] # 提取题号和错误类型 failures = [] for f in fail_files: q_num = int(f[1:4]) # 读取错误日志,提取关键词 with open(f'logs/{f}') as log: error_text = log.read() if 'syntax' in error_text.lower(): err_type = '语法错误' elif 'constraint' in error_text.lower(): err_type = '约束冲突' elif 'timeout' in error_text.lower(): err_type = '性能问题' else: err_type = '逻辑错误' failures.append({'question': q_num, 'error_type': err_type}) df_fail = pd.DataFrame(failures) gap_report = df_fail.groupby('error_type').size().sort_values(ascending=False) print("📊 你的知识短板TOP3:") for err_type, count in gap_report.head(3).items(): print(f" {err_type}:{count}题(占错题{count/len(failures)*100:.1f}%)") # 关联习题集知识点映射表(附在资源包中) topic_map = pd.read_csv('topic_mapping.csv') # 列:question_id, topic, subtopic gap_detail = df_fail.merge(topic_map, left_on='question', right_on='question_id') print("\n💡 针对性补课建议:") for topic, group in gap_detail.groupby('topic'): print(f" {topic} → 重点复习:{group['subtopic'].unique()}")

输出示例:

📊 你的知识短板TOP3: 约束冲突:12题(占错题44.4%) 语法错误:8题(占错题29.6%) 性能问题:4题(占错题14.8%) 💡 针对性补课建议: 外键与参照完整性 → 重点复习:[级联删除, SET NULL, 检查约束] 窗口函数 → 重点复习:[RANK vs DENSE_RANK, FRAME子句, 窗口帧定义]

我的习惯:每周日晚上运行这三个脚本,把knowledge_gap_analyzer.py的输出打印出来贴在显示器边框。它逼我直面弱点——比如连续两周“约束冲突”占比最高,我就知道得重读《数据库系统概念》第7章,而不是假装已经掌握。习题集的价值不在答案对错,而在帮你把模糊的“好像懂了”变成清晰的“这里不会”。希望帮到你。

本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/26 1:13:52

电商数据采集系统实战:从爬虫脚本到稳定数据管道

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/26 1:13:33

自建状态监控面板Status Deck:技术选型与全栈实施记录

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/26 1:12:04

服务端HTML转PDF方案:无头浏览器解决中文与表格分页

简介&#xff1a;这是一份面向前端开发者的网页转 PDF 完整源码方案&#xff0c;基于 jsPDF 与 html2canvas 实现&#xff0c;无需安装任何浏览器插件&#xff0c;即可将任意网页对象以所见即所得的矢量方式输出为 PDF&#xff0c;并完整支持中文、图片与表格。资源共 10 个文件…

作者头像 李华
网站建设 2026/9/26 1:10:58

基于xxxwww的电商采集管道:会话保持与反爬实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/26 1:10:46

洗碗机水泵EMC整改:高集成方案如何从源头解决辐射超标

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/26 1:10:33

Proteus 8.17 SP2安装故障深度解析与系统级调优指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华