oracle数据库笔记之基础部分
创建用户
CREATE USER 用户名 IDENTIFIED BY 用户密码
[DEFAULT TABLESPACE default_tablespace]--作用是用户的默认表空间
[TEMPORARY TABLESPACE temporary_tablespace];--作用是临时用户默认的表空间
create user identified by 123;
删除用户
drop user 用户名 [cascade --作用是级联删除即删除用户的对象(表。。),但注意删除是这些对象没有被其它用户访问]
给用户授权(用管理员的身份)
grant 权限 to 用户
权限的分类有:create session --分配连接权限
creat sqquence --创建序列权限
creat synonym --创建同义词的权限,需要注意grant creat synonym to 用户名(包含drop synonym权限)
但是grant creat public synonym to 用户名 (不包含drop public synonym权限需要另外分配)
create table --创建表的权限
drop table --删除表的权限
drop any table --删除任一表的权限
create procedure --创建存储过程
create user --创建用户
drop user --删除用户
create view --创建用户
给对象授权
grant 权限 on 表名 to 用户名
对象权限的分类:
对象权限 允许用户操作
insert 执行插入语句
select 执行查询语句
update 执行更新语句
delete 执行删除语句
execute 执行存储过程
撤销用户权限
revoke 权限 from 用户
修改用户
修改用户密码:alter user 用户名 identified by 新密码
connect[conn] 用户名/旧密码
password; --利用管理员的身份为某用户修改密码此方法会显示出一个可视化窗口进行修改,需要注意此代码格式必须是这样否则执行出错。
conn[connect] 用户名/旧密码
password; --用户自己身份进行修改,其他同上
给用户解锁:
alter user 用户名 account unlock;
查询用户
SELECT username,user_id,password,default_tablespace
FROM dba_users;
数据类型
数据类型是在创建表的时候定义的:
字符型的:
数据类型 |
最大长度 |
说明 |
CHAR(size) |
2000 |
固定长度字符串,size表示存储的字符数量 |
NCHAR(size) |
2000 |
固定长度的NLS(National Language Support)字符串,size表示存储的字符数量 经过试验最大值为1000。 |
NVARCHAR2(size) |
4000 |
可变长度的NLS字符串,size表示存储的字符数量. National Language Support (NLS) |
VARCHAR2(size) |
4000 |
可变长度字符串,size表示存储的字符数量 |
RAW(Size) |
2000 |
可变长度二进制字符串,建议使用blob。 |
注意:char(4) --仅可以存储两个汉字
nchar(4) --可以存储四个汉字
数值型的
数据类型 |
说明 |
NUMBER(p,s) |
包含小数位的数值类型。参数p表示精度,参数s刻度,它表示小数点后面的位数。例如:NUMBER(10,2)表示小数点之前最多可以有8位数字,小数点后有2位数字 |
NUMERIC(p,s) |
与NUMBER(p,s)相同 |
FLOAT |
浮点数类型。属于近似数据类型,它并不存储为多数数字指定的精确值,它们只存储这些值的最近似值 |
DEC(p,s) |
与NUMBER(p,s)相同 |
DECIMAL(p,s) |
与NUMBER(p,s)相同 |
INTEGER |
整数类型 |
INT |
同INTEGER |
SMALLINT |
短整类型 |
REAL |
实数类型,与FLOAT一样,属于近似数据类型 |
DOUBLE PRECISION |
双精度类型 |
日期/时间类型
数据类型 |
说明 |
DATE |
日期类型 |
TIMESTAMP |
与DATE数据类型相比,TIMESTAMP类型可以精确到微秒,微秒的精确范围为0-9,默认为6 |
TIMESTAMP WITH TIME ZONE |
带时区偏移量的TIMESTAMP数据类型 |
TIMESTAMP WITH LOCAL TIME ZONE |
带时区偏移量的TIMESTAMP数据类型 |
INTERVAL YEAR TO MONTH |
使用YEAR和MONTH日期时间字段存储一个时间段。年份精度指定表示年份的数字的位数。默认为2 |
INTERVAL DAY TO SECOND |
用于按照日、小时、分钟和秒来存储一个时段。日精度表示DAY字段的位数,默认为2;微秒的精度范围为0-9,默认为6 |
大对象类型
数据类型 |
说明 |
BFILE |
指向服务器文件系统上的二进制文件的文件定位器,该二进制文件保存在数据库之外 |
BLOB |
保存非结构化的二进制大对象数据,最大值为4G。 |
CLOB |
保存单字节或多字节字符数据,最大值为4G. |
NCLOB |
保存Unicode编码字符数据,最大值为4G。 |
sql语句类型:
DDL(data definition language)数据定义语言:用于创建对象的
create drop alter modify rename
DML(data manipulation language)数据操作语言:用于操作数据
insert..into updata delete select
创建表
(1)创建表必须具备create table权限
(2)创建表及命名规则:表名和列名:
CREATE [GLOBAL TEMPORARY--意思是是否是临时表] TABLE 表名 (
列名 列属性 [CONSTRAINT 约束名 DEFAULT 列的默认值]
[, 列名 列的属性[CONSTRAINT 约束名 DEFAULT 列的默认值] ...]
)
[ON COMMIT {DELETE | PRESERVE} ROWS]--控制临时表保存的时间
[TABLESPACE 表空间;]
--注意最后一列没有','号创建完表之后可以使用desc 表名来查询表的结构
(4)对表的操作:
给表添加约束:alter table 表名 add constraint 约束名 约束条件(有primary key 列名|check(列名 约束条件)|unique (列名)|
主外键名 foreign key (列名) references 要引用的表名(列名))
删除表的约束:alter table 表名 drop constraint 约束名
停用约束:alter table 表名 disable constraint 约束名
启用约束:alter table 表名 enable constraint 约束名
查看表的约束:select * from user_constraints;
查看表的信息:select * from user_tables
表的重命名:rename 旧表名 to 新表名
查看表中列的信息:select * from user_tables_columns
往表中添加新的一列:alter table 表名 add 列名 列属性
给列重命名:alter talbe 表名 rename column 旧列名 to 新列名
给列起别名:select stuname as "别名" from student where 条件;(双引号可有可无)
给列(表)添加备注:comment on column 列名(表名) is ‘备注信息’
修改表中列的属性:alter table 表名 modify 列名 列属性
删除表中的一列:alter table 表名 drop column 列名
补充:区分唯一约束和主键约束:
唯一约束:要求该列唯一,允许为空但只能出现一个空值
主键约束:要求该列唯一,不允许为空
(5)对表中数据的操作:
向表中插入数据:♣insert into 表名[列名,列名,..列名] values(与前面列名相对应的值)
注意:所给列的值必须和前面所陈列的顺序一致
当时日期类型是:insert into 表名 values(to_date('2009-02-03','yyyy'));
或者insert into 表名 values('09-3月-2015');
♣insert into 目标表名 select 要插入目标表的列 from 要从哪个表中选数据的表名;
例如:从books1表中查出所有数据插入到books中去
insert into books select * from books1;
♣create table 表名 as select 要插入的列 from 要从哪个表中选数据的表名;
例如:create table books as select * from books1;
注意:第二种和第三种插入方法类似,区别在于第二种方法中books表必须存在而第三种办法是books表可以没有。另外,如果第三种
办法有where条件并且where条件为1=2这种永远为假的条件的话,那么此操作仅仅会复制表books1的结构不会插入任何数据。
更新表中数据:updata 表名 set 列名=列值,列名=列值 where 条件;(多组条件之间用and 表示与 or 表示或)
删除表中数据:delete [from] 表名 where 条件
truncate table 表名
注意:两者区别是delete是可以回退的删除前提是在没有commit之前,而truncate是不可以回退的不管是否commit;
查询表中数据:
♠单表的查询:select 列名 from [distinct] 表名 --加distinct的作用是取消重复列
[where 列名=列值]
[group by 要进行分组的列名]
[having 分组后的查询条件]
[order by 要排序的列 asc(升序)|desc(降序)];
注意:带[]的可以有可以没有,但要是多个存在是顺序必须是这样的。不能颠倒。
数据库中运算符的分类:
(1)算术运算符:+ - * /
注意:+不能做连接符使用,仅仅能用于数字类型的计算
oracle中字符类型的区分大小写例如:smith就不等于Smith
数字类型的直接用=比较,而字符和日期类型的要用单引号括起来在比较
oracle中日期格式是日—月—年要修改可以用语句:alter session set nls_date_format='yyyy-mm-dd';
补充:如何获取系统的年,月,日
select to_char(sysdate,'yyyy') from dual;--获取年
select to_char(sysdate,'MM') from dual; --获取月
select to_char(sysdate,'dd') from dual; --获取日(是当月的第几天,而ddd表示当年的第几天,dy表示当周的第几天)
select to_char(sysdate,'hh') from dual; --获取12进制的小时(其中hh24是24进制的小时)
select to_char(sysdate,'mi') from dual; --获取2位数的秒数(60进制)
select to_char(sysdate,'Q') from dual; --获取季节
select to_char(sysdate,'iw') from dual; --获取当年第几周,一般一年是52周或者53周(其中ww也可以表示,而w则表示当月第几周)
时间的计算:
select sysdate-interval '7' hour from dual; --当前系统时间减去7个小时。也可以用+表示加上7个小时
select sysdate-interval '7' minute from dual; --减去7分钟
select sysdate-interval '7' day from dual; --减去7天
select sysdate-interval '7' month from dual; --减去7个月
select sysdate-interval '7' year from dual; --减去7年
或者:select to_date('2015-06-23','yyyy-mm-dd')+7 from dual;--你输入的时间加上7天
select to_date('2015-06','yyyy-mm')+7 from dual; --你输入的时间默认为2015年6月的1号在加上7天
select to_date('2015','yyyy')+7 from dual; --你输入的时间默认是2015年1月1号再让月加上7日加上7
(2)比较运算符
= !或者<> < > <= >=
any(表示任一) all(表示全部) 注意:这两个必须和上面比较运算符一起使用
in(值1,值2,...值n)匹配值中的任何一个
between 下限 and 上限 (包含上下限)
exists 表示是否存在
例子:select stuname from student where stuno>any(01,05,06);表示查询学号大于01,05,06中的任何一个(即大于最小的即可)的学生姓名
(3)sql运算符
like 和_ 或者%一起使用
例子:select * from emp where ename like 's%';
(5)逻辑运算符
and or not
数据库中的函数:
(1)单行函数:
concat(a,b) --字符串拼接函数,也可已使用||来代替。例如:select concat(bookid,'-') 或者是select bookid||'-' from 表名
Initcap(x) --将字符串转换成每个首字母大写其他字母小写的形式
Instar(要从哪个字符串中找,要查找的字符,开始的位置,第几个出现)
例如:select ename Instr(ename,'l',1,2) from emp where empno=7499; --查找从第一个字母开始找第二个出现'l'的位置,并返
回位置数字
length(x) --返回x长度
nvl(x,value) --若x为null则返回value值
replace(x,要被替换的字符串,替换成的字符串)例子:select ename replace(ename,'SMITH','史密斯') as 新名字 from emp
where emp='7369';将SMITH替换成史密斯
substr(x,开始的位置[,长度]) 提取指定的字符,若开始位置为负数则从x的最后一个字符开始算,若长度没有长度,则返回从开始位置
到最后一个字符之间的所有字符。例子:select ename,substr(ename,2,3) from emp;
lower(列名|字符串) --将字符串的所有字母转换成小写
upper(列名|字符串) --将字符串的所有字符装换成大写
LPAD(x,width[,要填充的字符]) --左填充
RPAD(x,width[,要填充的字符]) --右填充
ltrime(x,[,要去出的字符]) --左去除
rtrim(x,[,要去除的字符]) --右去除
trim(x,[,要去除的字符]) --两边去除
soundex(x) --返回代表x的字符串的语音表达形式例子:select ename from emp
where soundex(ename)=soundex('smith');
(2)数字函数
ceil(value) --返回最接近值的最小整数
floor(value) --返回最接近值的最大整数
trunc(value[,n]) --硬截取,若n大于0则保留n为小数,若n小于0则保留-n为小数,n等于0或者没有则去掉小数部分
round(value,n) --同上,不过是四舍五入的截取
abs(value) --返回绝对值
power(value,n) --n次幂
mod(m,n) --m对n取余的结果
sqrt(value) --开方
(3)转换函数
to_char(x[,format]) --将x转换成什么格式的字符串
to_number(x) --将x转换成数值型
to_date(x[,format]) --将x转换成什么格式的日期型
(4)聚集函数
avg(x) --返回平均值
count(x) --返回同及x出现的系数,会自动排除空值
max(x) --返回最大值
min(x) --返回最小值
sum(x) --求和
median(x) --返回中间值
stddev(x) --返回标准偏差
variance(x) --返回方差
♣高级查询(又称多表查询)
内部链接:select ename,dname from emp e,dept d where e.deptno=d.deptno;
(1)内连接(inner join)例子:
select ename,dname from emp e inner join dept d using(deptno);
select ename,dname from emp e inner join dept d on e.deptno=e.deptno;
(2)左连接(left join)例子:
select e.ename,d.dname from emp e left join dept d on d.deptno=e.deptno --以emp表为主即以左表为主
select e.ename,d.dname from emp e,dept d where e.dtptno=d.deptno(+) --加号不在那个表那,那个表示主表
(3)右连接(right join)例子:
select e.ename,d.dname from emp e right join dept d on d.deptno=e.deptno --以dept表为主即以右表为主
select e.ename,d.dname from emp e,dept d where e.dtptno(+)=d.deptno --加号不在那个表那,那个表示主表
(4)全连接(full join)例子:
select e.ename,d.dname from emp e full join dept d on d.deptno=e.deptno --左右表均为主表
子查询:select * from emp where deptno=(
select deptno from emp where ename='smith';
)注意:若返回数据是多行则会出错,另外,order by 只能用于父查询
多行子查询:select deptno,sal from emp where (deptno,sal)
in(select deptno,min(sal) from emp group bu deptno;);
合并子查询:union --取两个结果集的并集,并自动去掉重复行
union all --取两个结果的并集,不会去重复也不会排序
interset --取交集
minus --取差集,只显示存在第一个集合中的,不显示第二个集合中的
例子:select ename,sal,job from emp where sal>2500
union
select ename,sal,job from emp where job='manager';
分页查询:rownum 结果集编号
select * from(
select rownum m,empno,ename,job from emp where rownum<10
) temp where temp.m>5;
除此之外,rowid是行标识符,oracle中每一行都有一个唯一的标示符,它用户oracle数据库内部存储的物理位置
delete from temp where rowid not in(
select min(rowid) from temp group by id
);
序列(sequence):是数据库对象用于生成一系列的整数
(1)创建序列:create sequence 序列名称
[start with 起始值]
[increment by 步长]
[maxvalue 最大值|nomaxvalue]
[minvalue 最小值|nominvalue] --默认是1
[cycle|nocycle] --默认是nocycle
[cache|nocache] --默认是nocache
[order|noorder] --请求顺序是否按生成顺序得到
例子:create sequence s
start with 10
increment by 5
minvalue 10
maxvalue 20
cycle cache 2
order;
(2)删除序列:drop sequence s;
(3)查看序列:select s.nextval from dual;
select s.currval from dual;
索引:
(1)B树索引:默认的索引类型,平衡数索引适用于高基数,重复值少时使用
create [unique] index 索引名 on
表名(列名[,列名...])
tablespace 索引空间
例子:create index i on customer (last_name);
(2)唯一索引:B树索引的一种形式,经常与主键和唯一键约束一起使用。
(3)位图索引:对于包含低基序列以及在sql语句的where字句中使用,使用许多and 或者or运算符的数据仓库,重复值的使用
create bitmap index 索引名 on 表名(列名)
(4)函数索引:使用与应用了sql函数的列
create index 索引名 on 表名(upper(列名))
视图:基于已知的一张或多张表的查询操作,存储在数据库中的一条sql语句
视图并不是存储数据,数据依然被存在原始表中,
注意: 如果视图只关联了一张表,则可基于它进行增,删,改,查操作对原表产生影响
创建视图:create [or replace] [force|noforce] view 视图名
[列名[,列名...]] as subquery 子查询
[with [check option|read only] constraint 约束名];
注意:创建视图必须具备相应的权限:grant create view to 用户名
删除视图:drop view 视图名
同义词:
create sysnonym 同义词名 for 相应的要为谁创建同义词的名
同样要具有相应的权限:grant create sysnonym to 用户名;注意:此语句不仅分配了创建同义词的权限,还分配了删除同义词的权限
grant create public sysnonym to 用户名;--仅仅分配了创建权限
grant drop public sysnonym to 用户名; --分配删除的权限