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。