oracle

在oracle中,如果遇到空格,使用" "


=========================================================================ORACLE入门========================================================================
--创建用户

create user king
identified by 123456
default tablespace users
quota 30m on users;

--授权
grant create session to king,solomon; 
grant connect to king,solomon;
grant resource to king,solomon;
grant create sequence to king,solomon;
grant select,update,insert,delete on xxx to king,solomon;

revoke select,update,insert,delete on xxx from king,solomon;

--修改密码
alter user king identified by password;

--删除用户
drop user king cascade;

======================================================================SQL查询和SQL函数=====================================================================

--创建表
create table test
as
select * from scott.emp
where 1=2;

alter table test modify job varchar2(15);
alter table test add description varchar2(200);
alter table test drop column description;

--truncate table命令
 如果存储在表的数据不再有用,可以只删除表中的记录而不删除表结构.使用trancate table命令将删除表中的所有行,并释放此表使用的存储空间.
 trancate 与 delete 命令的区别在于,前者快速删除记录并释放空间,不使用事务处理,因此无法回滚,而delete命令可在执行删除之后,通过rollback撤销删除.如果确定表中的数据不再有用,使用trancate命令效率更高.
truncate table test

--删除表
drop table test;

--select
select (distinct)empno,ename,job,sal from test where sal > 1500 group by empno,ename,job,sal having ename <> 'ALLEN' order by empno desc

--事务控制语言
-commit: commit work/commit;
-savepoint: savepoint savepoint_id;
-rollback: rollback work/rollback/rollback to savepoint savepoint_id;


--SQL 操作符
1.算术操作符: +,-,*,/
2.比较操作符: =,!=,<,>,<=,>=,<>,(not)between...and,(not)in,(not)like,is(not)null
3.逻辑操作符: and,or,not
4.集合操作符: union(联合):返回两个查询选定的所有不重复的行
    union all(联合所有):返回两个查询选定的所有行,包括重复的行
    intersect(交集):只返回两个查询都有的行
    minus(减集):在第一个查询结果中排除第二个查询结果中出现的行
    
    使用集合操作符连接起来的select语句中的列遵循以下规则:
    1).通过集合操作联接的各个查询具有相同的列数,而且对应列的数据类型必须相同.
    2).这种查询不应含有LONG类型的列.
    3).列标题来自第一个select语句.
5.连接操作符: ||

--操作符优先级(从高到低)
算术操作符 -->  连接操作符 -->  比较操作符 -->  NOT逻辑操作符 -->  AND逻辑操作符 -->  OR逻辑操作符


--SQL 函数
(一)单行函数(也称标量函数),对于从表中查询的每一行,都返回一个值,可出现在select,where 子名句中,包括:

日期函数:
add_months(d,n)    d是日期,n是月数,返回指定日期加上指定月数后的日期值
months_between(d1,d2)  d1,d2都是日期,输出结果为一个数值.如果d1晚于d2,则结果为正数,反之为负.如果d1,d2为某月中的同一天或月份的最后一天,则结果始终为整数       ;否则oracle将根据一个月31天来计算结果的小数部分,并考虑d1,d2时间部分的差
lsat_day(d)     返回指定日期当月的最后一天的日期值
round(d,[fmt])    d是日期,fmt是格式模型,日期默认舍入为最靠近的那一天.如果格式为"YEAR",则舍入到年的开始,即1月1日;如果为"MONTH",则舍入到月的第一日       ;如果为"DAY",则舍入到最靠近的星期几.
next_day(d,day)    d是日期,day是周内的任何一天(如'星期三',也可用4表示),返回指定下一个星期几(三)的日期
trunc(d,[fmt])    d是日期,将指定日期截断为由格式模型指定的单位的日期,与round函数不同的是它只舍不入,如果不指定fmt,日期则被截断为天.
extract(fmt from d)   d是日期时间表达式,fmt是要提取的部分格式:(YEAR,MONTH,DAY,HOUR,MINUTE,SECOND不要用单引号)

字符函数:
INITCAP(char):首字母大写
LOWER(char):转换为小写
UPPER(char):转换为大写
LTRIM(char,set):左剪裁
RTRIM(char,set):右剪裁
TRANSLATE(char,from,to):按字符翻译
REPLACE(char,search_str,replace_str):字符串替换
INSTR(char,substr[,pos]):查找字符串位置
SUBSTR(char,pos,len):取子字符串
CONCAT(char1,char2):连接字符串
CHR(num):根据ASCII码返回对应的字符串
LPAD/RPAD(char1,num,char2):对字符串进行左/右填充num个char2
TRIM([LEADING/TRAILING]char):从字符串的开头或结尾剪裁特定的字符,默认剪裁空格(此函数组合了LTRIM RTRIM 的功能)
LENGTH(char):返回字符串的长度
DECODE(expr,search1,result1,search2,result2):如果遇到search1,将其替换为result1....

数字函数
ABS(n):取绝对值
CELL(n):向上取整
SIN(n):正弦
COS(n):余弦
SIGN(n):取符号
FLOOR(n):向下取整
POWER(m,n):m的n次幂
MOD(m,n):取余数
ROUND(m,n):四舍五入
TRUNC(m,n):截断
SQRT(n):平方根

转换函数
TO_CHAR(d|n[,fmt]):d是日期,n是数字,fmt是指定日期或数字的格式
TO_DATE(char[,fmt])

其他函数
NVL(expression1,expression2):如果expression1为NULL,返回expression2,反之返回expression1
NVL2(expression1,expression2,expression3):如果expression1为NULL返回expression2反之返回expression3
NULLIF(expr1,expr2):如果两个表达式相等,返回空值,否则返回expr1 = CASE WHEN expr1 = expr2 THEN NULL ELSE expr1 END

(二)分组函数
AVG,MIN,MAX,SUM,COUNT,COUNT(*),COUNT(DISTINCT col_name),GROUP BY,HAVING

(三)分析函数(只能出现在select列表或order by子句中)
ROW_NUMBER:为有序组中的每一行(划分部分的行或查询返回的行)返回一个唯一的排序值,序号由order by 子句指定,从1开始
 ROW_NUMBER() OVER ([PARTITION BY column] order by column (desc/asc))
 select ename,job,deptno,sal,ROW_NUMBER() OVER (ORDER BY sal DESC) AS sal_rank from scott.emp;
 select ename,job,deptno,sal,ROW_NUMBER() OVER (PARTITION BY deptno ORDER BY sal DESC) AS sal_rank from scott.emp;
 
RANK:计算一个值在一组值中的排位,是1开头的连续整数.具有相等值的行排位相同,序数随后跳跃相应的数值,即如果两行的序数为1,则没有序数2,下一行的序数为3
 RANK() OVER ([PARTITION BY column] order by column)
 select ename,sal,comm,deptno,RANK() OVER (PARTITION BY deptno ORDER BY sal DESC,comm) RANK FROM scott.emp;
 
DENSE_RANK:计算一个行在一组有序行中的排位,排位是以1开头的连续整数.具有相等值的行排位相同,并且排位是连续的
 DENSE_RANK () OVER ([PARTITION BY column] order by column)
 select d.dname,e.ename,e.sal,DENSE_RANK () OVER (PARTITION BY e.deptno ORDER BY e.sal DESC) DENSERANK FROM emp e,dept d where e.deptno = d.deptno;


==============================================================锁和表分区===================================================================================
锁的优点:(一致性,完整性,并发性)

行级锁
 select ... for update [of column] wait n |nowait;

表级锁
 LOCK TABLE table_name IN row share|row exclusive|share|share row exclusive|exclusive MODE [nowait]

--范围分区(range)

1.新建分区表student

create table student
(
studentid integer not null,
studentname varchar2(20),
score integer
)
partition by range(score)
(
partition p1 values less than(60),
partition p2 values less than(75),
partition p3 values less than(85),
partition p4 values less than(maxvalue)
);

2.插入数据
scott>desc student;
 名称                                      是否为空? 类型
 ----------------------------------------- -------- -------------------

 STUDENTID                                 NOT NULL NUMBER(38)
 STUDENTNAME                                        VARCHAR2(20)
 SCORE                                              NUMBER(38)

scott>insert into student values (&stun, '&name', &score);
输入 stun 的值:  10
输入 name 的值:  user1
输入 score 的值:  52
原值    1: insert into student values (&stun, '&name', &score)
新值    1: insert into student values (10, 'user1', 52)

已创建 1 行。

scott>/
输入 stun 的值:  11
输入 name 的值:  sz
输入 score 的值:  85
原值    1: insert into student values (&stun, '&name', &score)
新值    1: insert into student values (11, 'sz', 85)

已创建 1 行。


--散列分区(hash)
create table sodi
(
deptno int,
deptname varchar2(14)
)
partition by hash (deptno)
(partition p1,
partition p2
)


--复合分区(range hash)
create table branchdetails1
(
branch_id varchar2(5) not null,
branch_name varchar2(10) not null,
address varchar2(10)
)
partition by range (branch_id)
subpartition by hash (branch_name)
subpartitions 6
(
partition s1 values less than ('b005'),
partition s2 values less than ('b010'),
partition s3 values less than ('b015'),
partition s4 values less than ('b020')
);

--列表分区(list)
CREATE TABLE Employee
(
    Emp_ID number (4),
    Emp_Name varchar2 (14),
    Emp_Address varchar2 (15)
)
PARTITION BY LIST (Emp_Address)
(
    Partition north values ('芝加哥'),
    Partition west values ('旧金山', '洛杉矶'),
    Partition south values ('亚特兰大', '达拉斯', '休斯顿'),
    Partition east values ('纽约', '波斯顿')
);


insert into employee values (110, 'july', '芝加哥');
insert into employee values (111, 'claduo', '旧金山');
insert into employee values (112, 'apple', '洛杉矶');
insert into employee values (113, 'wind', '亚特兰大');
insert into employee values (114, 'snow', '达拉斯');
insert into employee values (115, 'buick', '休斯顿');
insert into employee values (116, 'toyoto', '纽约');
insert into employee values (117, 'bush', '波斯顿');
insert into employee values (119, 'casy', '芝加哥');
insert into employee values (120, 'cool', '纽约');

 

--分区维护操作
1.添加分区(范围)
 ALTER TABLE table_name ADD PARTITION XX VALUES LESS THAN (XXX);
2.删除分区
 ALTER TABLE table_name DROP PARTITION XX;
3.截断分区
 ALTER TABLE table_name TRUNCATE PARTITION XX;
4.合并分区
 ALTER TABLE talbe_name MERGE PARTITIONS partitions_name,partitions_name INTO PARTITION partition_name;
5.拆分分区
 ALTER TABLE table_name SPLIT PARTITION partitioni_name AT (value) INTO (PARTITION partition1, PARTITION partition2);
 
重命名分区
 ALTER TABLE table_name RENAME PARTITION partition1 TO partition2;


=============================================================数据库对象===================================================================================

--同义词
创建私有同义词:CREATE [OR REPLACE] SYNONYM [schema.]synonym_name FOR [sechma.]object_name;
创建共有同义词:CREATE [OR REPLACE] PUBLIC SYNONYM synonym_name FOR [sechma].object_name;
删除同义词:DROP [PUBLIC] SYNONYM [sechma.]synonym_name;

--序列
创建序列:
CREATE SEQUENCE sequencn_name
[START WITH integer]
[INCREMENT BY integer]
[MAXVALUE integer|NOMAXVALUE]
[MINVALUE integer|NOMINVALUE]
[CYCLE|NOCYCLE]
[CACHE integer|NOCACHE];

访问序列:NEXTVAL,CURRVAL

更改序列:
ALTER SEQUENCE [schema.]sequence_name
[INCREMENT BY integer]
[MAXVALUE integer|NOMAXVALUE]
[MINVALUE integer|NOMINVALUE]
[CYCLE|NOCYCLE]
[CACHE integer|NOCACHE];

删除序列:
DROP SEQUENCE [schema.]sequence_name;

--视图
创建视图:
CREATE [OR REPLACE] [FORCE|NOFORCE] VIEW view_name [(alias[,alias....不需要引号])]
AS SELECT ....
[WITH  CHECK OPTION [CONSTRAINT constraint]]
[WITH READ ONLY];

删除视图:
DROP VIEW view_name;

--索引
创建索引:
CREATE INDEX index_name ON TABLE (column_list) [TABLESPACE tablespace_name];
重建索引:
ALTER INDEX index_name REBUILD;
删除索引:
DROP INDEX index_name;

唯一索引:
CREATE UNIQUE INDEX index_name ON table_name (column);
组合索引:
CREATE INDEX index_name ON talbe_name (column1,column2);
反向键索引:(不准将标准索引重建为反向键索引)
CREATE INDEX rev_index_name ON table_name (column) REVERSE;
 将反向键索引重建为标准索引:ALTER INDEX rev_index_name REBUILD NOREVERSE;
位图索引:
CREATE BITMAP INDEX bit_index_name ON table_name (column);
索引组织表:
CREATE TABLE table_name
(
 column1 type PRIMARY KEY,
 column2 type
)ORGANIZATION INDEX;

索引中的分区:
 (1):局部分区索引
 1.先创建分区表:
 create table student
 (
 studentid integer not null,
 studentname varchar2(20),
 score integer
 )
 partition by range(score)
 (
 partition p1 values less than(60),
 partition p2 values less than(75),
 partition p3 values less than(85),
 partition p4 values less than(maxvalue)
 );
 2.创建局部索引:
 CREATE INDEX index_name ON student (score) LOCAL;
 
 (2):全局分区索引(不能在散列分区或子分区建立全局索引)
 CREATE INDEX glb_index_name ON table_name (column) GLOBAL
 PARTITION BY RANGE (column)
 (
 PARTITION P01 VALUES LESS THAN (XXX),
 PARTITION P02 VALUES LESS THAN (MAXVALUE)
 );
 (3):全局非分区索引,是在分区表上创建的全局索引,类似于非分区表上的索引,索引的结构不会被分割.

获得索引的信息:
USER_INDEXES:获取有关用户已创建的索引的详细信息;
USER_IND_PARTITIONS:获取有关用户已创建的分区索引的详细信息;
USER_IND_COLUMNS:获取有关列(用户的索引是基于这些列创建的)的详细信息.


=======================================================================使用PL/SQL==========================================================================
PL/SQL块共分为3个部分:1.声明部分(declarations);2.可执行部分(executable statements);3.异常处理块部分(exception handlers).

复合符号的含义:
:= 赋值操作符
|| 连接操作符
-- 单行注释
/*,*/ 多行注释
<<,>> 标签分隔符
.. 范围操作符
** 求幂操作符

声明变量:(一条语句只能声明一个变量,反之是非法的:如 I,J NUMBER(4),这样是不行的!!!)
 variable_name date_type[(size)] [:=init_value];
 declare
 vcode varchar2(5);
 vname varchar2(25) := 'jack';
 begin
 ...
 end;
给变量赋值:
 variable_naem := expression;
声明常量:
 variable_name CONSTANT data_type := value;
 
属性类型:(%TYPE,%ROWTYPE),用于引用变量或数据库列的数据类型来声明变量.


--控制结构
1.条件控制:
 a).IF-THEN语句
 IF condition THEN
  sequence_of_statements;
 END IF;
 b).IF-THEN-ELSE语句
 IF condition THEN
  sequence_of_statements1;
 ELSE
  sequence_of_statements2;
 END IF;
 c).IF-THEN-ELSIF语句
 IF condition1 THEN
  sequence_of_statements1;
 ELSIF condition2 THEN
  sequence_of_statements2;
 ELSE
  sequence_of_statements3;
 END IF;
 d).CASE语句
 CASE selector
  WHEN expression1 THEN sequence_of_statements1;
  WHEN expression2 THEN sequence_of_statements2;
  ...
  WHEN expressionN THEN sequence_of_statementsN;
  [ELSE sequence_of-statementsN+1;]
 END CASE;
2.循环控制:
 a).LOOP循环
 LOOP
  sequence_of_statements;
  (这里必须要有EXIT或EXIT WHEN 语句,否则出现无限循环!!!)
 END LOOP;
 
 BEGIN
  LOOP
   IF &marks > 60 THEN
   DBMS_OUTPUT.PUT_LINE('XXXX');
   EXIT;
   END IF;
  END LOOP;
 END;
 
 b).WHILE循环
 WHILE condition LOOP
  sequence_of_statements;
 END LOOP;
 
 C).FOR循环
 FOR counter IN [REVERSE] value1..value2
 LOOP
  sequence_of_statements;
 END LOOP;

--错误处理
预定义异常:(P131)
BEGIN
 sequence_of_statements;
EXCEPTION
 WHEN <NO_DATA_FOUND|TOO_MANY_ROWS|...> THEN
  sequence_of_statements;
 WHEN OTHERS THEN
  sequence_of_statements;
END;

用户自定义异常:
DECLARE my_exception EXCEPTION;
引发异常:
RAISE my_exception;

DECLARE
my_exception EXCEPTION;
name varchar2(20);
BEGIN
name := '&name';
IF name NOT IN ('jack','king','alice') THEN
RAISE my_exception;
ELSE
dbms_output.put_line('你输入的姓名是'||name);
END IF;
EXCEPTION
WHEN my_exception THEN
dbms_output.put_line('无法识别这个姓名!');
//RAISE_APPLICATION_ERROR(-20001,'未指定姓名!'); (这个编号必须介于-20000 ~ -20999 之间)
END;


=======================================================================游标管理============================================================================
静态游标
 隐式游标:%FOUND(true/false),%NOTFOUND(true/false),%ROWCOUNT(0 ~ ),%ISOPEN(false)
 
 显示游标(CURSOR):
  使用显示游标的4个步骤:
  1.声明游标;
  2.打开游标;
  3.从游标中获取记录;
  4.关闭游标.
 
 声明游标: CURSOR cursor_name [(parameter [,parameter]...)] [RETURN return_type] IS select_statement;
 OPEN:  OPEN cursor_name [(parameters)];
 FETCH:  FETCH cursor_name INTO variables;
 CLOSE:  CLOSE cursor_name;
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值