【文档说明】MySQL数据库基础教学解析课件.ppt,共(107)页,3.351 MB,由小橙橙上传
转载请保留链接:https://www.ichengzhen.cn/view-92284.html
以下为本文档部分文字说明:
7.3.1MySQL的数据库对象数据库可以看做是一个存储数据对象的容器,在MySQL中,这些数据对象包括以下几种。1.表“表”是MySQL中最主要的数据库对象,是用来存储和操作数据的一种逻辑结构。“表”由行和列组
成,因此也称为二维表。“表”是在日常工作和生活中经常使用的一种表示数据及其关系的形式。2.视图视图是从一个或多个基本表中引出的表。数据库中只存放视图的定义,而不存放视图对应的数据,这些数据仍存放在导出视图的基本表
中。由于视图本身并不存储实际数据,因此也称为虚表。视图中的数据来自定义视图的查询所引用的基本表,并在引用时动态生成数据。当基本表的数据发生变化时,从视图中查询出来的数据也随之改变。视图一经定义,就可以
像基本表一样被查询、修改、删除和更新。3.索引索引是一种不用扫描整个数据表就可以对表中的数据实现快速访问的途径,它是对数据表中的一列或多列的数据进行排序的一种结构。表中的记录通常按其输入的时间顺序存放,这种顺序称为记录的物理顺序。为了实现
对表中记录的快速查询,可以对表中记录按某个或某些属性进行排序,这种顺序称为逻辑顺序。索引是根据索引表达式的值进行逻辑排序的一组指针,它可以实现对数据的快速访问。4.约束约束机制保障了MySQL中数据的一
致性与完整性,具有代表性的约束就是主键和外键。主键约束当前表记录的唯一性,外键约束当前表记录与其他表的关系。5.存储过程在MySQL5.0以后,MySQL才开始支持存储过程、存储函数、触发器和事件这
4种过程式数据库对象。存储过程是一组完成特定功能的SQL语句集合。这个语句集合经过编译后存储在数据库中,存储过程具有输入、输出和输入/输出参数,它可以由程序、触发器或另一个存储过程调用从而激活它,实现代码段中的SQL语句。存储过程独立于表存在。6.触发器触发器是一个被指定关联
到一个表的数据库对象,触发器是不需要调用的,当对一个表的特别事件出现时,它会被激活。触发器的代码是由SQL语句组成的,因此用在存储过程中的语句也可以用在触发器的定义中。触发器与表的关系密切,用于保护表中的数据。当有操作影响到触发器保护的数据时,触发器自动执行,例如,通过触发器实现多
个表间数据的一致性。当对表执行INSERT、DELETE或UPDATE语句时,将激活触发程序。在MySQL中,目前触发器的功能还不够全面,在以后的版本中将得到改进。7.存储函数存储函数与存储过程类似,也
是由SQL和过程式语句组成的代码片段,并且可以从应用程序和SQL中调用。但存储函数不能拥有输出参数,因为存储函数本身就是输出参数。存储函数必须包含一条RETURN语句,从而返回一个结果。8.事件事件与触发器类似,都是在某些事情发生时启动。不同的是触发器是在数据
库上启动一条语句时被激活,而事件是在相应的时刻被激活。例如,可以设定在2008年的10月1日下午2点启动一个事件,或者设定每个周六下午4点启动一个事件。从MySQL5.1开始才添加了事件,不同的版本功能可能也不相同。
下面简单介绍与表有关的几个概念:●表结构。组成表的各列的名称及数据类型,称为表结构。●记录。每个表包含了若干行数据,它们是表的“值”,表中的一行称为一个记录。因此,表是记录的有限集合。●字段。每个记录由若干个数据项构成,构成记录的每个数据项称为字
段。例如,表7.1中,表结构为(学号,姓名,性别,出生时间,专业,总学分,备注),包含7个字段,由22个记录组成。●空值。空值(NULL)通常表示未知、不可用或将在以后添加的数据。若某列允许为空值,则向表中输入记录值时可不为该列给出具体值。而某列若不允许为空值,则在输入时必须给出
具体值。●关键字。若表中记录的某一字段或字段组合能唯一标志记录,则称该字段或字段组合为候选关键字(Candidatekey)。若表中有多个候选关键字,则选定其中一个为主关键字(Primarykey),也称为主键。当表中仅有唯一的一个候选关键字时,该候选关键字就是主关键字。在创建表的列时
,必须为其指定数据类型,列的数据类型决定了数据的取值、范围和存储格式。MySQL提供了丰富的数据类型,将其列于表7.4中。数据类型符号标志整数型BIGINT,INT,SMALLINT,MEDIUMINT,TI
NYINT精确数值型DECIMAL,NUMERIC浮点型FLOAT,REAL,DOUBLE位型BIT字符型CHAR,VARCHAR,LONGVARCHAR,LONGTEXTUnicode字符型NCHAR,NVARCHARBLOB类型TINYBLOB,BLO
B,MEDIUMBLOB,LONGBLOB文本型TEXT,TINYTEXT二进制型BINARY,VARBINARY日期时间类型DATE,TIME,DATETIME,TIMESTAMP,YEAR表7.4数据类型表在讨论数据类型时,使用了精度、小数位数和长度三个概念,前两个概念是针对数值型数
据的,它们的含义如下:●精度。指数值数据中所存储的十进制数据的总位数。●小数位数。指数值数据中小数点右边可以有的数字位数的最大值。例如,数值数据3560.697的精度是7,小数位数是3。●长度。指存储数据所使用的字节数。下面分别介绍数据类型。1.整数型
整数型包括BIGINT、INT、SMALLINT、MEDIUMINT和TINYINT,从标志符的含义可以看出,它们表示数的范围逐渐缩小。BIGINT。大整数,数值范围为263(9223372036854775808)~2631(9223372036854775807),其精度为
19,小数位数为0,长度为8字节。INTEGER(简写为INT)。整数,数值范围为231(2147483648)~2311(2147483647),其精度为10,小数位数为0,长度为4字节。MEDIUMINT。中
等长度整数,数值范围为223(8388608)~2231(8388607),其精度为7,小数位数为0,长度为3字节。SMALLINT。短整数,数值范围为215(32768)~2151(32767),其精度为5,小
数位数为0,长度为2字节。TINYINT。微短整数,数值范围为27(128)~271(127),其精度为3,小数位数为0,长度为1字节。2.精确数值型精确数值型由整数部分和小数部分构成,其所有的数字都是有效位,能够以
完整的精度存储十进制数。精确数值型包括DECIMAL、NUMERIC两类。从功能上说两者完全等价,两者的唯一区别在于DECIMAL不能用于带有IDENTITY关键字的列。声明精确数值型数据的格式是NUMERIC|DECIMAL(P[,S]
),其中P为精度,S为小数位数,S的默认值为0。例如,指定某列为精确数值型,精度为6,小数位数为3,即DECIMAL(6,3),那么若向某记录的该列赋值56.342689时,该列实际存储的是56.3427。3.浮点型浮点型也称近似数值
型。这种类型不能提供精确表示数据的精度。使用这种类型来存储某些数值时,有可能会损失一些精度,所以它可用于处理取值范围非常大且对精确度要求不是十分高的数值量,如一些统计量。有两种浮点数据类型:单精度(FL
OAT)和双精度(DOUBLE)。两者通常都使用科学计数法表示数据,即形为:尾数E阶数,如5.6432E20,2.98E10,1.287659E9等。●FLOAT[(M,D)][ZEROFILL]。取值范围:3.402823466E+38到1.175494351E38之间、
0、1.175494351E38到3.402823466E+38之间。M是小数总位数,D是小数点后面的位数。如果省略M和D,根据硬件允许的限制来保存值。单精度浮点数精确到大约7位小数位。存储要求:4个字节,数据精确为7
位小数位。●DOUBLE[(M,D)][ZEROFILL]。取值范围:1.7976931348623157E+308到2.2250738585072014E308之间、0、2.2250738585072014E308到1.7976931348623157E+308之间。DO
UBLEPRECISION和REAL是DOUBLE的同义词。存储要求:8个字节,数据精度为15位小数位。●FLOAT(P)[UNSIGNED][ZEROFILL]。P表示精度(以位数表示),MYSQL只使用该值来确定是否结果列的数据类型为FLOAT或DOUBLE。
如果P为0~24,数据类型为没有M或D值的FLOAT。如果P为25~53,数据类型为没有M或D值的DOUBLE。4.位型位字段类型,表示如下:BIT[(M)]其中,M表示位值的位数,范围为1~64。如果省略M,默认为1。5.字符型字符型数据
用于存储字符串,字符串中可包括字母、数字和其他特殊符号(如#、@、&等)。在输入字符串时,需将串中的符号用单引号或双引号括起来,如'ABC'、"ABC<CDE"。MySQL字符型包括固定长度(CHAR)和可变长度(VARCHAR)字符数据类型。●CHAR[(N)]。定长字
符数据类型,其中N定义字符型数据的长度,N为1~255之间,默认为1。当表中的列定义为CHAR(N)类型时,若实际要存储的字符串长度不足N时,则在串的尾部添加空格以达到长度N,所以CHAR(N)的长度为N。例如,某列的数据类型
为CHAR(20),而输入的字符串为“AHJM1922”,则存储的是字符AHJM1922和12个空格。若输入的字符个数超出了N,则超出的部分被截断。●VARCHAR[(N)]。变长字符数据类型,其中n可以指定为
0~65535之间的值,但这里N表示的是字符串可达到的最大长度。VARCHAR(N)的长度为输入的字符串的实际字符个数,而不一定是N。例如,表中某列的数据类型为VARCHAR(100),而输入的字符串为“AHJM1922”,则存储的就是字符AHJM1922,其长度为8字节。6.文本型当
需要存储大量的字符数据,如较长的备注、日志信息等,字符型数据的最长65535个字符的限制可能使它们不能满足应用需求,此时可使用文本型数据。文本型数据对应ASCII字符,其数据的存储长度为实际字符数个字节。文本型数据可分为4种:TINYTEXT、TEXT、MED
IUMTEXT和LONGTEXT。表7.5列出了各种文本数据类型的最大字符数。文本数据类型最大长度TINYTEXT255(28-1)text65535(216-1)MEDIUMTEXT16777215
(224-1)LONGTEXT4294967295(2321)表7.5文本数据类型的最大字符数7.BINARY和VARBINARY型BINARY和VARBINARY类型数据类似于CHAR和VARCHAR,不同的
是它们包含的是二进制字符串,而不是非二进制字符串。也就是说,它们包含的是字节字符串,而不是字符字符串。这说明它们没有字符集,并且排序和比较基于列值字节的数值。●BINARY[(N)]。固定长度的N字节二进制数据。N取
值范围为1~255,默认为1。BINARY(N)数据的存储长度为N+4字节。若输入的数据长度小于N,则不足部分用0填充;若输入的数据长度大于N,则多余部分被截断。输入二进制值时,在数据前面要加上0X,可以用的数字符号为0~9
、A~F(字母大小写均可)。例如,0XFF、0X12A0分别表示十六进制的FF和12A0。因为每字节的数最大为FF,故在“0X”格式的数据每两位占1字节。●VARBINARY[(N)]。N字节变长二进制数据。N取值范围为1~655
35,默认为1。VARBINARY(N)数据的存储长度为实际输入数据长度+4字节。8.BLOB类型在数据库中,对于数码照片、视频和扫描的文档等的存储是必须的,MySQL可以通过BLOB数据类型来存储这些数据。BLOB是一个二
进制大对象,可以容纳可变数量的数据。有4种BLOB类型:TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB。这4种BLOB数据类型的最大长度对应于4种TEXT数据类型:TINYTEXT、TEXT、MEDIUMTEXT和L
ONGTEXT。不同的是BLOB表示的是最大字节长度,而TEXT表示的是最大字符长度。9.日期时间类型MySQL支持5种时间日期类型:DATE、TIME、DATETIME、TIMESTAMP、YEAR。●DATE。DATE数据类型由年份、月份和日期组成,代表一个实际存在的日期
。DATE的使用格式为字符形式'YYYY-MM-DD',年份、月份和日期之间使用连字符“-”隔开,除了“-”,还可以使用其他字符如“/”、“@”等,也可以不使用任何连接符,如'19970806'表示1997年8月6日。DATE数据支持的
范围是'1000-01-01'~'9999-12-31'。虽然不在此范围的日期数据也允许,但是不能保证能正确进行计算。●TIME。TIME数据类型代表一天中的一个时间,由小时数、分钟数、秒数和微秒数组成。格式为'HH:MM:SS.fraction',其中fraction为微秒部
分,是一个6位的数字,可以省略。TIME值必须是一个有意义的时间,例如'10:08:34'表示10点08分34秒,而'10:98:10'是不合法的,它将变成'00:00:00'。●DATETIME,TIMESTAM
P。DATETIME和TIMESTAMP数据类型是日期和时间的组合,日期和时间之间用空格隔开,如'2008-10-2010:53:20'。大多数适用于日期和时间的规则在此也适用。DATETIME和TIMESTAMP有很多共同点,但也有区别。对于DATETIME,年份在1000~9999之
间,而TIMESTAMP的年份在1970~2037之间。另一个重要的区别是:TIMESTAMP支持时区,即在操作系统时区发生改变时,TIMESTAMP类型的时间值也相应改变,而DATETIME则不支持时区。
●YEAR。YEAR用来记录年份值。MySQL以YYYY格式检索和显示YEAR值,范围是1901~2155。10.ENUM和SET类型ENUM和SET是比较特殊的字符串数据列类型,它们的取值范围是一个预先定义好的列表。ENUM或SET数据列的取值只能从这个列
表中进行选择。ENUM和SET的主要区别是:ENUM只能取单值,它的数据列表是一个枚举集合。ENUM的合法取值列表最多允许有65535个成员。例如,ENUM("N","Y")表示该数据列的取值要么是“Y”,要么是“N”。
SET可取多值。它的合法取值列表最多允许有64个成员。空字符串也是一个合法的SET值。7.4.1创建数据库1.创建数据库创建数据库可以使用CREATEDATABASE语句,该语句的基本格式如下:CREA
TE{DATABASE|SCHEMA}[IFNOTEXISTS]db_name说明:“[]”中内容为可选项,DATABASE与SCHEMA同义。●db_name。要创建的数据库的名称,在文件系统中,MySQL的数据存储区将以目录方式表示MySQL数据库。因此,命令中的数据库名字必须符合操作系统文
件夹命名规则。值得注意的是,在MySQL中是不区分大小写的。●IFNOTEXISTS。在创建数据库前进行判断,只有该数据库目前尚不存在时才执行CREATEDATABASE操作。用此选项可以避免出现数据库已经存在而再新建的错误。【例7.1】创建学生管理系统的数据库,名为PXSCJ。打开“开始
”→“程序”→“MySQL”→“MySQLServer5.1”→“MySQLCommandLineClient”菜单项,进入MySQL客户端,在客户端窗口输入密码,在命令提示行输入以下语句:CREATEDATABASEPXSCJ;运行效果如下:为了表达问题简
单,在以后的示例中命令都在该窗口中输入。创建了数据库之后使用USE命令可指定当前数据库。语法格式如下:USEdb_name;2.删除数据库已经创建的数据库如要删除,使用DROPDATABASE命令。语法格式如下:DR
OPDATABASE[IFEXISTS]db_name其中,db_name是要删除的数据库名。可以使用IFEXISTS子句以避免删除不存在的数据库时出现的MySQL错误信息。示例如下:创建表的实质就是定义表结构,设置表和列的属性。创建表之前,先要确定表的名字、表的属性,同
时确定表所包含的列名、列的数据类型、长度、是否可为空值、默认值设置、哪些列是主键、哪些列是外键等,这些属性构成表结构。本节以本书所使用到的学生管理系统的三个表:学生表(表名为XSB)、课程表(表名为KCB)和成绩
表(表名为CJB)为例介绍如何设计表的结构。其中,“学号”列的数据是学生的学号,学号值有一定的意义,例如,“081101”中“08”表示学生的年级,“11”表示所属班级,“01”表示学生在班级中的序号,所以“学号”列的数据类型可以是6位的定长字符型数据。“姓名”列记录学生的
姓名,姓名一般不超过4个中文字符,所以可以是8位定长字符型数据。“性别”列有“男”、“女”两种值,可以用数字来表示,值1表示“男”,值0表示“女”,默认是1。“出生时间”是日期类型数据,列类型定为DATE。“专业”列为12位定长字符型数据
。“总学分”列是整数型数据,值在0~160之间,列类型定为INT,默认是0。“备注”列需要存放学生的备注信息,属于文本信息,所以应该使用TEXT类型。在XSB表中,只有“学号”列能唯一标志一个学生,所以将“学号”列设为该表的主键。最后设计的XSB表的结构如表7.6所示。列
名数据类型长度是否可空默认值说明学号(xh)定长字符型(CHAR)6×无主键,前2位年级,中间2位班级号,后2位序号姓名(name)定长字符型(CHAR)8×无性别位型(TINYINT)1√11:男;0:女出生时间日期型(DATE)系统默认√无专业定长字符
型(CHAR)12√无总学分整数型(INT)4√00≤总学分≤160备注文本型(TEXT)系统默认√无表7.6XSB表的结构参照XSB表结构的设计方法,同样可以设计出其他两个表的结构,表7.7所示的是
KCB的表结构,表7.8所示的是CJB的表结构。列名数据类型长度是否可空默认值说明课程号定长字符型(CHAR)3×无主键课程名定长字符型(CHAR)16×无开课学期整数型(TINYINT)1√1只能为1~8学时整数型(TI
NYINT)1√0学分整数型(TINYINT)1×0列名数据类型长度是否可空默认值说明学号定长字符型(CHAR)6×无主键课程号定长字符型(CHAR)3×无主键成绩整数型(INT)4√0表7.7KCB的表结构表7.8CJB的表结构2.创建表设计完表结构,就可以根据表结
构创建表了。创建表使用CREATETABLE语句,基本格式如下:CREATE[TEMPORARY]TABLE[IFNOTEXISTS]tbl_name(<列名1><数据类型>[<列选项>],<列名2><数据类型>[<列选项>],…<表选项>)●TEMPORARY。该关键字
表示用CREATE命令新建的表为临时表。不加该关键字创建的表通常称为持久表,在数据库中持久表一旦创建将一直存在,多个用户或者多个应用程序可以同时使用持久表。有时需要临时存放数据,例如,临时存储复杂的SELECT语句的结果。此后,可能要重复地使用这个结果,但这
个结果又不需要永久保存。这时,可以使用临时表。用户可以像操作持久表一样操作临时表。只不过临时表的生命周期较短,而且只能对创建它的用户可见,当断开与该数据库的连接时,MySQL会自动删除它们。●IFNOTEXISTS
。建表前加上一个判断,只有该表目前尚不存在时才执行CREATETABLE操作。用此选项可以避免出现表已经存在无法再新建的错误。●列选项。列选项主要有以下几种:NULL或NOTNULL:表示一列是否允许为空,NULL表示可以为空,NOTNULL表示不可以为空,如果不指定,则默认为
NULL。DEFAULTdefault_value:为列指定默认值,默认值default_value必须为一个常量。AUTO_INCREMENT:设置自增属性,只有整型列才能设置此属性。当插入NULL值或0到一个AUTO_INCREMENT列中时,列被设置为value+
1,value是此前表中该列的最大值。AUTO_INCREMENT顺序从1开始。每个表只能有一个AUTO_INCREMENT列,并且它必须被索引。UNIQUEKEY|PRIMARYKEY:UNIQUEKEY和PRIMARYKEY都表示字段中的值是唯一的。PRIMARY
KEY表示设置为主键,一个表只能定义一个主键,主键必须为NOTNULL。COMMENT'string':对于列的描述,string是描述的内容。●表选项。在定义列选项的时候,可以将某列定义为PRIMARYKEY,但是当主键是由多个列组成的多列索引时,定义列时无法定义此
主键,这时就必须在语句最后加上一个PRIMARYKEY(col_name,…)子句定义的表选项。另外,表选项中还可以定义索引和外键。【例7.2】使用命令行方式在PXSCJ数据库中创建学生管理系统中的三个表XSB、KCB和
CJB。表的结构参照表7.6、表7.7和表7.8。创建XSB表使用如下语句:USEPXSCJ;CREATETABLEXSB(学号CHAR(6)NOTNULLPRIMARYKEY,姓名CHAR(8)NOTNULL,性别TINYINT(1)NULLDEFAULT1,出生时间DAT
ENULL,专业CHAR(12)NULL,总学分INT(4)NULLDEFAULT0,备注TEXTNULL);创建KCB表使用如下语句:USEPXSCJ;CREATETABLEKCB(课程号CHAR(3)NOTNULLPRIMARYKEY,课程名CHAR(16)NOTNULL
,开课学期TINYINT(1)NULLDEFAULT1,学时TINYINT(1)NULL,学分TINYINT(1)NOTNULL);创建CJB表使用如下语句:USEPXSCJ;CREATETABLECJB(学号CHAR(6)NOTNULL,课程号CHAR(3)NOTNULL,成
绩INT(4)NULL,PRIMARYKEY(学号,课程号));3.修改表ALTERTABLE用于更改原有的表结构。例如,可以增加或删减列,创建或取消索引,更改原有列的类型,重新命名列或表,还可以更改表的描述和表的类型。ALTERTABLE语句
的基本格式如下:ALTERTABLEtable_nameADD<列名><数据类型><列选项>/*添加列*/|ALTER<列名>{SETDEFAULTdefault_value|DROPDEFAULT}/*修改默认值*/|CHANGE<旧列名><
新列名><数据类型><列选项>/*对列重命名*/|MODIFY<列名><数据类型><列选项>/*修改列类型*/|DROP<列名>/*删除列*/|RENAME<新表名>/*重命名该表*/|其他其中,table_nam
e为要修改表的表名。ALTERTABLE语句中的修改子句可以包含以下几类:●ADD子句。向表中增加新列。例如,在表t1中增加新的一列a:ALTERTABLEt1ADDCOLUMNaTINYINTNULL;●ALTER子句。修改表中指定列
的默认值。●CHANGE子句。修改列的名称。重命名时,需给定旧列名、新列名和列当前的类型,例如,要把一个INTEGER列的名称从a变更到b:ALTERTABLEt1CHANGEabINTEGER;●MODIFY子句:修改指定列
的类型。例如,把一个列的数据类型改为BIGINT:ALTERTABLEt1MODIFYbBIGINTNOTNULL;注意:若表中该列所存数据的数据类型与将要修改的列的类型冲突,则发生错误。例如,原来CHAR类型的列要修改成INT类型,而
原来列值中有字符型数据“a”,则无法修改。●DROP子句:从表中删除列或约束。●RENAME子句:修改该表的表名。例如,将表a改名为b:ALTERTABLEaRENAMEb;【例7.3】假设已经在数据库PXSCJ中创建了
表XSB,表中存在“姓名”列。在表XSB中增加“奖学金等级”列,并将表中的“姓名”列删除。USEPXSCJALTERTABLEXSBADD奖学金等级TINYINTNULL,DROP姓名;4.删除表删除一个表可以使
用DROPTABLE语句。语法格式如下:DROP[TEMPORARY]TABLE[IFEXISTS]tbl_name[,tbl_name]...例如,删除XSB表可以使用如下语句:USEPXSCJ;DROPTABLEXSB;7.5.1插入表数据创建了数据库和
表之后,下一步就是向表里插入数据。通过INSERT或REPLACE语句可以向表中插入一行或多行数据。INSERT语句的基本格式如下:INSERT[INTO]tbl_name[(col_name,...)]VALUES({expr|DEFAULT},...),(...),...●tbl_name
。被操作的表名。●col_name。需要插入数据的列名。如果要给全部列插入数据,列名可以省略。如果只给表的部分列插入数据,需要指定这些列。对于没有指出的列,它们的值根据列默认值或有关属性来确定。●VALUES子句。包含各列需要插入的数据清单,数据的顺序要与
列的顺序相对应。若tb1_name后不给出列名,则在VALUES子句中要给出每列的值,如果列值为空,则值必须置为NULL,否则会出错。VALUES子句中的值如下:expr:可以是一个常量、变量或一个表达式,也可
以是空值NULL,其值的数据类型要与列的数据类型一致。例如,列的数据类型为INT,插入数据“aa”时就会出错。当数据为字符型时要用单引号括起。DEFAULT:指定为该列的默认值。前提是该列之前已经指定了默认
值。如果列清单和VALUES清单都为空,则INSERT会创建一行,每列都设置成默认值。【例7.4】向PXSCJ数据库的表XSB(表中列包括学号、姓名、性别、出生时间、专业、总学分、备注)中插入如下的一行:081101,王林,1,1990-02-10,计算机
,50,NULL使用下列语句:USEPXSCJINSERTINTOXSBVALUES('081101','王林',1,'1990-02-10','计算机',50,NULL);【例7.5】表XSB中性别的默认值为1,备注的默认值为NUL
L,插入上例那行数据可以使用以下命令:INSERTINTOXSB(学号,姓名,出生时间,专业,总学分)VALUES('081101','王林','1990-02-10','计算机',50);与下列命令效果相同:I
NSERTINTOXSBVALUES('081101','王林',DEFAULT,'1990-02-10','计算机',50,NULL);注意:若原有行中存在PRIMARYKEY或UNIQUEKEY,而插入的数据行中含有与原有行中PRIMARYKEY或UNIQUEKE
Y相同的列值,则INSERT语句无法插入此行。要插入这行数据需要使用REPLACE语句,REPLACE语句的用法和INSERT语句基本相同。使用REPLACE语句可以在插入数据之前将与新记录冲突的旧记录删除,从而使新记录能够正常插入
。【例7.6】若例7.4中的数据行已经插入,其中学号为主键(PRIMARYKEY),现在想再插入如下一行数据:081101,刘华,1,1991-03-08,通信工程,48,NULL若使用INSERT语句,执行结果如下:使用REPLACE语句:向表中插入数据后,如要修改表中的数据,可以使用U
PDATE语句,基本格式如下:UPDATEtbl_nameSETcol_name1=expr1[,col_name2=expr2...][WHEREwhere_definition]●SET子句。根据WHERE子句中指定的条件对符合条件的数据行进行修改。若语句中不设
定WHERE子句,则更新所有行。col_name1、col_name2为要修改列值的列名,expr1、expr2可以是常量、变量或表达式。可以同时修改所在数据行的多个列值,中间用逗号隔开。●WHERE子句。通过设定条
件确定要修改哪些行,where_definition用于指定条件。【例7.7】将PXSCJ数据库的XSB表(数据以表7.1中数据为准)中学号为081101的学生的备注值改为“三好生”。USEPXSCJ;UPDATEXSBSET备注='三好生'WHERE学号='081
101';【例7.8】将XSB表中的所有学生的总学分增加10。UPDATEXSBSET总学分=总学分+10;【例7.9】将姓名为“罗林琳”的同学的专业改为“软件工程”,备注改为“提前修完学分”,学号改为“081261”。UPDATEXSBSET专业='软件
工程',备注='提前修完学分',学号='081261'WHERE姓名='罗林琳';删除表中数据一般使用DELETE语句,语法格式如下:DELETEFROMtbl_name[WHEREwhere_definition]【例7.10】假设数据库mydata中有一个表table1,table1中
有如下数据:姓名年龄职业张三42教师李四28工人要删除张三的信息可使用如下语句:USEmydataDELETEFROMtable1WHERE姓名='张三';【例7.11】将PXSCJ数据库的XSB表中总学分小于50的所有行删除,使用如下语句:US
EPXSCJDELETEFROMXSBWHERE总学分<50;使用TRUNCATETABLE语句也可以删除表中数据,但是该语句将删除指定表中的所有数据,因此也称为清除表数据语句。语法格式如下:TRUNCATETAB
LEtable_nameSELECT语句可以从一个或多个表中选取特定的行和列,结果通常是生成一个临时表。在执行过程中系统根据用户的要求从数据库中选出匹配的行和列,并将结果存放到临时的表中,SELECT语句的语法格
式如下:SELECT[ALL|DISTINCT]select_expr,...[FROMtable1[,table2]…]/*FROM子句*/[WHEREwhere_definition]/*WHERE子句*/[GROUPBY{c
ol_name|expr|position}[ASC|DESC],...]/*GROUPBY子句*/[HAVINGwhere_definition]/*HAVING子句*/[ORDERBY{col_name|expr|position}[ASC|DESC],...
]/*ORDERBY子句*/[LIMIT{[offset,]row_count}]/*LIMIT子句*/1.选择指定的列使用SELECT语句选择表中的某些列,各列名之间要以逗号分隔。【例7.12】查询PXSCJ数据库的XSB表
中各个同学的姓名、专业和总学分。USEPXSCJSELECT姓名,专业,总学分FROMXSB;2.定义列别名当希望查询结果中的某些列或所有列显示时且使用自己选择的列标题时,可以在列名之后使用AS子句来指定查询结果的列别
名。语法格式为:SELECTcolumn_name[AS]column_alias【例7.13】查询XSB表中计算机系同学的学号、姓名和总学分,结果中各列的标题分别指定为number、name和mark。SELECT学号ASnumber,姓名ASname,总学分A
SmarkFROMXSBWHERE专业='计算机';查询结果为:1.引用一个表可以用两种方式引用一个表,第一种方式是使用USE语句让一个数据库成为当前数据库,在这种情况下,如果在FROM子句中指定表名,则该表应该
属于当前数据库。第二种方式是指定的时候在表名前带上表所属数据库的名字。例如,假设当前数据库是db1,现在要显示数据库db2里的表tb的内容,使用如下语句:SELECT*FROMdb2.tb;2.引用多个表如果要在不同表中查询数据,则必须在FROM子句中指定多个表。
指定多个表时要使用到连接。把不同表的数据组合到一个表中叫做表的连接。例如,在PXSCJ数据库中需要查找选修了离散数学课程的学生的姓名和成绩,就需要将XSB、KCB和CJB三个表进行连接,才能查找到结果。连接的方式有全连接和JOIN连接两种。(1)全连接连接的第一种方式是将
各个表用逗号分隔,这样就指定了全连接。FROM子句产生的中间结果是一个新表,是每个表的每行都与其他表中的每行交叉产生的所有可能的组合,列包含了所有表中出现的列,也就是笛卡儿积。这样连接表潜在地产生数量非常大的行,因为可能得到的行数为每个表中行数之积。在这样的情形
下,通常要使用WHERE子句设定条件来将结果集减小到易于管理的大小。【例7.14】查找PXSCJ数据库中所有学生选过的课程名和课程号,使用如下语句:SELECTDISTINCTKCB.课程名,CJB.课程号FROMKCB,CJBWHEREKCB.课程号=CJB.课
程号;查询结果为:(2)JOIN连接连接的第二种方式是使用JOIN关键字的连接,JOIN连接主要分为三种:内连接、外连接和交叉连接。1)内连接。使用内连接时需要指定INNERJOIN关键字,并使用ON关键字指定连接条件。例
如,要使用内连接实现例7.14的查询,可以使用以下语句:SELECTDISTINCT课程名,CJB.课程号FROMKCBINNERJOINCJBON(KCB.课程号=CJB.课程号);该语句根据ON关键字后面的连接条件,合并两个表,返回满足条件的行。内连接是系统默认的,可以省略I
NNER关键字。使用内连接后,FROM子句中ON条件主要用来连接表,其他并不属于连接表的条件可以使用WHERE子句来指定。2)外连接。使用外连接需要指定OUTERJOIN关键字,外连接包括:●左外连接(LEFTOUTERJO
IN):结果表中除了匹配行外,还包括左表有的但右表中不匹配的行,对于这样的行,从右表被选择的列设置为NULL。●右外连接(RIGHTOUTERJOIN):结果表中除了匹配行外,还包括右表有的但左表中不匹配的行,对于这样的行,从左表被选择的列设置为NULL。●自然
连接(NATURALJOIN):自然连接还有自然左外连接(NATURALLEFTOUTERJOIN)和自然右外连接(NATURALRIGHTOUTERJOIN)。NATURALJOIN的语义定义与使用了ON条件的INNERJOIN相同。其中的OUTER
关键字均可省略。【例7.15】查找所有学生情况及他们选修的课程号,如果学生未选修任何课,也要包括其情况。SELECTXSB.*,课程号FROMXSBLEFTOUTERJOINCJBONXSB.学号=CJB.学号;3)交叉连接。指定了CROSSJOIN关键字的连
接是交叉连接。不包含连接条件,交叉连接实际上是将两个表进行笛卡儿积运算,结果表是由第一个表的每行与第二个表的每行拼接后形成的表,因此结果表的行数等于两个表行数之积。在MySQL中,CROSSJOIN从语法上来说与I
NNERJOIN等同,两者可以互换。1.比较运算比较运算符用于比较两个表达式的值,MySQL支持的比较运算符有=(等于)、<(小于)、<=(小于等于)、>(大于)、>=(大于等于)、<=>(相等或都等于空
)、<>(不等于)、!=(不等于)。比较运算的语法格式为:expression{=|<|<=|>|>=|<=>|<>|!=}expression其中expression是除TEXT和BLOB外类型的表达式。当两个表达式值
均不为空值(NULL)时,除了“<=>”运算符,其他比较运算返回逻辑值TRUE(真)或FALSE(假)。【例7.16】查询XSB表中总学分大于50的同学的情况。SELECT姓名,学号,出生时间,总学分FROMXSBWHERE总学分>5
0;查询结果为:WHERE子句的查询条件还可以将多个判定运算的结果通过逻辑运算符(AND、OR和NOT)再组成更为复杂的查询条件。NOT表示对判定的结果取反。AND用于组合两个条件,两个条件都为TRU
E时值才为TRUE。OR也用于组合两个条件,两个条件有一个条件为TRUE时值就为TRUE。【例7.17】查询XSB表中专业为计算机,性别为女(0)的同学的情况。SELECT姓名,学号,性别,总学分FROMXSBWHERE专业='计算机'AND性别=0;查询结果为:2.模式匹配(1)LI
KE运算符LIKE运算符用于指出一个字符串是否与指定的字符串相匹配,其运算对象可以是CHAR、VARCHAR、TEXT、DATETIME等类型的数据,返回逻辑值TRUE或FALSE。LIKE运算符表达式的格式为:match_expression[NOT]
LIKEmatch_expression使用LIKE进行模式匹配时,常使用特殊符号"_"和"%",即可进行模糊查询。“%”代表0个或多个字符。“_”代表单个字符。【例7.18】查询PXSCJ数据库XSB表中姓“王”的
学生学号、姓名及性别。SELECT学号,姓名,性别FROMXSBWHERE姓名LIKE'王%';查询结果为:(2)REGEXP运算符REGEXP运算符用来执行更复杂的字符串比较运算。REGEXP是正则表达式(regularexpression)的缩写。和LIKE
运算符一样,REGEXP运算符有多种功能,但它不是SQL标准的一部分,REGEXP运算符的同义词是RLIKE。语法格式如下:match_expression[NOT][REGEXP|RLIKE]match_expressionLIKE运算符有两个符号具有特殊的含
义:“_”和“%”。而REGEXP运算符则有更多的符号有特殊的含义,参见表7.9。特殊字符含义^匹配字符串的开始部分$匹配字符串的结束部分.匹配任何一个字符(包括回车和换行)*匹配星号之前的0个或多个字符的任
何序列+匹配加号之前的1个或多个字符的任何序列?匹配问号之前0个或多个字符{n}匹配括号前的内容出现n次的序列()匹配括号里的内容[abc]匹配方括号里出现的字符串abc[a-z]匹配方括号里出现的a~z之间的一个字符[^a-z]匹配方括号
里出现的不在a~z之间的一个字符|匹配符号左边或右边出现的字符串[[..]]匹配方括号里出现的符号(如空格、换行、括号、句号、冒号、加号、连字符等)[[:<:]和[[:>:]]匹配一个单词的开始和结束[[::]匹配方括号里出现的字符中的任意
一个字符表7.9REGEXP运算符的特殊字符【例7.19】查询姓李的学生学号、姓名和专业。SELECT学号,姓名,专业FROMXSBWHERE姓名REGEXP'^李';查询结果为:【例7.20】查询学号里包含4、5、6的学生学号、姓名和专业。S
ELECT学号,姓名,专业FROMXSBWHERE学号REGEXP'[4,5,6]';查询结果为:【例7.21】查询学号以08开头、08结尾的学生学号、姓名和专业。SELECT学号,姓名,专业FROM
XSBWHERE学号REGEXP'^08.*08$';查询结果为:3.范围比较用于范围比较的关键字有两个:BETWEEN和IN。当要查询的条件是某个值的范围时,可以使用BETWEEN关键字。BETWEEN关键字指出查询范围,格式为:e
xpression[NOT]BETWEENexpression1ANDexpression2当不使用NOT时,若表达式expression的值在表达式expression1与expression2之间(包括这两个值),则返回TRUE,否则返回FALSE
;使用NOT时,返回值刚好相反。使用IN关键字可以指定一个值表,值表中列出所有可能的值,当与值表中的任一个匹配时,即返回TRUE,否则返回FALSE。使用IN关键字指定值表的格式为:expressionIN(ex
pression[,…n])【例7.22】查询PXSCJ数据库XSB表中不在1989年出生的学生情况。SELECT*FROMXSBWHERE出生时间NOTBETWEEN'1989-1-1'and'1989-12-31';【例
7.23】查询专业为“计算机”、“通信工程”或“无线电”的学生的情况。SELECT*FROMXSBWHERE专业IN('计算机','通信工程','无线电');4.空值比较当需要判定一个表达式的值是否为
空值时,使用ISNULL关键字,格式为:expressionIS[NOT]NULL当不使用NOT时,若表达式expression的值为空值,返回TRUE,否则返回FALSE。当使用NOT时,结果刚好相反。【例7.24】查询总学分尚不确定的学生情况。
SELECT*FROMXSBWHERE总学分ISNULL;5.子查询在查询条件中,可以使用另一个查询的结果作为条件的一部分,例如,判定列值是否与某个查询的结果集中的值相等,作为查询条件一部分的查询称为子查询。SQL标准允许SELECT多层嵌套使用,以表示复杂的查询。子查询除了可以用在SEL
ECT语句中,还可以用在INSERT、UPDATE及DELETE语句中。子查询通常与IN、EXIST谓词及比较运算符结合使用。(1)IN子查询IN子查询用于进行一个给定值是否在子查询结果集中的判断,格
式为:expression[NOT]IN(subquery)其中subquery是子查询。当表达式expression与子查询subquery的结果表中的某个值相等时,IN谓词返回TRUE,否则返回FALSE;若使用了NOT,则返回的值刚好相反。【例7.25】查
找选修了课程号为206的课程的学生姓名、学号。SELECT姓名,学号FROMXSBWHERE学号IN(SELECT学号FROMCJBWHERE课程号='206');查询结果为:(2)比较子查询这种子查询可以认为是IN子查询的扩展,它使表达式
的值与子查询的结果进行比较运算,格式为:expression{<|<=|=|>|>=|!=|<>}{ALL|SOME|ANY}(subquery)其中expression为要进行比较的表达式,subquery是子查询。ALL、SOME和ANY说明对比较运算的限制。ALL指定表达式要与
子查询结果集中的每个值进行比较,当表达式与每个值都满足比较的关系时,才返回TRUE,否则返回FALSE。SOME与ANY是同义词,表示表达式只要与子查询结果集中的某个值满足比较的关系时,就返回TRUE,否则返回FALSE。【例7.
26】查找选修了离散数学的学生学号。SELECT学号FROMCJBWHERE课程号=(SELECT课程号FROMKCBWHERE课程名='离散数学');查询结果为:【例7.27】查找XSB表中比所有计算机系的学生年龄都大的学生学号、姓名、专业、出
生时间。SELECT学号,姓名,专业,出生时间FROMXSBWHERE出生时间>ALL(SELECT出生时间FROMXSBWHERE专业='计算机');查询结果为:(3)EXISTS子查询EXISTS谓词用于测试
子查询的结果是否为空表,若子查询的结果集不为空,则EXISTS返回TRUE,否则返回FALSE。EXISTS还可与NOT结合使用,即NOTEXISTS,其返回值与EXISTS刚好相反。格式为:[NOT]EXISTS(subquery)
【例7.28】查找选修课程号为206的课程的学生姓名。SELECT姓名FROMXSBWHEREEXISTS(SELECT*FROMCJBWHERE学号=XSB.学号AND课程号='206');查询结果为:MySQL有4种类型的子
查询:返回一个表的子查询是表子查询;返回带有一个或多个值的一行的子查询是行子查询;返回一行或多行,但每行上只有一个值的是列子查询;只返回一个值的是标量子查询。从定义上讲,每个标量子查询都是一个列子查询和行子查询。上面介绍的子查询都属于列子查询。另外,子查询还可以用在S
ELECT语句的其他子句中。表子查询可以用在FROM子句中,但必须为子查询产生的中间表定义一个别名。【例7.29】从XSB表中查找总学分大于50的男同学的姓名和学号。SELECT姓名,学号,总学分FROM(SELECT姓名,学号,性别,总学分FROMXSBWHERE总学分>50
)ASSTUDENTWHERE性别=1;查询结果为:SELECT关键字后面也可以定义子查询。【例7.30】从XSB表中查找所有女学生的姓名、学号和与081101号学生的年龄差距。SELECT学号,姓名,YEAR(出生时间)-YEAR((SELECT出生时间FROMXSBWHERE学号='08110
1'))AS年龄差距FROMXSBWHERE性别=0;查询结果为:1.聚合函数在介绍GROUPBY子句前先介绍一下聚合函数的概念。聚合函数常常用于对一组值进行计算,然后返回单个值。聚合函数通常与GROUPBY子句
一起使用。如果SELECT语句中有一个GROUPBY子句,则这个聚合函数对所有列起作用,如果没有,则SELECT语句只产生一行作为结果。聚合函数一般用于SELECT语句选择列的后面。表7.10列出了一些常用的聚合函数。函数名说明COUNT求组中项数,返回
int类型整数MAX求最大值MIN求最小值SUM返回表达式中所有值的和AVG求组中值的平均值STD或STDDEV返回给定表达式中所有值的标准差VARIANCE返回给定表达式中所有值的方差GROUP_CONCAT返回由属于一组的列值连接组合而成
的结果BIT_AND逻辑或BIT_OR逻辑与BIT_XOR逻辑异或表7.10聚合函数表(1)COUNT函数最经常使用的聚合函数是COUNT()函数,用于统计组中满足条件的行数或总行数,返回SELECT语句检
索到的行中非NULL值的数目,若找不到匹配的行,则返回0。语法格式为:COUNT({[ALL|DISTINCT]expression}|*)ALL表示对所有值进行运算,DISTINCT表示除去重复值,默认为AL
L。使用COUNT(*)时将返回检索行的总数目,不论其是否包含NULL值。【例7.31】求学生的总人数。SELECTCOUNT(*)AS'学生总数'FROMXSB;查询结果为:【例7.32】统计总学分在50分以上的学生人数。SELECTCOUNT(总学分)AS'总学分50分以上
的人数'FROMXSBWHERE总学分>50;查询结果为:(2)MAX和MIN函数MAX()和MIN()函数分别用于求表达式中所有值项的最大值与最小值,语法格式为:MAX/MIN([ALL|DISTINCT]expression)其中,expression是常量、列、
函数或表达式。【例7.33】求选修课程号为101的课程的学生的最高分和最低分。SELECTMAX(成绩),MIN(成绩)FROMCJBWHERE课程号='101';查询结果为:(3)SUM函数和AVG函
数SUM()和AVG()函数分别用于求表达式中所有值项的总和与平均值,语法格式为:SUM/AVG([ALL|DISTINCT]expression)【例7.34】求学号081101的学生所学课程的总成绩。SELE
CTSUM(成绩)AS'课程总成绩'FROMCJBWHERE学号='081101';查询结果为:【例7.35】求课程号为101的课程的平均成绩。SELECTAVG(成绩)AS'课程101平均成绩'FROMCJBWHERE课程号='101';查询结果为:2.GROUPBY子句GR
OUPBY子句主要用于根据字段对行分组。例如,根据学生所学的专业对XSB表中的所有行分组,结果是每个专业的学生成为一组。GROUPBY子句的语法格式如下:GROUPBY{col_name|expr|p
osition}[ASC|DESC],...【例7.36】将PXSCJ数据库中各专业输出。SELECT专业FROMXSBGROUPBY专业;查询结果为:【例7.37】求PXSCJ数据库中各专业的学生数。SELECT专业,COUNT(*)AS'学生数'FROMXSBGROUPBY专业;查询
结果为:3.HAVING子句使用HAVING子句的目的与WHERE子句类似,不同的是WHERE子句用在FROM子句之后选择行,而HAVING子句用在GROUPBY子句后选择行。例如,查找PXSCJ数据库中平均成绩在85分以上的学生,就是在CJB表上按学号分组后筛选出符合平均成绩大
于等于85的学生。【例7.38】查找平均成绩在85分以上的学生的学号和平均成绩。SELECT学号,AVG(成绩)AS'平均成绩'FROMCJBGROUPBY学号HAVINGAVG(成绩)>=85;查询结果为:如果不使用ORDERBY子句,结果
中行的顺序是不可预料的。使用ORDERBY子句可以保证结果中的行按一定顺序排列。语法格式如下:ORDERBY{col_name|expr|position}[ASC|DESC],...说明:ORDERBY子句后可以是一个列、一个表达
式或一个正整数。正整数表示按结果表中该位置上的列排序。例如,使用ORDERBY3表示对SELECT的列清单上的第3列进行排序。关键字ASC表示升序排列,DESC表示降序排列,系统默认值为ASC。【例7.39】将通信工程
专业的学生按出生时间先后排序。SELECT*FROMXSBWHERE专业='通信工程'ORDERBY出生时间;【例7.40】将计算机专业学生的“计算机基础”课程成绩按降序排列。SELECT姓名,课程名,成绩FROMX
SB,KCB,CJBWHEREXSB.学号=CJB.学号ANDCJB.课程号=KCB.课程号AND课程名='计算机基础'AND专业='计算机'ORDERBY成绩DESC;查询结果为:LIMIT子句是SELECT语句的最后一个子句,主要用于限制SEL
ECT语句返回的行数。语法格式如下:LIMIT{[offset,]row_count}【例7.41】查找XSB表中学号最靠前的5位学生的信息。SELECT学号,姓名,性别,出生时间,专业,总学分FROM
XSBORDERBY学号LIMIT5;查询结果为:【例7.42】查找XSB表中从第4位同学开始的5位学生的信息。SELECT学号,姓名,性别,出生时间,专业,总学分FROMXSBORDERBY学号LIMIT3,5;查询结果为:7.7.1视图的概念
视图与表(有时为与视图区别,称表为基本表——BaseTable)不同,视图是一个虚表,即视图所对应的数据不进行实际存储,数据库中只存储视图的定义,对视图的数据进行操作时,系统根据视图的定义去操作与视图相关联的基本表。视图一经定义,就可以像表一样被查询、修改
、删除和更新。使用视图有下列优点:●为用户集中数据,简化用户的数据查询和处理。有时用户所需要的数据分散在多个表中,定义视图可将它们集中在一起,从而方便用户的数据查询和处理。●屏蔽数据库的复杂性。用户不必了解
复杂的数据库中的表结构,并且数据库表的更改也不影响用户对数据库的使用。●简化用户权限的管理。只需授予用户使用视图的权限,而不必指定用户只能使用表的特定列,增加了安全性。●便于数据共享。各用户不必都定义和存储自己所需的数据
,可共享数据库的数据,这样同样的数据只需存储一次。●可以重新组织数据以便输出到其他应用程序中。视图在数据库中是作为一个对象来存储的。创建视图使用CREATEVIEW语句,基本的语法格式如下:CREATEVIEWview_name[(column_list)]AS
select_statement●view_name。视图名。●column_list。为视图的列定义明确的名称,可使用可选的column_list子句,列出由逗号隔开的列名。column_list中的名称数目必须等于SELECT语句检索的列数。若使用与源表或视图中相同的列名时可以省略
column_list。●select_statement。用来创建视图的SELECT语句,可在SELECT语句中查询多个表或视图。【例7.43】创建PXSCJ数据库上的CS_KC视图,包括计算机专业各学生的学号、其选修的课程号及成绩。USEPXSCJCREA
TEVIEWCS_KCASSELECTXSB.学号,课程号,成绩FROMXSB,CJBWHEREXSB.学号=CJB.学号ANDXSB.专业='计算机';【例7.44】创建PXSCJ数据库上的计算机专业学生的平均成绩视图CS_KC_AVG,包括学号(在视图中列名
为num)和平均成绩(在视图中列名为score_avg)。CREATEVIEWCS_KC_AVG(num,score_avg)ASSELECT学号,AVG(成绩)FROMCS_KCGROUPBY学号;视图定义后,就可以像查询基本表那样对视图
进行查询。【例7.45】在视图CS_KC中查找计算机专业的学生学号和选修的课程号。SELECT学号,课程号FROMCS_KC;【例7.46】查找平均成绩在80分以上的学生的学号和平均成绩。本例首先创建学生平均成绩视图XS_KC_AVG,包括学号(在视图中列
名为num)和平均成绩(在视图中列名为score_avg)。创建学生平均成绩视图XS_KC_AVG:CREATEVIEWXS_KC_AVG(num,score_avg)ASSELECT学号,AVG(成绩)FROMCJBGROUPBY学号;再对XS_KC_
AVG视图进行查询。SELECT*FROMXS_KC_AVGWHEREscore_avg>=80;查询结果为:语法格式如下:DROPVIEW[IFEXISTS]view_name[,view_name]...其中view_name是视图名,声明
了IFEXISTS,若视图不存在的话,不会出现错误信息。使用DROPVIEW一次可删除多个视图。例如:DROPVIEWCS_KC,XS_KC_AVG;将删除视图CS_KC和XS_KC_AVG。7.8.1存储过程使用存储过程的优点如下:●存储过程在服务器端运行,执行速度快
。●存储过程执行一次后,其执行规划就驻留在高速缓冲存储器,在以后的操作中,只需从高速缓冲存储器中调用已编译好的二进制代码执行,提高了系统性能。●确保数据库的安全。使用存储过程可以完成所有数据库操作,并可通过编程方式控制上
述操作对数据库信息访问的权限。1.创建存储过程存储过程可以由声明式SQL语句(如CREATE、UPDATE和SELECT等语句)和过程式SQL语句(如IF-THEN-ELSE语句)组成。创建存储过程使用CREATEPROCEDURE语句,语法格式如
下:CREATEPROCEDUREsp_name([[IN|OUT|INOUT]param_nametype[,...]])<routine_body><routine_body>是存储过程的主体部分,也叫做存储过程体。它包含了
在过程调用的时候必须执行的语句,这个部分总是以BEGIN开始,以END结束。当然,当存储过程体中只有一个SQL语句时可以省略BEGIN-END标志。另外,BEGIN-END复合语句还可以嵌套使用。在开始创建存储过程之前,先介绍一个很实用的命令:DELI
MITER命令。在MySQL中,服务器处理语句的时候是以分号为结束标志的。但是在创建存储过程的时候,存储过程体中可能包含多个SQL语句,每个SQL语句都是以分号为结尾的,这时服务器处理程序遇到第一个分号的时候就会认为程序结束,这肯定是
不行的。所以这里使用DELIMITER命令将MySQL语句的结束标志修改为其他符号。例如:DELIMITER$$执行完这条命令后,程序结束的标志就换成两个美元符“$$”了。要想恢复使用分号“;”作为结束符,运行下面命令即可:DELIMITER;存储过程体中可以包含所有类型的
SQL语句,另外还可以包含以下内容。(1)局部变量使用DECLARE语句声明局部变量,例如,声明一个整型变量和两个字符变量:DECLAREnumINT(4);DECLAREstr1,str2VARCHAR(6);说明:局部变
量只能在BEGIN_END语句块中声明。(2)使用SET语句赋值要给局部变量赋值,可以使用SET语句,例如:SETnum=1,str1='hello';说明:这条语句无法单独执行,只能在存储过程和存储函数中使用。(3)SELECT...INT
O语句使用SELECT…INTO语句可以把选定的列值直接存储到变量中。因此,返回的结果只能有一行。例如:SELECT姓名,专业INTOname,projectFROMXSBWHERE学号='081101';(4)流程控制语句在MySQL中,常见的过程式SQL
语句可以用在一个存储过程体中。例如,IF语句、CASE语句、WHILE语句等。●IF语句。IF-THEN-ELSE语句可根据不同的条件执行不同的操作。语法格式为:IFsearch_conditionTHENstatement_list[ELSEIFsearch
_conditionTHENstatement_list]...[ELSEstatement_list]ENDIF说明:search_condition是判断的条件,statement_list中包含一个或多个SQL语句。当search_condition的条
件为真时,就执行相应的SQL语句。●CASE语句。语法格式为:CASEcase_valueWHENwhen_valueTHENstatement_list[WHENwhen_valueTHENstatement
_list]...[ELSEstatement_list]ENDCASE或者:CASEWHENsearch_conditionTHENstatement_list[WHENsearch_conditionTHENstatement_list]...[ELSEstatemen
t_list]ENDCASE第一种格式中case_value是要被判断的值或表达式,接下来是一系列的WHEN-THEN块,每一块的when_value参数指定要与case_value比较的值,如果为真,就执行statement_list中的SQL语句。如果前面的每一块都不匹配就
执行ELSE块指定的语句。CASE语句最后以ENDCASE结束。第二种格式中CASE关键字后面没有参数,在WHEN-THEN块中,search_condition指定了一个比较表达式,表达式为真时执行THEN后面的语句。与第一种格式相比,这种格式能够实现更为复杂的条件判断,使用起来更方
便。●WHILE语句。语法格式为:WHILEsearch_conditionDOstatement_listENDWHILE说明:语句首先判断search_condition是否为真,为真则执行stat
ement_list中的语句,然后再次进行判断,为真则继续循环,不为真则结束循环。【例7.47】创建一个存储过程,实现的功能是删除一个特定学生的信息。DELIMITER$$CREATEPROCEDUREDELETE_STUDENT(INXHCHAR(6))BEGINDELETE
FROMXSBWHERE学号=XH;END$$DELIMITER;【例7.48】创建一个存储过程,有两个输入参数XH和KCM,要求当某学生某门课程的成绩小于60分时将备注修改为“有课程没过”,大于等于60分时将该成绩修改为6
0分。DELIMITER$$CREATEPROCEDUREDO_UPDATE(INXHCHAR(6),INKCMCHAR(16))BEGINDECLAREKCHCHAR(3);DECLARECJTINYINT;SELECT课程号INTOKCHFROMKC
BWHERE课程名=KCM;SELECT成绩INTOCJFROMCJBWHERE学号=XHAND课程号=KCH;IFCJ<60THENUPDATEXSBSET备注='有课程没过'WHERE学号=XH;ELSEUPDATECJBSET成绩=60WHERE学号=X
HAND课程号=KCH;ENDIF;END$$DELIMITER;2.调用存储过程存储过程创建完后,可以使用CALL语句来调用。语法格式如下:CALLsp_name([参数[,...]])【例7.49】创建存储过程,实现查询XSB表中学生人数的功能,该存储过程
不带参数。CREATEPROCEDUREDO_QUERY()SELECTCOUNT(*)FROMXSBORDERBY学号;调用该存储过程:CALLDO_QUERY();查询结果为:【例7.50】假设例7.47中的存储过程已经创建,调用该存储过程。CALLD
ELETE_STUDENT('081101');3.删除存储过程存储过程创建后需要删除时使用DROPPROCEDURE语句。例如,删除存储过程DELETE_STUDENT可以使用如下语句:DROPPROCEDUREIFEXISTSDELETE_STUDENT
;存储函数也是过程式对象,与存储过程很相似。它们都是由SQL和过程式语句组成的代码片断,并且可以从应用程序和SQL中调用。然而,它们也有一些区别:●存储函数不能拥有输出参数,因为存储函数本身就是输出参数;●不能用CALL语句来调用存储函数;●存储函数必须包
含一条RETURN语句,而这条特殊的SQL语句不允许包含于存储过程中。使用CREATEFUNCTION语句创建存储函数。语法格式如下:CREATEFUNCTIONsp_name([参数[,...]])RETURNStyperoutine_body【例7.51】创建一个存储函数,返回某个学生的
姓名。DELIMITER$$CREATEFUNCTIONNAME_OF_STU(XHCHAR(6))RETURNSCHAR(8)BEGINRETURN(SELECT姓名FROMXSBWHERE学号=XH);END$$DELIMITER;存储函数创建完后使
用SELECT关键字调用,例如,调用上例中的存储函数,可以使用以下语句:SELECTNAME_OF_STU('081102');若要删除存储函数,可以使用DROPFUNCTION语句,例如:DROPFUNCTIONNAME_OF_STU;创
建触发器使用CREATETRIGGER语句,语法格式如下:CREATETRIGGERtrigger_nametrigger_timetrigger_eventONtbl_nameFOREACHROWtrigger_stmt
●trigger_name。触发器的名称。●trigger_time。触发器触发的时刻,有两个选项AFTER和BEFORE,以表示触发器是在激活它的语句之前还是之后触发。●trigger_event。触发事件,指明激活触发程序的语句的类
型。trigger_event可以是INSERT、UPDATE和DELETE,分别表示插入、修改、删除数据时激活触发器。●tbl_name。与触发器相关的表名,在该表上发生触发事件才会激活触发器。同一个表不能拥有两个具有相同触发时刻和事件的触发器。●trigger_stmt。
触发器动作,包含触发器激活时将要执行的语句。如果要执行多个语句,可使用BEGIN...END复合语句结构,这样就能使用存储过程中允许的相同语句。对于INSERT语句,只有NEW是合法的;对于DELETE语句,只有OLD是合法的;而UPDATE语句可以与NEW或OLD同时使用。【
例7.52】创建一个触发器,当删除表XSB中某个学生的信息时,同时将CJB表中与该学生有关的数据全部删除。DELIMITER$$CREATETRIGGERXS_DELETEAFTERDELETEONXSBFOREACHROWBEGINDELETEFROM
CJBWHERE学号=OLD.学号;END$$DELIMITER;现在验证一下触发器的功能:DELETEFROMXSBWHERE学号='081101';使用SELECT语句查看CJB表中的情况:SELECT*FROMCJB;删除触发器也是使用DROP语句
,例如:DROPTRIGGERXS_DELETE;7.9.1创建数据库和表1.创建数据库以创建PXSCJ2数据库为例,创建数据库的方法如下:(1)打开“开始”→“程序”→“MySQL”→“MySQLAdministrat
or”菜单项,如图7.9所示,ServerHost为“localhost”,Username为“root”,输入密码,单击【OK】按钮。主机名用户名密码图7.9登录MySQLAdministrator(2)在MySQLAdmini
strator窗口中展开Catalogs选项栏,出现如图7.10所示的数据库列表,在任意一个数据库名上右击鼠标,选择“CreateNewSchema”子选项。Catalogs选项栏数据库列表图7.10选择创建数据库选单项(3)出现
如图7.11所示的界面,输入需要创建的数据库名PXSCJ2,单击【OK】按钮。这样数据库PXSCJ2就创建成功了。图7.11输入数据库名2.创建表若要在数据库PXSCJ2中创建XSB表,步骤如下:(1)在MySQLAdministrator窗口中展开Catalogs选项栏,在数据
库PXSCJ2上右击鼠标,在弹出的快捷单上选择“CreateNewTable”选项,或者直接单击【CreateTable】按钮。(2)在弹出的“MySQLTableEditor”窗口中输入表名XSB,在“ColumnsandIndices”子选框
中输入表的各列及数据类型,如图7.12所示,单击【ApplyChanges】按钮。在弹出的“ConfirmTableEditor”对话框中单击【Execute】按钮,即可成功创建表XSB。输入表名列名列类型
图7.12创建表如果要在数据库中删除表,步骤如下:(1)在MySQLAdministrator窗口中展开Catalogs选项栏,选择数据库(如PXSCJ2),在快捷选单上右击要删除的表,选择“DropTable”选项。(2)在弹出对话框中单击【DropTa
ble】按钮,即删除了表。如果要修改表,可以在步骤(1)中选择“EditTable”选项,在弹出的窗口中进行修改,修改后单击【ApplyChanges】按钮即可完成。启动MySQLAdministrator,在Catalogs选项栏中选中数据库PXSCJ2,再选中需要操作
的表(XSB),右击,在弹出的快捷选单中选择“EditTableData”选项,进入操作所选择的表数据窗口,如图7.13所示。添加记录的方法是:单击图7.13界面中下方工具栏的“Edit”选项,双击需要输入的地方,将数据写入,
每输入一个值,按回车键。每输入完一行值,将光标移到下一行中,如图7.14所示。数据输入完毕后单击【ApplyChanges】按钮保存结果。图7.13表数据操作单击Edit进行修改双击右侧Schemata栏内数据库PXSCJ2中的XSB表,单击【Execute】按钮可查看插入数据后的XSB表。修改
记录的方法和添加数据基本相同。进入图7.13所示的窗口后单击“Edit”选项,双击需要修改的地方,输入新记录,修改完后单击【ApplyChanges】按钮即可。删除记录的方法是:在操作数据的窗口(见图7.14),将当前光标移动到要
删除的行,单击鼠标右键,在弹出的快捷选单上选择“deleterow(s)”选项,再单击【ApplyChanges】按钮即删除了该行记录。保存记录执行按钮图7.14添加数据除了用命令行进行查询外,还可以用MySQL的查询工具MyS
QLQueryBrowser进行数据查询。查询方法如下:启动MySQLQueryBrowser,输入服务器名、用户名和密码(与MySQLAdministrator工具一样),在DefaultSchema栏后的文本框中输入要设定的当前数
据库名。连接后进入MySQLQueryBrowser主窗口,如图7.15所示。图7.15MySQLQueryBrowser主窗口输入SQL语句显示结果1.备份数据库(1)登录MySQLAdministrator,在MySQLAdministrator管理器窗口选中“Backup”选项栏,在出现的
“BackupProject”栏上单击【NewProject】按钮,如图7.16所示。备份名Backup选项栏图7.16在MySQLAdministrator中选择备份功能(2)在Projectname
栏上输入要创建备份的名称,在Schemata选项框中选择需要创建的数据库名称(以PXSCJ数据库为例),单击【>】按钮,在MySQLAdministrator中出现如图7.17所示的备份选项。要取消,单击【<】按钮。(3)选择要备份的数据库中的表,单击【ExecuteB
ackupNow】按钮,出现保存数据对话框,选择要备份的路径,并单击【保存】按钮。备份完成后可以在指定的目录中找到一个.sql格式的文件,里面保存了与数据库相关的一系列SQL语句。要备份的数据库列表单击
备份选择需要备份的表文件图7.17选择需要备份的数据库2.恢复数据库(1)登录MySQLAdministrator,在MySQLAdministrator管理器窗口选中Restore选项栏,在弹出的菜单上选择“OpenBackupFile”选项
。在弹出的对话框中选择需要恢复的备份,单击【打开】按钮,如图7.18所示。图7.18在MySQLAdministrator中选择恢复功能Restore选项栏已经保存的备份(2)在随后的恢复选项中,如图7.19所示,选择要恢复的类型,然后单击【
StartRestore】按钮即可。(3)如果提示数据库恢复成功,在Catalogs目录下就能查看数据库恢复的具体情况。单击此按钮开始恢复图7.19恢复选项