-
SQL概述
SQL概述
SQL的内容在笔试和上机考试中均占到大约30%的比例,此外它还是查询和视图的基础,因此是学习的重点也是难点。SQL是结构化查询语言Structure Query Language的缩写。
SQL包含了查询功能、数据定义、数据操纵和数据控制功能,在VFP中没有提供数据控制功能。
SQL主要特点
- SQL是一种一体化语言。
- SQL是一种高度非过程化的语言。
- SQL语言非常简洁。
- SQL语言可直接以命令方式交互使用,也可嵌入到程序设计语言中以程序方式使用。
查询功能
SELECT命令的特点:- 可以自动打开数据库、表文件加以查询,而不需要事先用OPEN DATABASE或USE命令打开。
- 可以直接选取数据表中的数据,而不需要事先用SET RELATION命令建立关联。
- 当需要的索引文件不存在时,会自动建立暂存索引文件,以支持快速搜索技术(Rushmore)来查询。
- 其查询结果可输出到文件、表、屏幕或报表上,还可以转换成统计图表。
命令格式:SELECT —— FROM —— WHERE
可与 LIST FIELDS—— FOR —— 对照学习。关系操作:投影,选择,联接。
说明:功能强大,语法灵活;要处理的数据表无须事先打开,通过FROM子句指明并打开。
- SELECT 短语:说明要查询的数据;对应的关系操作为投影,类似于FIELDS子句。
- FROM 短语:说明要查询的数据来自哪个或哪些表,可对单个表或多个表进行查询;
- WHERE 短语:说明查询条件;对应的关系操作为选择,类似于FOR子句。如是多表查询还可能过该子句指明联接条件,进行联接。
- GROUP BY 短语:用于对查询结果进行分组,可利用它进行分组汇总;类似于TOTAL命令。
- HAVING 短语:跟随GROUP BY 使用,它用来限定分组必须满足的条件;
- ORDER BY 短语:用于对查询的结果进行排序;类似于SORT命令。
示例数据库:
学生管理,包括三个表:学生,课程,选课(通过该表反映“学生”与“课程”之间“多对多”的联系。问题:请同学们分别指出三个表的主关键字。
一、简单查询
简单查询基于单个表。例:
1.查询学生信息
SELE * FROM 学生 &&“*”号代表所有列。
类似于:
USE 学生
LIST
2.查询男生学生的学号、姓名及生日
SELE 学号,姓名,生日 FROM 学生 WHERE 性别=”男”
类似于
USE 学生
LIST学号,姓名,生日 FOR性别=”男”
3.查询学分大于5的课程的信息
SELE * FROM 课程 WHERE 学分>5
类似于
USE 学生
LIST FOR 学分>5
4、查询学分不在6到9之间的
Sele * from 课程 where 学分 not between 6 and 9
二、简单联接查询
联接是关系的基本操作之一,联接查询基于多个关系的查询。例:查询男生学生的选课信息,包括姓名,学号及成绩。
分析:本例的查询结果包括两个表“学生”与“选课”的属性,适用于联接查询。
SELE 姓名,选课.学号,成绩;
FROM 学生,选课;
WHERE 学生.学号=选课.学号AND 性别=”男”
说明:如果命令太长一行写不下可在行末加分号“:”表续行
选课.学号: 因为两个表中均有“学号”字段,所以必须指明所属表。
学生.学号=选课.学号:连接条件。
还可使用如下SQL语句:
SELE 姓名,选课.学号,成绩;
FROM 学生 JOIN 选课 ON 学生.学号=选课.学号;
WHERE 性别=”男”
说明:
JOIN ……ON :建立表与表之间的联接。
自连接:sele S.雇员姓名,"领导",E.雇员姓名 from 雇员 S,雇员 E where S.雇员号=E.经理
三、嵌套查询
嵌套查询是另一类基于多个关系的查询,此类查询所要求的结果出自一个关系,但相关的条件却涉及多个关系。1、例:查询女生学生选课信息,包括学号,课程号,成绩。
SELE *;
FROM 选课;
WHERE 学号 IN (SELE 学号 FROM 学生 WHERE 性别=”女”)
说明:
IN:相当于集合运算符∈。
还可使用如下SQL语句:简单联接查询
SELE 选课.学号,课程号,成绩;
FROM 选课 JOIN 学生 ON 选课.学号=学生.学号;
WHERE 性别=”女”
2、查询有“硬盘”订购需求的订购单明细记录:这个例子要求查询订购单明细表中的记录,而查询条件是产品标的名称,
Sele * from 订购单明细 where 产品号 IN;
(sele 产品号 from 产品 where 名称=“硬盘”)
3、排除法查询的例子:
查询所有订购数量(即订购单中每个订购项目的数量)都在50以上的订购单的信息
Sele * from 订购单 where 订单号 not in;
(sele 订单号 from 订购单明细 where 数量〈=50)
Sele * from 订购单 where 订单号 not in;
(sele 订单号 from 订购单明细 where 数量〈=50) and 订单号 in (sele 订单号 from 订购单明细)
4、找出和某某产品同等价位的所有产品信息:内外层查询的同一个表,内层查询查处单价,外层查询根据这个单价查询产品信息
Sele * from 产品 where 单价=;
(sele 单价 from 产品 where 规格说明=“某某产品”)
5、内外层互相查询嵌套查询
四、特殊运算符
- BETWEEN … AND … 意为“…和…之间”
SELE * FROM 选课 WHERE 成绩 BETWEEN 80 AND 90
等价于:
SELE * FROM 选课 WHERE 成绩>=80 AND 成绩<=90
例:查询成绩不在80分到90分之间的选课信息。
SELE * FROM 选课 WHERE 成绩 NOT BETWEEN 80 AND 90
- LIKE 是字符串匹配运算符,通配符“%”表示0个或多个字符,“_”表示一个字符。
例:从学生关系中查询姓“黄”的学生信息。
SELE * FROM 学生 WHERE 姓名 LIKE “黄%”
不能写成:
SELE * FROM 学生 WHERE 姓名="黄%"
例:从学生关系中查询不姓“黄”的学生信息。
SELE * FROM 学生 WHERE 姓名 NOT LIKE “黄%”
例:
SELE * FROM 学生 WHERE 姓名 LIKE "黄_"
SELE * FROM 学生 WHERE 姓名 LIKE "黄__"
五、排序
SQL SELECT 可将查询结果排序。排序的短语格式如下:ORDER BY Order_Item [ASC|DESC][, Order_Item [ASC|DESC]…]
说明:可按升序或降序排序,允许按一列或多列排序。
例:按学分进行升序查询课程信息。
SELE * FROM 课程 ORDER BY 学分 ASC
例:先按学分进行升序排序,学分相同的再按课程名进行降序排序并输出全部课程信息。
SELE * FROM 课程 ORDER BY 学分,课程名 DESC
注:ORDER BY 对最终的查询(外查询)结果进行排序,不能在子查询(内查询)中使用此短语。
六、简单计算查询
SQL不但具有一般的检索能力,而且还有计算方式的检索。用于计算检索的函数有:- COUNT(*):计数
- SUM():求和
- AVG():算平均值
- MAX():求最大值
- MIN():求最小值
例:查询学号为“03”的学生选修课程的考试成绩总分和平均分。
SELE SUM(成绩),AVG(成绩) FROM 选课 WHERE 学号=”03”
SELE SUM(成绩) 总分,AVG(成绩) 平均分 FROM 选课 WHERE 学号=”03”
SELE 姓名,SUM(成绩) AS 总分,AVG(成绩) AS 平均分;
FROM 学生 JOIN 选课 ON 学生.学号=选课.学号;
WHERE 学生.学号=”03”
七、分组与计算查询
利用GROUP BY 子句进行分组计算查询使用得更加广泛。GROUP BY短语格式如下:GROUP BY GroupColumn[,GroupColunm…][HAVING FilterCondition]
说明:
- 可按一列或多列分组,还可以用HAVING进一步限定分组的条件。
- GROUP BY子句一般跟在WHERE子句之后,没有WHERE子句时,跟在FROM子句之后;HAVING子句必须跟在GROUP BY 之后,不能单独使用。在查询中是先用WHERE子句限定元组,然后进行分组,最后再用HAVING子句限定分组。
SELE 学号,AVG(成绩) FROM 选课 GROUP BY 学号
说明:在此查询中,选按学号属性进行分组,然后再计算每个学号的平均成绩。
例:在选课表中求每个选课门数为4门的学生的总分和平均分。
SELE 学号,SUM(成绩) AS 总分,AVG(成绩) AS 平均分;
FROM 选课;
GROUP BY 学号 HAVING COUNT(*)=4
SELE 姓名,SUM(成绩) AS 总分,AVG(成绩) AS 平均分;
FROM 学生 JOIN 选课 ON 学生.学号=选课.学号;
WHERE 性别=”女”;
GROUP BY 选课.学号 HAVING COUNT(*)=4
例:求平均成绩在80分以上的各课程的课程号与平均成绩。
SELE 课程号,AVG(成绩) FROM 选课;
GROUP BY 课程号 HAVING AVG(成绩)>80
八、使用空值进行查询
空值的概念:空值就是缺值或还没有确定值,不能把它理解为任何意义的数据。比如表示价格的一个字段值,空值表示没有定价,而数值0可能表示免费。空值与空(或空白)字符串、数值0等具有不同的含义。
例:假设在选课中有些学生某门课程还没有考试,则成绩为空。试找出尚未考试的选课信息。
SELE * FROM 选课 WHERE 成绩 IS NULL
注:不能写成“=NULL”
例:试找出成绩不为空的选课信息。
SELE * FROM 选课 WHERE 成绩 IS NOT NULL
九、别名与自联接查询
在联接操作中,要使用关系名作前缀,为简单起见,SQL允许在FROM短语中为关系名定义别名。格式为:<关系名><别名>例:查询选课信息中的姓名,课程名,成绩。
SELE 姓名,课程名,成绩;
FROM 学生 S,课程 C,选课 SC;
WHERE S.学号=SC.学号 AND C.课程号=SC.课程号
说明:在上面的例子中,别名并不是必须的,但是在关系的自联接操作中,别名则是必不可少的。SQL不仅可以对多个关系实行联接操作,也可将同一关系与其自身进行联接,这种联接就称为自联接。在这种自联接操作关系上,本质上存在着一种特殊的递归联系,也就是关系中的一些元组,根据出自同一值域的两个不同的属性,可以与另外一些元组有一种对应关系(一对多的联系)。注:元组即记录。
例:试查询先修课的课程名
在本例中,先修课号与课程号出自同一值域,会涉及自联接查询。
SELE DISTINCT C2.先修课号 C1.课程名;
FROM 课程 C1,课程 C2;
WHERE C1.课程号=C2.先修课号
十、内外层相关嵌套查询
前面讨论的嵌套查询是外层查询依赖于内层查询的结果,而内层查询与外层查询无关。但有时也需要内、外层互相关的查询,这时内层查询的条件需要外层查询提供值,而外层查询的条件需要内层查询的结果。例:查询只有一个学生选修的课程的学号,课程号及成绩。
SELE *;
FROM 选课 SC1;
WHERE SC1.课程号 NOT IN;
(SELE 课程号 FROM 选课 SC2 WHERE SC1.学号<>SC2.学号)
SELE * FROM 选课 SC1;
WHERE NOT EXIST (SELE * FROM 选课 SC2 ;
WHERE SC1.学号<>SC2.学号 AND SC2.课程号=SC1.课程号)
十一、用量词和谓词的查询
前面已学过[NOT] IN运算符,此处还有两种与子查询相关的运算符。格式1:<表达式><比较运算符>[ANY|ALL|SOME](子查询)
格式2:[NOT] EXISTS (子查询)
说明:
1.ANY、ALL和SOME为量词,ANY和SOME是同义词,在进行比较运算时只要子查询中有一行能使结果为真,则结果为真;ALL则要求子查询中的所有行都使结果为真时,结果才为真。
2.EXISTS为谓词,EXISTS和NOT EXISTS是用来检查在子查询中是否有结果返回,也就是存在元组或不存在元组。
例:查询选修有课程的学生的学号,姓名,性别及生日。(看懂)
SELE * FROM 学生 WHERE EXIST (SELE * FROM 选课 WHERE 学生.学号=选课.学号)
注:本例中内层查询引用了外层查询的表,只有这样使用谓词EXISTS或NOT EXISTS才有意义。
例:确定哪些客户目前没有订购单:这里的查询是客户没有订购单子记录或不存在订购单子记录
Sele * from 客户 where not exists ;
(sele * from 订购单 where 客户号=客户.客户号) :此查询等价于 sele * from 客户 where 客户号 not in(sele 客户号 from 订购单)
例:查询学分最高的课程信息。
SELE * FROM 课程 WHERE 学分>=ALL (SELE 学分 FROM 课程)
SELE * FROM 课程 WHERE NOT 学分<ANY (SELE 学分 FROM 课程)
SELE * FROM 课程 WHERE NOT 学分<SOME (SELE 学分 FROM 课程)
SELE * FROM 课程 WHERE 学分=(SELE MAX(学分) FROM 课程)
例:查询学分不是最高的课程信息。
SELE * FROM 课程 WHERE 学分<ANY (SELE 学分 FROM 课程)
SELE * FROM 课程 WHERE 学分<SOME (SELE 学分 FROM 课程)
十二、超联接查询
在两个表的超联接查询中,首先保证一个表中满足条件的元组都在结果中,然后将满足联接条件的元组与另一个表中的元组进行联接,不满足联接条件的则将应来自另一表的属性置为空值。语法:SELE ……
FROM Talbel INNER|LEFT|RIGHT|FULL JOIN Table
ON Join Condition
WHERE … …
说明:
- INNER JOIN:等价于JOIN,为普通联接。
- ON Join Condition:用于指定联接条件。
SELE 姓名,课程号,成绩 FROM 学生 JOIN 选课 ON 学生.学号=选课.学号
SELE 姓名,课程号,成绩 FROM 学生 LEFT JOIN 选课 ON 学生.学号=选课.学号
SELE 姓名,课程号,成绩 FROM 学生 RIGHT JOIN 选课 ON 学生.学号=选课.学号
SELE 姓名,课程号,成绩 FROM 学生 FULL JOIN 选课 ON 学生.学号=选课.学号
十三、集合并运算
可将两个SELECT语句的查询结果通过并运算合并成一个查询结果。为进行并运算,要求两个查询结果具有相同的字段个数,并且对应字段的值要出自同一值域,也就是具有相同的数据类型和取值范围。例:查询学号为01与02的选课信息。
SELE * FROM 选课 WHERE 学号=”01”;
UNION;
SELE * FROM 选课 WHERE 学号=”02”
十四、VFP中有关SQL SELECT的几个特殊选项
- 显示部分结果
功能:只需要满足条件的前几个记录。
说明:
- n是1至32767之间的整数,说明显示前几个记录。
- 当使用PERCENT时,说明显示结果中前百分之几的记录。
SELE * TOP 2 FROM 课程 ORDER BY 学分 DESC &&通常与ORDER BY子句连用
- 将结果存放在数组中
- 将结果存放在临时文件中
说明:临时表中一个只读的DBF文件,当查询结束后该临时文件是当前文件,可像一般的DBF文件一样使用,当关闭文件时该文件将自动删除。
- 将结果存放在永久表中,通过该子句可实现表的复制。
- 将结果存放到文本文件中
- 将结果直接输出到打印机
习题:P131/ 2 P132/ 4,5,6
最新更新
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
Python初学者友好丨详解参数传递类型
如何有效管理爬虫流量?
SQL SERVER中递归
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
这是目前我见过最好的跨域解决方案!
减少回流与重绘
减少回流与重绘
如何使用KrpanoToolJS在浏览器切图
performance.now() 与 Date.now() 对比
一款纯 JS 实现的轻量化图片编辑器
关于开发 VS Code 插件遇到的 workbench.scm.
前端设计模式——观察者模式
前端设计模式——中介者模式
创建型-原型模式