oracle数据类型
文本,二进制类型:
char 存放字符串,最大存放2000个字符,是定长。
varchar2 存放字符串,最大可以存放4000个字符,可变长度。
如果数据长度是固定的,应当使用char,如果存放的数据长度是变化的,则使用varchar2。
nvarchar2 Unicode数据类型,变长,最大长度4000。
clob 字符型大对象,变长,最大8tb
blob 二进制大对象,变长,可以存放图片和声音 【注意:一般不直接存放图片和声音,而是存放链接。】
数值型:
number 可以存放整数,也可以存放小数。
number 保存数据范围, -1.0e-130<=number<1.0e126,默认可以表示整数和小数。
number(10,5) 有效数字10位,小数5位
number(5,0) 、number(5) 有效数字5位,小数0位 整数。
注意:如果有明确要求小数点保存到第几位,则明确指定,如果没有,直接使用number即可。
number是变长 使用1-22bytes来表示
日期类型:
date 用于表示时间 年月日时分秒,默认格式 DD-MM-YYYY,从公元前4712年1月1日到公元4712年12月31日的所有合法日期。
添加的时候使用to_date('20180408 222730','yyyyMMdd hh24miss')
TimeStamp 更加精确,精确到小数秒,最多小数点后9位,默认6位。
使用麻烦,如果没有特别要求,不推荐。
insert into TEST(updatetime) values(to_timestamp(to_char(sysdate,'YYYY-MM-DD HH24:MI:SS'),'YYYY-MM-DD HH24:MI:SS'));
数据表的创建
类和表的对应关系。
学生信息表,教师信息表。
基本语法:
create table student(
id number,
name varchar2(64),
sex char(2),
birthday date,
score number(4,2),
resume clob
);
使用sql脚本创建表。
使用工具创建表。
数据表的修改
添加列:
alter table 表名 add(新的列名 列的类型);
alter table 表名 add(新的列名 列的类型,新的列名2 列的类型2);
删除列:
alter table 表名 drop column(列名);
alter table 表名 drop (列名,列名2);--删除多列不能添加column
修改字段的名称:
alter table 表名 rename column 旧列名 to 新列名;
修改字段的类型:
alter table 表名 modify(列名 列的新类型);
alter table 表名 modify(列名 列的新类型,列名2 列2的新类型);
修改表名
rename 旧表名to 新表名;
删除表
drop table 表名;
CRUD操作
增加(Create)、读取查询(Retrieve)、更新(Update)和删除(Delete)
INSERT
- 插入的数据应与字段数据类型相同。
- 数据的大小应该在规定范围之内。
- 在values中列出的数据位置必须与被加入的列的排列位置相对应。
- 字符和日期型数据应包含在单引号中。
- 插入空值,不指定’’或给null
insert into stu values(1,'ouyang','男');
insert into stu(id) values(1);
insert into stu values(1,null,’’);
比较运算符
> 大于
< 小于
>= 大于等于
<= 小于等于
= 等于
!= 不等于
<>不等于
SELECT
select * from表名 where 条件
select 列名 from 表名 where 条件
select 指定查询哪些列的数据。
column指定列名
使用scott用户下的三张表:dept,emp,salgrade进行查询演示。
- 基本查询语句 select [distinct] *|[column 1,column 2 ……] from表名 [where (条件)]
示例:
查询所有列。 select * from emp;
查询指定列。 select distinct job from emp;
不显示重复列。 select distinct job from emp;
- 查询中使用算术表达式 select sal*12 from emp;
- 查询中使用函数 select sal*12+nvl(comm,0) from emp;
说明: NVL(E1, E2)的功能为:如果E1为NULL,则函数返回E2,否则返回E1本身。
- 拼接字符串select ename||'是一个'||job from emp;
说明:在查询时,如果希望将多列拼接起来作为一个字符串可以使用||
- where子句的用法
查询工资高于3000的员工
select * from emp where sal>3000;
查询1982年1月1日之后入职的员
select * from emp where hiredate>to_date('19820101','yyyymmdd');
显示工资在2000和2500之间的员工信息
select * from emp where sal>=2000 and sal<=2500;
- between and 在两者之间
select * from emp where sal between 2000 and 2500;--闭区间
select * from emp where sal not between 2000 and 2500;
- in
select * from emp where ename in ('ALLEN','WARD','MARTIN');
select * from emp where ename not in ('ALLEN','WARD','MARTIN');
- 使用like模糊查询
%表示0到多个字符
_表示一个字符
select * from emp where ename like '%ITH';
select * from emp where ename like '_ITH';--没有数据
select * from emp where ename like '_MITH';
select * from emp where ename not like '%LEN';--不常用
- is null的用法
显示没有上级的员工
select * from emp where mgr is null;
- 使用逻辑运算符
select * from emp where mgr is null or comm is null;
select * from emp where mgr is null and comm is null;
- 增加排序功能order by
select [distinct] *|[column 1,column 2 ……] from表名 [where (条件) order by 列名 ]
select * from emp order by sal;--默认升序
select * from emp order by sal asc;--升序
select * from emp order by sal desc;--降序
select * from emp where job = 'CLERK' order by sal desc;--降序
select * from emp where job = 'CLERK' order by empno,sal desc;--按照员工号升序工资降序
select * from emp order by 8;--使用数字排序 按照表列的顺序
select empno,ename,deptno from emp order by 3;--使用数字排序 按照查询列的顺序
- 别名排序
select sal*12+nvl(comm,0) yearSal from emp order by yearsal;
注意:
oracle 关键字,列名,表名等都不区分大小写,但是表中的数据是区分大小写的。
扩展:
select * from user_tables; 查询用户下的所有表
select * from dba_users;--查询所有用户信息,使用管理员用户
UPDATE
update 表名 set 列名=表达式 {+} where 条件
update语法可以使用新值更新原有表行中的各列。
set子句指示要修改哪些列和给与哪些值。
where子句指定更新哪些行。如没有where子句,则更新所有的行(特别小心)。
DELETE
delete from 表名where 条件
truncate table 表名;删除所有记录,不写日志,速度快,无法恢复。
COMMIT和ROLLBACK
commit 提交
rollback 回滚
DML,DDL,DCL
DML(data manipulation language):
它们是SELECT、UPDATE、INSERT、DELETE,就象它的名字一样,这4条命令是用来对数据库里的数据进行操作的语言
DDL(data definition language):
DDL比DML要多,主要的命令有CREATE、ALTER、DROP等,DDL主要是用在定义或改变表(TABLE)的结构,数据类型,表之间的链接和约束等初始化工作上,他们大多在建立表时使用
DCL(Data Control Language):
是数据库控制功能。是用来设置或更改数据库用户或角色权限的语句,包括(grant,deny,revoke等)语句。在默认状态下,只有sysadmin,dbcreator,db_owner或db_securityadmin等人员才有权力执行DCL
统计函数
max,min,sum,avg,count
查询员工数量
select count(*) from emp;
查询有奖金的人
select count(comm) from emp;--空值不统计
查询最高工资。
select max(sal) from emp;
查询最低工资。
select min(sal) from emp;
查询最高年薪。
select max((sal+nvl(comm,0))*12) from emp;
查询平均工资。
select avg(sal) from emp;
select avg(comm) from emp;--奖金不一定有,没有的不参与
查询总工资。
select sum(sal) from emp;
查询真正的平均工资
select sum(sal)/count(*) from emp;
group by 和 having子句
group by 列名 用于分组
having 表达式 针对于一组数据,譬如求
两者一般结合使用,单独使用也可以。
按照部门分组查询部门平均工资和最高工资
select avg(sal),max(sal),deptno from emp group by deptno;
select avg(sal),max(sal),deptno from emp;--错误 不是单组分组函数
查询部门不同岗位的平均工资和最高工资
select avg(sal),max(sal),deptno,job from emp group by deptno,job;
查询部门不同岗位的平均工资和最高工资并按照部门和岗位排序。
select avg(sal),max(sal),deptno from emp group by deptno,job order by deptno,job;
查询部门平均工资低于2000的部门的平均工资和最高工资。【典型用法】
select avg(sal) ,max(sal),deptno from emp group by deptno having avg(sal)<2000;
select avg(sal) ,max(sal),deptno from emp where avg(sal)<2000 group by deptno; --错误,此处不允许使用分组函数
单独使用having
select avg(sal) ,max(sal),deptno from emp group by deptno having 1>2;--扩展 特殊形式
为什么不能使用having替代where
select * from emp having avg(sal)>20;--不是group表达式
当同时使用group by having order by 的顺序问题
推荐使用顺序 group by having order by
查询部门工资低于2000的部门不同岗位的平均工资和最高工资并按照部门和岗位排序。
select avg(sal),max(sal),deptno from emp group by deptno,job having avg(sal)<2000 order by deptno,job;--推荐写法
select avg(sal),max(sal),deptno from emp having avg(sal)<2000 group by deptno,job order by deptno,job;--不推荐写法
select avg(sal),max(sal),deptno from emp order by deptno,job having avg(sal)<2000 group by deptno,job ;--错误写法
其他常用语句
select * from all_tables where owner = 'SCOTT';--查询scott用户下的所有表
select * from user_tables;--查询当前用户的所有表