`
piperzero
  • 浏览: 3475451 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

11级_Java_曹建波5.30 WHERE子句

 
阅读更多

WHERE子句

本书前面已经接触过WHERE子句的用法,这一节将详细讨论WHERE子句中查询条件的构成。WHERE子句必须紧跟FROM子句之后,在WHERE子句中,使用一个条件从FROM子句的中间结果中选取行。其基本格式为:

WHERE where_definition

其中,where_definition为查询条件。语法格式为:

where_definition:

<precdicate>

|<precdicate>{ AND | OR } <precdicate>

|(where_definition)

|NOT where_definition

其中,predicate为判定运算,结果为TRUE、FALSE或UNKNOWN。

<predicate>:

expression { = | < | <= | > | >= | <=> | <> | !=} expression /*比较运算*/

|match_expression [ NOT ] LIKE match_expression [ ESCAPE 'escape_character ' ]

/*LIKE运算符*/

|match_expression [ NOT ][ REGEXP | RLIKE ] match_expression

/*REGEXP运算符*/

|expression [ NOT ] BETWEEN expression AND expression /*指定范围*/

| expression IS [ NOT ] NULL /*是否空值判断*/

|expression [ NOT ] IN ( subquery | expression [,…n] ) /*IN子句*/

|expression { = | < | <= | > | >= | <=> | <> | !=} { ALL| SOME | ANY } ( subquery )

/*比较子查询*/

|EXIST ( subquery ) /*EXIST子查询*/

WHERE子句会根据条件对FROM子句的中间结果中的行一行一行地进行判断,当条件为TRUE的时候,一行就被包含到WHERE子句的中间结果中。

说明:

IN关键字既可以指定范围,也可以表示子查询。

在SQL中,返回逻辑值(TRUE或FALSE)的运算符或关键字都可称为谓词。

判定运算包括比较运算、模式匹配、范围比较、空值比较和子查询。

1. 比较运算

比较运算符用于比较两个表达式值,MySQL支持的比较运算符有:=(等于)、<(小于)、<=(小于等于)、>(大于)、>=(大于等于)、<=>(相等或都等于空)、<>(不等于)、!=(不等于)。

比较运算的语法格式为:

expression { = | < | <= | > |>= | <=> | <> | != } expression

其中expression是除TEXT和BLOB外类型的表达式。

当两个表达式值均不为空值(NULL)时,除了“<=>”运算符,其他比较运算返回逻辑值TRUE(真)或FALSE(假);而当两个表达式值中有一个为空值或都为空值时,将返回UNKNOWN。

MySQL有一个特殊的等于运算符“<=>”,当两个表达式彼此相等或都等于空值时,它的值为TRUE,其中有一个空值或都是非空值但不相等,这个条件就是FALSE。没有UNKNOWN的情况。

查询XS表中备注为空的同学的情况。

SELECT 姓名,学号,出生日期,总学分

FROM XS

WHERE 备注<=>NULL;

从查询条件的构成看出,可以将多个判定运算的结果通过逻辑运算符(AND、OR、XOR和NOT)组成更为复杂的查询条件。有关逻辑运算符,第6章会具体介绍。

查询XS表中专业为计算机,性别为女(0)的同学的情况。

SELECT 姓名,学号,性别,总学分

FROM XS

WHERE 专业名='计算机'AND 性别=0;

查询结果为:

2. 模式匹配

(1)LIKE运算符

LIKE运算符用于指出一个字符串是否与指定的字符串相匹配,其运算对象可以是char、varchar、text、datetime等类型的数据,返回逻辑值TRUE或FALSE。LIKE谓词表达式的格式为:

match_expression [ NOT ] LIKEmatch_expression [ ESCAPE 'escape_character' ]

使用LIKE进行模式匹配时,常使用特殊符号_和%,可进行模糊查询。“%”代表0个或多个字符,“_”代表单个字符。

escape_character:转义字符,escape_character 没有默认值,且必须为单个字符。当要匹配的字符串中含有与特殊符号(_和%)相同的字符时,此时应通过该字符前的转义字符指明其为模式串中的一个匹配字符。使用关键字ESCAPE可指定转义符。

由于MySQL默认不区分大小写,要区分大小写时需要更换字符集的校对规则。

查询XSCJ数据库XS表中姓“王”的学生学号、姓名及性别。

SELECT 学号,姓名,性别

FROM XS

WHERE 姓名 LIKE '王%';

执行结果为:

查询XSCJ数据库XS表中学号倒数第二个数字为0的学生学号、姓名及专业名。

SELECT 学号,姓名,专业名

FROM XS

WHERE 学号 LIKE '%0_';

执行结果为:

如果我们想要查找特殊符号中的一个或全部(_和%),我们必须使用一个转义字符。

查询XS表中名字包含下画线的学生学号和姓名。

SELECT 学号,姓名

FROM XS

WHERE 学号 LIKE '%#_%'ESCAPE '#';

说明:由于没有学生满足这个条件,所以这里没有结果返回。定义了“#”为转义字符以后,语句中在“#”后面的“_”就失去了它原来特殊的意义。

(2)REGEXP运算符

REGEXP运算符用来执行更复杂的字符串比较运算。REGEXP是正则表达式(regularexpression)的缩写。和LIKE运算符一样,REGEXP运算符有多种功能,但它不是SQL标准的一部分,REGEXP运算符的一个同义词是RLIKE。

语法格式:

match_expression [ NOT ][ REGEXP | RLIKE ]match_expression

LIKE运算符有两个符号具有特殊的含义:“_”和“%”。而REGEXP运算符则有更多的符号有特殊的含义,参见表4.11。

查询姓李的同学的学号、姓名和专业名。

USE XSCJ

SELECT 学号,姓名,专业名

FROM XS

WHERE 姓名 REGEXP '^李';

执行结果:


查询学号里包含4、5、6的学生学号、姓名和专业名。

SELECT 学号,姓名,专业名

FROM XS

WHERE 学号 REGEXP'[4,5,6]';

执行结果为:

查询学号以08开头,以08结尾的学生学号、姓名和专业名。

SELECT 学号,姓名,专业名

FROM XS

WHERE 学号 REGEXP'^08.*08$';

执行结果为:

3. 范围比较

用于范围比较的关键字有两个:BETWEEN和IN。

当要查询的条件是某个值的范围时,可以使用BETWEEN关键字。BETWEEN关键字指出查询范围,格式为:

expression [ NOT ] BETWEEN expression1 ANDexpression2

当不使用NOT时,若表达式expression的值在表达式expression1与expression2之间(包括这两个值),则返回TRUE,否则返回FALSE;使用NOT时,返回值刚好相反。

注意:expression1的值不能大于expression2的值。

使用IN关键字可以指定一个值表,值表中列出所有可能的值,当与值表中的任一个匹配时,即返回TRUE,否则返回FALSE。使用IN关键字指定值表的格式为:

expression IN ( expression [,…n])

查询XSCJ数据库XS表中不在1989年出生的学生情况。

SELECT学号, 姓名, 专业名, 出生日期

FROM XS

WHERE 出生日期 NOTBETWEEN '1989-1-1' and '1989-12-31';

执行结果为:


查询XS表中专业名为“计算机”、“通信工程”或“无线电”的学生的情况。

SELECT *

FROM XS

WHERE 专业名 IN ('计算机', '通信工程', '无线电');

该语句与下列语句等价:

SELECT *

FROM XS

WHERE 专业名 ='计算机'OR 专业名 = '通信工程' OR 专业名 = '无线电';

说明:IN关键字最主要的作用是表达子查询。

4. 空值比较

当需要判定一个表达式的值是否为空值时,使用IS NULL关键字,格式为:

expression IS [ NOT ] NULL

当不使用NOT时,若表达式expression的值为空值,返回TRUE,否则返回FALSE;当使用NOT时,结果刚好相反。

查询XSCJ数据库中总学分尚不定的学生情况。

SELECT *

FROM XS

WHERE 总学分 IS NULL;

本例即查找总学分为空的学生,结果为空。

5. 子查询

在查询条件中,可以使用另一个查询的结果作为条件的一部分,例如,判定列值是否与某个查询的结果集中的值相等,作为查询条件一部分的查询称为子查询。SQL标准允许SELECT多层嵌套使用,用来表示复杂的查询。子查询除了可以用在SELECT语句中,还可以用在INSERT、UPDATE及DELETE语句中。子查询通常与IN、EXIST谓词及比较运算符结合使用。

(1)IN子查询

IN子查询用于进行一个给定值是否在子查询结果集中的判断,格式为:

expression [ NOT ] IN ( subquery )

其中,subquery是子查询。当表达式expression与子查询subquery的结果表中的某个值相等时,IN谓词返回TRUE,否则返回FALSE;若使用了NOT,则返回的值刚好相反。

查找在XSCJ数据库中选修了课程号为206的课程的学生的姓名、学号。

SELECT 姓名,学号

FROMXS

WHERE学号 IN

(SELECT 学号

FROMXS_KC

WHERE课程号 = '206'

);

查询结果如下:

说明:在执行包含子查询的SELECT语句时,系统先执行子查询,产生一个结果表,再执行查询。本例中,先执行子查询:

SELECT 学号

FROM XS_KC

WHERE 课程号= '206';

得到一个只含有学号列的表,XS_KC中的每个课程名列值为206的行在结果表中都有一行。再执行外查询,若XS表中某行的学号列值等于子查询结果表中的任一个值,则该行就被选择。

注意:IN子查询只能返回一列数据。对于较复杂的查询,可以使用嵌套的子查询。

查找未选修离散数学的学生的姓名、学号、专业名。

SELECT 姓名,学号,专业名

FROMXS

WHERE学号 NOT IN

(

SELECT学号

FROMXS_KC

WHERE课程号 IN

(SELECT 课程号

FROMKC

WHERE 课程名 ='离散数学'

)

);

执行结果为:

(2)比较子查询

这种子查询可以认为是IN子查询的扩展,它使表达式的值与子查询的结果进行比较运算,格式为:

expression { < | <= | = | > |>= | != | <> } { ALL | SOME | ANY } ( subquery )

其中,expression为要进行比较的表达式,subquery是子查询。ALL、SOME和ANY说明对比较运算的限制。

如果子查询的结果集只返回一行数据时,可以通过比较运算符直接比较。

ALL指定表达式要与子查询结果集中的每个值都进行比较,当表达式与每个值都满足比较的关系时,才返回TRUE,否则返回FALSE;

SOME或ANY是同义词,表示表达式只要与子查询结果集中的某个值满足比较的关系时,就返回TRUE,否则返回FALSE。

查找选修了离散数学的学生学号。

SELECT 学号

FROMXS_KC

WHERE 课程号 =

(

SELECT课程号

FROMKC

WHERE 课程名 ='离散数学'

);

查询结果为:


查找XS表中比所有计算机系的学生年龄都大的学生学号、姓名、专业名、出生日期。

SELECT 学号, 姓名, 专业名, 出生日期

FROMXS

WHERE 出生日期 <ALL

(

SELECT出生日期

FROMXS

WHERE专业名 ='计算机'

);

执行结果为:

查找XS_KC表中课程号206的成绩不低于课程号101的最低成绩的学生的学号。

SELECT 学号

FROMXS_KC

WHERE课程号 ='206' AND 成绩 >=ANY

(

SELECT成绩

FROMXS_KC

WHERE课程号 ='101'

);

执行结果为:

(3)EXISTS子查询

EXISTS谓词用于测试子查询的结果是否为空表,若子查询的结果集不为空,则EXISTS返回TRUE,否则返回FALSE。EXISTS还可与NOT结合使用,即NOT EXISTS,其返回值与EXIST刚好相反。格式为:

[ NOT ] EXISTS ( subquery )

查找选修206号课程的学生姓名。

SELECT 姓名

FROM XS

WHERE EXISTS

(

SELECT *

FROM XS_KC

WHERE 学号 = XS.学号 AND 课程号 = '206'

);

执行结果为:

分析:

① 本例在子查询的条件中使用了限定形式的列名引用XS.学号,表示这里的学号列出自表XS。

② 本例与前面的子查询例子不同点是,前面的例子中,内层查询只处理一次,得到一个结果集,再依次处理外层查询;而本例的内层查询要处理多次,因为内层查询与XS.学号有关,外层查询中XS表的不同行有不同的学号值。这类子查询称为相关子查询,因为子查询的条件依赖于外层查询中的某些值。其处理过程是:首先查找外层查询中XS表的第一行,根据该行的学号列值处理内层查询,若结果不为空,则WHERE条件就为真,就把该行的姓名值取出作为结果集的一行;然后再找XS表的第2、3、…行,重复上述处理过程直到XS表的所有行都查找完为止。

查找选修了全部课程的同学的姓名。

SELECT 姓名

FROM XS

WHERE NOT EXISTS

(

SELECT *

FROM KC

WHERE NOT EXISTS

( SELECT *

FROM XS_KC

WHERE 学号=XS.学号 AND 课程号=KC.课程号

)

);

说明:由于没有人选了全部课程,所以结果为空。

MySQL区分了4种类型的子查询:返回一个表的子查询是表子查询;返回带有一个或多个值的一行的子查询是行子查询;返回一行或多行,但每行上只有一个值的是列子查询;只返回一个值的是标量子查询。从定义上讲,每个标量子查询都是一个列子查询和行子查询。上面介绍的子查询都属于列子查询。

另外,子查询还可以用在SELECT语句的其他子句中。

表子查询可以用在FROM子句中,但必须为子查询产生的中间表定义一个别名。

从XS表中查找总学分大于50的男同学的姓名和学号。

SELECT 姓名,学号,总学分

FROM ( SELECT姓名,学号,性别,总学分

FROM XS

WHERE 总学分>50

) AS STUDENT

WHERE 性别='1';

查询结果:

说明:在这个例子中,首先处理FROM子句中的子查询,将结果放到一个中间表中,并为表定义一个名称STUDENT,然后再根据外部查询条件从STUDENT表中查询出数据。另外,子查询还可以嵌套使用。

SELECT关键字后面也可以定义子查询。

从XS表中查找所有女学生的姓名、学号,以及与081101号学生的年龄差距。

SELECT 学号, 姓名, YEAR(出生日期)-YEAR(

(SELECT 出生日期

FROM XS

WHERE 学号='081101'

) ) AS 年龄差距

FROM XS

WHERE 性别='0';

查询结果:

说明:本例中子查询返回值中只有一个值,所以这是一个标量子查询。YEAR函数用于取出DATE类型数据的年份。

在WHERE子句中还可以将一行数据与行子查询中的结果通过比较运算符进行比较。

查找与081101号学生性别相同、总学分相同的学生学号和姓名。

SELECT 学号,姓名

FROM XS

WHERE (性别,总学分)=( SELECT 性别,总学分

FROM XS

WHERE 学号='081101'

);

查询结果:

分享到:
评论

相关推荐

    infrared-remote-candroid studiodemo

    android studio下载

    【新质生产力】新质生产力赋能智能制造数字化解决方案.pptx

    【新质生产力】新质生产力赋能智能制造数字化解决方案.pptx

    基于matlab实现的用于应用布格重力异常数据反演地下异常密度体.rar

    基于matlab实现的用于应用布格重力异常数据反演地下异常密度体.rar

    node-v8.10.0-linux-x64.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    基于Yolov5目标检测和deepsort目标跟踪无人机跟踪.zip

    无人机最强算法源码,易于部署和学习交流使用

    数据库课程设计实战.zip

    数据库课程设计后端 使用Springboot + Mybatis + Redis + Maven 数据库课程设计实战.zip,使用到了所有的相关SQL 的操作,如增删改查等,让你可以在一个项目里面,锻炼到所有的数据库相关的知识。项目亲测可以运行,里面含有运行相关的文档,不会的可以丝我请求帮助。 数据库课程设计后端 使用Springboot + Mybatis + Redis + Maven 具体的表和相关的数据如下: 用户(电话号码,密码,身份证号,邮箱,真实姓名,用户类型,性别,地址) 乘客(用户电话号码,乘客身份证号,乘客真实姓名,乘客电话号码,乘客类型,地址) 列车信息(列车编号,车次,列车类型,列车车厢数,列车始发站,列车终点站,列车开车时间,列车到达时间,列车到达日期,列车运行时间,列车状态) 列车座位信息(列车编号,车厢号,座位类型,座位数) 列车经停信息(列车编号,车次,车站编号,车站名,到达时间,总运行时间,开车时间) 订单信息(订单编号,用户电话号码,乘客身份证号码,列车编号,出发站编号,到达站编号,车厢号,座位编号,订单创建时间,订单状态,开车时间)

    咨询的分析方法gl.ppt

    咨询的分析方法gl.ppt

    node-v10.14.0-linux-ppc64le.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    2019年电赛无人机题目(B题)OpenMV相关代码

    These're the OpenMV codes written by microPython in 2019 NUEDC. 2019年电赛无人机题目(B题)OpenMV相关代码(原创).zip

    无人机降落TRT版本.zip

    无人机最强算法源码,易于部署和学习交流使用

    熊出没.zip

    熊出没.zip

    基于SpringBoot和Vue的家教信息平台设计与实现.zip

    基于SpringBoot和Vue的家教信息平台设计与实现.zip 有完整的部署指导文档,源码也是完整的,可以直接运行,里面包含了所有的相关步骤。 本文旨在设计和实现一套基于Java技术的家教信息系统,采用Spring Boot框架构建后端服务,MySQL数据库存储数据,Vue.js作为前端框架实现用户界面。该系统旨在解决家教信息管理的问题,包括家教师资信息管理、用户信息管理以及家教入驻等功能。通过综合运用Java、Spring Boot、MySQL和Vue等技术,实现了系统的高效运行和良好的用户体验。系统提供了用户注册、登录、信息查看和编辑等功能,同时支持家教的发布和查看,用户信息的管理以及家教审核的后台管理。家长可以方便地寻找合适的家教老师,家教老师也能够更便捷地管理自己的信息和相关资料。通过本设计,展示了Java技术在现代化家教信息系统中的应用,为家教行业的信息化管理提供了一种有效的解决方案。该系统的设计与实现将为家长、家教老师和用户提供便利,促进家教行业的发展与进步。 关键词:SpringBoot; MySQL; 系统设计; 家教

    利用CNN进行无人售货机的商品识别.zip

    无人机最强算法源码,易于部署和学习交流使用

    node-v11.10.1-linux-armv6l.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    (R语言)-6-箱线图的绘制

    (R语言)-6-箱线图的绘制

    麦肯锡-xx联通固定市场举措gl.ppt

    麦肯锡-xx联通固定市场举措gl.ppt

    在PyCharm中配置Python环境步骤

    附件是在PyCharm中配置Python环境步骤,文件绿色安全,请大家放心下载,仅供交流学习使用,无任何商业目的!

    【北京工业大学】集成电路分析与设计实验报告

    本课程实验分为数字集成电路设计实验与全定制设计实验两部分。 实验1—4为基于Cadence的数字集成电路设计实验部分,主要内容为通过一个简单数字低通滤波器的设计、综合、仿真,让学生熟悉数字集成电路前段实际设计流程,以培养学生实际设计集成电路的能力。具体为:实验1Matlab实现数字低通滤波器算法设计。 实验2Linux环境下基本操作。 实验3RTLCompiler对数字低通滤波器电路的综合。 实验4NC对数字低通滤波器电路的仿真。 其中,实验1主要目的是为了展示算法分析的方法和重要性。使用Matlab实现数字滤波器的算法设计和HDL代码生成。由于Matlab工具可以在Windows环境下工作,而其他集成电路EDA工具均需要在linux下工作,故建议本实验在课堂演示和讲述,学生课下练习。实验2的主要目的是学习linux下的基本操作。包括目录管理、文件管理、文件编辑以及文件压缩等在使用集成电路EDA工具时所需要的操作。本实验是实验3和实验4的基础,建议在实验室完成。

    基于Transformer模型构建的聊天机器人python源码+运行说明.zip

    一、简介 基于Transformer模型构建的聊天机器人,可实现日常聊天。 二、系统说明 2.1 功能介绍 使用者输入文本后,系统可根据文本做出相应的回答。 2.2 数据介绍 * 百度中文问答 WebQA数据集 * 青云数据集 * 豆瓣数据集 * chatterbot数据集 由于数据集过大,因此不会上传,如有需要可以在issue中提出。 2.3. 模型介绍(v1.0版本) 基于Transformer模型,使用Python中的keras-transformer包。 训练的参数文件没有上传,如有需要可在issue中提出。 三、注意事项 * keras-transformer包需要自行安装:`pip install keras-transformer`。 * 如果需要实际运行,参数文件放在`ModelTrainedParameters`文件下;`ListData`文件下包含了已经处理好的字典等数据,不需要修改,直接运行Main.py即可。 * 如果需要自行训练,将数据集文件放在`DataSet`文件下。 * `HyperParameters.py`文件中包含了系统所需

Global site tag (gtag.js) - Google Analytics