第3章〓结构化查询语言 结 构化查询语言(SQL) 是使用关系模型的数据库应用语言。“不以规矩,不能成方圆。”作为程序员,必须要遵守规则与规范。遵守一定的规则与规范可以使程序更容易阅读和调试。运用运算符则可以让程序员灵活地使用表中的数据,常见的运算符类型有算术运算符、比较运算符、逻辑运算符和位运算符。本章将通过丰富的案例和7个课业任务分别演示算术运算符、比较运算符、逻辑运算符和位运算符的使用,并通过MySQL Workbench工具和 Navicat Premium工具进行一些运算。 【教学目标】 掌握SQL的规则与规范; 熟练掌握MySQL运算符的使用; 掌握运算符的优先级; 能够使用MySQL Workbench工具进行比较运算; 能够使用Navicat Premium工具进行综合运算。 【课业任务】 王小明想利用MySQL+Java开发一个数据库学习系统,在掌握了MySQL的安装与配置以后,需要熟悉SQL的规则与规范,并能够灵活地运用运算符处理数据,现通过7个课业任务来完成。 课业任务31算术运算符的应用 课业任务32比较运算符的应用 课业任务33逻辑运算符的应用 课业任务34位运算符的应用 课业任务35运算符的综合应用 课业任务36使用MySQL Workbench工具进行比较运算 课业任务37使用Navicat Premium工具进行综合运算 3.1SQL的概述 3.1.1SQL的背景 1974年,IBM公司的研究员发布了一篇关于数据库技术的论文——《SEQUEL: 一门结构化的英语查询语言》,从而引出SQL,直到目前为止,这种结构化查询语言并没有太大的变化,与其他语言相比,SQL的半衰期可以说是非常长了。 SQL是使用关系模型的数据库应用语言,可以应用到所有关系数据库中,如MySQL、Oracle、SQL Server、达梦等,它同时也是与数据直接“打交道”的一种语言。SQL由IBM公司在20世纪70年代开发出来,由美国国家标准学会(American National Standards Institute,ANSI)着手制定标准,先后有SQL86、SQL89、SQL92、SQL99等标准。其中最重要的两个标准是SQL92和SQL99,分别代表了1992年和1999年颁布的SQL标准,现在的SQL依然遵循这些标准。 自从SQL加入了TIOBE编程语言排行榜,就一直保持在前10,如图31所示。 图31TIOBE编程语言的排行榜 不同的数据库生产厂商都支持SQL,但很多数据库有自己特有的内容,如MySQL中的LIMIT语句就是MySQL特有的语句,其他数据库都不支持。当然,Oracle和SQL Server也都有自己特有的语句,数据库的特有内容图解如图32所示。 图32数据库的特有内容图解 3.1.2SQL的分类 SQL在功能上主要分为以下3类。 (1) 数据定义语言(Data Definition Language,DDL): 主要用于定义数据库、数据表、索引、视图等数据库对象,还可以用来创建、删除、修改数据库和数据表的结构。其关键字包括CREATE、DROP、ALTER等。 (2) 数据操作语言(Data Manipulation Language,DML): 主要用于添加、删除、更新和查询数据库记录,并检查数据的完整性。其 关键字包括INSERT、DELETE、UPDATE、SELECT等,其中SELECT是SQL的基础,最为重要。 (3) 数据控制语言(Data Control Language,DCL): 主要用于定义数据库、数据表、字段、用户的访问权限和安全级别。其 关键字包括GRANT、REVOKE、COMMIT、ROLLBACK、SAVEPOINT等。 因为查询语句的使用非常频繁,所以可以把查询语句单独作为一类,另外将COMMIT、ROLLBACK单独作为一类,具体如下。 (1) 数据查询语言(Data Query Language,DQL): 主要用于查询记录(数据),执行SELECT操作。数据库执行DQL语句不会对数据进行改变,而是让数据库发送结果集给客户端。 (2) 事务控制语言(Transaction Control Language,TCL): 主要用于事务管理,如果需要在一个事务中包含多条SQL语句,那么需要开启事务和结束事务。其 关键字包括COMMIT(提交)、ROLLBACK(回滚)、SAVEPOINT(保存点)等。 3.2SQL的规则与规范 3.2.1SQL的基本规则 作为程序员,规则是一定要遵守的,如果不遵守规则,程序就会出错,无法执行。以下是使用SQL必须遵守的基本规则。 (1) SQL语句可以单行或多行书写。为了提高可读性,各子句可分行书写,必要时使用缩进。 (2) 每条命令以分号(;)、\g或\G结尾。 (3) 关键字不能缩写,也不能分行。 (4) 必须保证所有括号、单引号、双引号是成对结束的。 (5) 必须使用英文状态下的半角输入方式。 (6) 字符串和日期时间类型的数据可以使用单引号表示。 (7) 列的别名尽量使用双引号,而且不建议省略AS。 3.2.2SQL大小写的规范 规范是建议程序员去遵守的,遵守一定的规范可以使程序更容易阅读和调试,提高复写性。以下是SQL大小写的规范。 (1) MySQL在Windows环境下是大小写不敏感的。 (2) MySQL在Linux环境下是大小写敏感的: 数据库名、表名、表的别名、变量名是严格区分大小写的; 关键字、函数名、列名(字段名)、列的别名(字段的别名)是忽略大小写的。 (3) 推荐采用统一的书写规范: 数据库名、表名、字段名、变量名、视图名、索引名、存储名、触发器名等都用小写; SQL关键字、函数、数据类型等都用大写。 3.2.3MySQL注释符 注释用于说明SQL语句的作用或存储过程中代码块的逻辑,在解析SQL代码时,MySQL会忽略注释部分,只执行除注释以外的SQL部分。MySQL可以使用以下3种注释结构。 (1) 单行注释: #注释文字。 (2) 单行注释: 注释文字(后面必须有一个空格)。 (3) 多行注释: /*注释文字*/。 3.2.4MySQL数据库对象的命名规范 用户在使用MySQL时需要遵循一定的命名规范,扬长避短。以下是MySQL数据库对象的命名规范。 (1) 数据库名、表名不能超过30个字符,变量名的长度限制为29。 (2) 名称中只能包含A~Z、a~z、0~9,共62个字符。 (3) 数据库名、表名、字段名等对象名中不能有空格。 (4) 在同一个MySQL软件中,数据库不能重名; 在同一个数据库中,表不能重名; 在同一个表中,字段不能重名。 (5) 必须保证字段没有与保留字、数据库系统或常用方法冲突。如果一定要使用,则必须在SQL语句中使用着重号(`)引起来。 (6) 在命名字段并为其指定数据类型时一定要保证一致性。 3.3运算符 3.3.1算术运算符 算术运算符主要用于数学运算,其可以连接运算符前后的两个数值或表达式,对数值或表达式进行加(+)、减(-)、乘(*)、除(/)和求模(或称为求余,%)运算。MySQL中的算术运算符如表31所示。 表31算术运算符 运算符名称作用 +加法运算符计算两个值或表达式的和 -减法运算符计算两个值或表达式的差 *乘法运算符计算两个值或表达式的乘积 /或DIV除法运算符计算两个值或表达式的商 %或MOD求模(求余)运算符计算两个值或表达式的余数 1. 加法运算符与减法运算符 加法运算符(+)用于计算一个或多个值的和; 减法运算符(-)用于从一个值中减去另外一个值。 【案例31】加法运算符和减法运算符的应用。 在MySQL中,数字6加上一个数字或减去一个数字的SQL语句如下。 SELECT 6, 6+0, 6-0, 6+10, 6-10, 6+10-2, 6+4.5, 6-4.5 FROM dual; 执行上述SQL语句,运行结果如图33所示。 图33加法运算符和减法运算符的应用 说明: (1) 一个整数类型的值对整数(浮点数)进行加法和减法操作,运算结果还是一个整数(浮点数)。 (2) 加法运算符和减法运算符的优先级相同,进行先加后减操作与进行先减后加操作的结果是一样的。 (3) 在MySQL中不需要虚拟表(dual)也可以进行加法、减法运算。 (4) 在早期的MySQL 5.1版本之前是没有虚拟表(dual)的,现在大多使用MySQL 5.5以上的版本,所以在MySQL中存在和Oracle中类似的虚拟表(dual),官方声明是为了满足SELECT…FROM…结构,在MySQL中会忽略对该表的引用。 在MySQL(SQL语句需要以分号结尾)和SQL Server(SQL语句不需要以分号结尾)中可以直接用SELECT 1,不需要加“FROM 表名”就可以执行,但在Oracle(SQL语句需要以分号结尾)中需要满足SELECT…FROM…结构,Oracle不能直接执行“SELECT 1;”语句,需要引入虚拟表(dual)满足结构。以下SQL语句是在MySQL中不用虚拟表(dual)执行加法和减法运算。 SELECT 6, 6+0, 6-0, 6+10, 6-10, 6+10-2, 6+4.5, 6-4.5; 执行上述SQL语句,运行结果如图34所示。 图34不用虚拟表(dual)执行加法和减法运算的结果 2. 乘法运算符与除法运算符 乘法运算符由星号(*)表示,用于两数相乘; 除法运算符由斜杠(/)或DIV表示,用一个值除以另外一个值得到商。 【案例32】乘法运算符和除法运算符的应用。 在MySQL中,数字20乘以一个数字和除以一个数字的SQL语句如下。 SELECT 20, 20*1, 20/1, 20*0.5, 20/0.5, 20*3, 20/3, 20*2/5, 20/5*2, 20 DIV 0; 执行上述SQL语句,运行结果如图35所示。 图35乘法运算符和除法运算符的应用 说明: (1) 一个数乘以或除以浮点数后都变成浮点数,数值与原数相等。 (2) 一个数除以整数后,不管是否能除尽,结果都是浮点数,并且结果都保留到小数点后4位。 (3) 因为乘法运算符和除法运算符的优先级相同,所以进行先乘后除操作与进行先除后乘操作的结果相同。 (4) 在数学运算中,0不能用作除数。但是在MySQL中,一个数除以0的返回值为NULL。 3. 求模(求余)运算符 求模(求余)运算符由百分号(%)表示,执行常规的除法运算,返回经过除法运算后得到的余数。在MySQL中%和MOD的作用相同,返回值一样。 3.3.2比较运算符 比较运算符是在查询数据时最常用的一类运算符,用来对表达式左、右两边的操作数进行比较,如果比较的结果为真,返回1; 如果比较的结果为假,返回0; 如果是其他情况,返回NULL。比较运算符经常在SELECT的查询条件子句中使用,用来查询满足指定条件的记录。MySQL中的比较运算符又分为常见的算术比较运算符和非符号类型的比较运算符。 1. 常见的算术比较运算符 MySQL中常见的算术比较运算符如表32所示。 表32常见的算术比较运算符 运算符名称作用 =等于运算符判断两个值、字符串或表达式是否相等 <=>安全等于运算符安全地判断两个值、字符串或表达式是否相等 <>、!=不等于运算符判断两个值、字符串或表达式是否不相等 <小于运算符判断前面的值、字符串或表达式是否小于后面的 <=小于或等于运算符判断前面的值、字符串或表达式是否小于或等于后面的 >大于运算符判断前面的值、字符串或表达式是否大于后面的 >=大于或等于运算符判断前面的值、字符串或表达式是否大于或等于后面的 1) 等于运算符 等于运算符(=)用于判断等号两边的值、字符串或表达式是否相等。如果相等,返回1; 如果不相等,返回0。 【案例33】等于运算符的应用。 在MySQL中,执行等于运算符的运算的SQL语句如下。 SELECT 3=1, 3=3, '3'=2, 'm'='m', (3+0)=(1+2), 3=NULL, NULL=NULL; 执行上述SQL语句,运行结果如图36所示。 图36等于运算符的应用 说明: (1) 等号两边的操作数都是整数,则MySQL会按照整数值比较两个操作数的大小。 (2) 等号两边的操作数一个是整数,另一个是字符串,则MySQL会将字符串转换为数字进行比较。 (3) 等号两边的操作数都是字符串,则MySQL会按照字符串进行比较。 (4) 等号两边的值、字符串或表达式中有一个为NULL,则比较结果为NULL。 2) 安全等于运算符 安全等于运算符(<=>)和等于运算符(=)的作用相似,当操作数相等时值都为1,唯一的区别是<=>运算符在即使操作数是NULL时也可以正确比较。 说明: (1) <=>运算符与=运算符的操作相同。 (2) 当两个操作数均为NULL时,返回值为1,而不是NULL; 当一个操作数为NULL时,返回值为0,而不是NULL。 3) 不等于运算符 不等于运算符(<>和!=)用于判断运算符两边的数字、字符串或表达式是否不相等,如果不相等,返回1; 如果相等,返回0。 【案例34】不等于运算符的应用。 在MySQL中,执行不等于运算符的运算的SQL语句如下。 SELECT 2<>2, 2!=2, 'mysql'<>'sql', 'm'<>NULL, NULL<>NULL; 执行上述SQL语句,运行结果如图37所示。 图37不等于运算符的应用 说明: (1) <>和!=运算符两边的值不相等时返回1,否则返回0。 (2) 不等于运算符不能判断NULL值,若两边的值有一个为NULL,或两边都为NULL,结果都为NULL。 4) 小于运算符和小于或等于运算符 小于运算符(<)和小于或等于运算符(<=)用来判断左侧的操作数是否小于、小于或等于右侧的操作数,如果小于、小于或等于,返回值为1,否则返回值为0。 【案例35】小于运算符和小于或等于运算符的应用。 在MySQL中,执行小于运算符、小于或等于运算符的运算的SQL语句如下。 SELECT 3<2, 2<=2, 'b'<'c', 'm'<NULL, NULL<NULL; 执行上述SQL语句,运行结果如图38所示。 图38小于运算符和小于或等于运算符的应用 说明: (1) <=运算符具有左结合性。 (2) <运算符和<=运算符都不能用于判断空值(NULL),如果使用,结果都为NULL。 5) 大于运算符和大于或等于运算符 大于运算符(>)和大于或等于运算符(>=)用来判断左侧的操作数是否大于、大于或等于右侧的操作数,如果大于、大于或等于,返回值为1,否则返回值为0。 说明: (1) >和>=运算符与<和<=运算符的操作相同。 (2) >和>=运算符不能用于判断空值(NULL)。 2. 非符号类型的比较运算符 MySQL中非符号类型的比较运算符如表33所示。 表33非符号类型的比较运算符 运算符名称作用 IS NULL(或ISNULL)为空运算符判断值、字符串或表达式是否为空 IS NOT NULL不为空运算符判断值、字符串或表达式是否不为空 LEAST最小值运算符在多个值中返回最小值 GREATEST最大值运算符在多个值中返回最大值 BETWEEN AND两值之间运算符判断一个值是否在两个值之间 IN属于运算符判断一个值是否为列表中的任意值 NOT IN不属于运算符判断一个值是否不是列表中的任意值 LIKE模糊匹配运算符判断一个值是否符合模糊匹配规则 PEGEXP正则表达式运算符判断一个值是否符合正则表达式的规则 1) 为空运算符和不为空运算符 为空运算符(IS NULL或ISNULL)用于判断一个值是否为NULL,如果为NULL,返回1,否则返回0; 不为空运算符(IS NOT NULL)用于判断一个值是否不为NULL,如果不为NULL,返回1,否则返回0。 【案例36】为空运算符和不为空运算符的应用。 在MySQL中,执行为空运算符和不为空运算符的运算的SQL语句如下。 SELECT NULL IS NULL, ISNULL(NULL), ISNULL(6), 6 IS NOT NULL; 执行上述SQL语句,运行结果如图39所示。 图39为空运算符和不为空运算符的应用 说明: (1) NULL IS NULL的返回值为1。 (2) ISNULL(表达式)函数求表达式的值是否为NULL,当表达式的值为NULL时,返回值为1; 当表达式的值不为NULL时,返回值为0。 (3) IS NULL和ISNULL的作用相同,ISNULL和IS NOT NULL的返回值正好相反。 (4) IS NULL运算符和ISNULL()函数的格式不同,ISNULL()函数将表达式作为参数,而IS NULL运算符将表达式放在其左侧。 (5) IS NULL运算符的效率比ISNULL()函数高,因为它不需要扫描,只搜索符合条件的记录,通常比扫描更快。 2) 最小值运算符 最小值运算符(LEAST)在有两个或多个参数比较的情况下返回最小值。基本的语法格式如下。 LEAST(值1,值2,…,值n) #值n表明参数列表中有n个值 【案例37】最小值运算符的应用。 在MySQL中执行最小值运算符的运算的SQL语句如下。 SELECT LEAST(2,5,1.3), LEAST('q','w','e'), LEAST(3,NULL,7); 执行上述SQL语句,运行结果如图310所示。 图310最小值运算符的应用 说明: (1) 当参数列表中的值是整数(浮点数)时,LEAST运算符将返回其中最小的整数(浮点数)。 (2) 当参数列表中的值为字符串时,返回字母表中顺序最靠前的字符。 (3) 当参数列表中的值有NULL时,不能判断大小,其返回值为NULL。 3) 最大值运算符 最大值运算符(GREATEST)在有两个或多个参数比较的情况下返回最大值。基本的语法格式如下。 GREATEST(值1,值2,…,值n) #值n表示参数列表中有n个值 说明: (1) 最大值运算符和最小值运算符的操作相同。 (2) 当参数列表中的值是整数(浮点数)时,GREATEST运算符将返回其中最大的整数(浮点数)。 (3) 当参数列表中的值为字符串时,返回字母表中顺序最靠后的字符。 (4) 当参数列表中的值有NULL时,不能判断大小,其返回值为NULL。 4) 两值之间运算符 两值之间运算符(BETWEEN AND)用于判断一个值(c)是否在两个值(a和b)之间,当c≥a,并且c≤b时,返回1,否则返回0。基本的语法格式如下。 SELECT d FROM TABLE WHERE c BETWEEN a AND b; 【案例38】两值之间运算符的应用。 在MySQL中,执行两值之间运算符的运算的SQL语句如下。 SELECT 'c' BETWEEN 'a' AND 'b', 1 BETWEEN 3 AND 4, 7 BETWEEN 5 AND 8; 执行上述SQL语句,运行结果如图311所示。 图311两值之间运算符的应用 说明: 当比较字符串类型时,按照字母表的顺序进行比较。 5) 属于运算符和不属于运算符 属于运算符(IN)用于判断给定的值是否为列表中的一个值,如果是,返回1,否则返回0; 不属于运算符(NOT IN)用于判断给定的值是否不是列表中的一个值,如果不是,返回1,否则返回0。 【案例39】属于运算符和不属于运算符的应用。 在MySQL中,执行属于运算符和不属于运算符的运算的SQL语句如下。 SELECT 1 IN (2,3,4), 1 NOT IN (2,3,4), NULL NOT IN (2,3,4); 执行上述SQL语句,运行结果如图312所示。 图312属于运算符和不属于运算符的应用 说明: (1) IN运算符和NOT IN运算符的运行结果相反。 (2) 当在列表中找不到给定的值相匹配时,或者给定的值是NULL,又或者列表中存在NULL值,结果均为NULL。 6) 模糊匹配运算符 模糊匹配运算符(LIKE)主要用来匹配字符串,通常用于模糊匹配,如果满足条件,返回1,否则返回0; 如果给定的值或匹配条件为NULL,则返回结果为NULL。 LIKE运算符可以使用以下两个通配符。 (1) %: 可以匹配任何数目的字符以及零字符。 (2) _: 只能匹配一个字符。 【案例310】模糊匹配运算符的应用。 在MySQL中,执行模糊匹配运算符的运算的SQL语句如下。 SELECT 13579 LIKE '123%', 13579 LIKE '%35%', 2468 LIKE '24__'; 执行上述SQL语句,运行结果如图313所示。 图313模糊匹配运算符的应用 说明: _通配符匹配单个任意字符。 7) 正则表达式运算符 正则表达式运算符(REGEXP)用来匹配字符串,正则表达式(Regular Expression,通常简写为REGEXP或RE)在搜索字符串时非常强大。正则表达式运算符的基本语法格式如下,若expr中包含相匹配的字符串,返回1,否则返回0。 SELECT expr REGEXP 匹配条件; 【案例311】正则表达式运算符的应用。 在MySQL中,执行正则表达式运算符的运算的SQL语句如下。 SELECT 'happy' REGEXP '^h', 'happy' REGEXP 'p$', 'happy' REGEXP 'py'; 执行上述SQL语句,运行结果如图314所示。 图314正则表达式运算符的应用 说明: 在MySQL中使用REGEXP关键字指定正则表达式的字符匹配模式,以下是REGEXP运算符常用的几个通配符。 (1) ^: 匹配以该字符后面的字符开头的字符串。 (2) $: 匹配以该字符前面的字符结尾的字符串。 (3) .: 匹配任意单字符。 (4) *: 匹配0个或多个在它前面的字符。 (5) [...]: 匹配在方括号内的任何字符。例如,[xyz]匹配x、y或z; [az]匹配任何字母; [09]匹配任何数字。 3.3.3逻辑运算符 逻辑运算符主要用于判断表达式的真假,在MySQL中,逻辑运算符的返回结果为1、0或NULL。在MySQL中支持4种逻辑运算符,如表34所示。 表34逻辑运算符 运算符作用运算符作用 NOT或!逻辑非OR或||逻辑或 AND或&&逻辑与XOR逻辑异或 1. 逻辑非运算符 逻辑非运算符(NOT或!)当给定的值为0时返回1; 当给定的值为非0值时返回0。但有一点除外,那就是当给定的值为NULL时返回NULL。 【案例312】逻辑非运算符的应用。 在MySQL中,执行逻辑非运算符的运算的SQL语句如下。 SELECT NOT 0, NOT 1, NOT !1, NOT 1+2, ! 1+2, NOT NULL; 执行上述SQL语句,运行结果如图315所示。 图315逻辑非运算符的应用 说明: (1) NOT和!运算符的返回值相同。 (2) NOT 1+2和!1+2的运算结果不同,原因是NOT和!运算符的优先级不同,NOT运算符的优先级低于+运算符,而!运算符的优先级高于+运算符,所以导致两者结果不同。 2. 逻辑与运算符 逻辑与运算符(AND或&&)当给定的所有值均为非零值且不为NULL时返回1; 当给定的一个值或多个值为0时返回0,否则返回NULL。 【案例313】逻辑与运算符的应用。 在MySQL中,执行逻辑与运算符的运算的SQL语句如下。 SELECT 0 AND 1, 0 AND NULL, 1 AND NULL, -1 AND 1, -1 && 1; 执行上述SQL语句,运行结果如图316所示。 图316逻辑与运算符的应用 说明: (1) AND和&&运算符的作用相同。 (2) 在操作数中若有一个为NULL,结果就返回NULL。 3. 逻辑或运算符 逻辑或运算符(OR或||)当给定的两个值都不为NULL且任何一个值为非零值时返回1,否则返回0; 当一个值为NULL且另一个值为非零值时返回1,否则返回NULL; 当两个值都为NULL时返回NULL。 【案例314】逻辑或运算符的应用。 在MySQL中,执行逻辑或运算符的运算的SQL语句如下。 SELECT 0 OR 1, 0 || 1, 0 OR 0, 3 OR NULL, NULL || NULL; 执行上述SQL语句,运行结果如图317所示。 图317逻辑或运算符的应用 说明: (1) OR和||运算符的作用相同。 (2) 当两个值中有一个0时,返回1; 当两个值都为0时,返回0; 当两个值都为NULL时,返回NULL。 4. 逻辑异或运算符 逻辑异或运算符(XOR)当给定的值中有一个为NULL时返回NULL; 如果是非NULL的操作数,两个的逻辑值相异返回1,否则返回0。 说明: 若一个操作数为0,另一个不为0,则结果返回1。 3.3.4位运算符 位运算符是先将操作数转换为二进制数,然后进行位运算,再将结果从二进制数转换为十进制数。MySQL中支持的位运算符如表35所示。 表35位运算符 运算符作用运算符作用 &按位与(位AND)~按位取反 |按位或(位OR)>>按位右移 ^按位异或(位XOR)<<按位左移 1. 按位与运算符 按位与运算符(&)将给定值对应的二进制数逐位进行逻辑与运算。先将十进制的操作数转换为二进制数,然后按对应的二进制数逐位进行逻辑与运算。当给定值对应的二进制位的数值都为1时,该位的运算结果为1,否则该位的运算结果为0。 【案例315】按位与运算符的应用。 在MySQL中,执行按位与运算符的运算的SQL语句如下。 SELECT 1&4, 2&3, 5&6&7; 执行上述SQL语句,运行结果如图318所示。 图318按位与运算符的应用 说明: (1) 1的二进制数为0001,4的二进制数为0100,所以1&4的结果为0000,对应的十进制数为0。 (2) 2的二进制数为0010,3的二进制数为0011,所以2&3的结果为0010,对应的十进制数为2。 (3) 5的二进制数为0101,6的二进制数为0110,7的二进制数为0111,所以5&6&7的结果为0100,对应的十进制数为4。 2. 按位或运算符 按位或运算符(|)将给定值对应的二进制数逐位进行逻辑或运算。先将十进制的操作数转换为二进制数,然后逐位进行逻辑或运算。当给定值对应的二进制位的数值有一个或两个为1时,该位的运算结果为1,否则该位的运算结果为0。例如,计算2|3,因为2的二进制数为0010,3的二进制数为0011,所以2|3的结果为0011,对应的十进制数为3,即运算结果为3。 3. 按位异或运算符 按位异或运算符(^)将给定值对应的二进制数逐位进行逻辑异或运算。当给定值对应的二进制位的数值不同时,该位的运算结果为1,否则该位的运算结果为0。例如,计算2^3,因为2的二进制数为0010,3的二进制数为0011,所以2^3的结果为0001,对应的十进制数为1,即运算结果为1。 4. 按位取反运算符 按位取反运算符(~)将给定值的二进制数逐位按对应的补码进行反转,也就是进行取反操作,即1取反后变为0,0取反后变为1。 【案例316】按位取反运算符的应用。 在MySQL中,执行按位取反运算符的运算的SQL语句如下。 SELECT ~1; 执行上述SQL语句,运行结果如图319所示。 图319按位取反运算符的应用 在MySQL中常数是8字节,每字节是8位,则一个常数就是64位。常数1转换为二进制数后是由64位构成的,最后一位是1,前面的63位是0。在进行按位取反后,前63位的值是1,最后一位是0,最终将二进制数转换为十进制数18446744073709551614。 用户可以使用BIN()函数查看常数1取反后的结果,BIN()函数的作用是将一个十进制数转换为二进制数。 【案例317】BIN()函数的使用。 在MySQL中使用BIN()函数的SQL语句如下。 SELECT BIN(~1); 执行上述SQL语句,运行结果如图320所示。 图320BIN()函数的使用 常数1转换为二进制数后,最右边一位为1,其他位均为0。在进行按位取反操作后,除了最右边一位为0以外,其他位均为1。 5. 按位右移运算符 按位右移运算符(>>)将给定值的二进制数的所有位右移指定的位数。在右移指定的位数之后,右边低位的数值被移出并丢弃,左边高位空出的位置用0补齐。例如,m>>n表示将m的二进制数向右移n位,左边补n个0。 【案例318】按位右移运算符的应用。 在MySQL中,执行按位右移运算符的运算的SQL语句如下。 SELECT 3>>1, 24>>2; 执行上述SQL语句,运行结果如图321所示。 图321按位右移运算符的运行结果 说明: (1) 3的二进制数为0000 0011,右移一位为0000 0001,对应的十进制数为1。 (2) 24的二进制数为0001 1000,右移两位为0000 0110,对应的十进制数为6。 6. 按位左移运算符 按位左移运算符(<<)将给定值的二进制数的所有位左移指定的位数。在左移指定的位数之后,左边高位的数值被移出并丢弃,右边低位空出的位置用0补齐。例如,m<<n表示将m的二进制数向左移n位,右边补n个0。 说明: <<运算符与>>运算符的操作相同。 3.3.5运算符的优先级 在MySQL中,优先级高的运算符先进行计算; 赋值运算符的优先级最低,使用括号括起来的表达式的优先级最高。MySQL中运算符的优先级如表36所示。 表36MySQL中运算符的优先级 优先级运算符 1(低):=、=(赋值) 2||、OR、XOR 3&&、AND 4NOT 5BETWEEN、CASE、WHEN、THEN、ELSE 6=(比较运算符)、<=>、>=、>、<=、<、<>、!=、IS、LIKE、REGEXP、IN 7| 8& 9<<、>> 10-、+ 11*、/、DIV、%、MOD 12^ 13-(负号)、~(按位取反) 14! 15(高)() 说明: 由表36可以看出,运算符的优先级与正常的运算符的规则很相似,不同运算符的优先级是不同的。在一般情况下,级别高的运算符优先进行计算,如果级别相同,MySQL按表达式的顺序从左到右依次计算。 扫一扫 视频讲解 课业任务 课业任务31算术运算符的应用 【能力测试点】 算术运算符的应用。 【任务实现步骤】 任务需求: 在MySQL中使用算术运算符进行运算,计算30和7的和、差、积、商。 按要求进行程序的编写,SQL语句如下。 SELECT 30+7, 30-7, 30*7, 30/7; 执行上述SQL语句,结果如图322所示。 图322课业任务31程序运行结果 扫一扫 视频讲解 课业任务32比较运算符的应用 【能力测试点】 比较运算符的应用。 【任务实现步骤】 任务需求: 在MySQL中使用比较运算符进行运算,计算5=2、'a'<> 'c'、1 IN (6,7,8)。 按要求进行程序的编写,SQL语句如下。 SELECT 5=2,'a'<> 'c',1 IN (6,7,8); 执行上述SQL语句,结果如图323所示。 图323课业任务32程序运行结果 扫一扫 视频讲解 课业任务33逻辑运算符的应用 【能力测试点】 逻辑运算符的应用。 【任务实现步骤】 任务需求: 在MySQL中使用逻辑运算符进行运算,计算!22+10、22&&10、22||10、22 XOR 10。 按要求进行程序的编写,SQL语句如下。 SELECT !22+10, 22&&10, 22||10, 22 XOR 10; 执行上述SQL语句,结果如图324所示。 图324课业任务33程序运行结果 扫一扫 视频讲解 课业任务34位运算符的应用 【能力测试点】 位运算符的应用。 【任务实现步骤】 任务需求: 在MySQL中使用位运算符进行运算,计算9&23、6|5、12^2、5>>1。 按要求进行程序的编写,SQL语句如下。 SELECT 9&23, 6|5, 12^2, 5>>1; 执行上述SQL语句,结果如图325所示。 图325课业任务34程序运行结果 扫一扫 视频讲解 课业任务35运算符的综合应用 【能力测试点】 算术运算符、比较运算符、逻辑运算符和位运算符的综合应用。 【任务实现步骤】 任务需求: 在MySQL中使用多种运算符进行运算,计算22%4、6<NULL、'book' LIKE '%oo%'、!3+1、24|5。 按要求进行程序的编写,SQL语句如下。 SELECT 22%4, 6<NULL, 'book' LIKE '%oo%', !3+1, 24|5; 执行上述SQL语句,结果如图326所示。 图326课业任务35程序运行结果 扫一扫 视频讲解 课业任务36使用MySQL Workbench工具进行比较运算 【能力测试点】 使用MySQL Workbench工具进行比较运算。 【任务实现步骤】 任务需求: 使用MySQL Workbench工具进行比较运算,计算'a' <=> 'b'、5<32、LEAST(4,56,7,3)。 (1) 按要求进行程序的编写,SQL语句如下。 SELECT 'a' <=> 'b', 5<32, LEAST(4,56,7,3); (2) 启动MySQL Workbench,首先单击工具栏中的“新建查询”按钮,然后按要求在SQL脚本编辑窗口中编写SQL语句,最后单击“运行”按钮或按Ctrl+Enter快捷键,如图327所示。 图327MySQL Workbench工具的新建查询操作 (3) 在MySQL Workbench工具中执行上述SQL语句,结果如图328所示。 图328课业任务36程序运行结果 扫一扫 视频讲解 课业任务37使用Navicat Premium工具进行综合运算 【能力测试点】 使用Navicat Premium工具进行综合运算。 【任务实现步骤】 任务需求: 使用Navicat Premium工具进行综合运算,计算434 BETWEEN 1 AND 500、-4&&0。 按要求进行程序的编写,SQL语句如下。 SELECT 434 BETWEEN 1 AND 500, -4&&0; 启动Navicat Premium,首先单击工具栏中的“查询”按钮,然后单击“新建查询”按钮,如图329所示,最后按要求在SQL脚本编辑窗口中编写SQL语句,如图330所示。 图329Navicat Premium工具的新建查询操作 图330SQL语句的编写操作 在Navicat Premium工具中执行上述SQL语句,单击“运行已选择的”按钮,执行成功后,结果如图331所示。 图331课业任务37程序运行结果 常见错误及解决方案 错误31关键字分行书写时报错 【问题描述】 在进行算术运算符的操作时,将SELECT关键字分行书写,出现如图332所示的错误提示,意为“SQL语法有错误: 检查与您的MySQL服务器版本对应的手册,了解需要在第1行‘SELECT 6+0’附近使用正确的语法”。 【解决方案】 根据SQL的基本规则,关键字不能分行书写,所以正确的书写方式如图333所示。 图332关键字分行书写时报错 图333SELECT关键字的正确书写方式 错误32采用中文状态下的半角输入方式时报错 【问题描述】 在进行等于运算符的操作时,采用了中文状态下的半角输入方式,出现错误提示,如图334所示。 【解决方案】 根据SQL的基本规则,必须使用英文状态下的半角输入方式,正确的输入方式如图335所示。 图334采用了中文状态下的半角输入方式时报错 图335正确的英文状态下的半角输入方式 扫一扫 自测题 习题 1. 选择题 (1) “SELECT '2' = '2xy';”语句的执行结果为()。 A. 0B. 1C. NULLD. False (2) 下列选项中是MySQL的逻辑运算符的是()。 A. INB. &C. ANDD. <> (3) “SELECT (13=13) AND (4>3);”语句的执行结果为()。 A. 0B. 1C. NULLD. False (4) 在MySQL中,下列关于通配符的说法正确的是()。 A. _可以匹配多个字符,%可以匹配单个字符 B. _可以匹配单个字符,%可以匹配多个字符 C. _和%可以匹配多个字符 D. 以上说法都不正确 (5) 下列选项中不属于DML操作的是()。 A. UPDATEB. INSERTC. DELETED. CREATE (6) 在MySQL中,下列关于BETWEEN AND运算符的说法错误的是()。 A. 该运算符用在WHERE子句中 B. BETWEEN AND运算符选取介于两个值之间的数据,值可以是数字和日期类型 C. 取值范围包括边界值 D. 以上说法都不正确 2. 填空题 (1) SQL在功能上主要分为3类,即、和。 (2) “SELECT 10/4;”语句的运行结果为。 (3) 用SELECT语句进行模糊查询,在条件值中应该使用或%通配符配合查询。 (4) 在正则表达式中,匹配任意一个字符的符号是。 (5) 在SQL中,数据操作语句包括SELECT、INSERT、UPDATE、DELETE,其中最重要、使用最频繁的语句是。 3. 判断题 (1) b BETWEEN a AND c等同于b>a && b<c。() (2) NULL和Null都代表空值。() (3) !=和<>都表示不等于。() (4) 在子查询中使用IN运算符和使用=ANY的效果是不一样的。() (5) 判断某个字段是否为空值可以用IS NULL。()