oracle 语法基础

SQL 的结构
数据查询语言 SELECT
DDL 数据库定义语言 CREATE DROP ALTER
DML 数据库管理语言 INSERT DELETE UPDATE――commit rollback
TRANSACTION 事务控制语言
DCL 数据库控制语言 GRANT REVOKE


 查询 SELECT

投影操作,只查看选择的字段的信息。 select
选择操作,查看字段中的特定某些信息。 where
连接操作,多表查询,通过表间连接,查询出多表中的信息 join

1)select table_name from user_tables;(查询系统表)
以上的查询语句就是查询本用户下所拥有的所有表的表名。

2)sqlplus的buffer中会缓存最后一条sql语句,可以使用"/"来执行这最后一条sql语句,也可以使用
edit或者ed命令来编辑最后一条sql语句。
l命令(list)(sqlplus命令)可以显示buffer中最后一条命令。

SELECT 语句的执行顺序
1) from子句组装来自不同数据源的数据;
2) where子句基于指定的条件对记录行进行筛选;
3) group by子句将数据划分为多个分组;
4) 使用聚集函数进行计算;
5) 使用having子句筛选分组;
6)计算所有的表达式;
1. | | 两个下划线表示字符的连接
2. “ ” 双引号只用在别名上
3. ‘’ 单引号表字符,可包含空格,单引号里区分大小写
4. nvl 空值转换 convert null to an actual value with nvl .
7) 使用order by对结果集进行排序,空值当作无穷大处理。

举例说明: 在学生成绩表中 (暂记为 test_score), 把 "学生姓名"内容不为空的记录按照 "学生姓名" 分组, 并且筛选分组结果, 选出 "总成绩" 大于 60 分的.
标准顺序的 SQL 语句为:
SELECT name, max(score) as max-score
FROM test_score
WHERE name is not null
GROUP BY name
HAVING max(score) > 60
ORADER BY max-score
在上面的示例中 SQL 语句的执行顺序如下:
1). 首先执行 FROM 子句, 从 test_score 表组装数据源的数据
2). 执行 WHERE 子句, 筛选 test_score 表中所有数据不为 NULL 的数据
3). 执行 GROUP BY 子句, 把test_score表按 "学生姓名" 列进行分组
4). 计算 max() 聚集函数, 按 "总成绩" 求出总成绩中最大的一些数值
5). 执行 HAVING 子句, 筛选课程的总成绩大于 60 分的.
6). 执行 ORDER BY 子句, 把最后的结果按 "max-score" 进行排序.

 总的来说是:根据where子句的条件表达式,从FROM子句指定的基本表或视图中找出满足条件的记录,再按Select子句中的目标列表达式,选出记录中的属性值形成结果表。如果有GROUP子句,则将结果按<列名>的值进行分组,该属性列值相等的记录为一个组。通常会在每组中使用聚集函数 (sum,count,max,min等)。如果GROUP子句带HAVING短语,则只有满足指定条件的组才会输出。如果有ORDER子句,则结果表还要按<列名>的值的升序或降序排序。

select后可以加字段,表达式,函数。
1)like/not like通配:字符串通配查询。
% 0或多个字符
_任意一个字符
查询以s_开头的表:
select table_name from user_tables where table_name like 'S\_%'escape'\';//escape是定义谁是转义字符。
2)is null/is not null
3)where : = , < , > , <> , != , and , or , in , between ... And ... , >any ,
>all, <any, <all.

小于任何一个:
班上同学的年龄小于任何一个女生的男生有哪些?
select id,name,gender,age from stu
where gender='m' and age<any( select age from stu where gender='f');
select id,name,gender,age from stu
where gender='m' and age < all(select age from stu where gender='f');

 表的连接
 等值连接
等值连接是指使用等号("=")指定连接的连接查询。进行比较的不同表中的列的名称可以不同,但类型必须是匹配的。如果连接的表中还有相同名称的列,这需要在列名前加表名以区分是哪个表中的列。
例:查询101的学生的名字、考试课程名称、分数
select s.name,sc.score,c.name
from student_zdk s,course_zdk c,s_c_zdk sc
where s.id=sc.sid and sc.cid=c.id and s.id=101;
 非等值连接
如果连接条件中的运算符不是等号而是其他关系运算符,则称为不相等连接。
例:列出参加了考试的学生的姓名,课程名称,分数等级
select s.name,c.name,g.grade
from student_zdk s,course_zdk c,s_c_zdk sc,grade_zdk g
where s.id=sc.sid and c.id=sc.cid and sc.score between g.lownum and g.highnum;

 自连接
自连接是指同一个表自己与自己进行连接。这种一元连接通常用于从自反关系(也称 作递归关系)中抽取数据。
例:员工表中雇员与老板的关系。
select a.first_name ename,b.first_name mname
from s_emp a,s_emp b
where a.manager_id=b.id;

例:找出学生表中地址相同的学生的信息
select distinct a.id,a.name a.addr
from student_zdk a,student_zdk b
where a.addr=b.addr and a.id!=b.id;
 外连接
外连接包括左外连接、右外连接、全外连接三种。
select s_emp.first_name emp, nvl(e.first_name,'boss') manager from s_emp,s_emp e where s_emp.manager_id=e.id(+)
1)左连接:left join 或 left outer join
左向外联接的结果集包括 LEFT OUTER 子句中指定的左表的所有行,而不仅仅是联接列所匹配的行。如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表列均为空值(null)。
 标准SQL语句的连接方式:
SELECT table1.Column,table2.Column[,...]
FROM table1 LEFT JOIN table2[,]
ON table1.column <operator> table2.Column[,...];
SELECT e.ename,e.deptno,d.dname,d.deptno
FROM dept d LEFT OUTER JOIN emp e
ON d.deptno=e.deptno
where e.deptno is null;
 ORACLE扩展的连接方式:
SELECT table1.Column,table2.Column[,...]
FROM table1,table2[,...]
WHERE table1.column <operator> table2.column(+)[...];
例:列出哪个部门没有员工
select e.ename,e.deptno,d.dname,d.deptno
from dept d,emp e
where d.deptno=e.deptno(+)
and e.deptno is null;
2)右连接:right join 或 right outer join
右向外联接是左向外联接的反向联接。将返回右表的所有行。如果右表的某行在左表中没有匹配行,则左表将返回空值。
 标准SQL语句的连接方式:
SELECT table1.Column,table2.Column[,...]
FROM table1 RIGHT JOIN table2[,]
ON table1.column <operator> table2.Column[,...];
SELECT s.id,s.name,sc.score
FROM s_c_zdk sc RIGHT JOIN student_zdk s
ON s.id=sc.sid;
 ORACLE扩展的连接方式:
SELECT table1.Column,table2.Column[,...]
FROM table1,table2[,...]
WHERE table1.column(+) <operator> table2.column[...];
SELECT s.id,s.name,sc.score
FROM s_c_zdk sc ,student_zdk s
WHERE s.id=sc.sid(+);
3) 全外连接full join 或 full outer join
返回左表和右表中的所有行。当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值。如果表之间有匹配行,则整个结果集行包含基表的数据值。
 ORACLE数据库中,全外连接的表示方式为:
SELECT table1.column ,table2.column[,...]
FROM table1 FULL JOIN table2[,...]
ON table1.column1 = table2.column2[...];

SELECT e.id,e.first_name ,d.name FROM s_emp e full JOIN s_dept d ON e.dept_id =d.id;
等价于:
SELECT e.id,e.first_name ,d.name FROM s_emp e JOIN s_dept d ON e.dept_id =d.id(+);
 函数
数据类型:
表名的命令规则: 首字母为字母,不得超过 30 个字符
char(size) 定长 不管是否达到最大宽度,都会点最大的宽度。
varchar2(size) 可变长 按实际的字节占用空间
number 所有的数字类型都称为 number
number(n, m ) n------n 位宽度 m-----小数点后的宽度
number(2,4) 小 数 点 后 4 位 , 有 效 位 2 位 values(0.0099) 这 样 可 以
values(0.01)这样出错
LONG 大文本一个表最我只允许定义一个 LONG 类型(不建议使用)
CLOB2GB 大对象形式存放(在表里只存一个指针)
BLOB 存二进制大对象(声音,图像之类)
 字符函数

函数 说明
CONCAT(char1,char2) 用于字符串连接,返回字符串char1与字符串char2连接后的字符串
INITCAP(char) 将字符串中每个单词的首字母大写
LENGTH(char) 计算字符串的长度
LOWER(char) 将字符串中所有的大写字母转换为小写字母
REPLACE(char1,char2,char3) 把字符串char1中的字符串char2用字符串char3取代
SUBSTR(char,m[,n]) 用于获取字符串的子串,m表示子串的起始位置,n表示子串的长度
TRIM([leading|trailing|both]char from string) 从字符串string的头,尾或两端去掉字符char
UPPER(char) 将字符串中的所有小写字母转换为大写字母
 SUBSTR(string,start[,count])
对字串 (或字段),从 start字节 开始,连续取 count 个字节并返回结果,如果没有指 count则一直取到尾。
例如:select name,substr(name,2,5) from emp;

 数值函数

函数 说明
ABS(n) 返回n的绝对值
COS(n) 返回n的余弦值
EXP(n) 返回e的n次幂
FLOOR(n) 返回小于或等于n的最大整数
LN(n) 返回以e为底的n的对数
LOG(m,n) 返回以m为底的n的对数
MOD(m,n) 返回m除以n的余数
POWER(m,n) 返回m的n次方
ROUND(m[,n]) 对m进行四舍五入
SIN(n) 返回n的正弦值
SQRT(n) 返回n的平方根
TAN(n) 返回n的正切值
TRUNC(m[,n]) 对m进行截取操作(当n大于0时,表示截取到小数点右边第n位;当n省略时,表示截取m的小数部分;当n小于0时,表示截取到小数点左侧第n位
CEIL(n) 返回大于或等于n的最小整数
 select abs(100),abs(-100) from dual;
ABS(100) ABS(-100)
---------- ----------
100 100
 select round(55.5),round(-55.5),trunc(55.5),trunc(-55.5) from dual;
round(55.5) round(-55.5) trunc(55.5) trunc(-55.5)
----------- ------------ ----------- -------------
56 -56 55 -55

 字符函数
函数 说明
ADD_MONTHS(d,n) 返回日期d添加n个月所对应的日期。n为正数则表示d之后的日期,n为负数则表示d之前的日期
CURRENT_DATE 返回当前会话时区所对应的日期
CURRENT_TIMESTAMP[(p)] 返回当前会话对应的日期时间,p表示精度,默认值为6位
EXTRACT(YEAR|MONTH|DAY FROM d) 从日期d中获取说需要的数据(年、月、日)
LAST_DAY(d) 返回日期d所在月份的最后一天的日期
LOCALTIMESTAMP[(p)] 返回当前会话时区所对应的日期
MONTHS_BETWEEN(d1,d2) 返回d1和d2两个日期之间相差的月数
NEXT_DAY(d,string) 返回日期d后的由string指定的第一个工作日所对应的日期
ROUND(d,[fmt]) 返回日期的四舍五入结果
SYSDATE 返回当前系统的日期时间
TRUNC(d,[fmt]) 返回截断日期时间数据

日期函数:日期类型:一个日期一定包含年,月,日,时,分,秒。日期是格式敏感的。
sysdate函数:获得系统日期,默认的日期格式是‘DD-MON-RR'
alter session set nls_date_format='YYYY-mm-dd';
 select to_char(add_months(to_date('200812','yyyymm'),1),'yyyymm') add_mon from dual;
ADD_MO
------
200901
 select to_char(add_months(to_date('200812','yyyymm'),-1 ),'yyyymm') add_mo from dual;
ADD_MO
------
200811
 LAST_DAY( date ) 返回日期 date 所在月的最后一天
select to_char(last_day(sysdate),'yyyy-mm-dd') last from dual;
LAST
--------------
2008-12-31
select to_char(sysdate,'yyyy.mm.dd') cur,to_char((sysdate)+1,'yyyy.mm.dd') Last from dual;
CUR LAST
---------- ----------
2008.12.09 2008.12.10
 MONTHS_BETWEEN(date2,date1) 给出 Date2 - date1 的月数(可以是小数)
select months_between(to_date('2008.12.08','yyyy.mm.dd'), to_date('2009.12.08','yyyy.mm.dd') ) mon_bet from dual;
MON_BET
----------
-12
 转换函数

函数 说明
TO_CHAR(d[,fmt]) 将日期d按指定格式转换为字符串
TO_CHAR(num[,fmt]) 将数值按指定格式转换为字符串
TO_DATE(char[,fmt]) 将字符串按指定格式转换为日期
TO_CLOB(char) 将字符串转换为CLOB类型数据
TO_NUMBER(char[,fmt]) 将字符串按指定格式转换为数值

 TO_CHAR(date,’format’) 根据 format 重新格式日期 date 的格式
select to_char(sysdate,'yyyy/mm/dd hh24:mi:ss') d_day from dual;
D_DAY
-------------------
2008/12/08 22:38:01
日期格式比较多,详细内容请参考原版资料。下面给出常用的日期格式代码:
日期代码 格式说明 例子
DY 星期几的缩写 Mon,Tue,...
Q 季度 1,2,3,4
DAY 星期几的全拼 Monday,Tuesday,...
D 一周的星期几,星期天=1,星期六=7 1,2,3,4,5,6,7
DD 一月的第几天,131 1,2,... 31
DDD 一年的第几天,1366 1,2,3,...366
J 公元前的第几天(从公元前 4712 起 ?) 2451514,2451515,...
W 一个月的第几周,1 5 1,2,3,4,5
WW,IW 一年的第几周,一年的 ISO 的第几周 1,2,3,4,... 52
MM 两位数的月 01,02,03,...12
MON 月份的缩写 Jan,Feb,Mar ,...Dec
MONTH 月份的全拼 January,February,...
RM 罗马数字的月份,I XII I,II,III,IV,...XII
YYYY,YYY,YY,Y 四位数的年,三位数的年 1999,999,99,9
YEAR 年的全拼 Nineteen Ninety-nine
SYYYY 如果是公元前(BC),年份前负号 -1250
RR 当前年份的后两位数字 01 代表 2001年
HH,HH12 12 小时制, 1,2,3,...12
HH24 24 小时制,023 0,1,2,3,...23
MI 一小时中的第几分,059 0,1,2,3...59
SS 一分中的第几秒,059 0,1,2,3,...59
SSSSS 一天中的第几秒,086399 0,1,2,3,...86399
 TO_DATE(string,’format’) 将一和字串转换为 ORACLE 的日期
insert into demo(demo_key,date_col)
Values(1 , to_date(’04-Oct-1999’, ‘DD-Mon-yyyy’) );

 TO_NUMBER(<c>) 将给出的字符转换为数字
SELECT TO_NUMBER ('2008') "F_YEAR" FROM DUAL;
F_YEAR
-----------
2008
 其他函数
LEAST(expr1,expr2,...) 返回几个表达式中的最小值
GREATEST(expr1,expr2,...) 返回几个表达式中的最大值
NULLIF(expr1,expr2) 如果expr1和expr2相等函数就返回NULL,否则返回exp1
NVL(exp1,exp2) 如果exp1为NULL则返回exp2,否则返回exp1
UID 返回当前会话的用户ID
USER 返回当前会话的数据库用户名

 AVG( [ {DISTINCT | ALL}] ) 求平均值,ALL表示对所有求平均值,DISTINCT只对不同的求平均值,相同只取一个
 MAX([{DISTINCT | ALL}] )求最大值,ALL表示对所有求最大值,DISTINCT 只对不同的求最大值,相同只取一个
 MIN([{ DISTINCT | ALL}] )求最小值,ALL表示对所有求最小值,DISTINCT 只对不同的求最小值,相同只取一个

 表的创建
 直接创建表
CREATE TABLE table_name(
column_name datatype [column_level_constraint]
[,column_name datatype [column_level_constraint]...]
[,table_level_constraint]
);
 利用子查询创建表
CREATE TABLE table_name(
column_name [column_level_constraint]
[,column_name [column_level_constraint]...]
[,table_level_constraint]
)
AS subquery;
注意:从已存在的表建表只有非空约束能带过去。
create table s_emp_42 //表结构和子查询的结果一样,字段名也一样
as //相当于复制表,not null的约束可以带过来
select * from s_emp //如果要带其他的约束要写alter
where dept_id=42;
如果只想要结构而不要数据。
create table s_emp_42 as select * from s_emp where 1=2;//永假式
 修改表
表创建后,可以对表进行修改,包括列的添加、删除、修改、表参数的修改,表重命名和约束的添加、删除、修改、激活、禁用等。
 添加列
ALTER TABLE ... ADD
ALTER TABLE table_name add(new_column_name datatype[not null][default value]);
 修改列类型
ALTER TABLE ... MODIFY
ALTER TABLE table_name MODIFY column_name new_datatype;
 修改列名
ALTER TABLE table_name RENAME COLUMN oldname TO newname;
alter table person_test rename column name to n;
 删除列
1) 直接删除列
ALTER TABLE ... DROP COLUMN
ALTER TABLE table_name DROP [COLUMN column_name]|[(column_name,column_name,...)] [CASCADE CONSTRAINTS]
2) 将列标记为UNUSED状态(删除列时将删除表中每个记录的相应列值,同时释放存储空间,因此要删除一个大的表中的列,由于需要对每个记录进行处理,并写入重做日志文件,需要很长的处理时间,为避免在数据库使用高峰期间由于删除列的操作而占用过多的资源,可以暂时将列置为UNUSED状态)
ALTER TABLE table_name
SET UNUSED [COLUMN column_name]|[(column1_name,column2_name,...)]
[CASCADE CONSTRAINTS];
对用户来说,被标记为UNUSED状态的列像被删除了一样,无法查询该列,但实际上该列仍然存在,并占用存储空间,可以在数据库空闲时,使用ALTER TABLE...DROP UNUSED COLUMNS语句删除处于UNSED状态的所有列。

 表约束
 约束的类别
1) 主键约束(PRIMARY KEY)
2) 唯一性约束(UNIQUE)
3) 检查约束(CHECK)
4) 外键约束(FOREIGN KEY)
5) 非空/空约束(NOT NULL/NULL)
 定义约束
1) 列级约束
语法:[CONSTRAINT constraint_name] constraint_type [condition]
2) 表级约束
语法:[CONSTRAINT constraint_name]
constraint_type(column1_name,column2_name,...]|[condition]
 添加或删除约束
1) 添加约束
ALTER TABLE table_name
ADD [CONSTRAINT constraint_name]
constraint_type(column1_name,column2_name,...)[condition];
1  添加主键约束
ALTER TABLE student ADD CONSTRAINT P_PK PRIMARY KEY(ID);
2  添加唯一性约束
ALTER TABLE student ADD CONSTRAINT P_UK UNIQUE(sname);
3  添加检查约束
ALTER TABLE student ADD CONSTRAINT P_PK CHECK(sage BETWEEN 20 AND 30);
4  添加外键约束
ALTER TABLE student ADD CONSTRANIT P_PK FOREIGN KEY(sno) REFERENCES class(cno) ON DELETE CASCADE;
ALTER TABLE student ADD CONSTRANIT P_PK FOREIGN KEY(sno) REFERENCES class(cno) ON DELETE SET NULL;
5  添加空/非空约束
ALTER TABLE student MODIFY resume NOT NULL;
ALTER TABLE student MODIFY resume NULL;
2) 删除约束
1  删除指定内容的约束
ALTER TABLE student DROP UNIQUE(sname);
2  删除指定名称的约束
ALTER TABLE student DROP CONSTRAINT P_CK;
3  删除主键约束、唯一性约束的同时将删除唯一性约束,如果要在删除约束时保留唯一性索引,则必须在ALTER TABLE...DROP语句中指定KEEP INDEX子句。
ALTER TABLE student DROP CONSTRAINT P_UK KEEP INDEX;
4  如果要在删除约束的同时,删除引用该约束的其他约束(如子表的FOREIGN KEY约束引用了主表的PRIMARY KEY约束),在需要在ALTER TABLE...DROP语句中指定CASCADE关键字。
ALTER TABLE student DROP CONSTRAINT P_PK CASCADE;
5  使约束失效或者生效
alter table 表名 disable primary key; (相当于把一个表的主键禁用)
alter table 表名 enable primary key;(enable 时会自动去检查表的记录是不是符合要求,如果有脏数据时必须要先删除脏数据才可以 enable)

 表的插入、删除和修改
DML操作
注:在进行数据操作以后要commit,否则数据被锁定,产生阻塞;
1、insert
a、插入记录,一次只能插入一条记录。
insert into table_name values(字段1,字段2...);
insert into tablename (字段列表) values(对应字段列表);// 指定字段插入记录
b、一次插入多条记录
insert into tablename (字段列表) from (查询语句);-->将查询结果插入制定表中
insert into tab_name1(col1,col2,col3...)
select col1,col2,col3...
from tab_name2 where ...;
2、update:修改已存在的记录
update tablename set column1=new value,column2=new value where 条件;
例如:update employee set salary=salary+1000 where dep_id=101;
3、delete:删除记录
delete tablename where 条件;
删除表记录: delete 按条件删除记录,可恢复(rollback)
truncate table table_name;//删除表中全部记录,不能回滚 属于DDL语句


 序列:sequence
1、序列的概念:序列用于产生唯一序号的数据库对象,可以为多个数据库用户依次生成不重复的连接整数,通常使用序列自动生成表中的主键值。序列产生的数字最大长度可达到38位十进制数。序列不占用实际的存储空间,在数据字典中只存储序列的定义描述。
2、创建序列:
创建序列使用: CREATE SEQUENCE sequence语句,其语法为:
CREATE SEQUENCE sequence
[INCREMENT BY n]
[START WITH n]
[MAXVALUE n |NOMAXVALUE]
[MINVALUE n |NOMINVALUE]
[CYCLE | NOCYCLE]
[CACHE n | NOCACHE];
其中:
INCREAMENT BY 子句用于设置相邻两个元素之间的差值,即步长,默认值为1
START WITH子句用于设置序列初始值,默认值为1
MAXVALUE|NOMAXVALUE子句用于设置序列有无最大值,默认为无
MINVALUE|NOMINVALUE子句用于设置序列有无最小值,默认为无
CYCLE|NOCYCLE子句用于设置序列是否可以循环,默认为不可循环
CACHE|NOCACHE子句用于设置是否在缓存中预先分配一定数量的数据值,以提高获取序列值的速度,默认为不缓存
例如:创建一个初始值为100,最大值为1000,步长为1的序列,语句为:
CREATE SEQUENCE stud_sequence INCREMENT BY 1
START WITH 100 MAXVALUE 1000;
3、使用序列:
使用序列实质上是使用序列的下列两个属性.
CURRVAL:返回序列当前值
NEXTVAL:返回当前序列值增加一个步长后的值
只有在发出至少一个NEXTVAL之后才可以使用CURRVAL属性
序列值可以应用于查询的选择列表、INSERT语句的values子句、UPDATE语句的SET子句,但不能应用在WHERE子句或PL/SQL过程性语句中。例如,利用序列stu_sequence向表students中插入数据,语句为:
INSERT INTO students(sno,sname) values(stud_sequence.nextval,'john');
SELECT stud_sequence.currval from dual;
4、修改序列:
序列创建完后,可以使用alter sequence语句修改序列。除了不能修改序列起始值外,可以对序列其他任何子句和参数进行修改。例如,修改序列stud_sequence的设置,语句为:ALTER SEQUENCE stud_sequence INCREMENT BY 10 MAXVALUE 10000 CYCLE CACHE 20;
5、删除序列:
当一个序列不再需要时,可以使用DROP SEQUENCE 语句删除序列。例如,删除序列stud_sequence,语句为:DROP SEQUENCE stud_sequence;


 事务
事务是一些数据库操作的集合,这些操作由一组相关的SQL语句组成(只能是DML语句),它们是一个有机的整体,要么全部成功执行,要么全部不执行。事务是数据库并发控制和恢复技术的基本单位。
通常,事务具有ACID4个特性即原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。
原子性:事务是数据库的逻辑工作单位,事务中的所有操作要么都做,要么都不做,不存在第三种情况。
一致性:事务执行的结果必须是使数据库从一个一致性状态转变到另一个一致性状态,不存在中间状态。
隔离性:数据库中一个事务的执行不受其他事务干扰,每个事务都感觉不到还有其他事务在并发执行。
持久性:一个事务一旦提交,则对数据库中数据的改变是永久性的,以后的操作或故障不会对事务的操作结果产生任何影响。
事务的隔离级别
由于数据库中事务的并发运行,可能导致丢失修改、读"脏"数据、不可重复读,为此Oracle数据库为事务提供了两个级别的隔离:
READ COMMITED(读提交):事务的默认的隔离级别,用于设置语句级的一致性。
SERIALIZABLE(串行化):该隔离级别的事务可以防止丢失修改、脏读、和不可重复读。

事务的开始,一个事务的开始就是上一个事务的结束。
事务的结束动作
commit;语句(提交操作,事物的结束)
rollback;语句(回滚操作,会将先前的活动事务中的操作(DML操作)的结果
进行回滚,撤销全部操作,恢复成事务开始时的数据,也就
是恢复成事务开始时的状态。
)
DDL,DCL语句执行会自动提交commit,因为二者改的是系统表。
sqlplus正常退出是会做提交动作的commit;,
当系统异常退出是,会执行回滚操作rollback;
一个没有结束的事务,叫做活动的事务 (active transaction),活动的事务中修改的数据,只有本会话才能看见。


 索引:index
1、建立索引的目的:提高数据的访问效率
2、创建索引:自动创建、手动创建
a、主键与唯一键约束字段系统自动创建索引
b、手动创建:create index indexname on tablename(column);
3、索引的作用:加快查询速度
4、在哪些字段上加索引
常作为连接条件的字段
常作为查询条件的字段
范围较广的值:如,姓名
有大量空值的字段
表数据量大,每次查询结果只有2%--4%的记录
常更新的字段不宜建索引
注意:并不是索引越多越好,索引也会占用系统资源

5、删除索引:drop index indexname


 视图:view
1、 什么是视图
与表有相同的结构,但不存贮数据,只保存结构,所有数据都从表中获取,是一张虚表。可以把视图当成一张表。
2、视图的作用 为不同的权限角色隐藏某些字段
3、创建视图:create(or replace) (force|noforce) view viewname (字段...)
as 子查询
with check option
with read only
-->replace 即:如果视图已经存在,那么覆盖这个视图
-->force:强制创建视图,即如果视图依赖的表不存在,同样创建视图,noforce相反
-->with read only 只能在视图中做查询操作
-->with check option,当你试图修改视图数据的时候,系统检查数据是否满足产生视图时的子查询条件

例如:create view salary_view
as select id,name,salary,dep_id
from employee
where salary>5000

create or replace view salary_view
as select id,name,salary,dep_id
from employee
where salary>5000
with read only;-->不能在视图更新或者插入数据

create or replace view salary_view
as select id,name,salary,dep_id
from employee
where salary>5000
with check option;-->不能向视图插入或者修改工资少于5000的记录
注:视图不存储数据,其中的值随着表的变化而变化,修改视图数据就是修改数据表记录数据
4、视图分类:复杂视图和简单视图
a、简单视图-->从一个表中获取数据,没有函数,没有分组数据,但可对其做增删改操作
b、复杂视图-->从一个或多个表获取数据,可以包含函数,可以是分组数据,但不可做增删改查
c、复杂视图使用 :如果视图中包含分组记录,即使用了分组函数,group by 子句以及使用了去重distinct则不能删除该视图的记录
如果视图中具有以上情况以及视图列进行了数学运算则不能修改视图记录
如果视图中具有以上情况,以及没有包含原数据表中的非空字段,则不能进行插入数据的操作


 执行脚本
(1) sqlplus openlab/open123 @test.Sql运行一个脚本
(2) SQL> @test.sql //默认在当前路径
(3) spool:
spool test.sql 将缓冲区的内容写入到文件
select * from dual;
spool off关闭写入

NUMBER类型:
Oracle number datatype 语法:NUMBER[(precision [, scale])]
简称:precision --> p
scale --> s

NUMBER(p, s)
范围: 1 <= p <=38, -84 <= s <= 127
保存数据范围:-1.0e-130 <= number value < 1.0e+126
保存在机器内部的范围: 1 ~ 22 bytes

有效位:从左边第一个不为0的数算起的位数。
s的情况:
s > 0
精确到小数点右边s位,并四舍五入。然后检验有效位是否 <= p。
s < 0
精确到小数点左边s位,并四舍五入。然后检验有效位是否 <= p + |s|。
s = 0
此时NUMBER表示整数。
例如:
Actual Data Specified As Stored As
----------------------------------------
123.89 NUMBER 123.89
123.89 NUMBER(3) 124
123.89 NUMBER(6,2) 123.89
123.89 NUMBER(6,1) 123.9
123.89 NUMBER(4,2) exceeds precision (有效位为5, 5 > 4)
123.89 NUMBER(6,-2) 100
.01234 NUMBER(4,5) .01234 (有效位为4)
.00012 NUMBER(4,5) .00012
.000127 NUMBER(4,5) .00013
.0000012 NUMBER(2,7) .0000012
.00000123 NUMBER(2,7) .0000012
1.2e-4 NUMBER(2,5) 0.00012
1.2e-5 NUMBER(2,5) 0.00001
123.2564 NUMBER 123.2564
1234.9876 NUMBER(6,2) 1234.99
12345.12345 NUMBER(6,2) Error (有效位为5+2 > 6)
1234.9876 NUMBER(6) 1235 (s没有表示s=0)
12345.345 NUMBER(5,-2) 12300
1234567 NUMBER(5,-2) 1234600
12345678 NUMBER(5,-2) Error (有效位为8 > 7)
123456789 NUMBER(5,-4) 123460000
1234567890 NUMBER(5,-4) Error (有效位为10 > 9)
12345.58 NUMBER(*, 1) 12345.6
0.1 NUMBER(4,5) Error (0.10000, 有效位为5 > 4)
0.01234567 NUMBER(4,5) 0.01235
0.09999 NUMBER(4,5) 0.09999
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值