第4次 SQL.docx
《第4次 SQL.docx》由会员分享,可在线阅读,更多相关《第4次 SQL.docx(10页珍藏版)》请在冰豆网上搜索。
第4次SQL
SQL概述
考点:
1.概念
SQL是结构化查询语言StructuredQueryLanguage的缩写。
是关系数据库的通用语言。
包括数据查询(SELECT)、数据定义(数据库、表、视图的建立、修改和删除)、数据操纵(对数据记录的增加、删除和修改)和数据控制(用户权限的分配与回收)4部分。
VisualFoxPro在SQL方面支持数据定义、数据查询和数据操纵功能。
另外,由于VisualFoxPro自身在安全控制方面的缺陷,所以它没有提供数据控制功能。
2SQL语言的特点
(1)一种一体化的语言。
(2)一种高度非过程化的语言//指不需要编写完整的程序
(3)语言非常简洁。
(4)可以直接以命令方式交互使用,也可以以程序方式使用。
2.查询功能
SQL的核心是查询,基本形式由SELECT-FROM-WHERE查询块组成,多个查询块可嵌套执行,如表5-1所示。
表5-1SQL命令动词
考点:
简单查询
1简单查询
无条件查询
SELECT…FROM…
或条件查询:
SELECT…FROM…WHERE…
2简单的连接查询
连接是关系的基本操作之一,连接查询是一种基于多个关系的查询。
SELECT…;
FROM表AINNERJOIN表B;
ONA.字段名=B.字段名
3嵌套查询
嵌套查询所要求的结果出自一个关系,但关系的条件却涉及多个关系。
其内层基本上也是一个SELECT-FROM-WHERE查询语句。
这种简单嵌套查询,可使用谓词IN或NOTIN来判断在外层的查询条件中是否包含内层查询的结果。
SELECT教师信息表.工号,教师信息表.姓名,教师信息表.所在系;
FROM教师信息表;
WHERE教师信息表.工号IN(SELECT选课成绩表.教师工号FROM选课成绩表)
功能:
查询有代课教师的工号,姓名,所在系。
考点:
特殊运算符号
1BETWEEN…AND…
含义:
该查询的条件是在……范围之内,相当于用AND连接的一个逻辑表达式。
比如:
成绩在[80,90]
成绩BETWEEN80AND90
2LIKE
含义:
它是一个字符串匹配运算符,与之搭配使用的通配符包括“%”和“_”。
“%”:
可以匹配任意多个任意的字符。
“_”:
只能匹配一个任意字符。
比如:
查找姓“李”的同学,字段为姓名
姓名LIKE“李%”
考点:
排序
使用SQLSELECT可以将查询结果进行排序,排序的短语是ORDERBY。
格式:
ORDERBYOrder_Item[ASCIDESC][,Order_Item[ASC|DESC]…]
说明:
可以按升序(ASC)或降序(DESC)排序,允许按一列或多列排序。
考点:
计算查询
1简单的计算查询
SQL不仅具有一般的检索能力,而且还有计算方式的检索,用于计算检索的函数有:
COUNT(计数)、SUM(求和)、AVG(计算平均值)、MAX(求最大值)及MIN(求最小值)。
比如:
(1)查学生基本情况表中的学生总人数
SELECTCOUNT(*表示参数)AS总人数FROM学生基本情况表
(2)查询选修同一门课程的学生的平均成绩在75分以上的课程号及平均成绩。
SELECT课程号,AVG(成绩)AS平均成绩FROM学生成绩表GROUPBY课程号HAVING平均成绩>=75
在”学生选课成绩表”中,包含学号、姓名、三门课的成绩:
英语、高数、政治,查询每个学生三门课的平均成绩
SELECT学生选课成绩表.学号,学生选课成绩表.姓名,(学生选课成绩表.英语+学生选课成绩表.高数+学生选课成绩表.政治)/3AS平均成绩;
FROM学生选课成绩表
2分组与计算查询
在SQLSELECT中可以利用GROUPBY子句进行分组计算查询。
格式:
GROUPBYGroupColumn[,GroupColumn…][HAVINGFilterCondition]
说明:
可以按一列或多列分组,还可以用HAVING子句进一步限定分组的条件。
它必须跟在GROUPBY子句之后,不可单独使用,与WHERE子句并不矛盾。
考点:
别名和自连接查询
(1)SQL语句允许在FROM短语中为关系定义别名,格式为:
<关系名><别名>
(2)SQL不仅可以对多个关系进行连接操作,也可以将同一关系与其自身进行连接,这种连接就称为自连接。
在关系的自连接操作中,别名是必不可少的。
比如:
对学生基本情况表做自连接后的查询
考点:
VisualFoxPro中SQLSELECT的几个特殊选项
(l)显示部分结果,格式为:
TOPnExpr[PERCENT]
(2)将查询结果存放到数组中,格式为:
INTOARRAYArrayName
(3)将查询结果存放到临时文件中,格式为:
INTOCURSORCursorName
(4)将查询结果存放到永久表中,格式为:
INTODBF|TABLETableName
(5)将查询结果存放到文本文件中,格式为:
TOFILEFileName[ADDITIVE]
(6)将查询结果直接输出到打印机,格式为:
TOPRINTER[PROMPT]
3.数据操纵功能
考点:
插入
VisualFoxPro支持两种SQL插入命令的格式,一种是标准格式,另一种是特殊格式。
INSERT命令
1标准格式
INSERTINTOdbfname[(frame1[,fname2,…])]
VALUES(eExpressionl[,eExpression2,…])
比如:
往学生选课成绩表中插入一条记录(”044138”,”02”,”0105”,”04051”,85)
INSERTINTO选课成绩表VALUES(”044138”,”02”,”0105”,”04051”,85)
2特殊格式
INSERTINTOdbf_nameFROMARRAYArrayName|FROMMEMVAR
考点:
数据更新
SQL的数据更新命令格式如下:
UPDATETableName
SETColumn_Namel=eEpressionl[,Column_Name2=eExpression2…]
WHERECondition
说明:
利用WHERE字句指定条件,以更新满足条件的一些记录的字段值,并且一次可更新多个字段;如果不使用WHERE子句,则更新全部记录。
比如:
将学生基本情况表中学号为“044140”的学生改为入团,电话改为:
6892222
UPDATE学生基本情况表;
SET是否入团=’T’,电话=”6892222”;
WHERE学号=”044140”
考点:
记录删除
SQL从表中删除数据的命令格式如下:
DELETEFROMTableName[WHERECondition]
说明:
FROM指定从哪个表中删除记录,WHERE指定被删除的记录所满足的条件,如果不使用WHERE子句,则删除该表中的全部记录。
小提示:
当一个表定义一个主索引或候选索引后,由于相应的字段具有关键字的特性,即不能为空,所以只能用此命令插入记录、)APPEND和INSERT都是插入一条空白记录再输入各字段的值,故不能用它们来插入记录。
5.数据定义功能
考点:
表的定义
利用SQL命令建立的数据表同样可以完成在表设计器中设计表的所有功能。
格式:
CREATETABLEIDBFTableNamel[NAMELongTableName][FREE]
(FieldNamelFieldType[(nFieldWidth[,nPrecision])][NULL|NOTNULL]
[CHECKIExpressionl[ERRORcMessageTextl]]
[DEFAULTeExpressionl]
[PRIMARYKEYIUNIQUE]
[PEFERENCESTableName2[AGTagName1]]
[NOCPTRANS]
[,FieldName2…]
[,PRIMARYKEYeEpression2TAGTagName2|,
UNIQUEeExpression3TAGTagName3]
[,FOREIGNKEYeExpression4TagName4[NODUP]
REFERENCESTableName3[TAGTagName5]]
[,CHECKlExpression2[ERRORcMessageText2]])
|FROMARRAYArravNasne
定义一个“student”表,字段情况如下:
num字符型,长度8
name字符型,长度10
grade数值型,长度为6,允许1位小数
CREATETABLEstudent(
numC(8),
nameC(10),
gradeN(6.1)
)
说明:
此命令除了建立表的基本功能外,还包括满足实体完整性的主关键字(主索引)PRIMARYKEY、定义域完整性的CHECK约束及出错提示信息ERROR、定义默认值DEFAULT等,另外还有描述表之间联系的FOREIGNKEY和REFERENCES等。
考点:
表的删除
利用SQL命令删除表,可直接使用语句,格式为:
DROPTABLETable_name
说明:
如果删除的是自由表,则应该将当前打开的数据表先关闭,才能进行删除。
如果删除数据库表,则要先打开数据库,在数据库中进行操作;否则,即使删除了数据库表,但记录在数据库中的信息并没有被删除,此后会出现错误提示。
考点:
表结构的修改
修改表结构的命令是ALTERTABLE,该命令有3种格式。
(1)为某个表添加字段:
ALTERTABLETableNamelADD|ALTER[COLUMN]FieldNamel
FieldTvpe[(nFieldWidth[,nPrecision])][NULL|NOTNULL]
[CHECKlExpressionl[ERRORcMessageTextl]][DEFAULTeExpressionl]
[PRIMARYKEY|UNIQUE]
[REFERENCESTableName2[TAGTagNamel〕]
(2)为某个表已存在的字段修改其相关设置:
ALTERTABLETableNamelALTER[COLUMN]FieldName2[NULL|NOTNULL]
[SETEFAULTeExpression2][SETCHECKlExpression2[ERRORcMessageText2]
[DROPDEFAULT][DROPCHECK]
(3)ALTERTABLETableName1[DROP[COLUMN]FieldName3]
[SETCHECKlExpression3[ERRORcMessageText3]
[DROPCHECK]
[ADDPRIMARYKEYeExpression3TAGTagName2[FORlExpression4]]
[DROPPRIMARYKEY〕
[ADDUNIQUEeExpression4[TAGTagName3[FORlExpression5]]]
[DROPUNIQUETAGTagName4]
[ADDFOREIGNKEY[eExpression5]TAGTagName4[FORlExpression6]
REFERENCESTableName2[TAGTagName5]]
[DROPFOREIGNKEYTAGTagName6[SAVE]]
[RENAMECOLUMNFieldName4TOFieldName5]
考点:
视图的定义
1视图的定义
格式为:
CREATEVIEWview_name[(column_name[,column_name]…)]ASselect_statement
2从单个表派生出来的视图
视图一经定义,就可以和基本表一样进行各种查询,也可以进行一些修改操作。
对于最终用户来说,有时并不需要知道操作的是基本表还是视图。
3从多个表派生出来的视图
视图一方面可以限定对数据的访问,另一方面又可以简化对数据的访问。
4视图的删除
视图由于是从表派生出来的,所以不存在修改结构的问题,但是视图可以删除。
格式:
DROPVIEW<视图名>
5关于视图的说明
在关系数据库中,视图始终不真正含有数据,它总是原有表的一个窗口。
所以,虽然视图可以像表一样进行各种查询,但是插入、更新和删除操作在视图上却有一定限制。
在一般情况下,当一个视图是由单个表导出时可以进行插入和更新操作,但不能进行删除操作;当视图是从多个表导出时,插入、更新和删除操作都不允许进行。
这种限制是很有必要的,它可以避免一些潜在问题的发生。
真题举例:
2012.3:
(19)查询“教师”表中“住址”字段中含有“望京”字样的教师信息,正确的SQL语句是
A)SELECT*FROM教师WHERE住址LIKE"%望京%"
B)SELECT*FROM教师FOR住址LIKE"%望京%"
C)SELECT*FROM教师FOR住址="%望京%"
)SELECT*FROM教师WHERE住址="%望京%"
(22)为“教师”表的职工号字段添加有效性规则:
职工号的最左边三位字符是“110”,正确的SQL语句是
A)CHANGETABLE教师ALTER职工号SETCHECKLEFT(职工号,3)="110"
B)CHANGETABLE教师ALTER职工号SETCHECKOCCURS(职工号,3)="110"
C)ALTERTABLE教师ALTER职工号SETCHECKLEFT(职工号,3)="110"
D)ALTERTABLE教师ALTER职工号CHECKLEFT(职工号,3)="110"
(24)删除视图salary的命令是
A)DROPVIEWsalaryB)DROPsalaryVIEW
C)DELECTsalaryD)DELECTsalaryVIEW
31—35题使用如下三个数据库表:
图书(索书号,书名,出版社,定价,ISBN)
借书证(借书证号,姓名,性别,专业,所在单位)
借书记录(借阅号,索书号,借书证号,借书日期,还书日期)
其中:
定价是货币型,借书日期和还书日期是日期型,其他是字符型。
(31)查询借书证上专业为“计算机”的所有信息,正确的SQL语句是
A)SELECTALLFROM借书证WHERE专业="计算机"
B)SELECT借书证号FROM借书证WHERE专业="计算机"
C)SELECTALLFROM借书记录WHERE专业="计算机"
D)SELECT*FROM借书证WHERE专业="计算机"
(32)查询2011年被借过图书的书名、出版社和借书日期,正确的SQL语句是
A)SELECT书名,出版社,借书日期FROM图书,借书记录
WHERE借书日期=2011AND图书.索书号=借书记录.索书号
B)SELECT书名,出版社,借书日期FROM图书,借书记录
WHERE借书日期=YEAR(2011)AND图书.索书号=借书记录.索书号
C)SELECT书名,出版社,借书日期FROM图书,借书记录
WHERE图书.索书号=借书记录.索书号ANDYEAR(借书日期)=2011
D)SELECT书名,出版社,借书日期FROM图书,借书记录图书.索书号=借书记录.索书号ANDWHEREYEAR(借书日期)=YEAR(2011)
(33)查询所有借阅过“中国出版社”图书的读者的姓名和所在单位
A)SELECT姓名,所在单位FROM借书证,图书,借书记录WHERE图书.索书号=借书记录.索书号
AND借书证.借书证号=借书记录.借书证号AND出版社="中国出版社"
B)SELECT姓名,所在单位FROM图书,借书证WHERE图书.索书号=借书证.借书证号
AND出版社="中国出版社"
C)SELECT姓名,所在单位FROM图书,借书记录WHERE图书.索书号=借书记录.索书号
AND出版社="中国出版社"
D)SELECT姓名,所在单位FROM借书证,借书记录
WHERE借书证.借书证号=借书记录.借书证号AND出版社="中国出版社"
(34)从借书证表中删除借书证号为“1001”的记录,正确的SQL语句是
A)DELETEFROM借书证WHERE借书证号="1001"
B)DELETEFROM借书证FOR借书证号="1001"
C)DROPFROM借书证WHERE借书证号="1001"
D)DROPFROM借书证FOR借书证号="1001"
(35)将选项为“锦上计划研究所”的所在单位字段值重设为“不详”,正确的SQL语句是
A)UPDATE借书证SET所在单位="锦上计划研究所"WHERE所在单位="不详"
B)UPDATE借书证SET所在单位="不详"WITH所在单位="锦上计划研究所"
C)UPDATE借书证SET所在单位="不详"WHERE所在单位="锦上计划研究所"
D)UPDATE借书证SET所在单位="锦上计划研究所"WITH所在单位="不详"
2011.9:
第(32)-(35)题使用如下3个表:
商店(商店号,商店名,区域名,经理姓名)
商品(商品号,商品名,单价)
销售(商店号,商品号,销售日期,销售数量)
(32)查询在“北京”和“上海”区域的商店信息的正确命令是
A)SELECT*FROM商店WHERE区域名='北京'AND域名名='上海'
B)SELECT*FROM商店WHERE区域名='北京'OR域名名='上海'
C)SELECT*FROM商店WHERE区域名='北京'AND'上海'
D)SELECT*FROM商店WHERE区域名='北京'OR'上海'
(33)查询单价最高的商品销售情况,查询结果包括商品号、商品名、销售日期、销售数量和销售金额。
正确命令是
A)SELECT商品.商品号,商品名,销售日期,销售数量,销售数量*单价AS销售金额
FROM商品JOIN销售ON商品.商品号=销售.商品号WHERE单价=(SELECTMAX(单价)FROM商品)
B)SELECT商品.商品号,商品名,销售日期,销售数量,销售数量*单价AS销售金额
FROM商品JOIN销售ON商品.商品号=销售.商品号WHERE单价=MAX(单价)
C)SELECT商品.商品号,商品名,销售日期,销售数量,销售数量*单价AS销售金额
FROM商品JOIN销售WHERE单价=(SELECTMAX(单价)FROM商品)
D)SELECT商品.商品号,商品名,销售日期,销售数量,销售数量*单价AS销售金额
FROM商品JOIN销售WHERE单价=MAX(单价)
(34)查询商品单价在10到50之间、并且日销售数量高于20的商品名、单价、销售日期和销售数量,查询结果按单价降序。
正确命令是
A)SELECT商品名,单价,销售日期,销售数量FROM商品JOIN销售
WHERE(单价BETWEEN10AND50)AND销售数量>20ORDERBY单价DESC
B)SELECT商品名,单价,销售日期,销售数量FROM商品JOIN销售
WHERE(单价BETWEEN10AND50)AND销售数量>20ORDERBY单价
C)SELECT商品名,单价,销售日期,销售数量FROM商品,销售
WHERE(单价BETWEEN10AND50)AND销售数量>20ON商品.商品号=销售.商品号ORDERBY单价
D)SELECT商品名,单价,销售日期,销售数量FROM商品,销售WHERE(单价BETWEEN10AND50)
AND销售数量>20AND商品.商品号=销售.商品号ORDERBY单价DESC
(35)查询销售金额合计超过20000的商店,查询结果包括商店名和销售金额合计。
正确命令是
A)SELECT商店名,SUM(销售数量*单价)AS销售金额合计FROM商店,商品,销售
WHERE销售金额合计20000
B)SELECT商店名,SUM(销售数量*单价)AS销售金额合计>20000FROM商店,商品,销售
WHERE商品.商品号=销售.商品号AND商店.商店号=销售.商店号
C)SELECT商店名,SUM(销售数量*单价)AS销售金额合计FROM商店,商品,销售
WHERE商品.商品号=销售.商品号AND商店.商店号=销售.商店号
ANDSUM(销售数量*单价)>20000GROUPBY商店名
D)SELECT商店名,SUM(销售数量*单价)AS销售金额合计FROM商店,商品,销售
WHERE商品.商品号=销售.商品号AND商店.商店号=销售.商店号
GROUPBY商店名HAVINGSUM(销售数量*单价)>20000