SQL 基础

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

SQL 执行逻辑顺序

常量

数字常量

数字常量包括整数、小数以及浮点数 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 执行的磁盘写入次数 | ===== 注释符、运算符与通配符 ===== === 注释符 === *单行注释: -- *多行注释: /* */ :TIP 不同数据库的特殊注释语法: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; :TIP 在 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>&amp;&amp;</td> <td>逻辑与 (非标准)</td> <td>WHERE age > 18 &amp;&amp; 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 ''

1)
Structured Query Language 结构化查询语言
2)
浮点常量使用符号e指定
3)
+=,-=,*=,/=