数据库 select 篇

关于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值最小的数据
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值