数据库函数、表连接查询以及分页查询

本文详细介绍了数据库查询的基础知识,包括单行和多行函数的使用,如日期和转换函数,以及NVL和DECODE等。此外,还探讨了分组查询的原理,GROUP BY和HAVING子句的应用。对于数据转换,提到了行转列的方法,并讲解了不同类型的表连接,如内连接、外连接和自连接。最后,提到了ROWID和ROWNUM在处理重复记录和分页查询中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 函数

 单行函数:一条记录返回一个结果。
 多行函数|组函数|聚合函数:多条记录,返回一个结果。
  • 单行函数

     1.日期函数:
       sysdate/current_date        以date类型返回当前的日期。
       add_months(d,x)             返回加上x月后的日期d的值。
       last_day(d)                 返回的所在月份的最后一天。
       months_between(date1,date2) 返回date1和date2之间月的数目。
       next_day(sysdate,星期一)    下一个星期一。
     2.转换函数:
       to_date(c,m) -> 字符串以指定格式转换为日期。
       to_char(d,m) -> 日期以指定格式转换为字符串。
     3.其他函数:
       nvl(string1,string2)        如果string1为null,则结果为string2的值。
       decode(判定字段,值1,结果1,值2,结果2....,默认值) 
                                   对判定字段的值进行判定,如果值为值1,函数的结果为结果1,与值2相等,函数的结果为结果2...最终如果以上都不相等,最终取默认值。
       case when 值1 then 结果1 when 值2 then 结果2 else 默认值end
    
  • 多行|聚合|组函数

     count :统计记录数 count() -->* 或一个列名。
     max min: 最大值 最小值。
     sum:求和。
     avg:平均值。
     注意:
       1.组函数仅在选择列表和having子句中有效。
       2.出现组函数,select只能有组函数或分组字段。
     说明:
       1.组信息与单条记录不能同时查询。
       2.组函数不能用在where中,只能在select having中使用。
       3.null不参与运算。
    
  • 分组

     解析步骤:
       select distinct *|字段|表达式|函数 as 别名 from 表 表别名 where 过滤行记录条件 group by 分组字段列表 having 过滤组 order by 字段列表 asc|desc。
     group by:分组
       1.select出现分组函数,就不能使用非分组信息,可以使用group by 字段。
       2.group by字段可以不出现select中,反之select除组函数外的,其他字段必须出现在group by中。
     having:过滤组
       1.where:过滤行记录,不能使用组函数。
       2.having:过滤组,可以使用组函数。
    

2. 行转列

 方便:解耦(与记录之间)+扩展(与结构之间)。
 1.行转列 decode 
    select name, decode(course, '语文', score) 语文, decode(course, '数学', score) 数学, decode(course, '英语', score) 英语 from tb_student; 
 2.分组 
    select name, min(decode(course, '语文', score)) 语文, min(decode(course, '数学', score)) 数学, min(decode(course, '英语', score)) 英语 from tb_student group by name;

3. 表连接
当要查询的数据来自于多个数据源。

  • (92)表连接

     1.语法:
       select 数据 from 数据源1,数据源2... where 行过滤条件 group by 分组字段1,分组字段2.. having 组过滤信息 order by 排序字段1,.. desc|asc;
     2.执行流程: 
       from --> where --> group by --> having --> select --> order by 
     3.表连接条件: 过滤通过连表产生的不满足要求的表连接数据 。
     4.笛卡尔积: 交叉连接。(非* 必须区分:使用表名或别名.区分)
     5.等值连接: 判断两个数据源中的某个字段值相等或者不相等。(在笛卡尔积基础上取条件列相同的值)
     6.非等值连接: 判断区间,判断范围的条件描述。(> < != <>between and)
     7.自连接: 一张表作为两个数据源使用。(特殊的等值连接 (来自于同一张表))
     8.内连接: 满足连接条件查询到不满足过滤掉。
     9.外连接: 某一个数据源中的数据不满足连接条件的时候也能显示。
         左外连接|左连接: from后面主表在左边。
         右外连接|右连接: from后面主表在右边。
         主表: 主表中的数据无论是否满足连接条件都能显示。
    注意:
       1.92语法中表连接条件定义在where后面,如果要使用的字段来自于多个数据源中都存在,需要指明限定词|出处。
       2.92语法: 在连接条件位置,主表的对面添加(+)。
    
  • (99)表连接

     1.笛卡尔积:(cross join)交叉连接 。
     2.等值连接:
        1)(natural join)自然连接: 自动做等值连接(同名字段|主外键字段) 。
        2)(join...using(同名字段) )指定使用哪个同名字段做等值连接。
     3.解决一切(等值连接,非等值连接,自连接):(join...on)数据源1 join 数据源2 on 连接条件。
     4.内连接:(inner) join。
     5.外连接:主表中的数据无论是否满足连接条件都显示。
        1)左外连接|左连接: left join。
        2)右外连接|右连接: right join。
     6.全连接:(full join)两张表都是主表。满足直接匹配,不满足相互补充null,确保 所有表的记录 都至少出现一次。
    注意:
       1.在自然连接中同名字段的不能使用限定词。
       2.在join..using中同名字段的不能使用限定词。
       3.在join..on中同名字段的必须使用限定词。
    

4. rowid 与 rownum

  • rowid
    实现重复记录的删除。

     1.伪列 。
     2.rowid行记录的地址,行记录的唯一标识。
     3.实现没有主键,唯一字段的表中完全相同数据的去重。
    
  • rownum
    结果集中行记录的序号。

     1.一个结果集就存在一份rownum。
     2.rownum从1开始,每次+1,有规律,有顺序。
     3.如果存在排序之后,rownum序号被打乱,可以在select外部再次嵌套select语句,外部的select语句的rownum就是有规律的,可以作为判断使用的。
     4.在oracle数据库中可以使用rownum实现分页查询。
       每页显示数据个数n,当前显示第几页i:  
          起始位置rownum: rownum> (i-1)*n。  
          结束位置rownum: rownum<=i*n。
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值