您的位置:首页 > 数据库 > Oracle

Oracle入门---简单命令

2017-02-25 20:29 337 查看
--查询当前时间

select sysdate from dual;

---第一章 入门

select sysdate from dual;

---新建表空间

create tablespace myspace

datafile 'c:\myspace.dbf' size 10M

Autoextend on;

---新建第二个表空间 一个表空间--可对应多个数据库

---修改-alter

alter tablespace myspace

add datafile 'c:\myspace_2.dbf' size 10M;

---修改表空间大小

alter database

datafile 'c:\myspace_2.dbf'resize 3M;

datafile 'c:\myspace_2.dbf' resize 12M;

---新建用户,选择默认表空间

create user dream

identified by dream1234

default tablespace USERS

temporary tablespace temp;

---授权

--1.connect 角色允许连接到数据库

grant connect to dream;

--2.授权建表

grant create table to dream;

--3.授予用户表空间权限

alter user dream quota unlimited on USERS;

---4.授予最高的权限

grant dba to dream;

--5.收回权限

revoke dba from dream;

---创建表1-学生信息表

create table students

(

studentid number primary key,

sname char(10) not null,

saddress varchar(50),

sgrade float,

semail varchar(50),

ssex int

)

----创建表2 课程表

create table course

(

courseid int primary key,

coursename varchar(50)

)

---创建表3 分数表

create table score

(

scoreid number primary key,

studentid number not null,

courseid number,

score number

)

--考试成绩表学好的外键

alter table score

add constraint fk_studentid_id

foreign key(studentid)

references students;

--考试成绩表科目编号的外键

alter table score

add constraint fk_courseid_id

foreign key(courseid)

references course;

-----------------------------------------------------

--删除表

drop table score;

---插入数据 表1

insert into dream.students

values (1,'张三','湖南长沙',1,'zs@dream.com',1);

insert into dream.students

values (2,'李四','北京',2,'ls@dream.com',0);

insert into dream.students

values (3,'王五','上海',3,'ww@dream.com',1);

insert into dream.students

values (4,'赵六','深圳',4,'zl@dream.com',1);

insert into dream.students

values (5,'田七','非洲',5,'tq@dream.com',0);

---插入数据 表2

insert into dream.course values(1,'语文');

insert into dream.course values(2,'数学');

insert into dream.course values(3,'英语');

insert into dream.course values(4,'物理');

insert into dream.course values(5,'政治');

insert into dream.course values(6,'历史');

---插入数据 表3

--第一门科目 --存在不及格

insert into dream.score values(1,1,1,90);

insert into dream.score values(2,2,1,80);

insert into dream.score values(3,3,1,54);

insert into dream.score values(4,4,1,32);

insert into dream.score values(5,5,1,78);

---第二门科目 --存在缺考

insert into dream.score values(6,1,2,98);

insert into dream.score values(7,2,2,75);

insert into dream.score values(8,3,2,60);

--第三门科目 --存在补考

insert into dream.score values(9,3,1,80);

insert into dream.score values(10,3,1,90);

insert into dream.score values(11,5,1,90);

----第二章

----一、数据类型

---二、伪列

---rowid 存放的物理地址

---rownum 行的编号

select * from dream.students;

----将students表命名为a表,查询a表中的所有列还有存放的物理地址和行的编号

select a.*,rowid,rownum from dream.students a;

---返回表中前三笔数据

select * from score where rownum <=3;

----怎么样返回排名在前3的数据

--把A表的数据导入B表,B表不存在

create table score2

as

select * from dream.score order by score desc;

select * from score2 where rownum <=3;

---只复制表结构,不复制数据

create table score3

as

select * from dream.score where 1=2;

select * from score3;

select * from score where courseid=1;

----去重

select distinct studentid from dream.score where courseid=1;

---别名

select studentid as 学号,courseid as 科目ID,score as 分数 from dream.score;

select studentid as "学号",courseid as "科目ID",score as "分数" from dream.score;

select studentid "学号",courseid "科目ID",score "分数" from dream.score;

----------------------------------------

--常量列 列的运算

select studentid 学号,courseid 科目ID,

score+10 分数,'测试培训' 学校名称

from dream.score;

---------在学生信息表加生日-------

alter table dream.students add birthday date;

---输入默认值

insert into students

values(8,'老八','长沙',1,'lb@dream.com',1,'30-3月-93');

----TO_DATE

insert into dream.students

values(9,'老九','长沙',1,'laojiu@dream.com',0,to_date('1999-3-31','YYYY-MM-DD'));

insert into students values(8,'老八','长沙',1,'lb@dream.com',0,'30-3月-93');

insert into students values(9,'老九','长沙',1,'lj@dream.com',1,'30-3月-93');

--------更新数据

update dream.students set birthday='30-3月-93';

-----------------------------------------------------------

--插入来自其他表的记录 A表的记录导入带B表,B表存在

----事务控制

savepoint point1; ---回滚1 回滚点后面可以接多条语句

delete from dream.students where studentid=6 or studentid=7;

savepoint point2; --回滚2

delete from dream.students where studentid=8 or studentid=9;

rollback to savepoint point2; --回滚 只要不提交,删掉的数据都可以回滚回来

commit; --提交 从数据库缓冲 区中的数据提交到文件

select * from dream.students;

------------------SQL操作符

create table test

(

a int,

b int

)

insert into test values(20,50);

insert into test values(50,60);

---算术运算--把test中的数据做一系列运算后存到a表中

select a.*,a+b "a+b",a-b "a-b",a*b "a*b",a/b "a/b" from test a;

select * from test;

----连接操作符

select a||b||'||sdksajdh' from test;

--连接1:union A+B+C

--连接1:union all A+B+B+C

---------------------------------------------

---单函数 只返回一个值

--日期函数

select sysdate from dual;

---加两个月

select add_months(sysdate,2) from dual;

select add_months('31-3月-15',2) from dual;

--下周日期返回推2天

select next_day(sysdate,2) from dual;

---当月最后一天

select last_day('1-4月-15') from dual;

---to_date 返回日期函数

---------------------------------------

---字符函数

----ASCII 值转为字符

select chr(67) from dual;

select chr(99) from dual;

----求长度

select length('lijinli') from dual;

select length('李金利') from dual;

---替换

select translate('jack','j','b') from dual;

select translate('六级','六','四') from dual;

----左边填充

select LPAD('DHUIFGIOF',10,'$') from dual;

-----------------------------------------------

---转换函数

---to_date()

---to_char()

----时间->字符

SELECT TO_CHAR(sysdate,'YYYY"年"fmMM"月"fmDD"日" HH24:MI:SS') FROM dual;

----数值->字符

select to_char(100)||200 from dual;

select 200+100 from dual;

----to_number()

select '100'+200 from dual;---默认转换

select to_number('100')+200 from dual;--字符串变number型

select to_char(100)+200 from dual;

----------------------------------------

----比较NULL

-----1.NVL(A,B) A为NULL,返回B

--- A不为NULL,返回A

select NVL('100',NULL) from dual;

select NVL(NULL,'dhihfiohg') from dual;

select NVL('dhfuihdfo','dhihfiohg') from dual;---返回A

-----2.NVL2(A,B,C) A为NULL,返回C;A不为NULL,返回B

select NVL2(NULL,'100','dream') from dual;

select NVL2('dhfuihdfo','dhihfiohg','aa') from dual;

-----3.NULLIF(A,B) A=B 返回NULL;A不等于B,返回A

select NULLIF('aa','aa') from dual;

select NULLIF('bb','aa') from dual;

----------------------------------------

-----分组

select avg(score) from score where courseid=1;

select min(score) from score where courseid=1;

select max(score) from score where courseid=1;

-----统计记录数量

select count(score) from score where courseid=1;

---求和

select sum(score) from score where courseid=1;

----求科目号、不及格人数,并且不及格人数大于等于2,按人数排序

select courseid "科目号",count(*) "及格人数"

from score

where score<60

group by courseid

having count(*)>=2

order by count(*) desc;

----分析函数

---1.相同的份上,排名不相同

select * from score;

select studentid,score,row_number()

over(order by score desc) as 排名 from score;

---2.相同的分数,排名相同,序号随后跳跃

select studentid,score,rank()

over(order by score desc) as 排名 from score;

---3.相同的分数,排名相同,序号不跳跃

select studentid,score,dense_rank()

over(order by score desc) as 排名 from score;

---------------第三章------------------------------

---同义词

dream.students -> students;

----第1种.把模式下的对象公开,给别的模式用

create public synonym students for dream.students;

----第2种.更换表名,起保护作用

create public synonym stu for dream.students;

select * from stu;

---定义序列

create sequence stu_id

start with 20 --开始值

increment by 2 --跳号

maxvalue 2000 --最大值

minvalue 10 --最小值

nocycle ---循环

cache 20; ---内存中预先分配值

---使用 取下一个

insert into students(studentid,sname) values(stu_id.nextval,'aaaa');

insert into students(studentid,sname) values(stu_id.nextval,'bbbb');

 ---取当前的序号 currval

select stu_id.currval from dual;

 

select * from students; 

-----视图

create view stu_score_view

as

select a.studentid as 学号,

a.sname as 姓名,

b.coursename as 科目,

c.score as 分数

from dream.students a,dream.course b,dream.score c

where a.studentid=c.studentid and b.courseid=c.courseid;

select * from stu_score_view;

----内联

select a.studentid as 学号,

a.sname as 姓名,

b.coursename as 科目,

c.score as 分数

from dream.students a,dream.course b,dream.score c

where a.studentid=c.studentid

and courseid=1;

------------------------------------

select a.studentid as 学号,

a.sname as 姓名,

c.score as 分数

from dream.students a

inner join dream.score c

on a.studentid=c.studentid

and courseid=1;

---外联

---查询科目2的考试成绩,如果没有参加考试,也需要显示学生的名单

---左边表的数据至少出现一次

select a.studentid,a.sname,b.score

from students a,score b

where a.studentid=b.studentid(+)

and (b.courseid=1 or b.courseid is null);

----------------------------------------------

---left join

select a.studentid,a.sname,b.score

from students a

left join score b

on a.studentid=b.studentid

and b.courseid=1;

select a.studentid,a.sname,b.score

from students a

left join score b

on a.studentid=b.studentid

and b.courseid=1 or b.courseid is null;

---right join 完整外联 full join

select b.studentid,b.sname,a.score

from students b

right join score a

on a.studentid=b.studentid

and a.courseid=1 or a.courseid is null;

--索引 index

--创建索引

create index cou_index on course(courseid)

tablespace myspace;---都已创建

---唯一索引 union index

---组合索引 course(courseid,coursename)

---位图索引 bitmap index

---反向索引 on course(courseid) reverse;

---基于函数的索引

---索引组织表

---建表

---基本操作 增删改查

--三大难题 1.A表的数据复制到B B存在,B不存在

--- 2.聚合函数

--- 3.多表联查

---oracle客户端联数据文件

---高级查询

---视图,索引,存储过程,事务控制,触发器

--练习

create table A

(

code int primary key,

name char(20) not null,

amt int,

price float

);

create table B

(

code int,

name char(20) not null,

num int,

price float

);

insert into A values(0001,'纯生啤酒',100,12.78);

insert into A values(3701,'5号电池',125,3.12);

insert into A values(9527,'刮胡刀',10, 32.00);

insert into B values(0001,'纯生啤酒',3,12.78);

insert into B values(3701,'5号电池',2,3.12);

insert into B values(3701,'5号电池',4,3.12);

create table c

as

select a.code as "商品编号",

nvl(sum(b.num),0) as "卖出数量",

nvl((a.amt-sum(b.num)),a.amt) as "剩余数量",

nvl((sum(b.num)*a.price),0) as "金额"

from a

left join b

on a.code=b.code

group by a.code,a.amt,a.price

order by a.code

select * from a;

select * from b;

select * from c;

-------------------------------------------------

----第四章

----PL/SQL

declare ----定义

pass_score number:=60; ---变量名、类、初始化

begin ---主体

select avg(score) into pass_score from dream.score; ---求平均分

dbms_output.put_line('平均分为:'||pass_score);

update score set score=score+5 where score<pass_score;

commit; ----提交

exception ---异常处理

when others then

dbms_output.put_line('出错'||SQLERRM);

END;

select * from dream.score;

-----------------------------------------

declare ----定义

pass_score number:=60; ---变量名、类、初始化

begin ---主体

insert into students(studentid,sname) values(1,'刘广'); ---求平均分

commit; ----提交

exception ---异常处理

when others then

dbms_output.put_line('出错'||SQLERRM);

END;

----------------------------------------------------------------------

constant--常量

---属性类型

declare

avg_score dream.score.score%type;

stu1 dreams_.score%rowtype;

begin

select avg(score) into avg_score from score;

dbms_output.put_line('平均分为:'||avg_score);

select * into stu1 from score where score=59;

dbms_output.put_line('--------------------');

dbms_output.put_line('分数编号:'||stu1.scoreid);

dbms_output.put_line('学 号:'||stu1.studentid);

dbms_output.put_line('科目ID:'||stu1.courseid);

dbms_output.put_line('分 数:'||stu1.score);

end;

----------------------------------------------------------

set serveroutput on

declare

number1 integer:=80;

number2 integer:=90;

begin

if number1<=number2 then

if number1=number2 then

dbms_output.put_line('number1等于number2');

else

dbms_output.put_line('number1小于number2');

end if;

else

dbms_output.put_line('number1大于number2');

end if;

end;

-------------------------------------------------------------------

declare

result varchar2(10);

begin

case '&grade'

when 'A' then result := '优秀';

when 'B' then result := '良好';

when 'C' then result := '合格';

when 'D' then result := '不及格';

else result := '没有此成绩';

end case;

dbms_output.put_line(result);

end;

------------------------------------------------------------------

---while

declare

number1 int:=80;

number2 int:=90;

i int:=1;

begin

while number1 <number2 loop

number1:=number1+1;

i:=i+1;

end loop;

dbms_output.put_line('共循环次数:'||to_char(i));

end;

----结果为11

declare

sum1 int:=0;

i int:=1;

begin

while i<=100 loop

sum1:=sum1+i;

i:=i+1;

end loop;

dbms_output.put_line('1+2+.....+100='||sum1);

end;

--------------------------------------------------

--1加到100

declare

number1 int:=0;

i int:=1;

begin

for i in 1..100 loop

number1:=number1+i;

end loop;

dbms_output.put_line('1+2+.....+100='||number1);

end;

---------------------------------------------------

---动态

begin

create table abd(a,int,b,int);

insert int abc values(20,50);

insert int abc values(50,60);

end;

drop table abc;

----------------------

---改成动态spl

begin

execute immediate 'create table abc(a int,b int)';

execute immediate 'insert into abc values(20,50)';

execute immediate 'insert into abc values(30,60)';

end;

select * from abc;

-------------------------------------------

DECLARE

invalidCATEGORY EXCEPTION;

category VARCHAR2(10);

BEGIN

category := '&Category';

IF category NOT IN ('附件','顶盖','备件') THEN

RAISE invalidCATEGORY;

ELSE

DBMS_OUTPUT.PUT_LINE('您输入的类别是'|| category);

END IF;

EXCEPTION

WHEN invalidCATEGORY THEN

DBMS_OUTPUT.PUT_LINE('无法识别该类别');

END;

-------------------------------------------------------------

----定义 存储过程 通过学号查找姓名

create or replace procedure dream.f_name(s_id number)

as

sname char(20);

begin

select sname into sname

from dream.students where studentid=s_id;

DBMS_output.put_line(sname);

exception

when no_data_found then

dbms_output.put_line('学员未找到');

end;

--执行

set serveroutput on

execute f_name(5);

---in out

--执行存储过程

--存储过程

----------------------------------------------

---in out

create or replace procedure

swap2(p1 in out number,p2 in out number)

is

temp1 number;

begin

temp1:=p1;

p1:=p2;

p2:=temp1;

end;

------------------------

declare

num1 number:=100;

num2 number:=200;

begin

swap2(num1,num2);--调用存储过程 并传入参数num1 ,num2

dbms_output.put_line('num1='||to_char(num1));

dbms_output.put_line('num2='||to_char(num2));

end;

---------

---------------------------------------------------------

--------------------exp 命令参数 ------------------------

---------------------------------------------------------

userid 执行导出程序的用户名与口令。可选。必须为第一个参数。

buffer 指出缓冲区大小。大小是字节。

constraint 确定是否导出表约束,默认是导出。

file 指定导出的二进制文件名称,默认扩展名是.dmp

owner 要导出的数据库用户列表。

indexes 确定是否导出索引,默认是导出。

rows 确定是否要导出表中的数据,默认是为导出 值为y。

tables 按表方式导出时,指定需要导出的表和分区名称。

query 按表方式导出时,指定应用于每个表的where子句。

filesize 指定每个导出存储文件的字节数。

triggers 指定是否导出表的触发器。

tablespaces 按表空间方式导出时,指定要导出的表空间名。

--特别注意: 很多参数是相互矛盾的,所以要谨慎选取参数。比如:full=y和owner=scott 同时设置就是矛盾的。

---------------------------------------------------------

--------------------imp 命令参数 ------------------------

---------------------------------------------------------

userid 执行导入程序的用户名与口令。可选。必须为第一个参数。

buffer 指出缓冲区大小。大小是字节。

commit 指定是否在每个buffer的内容插入后进行提交,默认为n

feedback 指定是否在导入表时显示进度的行数。

file 指定导出的二进制文件

fromuser 指定要从导出转储文件中导入的用户模式。必须有权限才能执行。

full 是否要导入整个导出转储文件(*.dmp文件)。

tables 指定要导入的表的列表。

rows 是否要导入表的行。

indexes 是否要导入索引。

constraints 是否要导入表的约束。

parfile 指定传递给导入程序的参数文件名。

compile 指出是否要在创建存储过程后立即对其进行编译。

tablespaces 按表空间方式导入,列出要导入的表空间名。

--执行环境:可以在DOS(命令行)中执行

--------------------------------------------------------------------

--------------------------------数据导出-------------------------------

--------------------------------------------------------------------

--1 全部数据库方式导出数据

/*

在这种方式下,通常要有系统管理员的权限,普通用户是做不到的。

*/

--实例:将数据库TEST完全导出,用户名system 密码orcl 导出到D:\daochu.dmp中

exp system/dream1234@lijinli file=c:\daochu.dmp full=y

--2 按用户方式导出数据

/*

可以再普通用户模式下导出

*/

--实例:将数据库中system用户与sys用户的表导出(按用户方式导出)

exp system/orcl@myorcl file=d:\daochu.dmp owner=(system,sys);

exp system/orcl@myorcl file=d:\daochu.dmp owner=(scott);

exp scott/tiger@myorcl file=d:\daochu.dmp owner=(scott);

--3 以表方式导出数据

/*

一般是要导出哪个用户下面的表,采用哪个用户导出

*/

--实例:将数据库中的表emp导出

exp scott/tiger@myorcl file=d:\daochu.dmp tables=(emp);

exp dream/dream1234@orcl file=c:\daochu_score.dmp tables=(score);

--4 按条件导出

/*

一般表在哪个用户下面,采用哪个用户导出

*/

--将数据库中的表emp中的字段JOB以"CL"打头的数据导出

exp scott/tiger@myorcl file=d:\daochu.dmp tables=(emp) query=\" where job like 'CL%'\" ;

--5 按表空间导出

exp system/orcl@myorcl tablespaces=(TSM) file=d:\daochu.dmp;

--上面是常用的导出,对于压缩,既用winzip把dmp文件可以很好的压缩。

--也可以在上面命令后面 加上 compress=y 来实现。

--6 执行参数文件导出

/*

在D盘先建立par.txt文件,文件内容如下:

userid=scott/tiger@myorcl

file=d:\daochu.dmp

tables=(dept)

buffer=8192

rows=y

*/

exp parfile=D:\par.txt

--------------------------------------------------------------------

--------------------------------数据导入----------------------------

--------------------------------------------------------------------

--1 将D:\daochu.dmp 中的数据导入 TEST数据库中。--对应导出1

imp system/sream1234@lijinli full=y file=c:\daochu_full.dmp ignore=y

--上面可能有点问题,因为有的表已经存在,然后它就报错,对该表就不进行导入。

--在后面加上 ignore=y 就可以了。

--2 将d:\daochu.dmp文件导入(按用户方式)--对应导出2

imp system/orcl@myorcl file=d:\daochu.dmp fromuser=(system,sys);

imp system/orcl@myorcl file=d:\daochu.dmp fromuser=(scott);--只能以DBA方式导出

imp scott/tiger@myorcl file=d:\daochu.dmp full=y;--普通用户是不能接fromuser=(scott)

--3 将d:\daochu.dmp中的表emp导入(是哪个用户导出的导入到哪个用户里去)--对应导出3

imp system/sream1234@lijinli ignore=y file=c:\daochu_full.dmp tables(score);

imp scott/tiger@myorcl file=d:\daochu.dmp tables=(emp); --导入之前确保emp表不存在,存在导出不成功

--基本上上面的导入导出够用了。不少情况要先是将表彻底删除,然后导入。

--4 按条件导入

imp scott/tiger@myorcl file=d:\daochu.dmp full=y ignore=y;--对应导出4

--5 按表空间导入

imp system/orcl@myorcl file=d:\daochu.dmp tablespaces=(TSM) full=y;--对应导出5

--6 执行参数文件导入

imp parfile=d:\par.txt

--------------------------------------------------------------------

---操作

---步骤一:导出分数变score的数据

exp dream/dream1234@lijinli file=c:\daochu_s.dmp tables=(score) full=y

---步骤二:删除表

drop table dream.score;

select * from dream.score;

---步骤三:将步骤一导出的数据还原

imp dream/dream1234@lijinli file=c:\daochu_s.dmp tables=(score)

---ignore=y 配delete * from 使用

--2、导入

delete from dream.course;

commit;

select * from dream.course;

imp dream/dream1234@ORCL file=C:\T25bank\daochu_students.dmp tables=(course) ignore=y

select * from dream.students;

select * from dream.course;

select * from dream.score;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: