一脸懵逼学习oracle
oracle的默认用户:system,sys,scott;
1:查看登录的用户名:show user;
2:查看数据字典:dba_users;
3:创建新用户
(1)要连接到Oracle数据库,就需要创建一个用户账户;
(2)每个用户都有一个默认表空间和一个临时表空间;
创建用户(Create the user):
create user 用户名
identified by "密码"
default tablespace SYSTEM --系统表空间
temporary tablespace TEMP --临时表空间
profile DEFAULT
授权(Grant/Revoke role privileges)
grant connect to 用户名;
grant dba to 用户名;
grant resource to 用户名;a:授予权限:
(1)权限指的时执行特定命令或者访问数据库对象的权利
(2)权限有两种类型,系统权限和对象权限;
2.1:系统权限允许用户执行某些数据库操作,如创建表就是一个系统权限;
2.1:对象权限允许用户对数据库对象,如表,试图,序列等执行特定操作;
b:角色时一组相关权限的组合,可以将权限授予角色,再把角色授予用户,以简化权限管理;c:种标准角色:
oracle为了兼容以前的版本,提供了三种标准的角色(role):connect,resourc,dba;
3.1:connect role(连接角色)
临时用户,特别时那些不需要建表的用户,通常只赋予他们connect role,connect是使用
oracle的简单权限,这种权限只有在对其他用户的表有访问权时,包括select,insert,
update和delte等,才会变得有意思。拥有connect role的用户还能创建表,视图,序列(sequece)
簇(cluster),同义词(synonym),会话(session)和与其他数据库的链(link)。
3.2:resource role(资源角色)
更可靠和正式的数据库用户可以授予resource role ,resource 提供给用户另外的权限以创建他们
自己的表,序列,过程(procedure),触发器(trigger),索引(index),和簇(cluster);
3.3:dba role(数据库管理员角色)
dba role 拥有所有的系统权限,包括无限制的空间限额和给其他用户授予各种权限的能力,
systemyou由dba用户拥有。授权举例说明:
grant create sequece to 用户名:此系统权限允许用户在当前模式种创建序列,此权限包含在connect角色中
授权用户操作数据表的对的权限
grant select on 数据表名 to 用户名:允许用户查询数据表中的数据
grant update on 数据表名 to 用户名:允许用户更新数据表中的数据
grant all on 数据表名 to 用户名:允许用户插入,更新,删除,查询数据表中的数据
alter user 用户名identified by :密码修改用户的密码;
drop user 用户名 cascade:删除用户
4:表空间的分类
(1)永久表空间(system):存放永久性数据,如表,索引等;
(2)临时表空间(temp):不能存放永久性对象,用于存放数据库排序,分组时产生的临时数据;
建立表空间(一般建N个存数据的表空间和一个索引空间)
create tablespace 表空间名
datafile '路径(要先建好路径)\***.dbf' size *M
tempfile '路径\***.dbf' size *M
autoextend on --自动增长
--还有一些定义大小的命令,看需要
default storage(
initial 100k,
next 100k,
);
5:SQL简介:
(1):sql是structured query language,结构化查询语言的首字母缩写词;
(2):sql是数据库语言,oracle使用该语言存储和检索信息;
(3):通过sql可以实现与oracle服务器的通信;
(4):表示主要的数据库对象,用于存储数据;
6:sql支持下列类别的命令:
(1):数据定义语言(ddl):create,alter,drop
(2):数据操纵语言(dml):insert,delete,update
(3):事务控制语言(tcl):commit,rollback
(4):数据控制语言(dcl):grant,revoke
7:Oracle的数据类型
(1)创建数据表的时候,必须为各个列指定数据类型
(2)以下是oracle的数据类型的类别:
数据类型:字符,数值,日期时间,RAW/LONG RAW,LOB
8:字符数据类型:char,varchar2,long
(1):当需要固定长度的字符串时,使用char数据类型
(2):char数据类型存储字母数据值;
(3):char数据类型的列长度可以是1到2000个字节;
(4):varchar2数据类型支持可变长度字符串;
(5):varchar2数据类型存储字母字值;
(6):varchar2数据类型的大小在1至4000个字节范围内;
(7):long数据类型存储可变长度字符数据;
(8):long数据类型最多能存储2GB;
9:数值数据类型
(1):可以存储整数,浮点数,和实数数据操纵语言,最高精度为38位数据
(2):数值数据类型的声明语法:
number[(p[,s])] : p表示精度,s表示小数点的位数
10:日期时间数据类型存储日期和时间值,包括年,月,日,小时,分钟,秒
主要的日期时间类型有:
Date:存储日期和时间部分,精确到整个的秒TIMESTAMP,存储日期,时间和时区信息,秒值精确到小数点后6位;
11:其他数据类型:
(1)存储二进制的数据类型:
a:RAW数据类型用于存储二进制数据,最多能存储2000字节,
b:Long Raw数据类型用于存储可变长度的二进制数据,最多能存储2GB
(2)LOB:CLOB,BLOB,BFILE
a:CLOB:即character lob(字符Lob),它能够存储大量字符数据;
b:BLOB:即binary lob(二进制lob)可以存储较大的二进制对象,如图形,视频剪辑和声音文件;
c:BFILE:即binary file(二进制文件),它用于将二进制数据存储在数据库外部的操作系统文件中;(3)oracle中伪列就像一个表列,但是它并没有存储在表中
a:伪列可以从表中查询,但不能插入,更新和删除它们的值
b:常用的伪列有rowid,rownumc:Rowid是表中行的存储地址,该地址可以唯一地标识数据库中的一行,可以使用rowid伪列快速地定位表中的一行;
RowNum是查询返回的结果集中行的序号,可以使用它来限制查询返回的行数;
12:数据定义语言用于改变数据库结构,包括创建,更改,和删除数据库对象:
1:用户操纵表结构的数据定义语言命令有:
(1):create table
create table 数据表名称(
user_id number not null,
user_name varchar2(50),
user_time date
)
(2):alter table--设置主键
alter table users
add constraint usersId primary key(user_id);
--修改字段长度
alter table users modify user_name varchar2(500);--修改字段名称
alter table users rename column user_name to user_names;
(3):truncate table(清空表里面的所有记录)--删除表记录
truncate table 数据表名称(效率高,只做一次删除日志,删除不需要提交事务)delete from 数据表名称(做多次删除日志记录,比较慢,删除需要提交事务)
(4):drop table:删除表,把表和数据全部都删除了
13:数据操纵语言
1:数据操纵语言用于检索,插入和修改数据
2:数据操纵语言是最常见的sql命令
3:数据操纵语言命令包括:(1)select:
a:利用现有的表创建新表
create table 新表表名 as select * from 老表表名称b:选择无重复的行,在select子句,使用distinct关键字
select distinct 字段名称 from 数据表名;
c:使用列别名,为列表达式提供了不同的名称,该别名指定了列标题:as
(2)insert,
a:插入日期类型的值:日期数据类型的默认格式为"DD-MON-RR",使用日期的默认格式sysdate:
insert into 数据表名称 values();
insert into users values(6,'李四',sysdate);insert into users values(7,'赵六','17-9月-05'); ---》 2005年9月17号,格式,格式,格式
insert into users values(8,'赵六',to_date('2017-9-5','yyyy-MM-dd'));
insert into users2 select * from users;插入来自其他表中的记录;
(3)update,
update users set user_name='李四' where user_id='1';
(4)delete;
delete from users where user_id=1;(注意:需要提交事务)
14:事务控制语言
1:事务是最小的工作单元,作为一个整体进行工作
2:保证事务的整体成功或者失败,称为事务控制
3:用于事务控制的语句有:
(1):commit---提交并结束事务处理:update users set user_name='张三二号' where user_id=1;
执行了修改,添加,删除语句,然后提交即commit;数据表已经发生了改变了;
(2):rollback---撤销事务中已经完成的工作:update users set user_name='张三二号' where user_id=1;
执行了修改,添加,删除语句,然后提交即rollback;数据表没改变;
(3):savepoint---标记事务中可以回滚的点(假如设置两个回滚点,然后回滚到第一个回滚点,然后提交,那么操作没有执行步骤二,只执行了步骤一):insert into users values(4,'赵刘','10-9月-17');
savepoint s1;
delete from users where user_id=3;
savepoint s2;
rollback to savepoint s1;
commit;即只执行了插入操作,没有执行删除操作
15:SQL SELECT语句
1:select * from table;
select标识选择哪些列
from标识从那个表中选择;
2:SQL语言大小写不敏感,可以写在一行或者多行,关键字不能被缩写也不能分行,各子句一般要分行写;3:连接列的符号||:select user_id||user_name from users;
16:过滤where和运算符
1:使用where子句,将不满足条件的行过滤掉,where子句紧随from子句;
2:字符和日期
(1):字符和日期要包含在单引号中
(2):要查询的字符大小写敏感,日期格式敏感
(3):默认的日期格式是DD-MON-RR(日-月-年,'5-9月-17','5-9月-2017')
3:运算符:
(1)比较运算符:> >= < <= = <>
(2)其它运算符
(a):between and在两个值之间,包含边界
(b):in等于值列表中的一个,使用in运算显示列表中的值:
select * from users where user_id in (1,2,3);
select * from users where user_id not in (1,2,3);
(c):like模糊查询:使用like运算符选择类似的值,选择条件可以包含字符或者数字
%代表一个或者多个字符
_代表一个字符
(d):is null空值(3)逻辑运算符
(a):and,逻辑并,要求两边都为真;
(b):or,逻辑或,只要求一边为真即可,要求或的关系为真;
(c):not,逻辑否;
17:优先级,可以使用括号改变优先级顺序
1:算数运算符
2:连接符
3:比较符
4:is [not] null,like,[not] in
5:[not] between
6:not
7:and
8:or
18:排序
1:order by:使用order by子句排序
ASC升序
DESC降序
注意:order by子句在select语句的结尾select * from users order by user_id;可以按照多个字段进行排序操作;
19:Oracle之单行函数和多行函数
1:单行函数:
(1)操作数据对象
(2)接受函数返回一个结果
(3)只对一行进行变换
(4)每行返回一个结果
(5)可以转换数据类型
(6)可以嵌套
(7)参数可以是一列或者一个值2:单行函数包含字符,数值,日期,转换,通用;
(a):大小写控制函数:
lower(‘AAA’)转化为小写,
upper('aaa')转化为大写,
initcap('hello world')首字母大写;
(b):字符控制函数:concat('aa','bb')合并函数,
substr('hello world',1,5)截取字符串,
length('hello world')字符串的长度的函数,
instr('hello world','w'),查看字符所在第几个,
lpad(字段,10,‘*’)前面不够的补*号 | rpad(字段,10,‘*’)后面不够的补*号,
trim(‘h’ from 'hello world'),去除指定的字符,
replace(x,y,z)替换字段内容,将字段x的y替换为z内容;
(c)数字函数
round四舍五入:round(45.926,2)=45.93
trunc截断:trunc(45.926,2)=45.92
mod求余:mod(1600,300)=100(d)日期函数
(1):Oracle内部使用数字存储日期:世纪,年,月,日,小时,分钟,秒;
(2):默认的日期格式是DD-MON-RR(日-月-年格式):
可以只指定年的后两位在20世纪存放21世纪的日期;
同样可以在21世纪存放20世纪的日期;
(3):sysdate:返回日期和时间(4):日期函数
在日期上加上或者减去一个数字结果仍为日期;
两个日期相减返回日期之间相差的天数;(5):日期函数
MONTHS_BETWEEN两个日期相差的月数
ADD_MONTHS向指定日期加上若干月数
NEXT_DAYE指定日期的下一个日期
LAST_DAY本月的最后一天
ROUND日期四舍五入
TRUNC日期截断(e):转换函数
(1)数据类型转换:隐性和显性
(2)隐式数据类型转换:
varchar22 or char隐式转换为number
varchar22 or char隐式转换为date
number隐式转换为varchar2
date隐式转换为varchar2
(3)显式类型转换:to_char()函数对日期的转换:
格式:to_char(date,'format model')
必须包含在单引号中而且大小写敏感
可以包含任意的有效的日期格式
可以使用fm去掉多余的空格或者前导零
与日期值用逗号隔开;举例:select to_char(sysdate,'yyyy-MM-dd HH24:mm:ss') from dual;
select to_char(sysdate,'yyyy-MM-dd HH12:mm:ss') from dual;
to_number()函数将字符转换为数字类型的。
to_date()函数:将字符串按照指定的类型转化为日期;select to_date('2017-09-04','yyyy-MM-dd') from dual;
(f):通用函数这些函数适用于任何数据类型,同时也适用于空值
NVL(expr1,expr2):将空值转换成一个已知的值,可以使用的数据类型有日期,字符,数字。
NVL2(expre1,expr2,expr3)
NULLIF(expr1,expr2)
COALESCE(expr1,expr2,...,exprn)
20:单行函数之条件表达式:
1:条件表达式:
(a):使用两种方法:
case表达式
decode函数(b):举例说明:可以做标识转化,数字和中文的对应关系;
select u.*,
case u.user_mark
when 1 then '大佬级别程序猿'
when 2 then '高级级别程序猿'
when 3 then '中级级别程序猿'
when 4 then '低级级别程序猿'
else
'菜鸟级别程序猿'
end case
from users u;(c):开发经常使用decode方法:
select u.*,
decode( u.user_mark,
1,'大佬级别程序猿',
2,'高级级别程序猿',
3,'中级级别程序猿',
4,'低级级别程序猿',
'菜鸟级别程序猿'
)
from users u;
21:oracle之多表查询
1:笛卡尔积:
笛卡尔积会在下面条件下产生:
省略连接条件,连接条件无效,所有表中的所有行互相连接;
为了避免笛卡尔积,可以在where加上有效的连接条件;2:Oracle连接:
使用连接在多个表中查询数据;
在where子句中写入连接条件;
在表中有相同列时,在列明之前加上表名前缀;
3:连接多给表:
(1)连接n个表至少需要n-1个连接条件,例如,连接三个表至少需要两个连接条件;(2)等值连接:
select a.*,b.*
from employee a,DEVELOPMENT b
where a.development_id=b.development_id(3)非等值连接(可以用来查询会员的等级信息)
select a.*,b.grades_name
from employee a,job_grades b
where a.employee_salary between b.grades_start and b.grades_end;
(4)外链接语法:
使用外链接可以查询不满足连接条件的数据,外链接的符号是(+)
select a.*,b.development_name
from employee a,development b
where a.development_id(+) = b.development_id;和
select a.*,b.development_name
from employee a,development b
where a.development_id = b.development_id(+);
(5)自连接(自己的父部门等于父部门的编号就可以查看自己的父部门信息了; )select a.*,b.employee_name parentName
from employee a,employee b
where a.emp_employee_id=b.employee_id(6)叉集
(a):使用cross join子句使连接的表产生叉集;
(b):叉集和笛卡尔积是相同的;(c)select *
from employee
cross join development(7)自然连接(等同于等值连接)
(a)natural join 子句,会以两个表中具有相同名字的列为条件创建等值连接
(b)在表中查询满足等值条件的数据
(c)如果只是列名相同而数据类型不同,则会产生错误(d)select *
from employee
natural join development(8)使用on子句创建连接
(a)自然连接中是以具有相同名字的列为连接条件的
(b)可以使用on子句指定额外的连接条件
(c)这个连接条件是与其他条件分开的
(d)on子句使语句具有更高的易读性(e)select a.*,b.*
from employee a
join development b
on a.development_id=b.development_id
(9)oracle的内连接:select a.*,b.*
from employee a
inner join development b
on a.development_id=b.development_id(10)内连接和外链接
(a)内连接只返回满足连接条件的数据(b)两个表在连接过程中除了返回满足连接条件的行意外还返回左或者右表中不满足条件的行,这种连接称为左或者右外连接
(c)两个表在连接过程中除了返回满足连接条件的行以外还返回两个表中不满足条件的行,这种连接称为满外连接oracle的左外连接:
select a.*,b.*
from employee a
left outer join development b
on a.development_id=b.development_id(11)oracle的右外连接
select a.*,b.*
from employee a
right outer join development b
on a.development_id=b.development_id(12)oracle的满外连接
select a.*,b.*
from employee a
full outer join development b
on a.development_id=b.development_id