第5 章 ySQL语 作为目 用最 的DBMS ySQL支持众 的 付SQL进行了相应的扩展。本 SOL(结构 化 进一步具 5.1 MySQL语言简介 在 MySQL数据库中,SQL语言由以下几部分组成 (1)数据定义语言(DDL)用于执行数据库的任务,对数据库及数据库中的各种对象进 创建、删 多改等操 器和存储过程等。D 数据库对象 要语句及功能如 要包括:表、默认约束 5.1所示 规则、视图 r量 句 语句及功能 CREATE 其 ALTER (2)数据操纵语言(DML)用于操纵数据库中各种对象,检索和修改数据。DM包括的主时4所 其D 要语句及功能如表52 表52 DML主要语包及功能 是使用最 据插 TE修 ELETE 既可修 从表或视图中除数据 的一行数 可根据条件 也可修 的数据 制语言(DL)用于安全管理 DCL包括的主要语句及功能如表53所示 确定哪些用户 查看或修改数据 数据
⊥第5章MsOL语言上 第5 DCL主要语句及功棵 图53 投子权果可把语句许可成对象许可的权限投子其他用户和角色 L语 kE数权限与 GRANT的功能相反。但不影响读用户或角色从其他角色中作为成员承许可权限 为了用户编程的方便, MySQL增加了语言元素。这些语言元素包括常量、变量,运算符、 函数,流程控制语句和注解等。本章将具体讨论使用 MySQL这部分增加的语言元素 (结构化查询语 每个SQL语句都以分号结束,并且SQL处理器忽略空格、制表符和回车符。 步具体介绍 52常量和变量 5.2.1常量 常量指在程序运行过程中值不变的量。常量又称为字面值或标量值。常量的使用格式取决于 的数据类型,可分为字符串常量、数值常量十六进制常量、时间日期常量、位字段值、布尔 的各种对象进 和NUL值 则、视图 1.字符串常量 字符串是指用单引号或双引号括起来的字符序列,分为ASCⅡ字符串常量和 Unicode字符串 ASCⅡ字符串常量是用单引号括起来的,由ASC字符构成的符号串,例如 " How are you! Unicode字符串常量与ASCⅡ字符串常量相似,但它前面有一个N标志符(N代表SQL-92 9式不同 标准中的国际语言( National Language)。N前缀必须为大写。只能用单引号括起字符串,例如 代不同 Unicode数据中的每个字符用两个字节存储,而每个 ASCII字符用一个字节存储 在字符串中不仅可以使用普通的字符,也可使用几个转义序列,它们用来表示特殊的字符 包括的如表54所示。每个转义序列以一个反斜杠(“”)开始,指出后面的字符使用转义字符来解释 而不是普通字符。注意NUL字节与NULL值不同,NUL为一个零值字节,而NUL代表没有值 表5.4 字符串转义序列 一个ASCⅡ0(NUL)字符 一个换行符 一个同车符( Windows中使用rn作为新行标志) 个定位符 一个退格符 的数据, 一个ASC26字符(CTRL+2) 个单引号(“”) 个双引(
Ms数库教程(视频指导)下 %”符,它用于在正文中搜索“”的文字实例,否则这里“”将解释为 ”符。它用于在正文中搜索“”的文字实例,否则这里“”将解释为 5.1】执行如 行结果如图51所 其中,“n” 有以下几种方式可以在字符串中包括引号 (1)在字符串内用单引号“引用的单引号“”可以写成“”(两个单引号) (2)在字符串内用双引号“”引用的双引号“”可以写成 (两个双引号) (3)可以在引号前加转义字符(“”) (4)在字符串内用双引号“”引用的单引号“不需要特殊处理,不需要用双字符或转 同样,在字符串内用单引号“”引用的双引号“”也不需要特殊处理 执行下面的语句 select hel1',t"he110“,'"“he11 语句中第4个“hel”中间是两个单引号而不是一个双引号 执行结果如图52所示 5.2执 2.数值常量 数值常量可以分为整数常量和浮点数常量 整数常量即不带小数点的十进制数,例如:1894,2,+145345234,-2147483648 浮点数常量是使用小数点的数值常量,例如:526.-139,1015E5,05E2
第6章My5OL语 3十六进制常量 释为 MySQL支持十六进制值,一个十六进制值通常指定为一个字符串常量,每对十六进制数字 被转换为一个字符,其最前面有一个大写字母“X”或小写字”x”在引号中只可以使用数字“0 到"9“及字母“”到“或“A到F”,例如:x4表示大写字母A.x4D7053514C表示字 符串 MySQL 人六进制数值不区分大小写,其前X或“”可以被0取代面且不用引号,即X 替换为0x41,注意,“0x”中x一定要 4、十六进制值的默认类型是字符串。如果想要确保该值作为数字处理,可以使用CAST(A 执行如下语句 select ox4, cast (0x41 as unsigned) 执行结果如图5.3所示。 图53执行结果 如果要将一个字符串或数字转换为十六进制格式的字符串,可以用HEXO函数 【例52】将字符串CAT转换为16进制。 lect hex['CAT): 执行结果如图54所示。 符或转文 图54执行结果 十六进制值通常用来存储图像(如JPG)和电影(如AV1)等格式的数据 4.日期时间常量 日期时间常量:由用单引号将表示日期时间的字符串括起来的形式构成。 日期型常量包括年、月、日,数据类型为DATE,按年月-日的顺序表示,中间的间隔符“ 也可以使用如“”“@”或“%”等特殊符号。例如:“201406-17”。 时间型常量包括小时、分钟、秒及微秒数,数据类型为TME,按“时分-秒.微秒”的格式 表示。例如:“12:30:43.00013”。 日期时间的组合数据类型为 DATETIME或 TIMESTAMP,如“201406-17123043 DATETIME的年份在1000-999之间,而 TIMESTAMP的年份在1970~2037之间,还有就是 MESTAMP在插入带微秒的日期时间时将微秒忽略。 TIMESTAMP还支持时区,即在不同时区 转换为相应时间。 5.位字段值 可以使用 b'value符号写位字段值。vale是一个用0和1写成的二进制值。直接显示 b'value' 79
显示为一个笑脸图标 使用 系列特殊的符 以将位字段常量显示为 使用OCT函数可以将位 型格式 执行 执行 6.布尔值 布尔值只包含两个可能的值:TRUE和 FALSE: FALSE的数字值为“0”,TRUE的数字值 【例53】获取 FALSE的值。 执行结果如 7.NUL值 NULL值可适用于各种列类型,它通常用来表示“没有值”“无数据”等意义,并且不同于数 字类型的 或字符串类 空字符串 52.2变量 变量用于临时存放数据,变量中的数据随着程序的运行而变化,变量有名字及其数据类型两 个属性。变量名用于标识该变量,变量的数据类型确定了该变量存放值的格式及允许的运算 0中,变量可分为用户变量和 用户变量 系统变量 用户可以在表达式中使用自己定义的变量,这样的变量叫作用户变量 在使用用户变量前必须定义和初始化。如果使用没有初始化的变量,它的值为NUL 用户变量与连接有关。也就是说,一个客户端定义的变量不能被其他客户端看到或使 客户端退出时,该客户端连接的所有变量将自动释放。 定义和初始化一个变量可以使用SET语句,语法格式为 用 s?用户变量=exP11,用户变量2=xpx2, 其中,用户变量名可以由当前字符集的文字数字字符、“”“”和“S”组成。当变量名中雷 要包含了一些特殊符号(如空格、#等)时,可以使用双引号或单引号将整个变量括起来 expr要给变量赋的值,可以是常量、变量或表达式
字段常量 5章 MySOL语言 【例54】创建用户变量和查询用户变量的值 et的uer1=1,工2=2,由证sex3=3; e4一uz3+2 其中 (1)创建用户变量nane并赋值为“王林” (2)创建用户变量 user并赋值为1,usen2赋值为2,user3赋值为3 (3)创建用户变量uscr4,它的值为user3的值加1 (4)查询用户变量name的值。执行结果如图57所示。 数字 图5.7执行结果 在一个用户变量被创建后,它可以以一种特殊形式的表达式用于其他SQL语句中。变量名前 必须加上符号@,以便将它和列名区分开。 【例55】使用查询给变量赋值。 se xac) set student( select姓名 from xs where学号=1081101) 【例56】查询表xs中名字等于 student值的学生信息 select学号,姓名,专业名,出生日期 于数 执行结果如图5.8所示 图5.8执行结果 在 SELECT语句中,表达式发送到客户端后才进行计算。这说明在 HAVING、GRO 期BY或 ORDER BY子句中,不能使用包含 SELECT列表中所设的变量的表达式。 对于SET语句,可以使用“=”或“=”作为分配符。分配给每个变量的值可以为整数、实 数、字符串或NULL值。 也可以用其他SQL语句代替SET语句来为用户变量分配一个值。在这种情况下,分配符必 须为“=”,而不能用“”,因为在非SET语句中“=”被视为比较操作符 例57】执行如下语句 结果口的值为
MsOL数据库教程(视频指导版)上 2.系统变量 MySQL有一些特定的设置,这些设置就是系统变量。和用户 值和一个数据类型,但不同的是,系统变量在MSOL服务器启动时就被引入并初电 【例58】获得现在使用的 MySQL版本 celect eversman 执行结果如图59所示。 大多数的系统变量应用于其他SQL语句中时,必须在名称前加两个@符号,而 与其他SOL产品保持一致,某些特定的系统变量是要省略这两个@符号的 镜明 CURRENT DATE(系日期) CURRENT TIME(系统时间) CURRENT TIMI7 (系统日期和时间)和 CURRENT USER(SQL用户的名字) 【例59】获得系统当前时间 select CURRENT TIME: 执行结果如图5.10所示 图5.10执行结果 在 MySQL中,有些系统变量的值是不可以改变的,例如 VERSION和系统日期。而有些系 统变量是可以通过SET语句来修改的,例如 SQL WARNINGS T语句的语法格式如下 9ET系统变量名=expr GLOBAL1 SESSION)系统变量名=expr 1每(q1ba1, session.1系统变量名=expr 指定了 GLOBAL或@@ global关键字的是全局系统变量。指定了 SESSION或 a@ session.关键字的则为会话系统变量。如果在使用系统变量时不指定关键字,则默认 为会话系统变量 (1)全局系统变量 当 MySQL启动的时候,全局系统变量就初始化了,并且应用于每个启动的会话。如果使用 GLOBAL(要求 SUPER权限)来设置系统变量,则该值被记住,并被用于新的连接,直到服务 器重新启动为止。 【例5.10】将全局系统变量 sort buffer size的值改为25000
统 第5章My5QL语言 始化 果在使用 SET GLOBAL时同时使用了一个只能与 SET SESSION同时使用的变 意量,或者如果在设置一个全局变量时未指定 GLOBAL(或回回),则 MySOL会产生错误 2)会话系统变量 会话系统变量只适用于当前的会话。大多数会话系统变量的名字和全局系统变量的名字相同 每个会话系统变量都和同名的全局 值是可以改变的,但是这个新的值仅适用于正在运行的会话,不适用于所有其他会话 【例511】将当前会话的 SOL WARNINGS变量设置为TRLE。 这个系统变量表示如果不正确的数据通过一条 INSERT语句添加到一个表中 小SQL是否应该返回一条警告。默认情况下,这个变量是美闭的,设为ON表示返回警 号的 IMESTAY 【例512】对于当前会话,把系统变量 SOL SELECT LIMIT的值设置为10,这个变量决定 了 SELECT语句的结果集中的最大行数。 执行结果如图5.11所示 而有些系 在这个例子中,美键字 SESSION放在系统变量的名字前面( SESSION和 LOCAL 可以通用)这明确地表示会话系统变量 SQL SELECT LIMIT和SET语句指定的值保 持一致。但是,名为 SQL SELECT LIMIT的全局系统变量的值仍然不变。同样,如果 改变了全局系统变量的值,同名的会话系统变量的值保持不变 MySQL对于大多数系统变量都有默认值。当数据库服务器启动的时候,就使用这些值 如果要将一个系统变量值设置为 MySQL默认值,可以使用 DEFAULT关键字。 【例513】把 SQL SELECT LIMIT的值恢复为默认值。 et B0LDCAL, SQL SELECT LIMIT DEFAULT 默认 用户使用 SHOW VARIABLES语句可以得到系统变量清单,使用 SHOW GLOBAL VARIABLES可以返回所有全局系统变量,使用 SHOW SESSION VARIABLES可以返回所有会话 系统变量。要获得与样式匹配的具体的变量名称或名称清单,需使用LKE子句,要得到名称与 样式匹配的变量的清单,需使用通配符“ 服务 【例5.14】得到系统变量清单 ahow show variables llke max Join sizer, show global varlables like 'max join aize'i es like.ch
MSOL数据库教程(视 指导版) 5.3运算符与表达式 sQL提供如下 算符可以连接运算量构 算符:算术运算符、位运算符、比较运算符 运 531算术运算符 算术运算符在两个表达式上执行 算符有 加)、-(减 数学运算,这两个 运算符 乘入/(除)和%(求模)5种 数字数据类数 算符用于获得 或多个值的 执行结果 5, 5.12所示 (2)“”运算符 图512执行结果 用于从一个值中减去另一个 执行结果 数符号 所示 若该操作符与BGNT同 意生 的数运算中,应当避使用号 返回值 个 这 其中,+(加 否则会出现错误 可能产 减)运算符还可用于对日期时同值(如D 1E)s 执行结果如图514所示 图5
15数教程(频指导) 比较运算符 比较运算符(又称关系运算符).用于比较两个表达式的值,其运算结果为逻辑值,可以 算符 :1(真)、0(假)及NUL(不确定)表5.5列出了在 MySQL中可以使用的各种 55 比较运算符 算符 小于等 比较运算符可以用于比较数字和字符串。数字作为浮点值比较,而字符串以不区分大小写 方式进行比较(除非使用特殊的 BINARY关键字)前面已经介绍了在运算过程中 MySQL能够 自动地把数字转换为字符串,而在比较运算过程中, MySQL能够自动地把字符串转换为数字 下面这个例子说明了在不同的情况下 MySQL以不同的方式处理数字和字符串。 【例515】执行 j结果如图 5.19所示 图519执行结果 (1)“=”运算符 下 运算符用于比较 表达式的两 等,也可以 执行结果如图 较,示例如下 图520执行结 因为在默认情况下 MySQL以不区分大小写的方式比较字符串,所以表达式》一A溶 的结果为真。如果想执行区分大小写的比较,可以添加 BINARY关键字,这您味着对字 遭符串以二进制方式处理。当在字符串上执行比较运算时,MSQL将区分字符串的大 写 使用 BINARY关键字示例如