前端表单验证终极指南:HTML5 内置验证 + JavaScript 自定义校验
系列文章目录
01-从零开始学 HTML:构建网页的基本框架与技巧
02-HTML常见文本标签解析:从基础到进阶的全面指南
03-HTML从入门到精通:链接与图像标签全解析
04-HTML 列表标签全解析:无序与有序列表的深度应用
05-HTML表格标签全面解析:从基础到高级优化技巧
06-HTML表单深度解析:GET 和 POST 提交方法
07-HTML 表单控件类型大全:文本框、密码框、文件上传全掌握
08-前端表单验证终极指南:HTML5 内置验证 + JavaScript 自定义校验
文章目录
- 系列文章目录
- 前言
- 一、HTML5 表单验证属性
- 1.1 `required`:必填字段
- 1.1.1 代码示例
- 1.1.2 运行效果
- 1.2 `pattern`:自定义输入格式
- 1.2.1 代码示例
- 1.2.2 运行效果
- (1)使用 `title` 提供额外提示
- 1.3 `min` 和 `max`:数值范围验证
- 1.3.1 代码示例
- 1.3.2 运行效果
- (1)`min` / `max` 在日期选择中的应用
- 1.4 `minlength` 和 `maxlength`:限制文本长度
- 1.4.1 代码示例
- 1.4.2 运行效果
- 1.5 `type`:特定输入类型
- 1.5.1 代码示例:`email` 和 `url` 验证
- 1.5.2 运行效果
- 二、自定义表单验证与错误提示设计
- 为什么需要自定义表单验证?
- 2.1 使用 JavaScript 进行自定义验证
- 2.1.1 自定义验证密码强度
- (1)代码示例
- (2)代码解析
- 2.2 友好的错误提示设计
- 2.2.1 设计原则
- 2.3 实时验证与错误提示
- 2.3.1 代码示例:实时验证邮箱格式
- 2.3.2 运行效果
- 2.4 提示错误信息并高亮输入框
- 2.4.1 代码示例:错误输入时高亮输入框
- 运行效果
- 2.5 阻止表单提交并滚动到错误字段
- 2.5.1 代码示例
- 2.5.2 运行效果
- 三、总结
- 1. HTML5 表单验证属性
- 2. JavaScript 自定义表单验证
- 3. 友好的错误提示设计
前言
在 Web 开发中,表单(Form)是用户与系统交互的核心组件之一。无论是 用户注册、登录、搜索、支付,还是提交反馈,几乎所有的网页应用都离不开表单。然而,表单的设计不仅仅是简单的输入框和提交按钮,数据验证 才是保障表单数据质量的关键。
如果你的表单没有正确的验证机制,会导致:
- 垃圾数据泛滥,如用户提交不完整或格式错误的信息;
- 安全隐患,如 SQL 注入、XSS 攻击等;
- 用户体验差,表单错误提示不清晰,导致用户流失。
幸运的是,HTML5 提供了一些内置的表单验证属性,如 required、pattern、min、max,可以轻松实现基本的前端验证。但仅靠 HTML5 还不够,许多复杂的验证需求仍然需要 JavaScript 进行自定义,例如 密码强度检查、手机号格式校验、用户名是否重复,以及 更友好的错误提示设计。
在本篇文章中,我们将:
- 详细讲解 HTML5 内置表单验证属性 的用法,并通过代码示例演示其作用;
- 探讨 JavaScript 自定义表单验证,满足更复杂的业务需求;
- 设计 用户友好的错误提示机制,提升交互体验,让表单更智能、更高效。
无论你是 前端新手 还是 有经验的开发者,本篇文章都会帮助你掌握 高效的表单验证技术,让你的表单更加安全、智能、易用。
一、HTML5 表单验证属性
HTML5 提供了一系列 内置的表单验证属性,可以在不依赖 JavaScript 的情况下,对用户输入进行基本的约束。这些属性让浏览器在表单提交前,自动检查输入的正确性,减少服务器端的负担,并提升用户体验。
常见的 HTML5 表单验证属性包括:
required:必填字段pattern:自定义输入格式(正则表达式)min/max:数值范围约束minlength/maxlength:文本长度限制type:特定输入类型(如email、url、number等)
接下来,将详细介绍其中几个常用的验证属性,并通过代码示例演示其用法。
1.1 required:必填字段
required 属性用于指定某个输入字段为 必填项。如果用户未填写该字段,浏览器会阻止表单提交,并显示默认的错误提示信息。
1.1.1 代码示例
<form><label for="username">用户名(必填):</label><input type="text" id="username" name="username" required><button type="submit">提交</button>
</form>
1.1.2 运行效果
- 用户如果不输入用户名,点击“提交”按钮时,浏览器会显示 “请填写此字段”(具体提示内容因浏览器而异)。
- 这个错误提示是 默认的,如果需要自定义错误信息,可以使用 JavaScript 进行处理(后续章节介绍)。
1.2 pattern:自定义输入格式
pattern 属性允许使用 正则表达式(RegEx) 来规定输入格式。例如,限制用户只能输入 6-12 位的字母或数字。
1.2.1 代码示例
<form><label for="password">密码(6-12 位字母或数字):</label><input type="password" id="password" name="password" pattern="[a-zA-Z0-9]{6,12}" required><button type="submit">提交</button>
</form>
1.2.2 运行效果
- 如果用户输入的密码 不符合 6-12 位的字母或数字格式,浏览器会显示 “请匹配请求的格式”。
- 这个属性适用于邮箱、电话、用户名等需要格式约束的输入字段。
(1)使用 title 提供额外提示
默认的错误提示较为模糊,我们可以使用 title 属性提供更清晰的引导信息:
<input type="password" id="password" name="password" pattern="[a-zA-Z0-9]{6,12}" required title="密码必须是 6-12 位的字母或数字">
1.3 min 和 max:数值范围验证
min 和 max 主要用于 数值输入,确保用户输入的值在指定的范围内。例如,限制年龄必须在 18-60 之间。
1.3.1 代码示例
<form><label for="age">年龄(18-60):</label><input type="number" id="age" name="age" min="18" max="60" required><button type="submit">提交</button>
</form>
1.3.2 运行效果
- 当用户输入的年龄小于
18或大于60时,浏览器会阻止提交,并提示 “值必须大于等于 18” 或 “值必须小于等于 60”(具体提示因浏览器不同而异)。 - 这个属性适用于价格、数量、日期等 需要范围限制 的输入字段。
(1)min / max 在日期选择中的应用
我们也可以在 日期输入 中使用 min 和 max,比如限制用户只能选择 今天或未来的日期:
<input type="date" name="start_date" min="2024-01-01">
如果用户尝试选择 2023 年的日期,浏览器会阻止提交。
1.4 minlength 和 maxlength:限制文本长度
minlength 和 maxlength 可用于 限制输入框的字符长度,确保用户输入符合预期的长度范围。
1.4.1 代码示例
<form><label for="nickname">昵称(3-10 个字符):</label><input type="text" id="nickname" name="nickname" minlength="3" maxlength="10" required><button type="submit">提交</button>
</form>
1.4.2 运行效果
- 用户输入 少于 3 个字符或超过 10 个字符 时,浏览器会阻止提交,并提示 “请使用至少 3 个字符” 或 “最多可输入 10 个字符”。
- 这个属性适用于 用户名、昵称、评论内容 等文本字段。
1.5 type:特定输入类型
HTML5 提供了多种 输入类型,可以自动进行格式验证,例如:
email:邮箱格式检查url:网址格式检查number:仅允许输入数值tel:电话号码格式
1.5.1 代码示例:email 和 url 验证
<form><label for="email">邮箱:</label><input type="email" id="email" name="email" required><label for="website">网址:</label><input type="url" id="website" name="website" required><button type="submit">提交</button>
</form>
1.5.2 运行效果
- 如果用户输入的 邮箱 没有
@或.,浏览器会提示 “请输入有效的电子邮件地址”。 - 如果用户输入的 网址 没有
http://或https://,浏览器会提示 “请输入有效的网址”。
二、自定义表单验证与错误提示设计
虽然 HTML5 提供了一些内置的表单验证属性,但在实际开发中,往往需要更加灵活的 自定义表单验证。
为什么需要自定义表单验证?
- 更复杂的业务需求:如密码强度检查、用户名是否已被注册等。
- 更好的用户体验:HTML5 的默认错误提示较为简单,用户可能难以理解错误原因。
- 实时反馈:HTML5 的验证一般在提交时触发,而自定义验证可以做到 实时提示,让用户在输入时就能发现错误。
本节将介绍如何使用 JavaScript 进行自定义表单验证,并设计更符合用户体验的 错误提示机制。
2.1 使用 JavaScript 进行自定义验证
JavaScript 提供了多种方式进行 自定义验证,最常见的方式是使用 addEventListener 监听 输入框事件,并根据规则进行检查。
2.1.1 自定义验证密码强度
密码验证是 Web 表单中常见的功能之一。通常,我们希望用户的密码满足以下要求:
- 至少 8 个字符
- 至少包含 1 个大写字母
- 至少包含 1 个小写字母
- 至少包含 1 个数字
(1)代码示例
<form id="customForm"><label for="password">密码(至少 8 个字符,包含大小写字母和数字):</label><input type="password" id="customPassword" name="password" required><span id="error-message" style="color: red;"></span><button type="submit">提交</button>
</form><script>document.getElementById("customForm").addEventListener("submit", function(event) {let password = document.getElementById("customPassword").value;let errorMessage = document.getElementById("error-message");let regex = /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d).{8,}$/;if (!regex.test(password)) {event.preventDefault(); // 阻止提交errorMessage.textContent = "密码必须包含大小写字母、数字,且不少于 8 位!";} else {errorMessage.textContent = "";}});
</script>
(2)代码解析
- 监听表单的
submit事件,在提交前检查 密码字段 是否符合要求。 - 使用 正则表达式 确保密码包含大小写字母和数字,且长度至少 8 位。
- 如果不符合条件,则 阻止表单提交,并显示自定义的错误提示信息。
2.2 友好的错误提示设计
良好的错误提示可以 提升用户体验,帮助用户快速找到并修正错误。以下是一些 错误提示的最佳实践。
2.2.1 设计原则
- 错误提示应靠近输入框,让用户直观感知问题。
- 使用清晰、易懂的语言,如 “密码长度不足” 而不是 “输入无效”。
- 实时反馈,而不是等用户提交后才提示错误。
- 颜色区分:错误提示一般使用 红色,成功提示可以使用 绿色。
2.3 实时验证与错误提示
静态 HTML5 验证通常在 提交时触发,但用户体验更好的方式是 实时验证,让用户在输入时就能知道错误。
2.3.1 代码示例:实时验证邮箱格式
<form><label for="email">邮箱:</label><input type="email" id="email" name="email" required><span id="email-error" style="color: red;"></span><button type="submit">提交</button>
</form><script>document.getElementById("email").addEventListener("input", function() {let email = this.value;let errorSpan = document.getElementById("email-error");if (!email.includes("@") || !email.includes(".")) {errorSpan.textContent = "请输入有效的邮箱地址!";} else {errorSpan.textContent = "";}});
</script>
2.3.2 运行效果
- 用户在 输入邮箱时,如果格式不正确,会立即在输入框下方显示错误提示。
- 当用户修正错误后,错误提示会自动消失。
2.4 提示错误信息并高亮输入框
除了 文本提示,我们还可以 高亮输入框,让用户更容易识别错误。
2.4.1 代码示例:错误输入时高亮输入框
<form><label for="phone">手机号:</label><input type="text" id="phone" name="phone" required><span id="phone-error" style="color: red;"></span><button type="submit">提交</button>
</form><script>document.getElementById("phone").addEventListener("input", function() {let phone = this.value;let errorSpan = document.getElementById("phone-error");let phoneInput = document.getElementById("phone");let phoneRegex = /^[1-9][0-9]{9}$/; // 10位数字,不能以 0 开头if (!phoneRegex.test(phone)) {errorSpan.textContent = "请输入有效的手机号!";phoneInput.style.border = "2px solid red"; // 高亮边框} else {errorSpan.textContent = "";phoneInput.style.border = ""; // 移除高亮}});
</script>
运行效果
- 当用户输入的手机号不符合 10 位数字且不能以 0 开头 时:
- 输入框边框会变为 红色。
- 下方显示 错误信息。
- 当用户修正错误后,边框颜色恢复正常,错误信息消失。
2.5 阻止表单提交并滚动到错误字段
有时用户填写多个字段,提交表单后需要 自动滚动到第一个错误输入框,以便用户快速修正错误。
2.5.1 代码示例
<form id="registerForm"><label for="username">用户名:</label><input type="text" id="username" name="username" required><span id="username-error" style="color: red;"></span><label for="email">邮箱:</label><input type="email" id="email" name="email" required><span id="email-error" style="color: red;"></span><button type="submit">提交</button>
</form><script>document.getElementById("registerForm").addEventListener("submit", function(event) {let username = document.getElementById("username");let email = document.getElementById("email");if (!username.value.trim()) {event.preventDefault();document.getElementById("username-error").textContent = "用户名不能为空!";username.scrollIntoView({ behavior: "smooth", block: "center" });return;}if (!email.value.includes("@")) {event.preventDefault();document.getElementById("email-error").textContent = "请输入有效的邮箱地址!";email.scrollIntoView({ behavior: "smooth", block: "center" });}});
</script>
2.5.2 运行效果
- 如果用户未填写用户名或邮箱格式错误,页面会 自动滚动到第一个错误字段。
三、总结
表单验证是 Web 开发中的核心环节,本文围绕 HTML5 表单验证 和 JavaScript 自定义验证 展开,提供了详尽的讲解和实战代码。下面是本文的核心要点:
1. HTML5 表单验证属性
✅ required:确保输入框不能为空,防止用户提交空数据。
✅ pattern:使用正则表达式约束输入格式,如邮箱、手机号验证。
✅ min / max:限定数值或日期输入的范围,如年龄、价格、时间。
✅ minlength / maxlength:控制文本输入长度,如用户名、评论框的字数限制。
✅ type:使用 HTML5 预定义的输入类型(email、url、number)进行自动格式校验。
2. JavaScript 自定义表单验证
✅ 实时验证:在用户输入时立即检查数据,不必等到提交后才提示错误。
✅ 密码强度检测:要求密码包含大小写字母、数字、特殊字符,提高安全性。
✅ 手机号格式校验:使用正则表达式检测是否符合标准手机号格式。
✅ 跨字段验证:如 “确认密码” 必须与 “密码” 一致。
3. 友好的错误提示设计
✅ 错误提示应靠近输入框,避免用户找不到问题所在。
✅ 错误消息清晰直观,例如 “请输入正确的手机号”,而不是 “输入无效”。
✅ 颜色和样式区分,错误提示使用 红色文本 + 高亮边框,便于识别。
✅ 自动滚动到第一个错误字段,提升修正体验。
相关文章:
前端表单验证终极指南:HTML5 内置验证 + JavaScript 自定义校验
系列文章目录 01-从零开始学 HTML:构建网页的基本框架与技巧 02-HTML常见文本标签解析:从基础到进阶的全面指南 03-HTML从入门到精通:链接与图像标签全解析 04-HTML 列表标签全解析:无序与有序列表的深度应用 05-HTML表格标签全面…...
AI大模型开发原理篇-3:词向量和词嵌入
简介 词向量是用于表示单词意义的向量, 并且还可以被认为是单词的特征向量或表示。 将单词映射到实向量的技术称为词嵌入。在实际应用中,词向量和词嵌入这两个重要的NLP术语通常可以互换使用。它们都表示将词汇表中的单词映射到固定大小的连续向量空间中…...
三个不推荐使用的线程池
线程池的种类 其实看似这么多的线程池,都离不开ThreadPoolExecutor去创建,只不过他们是简化一些参数 newFixedThreadPool 里面全是核心线程 有资源耗尽的风险,任务队列最大长度为Integer.MAX_VALUE,可能会堆积大量的请求ÿ…...
星际战争模拟系统:新月的编程之道
星际战争模拟系统:新月的编程之道 作为一名在 25 世纪星际时代成长起来的科学家和军事战略家,我对编程和人工智能的热爱始于童年。我的父亲是一位著名的物理学家,母亲是一位杰出的生物工程师。在他们的影响下,我从小就对科学和技术…...
【CS61A 2024秋】Python入门课,全过程记录P4(Week7 Generators开始,更新于2025/1/29)
文章目录 关于基本介绍👋新的问题更好的解决方案Week7Mon Generators阅读材料Lab 05: Iterators, MutabilityQ1: WWPD: List-MutationQ2: Insert Items 关于 个人博客,里面偶尔更新,最近比较忙。发一些总结的帖子和思考。 江湖有缘相见&…...
Fort Firewall:全方位守护网络安全
Fort Firewall是一款专为 Windows 操作系统设计的开源防火墙工具,旨在为用户提供全面的网络安全保护。它基于 Windows 过滤平台(WFP),能够与系统无缝集成,确保高效的网络流量管理和安全防护。该软件支持实时监控网络流…...
【数据结构】_C语言实现不带头非循环单向链表
目录 1. 链表的概念及结构 2. 链表的分类 3. 单链表的实现 3.1 SList.h头文件 3.2 SList.c源文件 3.3 Test_SList.c测试文件 关于线性表,已介绍顺序表,详见下文: 【数据结构】_顺序表-CSDN博客 本文介绍链表; 基于顺序表…...
【Qt】06-对话框
对话框 前言一、模态和非模态对话框1.1 概念1.2 模态对话框1.2.1 代码QAction类 1.2.2 模态对话框运行分析 1.3 非模态对话框1.3.1 代码局部变量和成员变量setAttribute 类 1.3.2 现象解释 二、标准对话框2.1 提示对话框 QMessageBox2.1.1 现象及解释 2.2 问题对话框2.2.1 现象…...
特征缩放:数据归一化
First,新年到了!感谢CSDN一路相伴,成为技术交流的温馨港湾。值此蛇年新春,祝平台人气蒸蒸日上,活动精彩纷呈,助力更多开发者突破技术瓶颈,在新的一年创造无限可能,新年快乐ÿ…...
Kubernetes 环境中的自动化运维实战指南
Kubernetes 作为容器编排领域的领导者,已经成为云原生应用的核心基础设施。然而,随着集群规模的扩大和应用的复杂化,手动运维 Kubernetes 集群变得愈发困难。自动化运维成为提升效率、保障系统稳定性的关键。本文将详细介绍如何在 Kubernetes 环境中实施自动化运维,涵盖工具…...
深入探讨Web应用开发:从前端到后端的全栈实践
在数字化时代,Web应用已成为连接用户与服务的关键桥梁。无论是电商平台、社交媒体,还是企业内部管理系统,Web应用都扮演着不可或缺的角色。本文将深入探讨Web应用开发的全栈实践,从前端的用户体验设计到后端的数据处理与存储&…...
分享|通过Self-Instruct框架将语言模型与自生成指令对齐
结论 在大型 “指令调整” 语言模型依赖的人类编写指令数据存在数量、多样性和创造性局限, 从而阻碍模型通用性的背景下, Self - Instruct 框架, 通过 自动生成 并 筛选指令数据 微调预训练语言模型, 有效提升了其指令遵循能…...
扣子平台音频功能:让声音也能“智能”起来。扣子免费系列教程(14)
在数字化时代,音频内容的重要性不言而喻。无论是在线课程、有声读物,还是各种多媒体应用,音频都是传递信息、增强体验的关键元素。扣子平台的音频功能,为开发者和内容创作者提供了一个强大而灵活的工具,让音频的使用和…...
超分辨率体积重建实现术前前列腺MRI和大病理切片组织病理学图像的3D配准
摘要: 磁共振成像(MRI)在前列腺癌诊断和治疗中的应用正在迅速增加。然而,在MRI上识别癌症的存在和范围仍然具有挑战性,导致即使是专家放射科医生在检测结果上也存在高度变异性。提高MRI上的癌症检测能力对于减少这种变异性并最大化MRI的临床效用至关重要。迄今为止,这种改…...
C++并发编程指南03
文章目录 传递参数2.2.1 基本参数传递示例: 2.2.2 注意动态变量指针的传递错误示例:正确示例: 2.2.3 引用参数的传递错误示例:正确示例: 2.2.4 成员函数和对象指针的传递示例:带参数的成员函数示例…...
大数据Hadoop入门3
目录 第五部分(Apache Hive DML语句和函数使用) 1.课程内容大纲和学习目标 2.Hive SQL-DML-load加载数据操作 3.Hive SQL-DML-insert插入数据 4.Hive SQL-DML-select查询-语法书和环境准备 5.Hive SQL-DML-select查询-列表达式和distinct去重 6.Hi…...
Autosar-Os是怎么运行的?(多核系统运行)
写在前面: 入行一段时间了,基于个人理解整理一些东西,如有错误,欢迎各位大佬评论区指正!!! 目录 1.Autosar多核操作系统 1.1多核启动过程 1.2多核运行过程 1.2.1核间任务同步 1.2.2Counte…...
【硬件介绍】三极管工作原理(图文+典型电路设计)
什么是三极管? 三极管,全称为双极型晶体三极管,是一种广泛应用于电子电路中的半导体器件。它是由三个掺杂不同的半导体材料区域组成的,这三个区域分别是发射极(E)、基极(B)和集电极&…...
MATLAB基础应用精讲-【数模应用】DBSCAN算法(附MATLAB和python代码实现)
目录 前言 几个高频面试题目 DBSCAN和传统聚类算法对比 算法原理 发展历程 主要事件 发展分析 什么是DBSCAN DBSCAN算法的聚类过程 DBSCAN算法的样本点组成 几个相关的概念: 算法思想 DBSCAN算法优缺点和改进 2.1 DBSCAN算法优缺点 2.2 DBSCAN算法改进 算法流…...
STM32 PWM驱动舵机
接线图: 这里将信号线连接到了开发板的PA1上 代码配置: 这里的PWM配置与呼吸灯一样,呼吸灯连接的是PA0引脚,输出比较单元用的是OC1通道,这里只需改为OC2通道即可。 完整代码: #include "servo.h&quo…...
基于Go语言的三甲医院人机与智能体协同环境系统(上.文章部分)
一、引言 1.1 研究背景与意义 1.1.1 三甲医院对高效协同系统的需求 三甲医院作为医疗体系的核心力量,承担着疑难病症诊治、医学科研教学等重要任务,其业务具有高度的复杂性。在日常运营中,三甲医院涉及多个科室,每个科室又包含众多专业领域,各科室之间需要紧密协作,共…...
对比DeepSeek、ChatGPT和Kimi的学术写作摘要能力
摘要 摘要是文章的精华,通常在200-250词左右。要包括研究的目的、方法、结果和结论。让AI工具作为某领域内资深的研究专家,编写摘要需要言简意赅,直接概括论文的核心,为读者提供快速了解的窗口。 下面我们使用DeepSeek、ChatGPT…...
「Unity3D」在Unity中使用C#控制显示Android的状态栏
Unity打包的Android默认都是全屏,如果想要在真机上显示状态栏,就需要额外设置,有两种方式: 第一种,使用Android的Java代码去控制,然后以插件的方式放到Unity中,被C#调用。第二种,使…...
Lua 环境的安装
1.安装Lua运行环境 本人采用的是在windows系统中使用cmd指令方式进行安装,安装指令如下: winget install "lua for windows" 也曾使用可执行程序安装过,但由于电脑是加密电脑,最后都已失败告终。使用此方式安装可以安…...
Pyside的QWebEngineProfile类
QWebEngineProfile 是 PySide/Qt 中用于管理浏览器引擎(WebEngine)配置的类,属于 QtWebEngineCore 模块。它主要用于控制网页的全局行为,例如缓存、Cookie、持久化存储、用户代理(User-Agent)、代理设置等。…...
java爬虫工具Jsoup学习
目录 前言 一、基本使用 二、爬取豆瓣电影的案例 三、Jsoup能做什么? 四、Jsoup相关概念 五、Jsoup获取文档 六、定位选择元素 七、获取数据 八、具体案例 前言 JSoup是一个用于处理HTML的Java库,它提供了一个非常方便类似于使用DOM࿰…...
基于SpringBoot电脑组装系统平台系统功能实现六
一、前言介绍: 1.1 项目摘要 随着科技的进步,计算机硬件技术日新月异,包括处理器(CPU)、主板、内存、显卡等关键部件的性能不断提升,为电脑组装提供了更多的选择和可能性。不同的硬件组合可以构建出不同类…...
Java实战项目-基于 springboot 的校园选课小程序(附源码,部署,文档)
Java 基于 springboot 的校园选课小程序 博主介绍:✌程序员徐师兄、8年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战*✌ 🍅文末获取源码联系🍅 👇&…...
洛谷P3884 [JLOI2009] 二叉树问题(详解)c++
题目链接:P3884 [JLOI2009] 二叉树问题 - 洛谷 | 计算机科学教育新生态 1.题目解析 1:从8走向6的最短路径,向根节点就是向上走,从8到1会经过三条边,向叶节点就是向下走,从1走到6需要经过两条边,…...
SQL99之内连接查询
SQL99是SQL语言的一个标准,于1999年发布。内连接查询是SQL中非常常用的一种查询方式,用于根据指定的条件从两个或多个表中获取相关联的数据。下面将详细介绍SQL99中的内连接查询,并以通熟易懂的语言进行讲解,同时给出代码例子、注…...
