SQL Server中的通配符和转义字符

通配符

SQL中的通配符用来代替一个或者多个字符。

SQL通配符与LIKE运算符一起使用。

 

SQL Server中常用的通配符

%

匹配任意长度的(长度可以为0)字符

如’m%n’匹配字符mn之间有任意个字符的字符串,匹配的示例有manminmonmoon...

_

匹配任意单个字符

如’m_n’匹配字符mn之间含有任意一个字符的字符串,匹配的示例有manminmon...

 

[字符集合]

匹配字符集合中的任何一个字符

如’[mz]’匹配字符m或者z,’[m-z]’匹配介于mz之间的任意单个字符。

 

[^]

匹配不在括号中的任意单个字符

如’[^mz]’匹配任何不为m或者z的单个字符。

 

转义字符

使用转义字符,可以告诉DBMS,查询中的通配符不再是通配符,而是字符的实际值。

如使用转义字符对“%”进行转义后,“%”就表示百分号本身了。

 

使用ESCAPE 定义转义字符

看下面的示例:

CREATE TABLE  tb_TestTable(
id int NOT NULL IDENTITY,
name NVARCHAR(64),
PRIMARY KEY(id));
INSERT INTO tb_TestTable(name) VALUES('tiana');
INSERT INTO tb_TestTable(name) VALUES('tiana5');
INSERT INTO tb_TestTable(name) VALUES('tiana5%');
SELECT name FROM tb_TestTable WHERE	name LIKE '%/%' ESCAPE '/' 

例子中先定义表tb_TestTable,再向其中插入3条数据,最后对表进行查询操作。

查询中的 LIKE '%/%' ESCAPE '/' 子句中,'/'被定义为转义字符,这将告诉DBMS:字符串'%/%'中的第二个百分号为实际值,而不是通配符。当然这里的第一个百分号仍然为通配符。所以,这里查询的结果应该是:'tiana5%'。

在SQL SERVER中,若不使用ESCAPE子句定义转义字符的话,还可以使用’[%]’的形式告诉DNMS:这里的%不再是通配符而是百分号本身。

所以上面的查询也可以写成:

SELECT name FROM tb_TestTable WHERE name LIKE '%[%]'

上面的介绍同样适用于其他通配符,对单引号,双引号同样适用。


 

 

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
轻轻松松学数据库!!SQL Server 2008是微软的SQL Server数据库的最新版本,在该版本的数据库产品融入了更多商业智能的内容。本书也使用了一篇专门讲解了与商业智能有关的一些内容。 本书总分为5篇,共21章。第一篇主要讲解数据库的基础,包括数据库的概念及安装。第二篇讲解数据库管理的常用知识,包括数据库的管理、表的管理、确保数据的完整性及用户权限的设置等内容。第三篇主要讲解SQL的编程,包括T-SQL语言、存储过程及触发器。第四篇讲解与商业智能有关的内容,包括集成服务、报表服务和分析服务。最后一篇是综合案例篇,分别使用.NET和Java语言实现了与SQL Server 2008的连接,并完成了图书管理系统和在线订餐系统。 第一篇 SQL Server 2008基础篇 第1章 学习数据库的准备 ( 教学视频:58分钟) 15 1.1 认识数据库 15 1.1.1 为什么要使用数据库 15 1.1.2 认识数据库产品 15 1.2 了解数据库对象 17 1.2.1 表 17 1.2.2 视图 17 1.2.3 索引 18 1.2.4 存储过程 18 1.2.5 触发器 18 1.3 认识SQL语言 18 1.3.1 什么是SQL 18 1.3.2 SQL语言的分类 19 1.4 绘制E-R图设计数据库 20 1.4.1 绘制E-R图的基本要素 20 1.4.2 E-R图绘制实例 22 1.5 小结 24 1.6 习题 24 第2章 数据库的安装 ( 教学视频:26分钟) 26 2.1 SQL Server 2008版本介绍 26 2.1.1 SQL Server 2008服务器版 26 2.1.2 SQL Server 2008专业版 26 2.2 SQL Server 2008环境需求 27 2.2.1 SQL Server 2008 Enterprise的 软硬件要求 27 2.2.2 SQL Server 2008 Enterprise Evaluation的软硬件要求 28 2.3 安装SQL Server 2008 29 2.3.1 自己动手安装SQL Server 2008 29 2.3.2 安装示例数据库 39 2.4 认识SQL Server Management Studio (企业管理器) 40 2.4.1 访问SQL Server Management Studio 40 2.4.2 SQL Server Management Studio 菜单简介 42 2.4.3 查询编辑器窗口 43 2.4.4 对象资源管理器 44 2.4.5 SQL编辑器 44 2.5 小结 45 2.6 习题 45 第二篇 SQL Server 2008管理篇 第3章 数据库操作 ( 教学视频:43分钟) 47 3.1 在SSMS创建数据库 47 3.1.1 数据库命名需要注意的问题 47 3.1.2 数据库的所有者与权限 48 3.1.3 创建数据库 48 3.2 在SSMS修改数据库配置 52 3.2.1 使用SSMS修改数据库配置的 通用步骤 52 3.2.2 在SSMS添加数据库文件 53 3.2.3 在SSMS删除数据库文件 53 3.2.4 修改数据库的所有者 55 3.2.5 限制用户的访问 56 3.2.6 设置用户对数据库的使用权限 57 3.2.7 修改数据库名称 59 3.3 使用SQL语句创建、修改、 删除数据库 59 3.3.1 用CREATE DATABASE语句 创建数据库 59 3.3.2 用ALTER DATABASE语句 修改数据库 60 3.3.3 用DROP DATABASE语句 删除数据库 62 3.4 附加与分离数据库 63 3.4.1 分离数据库 63 3.4.2 附加数据库 64 3.5 编写数据库脚本文件 66 3.6 综合练习 67 3.7 小结 69 3.8 习题 69 第4章 数据表操作 ( 教学视频:39分钟) 71 4.1 认识数据类型 71 4.1.1 字型数据类型 71 4.1.2 数值型数据类型 72 4.1.3 日期和时间数据类型 73 4.1.4 其他数据类型 73 4.2 创建数据表 74 4.2.1 创建数据表的语法 74 4.2.2 创建主键 75 4.2.3 使用SSMS创建表 76 4.2.4 创建标识列 78 4.3 修改表结构 79 4.3.1 修改表结构的语法 80 4.3.2 在SSMS修改表结构 82 4.4 表的删除、截断与重命名 82 4.4.1 使用SSMS删除和重命名表 83 4.4.2 使用DROP TABLE语句删除表 83 4.4.3 截断表 84 4.4.4 重命名表 85 4.5 小结 85 4.6 习题 85 第5章 确保数据完整性 ( 教学视频:89分钟) 87 5.1 认识约束 87 5.1.1 什么是约束 87 5.1.2 约束的类型 88 5.1.3 约束的语法 89 5.2 使用约束 90 5.2.1 利用SSMS创建主键约束 90 5.2.2 利用T-SQL增加主键约束 91 5.2.3 利用SSMS创建外键约束 92 5.2.4 利用T-SQL增加外键约束 93 5.2.5 利用SSMS工具创建CHECK 约束 94 5.2.6 利用T-SQL增加CHECK约束 95 5.2.7 利用SSMS工具删除约束 96 5.3 事务的使用 96 5.3.1 什么是事务 96 5.3.2 事务的特性 97 5.3.3 事务的模式类型 97 5.3.4 事务的保存点 99 5.4 并发控制 100 5.4.1 并发访问的问题 100 5.4.2 SQL Server的锁 101 5.4.3 查看活跃事务 102 5.4.4 事务隔离级别 104 5.4.5 事务隔离级别的设置 104 5.5 事务的阻塞 105 5.6 死锁 107 5.6.1 死锁的产生 107 5.6.2 处理死锁 108 5.6.3 预防死锁 109 5.7 索引 109 5.7.1 认识索引 110 5.7.2 索引的创建 111 5.7.3 索引的管理 113 5.8 小结 115 5.9 习题 116 第6章 用户和权限管理 ( 教学视频:37分钟) 117 6.1 用户管理 117 6.1.1 创建使用Windows身份验证的 SQL Server 登录名 117 6.1.2 创建使用SQL Server身份验证的 SQL Server登录名 120 6.1.3 利用Transact-SQL创建 登录账号 121 6.1.4 创建数据库用户 122 6.1.5 使用Transact-SQL创建 数据库用户 123 6.1.6 登录账号和数据库用户的关系 124 6.2 认识角色 125 6.2.1 角色的划分 125 6.2.2 创建角色 127 6.2.3 给用户授予角色 128 6.3 认识权限 129 6.3.1 数据控制语言语法 129 6.3.2 给用户授予权限 131 6.4 架构 131 6.4.1 认识架构 132 6.4.2 架构的创建使用 133 6.4.3 架构的修改删除 134 6.5 小结 134 6.6 习题 135 第7章 数据的导入/导出与备份/恢复 ( 教学视频:27分钟) 136 7.1 了解SQL Server导入和导出向导 136 7.2 导入/导出数据 138 7.2.1 数据的导出 138 7.2.2 数据的导入 142 7.3 数据备份 145 7.3.1 认识数据备份 145 7.3.2 使用SSMS工具备份数据库 146 7.3.3 使用SSMS工具差异备份数据库 147 7.4 恢复数据 148 7.4.1 认识恢复数据 148 7.4.2 如何修改恢复模式 149 7.4.3 使用SSMS恢复数据库 150 7.5 小结 151 7.6 习题 151 第8章 使用SQL Server 2008 自动化管理功能 ( 教学视频:20分钟) 153 8.1 认识SQL Server代理 153 8.1.1 什么是SQL Server 代理 153 8.1.2 使用SQL Server代理 154 8.2 认识作业 155 8.2.1 什么是作业 155 8.2.2 创建作业 156 8.2.3 管理作业 160 8.3 认识警报 163 8.3.1 创建警报 164 8.3.2 在警报触发作业 165 8.3.3 管理警报 166 8.4 认识操作员 166 8.4.1 创建操作员 167 8.4.2 管理操作员 169 8.5 小结 169 8.6 习题 170 第9章 查询数据 ( 教学视频:64分钟) 171 9.1 在SSMS查看数据 171 9.2 使用简单SELECT语句查询数据 171 9.2.1 查询表所有数据 171 9.2.2 查询表指定字段的数据 172 9.2.3 查询结果去除重复信息 174 9.2.4 根据现有列值计算新列值 174 9.2.5 命名新列 175 9.2.6 将查询结果保存为新表 176 9.2.7 连接字段 177 9.3 使用SELECT语句获取满足查询 条件的数据 178 9.3.1 指针与字段变量的概念 178 9.3.2 条件表达式 179 9.3.3 WHERE子句用法 181 9.3.4 根据条件查询数值数据 182 9.3.5 根据条件查询字数据 183 9.3.6 根据条件查询日期数据 184 9.3.7 按范围查询数据 185 9.3.8 查询NULL值 186 9.4 排序查询数据 186 9.4.1 按单列排序 187 9.4.2 设置排序方向 187 9.4.3 按多列排序 188 9.4.4 按字段位置排序 188 9.4.5 查询前5行数据 189 9.4.6 WHERE与ORDER BY的 结合使用 189 9.5 高级条件查询 190 9.5.1 AND运算 190 9.5.2 OR运算 191 9.5.3 AND与OR的优先顺序问题 192 9.5.4 NOT运算 193 9.5.5 IN运算 193 9.5.6 LIKE运算与“%”通配符 195 9.5.7 “_”通配符的使用 197 9.5.8 “[]”通配符的使用 197 9.5.9 定义转义字符 198 9.6 小结 199 9.7 习题 199 第10章 函数与分组查询数据 ( 教学视频:42分钟) 201 10.1 系统函数 201 10.1.1 聚合函数 201 10.1.2 类型转换函数 202 10.1.3 日期函数 204 10.1.4 数学函数 206 10.1.5 字函数 207 10.1.6 其他几个系统函数 208 10.2 分组查询 212 10.2.1 将表内容按列分组 212 10.2.2 聚合函数与分组配合使用 214 10.2.3 查询数据的直方图 215 10.2.4 排序分组结果 215 10.2.5 反转查询结果 216 10.2.6 使用HAVING子句设置 分组查询条件 217 10.3 小结 218 10.4 习题 218 第11章 多表连接查询和子查询 ( 教学视频:79分钟) 220 11.1 连接查询 220 11.1.1 使用无连接规则连接两表 220 11.1.2 使用有连接规则连接两表 221 11.1.3 使用多表连接查询数据 222 11.1.4 使用表别名简化语句 223 11.1.5 使用INNER JOIN连接查询 223 11.1.6 连接查询实例 224 11.2 高级连接查询 226 11.2.1 自连接查询 226 11.2.2 内连接查询 227 11.2.3 左外连接查询 229 11.2.4 右外连接 230 11.2.5 全外连接 230 11.2.6 交叉连接查询 230 11.2.7 连接查询使用聚合函数 232 11.2.8 高级连接查询实例 233 11.3 组合查询 235 11.3.1 使用组合查询 236 11.3.2 使用UNION的规则 237 11.3.3 使用UNION得到复杂的统计 汇总样式 238 11.3.4 排序组合查询的结果 238 11.3.5 组合查询的实例 239 11.4 子查询 240 11.4.1 使用返回单值的子查询 240 11.4.2 子查询与聚合函数的配合使用 241 11.4.3 子查询的实例 241 11.5 在SSMS查询设计器设计查询 242 11.6 综合练习 245 11.7 小结 246 11.8 习题 246 第12章 插入、更新和删除数据 ( 教学视频:39分钟) 248 12.1 在SSMS插入、更新、删除数据 248 12.1.1 插入数据 248 12.1.2 更新数据 249 12.1.3 删除数据 249 12.2 使用INSERT语句插入数据 250 12.2.1 插入完整的行 250 12.2.2 向日期时间型字段插入数据 251 12.2.3 将数据插入到指定字段 251 12.2.4 将查询结果插入表 252 12.3 使用UPDATE语句更新数据 254 12.3.1 更新单个字段的数据 254 12.3.2 更新多个字段的数据 255 12.3.3 使用表连接更新数据 256 12.3.4 使用UPDATE语句删除 指定字段的数据 256 12.4 使用DELETE语句删除数据 257 12.4.1 使用DELETE语句删除 指定记录 257 12.4.2 在DELETE语句使用 多表连接 258 12.4.3 使用DELETE语句删除 所有记录 259 12.5 使用TRUNCATE语句删除 所有记录 260 12.6 综合练习 260 12.7 小结 262 12.8 习题 263 第13章 视图 ( 教学视频:38分钟) 264 13.1 视图基础 264 13.2 视图的创建 266 13.2.1 在SSMS创建视图 266 13.2.2 使用CREATE VIEW语句 创建视图 268 13.2.3 用别名命名视图字段 269 13.2.4 创建视图时的注意事项 270 13.2.5 创建加密视图 271 13.3 查看与修改视图 272 13.3.1 查看视图内容 272 13.3.2 在SSMS修改视图 272 13.3.3 用ALTER VIEW修改视图 272 13.4 使用视图操作表数据 274 13.4.1 在SSMS操作 视图的数据 274 13.4.2 使用INSERT语句插入数据 274
1 SQL基础 1.1 基本概念 结构化查询语言(Structured Query Language)简称SQL,是一种关系数据库查询语言,用于存取数据以及查询、更新和管理关系数据库系统。 1.2 语句结构 1.2.1 数据查询语言(DQL) 对数据库进行的信息查询,select。 1.2.2 数据操作语言(DML) 用于操作关系型数据库对象内部的数据,insert、update、delete。 1.2.3 数据定义语言(DDL) 用来建立及定义数据表、字段以及索引等数据库结构,create、alter、drop 。 1.2.4 数据控制语言(DCL) 用于控制对数据库里数据的访问,通常用于创建与用户访问相关的对象以及控制用户的权限,grant、revoke(撤销)。 1.2.5 事务控制命令(TPL) 用于管理数据库事务,commit、rollback、savepoint(在一组事务里创建标记点以用于回退)。 1.3 表的构成 1.3.1 字段 字段是表里的一列,用于保持每条记录的特定信息 1.3.2 记录 记录,也被成为一行数据,是表里的每一行 1.4 完整性的约束条件 1.4.1 实体完整性 关系模型的实体完整性在create table用primary key约束实现,primary key约束用于定义主键,它保证主键的唯一性和非空性。 1.4.2 参照完整性 关系模型的参照完整性可以通过在create table用foreign key (<外键>) references <被参照表名> (<与外键对应的主键名>)进行约束定义。 1.4.3 用户定义完整心 在create table语句可以根据应用要求,定义属性以及元组上的约束。 常见的用户定义的完整性约束有: not null或null约束。 unique约束:唯一性约束。 default约束:默认值约束。 check约束:检查约束,check约束通过约束条件表达式设置列值应该满足的条件。 1.5 范式 1.5.1 第一范式 1.5.1.1 规范 无重复的列,确保每列保持原子性,即数据库表的所有字段值都是不可分解的原子值。 1.5.1.2 举例 姓名 年龄 联系电话 地址 省 市 详细地址 1.5.2 第二范式 1.5.2.1 规范 属性完全依赖于主键,确保表每列都与主键相关。 1.5.2.2 举例 订单表 订单Id 商品Id 总金额 商品名称 001 1 10 苹果 001 2 10 橘子 联合主键订单Id、商品Id => 商品表 商品Id 商品名称 单价 订单表 订单Id 总金额 1.5.3 第三范式 1.5.3.1 规范 属性不依赖于其它非主属性,确保数据表的每一列数据都和主键直接相关,而不能间接相关,即要求一个数据库表不包含已在其它表已包含的非主关键字信息。 1.5.3.2 举例 党员表 党员Id 党员姓名 组织Code 合3NF 党员表 党员Id 党员姓名 组织名称 不合3NF 组织表 组织Code 组织名称 1.6 外连接 1.6.1 准备 create table student_A( uuid varchar2(32), name varchar2(100)); create table student_B( uuid varchar2(32), name varchar2(100)); insert into student_A values('1','小黄'); insert into student_A values('2','小黑'); insert into student_A values('3','小红'); insert into student_B values('1','大黄'); insert into student_B values('2','大黑'); insert into student_B values('4','大红'); insert into student_B values('4','大紫'); 1.6.2 左连接(left join) 1.6.2.1 说明 查询指定的左表的所有行,而不仅仅是联接列所匹配的行;如果左表的某行在右表没有匹配行,则在相关联的结果集行右表的所有选择列表列均为空值。 1.6.2.2 语法 select A.*,B.* from student_A A left join student_B B on A.Uuid = B.Uuid; 1.6.2.3 结果 1.6.2.4 (+)表示 select A.*,B.* from student_A A,student_B B where A.Uuid = B.Uuid(+) 1.6.3 右连接(right join) 1.6.3.1 说明 查询指定的右表的所有行,而不仅仅是联接列所匹配的行;如果右表的某行在左表没有匹配行,则在相关联的结果集行左表的所有选择列表列均为空值。 1.6.3.2 语法 select A.*,B.* from student_A A right join student_B B on A.Uuid = B.Uuid; 1.6.3.3 结果 1.6.3.4 (+)表示 select A.*,B.* from student_A A,student_B B where A.Uuid(+) = B.Uuid 1.6.4 全外连接(full outer join) 1.6.4.1 说明 完整外部联接返回左表和右表的所有行;当某行在另一个表没有匹配行时,则另一个表的选择列表列包含空值;如果表之间有匹配行,则整个结果集行包含基表的数据值。 1.6.4.2 语法 select A.*, B.* from student_A A full outer join student_B B on A.Uuid = B.Uuid; 1.6.4.3 结果 1.6.4.4 全外连接不支持(+)写法 1.6.5 (+) + 表示补充,即哪个表有加号,这个表就是匹配表。 1.7 运算 1.7.1 比较 =、>,<,>=,<=,!=,<>, 1.7.2 确定范围 between and 、not between and 1.7.3 确定集合 in、not in 1.7.4 字匹配 like(“%”匹配任何长度,“_”匹配一个字) 1.7.5 转义字符 1.7.5.1 常规转义字符 “\”转义字符,“\%”则表示单纯的字“%” 1.7.5.2 escape escape关键字经常用于使某些特殊字,如通配符:'%','_'转义为它们原来的字的意义,被定义的转义字符通常使用'\',但是也可以使用其他的号。 select * from Student_a where name like '%$%%' escape '$'; 1.7.6 空值 is null、is not null 1.7.7 集合查询 union(并)、intersect(交)、minus(差) 1.7.8 多重条件 and、or、not 1.7.9 对查询结果分组 <group by 列名> 1.7.10 分组筛选条件 [having <条件表达式>] 1.7.11 字串拼接 select 'A' || 'B' from dual; // || 拼接 1.8 函数 1.8.1 聚集函数 count、sum、avg、max、min 1.8.2 case when 1.8.2.1 语法 select t.uuid, t.score, case when t.score > 90 then '优秀' when t.score > 60 then '及格' else '不及格' end from exam_user_exam t 1.8.3 decode 1.8.3.1 语法 select decode(x,1,'x is 1', 2 , 'x is 2','others') from dual 1.8.3.2 说明 当x等于1时,则返回‘x is 1’,当x等于2时,则返回‘x is 2’,否则,返回‘others’。 1.8.4 nulls first(nulls last)排序 1.8.4.1 语法 select * from dy_info t order by t.degree nulls first 1.8.4.2 说明 控制null显示行位置 1.8.5 Nvl 1.8.5.1 语法 select nvl(t.sap,'空') from dy_info t; 1.8.5.2 说明 如果sap号为空,则返回‘空’,否则返回sap号。 1.8.6 递归查询 1.8.6.1 语法 select t.* from g_organ t start with t.organcode = '080' connect by prior t.parentcode = t.organcode; //递归查询父节点 select t.* from g_organ t start with t.organcode = '080' connect by t.parentcode = prior t.organcode; //递归查询子节点 1.8.7 union 和 union all 1.8.7.1 语法 select * from dual union all select * from dual 1.8.7.2 说明 union 会对查询数据进行去重并排序,union all只是简单的将两个结果合并。 1.8.8 wm_concat 1.8.8.1 语法 select wm_concat(t.role_name) from g_role t where t.role_name like '%书记%' 1.8.8.2 说明 拼接字串,结果为:‘党工委副书记,总支副书记,党支部书记,党委书记,党委副书记,党总支书记,党工委书记,党总支副书记,党支部副书记’ 1.8.9 相似度 1.8.9.1 语法 select utl_match.edit_distance_similarity('aaaaa','bbaaaa') from dual; 1.8.10 去格式 1.8.10.1 oracle正则表达式:去除<></>格式 select REGEXP_REPLACE(title,'<[^>]*>','') title from exam_question 1.8.11 rank() over (partition by …) 1.8.11.1 语法 select organcode,score,ranknum from ( select t.organcode, t.score, rank() over (partition by t.organcode order by t.score desc) ranknum from exam_user_exam t) where ranknum < 4 1.8.11.2 说明 获取每个组织,考试成绩前三名。 1.9 存储过程 1.9.1 定义 存储过程是一组为了完成特定功能的SQL语句集,经编译后存储在数据库。用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。 1.9.2 准备 create table t_user ( username varchar2(20), password varchar2(20) ); create table t_user_temp ( username varchar2(20), password varchar2(20) ); insert into t_user(username,password) values('小王','1111'); insert into t_user(username,password) values('小李','1111'); 1.9.3 创建存储过程 create or replace procedure adduser as begin insert into t_user_temp(username,password) select username,password from t_user t where t.username = '小李'; end adduser; 1.9.4 执行 begin adduser; end; 1.9.5 验证 select * from t_user; select * from t_user_temp 2 SQL深入 2.1 常用 2.1.1 表空间 2.1.1.1 创建表空间 create tablespace TS_DJY datafile 'd:/software/oracle/tablespace/ts_djy.dat' size 1024M autoextend on next 100M maxsize 2048M; 2.1.1.2 指定用户表空间 alter user cssdj default tablespace TS_DJY; 2.1.1.3 指定表的表空间 create table t_student( uuid varchar2(32) )tablespace TS_DJY; 2.1.2 自增sequence 2.1.2.1 创建 create sequence seq_student_uuid minvalue 1 maxvalue 999999999999999 start with 1 increment by 1 nocache; 2.1.2.2 使用 select seq_student_uuid.nextval from dual; //获取下一个 select seq_student_uuid.currval from dual; //获取当前 2.1.3 批量插入 2.1.3.1 查询结果批量插入 insert into tablea(cola,colb) select cola,colb from tableb; 2.1.3.2 创建相同的表结构并插入数据(备份表数据) create tab_new as select * from tab_old; 2.1.3.3 创建相同的表结构不插入数据 create tab_new as select * from tab_old where rownum=0; 2.1.4 伪列伪表 2.1.4.1 伪列 伪列不是表的真实列,但是你可以象使用真实列一样使用伪列,常用伪列:rowid行的绝对物理编号,每一行是唯一的。rownum序号,返回查询结果的每行序号。系统时间sysdate,返回系统当前时间。 2.1.4.2 伪表 select * from dual; 2.1.5 系统表 2.1.5.1 user_tables 当前用户表信息 2.1.5.2 user_tab_columns 当前用户表所有列信息,搜索列所在的表: select * from user_tab_columns t where t.column_name like '%ORGANCODE%'; 2.1.5.3 user_tablespaces 当前用户表空间 2.1.5.4 dba_users 数据库所有用户 2.1.5.5 dba_tables 数据库所有表 2.1.5.6 dba_tablespaces 数据库所有表空间 2.1.6 锁表解锁 2.1.6.1 查看锁表信息 select l.OBJECT_ID,s.SID,s.SERIAL#,s.USERNAME, s.MACHINE from V$locked_Object l,V$session s where l.SESSION_ID = s.SID; 2.1.6.2 解锁 alter system kill session 'sid,serial#'; 2.1.7 备份与恢复 2.1.7.1 导出 导出用户: exp cssdj/cssdj@zr owner=(cssdj,cssdj_zsy) file=d:/cssdj.dmp log=d:/cssdj.log 导出用户表: exp cssdj/cssdj@zr tables=(g_dict,g_dict_item) file=d:/cssdj.dmp log=d:/cssdl.log 2.1.7.2 导入 imp cssdj/cssdj@zr fromuser=cssdj_zsy touser=cssdj file=d:/cssdj.cmp log=d:/cssdj.log 2.1.7.3 数据泵 2.1.8 Dblink 2.1.8.1 创建 create database link orcllink connect to cssdj identified by cssdj using '(DESCRIPTION = (ADDRESS_LIST= (ADDRESS=(PROTOCOL = TCP)(HOST = 219.239.110.65)(PORT = 1521))) (CONNECT_DATA=(SID = orcl)))'; 2.1.8.2 删除 drop database link orcllink; 2.1.8.3 使用 select * from dy_info@orcllink; 2.2 Oracle与Mysql差异 2.2.1 Group by 2.2.1.1 Oracle select后面出现的列,如果没有使用集合函数,必须出现在group by 。 select sno,sname,sum(grade) from student group by sno,sname; //合法写法 select sno,sname,sum(grade) from student group by sno; //非法写法 select sno,min(sname),sum(grade) from student group by sno; //建议用这种写法,效率高些 2.2.1.2 Mysql select sno,sname,sum(grade) from student group by sno,sname; //合法写法 select sno,sname,sum(grade) from student group by sno; //合法写法 2.2.2 分页 2.2.2.1 Oracle 使用rownum来表明分页位置,而且rownum只能小于某值,不能大于某值,故而rownum和where联用才能完成数据范围的控制 2.2.2.2 Mysql mysql的分页可以用limit startNum,pageNum 2.3 了解 2.3.1 事务 2.3.1.1 Rollback start transaction; --开始事务 insert into g_dict values('test','测试','1',''); --执行数据操作语言(DML) select * from g_dict where code = 'test'; --可以查看是否执行正确 rollback; --错误执行rollback操作 commit; --正确执行commit操作 2.3.1.2 Savepoint start transaction; --开始事务 insert into g_dict values('t1','测试','1',''); --执行数据操作语言(DML) savepoint pointA; insert into g_dict values('t2','测试','1',''); --执行数据操作语言(DML) select * from g_dict where code = 'test33'; --可以查看是否执行正确 rollback to savepoint pointA; 2.3.2 利用执行计划评估SQL语句的性能 2.3.2.1 工具 在PL/SQL Developer写好一段SQL代码后,按F5,PL/SQL Developer会自动打开执行计划窗口,显示该SQL的执行计划。 2.3.2.2 查看总COST,获得资源耗费的总体印象 一般而言,执行计划第一行所对应的COST(即成本耗费)值,反应了运行这段SQL的总体估计成本,单看这个总成本没有实际意义,但可以拿它与相同逻辑不同执行计划的SQL的总体COST进行比较,通常COST低的执行计划要好一些。 2.3.2.3 了解执行计划的执行步骤 按照从左至右,从上至下的方法,了解执行计划的执行步骤; 执行计划按照层次逐步缩进,从左至右看,缩进最多的那一步,最先执行,如果缩进量相同,则按照从上而下的方法判断执行顺序,可粗略认为上面的步骤优先执行。每一个执行步骤都有对应的COST,可从单步COST的高低,以及单步的估计结果集(对应ROWS/基数),来分析表的访问方式,连接顺序以及连接方式是否合理。 2.3.2.4 分析表的访问方式 表的访问方式主要是两种:全表扫描(TABLE ACCESS FULL)和索引扫描(INDEX SCAN),如果表上存在选择性很好的索引,却走了全表扫描,而且是大表的全表扫描,就说明表的访问方式可能存在问题;若大表上没有合适的索引而走了全表扫描,就需要分析能否建立索引,或者是否能选择更合适的表连接方式和连接顺序以提高效率。 2.3.2.5 分析表的连接方式和连接顺序 表的连接顺序:就是以哪张表作为驱动表来连接其他表的先后访问顺序。 表的连接方式:简单来讲,就是两个表获得满足条件的数据时的连接过程。主要有三种表连接方式,嵌套循环(NESTED LOOPS)、哈希连接(HASH JOIN)和排序-合并连接(SORT MERGE JOIN)。我们常见得是嵌套循环和哈希连接。 嵌套循环:最适用也是最简单的连接方式。类似于用两层循环处理两个游标,外层游标称作驱动表,Oracle检索驱动表的数据,一条一条的代入内层游标,查找满足WHERE条件的所有数据,因此内层游标表可用索引的选择性越好,嵌套循环连接的性能就越高。 哈希连接:先将驱动表的数据按照条件字段以散列的方式放入内存,然后在内存匹配满足条件的行。哈希连接需要有合适的内存,而且必须在CBO优化模式下,连接两表的WHERE条件有等号的情况下才可以使用。哈希连接在表的数据量较大,表没有合适的索引可用时比嵌套循环的效率要高。 2.3.3 优化器 Oracle优化器分为基于规则的优化器(RBO)和基于代价的优化器(CBO)。 2.3.3.1 规则的优化器(RBO) RBO的优化方式,依赖于一套严格的语法规则,只要按照规则写出的语句,不管数据表和索引的内容是否发生变化,不会影响PL/SQL语句的"执行计划"。 2.3.3.2 基于代价的优化器(CBO) CBO计算各种可能"执行计划"的"代价",即cost,从选用cost最低的方案,作为实际运行方案。各"执行计划"的cost的计算根据,依赖于数据表数据的统计分布,ORACLE数据库本身对该统计分布是不清楚的,须要分析表和相关的索引,才能搜集到CBO所需的数据。 2.3.4 表分析analysis 2.3.4.1 说明 analyze table,一般可以指定分析表、所有字段、所有索引字段、所有索引,若不指定则全部都分析。 2.3.4.2 表分析 analyze table dy_info compute statistics; 2.3.4.3 删除分析数据 analyze table dy_info delete statistics; 2.3.5 oracle添加强制索引 如果使用的是CBO的话,可能SQL不执行索引,则可以添加强制索引执行索引。 2.3.5.1 语法 /*+index(tablename indexname)*/ 2.3.5.2 举例 select /*+index(t INDEX_SAP)*/* from dy_info t where t.sap = 'T6000890'

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值