create table student
(
sid number(4) primary key,
sname varchar2(200), --与mysql有点不同
salary number(5,2)--有效位数5,小数2位
sdate date
)
insert into student values(1,'小明',110.12,to_date('1997-08-30','yyyy-MM-dd')); --to_date 定义时间
--以前的数据不用管,今天新增的数据需要加上检查约束? sname>2 关键字:enable novalidate
alter table student add constraint ck_student_sname check(length(sname)>2) enable novalidate ;
create table stu
(
mid number(4) primary key,
myclob clob,
myblob blob
)
create table grade
(
gid number(4) primary key,
gname varchar2(200)
)
truncate table grade;
truncate:删除整个数据表的记录,但不会删除表结构。
truncate、drop、delete的区别:
1.truncate和delete只删除数据不删除表的结构。drop语句将删除表的结构被依赖的约束(constrain),触发器(tigger),索引(index);
依赖于该表的存储过程/函数将保留,但是变为invalid状态。
2.delete语句是DML,这个操作会放到rollback、segement(段)中,事务提交之后才生效;如果有相应的触发器,该执行的时候会被触发。
truncate、drop是DDL,操作会立即生效,原数据不放到rollback、segement(段)中,不能回滚,操作不触发tigger。
3.速度:drop>truncate>delete
4.安全性:小心使用drop和truncate,尤其是没有备份数据表的时候,使用上,想删除部分数据行用delete,带上where指定语句,回滚要足够大。删除表,用drop。想保留表而将所有数据删除. 如果和事务无关,用truncate即可。
如果是整理表内部的碎片,可以用truncate跟上reuse stroage,再重新导入/插入数据
--主键约束
alter table stu add constraint pk_stu_sid primary key(sid);
--检查约束
alter table stu add constraint ck_stu_sname check(length(sname>2));
--1-120之间
alter table stu add constraint ck_stu_sage check(sage betwwen 1 and 120);
--唯一约束
alter table stu add constraint up_stu_scard unique(scard);
--外键约束
alter table stu add constraint fk_stu_gid foreign key(gid) references grade(gid);
--删除约束
alter table stu drop constraint pk_stu_sid;
--删除info数据表 经过回收站(慎用,可以用来写demo)
drop table info;
--把回收站的数据表进行恢复
flashback table info to before drop;
--分页(需要伪列)
/*
子查询
1.select 后面
2.from 后面
3.where 后面
参数1:(当前页-1)*每页显示条数
参数2:(当前页-1)*每页显示条数加上每页显示条数
*/
select * from (
select a.*,rownum rn from student a where rownum<=6
) t where t.rn>3;
--只要表结构,不需要数据,不需要约束。
create table student _temp as select * from student where 1=2; --注意:student_temp是不需要提前创建的
--事务
/*
作用:有些业务是需要回滚的:比如银行转账过程中出现一些故障
保证数据一致性:前后要一致
*/
insert into 表名 values(1,'李逍遥');
savepoint sp_1;--设置一个回滚点
insert into 表名 values(2,'赵灵儿');
rollback to sp_1; --返回到回滚点
commit; --提交
--dual:伪表(虚拟表)
select 1+2 from dual;
/*
+ - * / 会自动把字符串中的数字转换出来运算
*/
select '23'+'12.25' from dual; --35.25
select '12a'+'12.25' from dual; --无效字符a
--求余数 mod() 求模函数
select mod(23,2) as 余数 from dual;
--模糊查询
_代表一个字符
select * from student t where t.sname like '小_';
[]oracle识别问题
select * from student t where t.sname like '小[名]';
select * from student t where t.sname like '小%';
--连接符 || 查询的过程中作用不大,plsql输出作用比较大
select '姓名:' || t.sname from student t ;
--系统时间
select sysdate 系统时间 from dual;
--月份差值 months_between
select months_between(sysdate,t.sdate) as 月份差值 from student t;
select months_between (sysdate,to_date('1997-08-30','yyyy-MM-dd'))/12 年 from dual;
--add_months 添加的是月份 比如在车贷、房贷、贷款之类
select add_months(sysdate,30) from dual;
--trunc 对日期不进行四舍五入
select trunc (sysdate) as 日期 from dual;
--round 对时间四舍五入 过了 早上12.00 就会进1
select round(to_date('2018-07-31 00:00:00','yyyy-MM-dd hh24:mi:ss')) as 日期 from dual;
--extract:提取时间 年, 月,日 可以作运算
select extract (year from sysdate) as 年 from dual;
--字符串函数 lower:转换小写 upper:转换大写
select upper(lower('ABC')) as 转换 from dual;
--两种替换方式
--translate:替换只能匹配(前面多少,后面就是替换多少)
--replace:后面替换有多少就替换多少
select translate ('jack','j','b') from dual;
select replace('back','b','co') from dual;
--查找指定字符的位置(第1次)
select instr ('admin','m') from dual;
--如果能找到就返回实际位置(从1开始),如果找不到,返回0
select instr('admin','f') from dual;
--concat() 一次只能放两个字符串
select concat(concat('a','b'),'v') from dual;
--四舍五入
select round(23.1267852) from dual;
--不会四舍五入
select trunc(23.1267852) from dual;
--转换字符 转义"年"
select to_char(sysdate,'yyyy"年"mm"月"dd"日" hh24:mi:ss dy') from dual;
select to_number('23') as 转换 from dual;
select to_number('23a')as 转换 from dual; --无效字符a
--语法: having 是分完组后,进行过滤条件
select 字段 from 表名 where 条件 group by 字段 having 条件
select gid,count(*)as 人数 from stu group by gid;
select gid,count(*)as 人数 from stu group by gid having count(*)>2;