--创建表空间 create tablespace oracle17_5 datafile 'e:/db/oracle17_5.dbf' size 50M --删除表空间 drop tablespace oracle17_5 --创建用户 create user haoshen identified by admin default tablespace oracle17_5 --删除用户 drop user t7 --分配权限(角色带有的权限) connect(登录) resource(维护) DBA(系统管理员) grant connect,resource to haoshen --撤销权限 revoke connect,resource f rom haoshen 数据类型 字符串: Char(len)固定长度字符串 Varchar2(len)可变长度字符串 Nchar(len):只支持unicode字符编码的字符串 Nvarchar2(len):只支持unicode字符编码的字符串 数值类型: Number:如果没写()规定是32位整数 Number(p):表示p位整数 Number(p,s):举例(8,2)表示6位整数、2位小数 id number(8)如果不写(8)默认是32位整数 money number(8,2)表示总共8位,其中2位是小数 如果想存1234.4321 number(8,4) 日期 Date 年月日时分秒 --创建表 create table emp( empid number(8) primary key,--使用序列来代替自增列 empname varchar2(40) not null,gender char(2) not null,job varchar2(20) not null,birthday date,salary number(8,2) not null,deptid references dept(deptid) not null ) create table dept( deptid number(8) primary key,deptname varchar2(20) not null,loc varchar2(40) not null ) alter table emp add constraint FK_emp_deptid foreign key (deptid) references dept(deptid); --MysqL中学习的增加列、删除列、修改列均可以 alter table emp add phone char(11) not null unique alter table emp drop column phone drop table emp drop table dept 所有在oracle数据库中的增删改操作必须提交才能生效 --设置检查约束 alter table emp add constraint CK_emp_gender check(gender='男' or gender='女') alter table emp add constraint CK_emp_salary check(salary>=0) select * from emp insert into emp values(102,'周伯通','男','老顽童','23-11月-2015',5200,'2'); insert into dept values(1,'人力资源部','中关村'); insert into dept values(2,'财务部','金融街'); insert into dept values(3,'开发部','上地'); insert into dept values(4,'市场部','望京'); commit;提交 rollback;回滚 delete from emp insert into emp values(101,'欧阳锋','西毒','27-12月-2015',1111,'1'); insert into emp values(102,'2'); insert into emp values(103,'黄药师','东邪',4200,'3'); insert into emp values(104,'丘处机','二货',3200,'2'); insert into emp values(105,'杨过','神雕大侠',7200,'3'); insert into emp values(106,'欧阳克','流氓',2222,'1'); insert into emp values(107,'王重阳','中神通','2'); insert into emp values(108,'黄大力','卖药的',6000,'3'); insert into emp values(109,'尹志平','仙道',12000,'2'); insert into emp values(110,'杨康','官二代',9900,'3'); commit; MysqL和oracle表中存储英文的不同 MysqL表中的英文字母在查询时是不分大小写的 oracle表中的英文字母在查询时是区分大小写的 SELECT * FROM EMP WHERE EMPNAME='HuangYaoShi' 关于伪列 1rowid 是在数据添加到表时oracle系统分配给这行的唯一值 相当于这行数据在整个数据库中的主键 rowid不会重复出现,始终跟随这条数据 select e.*,rowid from emp e 2rownum 是oracle分配给查询结果行的一个临时行号 select e.*,rownum from emp e where salary>5000 rownum会从where条件筛选结束之后对查询结果进行rownum的生成 select e.*,rownum from emp e where salary>5000 order by salary desc 可以在where条件中查询前几条 select e.*,rownum from emp e where salary>5000 and rownum<=3 但是由于rownum不会在order by之后重新生成,所以直接取前几条往往没有意义 select rownum,e.* from (select * from emp where deptid=2 order by salary desc) e where rownum<=3 关于分页查询 如果是不排序的分页 select * from( select rownum r,e.* from emp e) ee where ee.r>9 and ee.r<=12 如果是排序的分页 select * from ( select rownum r,e.* from (select * from emp order by salary desc) e) ee where ee.r>10 and ee.r<=15 --序列 --oracle是没有表中的自增列的 --怎么样获得一个唯一且不重复的值用作主键呢? --使用序列来代替自增列 --序列是一个和任何表都没有绑定关系的独立的对象 --序列可以按照一定规则来生成不重复的唯一的值 --怎么样创建序列 create sequence seq_myseq start with 1 increment by 1 CREATE SEQUENCE toys_seq START WITH 10 --初始值(默认1) INCREMENT BY 10 --步长(默认1) MAXVALUE 2000 --最大值(默认无限大) MINVALUE 10 --最小值(默认1) NOCYCLE --不循环(默认不循环) CACHE 10; --缓存数 insert into emp values(seq_myseq.nextval,'萧峰','帮主','27-10月-2015',11000,'3'); insert into emp values(seq_myseq.nextval,'段誉','皇二代',9500,'2'); insert into emp values(seq_myseq.nextval,'虚竹','和尚',6500,'3'); commit select* from emp select sysdate from dual select 56*91 from dual select seq_myseq.nextval from dual commit select * from student select * from grade select * from result select * from subject --distinct去掉重复行 select distinct studentno from result select distinct studentno,subjectid from result --查询重复的或没有重复的 select studentno,subjectid,count(1) from result group by studentno,subjectid having count(1)>1 select studentno,subjectid having count(1)=1 create table guanxi( rid number(8),fid number(8) ) --删除重复行 delete from guanxi where rowid not in (select max(rowid) from guanxi group by rid,fid having count(1)=1) and rowid not in( select max(rowid) from guanxi group by rid,fid having count(1)>1 ) --union将两个表的查询结果和在一张表中 --union可以将两张不同表的数据在一个查询结果中显示,但是需要满足条件 --1两次查询的列数一致 2对应的列的数据类型相同 select * from ( select empid,empname,job,1 r from emp union select deptid,deptname,loc,2 r from dept ) ee order by ee.r --联合查询 union在联合之后如果两次查询出现了相同rowid行,那么只会出现一次 union all在联合之后如果两次查询出现了相同rowid行,那么两次都会出现 intersect在联合之后只显示两次查询都出现的rowid行 minus在联合之后只显示A结果不包含B结果中rowid的行 select * from emp where gender='男' union select * from emp where salary<6000 select * from emp where gender='男' intersect select * from emp where salary<6000 select * from emp where gender='男' minus select * from emp where salary<6000 select * from emp where salary<6000 minus select * from emp where gender='男' --oracle的数据导出: 1sql文件 优点:可读、灵活,缺点:运行不稳定、维护困难,不适合数据量较大的数据备份和导出 2oracle通用方式 *.dmp文件 优点:封装后的文件、安全性高,运行可靠,文件较sql文件小 缺点:不可读 3plsqldev方式 优点:封装后的文件、安全性高,运行可靠,文件较sql文件小 缺点:不可读,只能由plsqldeveloper运行 drop table emp; drop table dept; drop table result; drop table subject; drop table student; drop table grade; drop table guanxi; --事务控制 --什么是事务:就是业务逻辑中的最小单元 --就是多条更新语句要么都执行,要么都不执行的情况 --事务的特征 --一致性 --原子性 --永久性 --隔离性 --oracle中的运算符 算术:+ - * / % 比较:> < >= <= = <>(!=) 逻辑运算符 and or not --连接符 select empid||'-'||salary from emp --oracle中的系统函数 --转换函数 --to_char select empname,to_char(birthday,'yyyy"年"fmmm"月"dd"日"'),to_char(salary,'$99999.00') from emp select to_char(sysdate,'yyyy"年"fmmm"月"dd"日" hh24:mi:ss') from dual --to_date select to_date('2016-6-6','yyyy-mm-dd') from dual insert into emp values(seq_myseq.nextval,to_date('2013-9-15','yyyy-mm-dd'),'3'); --to_char是将日期等类型转换成字符串varchar2 --to_date是将字符串类型转换成日期类型date,其中在开发中to_date更常用 select '5'+'8' from dual --逻辑函数 --nvl select studentname,nvl(address,'<未填写>') from student --nvl2 select studentname,nvl2(address,'<已填写>','<未填写>') from student --decode select empname,decode(deptid,'1','启用','2','禁用','已删除') from emp --分析函数 我们经常对一个查询结果进行排序,由于排序列的值可能相同,导致排序的序号总不能满意 select * from ( select studentno,score,rank() over(order by score desc) srank,dense_rank() over(order by score desc) 连续名次,row_number() over(order by score desc) 行号 from result ) ee where ee.srank=1 --关于数据库自动主键值 可以采用序列作为主键值 但是序列只能提供给一个数值类型的主键 如果想使用varchar2类型作为主键要什么技术呢? 就是sys_guid() select sys_guid() from dual sys_guid()就是一个生成32位16位进制随机数的字符串