关系数据库语言- SQL
?关系代数
?SQL语言
基础
?SQL语言
上机环境
关系数据库语言 - SQL
?结构化查询语言 SQL -
Structured Query Language
?SQL已不限于查询,还包括数据操纵、定义、
控制和管理等功能。它是一个综合的、通用
的、功能极强的关系数据库语言。
?国际标准化组织( ISO) 89年公布了 SQL语言
的 国际标准( SQL89)。
?我国也制定了类似的标准( SQL89)
?实际系统大都对 SQL语言作了扩充。
SQL语言的特点
?非过程化
SQL语言是非过程化语言(第四代语言)。
?一体化
SQL集 DDL,DML,DCL为一体。用 SQL语
言可实现 DB生命周期的全部活动。
因实体、联系均用关系来表示,这种数据结构的单
一性也带来了 DB语言的统一性。
?两种使用方式,统一的语法结构。
联机交互使用方式。
嵌入某种高级程序设计语言。
SQL语句例
?查询 SELECT * FROM student ;
?插入 INSERT INTO student
VALUES(980001,`刘清 `,`男 `,`无 91`) ;
?修改 UPDATE student
SET cno=`力 92` WHERE sno=980001 ;
?删除 DELETE FROM student
WHERE cno=`力 93` ;
关系代数
?关系代数是以集合代数为基础而发展起
来的,它是以关系为运算对象的一组高
级运算的集合。
? 关系定义为 K元组的集合,把关系看成一个
集合,集合里的运算(并、差、交、笛卡尔
积等)可以引入到关系的运算中来。而另外
一类运算是针对关系数据库专门设计的,包
括对关系进行垂直分解(投影)水平分解
(选择)和关系的结合(连接)等。
集合运算
交 差
并
关系代数运算
投影操作是从关系的属性集中选择属性子
集, 即由关系的部分列组成一个新关系, 投影
操作表示为,?ai,...,aj( R)
例,? 学号, 姓名, 系 (学生 )
投影
关系代数运算
选择操作是从关系中选择部分满足条件的元
组, 其表示形式为,? F (R)
例:
? 性别= `男 ` (学生 )
选择
关系代数运算
设关系 R 和 S 的元数分别为 r 和 s,定义 R和
S的笛卡尔积是一个( r+s) 元元组的集合,每
一个元组的前 r个分 量来自 R的一个元组,后 s
个分量来自 S的一个元组。笛卡尔积记为 R× S。
R× S= { t| t=(tr,ts ) ? tr?R ? ts ?S }
若 R有 3个元组,S有 4个元组,则 R× S应有
12个元组。
笛卡尔积
关系代数运算
X
Y
Z
D
C
B
A
关系代数运算连接
笛卡尔积操作将结果关系扩展,如果笛卡尔积的
两关系元组数分别为 m和 n,那么结果关系的元组数为
m× n,而 在处理中往往只是需要其中部分元组。
连接( Join)操作是 从笛卡尔积中选择满足条件
的元组 。最常用的条件是 等值连接
dnostudent dep
SQL语言基础
Select *
From emp ;
表格实例之一
选课(学号,课程号,成绩)
sc(sno,cno,grade)
课程(课程号,课程名,学分,上课时间,名额)
course(cno,cname,credit,ctime,quota)
系(系号,系名,电话)
dep(dno,dname,tel )
学生 (学号,姓名,性别,出生年月,系号)
student(sno,sname,sex,birthday,dno)
表格实例之二
emp ( eno,ename,sex,age,sal,mgr,dno )
职工 职工号 姓名 性别 年龄 工资 领导 部门号
其中,mge为职工的上一级领导(即上一级领导的职工号)
建立表对象
CREATE TABLE student
( sno NUMBER(6),
sname CHAR(6),
sex CHAR(2),
birthday DATE,
dno CHAR(3)
) ;
列数据类型
字符型:
CHAR( n)字符数据,长度为 n个字符
VARCHAR2( n)变长字符型 (n为最大长度 )
数值型:
NUMBER( n)数值数据。最大可达 105位
NUMBER( m,n) m位数字,其中 n为小数位
日期型:
DATE,其格式为 DD- MON- YY
例如,17- DEC- 85 或 17- 12月- 85
完整性约束
(1)主码完整性约束
sno number(6) constraint e1
primary key,
(2) 非空 完整性约束
sname char(6) constraint e2 not null,
(3) 唯一 完整性约束
dname char(20) constraint d2 unique
完整性约束
(4) check完整性约束
age number constraint e3
check(age between 18 and 60)
sex char(2) check(sex in('男 ','女 '))
(5) 引用完整性约束
dno char(3) constraint e4
references dep(dno)
on delete cascade
引用完整性约束
?先建主表,后建子表
?子表引用的必须是主表的主码(或定义了
unique约束的列)。
?子表 dno的值必须是合法值 (主表值 )
?当删除主表记录时,若子表中有对应记录,
不能删。
?指定了 on delete cascade 连带删除。
CREATE TABLE sc
(sno number(6),
cno char(3),
grade number(3),
primary key (sno,cno)
) ; CREATE TABLE …
(…
not null(列 1,列 2),
unique(列 1,列 2)
) ;
表约束
CREATE TABLE emp
( eno char(3),
ename char(6),
sex char(2),
age number(2),
sal number(6,2),
mgr char(3),
dno char(3),
CHECK(sex='男 'AND age BETWEEN 18 AND 60 OR
sex='女 'AND age BETWEEN 18 AND 55 ),
foreign key(dno) references dep(dno)
);
表约束
表结构的维护
修改表对象
ALTER TABLE emp
ADD( 列定义)
MODIFY( ename char(10))
ADD( 表约束)
DROP CONSTRAINT e4 ;
删除表对象
DROP TABLE emp ;
INSERT INTO emp
VALUES(`e01`,`李宏 `,‘男’,32, 580.0,
‘ e100’,’ d02’) ;
INSERT INTO emp(eno,ename,dno)
VALUES(‘eo1’,’王兰‘,’ d01’);
UPDATE emp
SET sal=sal*1.1 WHERE dno=`d01` ;
DELETE FROM emp
WHERE dno=`d01` ;
DML 语句 (DB写语句)
Select 语句
(1) 基本查询
?SELECT *
?FROM student
?WHERE sex = '男 ' AND dno = 'D01' ;
?查询的结果仍可看成是一个关系,它由查出
的记录组成。
(2) 查询语句中的投影操作
? 投影操作是从关系的属性集中选择属性子
集,即由关系的部分列组成一个新关系,
SELECT sno,sname,dno
FROM student;
?? 学号,姓名,系 (学生 )
(2) 查询语句中的投影操作
SELECT sno stu_no, sname stu_ name,
dno dept
FROM student
WHERE sex=‘男’ ;
该语句输出如下:
stu_no stu_name dept
980001 张自立 d01
970020 李春生 d02
(2) 查询语句中的投影操作
SELECT ename, sal*12 an_sal
FROM emp ;
该语句输出如下:
ename an_sal
徐再兴 9600
… …
SELECT ename,sal*12 an_sal,'元 ' RMB
FROM emp ;
该语句输出如下:
ename an_sal RMB
徐再兴 9600 元
… …
(3) 查询语句中的选择操作- WHERE子句
选择操作是从关系中选择部分满足条件的元组,
其表示形式为:
SELECT *
FROM student
WHERE sex=`男 `;
?性别= `男 ` (学生 )
(3) 查询语句中的选择操作- WHERE子句
例:查询 79,80两年出生的男同学的名单:
SELECT sname,birthday
FROM student
WHERE sex=‘男 ' AND birthday BETWEEN
'01-1月 -79' AND '31-12月 -80';
查询 1980年以前出生的学生:
SELECT *
FROM student
WHERE birthday < '01-1月 -1980' ;
SQL语句中的运算符
?算术运算符:+,-,*,/
?逻辑运算符:与 AND、或 OR,非 NOT
?比较符:=,!=,>,<,>=,<=
?其他运算符,IN,NOT IN,ANY,ALL 判
断是否是集合的成员。
?BETWEEN … AND … 判断列值是否满足指
定的区间
?LIKE 匹配模式 _ %
?IS [NOT] NULL 测试空值
(3) 查询语句中的选择操作- WHERE子句
? 在查询条件中,可以使用集合运算符
SELECT dname,tel
FROM dep
WHERE dname IN(`计算机系 `,`外语系 `,`中文系 `) ;
? 该表达式等同于,
dname='计算机系 ' OR dname='外语系 ' OR dname='中文系 '
? 该表达式也等同于,
dname =ANY(`计算机系 `,`外语系 `,`中文系 `),
? 集合运算符 NOT IN是 IN的反义词,
? WHERE dname NOT IN(`计算机系 `,`外语系 `,`中文系 `) ;
? 该表达式等同于,
? dname !=ALL(`计算机系 `,`外语系 `,`中文系 `),
(3) 查询语句中的选择操作- WHERE子句
空值是表中分量常见的一种状态
查询学号为 980001的同学正在学习的课程,
SELECT cno
FROM sc
WHERE sno=980001 AND grade IS NULL;
模糊匹配。匹配符有两个:
_ 表示任意一个字符
% 表示任意个字符(包括 0个)。
例如,查询姓王的同学信息;
SELECT *
FROM student
WHERE sname LIKE '王% ' ;
查询学生某门课(如 c01)的成绩,并按成绩由高到低
的顺序输出:
SELECT sno,grade (输出学号和成绩 )
FROM sc
WHERE cno='c01'and grade IS NOT NULL
ORDER BY grade DESC ;
排序输出的隐含顺序是升序( ASC),如果要求按列值
的降序输出,需在列名后指定 DESC。
ORDER BY子句指定的排序列可以不止一个,例如:
SELECT *
FROM student
ORDER BY dep DESC,birthday ;
(4)查询的排序输出 - ORDER BY子句
(4)查询的排序输出 - ORDER BY子句
?ORDER BY 子句除了用列名指定排序列外,还可以
依据 SELECT 子句中列的顺序号排序,这对于某些
列名不好指定的情况尤为有用。例如,查询职工姓
名及年工资,并按年工资的升序依次输出:
SELECT ename,sal*12
FROM emp
ORDER BY 2 ;
?注意:
排序应该是查询语句的最后一步工作,是即将输出之
前的处理,所以排序子句一般也出现在查询语句的
最后。
(5) 多表查询与连接操作( joins)
笛卡尔积操作将结果关系扩展,如果笛卡尔积的两关系元
组数分别为 m和 n,那么结果关系的元组数为 m× n,而 在处理中往
往只是需要其中部分元组。
连接( Join)操作是 从笛卡尔积中选择满足条件的元组 。
最常用的条件是 等值连接
Select * from student,dep where student.dno=dep.dno
dnostudent dep
(5) 多表查询与连接操作( joins)
?表之间的连接操作(通常是自然连接)体现
在 WHERE子句中的连接条件。
?例:查询计算机系的学生信息
SELECT sno,sname,sex
FROM student,dep
WHERE student.dno=dep.dno AND
dname='计算机系 ';
查询物理课不及格的学生名单(输出学生的学号、姓
名及成绩):
SELECT student.sno,sname,grade
FROM student,sc,course
WHERE cname='物理 ' AND grade<60 AND
course.cno=sc.cno AND sc.sno=student.sno,
在该例中,查询的结果来自两张表,而决定查询结果
的因素涉及到三张表的信息。
当一个查询涉及到几个关系时,为了区别不同表中的
同名属性,我们可以在属性名前冠以关系名。
(5) 多表查询与连接操作( joins)
(6) 元组变量
?在一个查询过程中有时会涉及到同一关系的
两个。
?为了表示不同的元组,SQL允许在 FROM子
句中为一个关系定义几个元组变量。
?这样,我们就能在 SELECT,WHERE等子句
中,通过在属性前冠以元组变量来引用同一
关系不同元组的属性值。
(6) 元组变量
例如在 emp表中,我们要查询职工王莹的上级领导信
息
SELECT eno,ename
FROM emp
WHERE ename='王莹 ' AND mgr=eno ;?
为 emp表 定义两个元组变量( e1,e2)
SELECT e2.eno,e2.ename
FROM emp e1,emp e2
WHERE e1.ename='王莹 ' AND e1.mgr=e2.eno ;
athlete运动员( name姓名,sex性别,group组 )
查询混双选手名单。每行输出一对选手,男选手在
前,女选手在后。
SELECT a1.name 男选手,a2.name 女选手
FROM athlete a1,athlete a2
WHERE a1.sex='男 ' AND a2.sex='女 ' AND
a1.group=a2.group ;
该例检索结果如下:
男选手 女选手
王涛 邓亚萍
… …
(6) 元组变量
交 差
并
(7) 集合运算
查同时选修了 c01和 c02两门课的学生
SELECT sno FROM sc
where cno=`c01` and cno=`c02` ;
(7) 集合运算
(select sno from sc
where cno=`c01`)
(select sno from sc
where cno=`c02`) ;
(交 ) union (并 ) minus (差 )intersect
c01 c02
(7) 集合运算
?例:查询选修了 c01、但没有选修 c02的学生
的学号:
( SELECT sno FROM sc WHERE cno='c01')
MINUS
( SELECT sno FROM sc WHERE cno='c02');
例:假如外语只开设了英语和日语。查询当前至少上
着一门外语课的学生:
(SELECT sno
FROM sc,course
WHERE cname='英语 'AND sc.cno=course.cno AND
grade IS null )
UNION
(SELECT sno
FROM sc,course
WHERE cname='日语 'AND sc.cno=course.cno AND
grade IS null);
(7) 集合运算
(7) 集合运算
?Select 语句必须选择同样数量的列。
?相应的列必须具有相同的类型。
?重复的行将被自动去掉,不用 distinct
?第一个 select 语句中的列名出现在结果
?Order by 子句可出现在语句的最后,且只能
指定位置列。
Select eno,ename,sal from emp
union
select wno,wname,salary from worker
order by 3 ;
(8)查询中的重值处理
?我们的讨论中存在这样一个事实,即 SQL把
关系当作一个“袋子”而不是一个集合。也
就是说,一个元组在关系中可以出现若干次。
?例如,我们要查询一下所有的课程名:
SELECT cname FROM course;
?只需在关键字 SELECT 的后面加上关键字
DISTINCT即可。它告诉 SQL在结果关系中只
产生元组的一份拷贝,因此可以保证结果中
没有重复值。
?例如,上面提到的查询可以写成这样:
SELECT DISTINCT cname FROM course ;
(8)查询中的重值处理
?在前面讨论关系的集合运算,结果关系的重复
值将会自动去掉。
?但如果我们在集合运算符(如 UNION)的后
面加上关键字 ALL,那结果关系又会具有 '袋
子 '的效果,即不去掉重复值。
?例如,查询至少选修了 c01和 c02中一门课的
学生,
( SELECT sno FROM sc WHERE cno='c01')
UNION ALL
( SELECT sno FROM sc WHERE cno='c02');
(8)查询中的重值处理
?DISTINCT的使用是要付出代价的。因为要去
掉重复值,必须对结果关系进行排序,相同
的元组排在一起,只有按这种方法对元组分
组,才能去掉重复值,而这一工作甚至比查
询本身还费时间。
(9) 聚合操作
?聚合是把关系作为运算对象的另一类操作。
这里所说的聚合操作就是对关系中一列的值
进行统计工作,最终得到一个统计值。例如
求职工的平均年龄,求职工的工资总额等。
?常用 5种聚合的操作符:
SUM — 对某列的值求和。
AVG — 求某列值的平均值。
MIN — 求某列值的最小值。
MAX — 求某列值的最大值。
COUNT — 统计某列值的个数(计数)。
例:统计职工的工资总额:
SELECT SUM( sal) FROM emp ;
例:求职工的最高工资、最低工资和平均工资:
SELECT MAX(sal),MIN(sal),AVG(sal)
FROM emp ;
例:求女学生的学生总数:
SELECT COUNT(*)
FROM student
WHERE sex='女 ';
d01
d02
d01
d03
d01
d01
21
d02
18
19
20
21
18
22
sum
count
(9) 聚合操作
(9) 聚合操作
?查询有多少名同学物理课不及格:
SELECT COUNT(sno)
FROM sc,course
WHERE cname='物理 ' AND course.cno=sc.cno
AND grade<60;
?SQL不仅允许我们对列值进行统计,还允许
我们按一定条件对关系的元组进行分组,然
后对每一个组进行统计操作。
(9) 聚合操作
?求每个系的学生数而不是求学生总数。希望
得到下面的输出:
dno count(*)
d01 120
d02 65
… …
SELECT dno,count(*)
FROM student
GROUP BY dno ;
d01
d01
d01
d02
d02
d01
980001
d02
980003
980002
980004
981001
981003
981002
dno
count
count
(9) 聚合操作
?查询每个学生已获得的学分(注:成绩及格
即取得相应课程的学分):
SELECT sno,sum(credit)
FROM sc,course
WHERE grade>60 AND sc.cno=course.cno
GROUP BY sno ;
分组子句中可以指定多个用于分组的属性。当按第一个
属性值分组后,每组再按第二个属性值分组 …,统计是对最
小的组进行。
例如
查询各系 c01课程最高成绩和最低成绩(男生、女生分开
统计):
SELECT dno,sex,MAX(grade),MIN(grade)
FROM student,sc
WHERE student.sno=sc.sno AND cno= 'C01’
GROUP BY dno,sex ;
dno sex MAX(grade) MIN(grade)
d01 男 100 45
d01 女 98 61
d02 男 94 60
d02 女 90 57
… … … …
(9) 聚合操作
(9) 聚合操作
?当我们的选择是基于组的统计结果时,要在
与 GROUP BY 子句配合使用的 HAVING子句
中写上这类选择组的条件。
?例如:查学分大于 30分的学生(只输出学号)
SELECT sno,sum(credit)
FROM sc,course
WHERE grade>60 AND sc.cno=course.cno
GROUP BY sno
HAVING sum(credit)>30;
( 10)子查询
?在一些 SQL语句中可以调用一个查询子句,以增加
语句功能。
?注意子查询返回值的处理
?例如,查询物理系的学生名单,按以前的做法是:
SELECT sname
FROM student,dep
WHERE dname='物理系 ' AND dep.dno=student.dno ;
?而利用子查询的语句如下:
SELECT sname
FROM student
WHERE dno=(SELECT dno FROM dep
WHERE dname=‘物理系’ ) ;
( 10)子查询
?一个子查询也可以产生一个关系,该关系可
以包含若干属性,可包含若干元组。
?SQL提供了若干对于关系的操作符,并产生
一个布尔型的结果。这些操作符主要就用在
子查询的结果上。例如:
EXISTS R 是一个条件,当且仅当关系 R不空
时为真。
?集合运算符
IN, NOT IN = ANY != ALL …
( 10)子查询
?例:查体育课不及格的男生名单:
SELECT sname
FROM student
WHERE sex=`男 ` AND sno IN
( SELECT sno FROM sc
WHERE grade<60 AND cno IN
(SELECT cno FROM course
WHERE cname=‘体育’ )
);
查找年龄在 50岁以上、工资小于本部门平均工资的职工,
输出他们的姓名、年龄、工资:
SELECT ename,age,sal
FROM emp
WHERE age>50 and sal<( SELECT avg(sal)
FROM emp
WHERE dno=
);
e1
dnoe1.dnoemp.dno
( 10)子查询
例:查询从未被选修的课程,相关子查询
SELECT cno,cname
FROM course
WHERE NOT EXISTS(SELECT * FROM sc
WHERE cno=course.cno);
例:查询从未被选修的课程 (另一种方法 ):非相关子
查询
SELECT cno,cname
FROM course
WHERE cno NOT IN(SELECT cno FROM sc );
( 10)子查询
( 10)子查询
?例:查询本学期选课超过 10门的学生人数
(注:选修但还没有成绩就表示是本学期正
在上的课):
SELECT COUNT(*)
FROM student
WHERE sno IN (SELECT sno
FROM sc
WHERE grade IS NULL
GROUP BY sno
HAVING COUNT(*)>10) ;
( 10)子查询
?例:查询各系年龄最小的同学名单:
SELECT sname,birthday,dno
FROM student
WHERE (birthday,dno) IN
( SELECT MAX(birthday),dno
FROM student
GROUP BY dno ) ;
( 11)层次查询(树查询)
?查询职工上下级关系
select eno,ename
from emp
connect by prior eno=mgr
start with eno=`e01`
(或 start with mgr is null)
select level,eno,enamee
LEVEL ENO ENAME
------ --- ------
1 e01 aaa
2 e02 bbb
3 e03 aaa
3 e04 aaa
2 e05 aaa
3 e06 aaa
3 e07 aaa
3 e08 aaa
( 11)层次查询(树查询)
SELECT LEVEL,eno,ename
FROM emp
CONNECT BY PRIOR eno = mgr and PRIOR age>20
START WITH eno=1 ;
查询的不同实现
查同时选修 c01和 c02两门课的学生
select a.sno
from sc a,sc b
where a.sno=b.sno and
a.cno=`c01` and b.cno=`c02` ;
Select sno from sc
where cno=`c01` and sno in
(select sno from sc where cno=`c02` ) ;
子查询的应用
?在建表语句中使用
create table emp1
as select eno,ename,sal,age,dno from emp ;
?在插入语句中使用
insert into emp1
select * from emp where sex=`男 ` ;
视图
create view student1
as select * from student
where dno=‘ d01’
create view sc1
as select sname,cname,credit
from student,sc,course
where student.sno=sc.sno
and sc.cno=course.cno
and dep='d01' ;
视
图
是
虚
表
数
据
库
只
存
储
视
图
的
定
义
,
不
存
储
对
应
的
数
据
。视
图
用
一
组
查
询
来
定
义
,
是
被
存
储
的
查
询
SMITH
ALLEN
WARD
JONES
MARTIN
BLAKE
CLARK
SCOTT
KING
TURNER
ADAMS
JAMES
FORD
MILLER
Index Block Table Block
ADAMS
ALLEN
BLAKE
CLARK
FORD
JAMES
JONES
KING
MARTIN
MILLER
SCOTT
SMITH
TURNER
WARD
MILLER
TURNER
BLAKE
JAMES
KING
ROWIDB树索引
建立索引
Create index idx1
on emp(ename) ;
建立索引原则:
( 1)记录有一定规模,检索 <10%内容。
( 2)某列在 where子句中频繁使用。
( 3)先装数据,后建索引。
使用索引
?标准用法
Select * from emp where ename=`JONES` ;
?不正确用法
select * from emp ;
select * from emp
where upper(ename)=`JONES` ;
select * from emp
where hiredate+7=`01-JAN-95` ;
位图索引
? 对于索引列的每一个可能的值,都有独立的 位图项 。
? 在位图项中的每一位代表一个可能的 ROWID,为 1意味着
该行包含关键值。
? 例如,LOC列( 3种取值)
北京 ( 0 1 0 0 1 1 )
天津 ( 1 0 0 0 0 0 )
上海 ( 0 0 1 1 0 0 )
第二个记录
第一个记录
? 位图函数可以将位的位置转换为实际的 ROWID 。
? 通过位图索引的合并简化查询条件,从而过滤被访问的数据
集合。
d01 合资
d02 合资
d03 合资
d04 外企
d05 国企
d06 合资
dno type
天津
北京
上海
上海
北京
北京
loc
select dno from dep
where type = ‘合资’ and loc in (‘北京’,‘上
海’ )。
合资 北京 上海
1 0 0 0
1 1 0 1 d02
1 0 1 1 d03
0 AND 0 OR 1 = 0
0 1 0 0
1 1 0 1 d06
位图索引
位图索引
?建立位图索引;
create bitmap index dep_index
on dep(type,loc) ;
?位图索引适用于列的值取值不多的情况、索
引列含有越多的值,位图项就越多,需要存
储索引的空间也越大。
?由于数据库必须展开一个位图索引的方式,
所以不适于经常插入或更新数据的应用。
?位图索引典型地用于决策系统与数据仓库应
用中查询数据。
聚 集
在公共列上具有同一值的行在数据库中物理地
存储在一起。
聚集可加快连接操作
Create cluster clu1(depno char(3));
create table dep(… ) cluster clu1(dno);
create table emp(… ) cluster clu1(dno);
create index clu1_idx on cluster clu1
eno d01 dname
聚集
e01 王山 男 d01 佳月公司 8200
e02 张丽 女 d01
e10 孙军 男 d02 运通公司 2034
d03 安合物业 6800
来自 emp 来自 dep
cluster key
DB对象 - 序列
Create sequence q1
increment by 10 start with 980000 ;
q1.nextval
q1.currval
?使用
select q1.nextval from dual ;
insert into temp
values(q1.nextval,…) ;
SQL语句中的函数-字符函数
?例:
select dno,lower(dname)
from dep ;
?例:
select *
from emp
where ename=upper(`rose`);
SQL语句中的函数-数值函数
?select ename round(sal,2)
round (782.934,2) 782.93
round (782.934) 783
round(782.934,-1) 780
? log sin cos abs sqrt
?floor(99.9)=99 返回 小于 /等于参数值的最大整
数。
?CEIL(15.7) =16 返回 大于 /等于参数值的最小
整数。
SQL语句中的函数-日期函数
?select sysdate from dual ;
?select months_between(sysdate,hiredate)
from emp
?日期的算术运算
date +number date - number
date - date
select d1,d1+7,d1-7,sysdate-d1 from emp;
04-may-00 11-may-00 27-apr-00 298.731
SQL语句中的函数-日期函数
?例:
select next_day(sysdate,`Monday`)
from dual ;
?例,
select last_day(sysdate) from dual;
包含参数的月份中的最后一天
SQL语句中的函数-转换函数
?to_char(sysdate,`描述串 `)
将隐含格式 dd-mon-yy转换为指定格式
yy/mm/dd 98/06/11
hh:mi:ss 09:34:28
day Monday,..
Dy mon,tue wed,..
yyyy 2001
?to_char(sal,`$9,999`) $1,375
select to_char(1375,`$9,999`) from dual
ORA
CL
E
数
据
库
概
述
子程序调用接口 OCI
Develop 2000
Pro*C 预编译接口
SQL*Plus
操
作
系
统
R
D
B
M
S
O
R
A
C
L
E
核
心
DB
:
Delphi PB VB
ORA
CL
E
数
据
库
概
述
Oracle工具
RDBMS
SQL*NET
终端
Oracle工具
SQL*NET SQL*NET
RDBMS DB
DB
网络
虚
终
端
ORA
CL
E
数
据
库
概
述 Oracle 数据存储空间
基本表 Table
View视图
SQL
TableTable
SQL*Plus使用
SQL*Plus启动
其他
SQL*Plus登录界面
stud1
o8i1
student1
SQL*Plus窗口(交互界面)
SQL*Plus命令
SQL> select * from cat ;
SQL> desc student
SQL>select * from student ;
SQL*Plus命令
SQL> edit a
SQL> @a
SQL*Plus菜单 使用
SQL*Plus菜单 使用
Sql*plus中的替换变量
Insert into student
values(&sno,`&sname`,`&sex`,`&birthday`,
`&dno`) ;
SQL>enter value for sno:
主机字符串配置
主机字符串配置
主机字符串配置
主机字符串配置
主机字符串配置
主机字符串配置
主机字符串配置
主机字符串配置
?关系代数
?SQL语言
基础
?SQL语言
上机环境
关系数据库语言 - SQL
?结构化查询语言 SQL -
Structured Query Language
?SQL已不限于查询,还包括数据操纵、定义、
控制和管理等功能。它是一个综合的、通用
的、功能极强的关系数据库语言。
?国际标准化组织( ISO) 89年公布了 SQL语言
的 国际标准( SQL89)。
?我国也制定了类似的标准( SQL89)
?实际系统大都对 SQL语言作了扩充。
SQL语言的特点
?非过程化
SQL语言是非过程化语言(第四代语言)。
?一体化
SQL集 DDL,DML,DCL为一体。用 SQL语
言可实现 DB生命周期的全部活动。
因实体、联系均用关系来表示,这种数据结构的单
一性也带来了 DB语言的统一性。
?两种使用方式,统一的语法结构。
联机交互使用方式。
嵌入某种高级程序设计语言。
SQL语句例
?查询 SELECT * FROM student ;
?插入 INSERT INTO student
VALUES(980001,`刘清 `,`男 `,`无 91`) ;
?修改 UPDATE student
SET cno=`力 92` WHERE sno=980001 ;
?删除 DELETE FROM student
WHERE cno=`力 93` ;
关系代数
?关系代数是以集合代数为基础而发展起
来的,它是以关系为运算对象的一组高
级运算的集合。
? 关系定义为 K元组的集合,把关系看成一个
集合,集合里的运算(并、差、交、笛卡尔
积等)可以引入到关系的运算中来。而另外
一类运算是针对关系数据库专门设计的,包
括对关系进行垂直分解(投影)水平分解
(选择)和关系的结合(连接)等。
集合运算
交 差
并
关系代数运算
投影操作是从关系的属性集中选择属性子
集, 即由关系的部分列组成一个新关系, 投影
操作表示为,?ai,...,aj( R)
例,? 学号, 姓名, 系 (学生 )
投影
关系代数运算
选择操作是从关系中选择部分满足条件的元
组, 其表示形式为,? F (R)
例:
? 性别= `男 ` (学生 )
选择
关系代数运算
设关系 R 和 S 的元数分别为 r 和 s,定义 R和
S的笛卡尔积是一个( r+s) 元元组的集合,每
一个元组的前 r个分 量来自 R的一个元组,后 s
个分量来自 S的一个元组。笛卡尔积记为 R× S。
R× S= { t| t=(tr,ts ) ? tr?R ? ts ?S }
若 R有 3个元组,S有 4个元组,则 R× S应有
12个元组。
笛卡尔积
关系代数运算
X
Y
Z
D
C
B
A
关系代数运算连接
笛卡尔积操作将结果关系扩展,如果笛卡尔积的
两关系元组数分别为 m和 n,那么结果关系的元组数为
m× n,而 在处理中往往只是需要其中部分元组。
连接( Join)操作是 从笛卡尔积中选择满足条件
的元组 。最常用的条件是 等值连接
dnostudent dep
SQL语言基础
Select *
From emp ;
表格实例之一
选课(学号,课程号,成绩)
sc(sno,cno,grade)
课程(课程号,课程名,学分,上课时间,名额)
course(cno,cname,credit,ctime,quota)
系(系号,系名,电话)
dep(dno,dname,tel )
学生 (学号,姓名,性别,出生年月,系号)
student(sno,sname,sex,birthday,dno)
表格实例之二
emp ( eno,ename,sex,age,sal,mgr,dno )
职工 职工号 姓名 性别 年龄 工资 领导 部门号
其中,mge为职工的上一级领导(即上一级领导的职工号)
建立表对象
CREATE TABLE student
( sno NUMBER(6),
sname CHAR(6),
sex CHAR(2),
birthday DATE,
dno CHAR(3)
) ;
列数据类型
字符型:
CHAR( n)字符数据,长度为 n个字符
VARCHAR2( n)变长字符型 (n为最大长度 )
数值型:
NUMBER( n)数值数据。最大可达 105位
NUMBER( m,n) m位数字,其中 n为小数位
日期型:
DATE,其格式为 DD- MON- YY
例如,17- DEC- 85 或 17- 12月- 85
完整性约束
(1)主码完整性约束
sno number(6) constraint e1
primary key,
(2) 非空 完整性约束
sname char(6) constraint e2 not null,
(3) 唯一 完整性约束
dname char(20) constraint d2 unique
完整性约束
(4) check完整性约束
age number constraint e3
check(age between 18 and 60)
sex char(2) check(sex in('男 ','女 '))
(5) 引用完整性约束
dno char(3) constraint e4
references dep(dno)
on delete cascade
引用完整性约束
?先建主表,后建子表
?子表引用的必须是主表的主码(或定义了
unique约束的列)。
?子表 dno的值必须是合法值 (主表值 )
?当删除主表记录时,若子表中有对应记录,
不能删。
?指定了 on delete cascade 连带删除。
CREATE TABLE sc
(sno number(6),
cno char(3),
grade number(3),
primary key (sno,cno)
) ; CREATE TABLE …
(…
not null(列 1,列 2),
unique(列 1,列 2)
) ;
表约束
CREATE TABLE emp
( eno char(3),
ename char(6),
sex char(2),
age number(2),
sal number(6,2),
mgr char(3),
dno char(3),
CHECK(sex='男 'AND age BETWEEN 18 AND 60 OR
sex='女 'AND age BETWEEN 18 AND 55 ),
foreign key(dno) references dep(dno)
);
表约束
表结构的维护
修改表对象
ALTER TABLE emp
ADD( 列定义)
MODIFY( ename char(10))
ADD( 表约束)
DROP CONSTRAINT e4 ;
删除表对象
DROP TABLE emp ;
INSERT INTO emp
VALUES(`e01`,`李宏 `,‘男’,32, 580.0,
‘ e100’,’ d02’) ;
INSERT INTO emp(eno,ename,dno)
VALUES(‘eo1’,’王兰‘,’ d01’);
UPDATE emp
SET sal=sal*1.1 WHERE dno=`d01` ;
DELETE FROM emp
WHERE dno=`d01` ;
DML 语句 (DB写语句)
Select 语句
(1) 基本查询
?SELECT *
?FROM student
?WHERE sex = '男 ' AND dno = 'D01' ;
?查询的结果仍可看成是一个关系,它由查出
的记录组成。
(2) 查询语句中的投影操作
? 投影操作是从关系的属性集中选择属性子
集,即由关系的部分列组成一个新关系,
SELECT sno,sname,dno
FROM student;
?? 学号,姓名,系 (学生 )
(2) 查询语句中的投影操作
SELECT sno stu_no, sname stu_ name,
dno dept
FROM student
WHERE sex=‘男’ ;
该语句输出如下:
stu_no stu_name dept
980001 张自立 d01
970020 李春生 d02
(2) 查询语句中的投影操作
SELECT ename, sal*12 an_sal
FROM emp ;
该语句输出如下:
ename an_sal
徐再兴 9600
… …
SELECT ename,sal*12 an_sal,'元 ' RMB
FROM emp ;
该语句输出如下:
ename an_sal RMB
徐再兴 9600 元
… …
(3) 查询语句中的选择操作- WHERE子句
选择操作是从关系中选择部分满足条件的元组,
其表示形式为:
SELECT *
FROM student
WHERE sex=`男 `;
?性别= `男 ` (学生 )
(3) 查询语句中的选择操作- WHERE子句
例:查询 79,80两年出生的男同学的名单:
SELECT sname,birthday
FROM student
WHERE sex=‘男 ' AND birthday BETWEEN
'01-1月 -79' AND '31-12月 -80';
查询 1980年以前出生的学生:
SELECT *
FROM student
WHERE birthday < '01-1月 -1980' ;
SQL语句中的运算符
?算术运算符:+,-,*,/
?逻辑运算符:与 AND、或 OR,非 NOT
?比较符:=,!=,>,<,>=,<=
?其他运算符,IN,NOT IN,ANY,ALL 判
断是否是集合的成员。
?BETWEEN … AND … 判断列值是否满足指
定的区间
?LIKE 匹配模式 _ %
?IS [NOT] NULL 测试空值
(3) 查询语句中的选择操作- WHERE子句
? 在查询条件中,可以使用集合运算符
SELECT dname,tel
FROM dep
WHERE dname IN(`计算机系 `,`外语系 `,`中文系 `) ;
? 该表达式等同于,
dname='计算机系 ' OR dname='外语系 ' OR dname='中文系 '
? 该表达式也等同于,
dname =ANY(`计算机系 `,`外语系 `,`中文系 `),
? 集合运算符 NOT IN是 IN的反义词,
? WHERE dname NOT IN(`计算机系 `,`外语系 `,`中文系 `) ;
? 该表达式等同于,
? dname !=ALL(`计算机系 `,`外语系 `,`中文系 `),
(3) 查询语句中的选择操作- WHERE子句
空值是表中分量常见的一种状态
查询学号为 980001的同学正在学习的课程,
SELECT cno
FROM sc
WHERE sno=980001 AND grade IS NULL;
模糊匹配。匹配符有两个:
_ 表示任意一个字符
% 表示任意个字符(包括 0个)。
例如,查询姓王的同学信息;
SELECT *
FROM student
WHERE sname LIKE '王% ' ;
查询学生某门课(如 c01)的成绩,并按成绩由高到低
的顺序输出:
SELECT sno,grade (输出学号和成绩 )
FROM sc
WHERE cno='c01'and grade IS NOT NULL
ORDER BY grade DESC ;
排序输出的隐含顺序是升序( ASC),如果要求按列值
的降序输出,需在列名后指定 DESC。
ORDER BY子句指定的排序列可以不止一个,例如:
SELECT *
FROM student
ORDER BY dep DESC,birthday ;
(4)查询的排序输出 - ORDER BY子句
(4)查询的排序输出 - ORDER BY子句
?ORDER BY 子句除了用列名指定排序列外,还可以
依据 SELECT 子句中列的顺序号排序,这对于某些
列名不好指定的情况尤为有用。例如,查询职工姓
名及年工资,并按年工资的升序依次输出:
SELECT ename,sal*12
FROM emp
ORDER BY 2 ;
?注意:
排序应该是查询语句的最后一步工作,是即将输出之
前的处理,所以排序子句一般也出现在查询语句的
最后。
(5) 多表查询与连接操作( joins)
笛卡尔积操作将结果关系扩展,如果笛卡尔积的两关系元
组数分别为 m和 n,那么结果关系的元组数为 m× n,而 在处理中往
往只是需要其中部分元组。
连接( Join)操作是 从笛卡尔积中选择满足条件的元组 。
最常用的条件是 等值连接
Select * from student,dep where student.dno=dep.dno
dnostudent dep
(5) 多表查询与连接操作( joins)
?表之间的连接操作(通常是自然连接)体现
在 WHERE子句中的连接条件。
?例:查询计算机系的学生信息
SELECT sno,sname,sex
FROM student,dep
WHERE student.dno=dep.dno AND
dname='计算机系 ';
查询物理课不及格的学生名单(输出学生的学号、姓
名及成绩):
SELECT student.sno,sname,grade
FROM student,sc,course
WHERE cname='物理 ' AND grade<60 AND
course.cno=sc.cno AND sc.sno=student.sno,
在该例中,查询的结果来自两张表,而决定查询结果
的因素涉及到三张表的信息。
当一个查询涉及到几个关系时,为了区别不同表中的
同名属性,我们可以在属性名前冠以关系名。
(5) 多表查询与连接操作( joins)
(6) 元组变量
?在一个查询过程中有时会涉及到同一关系的
两个。
?为了表示不同的元组,SQL允许在 FROM子
句中为一个关系定义几个元组变量。
?这样,我们就能在 SELECT,WHERE等子句
中,通过在属性前冠以元组变量来引用同一
关系不同元组的属性值。
(6) 元组变量
例如在 emp表中,我们要查询职工王莹的上级领导信
息
SELECT eno,ename
FROM emp
WHERE ename='王莹 ' AND mgr=eno ;?
为 emp表 定义两个元组变量( e1,e2)
SELECT e2.eno,e2.ename
FROM emp e1,emp e2
WHERE e1.ename='王莹 ' AND e1.mgr=e2.eno ;
athlete运动员( name姓名,sex性别,group组 )
查询混双选手名单。每行输出一对选手,男选手在
前,女选手在后。
SELECT a1.name 男选手,a2.name 女选手
FROM athlete a1,athlete a2
WHERE a1.sex='男 ' AND a2.sex='女 ' AND
a1.group=a2.group ;
该例检索结果如下:
男选手 女选手
王涛 邓亚萍
… …
(6) 元组变量
交 差
并
(7) 集合运算
查同时选修了 c01和 c02两门课的学生
SELECT sno FROM sc
where cno=`c01` and cno=`c02` ;
(7) 集合运算
(select sno from sc
where cno=`c01`)
(select sno from sc
where cno=`c02`) ;
(交 ) union (并 ) minus (差 )intersect
c01 c02
(7) 集合运算
?例:查询选修了 c01、但没有选修 c02的学生
的学号:
( SELECT sno FROM sc WHERE cno='c01')
MINUS
( SELECT sno FROM sc WHERE cno='c02');
例:假如外语只开设了英语和日语。查询当前至少上
着一门外语课的学生:
(SELECT sno
FROM sc,course
WHERE cname='英语 'AND sc.cno=course.cno AND
grade IS null )
UNION
(SELECT sno
FROM sc,course
WHERE cname='日语 'AND sc.cno=course.cno AND
grade IS null);
(7) 集合运算
(7) 集合运算
?Select 语句必须选择同样数量的列。
?相应的列必须具有相同的类型。
?重复的行将被自动去掉,不用 distinct
?第一个 select 语句中的列名出现在结果
?Order by 子句可出现在语句的最后,且只能
指定位置列。
Select eno,ename,sal from emp
union
select wno,wname,salary from worker
order by 3 ;
(8)查询中的重值处理
?我们的讨论中存在这样一个事实,即 SQL把
关系当作一个“袋子”而不是一个集合。也
就是说,一个元组在关系中可以出现若干次。
?例如,我们要查询一下所有的课程名:
SELECT cname FROM course;
?只需在关键字 SELECT 的后面加上关键字
DISTINCT即可。它告诉 SQL在结果关系中只
产生元组的一份拷贝,因此可以保证结果中
没有重复值。
?例如,上面提到的查询可以写成这样:
SELECT DISTINCT cname FROM course ;
(8)查询中的重值处理
?在前面讨论关系的集合运算,结果关系的重复
值将会自动去掉。
?但如果我们在集合运算符(如 UNION)的后
面加上关键字 ALL,那结果关系又会具有 '袋
子 '的效果,即不去掉重复值。
?例如,查询至少选修了 c01和 c02中一门课的
学生,
( SELECT sno FROM sc WHERE cno='c01')
UNION ALL
( SELECT sno FROM sc WHERE cno='c02');
(8)查询中的重值处理
?DISTINCT的使用是要付出代价的。因为要去
掉重复值,必须对结果关系进行排序,相同
的元组排在一起,只有按这种方法对元组分
组,才能去掉重复值,而这一工作甚至比查
询本身还费时间。
(9) 聚合操作
?聚合是把关系作为运算对象的另一类操作。
这里所说的聚合操作就是对关系中一列的值
进行统计工作,最终得到一个统计值。例如
求职工的平均年龄,求职工的工资总额等。
?常用 5种聚合的操作符:
SUM — 对某列的值求和。
AVG — 求某列值的平均值。
MIN — 求某列值的最小值。
MAX — 求某列值的最大值。
COUNT — 统计某列值的个数(计数)。
例:统计职工的工资总额:
SELECT SUM( sal) FROM emp ;
例:求职工的最高工资、最低工资和平均工资:
SELECT MAX(sal),MIN(sal),AVG(sal)
FROM emp ;
例:求女学生的学生总数:
SELECT COUNT(*)
FROM student
WHERE sex='女 ';
d01
d02
d01
d03
d01
d01
21
d02
18
19
20
21
18
22
sum
count
(9) 聚合操作
(9) 聚合操作
?查询有多少名同学物理课不及格:
SELECT COUNT(sno)
FROM sc,course
WHERE cname='物理 ' AND course.cno=sc.cno
AND grade<60;
?SQL不仅允许我们对列值进行统计,还允许
我们按一定条件对关系的元组进行分组,然
后对每一个组进行统计操作。
(9) 聚合操作
?求每个系的学生数而不是求学生总数。希望
得到下面的输出:
dno count(*)
d01 120
d02 65
… …
SELECT dno,count(*)
FROM student
GROUP BY dno ;
d01
d01
d01
d02
d02
d01
980001
d02
980003
980002
980004
981001
981003
981002
dno
count
count
(9) 聚合操作
?查询每个学生已获得的学分(注:成绩及格
即取得相应课程的学分):
SELECT sno,sum(credit)
FROM sc,course
WHERE grade>60 AND sc.cno=course.cno
GROUP BY sno ;
分组子句中可以指定多个用于分组的属性。当按第一个
属性值分组后,每组再按第二个属性值分组 …,统计是对最
小的组进行。
例如
查询各系 c01课程最高成绩和最低成绩(男生、女生分开
统计):
SELECT dno,sex,MAX(grade),MIN(grade)
FROM student,sc
WHERE student.sno=sc.sno AND cno= 'C01’
GROUP BY dno,sex ;
dno sex MAX(grade) MIN(grade)
d01 男 100 45
d01 女 98 61
d02 男 94 60
d02 女 90 57
… … … …
(9) 聚合操作
(9) 聚合操作
?当我们的选择是基于组的统计结果时,要在
与 GROUP BY 子句配合使用的 HAVING子句
中写上这类选择组的条件。
?例如:查学分大于 30分的学生(只输出学号)
SELECT sno,sum(credit)
FROM sc,course
WHERE grade>60 AND sc.cno=course.cno
GROUP BY sno
HAVING sum(credit)>30;
( 10)子查询
?在一些 SQL语句中可以调用一个查询子句,以增加
语句功能。
?注意子查询返回值的处理
?例如,查询物理系的学生名单,按以前的做法是:
SELECT sname
FROM student,dep
WHERE dname='物理系 ' AND dep.dno=student.dno ;
?而利用子查询的语句如下:
SELECT sname
FROM student
WHERE dno=(SELECT dno FROM dep
WHERE dname=‘物理系’ ) ;
( 10)子查询
?一个子查询也可以产生一个关系,该关系可
以包含若干属性,可包含若干元组。
?SQL提供了若干对于关系的操作符,并产生
一个布尔型的结果。这些操作符主要就用在
子查询的结果上。例如:
EXISTS R 是一个条件,当且仅当关系 R不空
时为真。
?集合运算符
IN, NOT IN = ANY != ALL …
( 10)子查询
?例:查体育课不及格的男生名单:
SELECT sname
FROM student
WHERE sex=`男 ` AND sno IN
( SELECT sno FROM sc
WHERE grade<60 AND cno IN
(SELECT cno FROM course
WHERE cname=‘体育’ )
);
查找年龄在 50岁以上、工资小于本部门平均工资的职工,
输出他们的姓名、年龄、工资:
SELECT ename,age,sal
FROM emp
WHERE age>50 and sal<( SELECT avg(sal)
FROM emp
WHERE dno=
);
e1
dnoe1.dnoemp.dno
( 10)子查询
例:查询从未被选修的课程,相关子查询
SELECT cno,cname
FROM course
WHERE NOT EXISTS(SELECT * FROM sc
WHERE cno=course.cno);
例:查询从未被选修的课程 (另一种方法 ):非相关子
查询
SELECT cno,cname
FROM course
WHERE cno NOT IN(SELECT cno FROM sc );
( 10)子查询
( 10)子查询
?例:查询本学期选课超过 10门的学生人数
(注:选修但还没有成绩就表示是本学期正
在上的课):
SELECT COUNT(*)
FROM student
WHERE sno IN (SELECT sno
FROM sc
WHERE grade IS NULL
GROUP BY sno
HAVING COUNT(*)>10) ;
( 10)子查询
?例:查询各系年龄最小的同学名单:
SELECT sname,birthday,dno
FROM student
WHERE (birthday,dno) IN
( SELECT MAX(birthday),dno
FROM student
GROUP BY dno ) ;
( 11)层次查询(树查询)
?查询职工上下级关系
select eno,ename
from emp
connect by prior eno=mgr
start with eno=`e01`
(或 start with mgr is null)
select level,eno,enamee
LEVEL ENO ENAME
------ --- ------
1 e01 aaa
2 e02 bbb
3 e03 aaa
3 e04 aaa
2 e05 aaa
3 e06 aaa
3 e07 aaa
3 e08 aaa
( 11)层次查询(树查询)
SELECT LEVEL,eno,ename
FROM emp
CONNECT BY PRIOR eno = mgr and PRIOR age>20
START WITH eno=1 ;
查询的不同实现
查同时选修 c01和 c02两门课的学生
select a.sno
from sc a,sc b
where a.sno=b.sno and
a.cno=`c01` and b.cno=`c02` ;
Select sno from sc
where cno=`c01` and sno in
(select sno from sc where cno=`c02` ) ;
子查询的应用
?在建表语句中使用
create table emp1
as select eno,ename,sal,age,dno from emp ;
?在插入语句中使用
insert into emp1
select * from emp where sex=`男 ` ;
视图
create view student1
as select * from student
where dno=‘ d01’
create view sc1
as select sname,cname,credit
from student,sc,course
where student.sno=sc.sno
and sc.cno=course.cno
and dep='d01' ;
视
图
是
虚
表
数
据
库
只
存
储
视
图
的
定
义
,
不
存
储
对
应
的
数
据
。视
图
用
一
组
查
询
来
定
义
,
是
被
存
储
的
查
询
SMITH
ALLEN
WARD
JONES
MARTIN
BLAKE
CLARK
SCOTT
KING
TURNER
ADAMS
JAMES
FORD
MILLER
Index Block Table Block
ADAMS
ALLEN
BLAKE
CLARK
FORD
JAMES
JONES
KING
MARTIN
MILLER
SCOTT
SMITH
TURNER
WARD
MILLER
TURNER
BLAKE
JAMES
KING
ROWIDB树索引
建立索引
Create index idx1
on emp(ename) ;
建立索引原则:
( 1)记录有一定规模,检索 <10%内容。
( 2)某列在 where子句中频繁使用。
( 3)先装数据,后建索引。
使用索引
?标准用法
Select * from emp where ename=`JONES` ;
?不正确用法
select * from emp ;
select * from emp
where upper(ename)=`JONES` ;
select * from emp
where hiredate+7=`01-JAN-95` ;
位图索引
? 对于索引列的每一个可能的值,都有独立的 位图项 。
? 在位图项中的每一位代表一个可能的 ROWID,为 1意味着
该行包含关键值。
? 例如,LOC列( 3种取值)
北京 ( 0 1 0 0 1 1 )
天津 ( 1 0 0 0 0 0 )
上海 ( 0 0 1 1 0 0 )
第二个记录
第一个记录
? 位图函数可以将位的位置转换为实际的 ROWID 。
? 通过位图索引的合并简化查询条件,从而过滤被访问的数据
集合。
d01 合资
d02 合资
d03 合资
d04 外企
d05 国企
d06 合资
dno type
天津
北京
上海
上海
北京
北京
loc
select dno from dep
where type = ‘合资’ and loc in (‘北京’,‘上
海’ )。
合资 北京 上海
1 0 0 0
1 1 0 1 d02
1 0 1 1 d03
0 AND 0 OR 1 = 0
0 1 0 0
1 1 0 1 d06
位图索引
位图索引
?建立位图索引;
create bitmap index dep_index
on dep(type,loc) ;
?位图索引适用于列的值取值不多的情况、索
引列含有越多的值,位图项就越多,需要存
储索引的空间也越大。
?由于数据库必须展开一个位图索引的方式,
所以不适于经常插入或更新数据的应用。
?位图索引典型地用于决策系统与数据仓库应
用中查询数据。
聚 集
在公共列上具有同一值的行在数据库中物理地
存储在一起。
聚集可加快连接操作
Create cluster clu1(depno char(3));
create table dep(… ) cluster clu1(dno);
create table emp(… ) cluster clu1(dno);
create index clu1_idx on cluster clu1
eno d01 dname
聚集
e01 王山 男 d01 佳月公司 8200
e02 张丽 女 d01
e10 孙军 男 d02 运通公司 2034
d03 安合物业 6800
来自 emp 来自 dep
cluster key
DB对象 - 序列
Create sequence q1
increment by 10 start with 980000 ;
q1.nextval
q1.currval
?使用
select q1.nextval from dual ;
insert into temp
values(q1.nextval,…) ;
SQL语句中的函数-字符函数
?例:
select dno,lower(dname)
from dep ;
?例:
select *
from emp
where ename=upper(`rose`);
SQL语句中的函数-数值函数
?select ename round(sal,2)
round (782.934,2) 782.93
round (782.934) 783
round(782.934,-1) 780
? log sin cos abs sqrt
?floor(99.9)=99 返回 小于 /等于参数值的最大整
数。
?CEIL(15.7) =16 返回 大于 /等于参数值的最小
整数。
SQL语句中的函数-日期函数
?select sysdate from dual ;
?select months_between(sysdate,hiredate)
from emp
?日期的算术运算
date +number date - number
date - date
select d1,d1+7,d1-7,sysdate-d1 from emp;
04-may-00 11-may-00 27-apr-00 298.731
SQL语句中的函数-日期函数
?例:
select next_day(sysdate,`Monday`)
from dual ;
?例,
select last_day(sysdate) from dual;
包含参数的月份中的最后一天
SQL语句中的函数-转换函数
?to_char(sysdate,`描述串 `)
将隐含格式 dd-mon-yy转换为指定格式
yy/mm/dd 98/06/11
hh:mi:ss 09:34:28
day Monday,..
Dy mon,tue wed,..
yyyy 2001
?to_char(sal,`$9,999`) $1,375
select to_char(1375,`$9,999`) from dual
ORA
CL
E
数
据
库
概
述
子程序调用接口 OCI
Develop 2000
Pro*C 预编译接口
SQL*Plus
操
作
系
统
R
D
B
M
S
O
R
A
C
L
E
核
心
DB
:
Delphi PB VB
ORA
CL
E
数
据
库
概
述
Oracle工具
RDBMS
SQL*NET
终端
Oracle工具
SQL*NET SQL*NET
RDBMS DB
DB
网络
虚
终
端
ORA
CL
E
数
据
库
概
述 Oracle 数据存储空间
基本表 Table
View视图
SQL
TableTable
SQL*Plus使用
SQL*Plus启动
其他
SQL*Plus登录界面
stud1
o8i1
student1
SQL*Plus窗口(交互界面)
SQL*Plus命令
SQL> select * from cat ;
SQL> desc student
SQL>select * from student ;
SQL*Plus命令
SQL> edit a
SQL> @a
SQL*Plus菜单 使用
SQL*Plus菜单 使用
Sql*plus中的替换变量
Insert into student
values(&sno,`&sname`,`&sex`,`&birthday`,
`&dno`) ;
SQL>enter value for sno:
主机字符串配置
主机字符串配置
主机字符串配置
主机字符串配置
主机字符串配置
主机字符串配置
主机字符串配置
主机字符串配置