数据库知识

本文介绍了数据库中的一些关键操作,包括使用demical函数进行四舍五入,Oracle中的主键自增通过触发器实现,以及外连接(特别是(+)的使用)和存在(EXISTS)子查询在防止重复数据插入时的应用。此外,还探讨了数据库范式理论,强调了数据无冗余和规范化的重要性。最后,展示了基本的SQL语句,如SELECT、INSERT、UPDATE和DELETE。
摘要由CSDN通过智能技术生成

demical(M,D)函数采取四舍五入的方式,保留小数位数。

M:浮点型数值的总位数;

系统批号 属性批号 规格 数量 紧急程度
D:浮点型数值的小数保留位数。

cast(字段名 as 转换的类型)
convert(字段名,转换的类型)

(u.useful_life - u.surplus_life)

转换的类型有限制,只能是下面的类型

二进制,同带binary前缀的效果 : BINARY
字符型,可带参数 : CHAR()
日期 : DATE
时间: TIME
日期时间型 : DATETIME
浮点数 : DECIMAL
整数 : SIGNED
无符号整数 : UNSIGNED

(cast(a.RECEIVED_NUM as decimal(10, 5)) - cast(a.DOWNLOADNUM as decimal(10, 5))) as"已确认的废品数量总计" ,

Oracle主键自增的方法

  1. 创建触发器
    dual是一个虚拟表,用来构成select的语法规则,oracle保证dual里面永远只有一条记录,可以用它来做很多事情。

oracle中dual详解

基本上oracle引入dual为的就是符合语法

  1. 我们先从名称来说,dual不是缩写词,本身就是完整的单词。dual名词意思是对数,做形容词时是指二重的,二元的。

  2. Oracle中的dual表是一个单行单列的虚拟表。

  3. Dual表是oracle与数据字典一起自动创建的一个表,这个表只有1列:DUMMY,数据类型为VERCHAR2(1),dual表中只有一个数据‘X’, Oracle有内部逻辑保证dual表中永远只有一条数据。

  4. Dual表主要用来选择系统变量或求一个表达式的值。

  5. 更具体的说,我们见过这样一个简单的例子:

SELECT sysdate FROM daul

而Oracle的SELECT语法的限制为:

SELECT * | [column1 [AS alias1], column2 [AS alias2]] FROM table

所以,没有表名就没有办法查询,而时间日期并不存放在任何表中,于是这个dual虚拟表的概念就被引入了。

1、DUAL表的用途
–查看当前连接用户
SQL> select user from dual;

–当作计算器用
SQL> select 1+2 from dual;

–查看序列值
SQL> create sequence aaa increment by 1 start with 1;
SQL> select aaa.nextval from dual;

NEXTVAL 和 CURRVAL,
第一次NEXTVAL返回的是初始值;随后的NEXTVAL会自动增加你定义的INCREMENT BY值, 然后返回增加后的值。
CURRVAL 总是返回当前sequence的值,但是在第一次NEXTVAL 初始化之后才能使用CURRVAL,否则会出错。一次NEXTVAL会增加一次sequence的值, 所以如果你在同一个语句里面使用多个NEXTVAL。

CREATE OR REPLACE TRIGGER CAF_TUMBSTORN_TRG
before insert on CAF_TUMBSTORN for each row
when(new.ID is null)
begin
select CAF_TUMBSTORN_SEQ.Nextval into :new.ID from dual;
end;
///

(+)的用法
oracle中的(+)是一种特殊的用法,(+)表示外连接,并且总是放在非主表的一方。

例如

左外连接:select A.a,B.a from A LEFT JOIN B ON A.b=B.b;

等价于select A.a,B.a from A,B where A.b = B.b(+);

再举个例子,这次是右外连接:select A.a,B.a from A RIGHT JOIN B ON A.b=B.b;

等价于select A.a,B.a from A,B where A.b (+) = B.b;
有 (+) 的一方代表有可以为空,即副表
///

EXIST的用法
在插入记录前,需要检查这条记录是否已经存在,只有当记录不存在时才执行插入操作,可以通过使用 EXISTS 条件句防止插入重复记录。
INSERT INTO TableIn (ANAME,ASEX)
SELECT top 1 ‘张三’, ‘男’ FROM TableIn
WHERE not exists (select * from TableIn where TableIn.AID = 7)

EXISTS与IN的使用效率的问题,通常情况下采用exists要比in效率高,因为IN不走索引,但要看实际情况具体使用:
IN适合于外表大而内表小的情况;EXISTS适合于外表小而内表大的情况。

//
/
查询重复数据
select
*
from
user
where
userCode
in
(select userCode from user group by userCode having count (userCode) > 1)

//
/

max(id) 么 ,不一定对。
因为如果是按字符串排列,999会大于 100000。

用max(to_number(id)) 比较好。
select max(to_number(id)) from t_user;

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
三范式
2.1 第一范式(1NF)无重复的列

   第一范式(1NF)中数据库表的每一列都是不可分割的基本数据项
   同一列中不能有多个值
   即实体中的某个属性不能有多个值或者不能有重复的属性。
   简而言之,第一范式就是无重复的列。

   在任何一个关系数据库中,第一范式(1NF)是对关系模式的基本要求,不满足第一范式(1NF)的数据库就不是关系数据库。

2.2 第二范式(2NF)属性完全依赖于主键[消除部分子函数依赖]

  满足第二范式(2NF)必须先满足第一范式(1NF)。

  第二范式(2NF)要求数据库表中的每个实例或行必须可以被惟一地区分。

  为实现区分通常需要为表加上一个列,以存储各个实例的惟一标识。 
  第二范式(2NF)要求实体的属性完全依赖于主关键字。所谓完全依赖是指不能存在仅依赖主关键字一部分的属性,如果存在,那么这个属性和主关键字的这一部分应该分离出来形成一个新的实体,新实体与原实体之间是一对多的关系。为实现区分通常需要为表加上一个列,以存储各个实例的惟一标识。简而言之,第二范式就是属性完全依赖于主键。

2.3 第三范式(3NF)属性不依赖于其它非主属性[消除传递依赖]

  满足第三范式(3NF)必须先满足第二范式(2NF)。

  简而言之,第三范式(3NF)要求一个数据库表中不包含已在其它表中已包含的非主关键字信息。

  例如,存在一个部门信息表,其中每个部门有部门编号(dept_id)、部门名称、部门简介等信息。那么在的员工信息表中列出部门编号后就不能再将部门名称、部门简介等与部门有关的信息再加入员工信息表中。如果不存在部门信息表,则根据第三范式(3NF)也应该构建它,否则就会有大量的数据冗余。简而言之,第三范式就是属性不依赖于其它非主属性。

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
基本的数据库语句
select * from tb_myuser

delect from tb_myuser t where t.id =‘1’

update tb_myuser t SET t.id=‘1’,t.username=‘1’… WHERE 条件//可以省略

insert into tb_myuser t(t.id,t.username……)//列名可以省略,省略情况下是表格的所有列 values(‘1’,‘1’……)//与上句中的列对应

alter table tbl_name add index index_name (column_list):

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值