create schema <;模式名> authorization <;用户名>
例:create seacher authorizaton chen;
char(n) 长度为N的定长字符串
varchar(n) 最大长度为N的变长字符串
int 长整型(可以写作 integer)
smallint 短整数
numeric(p,d) 定点数 由P位数字(不包括符号,小数点)组成,小数后面有d位数字
real 取决于机器精度的浮点数
double precision 取决于机器精度的双精度的浮点数
float(n) 浮点数 精度至少为N为数字
data 日期 YYYY-MM-DD
time 时间 HH;MM:SS
show search_path;
set search_path TO "S-T",public;
crate table "S-T".student(
……
);
…… primary key,
…… unique,
……
foreign key (Cpno) references Course(Cno)
primary (Sno,Cno),
foreign key (Cno) references Course(Cno)
修改基本表
alter table <tablename>
[add <;新列名> <;数据类型> [完整性约束]]
[drop <;完整性约束名>]
[alter column <;列名> <;数据类型>];
例:
alter table student alter columnb Sage int;
alter table course add unique(Cname);
删除表
drop table <tablename> [restrict\cascade];
droop table student cascade;
index:[unique](唯一索引) [cluster](聚簇索引)
create [unique] [cluster] index <;索引名>
on <tablename> (<clumn1> [asc\desc],<clumn2> [asc\desc],……);
例:
create unique index Stuno on student(Sno);
create unique index SCno on SC(Sno asc,Cno desc);
drop index Stuno;
select [all\distinct]<;目标列表达式>[,<;目标列表达式>]……
from <;表名或视图名> [,表名或视图名]……
[where <;条件表达式>],
[group by <;列名1> [having <;条件表达式>]]
[order by <;列名2> [asc\desc]]
select * from user;
select Sname NAME,Sage AGE from student;
select Sno from SC;
select Distinct Sno from SC;
select * from student
where Sage BETWEEN 20 AND 25;
select * from student
where Sage NOT BETWEEN 20 AND 25;
select Sname, Ssex from student
where Sdept IN('CS','MA','IS');
select Sname, Ssex from student
where Sdept NOT IN('CS','MA','IS');
select * form student
where Cno=3
order by Grade by desc;
select Sno,Cno from SC
where Grade IS NULL;
select Sno,Cno from SC
where Grade IS NOT NULL;
like的字符串匹配
% 代表任意长度(长度可以为0)的字符串;
_ 代表任意单个字符;
\ 换码字符(转义)。
查询学生总人数
select count(*)
from student;
查询选修了课程的学生人数
select count(distinct Sno)
from SC;
计算1号课程的学生的平均成绩
select AVG(Grade) from SC
where Cno='1';
查询1号课程的学生的最高分数
select MAX(Grade) from SC
where Cno='1';
select Cno count(Sno)
from SC
group by Cno
select Sno
from SC
group by Sno
having count(*)>3;
select Sname from student
where Sno IN(
select Sno from SC
where Cno='2');
select Sno, Cno
from SC x
where Grade >= (select avg(grade)
from SC y
where y.Sno = x.Sno);
带有any(s
ome)或all谓词的子查询
> any 大于子查询中的某个值
> all 大于子查询中的所有值
< any 小于子查询中的某个值
< all 小于子查询中的所有值
>= any 大于等于子查询中的某个值
<= any 小于等于子查询中的某个值
>= all 大于等于子查询中的所有值
<= all 小于等于子查询中的所有值
= any 等于子查询中的某个值
= all 没有实际意义
!= (或 <>)any 不等于子查询中的某个值
!
= (或 <>)all 不等于子查询中的任何一个值
select Sname Sage from sudent
where Sage < any(select Sage
from student where Sdept = 'CS')
and sdept <> 'CS';
带有EXISTS谓词的子查询
查询所有选修了一号课程的学生姓名
select Sname from Student
where Exists(select *
from SC
where Sno = Student.Sno AND Cno = '1');
查询没有选修一号课程的学生姓名
select Sname from Student
where NOT Exists(select *
from SC
where Sno = Student.Sno AND Cno = '1');
并集
查询计算机系的学生及年龄不大于19的学生
select * from Student
where Sdept = 'CS'
union
select * from Student
where Sage <= 19;
(系统会自动去掉重复的记录)
查询选修了课程1或者课程2的学生
select Sno from SC
where Cno = '1'
union
select Sno from SC
where Cno = '2';
等价
select Sno from SC where Cno = '1' or Cno = '2';
交集
查询计算机系学生与年龄不大于19岁的学生的交集
select * from Student where Sdept = 'CS'
intersect
select * from Student where Sage <= 19;
等价
select * from Student where Sdept = 'CS' and Sage <= 19;
查询即选修了课程1又选修了课程2的学生
select Sno from Student
where Cno = '1'
intersect
select Sno from Student
where Cno = '2';
等价
select Sno from Student
where Cno = '1' and Sno in (select Sno from Student
where Cno = '2');
差集
查询计算机系的学生与年龄不大于19岁的学生的差集
select * from Student
where Sdept = 'CS'
EXCEPT
select * from Student
where Sage <= 19;
等价
select * from Student
where Sdept = 'CS' and Sage <= 19;
更新数据
insert into Student(Sno,Sname,Ssex,Sdept,Sage)
values('20110001','陈XX','boy','IS',18);
或者
insert into Student
values('20110001','陈XX','boy','IS',18);
修改数据
update Student
set Sage = 22
where Sno = '20110001';
update Student
set Sage = Sage + 1;
update Student
set Grade = 0
where CS = (select Sdept
from Student
where Student>Sno = SC.Sno);
删除数据
delete from Student
where Sno = '20110001';
delete from SC;
视图(VIEW)
create view
…………
子查询通常不能含有order by 子句和distinct 短语
check with option;
表示对视图进行update,insert,delete操作时要保证操作的行
满足定义中的谓词条件(即子查询中的的条件表达式)
create view IS_Student
as
select Sno,Sname,Sage
fro
m Student
where Sdept = 'IS';
create view IS_Student
as
select Sno,Sname,Sage
from Student
where Sdept = 'IS'
with check option;
由于视图IS_Student视图加上了with check option子句,以后对该视图进行插入,
修改和删除操作时候,RDBMS会自动加上Sdept=’IS‘的条件。
删除视图
drop view IS_Student;
drop view IS_Student cascade;
更新视图
update IS_Student
set Sname = 'liuchen'
where Sno = '20110001';
视图消解后
update IS_Student
set Sname = 'liuchen'
where Sno = '20110001' and Sdept = 'IS';
视图的作用
1、视图能够简化用户的操作
2、视图使用户能够以多种角度看待同一数据
3、视图对重构数据提供一定的程度的逻辑独立性
4、视图能够对机密数据提供安全保护
5、适当的利用视图可以更清晰的表达查询
授权(authorization)与回收
grant
grant <;权限>[,<;权限>]……
on <;对象类型><;对象>[,<;对象类型><;对象>]……
to <;用户>[,<;用户>]……
[with grant option];
把查询Student表的权限授给用户U1
grant select on table Student to U1;
把对Student表和Course表的全部操作权限授给用户U2和U3
grant all privileges on table Student,Course to U2,U3;
把对表SC的查询权限授予所有用户
grant select on table SC to public;
把查询Student表和修改学生学号的权限给用户U4
grant update(Sno),select on table Student to U4;
把对表SC的insert权限授给U5用户,并允许此权限再授给其他用户
grant insert on table SC to U5 with grant option;
revoke
revoke <;权限>[,<;权限>]……
on <;对象类型><;对象>[,<;对象类型><;对象>]……
from <;用户>[,<;用户>]……[cascade|restrict];
revoke update(Sno) on table Student from U4;
revoke select on table SC from public;
revoke insert on table SC from U5 cascade;
对数据库模式的授权则由DBA在创建用户时候实现
create user <username>
[with][DBA|RESOURCE|CONNECT];
说明:
1、只有数据库的超级用户才有权限创建一个新的数据库用户
2、创建的数据库用户有三种权限:connect、resource、dba
3、create user 命令中如果没有指定创建的新用户的权限,默认该用户拥有connect权限。
不能创建新用户,不能创建模式,也不能创建基本表,只能登入数据库。然后由其他用户授权给的应有的操作权限。
4、拥有resource权限的用户能够创建基本表和视图,成为所创建对象的属主,但不能创建模式,不能创建新用户。
5、拥有dba权限的用户时系统中超级用户。
角的创建
create role <;角名>。
给角授权
grant <;权限>[,<;权限>]……
on <;对象类型>对象名
to <;角>[,<;角>]……
将角授予其他的角或用户
grant <;角1>[,<;角2>]……
to <;角3>[,<;用户1>]……
[with admin option];
角权限的回收
revoke <;权限>[,<;权限
>]……
on <;对象类型><;对象名>
from <;角>[,<;角>]……
触发器(trigger)
创建触发器
create trigger <;触发器名>
{before|after}<;触发事件>or<;表名>
for each {row|statement}
[when<;触发条件>]
<;触发动作体系>
语法说明:
1、表的拥有者才能创建
2、触发器名可以包含模式名,也可以不包含。并且触发器和表名必须在同一模式下
3、触发事件可以是 insert、delete、update 也可以是几个事件的组合,
update后面还可以有of<;触发列,…… >,即进一步指明修改哪些列时触发器激活。
4、触发器类型:行级触发器(for each row);语句级触发器(for each statement).
5、触发体动作:如果是行级触发器,两种情况下可以在过程体中使用new、old 引用
update和insert事件之后的新值和update和insert之前的久值,如果是语句级触发器,
drop table if exists user则不能在触发动作体中使用new和old进行引用。
create trigger insert_or_update_sal
before insert or update on teacher
for each row
as begin
if(new.job = '教授')and (new.sal<4000)then
new.sal:= 40000;
end if;
end;
create table sal_log(
eno numeric(4) primary key(eno),
sal numeric(7,2),
username char(10),
date timestamp);
create trigger insert_sal
after insert on teacher
for each row
as begin
insert into sal_log values(
<,new.sal,current_user,current_timestamp);
end;
create trigger UPdate_sal
after update on teacher
for each row
as begin
if(new.sal<>old.sal)then insert into sal_log value(
<,new.sal,current_user,current_timestamp);
end if;
end;
关于触发器执行步骤
1、该表上的before触发器
2、激活触发器的sql语句
3、该表上的after触发器。
对于一表多个before(after)触发器的,遵循“谁先创建谁先执行”的原则。
有的rdbms是按照触发器的名称的字母排序顺序执行触发器。
删除触发器的sql语法
drop trigger <;触发器名称>or<;表名>;
drop trigger insert_sal on teacher;
嵌入式编程
建立数据库连接
exec sql connect to target[as connection_name][user user_name];
关闭数据库连接
exec sql disconnect [connnect_name];
存储过程
1、变量的定义
变量名 变量类型 [[not null]:= 初始表达式]或
变量名 变量类型 [[not null]初始表达式]
2、常量的定义
常量名 常量类型 constant:= 常量表达式
3、赋值语句
变量名称:= 表达式
4、条件控制
if condition then
sequence_of_statements;
end if
if condition then
sequence_of_statements1;
else
sequence_of_statements2;
end if;
5、循环控制
loop
sequence_of_statements;
end loop;
while condition loop
sequence_of_statements;
end loop;
for count in [reverse] bound1 ... bound2 loop
sequence_of_statements;
end loop;
创建存储
过程
create procedure 过程名([参数1,参数2,…… ])    /*存储过程首部*/
as
<pl/sql块>;
存储过程:从一个账户转指定数额的款项到另一个账户中
create procedure transfer(inaccount int, outaccount int, amount float)
as declare
totalDeposit float;
begin
select total into totalDeposit from account where accountnum = outaccount;
if totalDeposit is null then
rollback;
return;
end if;
if totalDeposit < amount then
rollback;
return;
end if;
update account set total = total - amount when accountnum = outaccount;
update account set total = total + amount when accountnum = inccount;
commit;
end;
重命名存储过程
alter procedure 过程名 1 rename to 过程名2;
执行存储过程
call/perform procedure 过程名([参数1,参数2,参数3 …… ]);
删除存储过程
drop procedure 过程名();

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。