--查询当前时间
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;