Oracle入门---简单命令

--查询当前时间

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;



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值