关于SELECT 一些基础语法
三范式
1NF:是指数据库表的每一列都是不可分割的基本数据项,同一列中不能有多个值,
即实体中的某个属性不能有多个值或者不能有重复的属性。如果出现重复的属性,就可能
需要定义一个新的实体,新的实体由重复的属性构成,新实体与原实体之间为一对多关系。
在第一范式(1NF)中表的每一行只包含一个实例的信息。
2NF:是在第一范式(1NF)的基础上建立起来的,即满足第二范式(2NF)必须先满足第
一范式(1NF)。第二范式(2NF)要求数据库表中的每个实例或行必须可以被唯一地区分。
为实现区分通常需要为表加上一个列,以存储各个实例的唯一标识。如 emp 表中加上了员
工编号(empno)列,因为每个员工的员工编号是唯一的,因此每个员工可以被唯一区分。
这个唯一属性列被称为主关键字或主键、主码。同时要求实体的属性完全依赖于主关键字。
所谓完全依赖是指不能存在仅依赖主关键字一部分的属性,如果存在,那么这个属性和主
关键字的这一部分应该分离出来形成一个新的实体,新实体与原实体之间是一对多的关系。
为实现区分通常需要为表加上一个列,以存储各个实例的唯一标识。即第二范式就是非
主属性非部分依赖于主键。
3NF:必须先满足第二范式(2NF)。3NF 要求一个数据库表中不包含已在其它表中已包
含的非主关键字信息。例如,存在一个部门信息表,其中每个部门有部门编号(deptno)、
部门名称、地址等信息。那么员工信息表(emp)中列出部门编号后就不能再将部门名称、部
门地址等与部门有关的信息再加入员工信息表中。如果不存在部门信息表,则根据第三范
式(3NF)也应该构建它,否则就会有大量的数据冗余。即第三范式就是属性不依赖
于其它非主属性。
最终的目的避免数据重复冗余,1NF:列不可再分,最小原子 (避
免重复) ;2NF :主键依赖 (确定唯一);3NF:消除传递依赖(建立主外键关联 拆分
命令不区分大小写
SELECT {*,column alias,..}
FROM //+表
WHERE //+条件表达式
//后续可跟 WHERE GROUP BY HAVING
--去重
DISTINCT
select distinct deptno from emp;
--字符串 ' ' 注意区分" ";
--拼接使用 ||
select 'my' from emp;
select ename||'a'||'-->' info from emp;
-- 日期函数
sysdate/current_date 以date类型返回当前的日期
add_months(d,x) 返回加上x月后的日期d的值
LAST_DAY(d) 返回的所在月份的最后一天
months_between(date1,date2) 返回date1和date2之间月的数目
next_day(sysdate,'星期一') 下周星期一
--转换函数
to_date(c,m) 字符串以指定格式转换为日期
to_char(d,m) 日期以指定格式转换为字符串
--组函数
组函数|多行函数|聚合函数 即多条记录 返回一个结果。
avg 、sum、 min、 max、 count
count :统计记录数 count() -->* 或一个列名
max min: 最大值 最小值
sum:求和
avg:平均值
--注意:
--组函数仅在选择列表和Having子句中有效
--出现组函数,select 只能有组函数或分组字段
--组信息 与单条记录不能同时查询
--组函数 不能用在 where中,能使用的地方 select having
--null 不参与运算
--group by :分组
--select 出现分组函数,就不能使用 非分组信息,可以使用 group by 字段
--group by字段 可以不出现 select 中 ,反之select 除组函数外的,其他字段必须出现在group by 中
--过滤组 having :
--where :过滤行记录,不能使用组函数, having:过滤组 可以使用组函数
关于rowid 和 rownum
ROWNUM伪列是Oracle首先进行查询获取到结果集之后在加上去的一个伪列,这个伪列对符合条件的结果添加一个从1开始的序列号
注意:ROWNUM是动态的,也就是必须先有查询到的结果集,然后再给这个结果集加上一个列,比如给结果集中的第一条数据的ROWNUM的值为1,依次类推
查询必须使用子查询
SELECT ROWNUM,empno,ename,job FROM emp WHERE ROWNUM < 6;
SELECT ROWNUM,empno,ename,job FROM emp WHERE ROWNUM > 5 AND ROWNUM <= 10;
ROWID伪列 它是物理存在的,ROWID是一种数据类型,它使用基于64为编码的18个字符来唯一标识一条记录物理位置的一个ID,类似于Java中一个对象的哈希码,都是为了唯一标识对应对象的物理位置,需要注意的是ROWID虽然可以在表中进行查询,但是其值并未存储在表中,所以不支持增删改操作
SELECT ROWNUM,ROWID,empno,ename,job FROM emp WHERE ROWNUM <= 5;
ROWID用来唯一标识表中数据的唯一性,所以可以利用这个特性去除重复
DELETE FROM dept_bak WHERE ROWID NOT IN( SELECT MIN(ROWID) FROM dept_bak GROUP BY DEPTNO);
--以DEPTNO 为组分类删去每个组中ROWID值最小的数据