Oracle学习笔记(一)

Oracle学习笔记(一)

第一次在CSDN发学习笔记0.0;自己在学习Oracle中的一些笔记,有哪些地方不对的请各位大佬多多指教。

一、oracle的简单操作:
(1)插入:如果只是添加部分值的话,必须要指定对应的列名

insert into 表名 (列名1,列名2,列名3,......) values (1,2,3,......);

insert into 表名 values (1,2,3,......);

(2)删除:

//1、drop 命令 删除表中的数据和表结构!
drop table  表名;
//2、truncate 命令 删除表中的数据,表结构不会被删除,效率比较高,释放空间。
delete table 表名;
//3、delete 命令 删除整个表的数据,但是过程是一行一行地删,效率比 truncate 低,不释放空间
delete 表名

(3)修改:使用update 命令 修改表中某行的数据

//条件:例如ID等
update 表名 set 列名='新值' where 条件; 

(4)查询:

//1,查询表中所有列
select * from 表名;

//2,查询指定列名
select * from 表名 where 列名='已知值';

//查了多少个列就显示多少个列
select  列名1,列名2,列名3,.... from 表名;

//3,like 模糊查询:1%%:包含指定的值
(2%值:以指定值结尾的
(3)值%:以指定值开头的
(4)_值:第二是指定的字符
用法1:select * from 表名 where 列名 like '%值%';
用法2:select * from 表名 where 列名 like '%值’;
用法3:select * from 表名 where 列名 like '值%';
用法4:select * from 表名 where 列名 like '_值';

//4,排序
order by,默认升序: asc ,降序:desc
升序用法:select * from 表名 order by asc;
降序用法:select * from 表名 order by desc;


//5,给某列指定一个范围
--and--
用法1:select  * from 表名 where 列名  >= 某个值 and 列名  <= 某个值;
用法2:select  * from 表名 where 列名  between 某个值 and 某个值;
--or--
用法:select * from 表名 where 列名1=1 or 列名1=2 or 列名1=3;
--in--
用法:select * from 表名 where 列名 in(1,2,3);

//6,分组查询
group by 语句
用法:select 列名1 from 表名 group by 列名1;
在分组后,进行条件过滤,可使用 having 关键字,追加条件
用法:select 列名1,组函数(列名2) from 表名 group by 列名1 having 组函数(列名2)>=某个数;

-- 常见的关键字使用顺序:
-- select > from > where > group by > having > order by

//7,子查询
子查询会在主查询之前先执行一次,将得到的结果当做是主查询的条件使用。子查询也叫内部查询。
例如现有部门员工表scott.emp,需要查询比 ALLEN 工资高的人
用法实例:select * from scott.emp where sal > (select sal from scott.emp where ename = 'ALLEN'); 

--in--语句:将所有部门中工资最少的找出来
用法实例:select * from scott.emp where sal in (select min(sal) from scott.emp group by deptno);

--any-- 语句
大于最小的:select * from scott.emp where sal > any (select min(sal) from scott.emp group by deptno);
小于最大的:select * from scott.emp where sal < any (select min(sal) from scott.emp group by deptno);

--all-- 语句
大于:select * from scott.emp where sal > all (select min(sal) from scott.emp group by deptno);
小于:select * from scott.emp where sal < all (select min(sal) from scott.emp group by deptno);

二、约束
例子:

create table tb_user(
	id int primary key,
	name varchar(50)not null ,
	age int check(age >0 and age <65),
	sex char(4) check (sex='男' or sex='女'),
	phone varchar(20) unique,
	address varchar(50) default '广州';

1、主键约束
主键约束:primary key
作用:用来唯一区别确定的一行数据。不能重复的。
(1)、从功能上来看,相当于你同时用了非空和唯一两个约束。
(2)、一个表中,只允许一个主键。
(3)、主键可以是单字段的,也可以是多字段的。
(4)、当我们创建了主键之后,Oracle 默认会为主键创建对应的索引。使用索引调优,只有两个字段,找到索引值,即可找到对应的数据,搜索速度非常快。
(5)、需要使用序列的方式来实现自动增长。

1、外键约束
外键约束:foreign key
一般用于多张表之间的关联
格式:forign key(外键名) references 主表(参照列名)
比如,我们想要使用 clazz_id 字段将 tb_clazz 表和 tb_stu 表联合起来就可以这么写clazz_id int references tb_clazz(id)
外键是构建于一张表的两个字段或者两张表的两个字段之间的关系
主要是用来解决数据冗余(重复的数据太多)问题。
简单理解,就是在两张表之间找到一个参照物,然后让它们发生关系。

使用注意点:
(1)、子表 tb_stu(从表)外键列 clazz_id 的值必须在父表 tb_clazz(主表)参照列值的范围内或者为空(也可以考虑加非空约束),千万不能是其他的。
(2)、外键参照的只能是主表的主键或者唯一键,保证子表记录可以准确定位到被参照的记录。
(3)、当主表的记录被子表参照时,主表记录不允许被删除。
(4)、建表时可以考虑增加以下设置:(强制性)
① on delete cascade:当父表中的行被删除的时候,同时删除在子表中依靠的行。
② on delete set null:将依靠的外键值转换为空值。

2、唯一约束

唯一约束:unique

3、检查约束

检查约束:check 特殊的检查约束:not null 不为空

4、默认值

默认值:default

5、数据安全
数据安全数据的安全其实指的是存储的内容(数值)应该是正确的状态。
如果发现数据已经不完整了,或者不正确了,那么就是丧失数据的完整性。

三、函数

1、组函数
--count()统计行数
用法:select count(*) from 表名;

--sum()求和
用法:select sum(列名) from 表名;

--avg()平均值
用法:select avg(列名) from 表名;

--max()最大值
用法:select max(列名) from 表名;

--min()最小值
用法:select min(列名) from 表名;
--查询的时候,注意结果的行数,如果不对称的话,则会报错
--例如:select ename, sum(sal) from scott.emp;

//2、常用函数
--dual 是 orcle 提供的一个虚表
SELECT LENGTH('hello') FROM dual;

--lower:把大写转小写,主要是将表中的数据进行转换小写,再去做比较。
用法:select lower('helloworld') from dual;

--upper:把小写转大写。
用法:select upper('HELLOWORLD') from dual;

--INITCAP:使串中的所有单词的首字母变为大写
用法:select INITCAP('sql couser') from dual;

--CONCAT:连接两个字符串;
用法:select CONCAT('hello','world') from dual;

--取子字符串,从 start 开始,取 count 个
用法:select SUBSTR('hello',132) from dual;

--取子字符串,4开始取到末尾
用法:select SUBSTR('hello',4) from dual;

--LENGTH:返回字符串的长度;
用法:select LENGTH('hello world',) from dual;

--INSTR(string,char):在一个字符串中搜索指定的字符,返回发现指定的字符的位置,1开始;
用法:select INSTR('helloworld','1') from dual;

--TRIM:删除首尾的空字符串
select trim('  HelloWorld  ') from dual;
select length('  HelloWorld  ') from dual;
select length(trim('  HelloWorld  ')) from dual;

--数值函数 四舍五入	(逗号后面的2是保留两位小数)
用法:select Round(45.926,2) from dual;

--截断
用法:select TRUNC(45.926,2) from dual;

--取模
用法:select mod(1600,300) from dual;

--查询系统时间
用法:select sysdate from dual;

--日期函数 默认是yyyy/mm/dd hh:mi:ss
用法:
create table tb_test(
       currdate date
);
insert into tb_test(currdate) values(sysdate); --插入当前日期
--三个转换函数 to_date to_char to_number

--to_date(日期字符串, 格式)

用法:select to_date('2012-07-30 12:12:12','yyyy/mm/dd hh:mi:ss') from dual;

--to_char(日期,格式) 将日期转成字符
用法:select to_char(sysdate,'yyyy') from dual;
用法:select to_char(sysdate,'mm') from dual;
用法:select to_char(sysdate,'yyyy-mm-dd') from dual;

--将数字转换成字符
用法:select to_char(123) from dual;

--to_number(字符串) 将一个字符串的数字转成number类型
select to_number('123') from dual;

--不能将非数字的字符串转成number类型
select to_number('abc') from dual;

3、有参函数
-- 第一种方式
select yearsal(1000) from dual;
-- 第二种方式
select empno, ename, sal, yearsal(sal) 年薪 from scott.emp;
-- 第三种方式
declare
  vsal number;
begin
  vsal := yearsal(2000);
  dbms_output.put_line(vsal);
end;


-- nvl(参数1,参数2) 函数
select empno, ename, sal, comm, (sal+myNvl(comm, 0))*12 年薪
from scott.emp;

四、包
– 主要是一些相关的过程、函数、变量、常量和游标等等 PL/SQL 程序设计元素的组合。因为包,类似于面向对象的特点,把上述元素进行封装使用。

– 当一些 Java、C++ 面向对象类型的开发者需要使用 PL/SQL 技术的时候,完全可以使用面向对象的思维来操作,某种程度提高了工作效率。

-- 调用包中的函数
select helloPackage.yearsal(1000) from  dual;
-- 调用包中的过程
begin
 helloPackage.sayHello();
end;

五、触发器
– 触发器

– 每天天气预报:8.00 发送信息

– 每天 24.00 更新某些数据

– 在某种情况下,通过某一个事件触发某个东西去执行。

– 触发器在数据库中是独立存在的,它跟存储过程过程有一点点相似。

– 过程主要是由其他的程序来启动运行或者是直接启动运行。

– 但触发器是由一个事件来启动的。当事件发生时,才会驱动触发器执行。

– 在 Oracle 中像 insert、update、delete 等操作其实就是一个事件。

-- 删除触发
select * from tb_stuu where id = 1;
-- 帮我删除数据的时候,在关联表中也删掉
delete from tb_stuu where id = 1;

如何改变文本的样式

强调文本 强调文本

加粗文本 加粗文本

标记文本

删除文本

引用文本

H2O is是液体。

210 运算结果是 1024.

在这里插入代码片
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值