【JaveWeb教程】(20) MySQL数据库开发之 基本查询、条件查询、聚合函数、分组查询、排序查询、分页查询 详细代码示例讲解

在这里插入图片描述


在上次学习的内容中,我们讲解了:

  • 使用DDL语句来操作数据库以及表结构(数据库设计)
  • 使用DML语句来完成数据库中数据的增、删、改操作(数据库操作)

我们今天还是继续学习数据库操作方面的内容:查询(DQL语句)。

查询操作我们分为两部分学习:

  • DQL语句-单表操作
  • DQL语句-多表操作

1. 数据库操作-DQL

1.1 介绍

DQL英文全称是Data Query Language(数据查询语言),用来查询数据库表中的记录。

查询关键字:SELECT

查询操作是所有SQL语句当中最为常见,也是最为重要的操作。在一个正常的业务系统中,查询操作的使用频次是要远高于增删改操作的。当我们打开某个网站或APP所看到的展示信息,都是通过从数据库中查询得到的,而在这个查询过程中,还会涉及到条件、排序、分页等操作。

在这里插入图片描述

1.2 语法

DQL查询语句,语法结构如下:

SELECT
	字段列表
FROM
	表名列表
WHERE
	条件列表
GROUP  BY
	分组字段列表
HAVING
	分组后条件列表
ORDER BY
	排序字段列表
LIMIT
	分页参数

我们今天会将上面的完整语法拆分为以下几个部分学习:

  • 基本查询(不带任何条件)
  • 条件查询(where)
  • 分组查询(group by)
  • 排序查询(order by)
  • 分页查询(limit)

准备一些测试数据用于查询操作:

create database db02; -- 创建数据库
use db02; -- 切换数据库
-- 员工管理(带约束)
create table tb_emp (
    id int unsigned primary key auto_increment comment 'ID',username varchar(20) not null unique comment '用户名',password varchar(32) default '123456' comment '密码',name varchar(10) not null comment '姓名',gender tinyint unsigned not null comment '性别,说明: 1 男,2 女',image varchar(300) comment '图像',job tinyint unsigned comment '职位,说明: 1 班主任,2 讲师,3 学工主管,4 教研主管',entrydate date comment '入职时间',create_time datetime not null comment '创建时间',update_time datetime not null comment '修改时间'
) comment '员工表';

-- 准备测试数据
INSERT INTO tb_emp (id,username,password,name,gender,image,job,entrydate,create_time,update_time) VALUES
    (1,'jinyong','123456','金庸',1,'1.jpg',4,'2000-01-01','2022-10-27 16:35:33','2022-10-27 16:35:35'),(2,'zhangwuji','张无忌','2.jpg',2,'2015-01-01','2022-10-27 16:35:37'),(3,'yangxiao','杨逍','3.jpg','2008-05-01','2022-10-27 16:35:39'),(4,'weiyixiao','韦一笑','4.jpg','2007-01-01','2022-10-27 16:35:41'),(5,'changyuchun','常遇春','5.jpg','2012-12-05','2022-10-27 16:35:43'),(6,'xiaozhao','小昭','6.jpg',3,'2013-09-05','2022-10-27 16:35:45'),(7,'jixiaofu','纪晓芙','7.jpg','2005-08-01','2022-10-27 16:35:47'),(8,'zhouzhiruo','周芷若','8.jpg','2014-11-09','2022-10-27 16:35:49'),(9,'dingminjun','丁敏君','9.jpg','2011-03-11','2022-10-27 16:35:51'),(10,'zhaomin','赵敏','10.jpg','2022-10-27 16:35:53'),(11,'luzhangke','鹿杖客','11.jpg','2007-02-01','2022-10-27 16:35:55'),(12,'hebiweng','鹤笔翁','12.jpg','2008-08-18','2022-10-27 16:35:57'),(13,'fangdongbai','方东白','13.jpg','2012-11-01','2022-10-27 16:35:59'),(14,'zhangsanfeng','张三丰','14.jpg','2002-08-01','2022-10-27 16:36:01'),(15,'yulianzhou','俞莲舟','15.jpg','2011-05-01','2022-10-27 16:36:03'),(16,'songyuanqiao','宋远桥','16.jpg','2010-01-01','2022-10-27 16:36:05'),(17,'chenyouliang','12345678','陈友谅','17.jpg',null,'2015-03-21','2022-10-27 16:36:07'),(18,'zhang1','张一','2022-10-27 16:36:09'),(19,'zhang2','张二','2012-01-01','2022-10-27 16:36:11'),(20,'zhang3','张三','2018-01-01','2022-10-27 16:36:13'),(21,'zhang4','张四','2022-10-27 16:36:15'),(22,'zhang5','张五','2016-01-01','2022-10-27 16:36:17'),(23,'zhang6','张六','2022-10-27 16:36:19'),(24,'zhang7','张七','2006-01-01','2022-10-27 16:36:21'),(25,'zhang8','张八','2002-01-01','2022-10-27 16:36:23'),(26,'zhang9','张九','2011-01-01','2022-10-27 16:36:25'),(27,'zhang10','张十','2004-01-01','2022-10-27 16:36:27'),(28,'zhang11','张十一','2022-10-27 16:36:29'),(29,'zhang12','张十二','2020-01-01','2022-10-27 16:36:31');

1.3 基本查询

在基本查询的DQL语句中,不带任何的查询条件,语法如下:

  • 查询多个字段

    select 字段1,字段2,字段3 from  表名;
    
  • 查询所有字段(通配符)

    select *  from  表名;
    
  • 设置别名

    select 字段1 [ as 别名1 ],字段2 [ as 别名2 ]  from  表名;
    
  • 去除重复记录

    select distinct 字段列表 from  表名;
    

案例1:查询指定字段 name,entrydate并返回

select name,entrydate from tb_emp;

在这里插入图片描述

案例2:查询返回所有字段

select * from tb_emp;

*号代表查询所有字段,在实际开发中尽量少用(不直观、影响效率)

在这里插入图片描述

案例3:查询所有员工的 name,entrydate,并起别名(姓名、入职日期)

-- 方式1:
select name AS 姓名,entrydate AS 入职日期 from tb_emp;
-- 方式2: 别名中有特殊字符时,使用''或""包含
select name AS '姓 名',entrydate AS '入职日期' from tb_emp;
-- 方式3:
select name AS "姓名",entrydate AS "入职日期" from tb_emp;

在这里插入图片描述

案例4:查询已有的员工关联了哪几种职位(不要重复)

select distinct job from tb_emp;

在这里插入图片描述

1.4 条件查询

语法:

select  字段列表  from   表名   where   条件列表 ; -- 条件列表:意味着可以有多个条件

学习条件查询就是学习条件的构建方式,而在SQL语句当中构造条件的运算符分为两类:

  • 比较运算符
  • 逻辑运算符

常用的比较运算符如下:

比较运算符 功能
> 大于
>= 大于等于
< 小于
<= 小于等于
= 等于
<> 或 != 不等于
between … and … 在某个范围之内(含最小、最大值)
in(…) 在in之后的列表中的值,多选一
like 占位符 模糊匹配(_匹配单个字符,%匹配任意个字符)
is null 是null

常用的逻辑运算符如下:

逻辑运算符 功能
and 或 && 并且 (多个条件同时成立)
or 或 || 或者 (多个条件任意一个成立)
not 或 ! 非,不是

案例1:查询 姓名 为 杨逍 的员工

select id,update_time
from tb_emp
where name = '杨逍'; -- 字符串使用''或""包含

在这里插入图片描述

案例2:查询 id小于等于5 的员工信息

select id,update_time
from tb_emp
where id <=5;

在这里插入图片描述

案例3:查询 没有分配职位 的员工信息

select id,update_time
from tb_emp
where job is null ;

在这里插入图片描述

注意:查询为NULL的数据时,不能使用 = null

在这里插入图片描述

案例4:查询 有职位 的员工信息

select id,update_time
from tb_emp
where job is not null ;

在这里插入图片描述

案例5:查询 密码不等于 ‘123456’ 的员工信息

-- 方式1:
select id,update_time
from tb_emp
where password <> '123456';
-- 方式2:
select id,update_time
from tb_emp
where password != '123456';

在这里插入图片描述

案例6:查询 入职日期 在 ‘2000-01-01’ (包含) 到 ‘2010-01-01’(包含) 之间的员工信息

-- 方式1:
select id,update_time
from tb_emp
where entrydate>='2000-01-01' and entrydate<='2010-01-01';
-- 方式2: between...and
select id,update_time
from tb_emp
where entrydate between '2000-01-01' and '2010-01-01';

在这里插入图片描述

案例7:查询 入职时间 在 ‘2000-01-01’ (包含) 到 ‘2010-01-01’(包含) 之间 且 性别为女 的员工信息

select id,update_time
from tb_emp
where entrydate between '2000-01-01' and '2010-01-01'
      and gender = 2;

在这里插入图片描述

案例8:查询 职位是 2 (讲师),3 (学工主管),4 (教研主管) 的员工信息

-- 方式1:使用or连接多个条件
select id,update_time
from tb_emp
where job=2 or job=3 or job=4;
-- 方式2:in关键字
select id,update_time
from tb_emp
where job in (2,4);

在这里插入图片描述

案例9:查询 姓名 为两个字的员工信息

select id,update_time
from tb_emp
where name like '__';  # 通配符 "_" 代表任意1个字符

在这里插入图片描述

案例10:查询 姓 ‘张’ 的员工信息

select id,update_time
from tb_emp
where name like '张%'; # 通配符 "%" 代表任意个字符(0个 ~ 多个)

在这里插入图片描述

1.5 聚合函数

之前我们做的查询都是横向查询,就是根据条件一行一行的进行判断,而使用聚合函数查询就是纵向查询,它是对一列的值进行计算,然后返回一个结果值。(将一列数据作为一个整体,进行纵向计算)

语法:

select  聚合函数(字段列表)  from  表名 ;

注意 : 聚合函数会忽略空值,对NULL值不作为统计。

常用聚合函数:

函数 功能
count 统计数量
max 最大值
min 最小值
avg 平均值
sum 求和

count :按照列去统计有多少行数据。

  • 在根据指定的列统计的时候,如果这一列中有null的行,该行不会被统计在其中。

sum :计算指定列的数值和,如果不是数值类型,那么计算结果为0

max :计算指定列的最大值

min :计算指定列的最小值

avg :计算指定列的平均值

案例1:统计该企业员工数量

# count(字段)
select count(id) from tb_emp;-- 结果:29
select count(job) from tb_emp;-- 结果:28 (聚合函数对NULL值不做计算)

# count(常量)
select count(0) from tb_emp;
select count('A') from tb_emp;

# count(*)  推荐此写法(MySQL底层进行了优化)
select count(*) from tb_emp;

案例2:统计该企业最早入职的员工

select min(entrydate) from tb_emp;

在这里插入图片描述

案例3:统计该企业最迟入职的员工

select max(entrydate) from tb_emp;

在这里插入图片描述

案例4:统计该企业员工 ID 的平均值

select avg(id) from tb_emp;

在这里插入图片描述

案例5:统计该企业员工的 ID 之和

select sum(id) from tb_emp;

在这里插入图片描述

1.6 分组查询

分组: 按照某一列或者某几列,把相同的数据进行合并输出。

分组其实就是按列进行分类(指定列下相同的数据归为一类),然后可以对分类完的数据进行合并计算。

分组查询通常会使用聚合函数进行计算。

语法:

select  字段列表  from  表名  [where 条件]  group by 分组字段名  [having 分组后过滤条件];

案例1:根据性别分组,统计男性和女性员工的数量

select gender,count(*)
from tb_emp
group by gender; -- 按照gender字段进行分组(gender字段下相同的数据归为一组)

在这里插入图片描述

案例2:查询入职时间在 ‘2015-01-01’ (包含) 以前的员工,并对结果根据职位分组,获取员工数量大于等于2的职位

select job,count(*)
from tb_emp
where entrydate <= '2015-01-01'   -- 分组前条件
group by job                      -- 按照job字段分组
having count(*) >= 2;             -- 分组后条件

在这里插入图片描述

注意事项:

​ • 分组之后,查询的字段一般为聚合函数和分组字段,查询其他字段无任何意义

​ • 执行顺序:where > 聚合函数 > having

where与having区别(面试题)

  • 执行时机不同:where是分组之前进行过滤,不满足where条件,不参与分组;而having是分组之后对结果进行过滤。
  • 判断条件不同:where不能对聚合函数进行判断,而having可以。

1.7 排序查询

排序在日常开发中是非常常见的一个操作,有升序排序,也有降序排序。

语法:

select  字段列表  
from   表名   
[where  条件列表] 
[group by  分组字段 ] 
order  by  字段1  排序方式1,字段2  排序方式2 … ;
  • 排序方式:

    • ASC :升序(默认值)

    • DESC:降序

案例1:根据入职时间,对员工进行升序排序

select id,update_time
from tb_emp
order by entrydate ASC; -- 按照entrydate字段下的数据进行升序排序

select id,update_time
from tb_emp
order by  entrydate; -- 默认就是ASC(升序)

在这里插入图片描述

注意事项:如果是升序,可以不指定排序方式ASC

案例2:根据入职时间,对员工进行降序排序

select id,update_time
from tb_emp
order by entrydate DESC; -- 按照entrydate字段下的数据进行降序排序

在这里插入图片描述

案例3:根据入职时间对公司的员工进行升序排序,入职时间相同,再按照更新时间进行降序排序

select id,update_time
from tb_emp
order by entrydate ASC,update_time DESC;

在这里插入图片描述

注意事项:如果是多字段排序,当第一个字段值相同时,才会根据第二个字段进行排序

1.8 分页查询

分页操作在业务系统开发时,也是非常常见的一个功能,日常我们在网站中看到的各种各样的分页条,后台也都需要借助于数据库的分页操作。

在这里插入图片描述

分页查询语法:

select  字段列表  from   表名  limit  起始索引, 查询记录数 ;

案例1:从起始索引0开始查询员工数据,每页展示5条记录

select id,update_time
from tb_emp
limit 0,5; -- 从索引0开始,向后取5条记录

在这里插入图片描述

案例2:查询 第1页 员工数据,update_time from tb_emp limit 5; -- 如果查询的是第1页数据,起始索引可以省略,直接简写为:limit 条数

在这里插入图片描述

案例3:查询 第2页 员工数据,update_time from tb_emp limit 5,5; -- 从索引5开始,向后取5条记录

在这里插入图片描述

案例4:查询 第3页 员工数据,update_time from tb_emp limit 10,5; -- 从索引10开始,向后取5条记录

在这里插入图片描述

注意事项:

  1. 起始索引从0开始。 计算公式 : 起始索引 = (查询页码 - 1)* 每页显示记录数

  2. 分页查询是数据库的方言,不同的数据库有不同的实现,MySQL中是LIMIT

  3. 如果查询的是第一页数据,起始索引可以省略,直接简写为 limit 条数

1.9 案例

DQL的基本语法我们学习结束了,接下来我们就运用所掌握的DQL语句的语法来完成两个案例。

1.9.1 案例一

案例:根据需求完成员工管理的条件分页查询

在这里插入图片描述

分析:根据输入的条件,查询第1页数据

  1. 在员工管理的列表上方有一些查询条件:员工姓名、员工性别,员工入职时间(开始时间~结束时间)

    • 姓名:张
    • 性别:男
    • 入职时间:2000-01-01 ~ 2015-12-31
  2. 除了查询条件外,在列表的下面还有一个分页条,这就涉及到了分页查询

    • 查询第1页数据(每页显示10条数据)
  3. 基于查询的结果,按照修改时间进行降序排序

结论:条件查询 + 分页查询 + 排序查询

SQL语句代码:

-- 根据输入条件查询第1页数据(每页展示10条记录)
-- 输入条件:
   -- 姓名:张 (模糊查询)
   -- 性别:男
   -- 入职时间:2000-01-01 ~ 2015-12-31
-- 分页: 0,10
-- 排序: 修改时间  DESC
select id,update_time
from tb_emp
where name like '张%' and gender = 1 and entrydate between '2000-01-01' and '2015-12-31'
order by update_time desc
limit 0,10;

在这里插入图片描述

1.9.2 案例二

案例:根据需求完成员工信息的统计

在这里插入图片描述

分析:以上信息统计在开发中也叫图形报表(将统计好的数据以可视化的形式展示出来)

  • 员工性别统计:以饼状图的形式展示出企业男性员人数和女性员工人数
    • 只要查询出男性员工和女性员工各自有多少人就可以了
  • 员工职位统计:以柱状图的形式展示各职位的在岗人数
    • 只要查询出各个职位有多少人就可以了

员工性别统计:

-- if(条件表达式,true取值,false取值)
select if(gender=1,'男性员工','女性员工') AS 性别,count(*) AS 人数
from tb_emp
group by gender;

在这里插入图片描述

if(表达式,tvalue,fvalue) :当表达式为true时,取值tvalue;当表达式为false时,取值fvalue

员工职位统计:

-- case 表达式 when 值1 then 结果1  when 值2  then  结果2 ...  else  result  end
select (case job
             when 1 then '班主任'
             when 2 then '讲师'
             when 3 then '学工主管'
             when 4 then '教研主管'
             else '未分配职位'
        end) AS 职位,count(*) AS 人数
from tb_emp
group by job;

在这里插入图片描述

case 表达式 when 值1 then 结果1 [when 值2 then 结果2 …] [else result] end

原文地址:https://blog.csdn.net/shenchengyv/article/details/135539225

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


文章浏览阅读773次,点赞6次,收藏9次。【代码】c# json字符串转Oracle的insert into的小程序。
文章浏览阅读8.7k次,点赞2次,收藏17次。此现象一般定位到远端的监听服务来找问题,在远端查看监听服务状态(具体看下面的解决方案会详细呈现),服务是否开启,另外查看监听端点概要是否存在host未指向到计算名的,如无直接进入监听配置文件listener.ora内添加指向即可。2、查看监听服务状态 lsnrctl status,右边为远端端点状态,未添加host指向到计算名;1、本地及远端安装好Oracle并配置好连接,Oracle服务和监听已启动;1、远程Oracle数据库:Oracle11g R2。或者进入下述服务手动重启。,再进行远程连接即可。_ora-12541:tns:无监听程序
文章浏览阅读2.8k次。mysql脚本转化为oracle脚本_mysql建表语句转oracle
文章浏览阅读2.2k次。cx_Oracle报错:cx_Oracle DatabaseError: DPI-1047: Cannot locate a 64-bit Oracle Client library_cx_oracle.databaseerror: dpi-1047: cannot locate a 64-bit oracle client libr
文章浏览阅读1.1k次,点赞38次,收藏35次。本文深入探讨了Oracle数据库的核心要素,包括体系结构、存储结构以及各类参数。通过解析Oracle数据库的体系结构,读者可以深入了解其内部组成和工作原理。存储结构部分介绍了数据在Oracle中的存储方式,从表空间到数据文件的层层逻辑。最后,我们深入探讨了Oracle数据库中各类参数的作用和配置方法,帮助读者更好地理解和优化数据库性能。本文旨在帮助读者全面理解Oracle数据库的运作机制,为其在实践中的应用提供基础和指导。
文章浏览阅读1.5k次。默认自动收集统计信息的时间为晚上10点(周一到周五,4个小时),早上6点(周六,周日,20个小时)由于平时默认每天只收集4小时,时间有点短了,改成每天可收集8小时。oracle 18c中默认是打开的。查看当前自动收集统计信息的时间。_oracle自动收集统计信息
文章浏览阅读929次,点赞18次,收藏20次。只有assm(Automatic Shared Memory Management)模式可以使用大页,需要关闭amm(Memory Manager Process)HugePages_Free: 306 (空闲306页,已使用306-306=0页)防止oracle使用的内存交换,所以设置的大小与oracle配置的sga、pga相关。HugePages_Rsvd: 0 (操作系统承诺给oracle预留的页数)HugePages_Total: 306 (总共306页)_oracle11g 大页
文章浏览阅读801次。例如:10046:0,1,4,8,12。默认redo日志有三个,大小为50M,循环覆盖使用。redo log再覆盖之前,会被归档,形成归档日志。答:不同事件,不同级别。trace的不同级别?_oracle 日志
文章浏览阅读4.2k次,点赞84次,收藏77次。主要讲解MySQL中SQL的DDL语句,其中包括对数据库和表的一系列操作。_sql ddl 新增字段 mysql
文章浏览阅读1.1k次。ON DEMAND:仅在该物化视图“需要”被刷新了,才进行刷新(REFRESH),即更新物化视图,以保证和基表数据的一致性;ON COMMIT:一旦基表有了COMMIT,即事务提交,则立刻刷新,立刻更新物化视图,使得数据和基表一致。Method =>'C',物化视图有三种刷新方式:COMPLETE、FAST和FORCE。物化视图会占用空间,一半可用于大量数据查询时,减缓主表的查询压力使用。例如创建一个物化视图,让对接单位查询。_oracle物化视图定时刷新
文章浏览阅读713次,点赞21次,收藏18次。1.背景介绍在当今的大数据时代,数据量越来越大,传统的关系型数据库已经无法满足业务需求。因此,NoSQL数据库技术迅速崛起,成为企业和开发者的首选。Oracle NoSQL Database是Oracle公司推出的一款分布式NoSQL数据库产品,具有高性能、高可用性和易于扩展等特点。在本文中,我们将深入了解Oracle NoSQL Database的集成与开发者工具,帮助您更好地掌握这款产品的...
文章浏览阅读2.5k次,点赞2次,收藏4次。今天遇见一个问题需要将字段中包含中文字符串的筛选出来。_oracle查询包含中文字符
文章浏览阅读802次。arcmap 在oracle删除表重新创建提示表名存在解决放啊
文章浏览阅读4.3k次,点赞2次,收藏4次。Oracle连接数据库提示 ORA-12638:身份证明检索失败_ora-12638
文章浏览阅读3.4k次,点赞6次,收藏25次。etc/profile是一个全局配置文件,所有用户登录都会使用该文件构建用户环境。与windows配置环境变量是一个道理。选择Linux系统,找到适合自己系统的安装包,我的是CentOS 8 x64。接下来需要登陆Oracle账户才能下载,无账户的可以自己注册一个。Linux中export 命令用于设置或显示环境变量。模式,利用上下键到文档最后,添加以下代码。出现如图所示版本号字样,则说明安装成功。点击下载,勾选1,点击2。记住完整路径用于后面配置。找到Java并点击进去。往下翻,找到Java8。_linux安装jdk1.8
文章浏览阅读2.4w次,点赞26次,收藏109次。JDK 是的简称,也就是 Java 开发工具包。JDK 是整个 Java 的核心,其中JDK包含了 Java 运行环境(Java Runtime Envirnment,简称 JRE),Java 工具(比如 javac、java、javap 等等),以及 Java 基础类库(比如 rt.jar)。最主流的 JDK 是Oracle公司发布的 JDK,除了 Oracle JDK(商业化,更稳定)之外,还有很多公司和组织开发了属于自己的 JDK,比较有名的有IBM JDK(更适合 IBM) 和OpenJDK。_jdk安装教程
文章浏览阅读7.5w次。出现 “java.sql.SQLNonTransientConnectionException:Could not create connection to database server” 的错误通常是由于无法连接到数据库服务器引起的。_java.sql.sqlnontransientconnectionexception: could not create connection to
文章浏览阅读849次,点赞7次,收藏10次。在ClickHouse中创建用户、数据库并进行权限分配是一个重要的管理任务,它涉及到安全性和访问控制。下面是一个基本的指南来帮助你完成这些操作:1. 创建数据库首先,需要创建一个数据库。使用以下命令:CREATE DATABASE IF NOT EXISTS your_database_name;将 your_database_name 替换为你想要的数据库名。2. 创建用户接下来,创建一个新用户。使用以下命令:CREATE USER your_username IDENTIFIED WIT_在clickhouse中如何创建用户 赋权
文章浏览阅读1.2k次,点赞53次,收藏39次。本文是一篇关于Oracle数据库安装和使用的博文摘要。作者以轻松幽默的笔调介绍了自己在实验中掌握的Oracle数据库基本操作,包括使用组件查看命令、配置数据库监听器等。作者也分享了在实验中遇到的一些有趣问题,如SQL语句缺少分号导致的意外错误。此外,作者还强调了登录sys用户和启动实例加载数据库的注意事项,并鼓励读者面对挑战时保持乐观,不断提升自己的能力。整体风格风趣严谨,引人入胜。
文章浏览阅读820次,点赞17次,收藏16次。KingbaseES、xml、dbms_xmlgen、SETSKIPROWS、人大金仓、KingbaseES兼容Oracle包dbms_xmlgen的功能是通过SQL查询将关系表中数据转化为XML文档。转化方式一共有两种:(1)通过查询字符串直接转化。(2)通过上下文句柄转化。对于通过查询字符串直接转化的方式,无法跳过若干行进行查询,只能直接将表格中的所有数据转化为XML文档。