结构化查询语言SQL 2.docx

上传人:b****5 文档编号:8575721 上传时间:2023-01-31 格式:DOCX 页数:14 大小:30.26KB
下载 相关 举报
结构化查询语言SQL 2.docx_第1页
第1页 / 共14页
结构化查询语言SQL 2.docx_第2页
第2页 / 共14页
结构化查询语言SQL 2.docx_第3页
第3页 / 共14页
结构化查询语言SQL 2.docx_第4页
第4页 / 共14页
结构化查询语言SQL 2.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

结构化查询语言SQL 2.docx

《结构化查询语言SQL 2.docx》由会员分享,可在线阅读,更多相关《结构化查询语言SQL 2.docx(14页珍藏版)》请在冰豆网上搜索。

结构化查询语言SQL 2.docx

结构化查询语言SQL2

结构化查询语言(SQL)

SQL概述

SQL的内容在笔试和上机考试中均占到大约30%的比例,此外它还是查询和视图的基础,因此是学习的重点也是难点。

SQL是结构化查询语言StructureQueryLanguage的缩写。

SQL包含了查询功能、数据定义、数据操纵和数据控制功能,在VFP中没有提供数据控制功能。

SQL主要特点

1.SQL是一种一体化语言。

2.SQL是一种高度非过程化的语言。

3.SQL语言非常简洁。

4.SQL语言可直接以命令方式交互使用,也可嵌入到程序设计语言中以程序方式使用。

查询功能

SELECT命令的特点:

1.可以自动打开数据库、表文件加以查询,而不需要事先用OPENDATABASE或USE命令打开。

2.可以直接选取数据表中的数据,而不需要事先用SETRELATION命令建立关联。

3.当需要的索引文件不存在时,会自动建立暂存索引文件,以支持快速搜索技术(Rushmore)来查询。

4.其查询结果可输出到文件、表、屏幕或报表上,还可以转换成统计图表。

命令格式:

SELECT——FROM——WHERE(三段论)

可与LISTFIELDS——FOR——对照学习。

关系操作:

投影,选择,联接。

说明:

功能强大,语法灵活;要处理的数据表无须事先打开,通过FROM子句指明并打开。

1.SELECT(起投影作用)短语:

说明要查询的数据;对应的关系操作为投影,类似于FIELDS子句。

2.FROM(表)短语:

说明要查询的数据来自哪个或哪些表,可对单个表或多个表进行查询;

3.WHERE(选择)短语:

说明查询条件;对应的关系操作为选择,类似于FOR子句。

如是多表查询还可能过该子句指明联接条件,进行联接。

4.GROUPBY(分组)短语:

用于对查询结果进行分组,可利用它进行分组汇总;类似于TOTAL命令。

5.HAVING(group的子句)短语:

跟随GROUPBY使用,它用来限定分组必须满足的条件;

6.ORDERBY短语:

用于对查询的结果进行排序;类似于SORT命令。

示例数据库:

学生管理,包括三个表:

学生,课程,选课(通过该表反映“学生”与“课程”之间“多对多”的联系。

问题:

请同学们分别指出三个表的主关键字。

一、简单查询

简单查询基于单个表。

例:

1.查询学生信息

SELE*FROM学生&&“*”号代表所有列。

类似于:

USE学生

LIST

2.查询男生学生的学号、姓名及生日

SELE学号,姓名,生日FROM学生WHERE性别=”男”

类似于

USE学生

LIST学号,姓名,生日FOR性别=”男”

3.查询学分大于5的课程的信息

SELE*FROM课程WHERE学分>5

类似于

USE学生

LISTFOR学分>5

4、查询学分不在6到9之间的

Sele*from课程where学分notbetween6and9

二、简单联接查询

联接是关系的基本操作之一,联接查询基于多个关系的查询。

例:

查询男生学生的选课信息,包括姓名,学号及成绩。

分析:

本例的查询结果包括两个表“学生”与“选课”的属性,适用于联接查询。

主表的主键等于从表的外键

SELE姓名,选课.学号,成绩;

FROM学生,选课;

WHERE学生.学号=选课.学号AND性别=”男”

说明:

如果命令太长一行写不下可在行末加分号“:

”表续行

选课.学号:

因为两个表中均有“学号”字段,所以必须指明所属表。

学生.学号=选课.学号:

连接条件。

还可使用如下SQL语句:

SELE姓名,选课.学号,成绩;

FROM学生JOIN选课ON学生.学号=选课.学号;

WHERE性别=”男”

说明:

JOIN……ON:

建立表与表之间的联接。

Innerjoin=leftjoin

看到这儿了~

自连接:

seleS.雇员姓名,"领导",E.雇员姓名from雇员S,雇员EwhereS.雇员号=E.经理

三、嵌套查询

嵌套查询是另一类基于多个关系的查询,此类查询所要求的结果出自一个关系,但相关的条件却涉及多个关系。

1、例:

查询女生学生选课信息,包括学号,课程号,成绩。

SELE*;

FROM选课;

WHERE学号IN(SELE学号FROM学生WHERE性别=”女”)

说明:

IN:

相当于集合运算符∈。

还可使用如下SQL语句:

简单联接查询

SELE选课.学号,课程号,成绩;

FROM选课JOIN学生ON选课.学号=学生.学号;

WHERE性别=”女”

有同学有三门课,其中有一个是null值,不能选出来!

如何做?

2、查询有“硬盘”订购需求的订购单明细记录:

这个例子要求查询订购单明细表中的记录,而查询条件是产品标的名称,

Sele*from订购单明细where产品号IN;

(sele产品号from产品where名称=“硬盘”)

3、排除法查询的例子:

查询所有订购数量(即订购单中每个订购项目的数量)都在50以上的订购单的信息

Sele*from订购单where订单号notin;

(sele订单号from订购单明细where数量〈=50)

Sele*from订购单where订单号notin;

(sele订单号from订购单明细where数量〈=50)and订单号in(sele订单号from订购单明细)

4、找出和某某产品同等价位的所有产品信息:

内外层查询的同一个表,内层查询查处单价,外层查询根据这个单价查询产品信息

Sele*from产品where单价=;

(sele单价from产品where规格说明=“某某产品”)

5、内外层互相查询嵌套查询

四、特殊运算符

1.BETWEEN…AND…意为“…和…之间”

例:

查询成绩在80分到90分之间的选课信息。

SELE*FROM选课WHERE成绩BETWEEN80AND90

等价于:

SELE*FROM选课WHERE成绩>=80AND成绩<=90

例:

查询成绩不在80分到90分之间的选课信息。

SELE*FROM选课WHERE成绩NOTBETWEEN80AND90

2.LIKE是字符串匹配运算符,通配符“%”表示0个或多个字符,“_”表示一个字符。

注意:

不是“*”和“?

”,不正确!

例:

从学生关系中查询姓“黄”的学生信息。

SELE*FROM学生WHERE姓名LIKE“黄%”

不能写成:

SELE*FROM学生WHERE姓名="黄%"

例:

从学生关系中查询不姓“黄”的学生信息。

SELE*FROM学生WHERE姓名NOTLIKE“黄%”

例:

SELE*FROM学生WHERE姓名LIKE"黄_"

SELE*FROM学生WHERE姓名LIKE"黄__"

五、排序

SQLSELECT可将查询结果排序。

排序的短语格式如下:

ORDERBYOrder_Item[ASC|DESC][,Order_Item[ASC|DESC]…]

说明:

可按升序或降序排序,允许按一列或多列排序。

例:

按学分进行升序查询课程信息。

SELE*FROM课程ORDERBY学分ASC

例:

先按学分进行升序排序,学分相同的再按课程名进行降序排序并输出全部课程信息。

SELE*FROM课程ORDERBY学分,课程名DESC

注:

ORDERBY对最终的查询结果进行排序,不能在子查询中使用此短语。

六、简单计算查询

SQL不但具有一般的检索能力,而且还有计算方式的检索。

用于计算检索的函数有:

1.COUNT(*):

计数

2.

SUM():

求和

3.AVG():

算平均值

4.MAX():

求最大值

5.MIN():

求最小值

上面的函数可用在SELECT短语中对查询结果进行计算。

例:

查询学号为“03”的学生选修课程的考试成绩总分和平均分。

1、SELESUM(成绩),AVG(成绩)FROM选课WHERE学号=”03”

2、SELESUM(成绩)总分,AVG(成绩)平均分FROM选课WHERE学号=”03”

3、SELE姓名,SUM(成绩)AS总分,AVG(成绩)AS平均分;

FROM学生JOIN选课ON学生.学号=选课.学号;

WHERE学生.学号=”03”

七、分组与计算查询

利用GROUPBY子句进行分组计算查询使用得更加广泛。

GROUPBY短语格式如下:

GROUPBYGroupColumn[,GroupColunm…][HAVINGFilterCondition]

说明:

1.可按一列或多列分组,还可以用HAVING进一步限定分组的条件。

2.GROUPBY子句一般跟在WHERE子句之后,没有WHERE子句时,跟在FROM子句之后;HAVING子句必须跟在GROUPBY之后,不能单独使用。

在查询中是先用WHERE子句限定元组,然后进行分组,最后再用HAVING子句限定分组。

例:

求每个学生选课的考试成绩平均分。

SELE学号,AVG(成绩)FROM选课GROUPBY学号

说明:

在此查询中,选按学号属性进行分组,然后再计算每个学号的平均成绩。

例:

在选课表中求每个选课门数为4门的学生的总分和平均分。

1、SELE学号,SUM(成绩)AS总分,AVG(成绩)AS平均分;

FROM选课;

GROUPBY学号HAVINGCOUNT(*)=4

2、SELE姓名,SUM(成绩)AS总分,AVG(成绩)AS平均分;

FROM学生JOIN选课ON学生.学号=选课.学号;

WHERE性别=”女”;

GROUPBY选课.学号HAVINGCOUNT(*)=4

例:

求平均成绩在80分以上的各课程的课程号与平均成绩。

SELE课程号,AVG(成绩)FROM选课;

GROUPBY课程号HAVINGAVG(成绩)>80

八、使用空值进行查询

空值的概念:

空值就是缺值或还没有确定值,不能把它理解为任何意义的数据。

比如表示价格的一个字段值,空值表示没有定价,而数值0可能表示免费。

空值与空(或空白)字符串、数值0等具有不同的含义。

例:

假设在选课中有些学生某门课程还没有考试,则成绩为空。

试找出尚未考试的选课信息。

SELE*FROM选课WHERE成绩ISNULL

注:

不能写成“=NULL”

例:

试找出成绩不为空的选课信息。

SELE*FROM选课WHERE成绩ISNOTNULL

九、别名与自联接查询

在联接操作中,要使用关系名作前缀,为简单起见,SQL允许在FROM短语中为关系名定义别名。

格式为:

<关系名><别名>

例:

查询选课信息中的姓名,课程名,成绩。

SELE姓名,课程名,成绩;

FROM学生S,课程C,选课SC;

WHERES.学号=SC.学号ANDC.课程号=SC.课程号

说明:

在上面的例子中,别名并不是必须的,但是在关系的自联接操作中,别名则是必不可少的。

SQL不仅可以对多个关系实行联接操作,也可将同一关系与其自身进行联接,这种联接就称为自联接。

在这种自联接操作关系上,本质上存在着一种特殊的递归联系,也就是关系中的一些元组,根据出自同一值域的两个不同的属性,可以与另外一些元组有一种对应关系(一对多的联系)。

注:

元组即记录。

例:

试查询先修课的课程名

在本例中,先修课号与课程号出自同一值域,会涉及自联接查询。

SELEDISTINCTC2.先修课号C1.课程名;

FROM课程C1,课程C2;

WHEREC1.课程号=C2.先修课号

十、内外层相关嵌套查询

前面讨论的嵌套查询是外层查询依赖于内层查询的结果,而内层查询与外层查询无关。

但有时也需要内、外层互相关的查询,这时内层查询的条件需要外层查询提供值,而外层查询的条件需要内层查询的结果。

例:

查询只有一个学生选修的课程的学号,课程号及成绩。

SELE*;

FROM选课SC1;

WHERESC1.课程号NOTIN;

(SELE课程号FROM选课SC2WHERESC1.学号<>SC2.学号)

SELE*FROM选课SC1;

WHERENOTEXIST(SELE*FROM选课SC2;

WHERESC1.学号<>SC2.学号ANDSC2.课程号=SC1.课程号)

十一、用量词和谓词的查询

前面已学过[NOT]IN运算符,此处还有两种与子查询相关的运算符。

格式1:

<表达式><比较运算符>[ANY|ALL|SOME](子查询)

格式2:

[NOT]EXISTS(子查询)

说明:

1.ANY、ALL和SOME为量词

ANY和SOME是同义词(完全一样),在进行比较运算时只要子查询中有一行能使结果为真,则结果为真;

ALL则要求子查询中的所有行都使结果为真时,结果才为真。

2.EXISTS为谓词,EXISTS和NOTEXISTS是用来检查在子查询中是否有结果返回,也就是存在元组或不存在元组。

例:

查询选修有课程的学生的学号,姓名,性别及生日。

SELE*FROM学生WHEREEXIST(SELE*FROM选课WHERE学生.学号=选课.学号)

注:

本例中内层查询引用了外层查询的表,只有这样使用谓词EXISTS或NOTEXISTS才有意义。

例:

确定哪些客户目前没有订购单:

这里的查询是客户没有订购单子记录或不存在订购单子记录

Sele*from客户wherenotexists;

(sele*from订购单where客户号=客户.客户号):

此查询等价于sele*from客户where客户号notin(sele客户号from订购单)

例:

查询学分最高的课程信息。

(以下四种说法都正确)

SELE*FROM课程WHERE学分>=ALL(SELE学分FROM课程)

SELE*FROM课程WHERENOT学分

SELE*FROM课程WHERENOT学分

SELE*FROM课程WHERE学分=(SELEMAX(学分)FROM课程)

例:

查询学分不是最高的课程信息。

SELE*FROM课程WHERE学分

SELE*FROM课程WHERE学分

十二、超联接查询

在两个表的超联接查询中,首先保证一个表中满足条件的元组都在结果中,然后将满足联接条件的元组与另一个表中的元组进行联接,不满足联接条件的则将应来自另一表的属性置为空值。

语法:

SELE……

FROMTalbelINNER|LEFT|RIGHT|FULLJOINTable

ONJoinCondition

WHERE……

说明:

1.INNERJOIN:

等价于JOIN,为普通联接。

2.ONJoinCondition:

用于指定联接条件。

例:

比较几种联接方式。

SELE姓名,课程号,成绩FROM学生JOIN选课ON学生.学号=选课.学号

SELE姓名,课程号,成绩FROM学生LEFTJOIN选课ON学生.学号=选课.学号

SELE姓名,课程号,成绩FROM学生RIGHTJOIN选课ON学生.学号=选课.学号

SELE姓名,课程号,成绩FROM学生FULLJOIN选课ON学生.学号=选课.学号

十三、集合并运算

可将两个SELECT语句的查询结果通过并运算合并成一个查询结果。

为进行并运算,要求两个查询结果具有相同的字段个数,并且对应字段的值要出自同一值域,也就是具有相同的数据类型和取值范围。

例:

查询学号为01与02的选课信息。

SELE*FROM选课WHERE学号=”01”;

UNION;

SELE*FROM选课WHERE学号=”02”

十四、VFP中有关SQLSELECT的几个特殊选项

1.显示部分结果

格式:

TOPn[PERCENT]

功能:

只需要满足条件的前几个记录。

说明:

(1)n是1至32767之间的整数,说明显示前几个记录。

(2)当使用PERCENT时,说明显示结果中前百分之几的记录。

例:

显示学分最低的前2项课程记录。

SELE*TOP2FROM课程ORDERBY学分DESC&&通常与ORDERBY子句连用

2.将结果存放在数组中

格式:

INTOARRAYArrayName

3.将结果存放在临时文件中

格式:

INTOCURSORCursorName

说明:

临时表中一个只读的DBF文件,当查询结束后该临时文件是当前文件,可像一般的DBF文件一样使用,当关闭文件时该文件将自动删除。

4.将结果存放在永久表中,通过该子句可实现表的复制。

格式:

INTOTABLE|DBFTableName

5.将结果存放到文本文件中

格式:

TOFILEFileName[ADDITIVE]

6.将结果直接输出到打印机

格式:

TOPRINTER[PROMPT]

习题:

P131/2P132/4,5,6

第三节数据操作功能

一、插入

命令格式1:

INSERTINTO数据表名[(字段名1[,字段名2,...])]VALUES(表达式1[,表达式2...])

功能:

在指定表尾添加一条新记录,其值为VALUES后面的表达式的值。

命令格式2:

INSERTINTO数据表名FROMARRAYArrayName|FROMMEMVAR

功能:

向指定表中添加一条新记录,其值来自于数组或对应的同名内存变量。

例:

向课程表中插入记录:

(”05”,”数理逻辑”,”6”,”03”)

INSERTINTO课程VALUES(”05”,”数理逻辑”,6,”03”)

说明:

1.如未使用字段名指明,则VALUES中的表达式数目必须与表中的字段数相同,而且相应的数据类型必须一致。

2.如果表中设定了主索引,则插入记录时只能用该SQLINSERT命令而不能使用APPEND或INSERT命令。

3.注意插入数据的数据类型必须与表设计时的类型一致。

二、更新

命令格式:

UPDATETableNameSET字段名1=表达式1[,字段名2=表达式2...]WHERECondition

类似于REPLACE命令。

通常嵌入在循环结构内,用另一个表的数据来修改本表。

例:

将课程关系中课程号为“01”的课程的学分加1分。

UPDATE课程SET学分=学分+1WHERE课程号=”01”

习题:

P148/2P150/6

三、删除

命令格式:

DELETEFROMTableName[WHERECondition]

说明:

类似于VFP的DELE...FOR...命令。

1.若无WHERE子句会删除表中的全部记录。

2.此命令为逻辑删除。

用PACK命令进行物理删除。

例:

删除课程关系中课程号为“05”的元组。

DELEFROM课程WHERE课程号=”05”

习题:

P156/25

第二节数据定义功能

一、表的定义

命令格式:

CREATETABLE数据表名(字段名1字段类型(字段宽度[,小数位数])[NULL|NOTNULL][CHECK][ERROR][DEFAULT][PRIMARYKEY|UNIQUE][字段名2......])

说明:

例:

用SQLCREATE命令建立学生2数据表

CREATETABLE学生2(学号C

(2)NOTNULLPRIMARYKEY,姓名C(8),;

性别C

(2)CHECK性别=”男”OR性别=”女”ERROR“性别只能是男或女”DEFAULT“男”,生日D)

习题:

P157/2

二、表的删除

命令格式:

DROPTABLETableName

功能:

直接从磁盘上删除指定的表。

例:

删除上例中的表“学生2”

DROPTABLE学生2

习题:

P148/1

三、表结构的修改

命令格式1:

ALTERTABLETableNameADD|ALTER[COLUMN]字段名1...]

说明:

此格式可添加(ADD)新的字段或修改(ALTER)已有的字段,它的句法基本与CREATETABLE的句法相对应。

例:

为课程关系增加长度为6的字符型的先修课号属性。

ALTERTABLE课程ADD课程号C(6)

例:

课程中的课程号属性的长度由6改为8。

ALTERTABLE课程ALTER课程号C(8)

习题:

P153/13P142/37P157/1P159/6,8P160/12

命令格式2:

ALTERTABLE表名ALTER[COLUMN]字段名1[NULL|NOTNULL]

[SETDEFAULT][SETCHECK...ERROR...][DROPDEFAULT][DROPCHECK]

说明:

此格式主要用于定义、修改和删除字段一级的有效性规则和默认值定义。

例:

为课程关系增加学分大于2的有效性规则

ALTERTABLE课程ALTER学分SETCHECK学分>2

习题:

P151/9P154/17

命令格式3:

ALTERTABLE表名[DROP[COLUMN]字段名]

[SETCHECK...ERROR...][DROPCHECK]

[RENAME[COLUMN]字段名TO新字段名]......

说明:

此格式可删除字段,可修改字段名,可定义、修改和删除表一级的有效性规则等。

例:

将课程表的先修课号字段名改为先修课。

ALTERTABLE课程RENAME先修课号TO先修课

例:

删除课程表中的先修课字段。

ALTERTABLE课程DROP先修课

四、视图操作

1.定义视图

命令格式:

CREATEVIEW视图名ASselect查询语句

说明:

视图是一个虚表,它一旦建立使用方法跟表十分类似,它不会形成单独的文件,它的内容保存在数据库中,所以自由表不能建立视图。

这是视图与查询的一个区别。

例:

CREATEVIEW学生成绩AS;

SELE姓名,SUM(成绩)AS总分,AVG(成绩)AS平均分;

FROM学生JOIN选课ON学生.学号=选课.学号;

GROUPBY

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 初中教育

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1