oracle语句大全

SQL语言有以下的主要特点:
SQL语言可以在Oracle数据库中创建、存储、更新、检索和维护数据,其中主要的功能是实现数据的查询和数据的插入、删除、修改等操作。
SQL语言在书写上类似于英文,简洁清晰,易于理解。它由关键字、表名、字段名,表达式等部分构成。
SQL语言属于非过程化的4GL(第四代语言)。
SQL语言按功能可分为DDL语言、DML语言、DCL语言和数据库事务处理语言四个类别。

Alter user scott account unlock;解锁
Group by 分组 having 放聚合函数后的条件。
数据库查询语言SQL:
SELECT 字段名列表 FROM 表名 WHERE 条件;
每个表都有一个虚列ROWNUM,它用来显示结果中记录的行号
SELECT rwnum, ename FROM emp;
为表的列起一个别名,它的好处是,可以改变表头的显示。
SELECT ename AS 名称, sal 工资 FROM emp;
连接运算符是双竖线“||”。
SELECT ename||job AS “雇员和职务表” FROM emp;
在查询中使用字符串常量。
SELECT ename||’ IS '||job AS “雇员和职务表” FROM emp;
6.使用DISTINCT消除重复行
SELECT DISTINCT job FROM emp;

如果要在查询的同时排序显示结果,可以使用如下的语句
SELECT 字段列表 FROM 表名 WHERE 条件
ORDER BY 字段名1 [ASC|DESC][,字段名2 [ASC|DESC]…]
排序有升序和降序之分,ASC表示升序排序,DESC表示降序排序。
查询雇员姓名和工资,并按工资从小到大排序
SELECT ename, sal FROM emp ORDER BY sal;

运算的优先顺序是NOT,AND,OR。如果要改变优先顺序,可以使用括号。

对于数值型或日期型数据,表示范围时可以用以下的特殊运算表示方法:
[NOT] BETWEEN… AND…
SELECT * FROM emp WHERE sal BETWEEN 1000 AND 2000;
使用以下运算形式,可以显示值满足特定集合的结果:
[NOT] IN (…)
SELECT * FROM emp WHERE job IN (‘SALESMAN’,‘CLERK’,‘MANAGER’);
使用LIKE操作符可完成按通配符查找字符串的查询操作,该操作符适合于对数据进行模糊查询。其语句法为:
[NOT] LIKE 匹配模式
匹配模式中除了可以包含固定的字符之外,还可以包含以下的通配符:
* %:代表0个或多个任意字符。
* _ :代表一个任意字符。
显示姓名以“S”开头的雇员信息。
SELECT empno, ename, job, mgr, hiredate, sal FROM emp WHERE ename LIKE ‘S%’;
SELECT abs(-5) FROM dual;

四舍五入函数 round
两个表的连接有四种连接方式:
* 相等连接。
* 不等连接。
* 外连接。
* 自连接。
1.相等连接
SELECT emp.ename, emp.deptno, dept.dname FROM emp, dept WHERE emp.deptno=dept.deptno;
2.外连接
SELECT ename,sal,dname FROM emp,dept WHERE emp.deptno(+)=dept.deptno;
3.不等连接
SELECT e.ename, e.sal, s.grade FROM emp e,salgrade s WHERE e.sal BETWEEN s.losal AND s.hisal;
4.自连接
SELECT worker.ename||’ 的经理是 '||manager.ename AS 雇员经理 FROM emp worker, emp manager WHERE worker.mgr = manager.empno;
未明确定义列 : 字段出现在多张表中
Salgrade 工资等级表
Grade losal hisal
格式: select 加字段 别名 from 表 where 条件 group by 字段having 聚合函数 order by desc ;

1.单行子查询
查询比SCOTT工资高的雇员名字和工资。
SELECT ename,sal FROM emp WHERE sal>(SELECT sal FROM emp WHERE empno=7788);
查询和SCOTT同一部门且比他工资低的雇员名字和工资。
SELECT ename,sal FROM emp WHERE sal<(SELECT sal FROM emp WHERE ename=‘SCOTT’) AND deptno=(SELECT deptno FROM emp WHERE ename=‘SCOTT’);
2.多行子查询
如果子查询返回多行的结果,则我们称它为多行子查询。多行子查询要使用不同的比较运算符号,它们是IN、ANY和ALL
查询工资低于任何一个“CLERK”的工资的雇员信息。
SELECT empno, ename, job,sal FROM emp WHERE sal < ANY (SELECT sal FROM emp WHERE job = ‘CLERK’) AND job <> ‘CLERK’;
3.多列子查询
SELECT empno, ename, sal FROM emp WHERE (job,deptno) = (SELECT job,deptno FROM emp WHERE empno=7788);
4.在FROM从句中使用子查询
查询雇员表中排在第6~9位置上的雇员
SELECT ename,sal FROM (SELECT rownum as num, ename,sal FROM emp WHERE rownum<=9 ) WHERE num >=6;

  语句                描述
 insert             插入新行
 update             修改(更新)已存在的行
 delete             删除表中已存在的行

1.insert into 表名 [(字段列表)] {values(表达式1,…)|query语句};
insert into emp(empno,ename,job,comm) values (1000, ‘小李’, 'CLERK‘,null);
2.复制数据
insert into 表名(字段列表) select(字段名1, 字段名2, …) from 另外的表名;
cerate table emp1 (empno number,ename varchar2, mgr number);
insert into emp1 () select (ename,empno,mgr) from emp;

3.使用序列 create sequence emp_seq increment by 1 start with 2000 maxvalue 3000 cycle nocache;
insert into manager values(emp_seq.nextval,‘小王’,2500);

4.修改数据
update 表名 set 字段名1=表达式1, 字段名2=表达式2, …
where 条件; update emp set sal=3000 where empno=1000;

(2) UPDATE语句的另外一种用法:
update 表名 set(字段名1, 字段名2, …)=select (字段名1, 字段名2, …)
from 另外的表名 where条件;

将manager表中编号为1000的记录的雇员名字和工资修改成为emp表的编号为7788的雇员的名字和工资。
update manager
set (ename, sal) =(select ename,sal from emp where empno = 7788) WHERE empno = 1000;

5.删除数据
delete from 表名 where 条件; 行删
truncate table 表名;

select sal from emp where deptno=10 and sal=(select sal from (select rownum,sal from (select sal from emp order by sal) where rownum=1));

delete from sc where sno in (select sno from sc group by sno having avg(score)<75);

索引的创建:
create index 索引名 on 表(字段);
create index wx on emp(ename);

查询中引用索引:

select ename,job,sal from emp where ename=‘SCOTT’;

删除索引:
drop index wx;

创建复合索引。
create index 索引名 on 表(字段1,字段2);
create index ww on emp(sal,job);

查看索引:
select * from user_indexes where table_name=‘表名’;
select index_name,index_type,uniqueness from user_indexes where table_name=‘EMP’;

显示索引的列。
select column_name from user_ind_columuns where index_name=‘EMP_JOBSAL’;

序列的创建:
create sequece ww increment by 1 start with 200 maxvalue 300 cycle
nocache;
CREATE SEQUENCE ABC INCREMENT BY 1 START WITH 10 MAXVALUE 9999999 NOCYCLE NOCACHE;

create sequence aaa increment by 1 start with 10 maxvalue 20 cycle
nocache;

以事务的方式对数据库进行访问,有如下的有点:
1,把逻辑相关的操作分成了一个组。
2.在数据永久改变前,可以预览数据变化。
3.能够保证数据的读一致性。

 set autocommit on;自动提交开启
 set autocommit  off ;自动提交关闭

commit 数据库事务提交,将变化写入数据库
rollback 数据库事务回退,撤销对数据的修改
savepoint 创建保存点,用于事务的阶段回退

select for update 锁定表行,防止其他会话对行的修改
lock table 锁定表,防止其他会话对表的修改

lock table 表名 in share mode; 共享锁
lock table 表名 in exclusive mode; 独占锁

使用COMMIT或ROLLBACK命令可以释放锁。

表和视图
表由记录(行row)和字段(列column)构成,是数据库中存储数据的结构。

1.创建表的语法:
值: number varchar2(长度) date
create table 表名 (列名 数据类型(宽度))[default 表达式][columu constraint],[table constraint][table_partiton_clause]);

default表达式:用来定义列的默认值。
columu constraint:用来定义列级的约束条件。
table constraint:用来定义表级的约束条件。
table_partition_clause:定义表的分区子句。

2.通过子查询创建表
create table 表名(列名…) as SQL查询语句;
create table 图书1 as select * from 图书;
create table 图书2(书名,单价) as select 图书名称,单价 from 图书;
create table 图书3(书名,单价) as select 图书名称,单价 from 图书 where 1=2; 只复制表结构,没有复制数据。

3.设置列的默认值 字段 varchar2(长度) default ‘未知’;
4.删除已创建的表
drop table 表名[cascade constraints];

表的操作
1.表的重命名
rename 旧表名 to 新表名;
2.清空表
truncate table 表名;
3.添加注释
(1) 为表添加注释的语法为:
comment on table 表名 is ‘…’;
(2) 为列添加注释的语法为:
comment on column 表名.列名 is ‘…’;
4.查看表
select object_name from user_objects where object_type=‘TABLE’;

数据完整性由主键(PRIMARY KEY)、非空(NOT NULL)、惟一(UNIQUE)和检查(CHECK)约束条件定义,参照完整性由外键(FOREIGN KEY)约束条件定义。
数据完整性由主键(primary key)、非空(not null)、惟一(unique)和检查(check)约束条件定义,参照完整性由外键(foreign key)约束条件定义。

表共有五种约束,它们是主键、非空、惟一、检查和外键。
1.主键(PRIMARY KEY)
[CONSTRANT 约束名] PRIMARY KEY --列级
[CONSTRANT 约束名] PRIMARY KEY(列名1,列名2,…)–表级
2.非空(NOT NULL)[CONSTRANT 约束名] NOT NULL --列级
3.惟一(UNIQUE)
[CONSTRANT 约束名] UNIQUE --列级
[CONSTRANT 约束名] UNIQUE(列名1,列名2,…) --表级
4.检查(CHECK)
[CONSTRANT 约束名] CHECK(约束条件) --列级,约束条件中只包含本列
[CONSTRANT 约束名] CHECK(约束条件) --表级,约束条件中包含多列 5.外键(FOREIGN KEY)

在表的创建语法中可以定义约束条件:

CREATE TABLE 表名(列名 数据类型[DEFAULT 表达式][COLUMN CONSTRAINT],…
[TABLE CONSTRAINT]
);

创建带有约束条件(包括外键)的图书表(如果已经存在,先删除):

CREATE TABLE 图书(图书编号 VARCHAR2(5) CONSTRAINT PK_2 PRIMARY KEY,
图书名称 VARCHAR2(30) NOT NULL,
出版社编号 VARCHAR2(2) CHECK(LENGTH(出版社 编号)=2) NOT NULL,
作者 VARCHAR2(10) DEFAULT ‘未知’,
出版日期 DATE DEFAULT ‘01-1月-1900’,
数量 NUMBER(3) DEFAULT 1 CHECK(数量>0),
单价 NUMBER(7,2),
CONSTRAINT YS_1 UNIQUE(图书名称,作者),
CONSTRAINT FK_1 FOREIGN KEY(出版社编号) REFERENCES 出版社(编号) ON DELETE CASCADE);

	C:CHECK约束。
	P:PRIMARY KEY约束。
	
	U:UNIQUE约束。
	R:FOREIGN KEY约束。

SELECT CONSTRAINT_NAME,CONSTRAINT_TYPE,SEARCH_CONDITION FROM USER_CONSTRAINTS WHERE TABLE_NAME=‘图书’;

select constraint_name,constraint_type,search_condition from user_constraints where table_name=‘图书5’;

使约束条件失效:
alter table 表名 disable constraint 约束名;
使约束条件生效:
alter table 表名 ensable constraint 约束名;

增加新列的语法如下:
alter table 表名 add 列名 类型 约束条件;
alter table 出版社
add 电子邮件 varchar2(30) primary key;
修改列的语法如下:
alter table 表名 modify 列名 类型;
alter table emp modify sno varchar2(40);
删除列的语法如下:
alter table 表名 drop column 列名;
alter table emp drop column sno;
删除标志成UNUSED的列:
alter table 表名 drop unused column;
alter table 图书 set unused column 出版日期;
删除UNUSED列:
alter table 图书 drop unused columns;

1.增加约束条件
alter table 表名 add 表级约束条件
alter table emp add constraint FK_3 foreign key(mgr) references
emp(empno);
删除约束条件的语法如下:
alter table 表名
drop primary_key | unique(列名)|constraint 约束名[cascade];
alter table emp drop constraint FK_3;

修改列名:
alter table 表名 rename column 旧列名 to 新列名;

check(条件)
create table 表名(字段 类型 constratint 对象名 约束条件)
constraint 名 foregin key 字段 references 表名 字段;
on delete cascade;

授权视图权限
conn system
grant create view to scott;

视图的创建
create view 视图名 as 子查询;
or replace 表示替代已经存在的视图。
force表示不管基表是否存在,创建视图。
noforce表示只有基表存在时,才创建视图,是默认值
with check option表示进行视图插入或修改时必须满足子查询的约束条件。后面的约束名是该约束条件的名字。
with read only 表示视图是只读的。

删除视图的语法如下:
drop view 视图名;

删除视图者需要是视图的建立者或者拥有drop any view权限。视图的删除不影响基表,不会丢失数据。
1.创建简单视图
create view 图书作者(书名,作者)
as select 图书名称,作者 from 图书;
2.创建复杂视图
create or replace view WX as select a.ename,b.ename from emp a ,emp b where a.empno=b.mgr;

3.创建只读视图
create or replace view WX as select * from emp where job=‘KING’ with read only;
4.创建基表不存在的视图
create force view 班干部 as select * from 班级 where 职务 is not null;
视图的查看
select text from user_views
where view_name=‘清华图书’;
查看用户拥有的视图:
select object_name from user_objects where object_type=‘VIEW’;

/*
多表查询:
内联接
等值联接
inner join
外连接
left outer join
right outer join
Oracle特有的写法(+)

子查询:

*/
–内联接的结果
select * from emp e1,emp t1 where e1.mgr = t1.empno;
–t1表里面的所有记录都会显示出来, 如果t1.empno 在e1.mgr中没有对应的记录,就加空值
select * from emp e1,emp t1 where e1.mgr(+) = t1.empno;
–查询不是领导的员工编号
select empno from emp where empno not in (select mgr from emp where mgr is not null);

–获取员工的名字和部门的名字
select e.ename,d.dname from emp e,dept d where e.deptno = d.deptno;
----使用子查询的方式来完成
select ename,deptno from emp;

select ename,deptno,deptno from emp;
–关联子查询, 子查询依赖外部查询的条件
select e.ename,e.deptno,(select d.dname from dept d where d.deptno = e.deptno ) aa from emp e;

–统计薪资大于薪资最高的员工所在部门的平均工资和薪资最低的员工所在部门的平均工资的平均工资的员工信息。

/*
Oracle体系结构:
数据库 —> 数据库实例ORCL —> 表空间 (用户里面的创建表) —> 数据文件
地球 —> 中国 —> 省份 (人民) —> 土地山川河流

 雄安新区 ---> 人(开发荒地,种地)

 创建表空间: 逻辑单位, 通常我们新建一个项目,就会去新建表空间,在表空间中创建用户来创建表
       语法:
           create tablespace 表空间的名称
           datafile '文件的路径(服务器上)'
           size 大小
           autoextend on  自动扩展
           next 每次扩展的大小

*/
–切换到system帐号下创建
–创建一个表空间 — 汉东
create tablespace handong datafile ‘c:\handong.dbf’ size 100m autoextend on next 10m;

–删除表空间
drop tablespace handong;

/*
创建用户
create user 用户名
identified by 密码
default tablespace 表空间的名称
*/
create user dakang
identified by dakang
default tablespace handong;

/*
授权 grant 角色 | 权限 to 用户
*/
grant connect to dakang;

–授予 dba的角色
grant dba to dakang;

select * from scott.emp;

/*
创建表:
create table 表名(
列名 列的类型 [列的约束],
列名 列的类型 [列的约束]
);
列的类型:
varchar ,在Oracle中,目前是支持的, 但是不保证以后还支持

     varchar2(长度) 可变字符长度    varchar2(10)  hello  占5个字符
     char(长度)   固定长度字符      char(10)      hello  占10个字符,用空格填充
     number(总长度,小数长度)     数字类型 --小数长度不能大于等于总长度
     
     date                   年月日时分秒 2017/4/13 9:43:49
     timestamp              时间戳, 比date类型更加精确 13-APR-17 09.44.08.272000 AM +08:00
     
     LONG/CLOB : 存放一本小说
     BLOB      : 存放电影  java 存进去,  再读取出来
 

使用子查询的方式创建表
     
     create table 表名 as 查询语句; 
     
       注意: 只会复制表结构和表中的数据,不会复制列的约束     
             如果查询语句有结果, 就是复制 表结构和数据
             如果查询语句没有结果, 就是复制 表结构   

*/
create table test1(
name1 varchar2(10),
name2 char(10),
age number(2,3)
);

insert into test1(name1,name2) values(‘hello’,‘hello’);

select * from test1 where name1 like ‘hello’; --可以查询数据
select * from test1 where name2 like ‘hello’; --查不出数据

insert into test1(age) values(2);

select current_date from dual;
select current_timestamp from dual;

select * from test1;

– create table 表名 as 查询语句; 复制表
select * from scott.emp;

create table emp as select * from scott.emp;

–如果查询语句是没有任何的结果的
select * from scott.emp where 1=2;
create table emp1 as select * from scott.emp where 1=2;

select * from emp1;

/*
修改表:
添加列
修改列 vharchar2(10)
删除列
修改列名

   重命名表   

SQL分类:
DDL : 数据定义语言, 修改的结构 alter create drop truncate
DML : 数据操纵语言 , 操作表中数据 insert update delete
DCL : 数据控制语言 , grant
DQL : select
*/
create table stu(stuid number, sname varchar(10) );

–添加一列
alter table stu add phone varchar2(11);

alter table stu add ( mobile varchar2(11), sex varchar2(2) );

–修改列的类型
alter table stu modify sex varchar2(4);

–修改列名 sex — gender
alter table stu rename column sex to gender;

–删除列
alter table stu drop column gender;

–修改表名
rename stu to student;

–删除表
drop table student;

/*
表的五大约束
列的约束: 约束主要是用来约束表中数据的规则
主键约束: primary key 不能为空, 必须唯一
非空约束
唯一约束
检查约束 check(条件) 在mysql中是可以写的,但是mysql直接忽略了检查约束

 外键约束:
      主要是用来约束从表A中的记录,必须是存在于主表B中

*/
–男,女,人妖
create table student(
stuid number primary key,
sname varchar2(10) unique,
age varchar2(10) not null,
gender varchar2(4) check( gender in (‘男’,‘女’,‘人妖’))
);
–主键约束违反
insert into student values(1,‘张三’,‘31’,‘男’);
insert into student values(1,‘李四’,‘31’,‘男’);
–唯一约束违反
insert into student values(1,‘徐立’,‘31’,‘男’);
insert into student values(2,‘徐立’,‘31’,‘男’);
–非空约束
insert into student values(1,‘徐立’,null,‘男’);
–检查约束
insert into student values(1,‘徐立’,‘31’,‘男’);

insert into student values(1,‘徐立’,‘31’,‘妖’);

select * from student;

/*
商品分类,商品表

*/
–商品分类表
create table category(
cid number primary key,
cname varchar2(20)
);

–创建一个商品表
create table product(
pid number primary key,
pname varchar2(20),
cno number
);

insert into category values(1,‘手机数码’);

insert into product values(10,‘锤子’,11);

–添加外键约束
alter table product add foreign key(cno) references category(cid);
insert into product values(10,‘锤子’,11);–插入失败

–1.首先主表中必须存在11号, 先往主表中插入数据,再往从表中插入数据
insert into category values(2,‘电脑办公’);
insert into product values(11,‘外星人’,2);

–删除Category
drop table category; --表中记录被外键关联无法删除

–强制删除表(不建议使用) : 先删除外键关联表的外键约束,然后再删除自己, 先删除product的外键约束,再删除category
drop table category cascade constraint;

–级联删除
----添加外键约束,使用级联约束 ,在删除的时候,使用级联删除
alter table product add foreign key(cno) references category(cid) on delete cascade;

insert into category values(2,‘电脑办公’);
insert into product values(11,‘外星人’,2);

–级联删除 : 首先去从表中找有没有 关联数据, 如果在从表中找到关联数据,先删除从表中关联数据,然后再删除表中的数据
delete from category where cid = 2;

select * from category;
select * from product;

drop table product;
truncate table product;
truncate table category;

/*
插入数据:
insert into 表名 values(所有列的值都要对应写上)
insert into 表名(列1,列2) values(值1,值2);

 使用子查询插入数据
     insert into 表名 查询语句

*/
select * from emp1;

select * from emp;
–将emp中10号部门的员工信息,插入到emp1中
insert into emp1 select * from emp where deptno = 10;

/*
更新数据
update 表名 set 列名 = 列的值 [where 条件]
*/
update emp1 set ename=‘HUAAN’ where ename = ‘KING’;
select * from emp1;

/*
删除数据:
delete from 表名 [where 条件]

   delete和truncate 区别
    
   delete:                 truncate:
    DML                    DDL
    逐条删除               先删除表再创建表
    支持事务操作           不支持事务操作,
                           执行效率要高  

*/
delete from emp1 where empno=7839;

/*
事务: 就是一系列的操作,要么都成功,要么都失败
四大特性: 原子性,隔离性,持久性,一致性

   如果不考虑隔离级别: 脏读,虚读,不可重复读
        MYSQL隔离级别: READ UNCOMMITTED , READ COMMITTED, REPEATABLE READ, SERIALIAZABLE
        ORACLE隔离级别: READ COMMITTED SERIALIZABLE READ ONLY 
                    默认隔离级别: READ COMMITTED
                    
  提交 : commit
  事务的保存点/回滚点: savepoint 保存点的名称
  回滚: rollback

*/
create table louti(
lou number primary key
);

insert into louti values(1);
insert into louti values(2);
insert into louti values(3);
insert into louti values(4);
insert into louti values(5);
savepoint dangban;
insert into louti values(5); --主键约束会发生异常
insert into louti values(6);
rollback to dangban
commit;

declare

begin
insert into louti values(1);
insert into louti values(2);
insert into louti values(3);
insert into louti values(4);
insert into louti values(5);
savepoint dangban;
insert into louti values(5); --这行代码会发生异常
insert into louti values(6);
commit;
exception --捕获异常
when others then
rollback to dangban;
commit;
end;

select * from louti;

/*
视图: 是对查询结果的一个封装
视图里面所有的数据,都是来自于它查询的那张表,视图本身不存储任何数据
1.能够封装复杂的查询结果
2.屏蔽表中的细节
语法:
create [or replace] view 视图的名称 as 查询语句 [ with read only]

   注意: 通常不要通过视图去修改,视图创建的时候,通常要加上with read only

*/
select * from emp;

–创建一个视图
create or replace view view_test1 as select ename,job,mgr from emp;

–通过视图修改数据
update view_test1 set ename=‘SMITH2’ where ename = ‘SMITH’;

–创建一个只读视图
create or replace view view_test2 as select ename,job,mgr from emp with read only;

update view_test2 set ename=‘SMITH3’ where ename = ‘SMITH2’;

–视图封装复杂的查询语句
create view view_test3 as select
sum(cc) “TOTAL”,
sum(case yy when ‘1980’ then cc end) “1980”,
sum(case yy when ‘1981’ then cc end) “1981”,
sum(case yy when ‘1982’ then cc end) “1982”,
sum(case yy when ‘1987’ then cc end) “1987”
from
(select to_char(hiredate,‘yyyy’) yy,count(1) cc from emp group by to_char(hiredate,‘yyyy’)) tt;

–同义词的概念
create synonym dept for view_test3;

create synonym yuangong for view_test2;

select * from yuangong;

select * from dept;

select * from view_test3;

select * from view_test2;

/*
序列: 生成类似于 auto_increment 这种ID自动增长 1,2,3,4,5…
auto_increment 这个是mysql

   语法:
       create sequence 序列的名称
       start with 从几开始
       increment by 每次增长多少
       maxvalue 最大值 | nomaxvalue
       minvalue 最小值 | nominvalue
       cycle | nocycle  是否循环    1,2,3,1,2,3
       cache 缓存的数量3 | nocache  1,2,3,4,5,6 
       
  如何从序列获取值
      currval : 当前值
      nextval : 下一个值
      
           注意: currval 需要在调用nextval之后才能使用      
           
           永不回头,往下取数据, 无论发生异常, 回滚   

*/
–创建一个 1,3,5,7,9…30
create sequence seq_test1
start with 1
increment by 2
maxvalue 30
cycle
cache 10;

select seq_test1.nextval from dual;
select seq_test1.currval from dual;

–序列用的最多的一种写法
create sequence seq_test2;
select seq_test2.nextval from dual;

create sequence seq_test3
start with 1
increment by 2
maxvalue 30
minvalue 0
cycle
cache 10;

select seq_test3.nextval from dual;

/*
索引:相当于是一本书的目录,能够提高我们的查询效率
如果某一列,你经常用来作为查询条件,那么就有必要创建索引,数据量比较的情况

   语法: 
         create index 索引的名称 on 表名(列)   
    
   注意:主键约束自带主键索引, 唯一约束自带唯一索引
   
   索引原理: btree   balance Tree 平衡二叉树
   
         如果某列作为查询条件的时候,可以提高查询效率,但是修改的时候,会变慢
         
         索引创建好之后,过了一段,DBA都会去做重构索引
         
   SQL调优:
         1.查看执行计划F5
         2. 分析里面的cost 和 影响行数, 想办法降低            

*/
–五百万数据测试
create table wubaiwan(
name varchar2(30),
address varchar2(20)
);

insert into wubaiwan values(’’)

–插入500000万条数据
declare

begin
for i in 1…5000000 loop
insert into wubaiwan values(‘姓名’||i,‘地址’||i);
end loop;
commit;
end;

–在没有添加索引的情况下,去查询 name=‘姓名3000000’ --2.985
select * from wubaiwan where name=‘姓名3000000’;

–创建索引 name 再去查询 name=‘姓名3000000’
create index ind_wubaiwan on wubaiwan(name);
select * from wubaiwan where name=‘姓名3000000’; --0.016

–在没有添加复合索引的情况下,再去查询 name=‘姓名3000000’ and ‘地址3000000’
select * from wubaiwan where name=‘姓名3000000’ and address=‘地址3000000’; --0.032

–创建复合索引的情况下, 再去查询
create index ind_wubaiwan2 on wubaiwan(name,address);
select * from wubaiwan where name=‘姓名3000000’ and address=‘地址3000000’; --0.015

/*
DDL表空间操作
创建表空间
创建用户
授权

     创建表
          子查询创建表
     修改表 : 添加列,删除列,修改列,修改列名, 修改表名
     
     约束:
         主键约束,唯一约束,非空约束,检查约束,外键约束
         
         外键约束:
           强制删除
           级联删除
         
 DML表中数据:
     插入数据
         子查询插入数据
     更新数据
     删除数据: delete 和 truncate
     
     事务操作:
           savepoint 保存点
           rollback to 保存点
      ORACLE事务隔离级别  : READ COMMITTED 
      
 视图: 就像窗户一样, 封装查询结果 , 通常视图创建只读视图
 序列: 主要是用来实现ID自增长 
 索引: 相当于是书的目录,能够提高查询效率, 原理 平衡二叉树, 每隔一段时间DBA都需要去重建索引
 同义词: create synonym 名称 for 对象的名称          

/
/

PLSQL编程 : procedure Language 过程语言 Oracle对SQL的一个扩展
让我们能够像在java中一样写 if else else if 条件, 还可以编写循环逻辑 for while

         declare
            --声明变量
            变量名 变量类型;
            变量名 变量类型 := 初始值;
              vsal emp.sal%type;  --引用型的变量  
              vrow emp%rowtype;   --声明记录型变量          
         begin
            --业务逻辑
         end;
         
         dbms_output.put_line()相当于java中 syso 

*/
declare
i varchar2(10) := ‘张三’;
begin
dbms_output.put_line(i);
end;

–查询7369的工资,并且打印出来
declare
vsal emp.sal%type;
begin
–将查询出的结果赋值给vsal
select sal into vsal from emp where empno = 7369;

dbms_output.put_line(vsal);
end;

–查询7369的员工信息,并且打印出来
select * from emp where empno = 7369;

declare
vrow emp%rowtype;
begin
select * into vrow from emp where empno = 7369;

dbms_output.put_line(‘姓名:’||vrow.ename || ‘工资’|| vrow.sal);
end;

/*
PL条件判断

 if then
 
 elsif then
   
 else 
 
 end if;

*/
–根据不同年纪,输出相关内容
declare
age number := &aaa;
begin
if age < 18 then
dbms_output.put_line(‘小屁孩’);
elsif age>=18 and age <=24 then
dbms_output.put_line(‘年轻人’);
elsif age>24 and age < 40 then
dbms_output.put_line(‘老司机’);
else
dbms_output.put_line(‘老年人’);
end if;
end;

/*
循环操作
while 循环
while 条件 loop

  end loop;

for循环
for 变量 in [reverse] 起始值…结束值 loop

  end loop;

loop循环
loop
exit when 条件
end loop;

*/
–输出1~10
declare
i number :=1;
begin
while i<=10 loop
dbms_output.put_line(i);
i := i+1;
end loop;
end;

–输出1~10
declare

begin
for i in reverse 1…10 loop
dbms_output.put_line(i);
end loop;
end;

–输出1~10
declare
i number :=1;
begin
loop
exit when i>10;
dbms_output.put_line(i);
i := i+1;
end loop;
end;

/*




输出 m
x : [-m,m]
y : [-m,m]

输出所有满足条件的 : abs(y)+abs(x) <=m

m取值
/
–使用PLSQL输出菱形
declare
m number := 10;
begin
for x in -m…m loop
for y in -m…m loop
if abs(y) + abs(x) <= m then
dbms_output.put(’
’);
else
dbms_output.put(’ ');
end if;
end loop;
dbms_output.new_line();
end loop;
end;

–使用PLSQL输出三角形,只要是三个角
declare
m number := 10;
begin
for x in reverse -m…m loop
for y in -m…m loop
if abs(y) + abs(x) <= m and x>=0 then
dbms_output.put(’*’);
else
dbms_output.put(’ ');
end if;
end loop;
dbms_output.new_line();
end loop;
end;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hello.鑫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值