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',1,3,2) 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.
在这里插入代码片