一、基础查询
1
)单表查询
1.
查看表结构
使用两种方式可查看数据库的表结构:
![](https://i-blog.csdnimg.cn/direct/cadd47f1e03b4f4bafef06ec5dcdfd14.png)
![](https://i-blog.csdnimg.cn/direct/78fc74347d69446988a64f13c8830537.png)
查询后会显示该表的创建语句以及结构
2.
查询全表
使用
SELECT *
查询全表,此时数据库会返回表所有列
![](https://i-blog.csdnimg.cn/direct/474ad10e179c4c439e24d40e236f0747.png)
3.
行过滤
使用条件查询进行过滤,例如查询所有
ID
大于
103
的行:
![](https://i-blog.csdnimg.cn/direct/3dd507f2e0644d7286c8bb1697d8a833.png)
4.
查找控制
使用
IS NULL
为条件查找控制:
![](https://i-blog.csdnimg.cn/direct/de69124b2fd444678dbf33b04bc8606c.png)
5.
查询满足多个条件的行
使用
OR
字句来查询满足多个条件的行,但在实际应用中使用
OR
会严重降
低数据库的性能,所以尽量避免使用
OR
,可以改为
IN
![](https://i-blog.csdnimg.cn/direct/b2c2f411f0e14eee8d2fddad9a862d34.png)
6.
别名
使用
AS
在查询时给列取别名
![](https://i-blog.csdnimg.cn/direct/615fe2fa840a4e61bc0e4e27f456c4fc.png)
7.
列拼接
使用
||
可将几条列拼接起来,可以拼为一句话
![](https://i-blog.csdnimg.cn/direct/797694f2ea7c4e098684dee3297235b1.png)
8.
根据条件查询并对返回的信息进行标识
使用
CASE...END AS
对返回的信息进行标识,用
AS
为新的列取别名作为返回
的信息
![](https://i-blog.csdnimg.cn/direct/b852a573b22f4df2990e8dfbd1d714f9.png)
9.
使用
limit
限制返回结果的行数
![](https://i-blog.csdnimg.cn/direct/75e2bbf3f44a40f2894f659f6026b2d2.png)
2
)查询结果排序
使用
ORDER BY
对查询结果进行排序,
ASC
为升序,
DESC
为降序
![](https://i-blog.csdnimg.cn/direct/542396646d2f44cba37b29044d651fa7.png)
3
)使用
UNION ALL
进行多表联合检索
![](https://i-blog.csdnimg.cn/direct/27a86ceddfb6402eb672af080e95ceb9.png)
需注意多表联合检索时列的数据类型必须匹配,否则会报错
![](https://i-blog.csdnimg.cn/direct/c5cbeecd1c5543949f318eb2c196366f.png)
使用
UNION ALL
合并结果集后如果有重复数据可以使用
UNION
来合并,
UNION
有去重功能,例如使用
UNION ALL
:
![](https://i-blog.csdnimg.cn/direct/387278943db44b5b8efb50ed0633fe7b.png)
使用
UNION
后就不会出现重复行
![](https://i-blog.csdnimg.cn/direct/7201854a3c1b40189687aa9a4bd8fd5a.png)
二、层次查询
1.
概念
在实际生产应用中有很多地方会用到树状的数据结构,例如某部门的组织结
构,下辖有各个分部门,各个分部门下辖又有各个组织,这种数据结构在进行查
询时就使用到层次查询,涉及到父节点、子节点、叶节点等的应用。
2.
层次查询子句
1
)
LEVEL
伪列
LEVEL
伪列是表示当前数据在树状的数据结构图中的层级,不存在于表中,
查询时动态生成,树状数据结构的根节点
LEVEL
为
1
,以它开始依次向下递增,
例如:
![](https://i-blog.csdnimg.cn/direct/cd5e5ccc14d548b4ac7b725ae73622d7.png)
2
)
CONNECT_BY_ISLEAF
伪列
CONNECT_BY_ISLEAF
伪列是表示当前节点是否是叶节点(即不存在子节点,
例如上图中最下排三个节点就是叶节点),
1
表示是叶节点,
0
表示不是叶节点。
3
)
CONNECT_BY_ISCYCLE
伪列
检测
CONNECT BY
查询中 是否存在 循环。当 查询到达 一个循环 时,
CONNECT_BY_ISCYCLE
会返回
1
,表示存在循环;否则返回
0
,表示不存在循环。
这对于避免无限循环非常重要,因为在处理层次结构数据时,循环可能导致查询
永远无法结束。
4
)
connect by
与
PRIOR
关键字
使用
connect by
指定一个或多个父子关系的列,
数据库根据这些关系递归地检
索数据,然后
使用
PRIOR
关键字指定从一个行到另一个行建立连接,建立父子关
系,在以下这个例子中,通过
CONNECT BY
递归地查询所有下属员工。通过指定
PRIOR
关键字来建立员工之间的父子关系,可以构建整个层次结构的数据。
例如
EMPLOYEE_ID=101
的员工上级节点为
MANAGER_ID=100
,这两个节点
之 间 就 建 立 了 父 子 关 系 , 子 节 点 记 录 的
MANAGER_ID=
父 节 点 记 录 的
EMPLOYEE_ID
![](https://i-blog.csdnimg.cn/direct/ee585bc8aafd4ceeb0abc9c087bf18ff.png)
查询
LEVEL
、
CONNECT_BY_ISLEAF
、
CONNECT_BY_ISCYCLE
伪列
![](https://i-blog.csdnimg.cn/direct/ce66aa1084374a58bca8c05790cff7c4.png)
5
)
start with
关键字
使用
start with
关键字指定从哪一行开始查询,即将该节点作为根节点进行
查询
![](https://i-blog.csdnimg.cn/direct/9c2d01c004624c339a60daf487be052f.png)
三、并行查询
1.
自动并行
1
)查询默认的并行策略,此时是关闭的
![](https://i-blog.csdnimg.cn/direct/837a9bc0a24749229da60d8f4c9708fd.png)
2
)开启并行,并设置最大并行查询数为
4
,执行完成后重启数据库生效
![](https://i-blog.csdnimg.cn/direct/add81e1d99de45fbb9548a14343e6f22.png)
3
)未开启并行时查看查询表
T1
的执行计划
![](https://i-blog.csdnimg.cn/direct/ed7c1eee91354fd386bd5817e1a02a17.png)
开启并行查询后查看查询表
T1
的执行计划
![](https://i-blog.csdnimg.cn/direct/04db5d826f934528b83ff3da9d5371b7.png)
可以看到此时执行计划出现
LOCAL COLLECT
,这指的是在并行查询过程中,
各个并行执行的节点将它们处理的数据局部汇总的操作。
2.
手动并行
1
)修改
PARALLEL_POLICY
参数为
2
,开启手动并行模式,并重启数据库
![](https://i-blog.csdnimg.cn/direct/6ca2966f23f54b199f7499e475450ad2.png)
2
)执行命令查看执行计划,可以看到此时不是并行查询的
![](https://i-blog.csdnimg.cn/direct/05916ce24044425984a7d72b8a0a8201.png)
3
)因为开启了手动并行,所以需要使用
HINT
来指定并行度,语法如下
/*+ PARALLEL([<
表名
>] <
并行任务个数
>) */
![](https://i-blog.csdnimg.cn/direct/ce816f85051e43e18188849e4dea5596.png)
四、闪回查询
1.
闪回技术
当用户操作不当导致错误的删改数据时,可以使用闪回技术可以帮助查询找
回,通过
ENABLE_FLASHBACK
参数控制闪回功能的开启关闭(
1
为开启,
0
为关
闭),开启闪回功能后数据库会保留回滚段一段时间,由
UNDO_RETENTION
参
数指定回滚段的时长(缺省
90
秒,最大一天)。
限制:
MPP
不支持闪回,数据守护环境下,备库不支持闪回。
不能对系统表、临时表、
HUGE
表、内部辅助表、动态表等执行闪回
表操作。
2.
操作
1
)开启闪回功能
![](https://i-blog.csdnimg.cn/direct/c3def19dda8a4cb582f5eb4e33509f5f.png)
2
)查看当前回滚段保留时间,显示当前默认回滚段保留时间为
90s
![](https://i-blog.csdnimg.cn/direct/d68d0f151ce4494d9c449c5981176aac.png)
3
)修改回滚段保留时间
4
)按时间查询历史记录,通过指定一个
timestamp
时间类型,来查询过去某个
特定时刻的表;
查询当前时间表的状态和时间
![](https://i-blog.csdnimg.cn/direct/8f00f9f3ebee4ac8991ce62655608844.png)
![](https://i-blog.csdnimg.cn/direct/7c883f188d7a413a94313eecf94ad1d2.png)
在表中插入新的数据:
![](https://i-blog.csdnimg.cn/direct/322234323a634ad68de3c83e2d6f66db.png)
闪回查询之前时间点的表(因为我的虚拟机时间和数据库时间不一样,所以更换
为
Windows
上的数据库操作):
![](https://i-blog.csdnimg.cn/direct/97562ec05444456abcc143a4a2675a86.png)
5
)创建临时表并进行闪回查询
查看当前时间
![](https://i-blog.csdnimg.cn/direct/5bda82a9b07749f89112bf8df7a82d05.png)
在临时表
T2
中插入数据,使用闪回查询查询插入之前的
T2
![](https://i-blog.csdnimg.cn/direct/08e8d8d50c7d44bb86066c849abcdf6e.png)
执行命令后出现报错,由此可见数据库不支持临时表的闪回查询
![](https://i-blog.csdnimg.cn/direct/9e3abbe2437746b9a9458a507a533822.png)
同样的,创建视图也不支持闪回查询