1.创建表空间
表空间? ORACLE数据库的逻辑单元。 数据库---表空间 一个表空间可以与多个数据文件(物理结构)关联
一个数据库下可以建立多个表空间,一个表空间可以建立多个用户、一个用户下可以建立多个表。
create tablespace fan datafile 'D:\oracle\tablespace\fan.dbf' size 100m autoextend on next 10m
fan 为表空间名称
datafile 指定表空间对应的数据文件
size 定义的是表空间的初始大小
autoextend on 自动增长 ,当表空间存储都占满时,自动增长
next 后指定的是一次自动增长的大小。
-- 删除表空间 drop tablespace fan;
2.用户
创建用户:
-- 创建用户 create user zhangsan identified by aaa default tablespace fan
identified by 后边是用户的密码
default tablespace 后边是表空间名称
oracle 数据库与其它数据库产品的区别在于,表和其它的数据库对象都是存储在用户下的。
用户赋权限:
新创建的用户没有任何权限,登陆后会提示
Oracle 中已存在三个重要的角色:connect 角色,resource角色,dba角色。
CONNECT 角色: --连接角色,是授予最终用户的典型权利,最基本的
ALTER SESSION --修改会话
CREATE CLUSTER --建立聚簇
CREATE DATABASE LINK --建立数据库链接
CREATE SEQUENCE --建立序列
CREATE SESSION --建立会话
CREATE SYNONYM --建立同义词
CREATE VIEW --建立视图
RESOURCE 角色: --是授予开发人员的
CREATE CLUSTER --建立聚簇
CREATE PROCEDURE --建立过程
CREATE SEQUENCE --建立序列
CREATE TABLE --建表
CREATE TRIGGER --建立触发器
CREATE TYPE --建立类型
DBA角色:拥有全部特权,是系统最高权限,只有 DBA 才可以创建数据库结构,并且系统权限也需要DBA授出,
且 DBA用户可以操作全体用户的任意基表,包括删除
grant dba to zhangsan;
进入 system 用户下给用户 zhangsan 赋予 dba 权限,否则无法正常登陆
3.oracle 数据类型
No | 数据类型 | 描述 |
1 | varchar, varchar2(可变长度) | 表示一个字符串 |
2 | NUMBER |
NUMBER(n)表示一个整数,长度是n NUMBER(m,n):表示一个小数,总长度是 m,小 |
3 | DATA | 表示日期类型 |
4 | CLOB | 大对象,表示大文本数据类型,可存 4G |
5 | BLOB | 大对象,表示二进制数据,可存 4G |
4.表的管理
建表:
语法:
Create table 表名(
字段 1 数据类型 [default 默认值],
字段 2 数据类型 [default 默认值],
...
字段 n 数据类型 [default 默认值]
);
范例:创建 person表
create table person( pid number(15), name varchar2(10), gender number(1) default 1, birthday date );
表删除:
语法:DROP TABLE 表名
表的修改:
在 sql 中使用 alter 可以修改表
添加语法:ALTER TABLE 表名称 ADD(列名 1 类型 [DEFAULT 默认值],列名 2 类型 [DEFAULT 默认值]...)
alter table person add (age number(3) default 18, card varchar(18));
修改语法:ALTER TABLE 表名称 MODIFY(列名 1 类型 [DEFAULT 默认值],列名 2 类型 [DEFAULT 默认值]...)
alter table person modify age number(4);
修改列名: ALTER TABLE 表名称 RENAME COLUMN 列名 1 TO 列名 2
alter table person rename column gender to sex;
删除一列:alter table person drop column card;
数据库表数据的更新:
1. INSERT
标准写法:
INSERT INTO 表名[(列名 1,列名 2,...)] VALUES(值 1,值 2,...)
简单写法(不建议):
INSERT INTO 表名 VALUES(值 1,值 2,...)
注意:使用简单的写法必须按照表中的字段的顺序来插入值,而且如果有为空的字段使用 null
insert into person(pid, name, gender, birthday) values(1, '张三', null, to_date('1998-8-16', 'yyyy-MM-dd')); commit;
2. UPDATE
全部修改:UPDATE 表名 SET 列名 1=值 1,列名 2=值 2,....
局部修改:UPDATE 表名 SET 列名 1=值 1,列名 2=值 2,....WHERE 修改条件;
update person set age = 20 where pid = 1; commit;
3. DELETE
语法 : DELETE FROM 表名 WHERE 删除条件;
在删除语句中如果不指定删除条件的话就会删除所有的数据
delete from person where pid = 1; commit;
删除表中全部记录:delete from person;
删除表结构:drop table person;
先删除表,再次创建表,等同于删除表中全部记录,会重建索引:truncate table person;
在数据量大的情况下,尤其在表中带有索引的情况下,该操作效率高(先删除索引,再删表)
索引可以提高查询效率,但是会影响增删改效率
因为 oracle 的事务对数据库的变更的处理,我们必须做提交事务才能让数据真正的插入到数据库中,
在同样在执行完数据库变更的操作后还可以把事务进行回滚,这样就不会插入到数据库。
如果事务提交后则不可以再回滚。
提交:commit
回滚:rollback
序列:默认从1开始,依次递增
在很多数据库中都存在一个自动增长的列,如果现在要想在 oracle 中完成自动增长的功能,
则只能依靠序列完成,所有的自动增长操作,需要用户手工完成处理。
语法:
CREATE SEQUENCE 序列名
[INCREMENT BY n] -- 每次增加 n
[START WITH n] -- 默认从 n 开始
[{MAXVALUE/ MINVALUE n|NOMAXVALUE}] -- 最大值,最小值
[{CYCLE|NOCYCLE}] -- 循环
[{CACHE n|NOCACHE}]; -- 缓存
范例:创建一个 s_person 的序列,验证自动增长的操作
CREATE SEQUENCE s_person;
序列创建完成之后,所有的自动增长应该由用户自己处理,所以在序列中提供了以下的两种操作:
nextval :取得序列的下一个内容
currval :取得序列的当前内容
select s_person.nextval from dual;(第一次执行序列值是1,后面每次执行值依次递增)
select s_person.currval from dual;(创建完序列后,首先执行此语句会报错,因为当前序列还没有值)
dual:虚表,只是为了补全语法,没有任何意义。
在插入数据时需要自增的主键中可以这样使用
insert into person(pid, name, sex) values(s_person.nextval, '王五', 2);
在实际项目中每一张表会配一个序列,但是表和序列是没有必然的联系的,一个序列被哪一张表使用都可以,
但是我们一般都是一张表用一个序列,因为每张表的 id 都是独立的。
5.Scott 用户下的表结构 默认密码 tiger
-- 解锁 Scott 用户 alter user scott account unlock; -- 解锁 Scott 用户密码(此句也可以用来重置密码) alter user scott identified by tiger;
6.单行函数
1. 字符函数
接收字符输入返回字符或者数值,dual 是伪表
1. 把小写的字符转换成大写的字符
select upper('hello') from dual;
2. 把大写字符变成小写字符
select lower('HELLO') from dual;
3.首字符大写函数
select initcap('hello') from dual;
4.字符串连接函数
select concat('aaa', 'bbb') from dual; -- concat函数在Oracle中参数只能有两个
select 'aaa' || 'bbb' || 'ccc' from dual;
5.字符串截取函数
select substr('helloword', 6) from dual; -- word
select substr('helloword', 6, 1) from dual; -- w
select substr('helloword', -4) from dual; -- word
6.字符串替换函数
select replace('helloword', 'o', '_') from dual; -- hell_w_rd
7.获取字符串长度函数
select length('hello') from dual;
2.数值函数
1. 四舍五入函数:ROUND()
默认情况下 ROUND 四舍五入取整,可以自己指定保留的位数。
select round(25.4343) from dual; -- 25
select round(25.4353, 1) from dual; -- 25.4
2.数值截取函数
select trunc(122.555) from dual t; --默认取整 122
select trunc(122.555,2) from dual t; -- 122.5
select trunc(122.555,-2) from dual t;--负数表示从小数点左边开始截取2位 100
3.取余函数
select mod(10, 3) from dual; -- 1
3. 日期函数
Oracle 中提供了很多和日期相关的函数,包括日期的加减,在日期加减时有一些规律
日期 – 数字 = 日期
日期 + 数字 = 日期
日期 – 日期 = 数字
1. 范例:查询雇员进入公司的周数。雇员进入公司的天数(sysdate – 入职日期) / 7 就是周数
select ename, round((sysdate - hiredate) / 7) from emp;
2. 获得两个时间段中的月数:MONTHS_BETWEEN()
查询所有雇员进入公司的月数
select ename, round(months_between(sysdate, hiredate)) from emp;
4.转换函数
TO_CHAR:字符串转换函数
select to_char(sysdate, 'yyyy-mm-dd hh:mi:ss') from dual; -- 2020-02-21 05:03:48
select to_char(sysdate, 'fm yyyy-mm-dd hh24:mi:ss') from dual; -- 2020-2-21 17:3:50
TO_DATE:日期转换函数
select to_date('1998-04-02', 'yyyy-mm-dd') from dual;
5.通用函数
空值处理nvl
查询所有的雇员的年薪(奖金有null值的用0替代计算)
select ename, sal * 12 + nvl(comm, 0) from emp;
6.条件表达式
case when
select t.empno, t.ename, case when t.job = 'CLERK' then '业务员' when t.job = 'MANAGER' then '经理' when t.job = 'ANALYST' then '分析员' when t.job = 'PRESIDENT' then '总裁' when t.job = 'SALESMAN' then '销售' else '无业' end from emp t;
select t.empno, t.ename, case t.job when 'CLERK' then '业务员' when 'MANAGER' then '经理' when 'ANALYST' then '分析员' when 'PRESIDENT' then '总裁' when 'SALESMAN' then '销售' else '无业' end from emp t
Decode函数
select ename, decode(job, 'CLERK', '业务员', 'MANAGER', '经理', 'ANALYST', '分析员', 'PRESIDENT', '总裁', 'SALESMAN', '销售', '无业' ) 职位 from emp;
Oracle数据库字符串除了起别名(起别名也可以不带引号)用双引号,其余都用单引号。
7.多行函数(聚合函数)
1. 统计记录数 count()
select count(1) from emp;
2. 最小值查询 min()
select min(sal) from emp;
3. 最大值查询 max()
select max(sal) from emp;
4. 查询平均值 avg()
select avg(sal) from emp;
5. 求和函数 sum()
select sum(sal) from emp;
来源:https://www.cnblogs.com/roadlandscape/p/12342458.html