数据库基础<三)标准语言SQL(二)

2014-11-24 10:16:07 · 作者: · 浏览: 1
空值 is null , is not null 多重条件(逻辑运算) and , or , not

\

\

字符匹配:

谓词 like 可以用来进行字符串的匹配,语法格式为:

[ not ] lile '<匹配串>' [ escape '<换码字符>' ]

其含义是查找指定的属性列值 与 <匹配串> 相匹配的元组。

<匹配串>可以是含有通配符 %(任意长度字符) 和 _ (任意单个字符)

实例:查询以 "DB_" 开头,且倒数第3个字符为 i 的课程的详细情况

select *
from course
where cname like 'DB\_%i__' escape '\';
这里的第一个 "_ " 前面有转码字符 \, 被转义为普通字符, escape '\' 表示 "\" 为转码字符

注意在 mysql 里,转码字符 \ 被写成 /

\

(3)order by 子句

用此子句对查询结果按照一个或多个属性列的升序(asc,缺省值)或降序(desc)排列。

\

(4)聚集函数

为增强检索功能,SQL 提供许多聚集函数,主要有:

count( [ distinct | all ] * ) 统计元组个数(distinct 表示去除重复值,缺省为 all)
count( [ distinct | all ] < 列名 > ) 统计一列中值的个数
sum( [ distinct | all ] < 列名 > ) 计算一列值的总和(此列必须是数值型)
avg( [ distinct | all ] < 列名 > ) 计算一列值的平均值(此列必须是数值型)
max( [ distinct | all ] < 列名 > ) 求一列值中的最大值
mix( [ distinct | all ] < 列名 > ) 求一列值中的最小值
\

(5)group by 子句

group by 子句将要查询结果按某一列或多列的值分组,值相等的为一组。

实例:对查询结果按 cno 的值分组,所有具有相同 cno 值的元组为一组,然后用 count 计算该组的人数

\

2、连接查询

若一个查询同时涉及两个以上的表,则称之为连接查询。

(1)等值与非等值连接查询

[ <表名 1> . ] < 列名 1 > < 比较运算符 > [ < 表名 2> . ] < 列名 2 >

其中比较运算符:等值连接: = , 非等值连接:> , < ,>= , <= , != , <> 等

也可以使用:

[ <表名 1> . ] < 列名 1 > between [ < 表名 2> . ] < 列名 2 > and [ < 表名 2> . ] < 列名 3 >

实例:查询 信息系 的年龄在21岁及以下的男生姓名及其年龄

\

\

(2)自身连接

连接操作不仅可以在两个表之间进行,也可以是一个表与其自己进行连接,称为表的自身连接。

实例:查询每一门课的间接先修课(即先修课的先修课)

在 course 中 cpno 为 该课程 cno 的先修课程,要查询先修课的先修课,必须对一门课找到

其先修课,再按此先修课的课程号,查找它的先修课程。为此要为 course 表取两个别名,first 和 second :

\

(3)外连接

在通常的连接操作中只有满足连接条件的元组才能作为结果输出,如下图,学生 小明没有选课,但仍想

把舍弃的 小明 元组保存在结果关系中,而在 sc 表的属性上填空值就需要使用外连接。

\

左连接:student 表包容 sc 表,左连接左表是全的,列出左边关系中所有元组, SQL 语句为:

select student.sno,sname,sex,deptno,sage,cno,grade
from student left out join sc on(student.sno=sc.sno);
/*也可以使用using来去掉重复值
from student left out join sc using(sno);*/ 

右连接:sc 表包容 student 表,右连接右表是全的,列出右边关系中所有元组

\

(4)内连接

student 与 sc 两表的交集, inner join 比 left join 快,内连接等价于:

select student.sno,sname,sex,deptno,sage,cno,grade
from student,sc where student.sno=sc.sno; 

\

(5)复合条件连接

where 子句中有多个连接条件称为复合条件连接

下面是一个多表复合条件连接实例:

\

3、嵌套查询

在 SQL 语言中,一个 select-from-where 语句称为一个查询块,将一个查询块嵌套在另一个查询块的 where 子句

或 having 短语的条件中的查询称为嵌套查询。

(1)带有 in 谓词的子查询

在嵌套查询中,子查询的结果往往是一个集合,使用 谓词 in 如下:

\

上例中,子查询的查询条件不依赖于父查询,称为不相关子查询。

(2)相关子查询

查找每个学生超过他选修课程平均成绩的课程号及成绩:

\

x 是 表 sc 的别名,又称元组变量,可以用来表示 sc 的一个元组。内层查询是求一个学生所有选修课课程

平均成绩的,至于是哪个学生的平均成绩要看参数 x.sno 的值,而该值是与父查询相关的,称为相关子查询。

(3)带有 any (some) 或 all 谓词的子查询

\

\

实例:查询其他系中比计算机科学与技术系所有学生年龄都小的学生姓名及年龄:

\

(4)带有 exists 谓词的子查询

exists 代表存在量词 ヨ,带有 exists 谓词的子查询不返回任何数据,只产生逻辑 true 或 逻辑 false。

由于没有全称量词,可以使用 两次 not exists 代替

实例:查询选修了张星老师开设的全部课程的学生姓名

\

4、集合查询

select 语句的查询结果是元组的集合,所以多个 select 语句的结果可以进行集合操作,包括并操作 union、

交操作 intersect 和差操作 except 。注意 参加集合操作的各查询结果的列数必须相同,对应项的数据类型也必须相同。

实例:查询系号为10以及年龄不大于21的学生,用集合查询,相当于下面的 or 语句,但前者是分别进行两次查询将结果取

并集,而后者是直接进行一次查询。注意: mysql 并不支持 intersect 和 except 集合操作。

\

6、视图

视图是从一个或几个基本表(或视图)导出的表,是一个虚表,数据库中只存放视图的定义,而不存放视图对应的数据。

视图就像一个窗口,透过它可以看到数据库中自己感兴趣的数据及其变化。其可以有基本表一样被查询、删除,但更新操作有一定的限制

1、建立视图

一般格式:

create view < 视图名 > [ ( < 列名 > [, < 列名> ] ... ) ]

as < 子查询 >

[ with check option ]

其中,子查询可以是任意复杂的 select 语句,但通常不允许包含 order by 子句和 distinct 短语,with check option 表示

对视图进行 update,insert 和 delete 操作时要保证更新、插入或删除的行满足视图定义中的谓词条件(即子查询中的条件表达式)

组成视图的属性列名或者全部省略或者全部指定,但在下列三种情况下必须明确指定组成视图的所有列名:

(1)某个目标列不是单纯的属性名,而是聚集函数或列表达式

(2)多表连接时选出了几个同名列作为视图的字段

(3)需要在视图中为某个列启用新的更合适的名字

视图不仅可以建立在一个或多个基本表上,也可以建立在一个或多个已定义好的视图上,或建立在视图与基本表上。

实例:建立 系号为 10 选修了 1 号课程学时的视图

建立 系号为 10 选修了 1 号课程且成绩在 90 分以上的学生的视图

\

2、查询视图

实例:查询选修了 1 号课程的 系号为 10 的学生

\

定义 is_student 视图时 加上了 with check option 子句,以后视图的增删时都会自动加上 deptno=10的条件

3、删除视图

格式为:

drop view < 视图名 > [ cascade ] ;

删除视