学习数据库概论第三天

第三章

3.1 SQL概述

SQL集数据查询、数据操纵、数据定义和数据控制功能于一体。主要特点:
1.综合统一
数据库系统的主要功能是通过数据库支持的数据语言来实现的。
非关系模型(层次模型、网状模型)的数据语言一般都分为:
(1)模式数据定义语言(模式DDL)
(2)外模式数据定义语言(外模式DDL或子模式DDL)
(3)数据存储有关的描述语言(DSDL)
(4)数据操纵语言(DML)
它们分别用于定义模式、外模式、内模式和进行数据的存取和处置。
SQL集数据定义语言、数据操纵语言、数据控制语言的功能于一体。可以独立完成数据库生命周期中的全部活动,包括以下一系列操作要求:
(1)定义和修改、删除关系模式,定义和删除视图,插入数据,建立数据库。
(2)对数据库中的数据进行查询和更新。
(3)数据库重构和维护。
(4)数据库安全性、完整性控制,以及事务控制。
(5)嵌入式SQL和动态SQL定义。
2.高度非过程化
存取路径的选择以及SQL的操作过程由系统自动完成。
3.面向集合的操作方式
4.以同一种语法结构提供多种使用方式
SQL既是独立的语言,又是嵌入式语言。
5.语言简洁,易学易用

3.2学生-课程数据库

Student
学号Sno 姓名Sname 性别Ssex 年龄Sage 所在系Sdept
201215121 李勇 男 20 CS
201215122 刘晨 女 19 CS
201215123 王敏 女 18 MA
201215125 张立 男 19 IS

Course
课程号Cno 课程名Cname 先行课Cpno 学分Credit
1 数据库 5 4
2 数学 2
3 信息系统 1 4
4 操作系统 6 3
5 数据结构 7 4
6 数据处理 2
7 PASCAL语言 6 4

SC
学号Sno 课程号Cno 成绩Grade
201215121 1 92
201215121 2 85
201215121 3 88
201215122 2 90
201215122 3 80

3.3数据定义

一个关系数据库管理系统的实例中可以建立多个数据库,一个数据库中可以建立多个模式,一个模式下通常包括多个表、视图和索引等数据库对象。

1.定义模式
Create schema 模式名 authorization 用户名;
如果没有指定模式名,那么模式名隐含为用户名。
要创建模式,调用该命令的用户必须拥有数据库管理员权限,或者获得了数据库管理员授予的create schema的权限。

例3.1 为用户wang定义一个学生-课程模式S-T。
Create schema S-T authorization wang;

例3.3 为用户zhang创建一个模式test,并且在其中定义一个表tab1.
Create schema test authorization zhang;
Create table tab1(
Col1 smallint,
Col2 int,
Col3 char(20),
Col4 numeric(10,3),
);
2.删除模式
Drop schema 模式名 [cascade|restrict]
其中cascade和restrict两者必选其一。选择了cascade(级联),表示在删除模式的同时把该模式中所有的数据库对象删除。选择了restrict(限制),表示如果该模式中已经定义了下属的数据库对象(如表、视图等),则拒绝该删除语句的执行。只有当该模式中没有任何下属的对象时才能执行drop schema语句。

1.定义基本表
创建了一个模式就建立了一个数据库的命名空间,一个框架。在这个空间中首先要定义的是该模式包含的数据库基本表。
Create table 表名 (
列名 数据类型 [列级完整性约束条件],
列名 数据类型 [列级完整性约束条件],
列名 数据类型 [列级完整性约束条件],

[表级完整性约束条件]
);

例3.5 建立一个“学生”表Student.
Create table Student(
Sno char(9) primary key, /列级完整性约束条件,Sno是主码/
Sname char(20) unique, /Sname取唯一值/
Ssex char(2),
Sage smallint,
Sdept char(20)
);

例3.6 建立一个“课程”表Course.
Create table Course(
Cno char(4) primary key, /列级完整性约束条件,Con是主码/
Cname char(40) not null, /列级完整性约束条件,Cname不能取空值/
Cpno char(4),
Ccredit smallint,
Foreign key (Cpno) references Course (Cno)/表级完整性约束条件,Cpno是外码,被参照表是Course,被参照列是Cno/
);
例3.7 建立学生选课表SC。
Create table SC(
Sno char(9),
Cno char(4),
Grade smallint,
Primary key(Sno,Cno),/表级完整性约束条件,Sno,Con是主码/
foregin key (Sno) references Student (Sno),/表级完整性约束条件,Sno是外码,被参照表是Student,被参照列是Sno/
Foregin key (Cno)references Course (Cno)/表级完整性约束条件,Cno是外码,被参照表是Course,被参照列是Cno/
);

2.模式和表
现要在S-T模式中定义Student、Course、SC等基本表
方法一:在表名中明显地给出模式名。
Create table “S-T”.Student(…);
Create table “S-T”.Course(…);
方法二:在创建模式语句中同时创建表。
方法三:设置所属的模式,这样在创建表时表名中不必给出模式名。

当用户创建基本表(其他数据库对象也一样)时若没有指定模式,系统根据搜索路径(Search path)来确定该对象所属的模式。
搜索路径包含一组模式列表,关系数据库管理系统会使用模式列表中第一个存在的模式作为数据库对象的模式名。若搜索路径中的模式名都不存在,系统会给出错误。
使用show search_path;可以显示当前的搜索路径。
搜索路径当前默认值是$user,PUBLIC.其含义是首先搜索与用户名相同的模式名,如果该模式名不存在,则使用PUBLIC模式。
数据库管理员也可以设置搜索路径,例:set search_path to “S-T”,PUBLIC;然后,定义表:create table Student(…); 实际结果是建立了S-T.Student基本表。因为关系数据库管理系统发现搜索路径中第一个模式名S-T存在,就把该模式作为基本表Student所属的模式。

3.修改基本表
Alter table 表名
[add 列名 数据类型 [完整性约束] ]
[add 表级完整性约束]
[drop 列名 [cascade|restrict] ]
[drop constraint 完整性约束名 [restrict|cascade] ]
[alter column 列名 数据类型];

例3.8 向Student表增加“入学时间”列,其数据类型为日期型。
Alter table Student add Schooltime date;
不论基本表中原来是否已有数据,新增加的列一律为空值。
例3.9 将年龄的数据类型由字符型改为整数。
Alter table Student alter column Sage int;
例3.10 增加课程名称必须取唯一值的约束条件。
Alter table Course add unique(Cname);

4.删除基本表
Drop table 表名 [reatrict|cascade];

数据库索引有多种类型,常见索引包括顺序文件上的索引、B+树索引、散列索引、位图索引等。
顺序文件上的索引是针对按指定属性值升序或降序存储的关系,在该属性上建立一个顺序索引文件,索引文件由属性值和相应的元组指针组成。
B+树索引是将索引属性组织成B+树形式,B+树的叶结点为属性值和相应的元组指针。B+树索引具有动态平衡的优点。
散列索引是建立若干个桶,将索引属性按照其散列函数值映射到相应桶中,桶中存放索引属性值和相应的元组指针。散列索引具有查找速度快的特点。
位图索引是用位向量记录索引属性中可能出现的值,每个位向量对应一个可能性。

关系数据库管理系统在执行查询时会自动地选择合适的索引作为存取路径,用户不必也不能显式的地选择索引。

1.建立索引
Create [unique][cluster] index 索引名 on 表名(列名 [次序],列名 [次序],…);
索引可以建立在该表的一列或者多列上,ASC是升序,DESC是降序,默认是ASC。
Unique表明此索引的每一个索引值只对应唯一的数据记录。
Cluster表示要建立的索引为聚簇索引。

例3.13 为学生-课程数据库中的Student、Course和SC三个表建立索引。其中Student表按照学号升序建唯一索引,Course表按课程号升序建唯一索引,SC表按学号升序和课程号降序建唯一索引。
Create unique index S-Student on Student (Sno ASC);
Create unique index S-Course on Course(Cno ASC);
Create unique index S-SC on SC(Sno ASC,Cno DESC);
2.修改索引
Alter index 旧索引名 rename 新索引名;
3.删除索引
Drop index 索引名;

3.4数据查询

Select [all|distinct] 列名,列名,…
From 表名或视图名,表名或视图名,…
Where 条件表达式
[group by 列名 [having 条件表达式] ]
[order by 列名[ASC|DESC] ];

1.单表查询
例3.16 查询全体学生的学号与姓名。
Select Sno,Sname
From Student;
执行过程:从Student表中取出一个元组,取出该元组在属性Sno和Sname上的值,形成一个新的元组作为输出。对所有元组做相同的处理,最后形成一个结果关系作为输出。
例3.17 查询全体学生的姓名、学号、所在系。
Select Sname,Sno,Sept
From Student;
例3.18 查询全体学生的详细记录。
Select *
From Student;
例3.19查询全体学生的姓名及其出生年月。
Select Sname,2019-Sage
From Student;
例3.20 查询全体学生的姓名、出生年月和所在的院系,要求用小写字母表示系名。
Select Sname,2019-Sage,lower(Sdept)
From Student;
例3.21 查询选修了课程的学生学号。
Select distinct Sno
From SC;
例3.22 查询计算机科学系全体学生的名单。
Select Sname
From Student
Where Sdept=’CS’;
例3.23 查询所有年龄在20岁以下的学生姓名及其年龄。
Select Sname,Sage
From Student
Where Sage<20;
例3.24 查询考试成绩不及格的学生的学号。
Select distinct Sno
From SC
Where Grade<60;
例3.25 查询年龄在20-23岁之间的学生的姓名、系别和年龄。
Select Sname,Sdept,Sage
From Student
Where Sage between 20 and 23 ;
例3.26 查询年龄不在20-23岁之间的学生姓名、系别和年龄。
Select Sname,Sdept,Sage
From Student
Where Sage not between 20 and 23;
例3.27 查询计算机科学系、数学系和信息系学生的姓名和性别。
Select Sname,Ssex
From Student
Where Sdept in(‘CS’,’MA’,’IS’);
例3.28 查询既不是计算机科学系、数学系,也不是信息系的学生的姓名和性别。
Select Sname,Ssex
From Student
Where Sdept not in(‘CS’,’MA’,’IS’);
例3.29 查询学号为201215121的学生的详细情况。
Select *
From Student
Where Sno=’201215121’;
例3.30 查询所有姓刘的学生的姓名、学号和性别。
Select Sname,Sno,Ssex
From Student
Where Sname like ‘刘%’;
例3.31 查询姓“欧阳”且全名为三个汉字的学生的姓名。
Select Sname
From Student
Where Sname like ‘欧阳_’;
例3.32 查询名字中第二个字为“阳”的学生的姓名和学号。
Select Sname,Sno
From Student
Where Sname like ‘阳%’;
例3.33 查询所有不姓刘的学生的姓名、学号和性别。
Select Sname,Sno,Ssex
From Student
Where Sname not like ‘刘%’;
例3.34 查询DB_Design课程的课程号和学分。
Select Cno,Ccredit
From Course
Where Cname like ‘DB_Design’ escape ‘\’;
例3.35 查询以“DB
”开头,且倒数第三个字符为i的课程的详细情况。
Select *
From Course
Where Cname like ‘DB_%i__’ escape ’\’;
例3.36 某些学生选修课程后没有参加考试,所以有选课记录,但没有考试成绩。查询缺少成绩的学生的学号和相应的课程号。
Select Sno,Cno
From SC
Where Grade is null;
例3.37 查所有有成绩的学生学号和课程号。
Select Sno,Cno
From SC
Where Grade is not null;
例3.38 查询计算机科学系年龄在20岁以下的学生姓名。
Select Sname
From Student
Where Sdept=’CS’ and Sage<20;
例3.39查询选修了3号课程的学生的学号及其成绩,查询结果按分数的降序排列。
Select Sno,Grade
From SC
Where Cno=’3’
Order by Grade DESC;
例3.40 查询全体学生情况,查询结果按所在系的系号升序排列,同一系中的学生按年龄降序排列。
Select *
From Student
Order by Sdept,Sage DESC;
例3.41 查询学生总人数。
Select count()
From Student;
例3.42 查询选修了课程的学生人数。
Select count(distinct Sno)
From SC;
例3.43 计算选修1号课程的学生平均成绩。
Select avg(Grade)
From SC
Where Cno=’1’;
例3.44 查询选修1号课程的学生最高分数。
Select max(Grade)
From SC
Where Cno=’1’;
例3.45 查询学生201215012选修课程的总学分
Select sum(Ccredit)
From SC,Course
Where Sno=’201215012’ and SC.Cno=Course.Cno;
当聚集函数遇到空值时,除count(
)外,都跳过空值而只处理非空值。
聚集函数只用于select子句和group by 中的having子句。
例3.46 求各个课程号及相应的选课人数。
Select Cno,count(Sno)
From SC
Group by Cno;
例3.47 查询选修了三门以上课程的学生学号。
Select Sno
From SC
Group by Sno
Having count(*)>3;
Where子句作用于基本表或试图,从中选择满足条件的元组。Having短语作用于组,从中选择满足条件的组。
例3.48 查询平均成绩大于等于90分的学生学号和平均成绩。
Select Sno,avg(Grade)
From SC
Group by Sno
Having avg(Grade)>=90;

发布了38 篇原创文章 · 获赞 38 · 访问量 2736

猜你喜欢

转载自blog.csdn.net/l13kddd/article/details/104546083