SQL 1)是用于管理关系数据库管理系统(RDBMS)的标准编程语言, 用来存储、查询、更新和管理数据,根据操作目的,SQL 语句通常分为以下四类
| 分类 | 全称 | 作用 | 常见关键字 |
| DQL | Data Query Language | 数据查询:从数据库中检索数据 | SELECT, FROM, WHERE, JOIN, GROUP BY |
| DML | Data Manipulation Language | 数据操作:对表中的数据进行增删改 | INSERT, UPDATE, DELETE |
| DDL | Data Definition Language | 数据定义:定义或修改数据库结构(表、索引等) | CREATE, ALTER, DROP, TRUNCATE |
| DCL | Data Control Language | 数据控制:管理权限和事务 | GRANT, REVOKE, COMMIT, ROLLBACK |
数字常量包括整数、小数以及浮点数 2)
字符串常量括在单引号内,包含字母和数字字符以及特殊字符,如 !,@,#,如果单引号的字符串包含一个嵌入的引号,可以使用两个的单引号表示嵌入的单引号
🚩 假设你要插入一条包含 It's 的数据:INSERT INTO messages (content) VALUES ('Its a test');
=== 日期和时间常量 ===
在标准的 SQL 语法中,日期和时间常量通常遵循以下格式:
* 日期 (DATE):'YYYY-MM-DD' (例如:'2023-10-25')
* 时间 (TIME):'HH:MM:SS' (例如:'14:30:00')
* 日期时间 (TIMESTAMP / DATETIME):'YYYY-MM-DD HH:MM:SS' (例如:'2023-10-25 14:30:00')
=== 符号常量 ===
^ 类别 ^ 符号常量 (标准 SQL) ^ 含义与说明 ^ 常见数据库方言/替代写法 ^
| 空值与逻辑 | NULL | 数据缺失、未知,不可用 = 比较,必须用 IS NULL | 通用 |
| 空值与逻辑 | TRUE | 布尔真值 | MySQL 旧版视为 1;Oracle 无原生布尔,常用 1 或 'Y' |
| 空值与逻辑 | FALSE | 布尔假值 | MySQL 旧版视为 0;Oracle 常用 0 或 'N' |
| 日期与时间 | CURRENT_DATE | 当前系统日期 (无时间部分) | Oracle: TRUNC(SYSDATE) |
| 日期与时间 | CURRENT_DATE | 当前系统日期 (无时间部分) | MySQL: CURDATE() |
| 日期与时间 | CURRENT_DATE | 当前系统日期 (无时间部分) | SQL Server: CAST(GETDATE() AS DATE) |
| 日期与时间 | CURRENT_TIME | 当前系统时间 (无日期部分,含时区) | Oracle: 无直接对应,需 TO_CHAR(SYSDATE, 'HH24:MI:SS') |
| 日期与时间 | CURRENT_TIME | 当前系统时间 (无日期部分,含时区) | MySQL: CURTIME() |
| 日期与时间 | CURRENT_TIMESTAMP | 当前完整日期和时间 (含时区) | Oracle: SYSTIMESTAMP |
| 日期与时间 | CURRENT_TIMESTAMP | 当前完整日期和时间 (含时区) | MySQL: NOW() |
| 日期与时间 | CURRENT_TIMESTAMP | 当前完整日期和时间 (含时区) | SQL Server: SYSDATETIME() |
| 日期与时间 | LOCALTIMESTAMP | 当前本地日期和时间 (不含时区) | Oracle: SYSDATE |
| 日期与时间 | LOCALTIMESTAMP | 当前本地日期和时间 (不含时区) | MySQL: NOW() |
| 日期与时间 | LOCALTIMESTAMP | 当前本地日期和时间 (不含时区) | SQL Server: GETDATE() |
| 用户与环境 | CURRENT_USER | 当前会话的数据库用户名 | Oracle: USER |
| 用户与环境 | CURRENT_USER | 当前会话的数据库用户名 | MySQL: USER() |
| 用户与环境 | CURRENT_USER | 当前会话的数据库用户名 | SQL Server: SUSER_SNAME() |
| 用户与环境 | SESSION_USER | 会话初始连接用户 (通常与 CURRENT_USER 相同) | SQL Server: ORIGINAL_LOGIN() |
| 用户与环境 | SYSTEM_USER | 底层操作系统用户名 | SQL Server: SYSTEM_USER |
| 用户与环境 | SYSTEM_USER | 底层操作系统用户名 | Oracle/MySQL: 无直接标准对应 |
| 用户与环境 | CURRENT_SCHEMA | 当前默认的 Schema/数据库名 | MySQL: DATABASE() |
| 用户与环境 | CURRENT_SCHEMA | 当前默认的 Schema/数据库名 | SQL Server: SCHEMA_NAME() |
| 系统状态 | UNKNOWN | 三值逻辑中的“未知”状态 (NULL 参与比较时产生) | 极少直接使用,通常由 NULL 比较自动产生 |
===== 变量 =====
在 SQL 中,变量用于在批处理、脚本或存储过程中临时存储数据值,是控制程序逻辑(如循环、条件判断)和处理中间结果的重要工具
=== 局部变量 ===
在 SQL 中,局部变量和全局变量的核心区别在于作用域(可见范围)和生命周期,局部变量是由用户自己定义的,用于在特定的代码块或事务中临时存储数据
* 作用域:非常有限。仅在声明它的代码块(如存储过程、函数、触发器或 BEGIN…END 语句块)内有效。一旦代码块执行完毕,变量就会自动销毁
* 生命周期:随着代码块的执行而创建,随着代码块的结束而销毁
* 命名与声明:
- SQL Server:必须以 @ 开头,使用 DECLARE 声明。例如:DECLARE @myCount INT;
- MySQL:不需要 @ 前缀,在存储过程内部直接使用 DECLARE 声明。例如:DECLARE myCount INT;
* 变量赋值
- 使用 SET 赋值:DECLARE @myName NVARCHAR(50);SET @myName = '张三';
- 使用 SELECT 赋值: DECLARE @count INT, @maxAge INT;SELECT @count = 10, @maxAge = 60;
=== 全局变量 ===
在 SQL Server 中,我们通常所说的“全局变量”实际上是由系统预定义和维护的系统函数。它们主要用于提供有关 SQL Server 系统配置、当前会话状态或上一条 SQL 语句执行结果的信息
* 全局变量的核心特点
- 命名规则:必须以 @@ 作为前缀(如 @@VERSION)
- 只读属性:由系统自动定义和维护,用户只能读取,不能修改其值
- 无需声明:不需要使用 DECLARE 语句,可以在任何程序中随时调用
- 作用域:其作用范围不局限于某个特定的程序,任何程序均可调用
🚩以下是整理好的 SQL Server 常用全局变量表格
^ 分类 ^ 全局变量 (系统函数) ^ 含义与说明 ^
| 系统与配置 | @@VERSION | 返回当前 SQL Server 的版本、处理器架构和操作系统信息 |
| 系统与配置 | @@SERVERNAME | 返回运行 SQL Server 的本地服务器名称 |
| 系统与配置 | @@LANGUAGE | 返回当前使用的语言名称 |
| 系统与配置 | @@MAX_CONNECTIONS | 返回 SQL Server 实例允许同时进行的最大用户连接数 |
| 语句执行状态 | @@ROWCOUNT | 返回受上一条 SQL 语句影响的行数(常用于判断操作是否成功) |
| 语句执行状态 | @@ERROR | 返回最后执行的 T-SQL 语句的错误号(成功返回 0,失败返回错误代码) |
| 语句执行状态 | @@IDENTITY | 返回当前会话中最后一次插入的标识值(自增 ID) |
| 事务与连接 | @@TRANCOUNT | 返回当前连接(会话)中打开的活动事务数 |
| 事务与连接 | @@SPID | 返回当前用户进程的服务器进程 ID |
| 性能与统计 | @@CONNECTIONS | 返回自 SQL Server 上次启动以来的登录或尝试登录的次数 |
| 性能与统计 | @@CPU_BUSY | 返回自 SQL Server 上次启动以来,CPU 用于执行 SQL Server 工作的微秒数 |
| 性能与统计 | @@IDLE | 返回自 SQL Server 上次启动以来,SQL Server 处于空闲状态的微秒数 |
| 性能与统计 | @@TOTAL_READ | 返回 SQL Server 执行的磁盘读取次数 |
| 性能与统计 | @@TOTAL_WRITE | 返回 SQL Server 执行的磁盘写入次数 |
===== 注释符、运算符与通配符 =====
=== 注释符 ===
*单行注释: --
*多行注释: /* */
不同数据库的特殊注释语法:MySQL:支持 # 作为单行注释
=== 算术运算符 ===
<html>
<!– 1. 新增父容器 .main-layout –>
<!-- 2. 左边:原有的说明方框 -->
<div class="dw-isolated-card">
<fieldset>
<!-- 标题 -->
<legend style= "font-family:Courier New;font-size:18px;">
<span class="box-icon"></span>
说 明
</legend>
<!-- 正文 -->
<div class="box-content">
<p>当两个整数相除,SQL Server和 MySQL 默认会执行整数除法,结果会截断小数部分</p> <p>🚩 SELECT 7 / 2;结果:3 (而不是 3.5)</p> <p>解决办法:将其中一个数转换为浮点数,如 SELECT 7.0 / 2; 或 SELECT CAST(7 AS DECIMAL)/2;</p> <p>任何数与 NULL 运算,结果都是 NULL</p> <p></p>
<!-- 底部装饰条 -->
<div class="card-footer"></div>
</fieldset>
</div>
<!-- 3. 右边:新增的表格区域 -->
<div class="table-container">
<table>
<thead>
<tr>
<th>运算符</th>
<th>含义</th>
<th>示例</th>
<th>结果</th>
</tr>
</thead>
<tbody>
<tr>
<td>+</td>
<td>加法</td>
<td>SELECT 10 + 5;</td>
<td>15</td>
</tr>
<tr>
<td>-</td>
<td>减法</td>
<td>SELECT 10 - 5;</td>
<td>5</td>
</tr>
<tr>
<td>*</td>
<td>乘法</td>
<td>SELECT 10 * 5;</td>
<td>50</td>
</tr>
<tr>
<td>/</td>
<td>除法</td>
<td>SELECT 10 / 5;</td>
<td>2</td>
</tr>
<tr>
<td>%</td>
<td>取模(求余数)</td>
<td>SELECT 10 % 3;</td>
<td>1</td>
</tr>
</tbody>
</table>
</div>
</div>
</html>
=== 赋值运算符 ===
在 SQL Server 中,赋值主要通过 SET 或 SELECT 语句结合 = 号来实现
<code java>
DECLARE @myVar INT;
SET @myVar = 10; – 使用 = 将 10 赋给 @myVar
</code>
从 SQL Server 2008 开始,引入了复合赋值运算符3)
SET @myVar += 5; 等价于 SET @myVar = @myVar + 5;
在 SQL Server 中,= 就是赋值;在 MySQL 的 SELECT 语句中,必须用 := 来赋值,= 只用来做比较
=== 比较运算符 ===
^ 运算符 ^ 含义 ^ 示例 ^ 说明 ^
| = | 等于 | WHERE age = 18 | 判断两个表达式是否相等 |
| <> 或 != | 不等于 | WHERE status != 'Active' | <> 是 ISO 标准,!= 也是广泛支持的非标准写法 |
| > | 大于 | WHERE price > 100 | 判断左侧表达式是否大于右侧 |
| < | 小于 | WHERE age < 60 | 判断左侧表达式是否小于右侧 |
| >= | 大于或等于 | WHERE score >= 90 | 判断左侧表达式是否大于或等于右侧 |
| ⇐ | 小于或等于 | WHERE age ⇐ 18 | 判断左侧表达式是否小于或等于右侧 |
| BETWEEN … AND … | 范围查询 | WHERE price BETWEEN 10 AND 20 | 包含边界值,等价于 >= 10 AND ⇐ 20 |
| IN (…) | 列表匹配 | WHERE status IN ('Active', 'Pending') | 判断值是否在给定的列表中(多选一) |
| LIKE | 模糊匹配 | WHERE name LIKE '%张%' | % 代表任意长度字符,_ 代表单个字符 |
| IS NULL | 判断为空 | WHERE email IS NULL | 判断字段是否为空值(不可用 = NULL) |
| IS NOT NULL | 判断非空 | WHERE phone IS NOT NULL | 判断字段是否不为空值(不可用 != NULL) |
=== 逻辑运算符 ===
<html>
<table class="inline">
<thead>
<tr>
<th style="text-align: left;">运算符</th>
<th style="text-align: left;">含义</th>
<th style="text-align: left;">示例</th>
<th style="text-align: left;">说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>AND</td>
<td>逻辑与</td>
<td>WHERE age > 18 AND status = 'Active'</td>
<td>两个条件都为 TRUE 时,结果才为 TRUE</td>
</tr>
<tr>
<td>OR</td>
<td>逻辑或</td>
<td>WHERE city = 'Beijing' OR city = 'Shanghai'</td>
<td>只要有一个条件为 TRUE,结果即为 TRUE</td>
</tr>
<tr>
<td>NOT</td>
<td>逻辑非</td>
<td>WHERE NOT status = 'Inactive'</td>
<td>对条件结果取反,TRUE 变 FALSE,FALSE 变 TRUE</td>
</tr>
<tr>
<td>&&</td>
<td>逻辑与 (非标准)</td>
<td>WHERE age > 18 && status = 'Active'</td>
<td>部分数据库支持,建议优先使用 AND</td>
</tr>
<tr>
<td>||</td>
<td>逻辑或 (非标准)</td>
<td>WHERE city = 'Beijing' || city = 'Shanghai'</td>
<td>部分数据库支持,建议优先使用 OR</td>
</tr>
<tr>
<td>!</td>
<td>逻辑非 (非标准)</td>
<td>WHERE !status = 'Inactive'</td>
<td>部分数据库支持,建议优先使用 NOT</td>
</tr>
</tbody>
</table>
</html>
=== 连接运算符 ===
连接运算符 + 主要用于将两个或多个数据项(如字符串、变量、表达式或常量)合并为一个整体,其核心作用是在数据处理和输出格式化中实现内容的无缝拼接
=== 运算符优先级 ===
*在 SQL 中,运算符优先级遵循以下典型顺序(从高到低):
- 括号 ()
- 一元运算符:+(正), -(负), ~(按位取反)
- 算术运算符:*, /, +, -
- 字符串连接运算符:||
- 比较运算符:=, <>, >, >=, <, ⇐
- 特定条件运算符:IS NULL, LIKE, IN, BETWEEN
- 位运算符:&, ^, |
- 逻辑非:NOT
-逻辑与:AND
-逻辑或:OR
-赋值运算符:= (T-SQL), := (MySQL), 以及复合赋值 += 等
=== 通配符 ===
<html>
<table class="inline">
<thead>
<tr>
<th style="text-align: left;">通配符</th>
<th style="text-align: left;">含义</th>
<th style="text-align: left;">示例</th>
<th style="text-align: left;">说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>%</td>
<td>代表任意长度的任意字符</td>
<td>WHERE name LIKE '%张%'</td>
<td>匹配包含“张”的任意字符串,如“张三”、“小张”、“老张”</td>
</tr>
<tr>
<td>_</td>
<td>代表任意单个字符</td>
<td>WHERE name LIKE '_三'</td>
<td>匹配以任意单个字符开头且以“三”结尾的名字,如“张三”、“李三”</td>
</tr>
<tr>
<td>[]</td>
<td>字符列表中的任一单个字符</td>
<td>WHERE name LIKE '[张李王]三'</td>
<td>匹配“张三”、“李三”或“王三”(SQL Server 支持)</td>
</tr>
<tr>
<td>[^]</td>
<td>不在字符列表中的任一单个字符</td>
<td>WHERE name LIKE '[^张李]三'</td>
<td>匹配不以“张”或“李”开头且以“三”结尾的名字(SQL Server 支持)</td>
</tr>
<tr>
<td>[-]</td>
<td>字符范围内的任一单个字符</td>
<td>WHERE code LIKE '[A-C]001'</td>
<td>匹配“A001”、“B001”或“C001”(SQL Server 支持)</td>
</tr>
</tbody>
</table>
</html>
===== 流程控制 =====
=== BEGIN…END ===
BEGIN…END 是流程控制语言的关键字,主要用于将多条 SQL 语句组合为一个逻辑代码块,它的作用类似于 C、Java 等编程语言中的大括号 {}
<code java>
IF (@@ERROR <> 0)
BEGIN
SET @ErrorSaveVariable = @@ERROR;
PRINT 'Error encountered, ' + CAST(@ErrorSaveVariable AS VARCHAR(10));
END
– 如果不加 BEGIN…END,当 @@ERROR <> 0 时,只有 SET 语句会被执行,而 PRINT 语句无论条件是否成立都会执行
</code>
=== IF ===
<code java>
IF<条件表达式>
{命令行|程序块}
</code>
=== IF…ELSE ===
<code java>
IF<条件表达式>
{命令行1|程序块1}
ELSE
{命令行2|程序块2}
</code>
=== CASE ===
在 SQL 中,CASE 表达式用于实现条件逻辑,它允许你根据不同的条件返回不同的值。你可以把它理解为 SQL 中的 IF…ELSE IF…ELSE 逻辑
* CASE 表达式
<code java>
CASE input_expression
WHEN when_expression_1 THEN result_1
WHEN when_expression_2 THEN result_2
…
[ELSE else_result]
END
</code>
🚩
<code java>
SELECT ProductName,
CASE CategoryID
WHEN 1 THEN '电子产品'
WHEN 2 THEN '服装'
WHEN 3 THEN '食品'
ELSE '其他类别'
END AS CategoryName
FROM Products;
</code>
* 搜索 CASE 表达式
用于评估多个布尔表达式,返回第一个计算结果为 TRUE 的对应值。它比简单 CASE 更灵活,支持范围判断和复杂的逻辑条件
<code java>
CASE
WHEN boolean_condition_1 THEN result_1
WHEN boolean_condition_2 THEN result_2
…
[ELSE else_result]
END
</code>
🚩
<code java>
SELECT ProductName, Price,
CASE
WHEN Price > 1000 THEN '昂贵'
WHEN Price BETWEEN 100 AND 1000 THEN '适中'
WHEN Price < 100 THEN '便宜'
ELSE '未定价'
END AS PriceLevel
FROM Products;
</code>
<html>
<!– 使用高特异性的类名包裹 –>
<fieldset>
<!-- 标题 -->
<legend style= "font-family:Courier New;font-size:18px;">
<span class="box-icon"></span>
说 明
</legend>
<!-- 正文 -->
<div class="box-content">
<p>END 在这里的作用不是结束一个代码块,而是结束这个表达式</p> <p>IF…ELSE 是控制流语句,它需要 BEGIN…END 来划定一个代码块,告诉数据库引擎:“请把这一大堆语句当成一个整体来执行”</p> <p>CASE 是一个表达式(Expression):它的作用是“计算并返回一个值”。就像 1 + 2 返回 3</p> <p>为什么不需要 BEGIN? 因为 CASE 表达式内部不允许包含多条独立的 SQL 语句</p>
<!– 底部装饰条 –>
</fieldset> </div> </html> === WHILE === <code java> WHILE<条件表达式> BEGIN <命令行|程序块> END </code> === WHILE…CONTINUE…BREAK === <code java> WHILE<条件表达式> BEGIN <命令行|程序块> [BREAK] [CONTINUE] [命令行|程序块] END </code> === RETURN === 在 SQL 中,RETURN 是一个非常关键的控制流关键字,它的主要作用是无条件地立即终止当前的执行流程,并退出当前的程序单元 * RETUR命令返回的内定值及其含义 ^ 状态码 ^ 官方建议含义 ^ 状态码 ^ 官方建议含义 ^ | -1 | 找不到对象或权限不足 | -2 | 发生语法错误 | | -3 | 超时(Timeout) | -4 | 违反权限规则 | | -5 | 发生死锁(Deadlock) | -6 | 发生致命错误 | | -7 | 发生数据类型转换错误 | -8 | 字符串被截断 | | -9 | 无效的列名 | -10 | 无效的表名 | | -11 | 无效的数据库名 | -12 | 无效的参数 | | -13 | 违反约束 | -14 | 违反触发器 | | -99 到 -999 | 系统保留的错误代码范围 | F | 程序执行成功 | === GOTO === 在 SQL Server 中,GOTO 是一种流程控制语句,它的主要作用是改变代码的执行顺序,使程序无条件跳转到指定的“标签(Label)”处继续执行 <code java> – 1. 定义标签(标签名后必须加冒号) label_name: – 2. 改变执行流程(跳转到指定标签) GOTO label_name; </code> === WAITFOR === WAITFOR 是 SQL Server中用于控制执行流程的命令。它的主要作用是暂停或延迟批处理、存储过程或事务的执行,直到指定的时间间隔过去,或者到达某个特定的时间点 * 语法: WAITFOR DELAY '时:分:秒' 123 ''