2020/2/21第4章数据库操作与SQL语言讲述数据库的概念和相关操作以及SQL结构化查询语言2020/2/224.3关系型数据库标准语言SQLSQL是StructuredQueryLanguage(结构化查询语言)的英文缩写,它是关系型数据库的标准操作语言,几乎所有的数据库产品都采用和支持该语言。SQL是一种综合的、通用的、功能强大的关系数据库语言,它包括数据定义语言(DDL)、数据操纵语言(DML)、数据控制语言(DCL)三大部分。数据定义语言:用于定义、修改和撤消数据库、表对象等。数据操纵语言:用于数据库中表记录的修改和检索等。数据控制语言:用于数据访问权限的控制等。2020/2/234.3.1SQL数据定义命令1.建立表2.修改表的结构3.删除表2020/2/241.建立表命令格式:CREATETABLE表名1(字段名1字段类型[(字段宽度[,小数位数])],[(字段名2字段类型[(字段宽度[,小数位数])]],……)功能:由给定的字段参数建立一个数据表。2020/2/25[例4-3]建立人事管理数据库rsgl.dbc,并用SQL命令建立rs.dbf(编号C(4),姓名C(8),身份证号C(18),性别C(2),出生日期D,基本工资N(9,2),简历M),表中编号字段为主关键字。代码如下:CLOSEDATABASESALL&&关闭所有数据库CREATEDATABASESrsgl&&建立rsgl数据库CREATETABLErs(编号C(4),姓名C(8),身份证号C(18),性别C(2),;出生日期D,基本工资N(9,2),简历M)&&在rsgl数据库中创建表rsMODIFYDATABASES&&打开“数据库设计”窗口,显示rs表2020/2/262.修改表的结构(1)增加或修改字段命令格式:ALTERTABLE表名ADD|ALTER[COLUMN]字段名字段类型[(字段宽度[,小数位数])][CHECK逻辑表达式1[ERROR提示信息1]][DEFAULT表达式1][PRIMARYKEY|UNIQUE]功能:增加或修改字段增加新的字段修改原有的字段2020/2/27[例4-4]继续给上例表rs.dbf完成下列操作:①增加1个“籍贯C(8)”字段。②将原来的“编号”字段的宽度由4改为6。③修改“基本工资”字段的有效性规则,要求基本工资不小于200,出错信息提示为“最低工资额为200元”。④将“编号”字段设置成主索引字段。代码如下:OPENDATABASESrsglALTERTABLErsADD籍贯C(8)&&增加字段MODIFYSTRUCTURE&&查看结构的变化ALTERTABLErsALTER编号C(6)&&修改字段的宽度MODIFYSTRUCTUREALTERTABLErsALTER基本工资n(9,2)CHECK基本工资=200;ERROR最低工资额为200元MODIFYSTRUCTUREALTERTABLErsADDPRIMARYKEY编号TAGbh&&设置成主索引字段MODIFYSTRUCTURECLOSEDATABASESALL2020/2/28(2)设置字段属性命令格式:ALTERTABLE表名ALTER|DROP字段名1[SETDEFAULT表达式][SETCHECK逻辑表达式[ERROR提示信息]][DROPDEFAULT][DROPCHECK][RENAME字段名2TO字段名3]功能:定义、修改、删除字段及有效性规则和默认值。删除字段字段改名2020/2/29[例4-5]继续对表rs.dbf完成下列操作:①修改“性别”字段的默认值为“男”。②删除“基本工资”字段的有效性规则。③删除“籍贯”字段。④将“基本工资”字段改名为“工资”字段。代码如下:OPENDATABASESrsglALTERTABLErsALTER性别SETDEFAULT男MODIFYSTRUCTUREALTERTABLErsALTER基本工资DROPCHECKMODIFYSTRUCTUREALTERTABLErsDROP籍贯MODIFYSTRUCTUREALTERTABLErsRENAMECOLUMN基本工资TO工资MODIFYSTRUCTURECLOSEDATABASESALL2020/2/210(2)将表从数据库和磁盘上删除的DROPTABLE命令。命令格式:DROPTABLE表名|文件名|?[RECYCLE]功能:从数据库和磁盘上将表直接删除掉。[例4-7]将rs.dbf表复制rs1.dbf,然后将rs1.dbf添加到rsgl数据库中,然后再将其从数据库和磁盘中一起删除。代码如下:CLOSEALLUSErsCOPYTOrs1&&复制成表rs1.dbfOPENDATABASESrsglADDTABLErs1&&添加表rs1.dbf到rsgl.dbcMODIFYDATABASES&&显示数据库DROPTABLErs1&&将表从数据库和磁盘上一起删除CLOSEDATABASESDIR*.dbf2020/2/2114.3.2SQL数据操纵命令SQL的数据操纵命令主要包括三个部分:记录的插入记录的更新记录的删除2020/2/2121.插入记录命令格式:INSERTINTO表名[(字段名1[,字段名2,...])]VALUES(表达式1[,表达式2,...])或INSERTINTO表名FROMARRAY数组|FROMMEMVAR功能:在表的末尾追加一条新的记录。[例4-8]向表rs.dbf表插入一条记录。代码如下:OPENDATABASESrsglINSERTINTOrs(编号,姓名,性别,出生日期);VALUE(0101,李明,男,{^1965/05/06})LISTCLOSEDATABASES2020/2/2132.更新记录命令格式:UPDATE[数据库名!]表名SET字段名1=表达式1[,字段名2=表达式2...][WHERE条件]功能:更新满足条件的记录,该记录指定字段值由相对应的表达式值来代替。[例4-9]将表rsb.dbf复制成rsb1.dbf,然后对表rsb1.dbf中的职称为“讲师”的职工基本工资都增加35元。代码如下:USERSBLISTCOPYTOrsb1UPDATErsb1SET基本工资=基本工资+35WHERE职称=讲师SELECTrsb1LISTUSE2020/2/2143.删除记录命令格式:DELETEFROM表名[WHERE条件]功能:逻辑删除表中满足条件的记录,即对满足条件的记录做删除标志。[例4-10]将表rsb1.dbf中姓名是“陈宏”的记录删除。代码如下:DELETEFROMrsb1WHERE姓名=陈宏&&做删除标记SELECTrsb1LISTPACK&&彻底删除有删除标记的记录LISTUSE2020/2/2154.3.3SQL的数据查询命令VisualFoxPro有两种方式来实现SQL查询:一、使用命令操作二、界面操作2020/2/216命令格式:SELECT[ALL|DISTINCT][别名1.]选择项1[AS列名1][,[别名2.]选择项2[AS列名2]…]FROM[数据库1!]表名1[[AS]本地名1][[INNER|LEFT[OUTER]|RIGHT[OUTER]|FULL[OUTER]JOIN数据库2!]表名2[[AS]本地名2][ON联接条件…][[INTO目标]|[TOFILE文件名[ADDITIVE]|TOPRINTER[PROMPT]|TOSCREEN]][WHERE联接条件1[AND联接条件2…][AND|OR筛选条件1AND|OR筛选条件2…]]][GROUPBY分组项1[,分组项2…]][HAVING筛选条件][UNION[ALL]SELECT命令][ORDERBY排序项1[ASC|DESC][,排序项2[ASC|DESC]…]]2020/2/217一、使用命令操作SELECT[ALL|DISTINCT][别名.]SELECT表达式[AS列名][,[别名.]SELECT表达式[AS列名]…]SELECTDISTINCT职称fromrsbSELECT编号,姓名,性别,YEAR(DATE())-YEAR(出生日期)AS;年龄,职称,基本工资FROMrsbSELECT*FROMbmdmSELECTMAX(基本工资)AS最高,MIN(基本工资)AS最低,;AVG(基本工资)AS平均,SUM(基本工资)AS合计,COUNT(*)AS;统计人数FROMrsb包括重复记录,缺省为此取消重复记录字段所在的表名可包含字段名或函数输出的列标题*号表示全部字段2020/2/218FROM[数据库名!]表名[本地名][[INNER|LEFT[OUTER]|RIGHT[OUTER]|FULL[OUTER]JOIN[数据库名!]表名[本地名]ON联接条件…]SELECTrsb.编号,姓名,职称,岗位津贴,;奖励FROMrsbJOINgzbON;rsb.编号=gzb.编号非当前数据库中表时,由此指定表的暂用名指定联接条件严格按指定条件联接2020/2/219[WHERE联接条件[AND联接条件…][AND|OR筛选条件[AND|OR筛选条件…]]]SELECT编号,姓名,性别,职称,出生日期FROMrsb;WHERE姓名LIKE陈%SELECT编号,姓名,职称,基本工资FROMrsb;WHERE基本工资BETWEEN1500AND2000SELECTrsb.编号,姓名,职称,岗位津贴,奖励FROMrsb,gzb;WHERErsb.编号=gzb.编号联接与筛选(1)JOIN指明联接条件,WHERE指明筛选条件.(2)WHERE同时指明联接条件和筛选条件.2020/2/220[[INTO目标]|[TOFILE文件名[ADDITIVE]|TOPRINTER[PROMPT]|TOSCREEN]]SELECT*FROMbmdmINTOARRAYabcSELECT*FROMbmdmINTOCURSORdddSELECT*FROMbmdmINTODBFpppSELECT*FROMbmdmTOPRINTERPROMPT目标可为:(1)ARRAY数组(2)CURSOR临时表名(3)DBF表名INTO和TO子句指明输出去向,默认为浏览窗口追加打印前提示确认2020/2/221[GROUPBY组表达式[,组表达式…]][HAVING筛选条件]SELECT职称,COUNT(*)AS人数,;MAX(基本工资)AS最高,;MIN(基本工资)AS最低,;AVG(基本工资)AS平均;FROMrsb;GROUPBY职称与GROUPBY结合指明限制条件记录分组统计2020/2/222[ORDERBY关键字表达式[ASC|DESC][,关键字表达式[ASC|DESC]…]]SELECT姓名,性别,出生日期,职称;FROMrsb;ORDERBY出生日期DESC结果排序2020/2/223[UNION[ALL]SELECT命令]UNION子句:使SELECT-SQL嵌入另一个SELECT-SQL中,两个命令的结果合并输出.selectrsb.编号fromrsbunionall;selectzz.编号fromzzALL不排除重复行2020/2/2241.查询全部或者部分字段内容[例4-11]在rsb.dbf中查询显示所有职工编号、姓名、性别、年龄、职称和基本工资字段内容。SELECT编号,姓名,性别,YEAR(DATE())-YEAR(出生日期)AS;年龄,职称,基本工资FROMrsb[例4-12]查询bmdm.dbf中的全部字段以及所有记录,并