1、oracle基本概念
oracle数据库:是一个文件系统,是个物理概念
实例:在oracle的数据库中可有多个实例,通常我们只有一个实例
用户:一个实例有多个表空间,表空间是逻辑概念,一个表空间对应着一个或多个物理存储文件(.dbf .ora)
用户和表空间的关系:一个用户有一个默认的表空间,一个表空间可以为多个用户做为默认空间,用户与用户之间的数据
是隔离的,数据不会混。
2、oracle基本命令
普通用户进入数据库:sqlpuls 用户名/密码 [as sysdba]
超级用户进入数据库:sqlpuls Scott/tiger
退出数据:exti
查看当前连接用户:show user
切换用户:conn 用户名/密码 [as sysdba]
超级用户切换普通用户:conn Scott/tiger
查看当前用户的表:select * from tab;
查看表中的数据:select * from 表名;
查看表的结构:desc dept;
3、oracle的简单查询
表的数据类型:
NUMBER(4,2):4表示程度 ,2表示两位小数点
varchar()
date:时间类型
简单的查询语句:
select 列名 from 表名;
select 列名 as 想命名的名字 from 表名;
select 列名1 想命名的名字1 ,列名2 想命名的名字2 from 表名; --常用
去除重复的查询语句:
select distinct 列名1,列名2 from 表名;--只有所有数据相同才能合并
字符串连接查询:
select '中文' || 列名1 || '中文' 列名2 from 表名;
查询四则运算:
select 数字列名*2 from 表名;
4、限定查询
select 列名 from 表名 where 条件;
非空和空的限制:
select * from 表名 where 列名 is not null;#查询列表中非空的
select * from 表名 where 列名>100 and 列名 is not null;#多个条件同时满足用and连接
select * from 表名 where 列名>100 or 列名 is not null;#多个条件只要满足一个的用or连接
select * from 表名 where 列名 between 100 and 200;#查询区间用between,会包括边界值
select * from 表名 where 列名 = ‘查询内容’;#查询内容一定要与数据库中的一致
select * from 表名 where 列名 in('查询内容','查询内容');#in可多写个查询内容
select * from 表名 where 列名 like '_m%';#like可以模糊查询,查询第二位为m的内容
!=和<>表示不等于
5、oracle排序
select * from 表名 order by 列名;#从高到低:
select * from 表名 order by 列名 desc;#从低到高
6、oracle单行函数
表名为临时表名
select upper('小写名字')from 表名;#把小写的字符转换成大写的字符
select lower('大写名字')from表名;#把大写转换成小写
select initcap('小写名字')from 表名;#首字母大写
select concat('字符1','字符2')from 表名;#字符串连接,于select '字符1' || '字符2' from 列名;作用一样
select substr('字符串',1,3)from 表名;#1为索引,3为三位
select length('字符串')from 表名;#length表示长度
select replace('字符串','l','x')from 表名;# replace可以替换字符串,将l字母换成x字母
select round (1.11) from 表名;#round四舍五入
select trunc (1.11) from 表名;#trunc去掉小数
select mod (10,3) from 表名;#取余数
7、oracle日期函数
select sysdate for 临时表名;#查询当前日期
select trunc(sysdate - 时间列名) from 数据表;#查询来了多少周
select trunc(moths_berween(sysdate ,时间列名)) from 数据表;#查询来了多少个月
select add_berween(sysdate ,12) fromr 临时表;#加上12个月
select next_day (sysdate,'星期一') ffrom 临时表;#求下个星期一
select last_day (sysdate,'星期一') from临时表;#本月最后一天
8、转换函数
select 列名 to_char(列名,'yyyy')to_char(列名,'mm')
to_char(列名,'dd')to_char(列名e,'HH')to_char(列名,'mi')
to_char(列名,'ss')from 临时表名;#y代表年,m代表月,d代表日,H时,mi分,s秒
select 列名 to_char(列名,'99,99')from 临时表名;#可以将钱转换成带逗号的
9、通用函数
select 列名+nvl(列名,0) from表名;#获得工资加奖金
select decode()from 表名;可以查询
select 列名 when job = ' ## ' then ‘ ##’#可以查询
10、多表查询
select *from 表名 a,表名 b;#可以将两张表联合a 和b是别名
select *from 表名 a,表名 b where a.deptno = d.deptno;#就是当a表中的某个值和b表中相同时就会查找出来
11、外连接
select *from 表名 a,表名 b where a.deptno = d.deptno(+)#两张表查询时
一张表做全量查询,不会以为另一张表的而被去掉,在查询后面加上个+就可以外连接
12、sql1999对sql的支持
select *from 列名 natural join 临时表;#和select *from 表名 a,表名 b where a.deptno = d.deptno;效果相同
select *from 表名 a join 表名 b on a.deptno = d.deptno;#与上面的一样
将join换成left就是左查询,right就是右查询
13、分组函数
统计数count(),最小值min(),最大值max(),平均值avg(),求和sum()
select count(*)from 列名;查看多少行
14、分组统计
select count(列名2)from 列名 group by 列名2;根据列名2来分组统计
select count(列名2)from 列名 group by 列名2 having avg(列名3)>200;根据列名2来分组统计 而且平均值要大于200的
15、子查询
select count(列名2)from 表名 a where a.列名>200
select * from 表名 t where t.列名1 in(select min(列名2)from 列名 group by 列名3)
16、exists的用
exists(sql 返回结果集为真)
not exists(sql 不返回结果集为真)
select * from 表名 t where exists(select min(列名2)from 列名 where 列名=没有的数据)
select * from 表名 t where not exists(select min(列名2)from 列名 where 列名=没有的数据)
17、Uniom 和 Uniom all
Uniom表示对并集的操作,就是会把重复的删除,不重复的合并
Uniom all是不去重复的
select * from 表名 t where 列名 >100
union
select * from 表名 t where 列名 >200
18、oracle增删改
insert(增加)
insert into 表名(列名1,列名2)values(‘##’,‘###’)
update(修改)
update 表名 set(列名1=值1,列名2=值2)where 修改条件
delete(删除)
delete from 表名 where 删除条件
19、数据库事务
增删改都要开启事务,事务提交才会在数据库只能真正变更
commit;(提交)
事务没提交前都可以回滚,
rollback;(回滚)
在update修改时如果没提交,这条数据就会被锁住,其他人访问不了
20、表管理
varchar(表示字符串)
number(表示数字)
data(表示日期)
clob(表示大文本数据)
blob(表示二进制数据)
建表:
create table 表名(列名 数据类型,列名2,数据类型2);
删除表:
drop table 表名;
添加列:
alter table 表名 add (列名,数据类型);
修改列:
alter table 表名 modify(列名,新数据类型);
21、主键约束和非空约束
create table 表名(列名1 数据类型 primary key,列名2,数据类型2);#设置列名1为主键
create table 表名(列名 数据类型,列名2,数据类型2,constraint 表名_列名_pk primary key(列名));
22、唯一约束
create table 表名(列名1 数据类型,列名2,数据类型2 unique);
create table 表名(列名 数据类型,列名2,数据类型2,constraint 表名_列名_pk unique(列名)
23、检查约束
create table 表名(列名1 数据类型,列名2,数据类型2 gender in(1,2));#列2数据要1或2
create table 表名(列名 数据类型,列名2,数据类型2,constraint 表名_列名_ck check (gender in(1,2))
24、外键约束
create table 表名1(列名1 数据类型 primary key,列名2,数据类型2);
create table 表名2(列名3 数据类型 primary key,列名4,数据类型2,列名1,数据类型2
constraint 表名2_列名1_fk foreign key(列名1) references 表1(列名1));
25、rownum和分页
rownum表示行号,
select rownum t.* from 表名 t;#在前面就会有行号
select t.* from 表名 t where rownum<5;#rownum不支持大于号
select * from (select rownum rw,a.* from(select * from 表名) a where rownum <最大值)b where b.rw>最小值
26、oracle视图
创建视图:creat view sql语句名字 as sql语句;
例如:creat view sql语句名字 as select t.* from 表名 t where rownum<5;
调用:select * from sql语句名字;
27、oracle序列
创建create sequence 序列名;#创建序列给如何一张表都可以
查询序列下一个值
select 序列名.nextval for dual;
insert into 表名(列名1,列名2)values(序列名.nextval,‘###’)#实现id自增长
28 oracle索引
创建单例索引:
create index 列名_index on 表名(列名);
复合索引:
create index 列名1_2_index on 表名(列名1,列名2);
调用索引:
select * from 表名 t where t.列名1=‘##’and t.列名2='##';