第 5章:结构化查询语言
1 SQL语言概述
2
3
4
数据定义数据操纵数据查询
SQL语言是由 IBM发明的。
1970年 IBM研究中心的 E.F.Codd博士提出了关系型的数据库模式,奠定了关系型数据库日后发展的理论基础,
并为此于 1981年荣获计算机科学界的最高荣誉奖 ACM图灵奖。
第 5.1节
1
SQL语言概述概念
SQL语言完成的功能,
数据定义( CREATE,DROP,ALTER )
数据操纵( INSERT,UPDATE,DELETE)
数据控制( GRANT,REVOKE)
数据查询( SELECT)
核心功能只用了 9个命令动词;而且语法也接近英语自然语法。
数据定义语言由 3个命令组成。
第 5.2节
2
数据定义理解定义表 (表结构设计 )
1) 定义表,Create Table表文件名
例如,定义一个名为,xs1.DBF”的数据库表:
create table xs1(学号 C(8),姓名 C(8),性别 C(2),出生日期 D,系别 C(10),贷款否 L,简历 M,照片 G
NULL)
注意字段名与类型之间必须要有空格隔开!
设置数据字典
对数据库表才有效,先打开或建立一个数据库才能设置:
有效性规则,check
信息,error
默认值,default
主关键字 (主索引 ),primary key
外部关键字,foreign key <> reference <父表名 >
有效性规则举例
若要设置性别字段的有效性规则,‘ 性别只能为男或女 ’,默认值,女,
将 性别 C(2)修改为
性别 C(2) check 性别 $’ 男女 ’ error?性别只能为男或女 ! ’ default?女 ’
主索引举例
可以为表设置主索引 (主关键字 )。
例:在 SQL语句的后面加上 primary key
学号 tag xh,相当于表设计器里面的
“索引”选项卡;
或者是在“学号 c(8)”后面加上 primary
key,相当于表设计器里的“字段”方式。
修改表结构 (1)
ALTER Table 表文件名
字段的修改 alter;
添加 add; +要操作的字段名
删除 drop
修改字段举例
例如,在,xs1”表中删除一个字段:性别
alter table xs1 drop 性别
在,xs1”表中添加刚才删去的字段:
alter table xs1 add 性别 C(2) ;
check 性别 $’男女’ ;
error’性别只能为男或女!’ default ‘女’
修改表结构 (2)
将新添加的字段宽度修改为 (5,1)
ALTER TABLE xs1 ALTER 入学成绩 N(5,1)
Column:列,字段,是可选项,写在要添加 /修改 /删除的字段名前
注:作为主关键字的字段不能被删除,但可以在删除主索引 drop primary key后删除。
设置有效性规则,set
例:设置,入学成绩,字段的有效性规则:成绩在 0到 750分之间
alter xs1 alter 入学成绩 set check 入学成绩
>=0 and 入学成绩 <=750
也可以用修改字段 alter来完成 。
alter xs1 alter 入学成绩 N(5,1) check 入学成绩
>=0 and 入学成绩 <=750
这时候是修改字段。因此字段名,类型和长度不能省略。
有效性规则
删除,成绩 1” 表中平时成绩字段的有效性规则:
ALTER TABLE 成绩 1 ALTER 平时 ;
成绩 DROP CHECK
将平时成绩字段的默认值设置为 80:
ALTER TABLE 成绩 1 ALTER 平时 ;
成绩 SET DEFAULT 80
表结构修改举例 (1)
例:将“学生 1”表中的“学号”字段更名为
“学生证编号“
ALTER TABLE 学生 1 RENAME COLUMN;
学号 TO 学生证编号
对,学生 1” 表中的,姓名,和,出生日期,字段建立主索引
ALTER TABLE 学生 1
ADD PRIMARY KEY 姓名 +DTOC(出生日 ;
期 ) TAG 姓名 _生日表结构修改举例 (2)
通过设置外部关键字 (add)来建立表间永久关联:
将 xs1表与 student表建立永久关联,xs1的学号为外部关键字
alter table xs1 add foreign key 学号 tag xh
reference 学生
删除表,DROP Table表文件名
例如,删除,学生 1” 表
DROP TABLE 学生 1
第 5.3节
3
数据操纵理解数据操纵 (表记录输入 )
注意,SQL语句里的条件子句是用 where
表记录的插入 insert
删除 delete
更新 update
例如,向,学生 1” 表中添加记录:
INSERT INTO 学生 1(学号,姓名 )
VALUES(“01020315”,”李兰” )
表记录的更新 update(1)
将入学成绩全部修改为原来的 20%
VFP命令,replace all
SQL语句 (默认全部 ),update xs1 set 入学成绩 =入学成绩 *0.2
表记录的更新 update(2)
若只要求修改 当前记录,
VFP命令,replace
SQL语句:
1)查处当前记录号 x=recno()
2)更新记录内容,update xs1 set 入学成绩 =入学成绩 *0.2 where recno()=x
第 5.4节
4
数据查询掌握数据查询
数据查询是 SQL语言的核心,也称作 SQL-
Select命令。
使用 SQL-SELECT命令,可以对数据源进行各种组合,有效地筛选记录、管理数据、并对结果排序及指定输出去向等,无论查询多么复杂,
其内容只有一条 SELECT语句。
SQL-SELECT 命令可以进行多个查询块的嵌套查询,以完成更复杂的查询任务。
1,基本查询
Select…… From…… Where……
select后面接字段或表达式,多个字段之间用逗号隔开。
Select子句:指定在查询结果中包含的字段,常量或表达式。
基本查询
例如,从,学生,表中查询所有男生的学号,姓名和出生日期:
SELECT 学号,姓名,出生日期 FROM 学生 WHERE 性别 =,男,
问:如果想只显示不重复的性别该怎么做? (distinct)
From指定数据来源
若查询来自多个表,则表文件名之间用逗号隔开。在需要的时候,还可以给表起别名。
例:查询所有学生姓名及相关的成绩和课程信息?
Select 姓名,成绩,课程名 From 学生,
成绩,课程 where ……
2.带特殊运算符的条件查询
在 WHERE 子句所带的筛选条件表达式中可以 使 用 一 些 特 殊 运 算 符,如 IN、
BETWEEN… AND…,LIKE 。
例如,查询成绩良好 ( 75~ 85分 ) 的学生和课程信息:
SELECT * FROM 成绩 WHERE 成绩
BETWEEN 75 AND 85
3,排序查询
使用 ORDER BY子句,可以对查询结果按升序 ( ASC) 或降序 ( DESC) 排列 。
例如,按课程号输出学生的各科成绩,
同一门课按成绩降序排列:
SELECT * FROM 成绩 ORDER BY 课程号,成绩 DESC
4.计算与分组查询
使用 GROUP BY 子句可以实现分组查询,通常与计算查询(如计数、求和、求平均值等)
结合使用,先按指定的数据项分组,再对各组汇总计算。
例如,查询各门课程的平均成绩:
SELECT 课程号,AVG(成绩 ) AS 平均成绩
FROM 成绩 GROUP BY 课程号
Group by
分组:和统计类函数合用。
查询男生和女生的平均年龄,人数
Select 性别,avg(year(date())-;
year(出生日期 )),cnt(学号 ) ;
from 学生 group by 性别
Group by
以专业为单位统计学生的平均年龄,人数?
Select 专业,avg(year(date())-;
year(出生日期 )),cnt(学号 ) ;
from 学生 group by 专业
having
问:统计专业人数在 3人以上的各专业的学生的平均成绩和专业人数? (条件 )
错误,where cnt(学号 )>3
解释,where后面接的条件是对已经存在的字段或非统计类表达式设定的,若要求对统计类函数写条件,用 having。
正确,having cnt(学号 )>3
5,多表查询
多表查询时,表和表之间必须有联接关系,在
WHERE子句中可以指定表间的联接关系 。
其格式为:
<表名 1>.<字段名 1> = <表名 2>.<字段名 2> 或
<别名 1>.<字段名 1> = <别名 2>.<字段名 2>
多表查询
例:查询所有学生姓名及相关的成绩和课程信息?
Select 姓名,成绩,课程名 From 学生,
成绩,课程 where ……
问:这时候的查询是否有条件呢?
多表查询时:一定要有条件,即表之间的关系 (至少有一个字段相关 )。
多表查询条件
Where学生,学号 =成绩,学号 and 成绩,
课程号 =课程,课程号
如果多表查询中还包含其他条件,则在
where子句之后再加上 and…… 。
别名
在这种情况下,可以给表起别名。
Select xs.学号,cj.课程号,成绩 ;
from学生 as xs,成绩 as cj,课程 ;
where xs.学号 =cj.学号 ;
and cj.课程号 =课程,课程号
在 from子句中取别名,可以简化 select
子句和 where子句中对表文件名的引用。
多表查询
如果要求显示学号,课程号和成绩?
错误,select 学号,课程号,成绩
出错原因,学号 和 课程号 不唯一,因为同时有两个表具有学号字段或课程号字段!!
更正:对具有歧义的字段名加以限制。
上例中:学号?学生,学号 或 成绩,学号
课程号 做类似修改。
多表查询举例
例如,查询各门课程的平均成绩,要求输出课程名和成绩信息:
SELECT 课程名,AVG(成绩 ) AS 平均成绩 ;
FROM 课程 KC,成绩 CJ ;
WHERE KC.课程号 = CJ.课程号 ;
GROUP BY CJ.课程号