Oracle数据库
单行函数:一条记录返回一条结果
自定义函数
-
-- trunc 取整
select ename,trunc(months_between(sysdate,hiredate)) from emp;
内置函数
-
to_char:转换为字符
select sysdate,to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;
select sysdate,to_char(sysdate,'yyyy"年"mm"月"dd"日" hh24:mi:ss') from dual;
-
to_date:转换为数据
select sysdate,to_date('2022年02月23日','yyyy"年"mm"月"dd"日"') from dual;
多行|聚合|组函数:多条记录返回一个结果
-
count() :求和(统计数目)
-
sum() :求和(值求和)
-
max():求最大值
-
min() :求最小值
-
avg():求平均值
注意:
-
确定要计算的数据然后才能使用组函数,对结果集,分组
-
如果select后面一旦出现组函数的使用,不能与非分组字段一起使用
分组
group by :根据指定的规则对数据进行分组
-
语法: select 数据 from 数据源 where 行过滤条件 group by 分组 having 组过滤信息 order by 排序字段;
-
执行流程 : from -> where -> group by -> having -> select -> order by
注意:
-
先分组还是先过滤根据题来做出判断
-
where中不能使用组函数,因为执行顺序不允许
-
可以在分组之后加having来进行过滤
行转列
--行转列
SELECT NAME,
DECODE(COURSE, '语文', SCORE) 语文,
DECODE(COURSE, '数学', SCORE) 数学,
DECODE(COURSE, '英语', SCORE) 英语
FROM TB_STUDENT;
SELECT NAME,
MAX(DECODE(COURSE, '语文', SCORE)) 语文,
MAX(DECODE(COURSE, '数学', SCORE))数学,
MAX(DECODE(COURSE, '英语', SCORE)) 英语
FROM TB_STUDENT GROUP BY NAME;
表连接
定义:查询数据来自于多个数据源时运用表连接
分类
按条件分
-
等值连接:两数据某字段相等连接,基于笛卡尔积基础上
-
92:需要连接条件
-
99:
-
自然连接 : 自动做等值连接(同名字段|主外键字段) natural join
select ename,deptno,dname from emp natural join dept;
-
如果有多个字段可以做等值连接:join ..using(同名字段) 指定使用哪个同名字段做等值连接
select ename,deptno,dname from emp join dept using(deptno);
-
-
-
非等值连接:判断区间,> < != <>between and
99中:...join...on既可以做等值也可以做非等值连接
等值
select ename,e.deptno,dname from emp e join dept d on e.deptno = d.deptno;
非等值
select ename,sal,job,grade from emp e join salgrade s on sal between losal and hisal;
注意:在join..on中同名字段的必须使用限定词
按连接分
-
内连接:满足条件查询,不满足则过滤
-
92:默认(inner)join
-
-
外连接:某一数据不满足条件也显示
-
左外连接|左连接:from后面主表在左
-
99:left join
-
-
右外连接|右连接:from后面主表在右
-
99:right join
-
注意:
-
主表:主表中的数据无论是否满足连接条件都能显示
-
如何区分主表:在连接条件位置,主表的对面添加(+)
select * from emp e1,emp e2 where e1.mgr=e2.empno(+);
-
自连接:一张表作为两个数据源,自己与自己连接。
全连接:两张表全是主表,在99中:full join
rowid 与 rownum
-
rowid:实现重复记录的删除
--1)查询到要保留的数据
SELECT DISTINCT ID,NAME,COURSE,SCORE FROM TB_STUDENT; --显示去重
SELECT MAX(ROWID) FROM TB_STUDENT GROUP BY ID,NAME,COURSE,SCORE;
--2)查到要删除的数据
SELECT * FROM TB_STUDENT WHERE NOT ROWID IN (SELECT MAX(ROWID) FROM TB_STUDENT GROUP BY ID,NAME,COURSE,SCORE);
--3)删除这些数据
DELETE FROM TB_STUDENT WHERE NOT ROWID IN (SELECT MAX(ROWID) FROM TB_STUDENT GROUP BY ID,NAME,COURSE,SCORE); -
rownum:结果集中行记录的序号
-
必须排序,如果存在排序之后,rownum序号被打乱,可以在select外部再次嵌套select语句,外部的select语句的rownum就是有规律的,可以作为判断使用的
select empno,ename,sal,n,rownum num from (select empno,ename,sal,rownum n from emp order by sal desc);
-
不能直接取大于1的数
-
如果想要对rownum进行判断,需要针对一条已经确定的rownum进行判断,解决方案,外部嵌套select
案例:在oracle数据库中可以使用rownum实现分页查询
--分页 : 每页显示数据个数 n = 3 当前显示第几页 i 起始位置rownum : rownum> (i-1)*n; 结束位置rownum : rownum<=i*n
?
select *
from (select empno, ename, sal, rownum num
from (select empno, ename, sal, rownum n from emp order by sal desc))
where num <= 6
and num > 3; -
表设计
表名 :明确表的作用
-
明确表中的字段
-
字段名
-
字段类型
-
字段约束
-
主键约束(唯一+非空)
-
唯一约束
-
非空约束
-
默认约束
-
检查约束
-
外键约束
-
父表:
-
子表:子表中添加一个外键字段,关联主表的主键字段,外键字段的值只能为主表中主键字段已有的值
-
-
-
表的三范式:最终的目的避免数据重复冗余
-
1NF-->列不可再分最小原子 (避免重复);
-
2NF-->主键依赖(确定唯一);
-
3NF-->消除传递依赖(建立主外键关联 拆分表);**
表与表之间的关系
-
一对一关系:主外键关联关系 用户表 身份证信息表
-
一对多|多对一:主外键关联关系 : 在多的一方设置外键,关联一的一方的主键 班级表 学生表
-
多对多: 中间表 : 定义两张表的关联关系 订单与商品 学生与选课