《MySQL数据库应用案例教程》教案 第9课 多表数据记录查询_第1页
《MySQL数据库应用案例教程》教案 第9课 多表数据记录查询_第2页
《MySQL数据库应用案例教程》教案 第9课 多表数据记录查询_第3页
《MySQL数据库应用案例教程》教案 第9课 多表数据记录查询_第4页
《MySQL数据库应用案例教程》教案 第9课 多表数据记录查询_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

课题多表数据记录直询

课时2课时(90min)

知识技能目标:

(1)掌握多表连接查询的方法

(2)掌握FROM子句和WHERE子句中子查询的使用方法

教学目标(3)掌握使用UNION关键字合并查询结果的方法

素质目标:

(1)了解数据库前沿技术,紧跟时代发展

(2)了解数据库在生活中的应用

教学重点:多表连接查询的方法

教学重难点教学难点:FROM子句和WHERE子句中子查询的使用方法,使用UNION关键字合并查询结果的方

教学方法案例分析法、问答法、讨论法、讲授法、实践法

教学用具电脑、投影仪、多媒体课件、教材

第1节课:课前彳珍一考勤(2min)一问题导入(5min)一传授新知(38min)

教学设计第2节课:问题导入(5min)一传授新知(20min)一•课堂实训(15min)一课堂小结(3min)一作

业布置(2min)

教学过程主要教学内容及步骤设计意图

第一节课

通过课前任务,

【教师】布置课前任务,和学生负责人取得联系,让其提醒同学通过APP或其他

使学生预习本节

学习软件,预习本节课要学习的知识

课前任务课要学习的知识,

【学生】完成课前任务增加学生的学习

兴趣

【教师】使用APP进行签到培养学生的组

考勤

织纪律性,掌握学

(2min)【学生】班干部报请假人员及原因

生的出勤情况

【教师】提出以下问题:通过问题导入,

问题导入

如何在多张数据表中进行查询?引导学生主动思

(5min)考,激发学生的学

【学生】聆听'思考、举手回答习兴趣

【教师】通过学生的回答引入要讲的知识,讲解连接查询的相关知识

8.1连接查询通过教师的讲

传授新知解和演示,使学生

中【教师】随机邀请学生回答以下问题:

(38min)了解连接查询的

什么是连接查询?相关知识

}【学生】聆听、思考、回答

+【教师】总结学生的回答

在关系型数据库管理系统中,通常一张表只会存储一个实体的相关信息,如果

用户需要查询多张表中不同实体的数据可以使用关键字JOIN对表执行连接查询操

作,但前提条件是,这些表中必须存在具有相同意义的字段.连接查询主要包括内

连接查询和外连接查询,另外还可以在连接查询中添加过滤条件,筛选符合条件的

数据,这就是复合条件连接查询。

8.1.1内连接查询

★【教师】组织学生扫码观看”内连接查询“视频(详见教材),让学生对基

本知识有一个大致的了解

内连接查询(INNERJOIN)是使用比较运算符对多个表间的某些列数据进行比

较,并列出这些表中与连接条件相匹配的数据行,组合成新的记录。表之间的连接

条件由表中具有相同意义的字段组成。

〉【教师】通过多媒体展示"staff表结构"和"section表结构”表格,介绍

相关知识

为便于讲解,首先需要创建一个数据库staff,并在其中创建两个数据表staff和

section,两个表的结构分别如表8-1和表8-2所不。

表8-1staff表结构

字段数据类型约束注释

无符号、主键、自增、

stafflidINT(IO)员工ID

非空

section_idINT(IO)无符号、非空部门ID

positions_idINT(IO)非空职位ID

nameVARCHAR(IO)非空姓名

sexENUMC男;女)非空性别

phone_numberCHAR(ll)非空手机号

无符号、非空,默认值

moneyDECIMAL(10,2)薪资

0

entry_dateDATETIME非空入职时间

表8-2section表结构

字段数据类型约束注释

无符号、主键、自增、

sectionedINT(IO)部门ID

非空

section_titleVARCHAR(20)非空部门名称

【实例8-1]本例首先创建数据库staff,然后参照表8-1和表8-2创建数据表

staff和section,并在其中插入数据。

步骤1登录MySQL后执行以下语句,创建数据库staff。

CREATEDATABASEstaff;

步骤2选择数据库staff,并执行以下语句创建数据表staff。

CREATETABLEstaff

(

staff_idINT(IO)UNSIGNEDNOTNULLAUTOJNCREMENT,

section_idINT(IO)UNSIGNEDNOTNULL,

positionsJdINT(IO)NOTNULL,

nameVARCHAR(IO)NOTNULL,

sexENUMC男;女)NOTNULL,

phone.numberCHAR(ll)NOTNULL,

moneydecimal(10,2)UNSIGNEDNOTNULLDEFAULT'O.OO1,

entry_dateDATETIMENOTNULL,

PRIMARYKEY(staff_id)

);

步骤3执行以下SQL语句,向staff表中插入数据。

INSERTINTO

staff(stafLid,seclion_id,positions_id,name,sex,phone_number,money,entry_date)

VALUES(1,T,T,‘刘长生男'.,20000,'2018-04-0214:35:52'),

(2,T,'2',‘赵霞,,10000,,2018-04-0314:40:52'),

(3,'2','3','季庆奇','女',,15000,'2018-04-0314:43:52'),

(4,'3','3','李星宇.',15000,,2018-04-0314:45:52,),

(5,'4;3',‘张向阳,15000,12018-04-0314:47:24'),

(6,'4','8','张旭','男',,10000;2018-04-0314:50:52');

……(详见教材)

1.普通内连接查询

内连接查询的语法形式为:

SELECT{*|col_list)FROMiable_namel

INNERJOINtable_name2ONcondition;

上述语句中,condition表示连接条件。接下来通过实例具体说明内连接查询的

用法。

【实例8-2]在staff表和section表之间使用内连接查询,从staff表中查询

staffjd(员工ID)、name(姓名)、sex(怅!])和phone_number(手机号),从

section表中查询section_title(部门名称),

由表8-1和表8-2的表结构可知,两个表都有相同数据类型的字段sectionjd,

可以通过该字段建立联系。为此,首先选择数据库staff,然后执行内连接查询语句,

结果如下:

mysql>SELECTstaff_id,name,sex,section_title,phonc_number

->FROMstaffINNERJOINsection

->ONstaff.section_id=section.section_id;

+--------------+------------------4------------------4-------------------------+--------------------------------------+

|staffLid|name|sex|section_title|phone_number|

+---------+-----------+-----------+---------------+------------------------+

11I刘长生I男I总经办113753697300|

12|赵霞|女|总经办

131季庆奇|女|财务部113753697302|

14|李星宇|男|销售部

151张向阳|男|研发部113753697304|

16|张旭|男I研发部

+----------+-----------+----------+----------------+------------------------+

6rowsinset(0.01sec)

【提示】

上述SQL语句中,使用符号将表名和字段名拼接起来,作用是明确指定字

段所属的数据表,不会因为字段名重名而造成系统无法识别。

此处,SELECT语句与前面最大的区别在于:SELECT后面指定的列分别属于

两个不同的表伺时,FROM子句列出了两个表两个表之间的关系通过INNERJOIN

指定;连接条件使用ON子句给出。

另外,使用WHERE子句也可以给出连接条件,以下语句将返回与前面完全相

同的结果。

SELECTstafflid,name,sex,section_title,phone_numberFROMstaff,section

WHEREstaff.section_id=section.section_id;

使用WHERE子句定义连接条件简单明了,但在某些时候会影响查询性能,而

使用INNERJOIN语法能够确保不会忘记连接条件。

2.自连接查询

内连接查询中有一种特殊的查询,称为自连接查询,它是指连接查询中涉及的

两张表在物理上是同一张表,但逻辑上可以看成两张表,语法形式如下:

SELECTtable_alias1.*,table_alias2.*FROMtablc_nameAStable_aliasl

INNERJOINtablc_nameAStable_alias2ONcondition;

上述语句的意义是,将一张表分别命名为table_aliasl和tablc_alias2,然后使用

这两个表名进行自连接查询。

【实例8-3]使用内连接查询语句,从staff表中查询薪资低于15000的员工

的staffjd(员工ID)、name(姓名)和money(薪资)。

首先选择数据库staff,然后执行内连接查询语句,结果如下:

mysql>SELECTs1.staffjd,s1.name,s2.moneyFROMstaffASsi

->INNERJOINstaffASs2ONsl.staff_id=s2.staffjdANDs2.money<15000;

+---------+----------+------------------+

|staffLid|name|money|

+---------+----------+------------------+

I21赵霞|10000.00|

I61张旭|10000.00|

+----------+----------+-----------------+

2rowsinset(0.00sec)

此处查询的两个表是同一个表staff,为防止产生二义性,使用AS关键字为表

起了别名,staff表第1次以si为别名出现,第2次以s2为别名出现。INNERJOIN

连接两个表,并按照第2个表的money值对数据进行过滤.

8.1.2外连接直询

〉【教师】组织学生扫码观看”外连接和复合条件连接查询“视频(详见教材),

让学生对基本知识有一个大致的了解

外连接查询(OUTERJOIN)是以一张表为基表,根据连接条件,与另外一张

表的每一行进行匹配,如果没有匹配上,则在相关联的结果行中,另一张表的所有

选择列均返回空值。

外连接查询通常分为两种:左连接查询(LEFTJOIN)和右连接查询(RIGHT

JOIN).其基本语法形式如下:

SELECT(*|col_list)FROMtablc_namel

{LEFTIRIGHT)[OUTER]JOINtabie_name2ONcondition;

本节以第5章创建的goods表和orders表为操作对象,讲解外连接查询的应用,

在前面的操作中已经为goods表插入数据,接下来为orders表插入数据。

【实例8-4]执行SQL语句,向orders表中插入数据。

步骤1登录MySQL,并执行以下语句,选择db_sh叩数据库。

USEdb_shop;

步骤2执行以下语句,关闭orders表的外键约束。

SETFOREIGN_KEY_CHECKS=0;

【提示】

对于先创建表关系,之后才插入数据的表,在其中插入数据时需要先关闭外键

约束,否则会插入不成功。由于前面在创建orders表时为其设置了外键约束,此处

先将其关闭,待插入数据后再开启。开启表外键约束的语句为SET

FOREIGN_KEY_CHECKS=1;.

步骤3执行SQL语句,向orders表中插入数据,结果如下所示。

mysql>INSERTINTOorders(o_id,add_time,goods_id)

->VALUES(1,2018-04-0214:35:52\6),

->(272018-04-0314:40:52;1),

->(3/2018-04-0314:43:57,5),

->(4/2018-04-0314:45:521,1),

->(5/2018-04-0314:47:24,,15),

->(6/2018-04-0314:50:52,,4);

QueryOK,6rowsaffected(0.06sec)

Records:6Duplicates:0Warnings:0

1.左连接查询

在外连接查询语句中,LEFTJOIN关键字之前的表称为左表,左连接查询会以

左表为基表,与另外一张表的每一行进行匹配,如果符合连接条件,则返回两张表

相对应的行;如果不符合,则只返回左表中的行,并且其对应的行为一个空值。

【实例8-5]执行左连接查询语句,查询goods表中哪些商品有订单,哪些商

品没有订单。

由于goods表中的id字段对应orders表中的goods_id字段,此处将这两个字段

进行比较,如果goods表中的id字段在orders表中有对应的goods_id值,则返回其

对应的。一id值;否则就表示该商品没有对应订单,返回空值。执行结果如下:

mysql>SELECTgoods.id,,orders.o_idFROMgoods

->LEFTJOINordersONgoods.id=orders.goods_id;

+--+----------+------+

|id|name|o_id|

+——+----------+------+

14|休闲西服|6|

151果汁|3|

131水果糖INULL|

19|牛仔裤|NULL|

12|牛奶糖|NULL|

|10|红楼梦|NULL|

18|苹果|NULL|

111西游记12|

111西游记14|

171西瓜INULL|

161论语|1|

+---+---------+-------+

11rowsinset(0.04sec)

由结果可以看出,goods表中id值为2,3,7,8,9和10的商品所对应的订单

信息为空值,说明这几种商品没有客户下订单。

2.右连接查询

在外连接查询语句中,RIGHTJOIN关键字之后的表称为右表,右连接查询会

以右表为基表,与另外一张表的每一行进行匹配,如果符合连接条件,则返回两张

表相对应的行;如果不符合,则只返回右表中的行,并且其对应的行为一个空值。

【实例8-6]执行右连接查询语句,查询订单中所对应的商品哪些仍然存在,

哪些已经删除。

与实例8-5类似,依然将商品编号进行比较,所不同的是,此处是将orders表

中的goodsjd与goods表中的id字段逐行进行比较,如果在goods表中有对应的记

录,则返回相应的name值,如果没有则返回空值。执行结果如下:

mysql>SELECTorders.o_id,orders.add_time,FROMgoods

->RIGHTJOINordersONorders.goods_id=goods.id;

+-----+-------------------+----------+

|o_id|add_time|name|

+------+----------------------+------------+

I112018-04-0214:35:52|论语|

|2|2018-04-0314:40:52|西游记|

|312018-04-0314:43:52|果汁|

|412018-04-0314:45:52|西游记|

|512018-04-0314:47:24|NULL|

I612018-04-0314:50:52|休闲西服|

+-------+----------------------+------------+

6rowsinset(0.00sec)

由结果可以看出,orders表中o_id值为5的订单所对应的商品信息为空值,说

明该商品已被删除。

8.1.3复合条件连接查询

复合条件连接杳询是通过在连接查询中添加过滤条件,以达到限制查询结果和

筛选数据的目的,下面通过实例进行介绍。

【实例8-7】在staff表和section表中,执行内连接查询语句,查询section表

中部门名称为“总经办"的员工ID、姓名、性别和电话号码等信息。

步骤1登录MySQL,并执行以下语句,选择staff数据库。

USEstaff;

步骤2执行以下SQL语句,在staff表和section表中查询部门名称为"总经

办"的员工ID、姓名、性别和电话号码,执行结果如下:

mysql>SELECTstaff_id,name,sex,section_title,phone_number

->FROMstaffINNERJOINsection

->ONstaff.section_id=section.section_id

->WHEREsection.section_title='总经办';

+------+-------+----+----------+-------------+

|staff_id1name|sex|section_title|phone_number|

+------+--------+----+------------4----------------+

11I刘长生I男|总经办113753697300|

12|赵霞|女|总经办

+-----+-------+----+----------+-------------+

2rowsinset(0.00sec)

可以看出,在限制了部门名称为总经办后,此处只返回了在总经办任职的员工

信息。可以将该结果与实例8-2的查询结果进行匕匕较.

【实例8-8]执行左连接查询语句,查询goods表中哪些商品有订单,哪些商

品没有订单,并使用商品1D号对查询结果进行排序。

步骤1登录MySQL,并执行以下语句,选择db_shop数据库。

USEdb_shop;

步骤2执行以下SQL语句,在goods表和orders表中查询哪些商品有订单,

哪些商品没有订单,并使用商品ID号对查询结果进行排序,执行结果如下:

mysql>SELECTgoods.id,,orders.o_idFROMgoodsLEFTJOINorders

->ONgoods.id=orders.goods_idORDERBYgoods.id;

+---+----------+-------+

|id|name|o_id|

+--+----------+-------+

111西游记12|

111西游记14|

12|牛奶糖|NULL|

13|水果糖INULL|

14|休闲西服|6|

15|果汁13|

16|论语111

17|西瓜|NULL|

I8|苹果|NULL|

19|牛仔裤|NULL|

|10I红楼梦INULL|

+----+----------+-------+

11rowsinset(0.01sec)

与实例8-5的查询结果进行比较,可以看出,在对商品信息进行排序后,可以

更加方便地查看信息。

【学生】聆听、思考、记录

第二节课

【教师】提出以下问题:通过问题导入,

问题导入什么是主查询和子查询?引导学生主动思

(5min)考,激发学生的学

【学生】思考、举手回答

习兴趣

【教师】通过学生的回答引入新知,介绍子查询和合并查询结果的相关知识

8.2子查询通过教师的讲

+【教师】组织学生扫码观看“子查询"视频(详见教材),让学生对基本知解和演示,使学生

传授新知了解子查询和合

识有一个大致的了解

(20min)并查询结果的相

如果一个查询语句中嵌套了一个或若干个其他的查询语句,那么在整个语句中,关知识

外层查询称为主查询,内层查询称为子查询或者嵌套查询。该类查询可以基于一个

表或多个表。在此类查询中,系统会先执行子查询,将子查询的结果作为主查询的

过滤条件。

子查询可以应用在SELECT,UPDATE和DELETE语句中,并且大多数子查询

会包含在FROM子句或WHERE子句中,在WHERE子句中通常与IN,ANY,ALL

和EXISTS关键字搭配使用,也可以使用条件判断符。本节主要讲解SELECT语句

中的子查询。

8.2.1FROM子句中的子查询

FROM子句中的子查询会生成一个临时表,由于FROM子句中的每个表都必须

有一个名称,因此应该为临时表取一个别名,语法形式如下:

SELECT(*|col_list)FROM(SELECT*FROMtable_name)AStable_alias

[WHEREcondition];

上述语句中,table_alias表示表别名,下面通过实例介绍上述语句的应用.

【实例8-9]执行查询语句,查询goods表中id值大于3,且num值大于10

的商品的id和name值。

步骤1登录MySQL,并执行以下语句,选择db_shop数据库。

USEdb_shop;

步骤2执行以下语句,查询goods表中id值大于3的数据记录,结果如下:

mysql>SELECT*FROMgoodsWHEREid>3;

+——+-----------4------------------------+---------------4----------------+------------------------------------------------+

|id|type|name|price|num|add_time|

+——+----+---------+------+------+-------------------+

I4|服饰|休闲西服1800.00|10|2018-04-0413:40:40|

I5|饮品I果汁I2.50|7012018-05-0513:40:40|

|6|书籍|论语|109.00|5012018-01-0313:40:40|

|7|水果|西瓜|1.50|NULL|2018-02-0513:40:40|

|8|水果|苹果|3.00|10012018-03-0513:40:40|

|9I服饰I牛仔裤|120.00|1012018-05-0413:40:40|

|10|书籍|红楼梦|50.50|1512018-05-0613:40:40|

+一一+----+---------+------+------+-------------------+

7rowsinset(0.04sec)

步骤3执行嵌套笥旬,将上述语句作为子查询,在其生成的临时表gl中查询

num值大于10的商品的id和name值,查询结果如下:

mysql>SELECTid,namefrom(SELECT*FROMgoodsWHEREid>3)ASgl

->WHEREnum>10;

+_…+-----------------4-

|id|name|

+——+------+

15|果汁I

161论语I

18I苹果I

110|红楼梦|

++-------+

4rowsinset(0.00sec)

8.2.2WHERE子句中的子查询

包含在WHERE子句中的子查询,其查询结果通常是单列数据,系统执行子查

询后,子查询的结果会作为主查询的筛选条件。

1.使用IN关键字的子查询

当子查询返回的是一个数据集合,主查询需要返回符合集合中条件的记录时,

可以使用1N关键字,语法形式如下:

SELECT{*|col_list}FROMtablc_namcl

WHEREcol_namelIN

(SELECTcol_name2FROMtable_name2[WHEREcondition]);

上述语句中col_namcl为表1中的字段,col_name2为表2中的字段。

【实例8-10]执行查询语句,查询orders表中字段goods_id的所有值,然后

使用子查询结果拼接WHERE条件,查询goods_id值对应的所有商品的详细信息。

步骤1登录MySQL,并执行以下语句,选择db_shop数据库。

USEdb_shop;

步骤2执行SQL语句,查询orders表中字段goods_id的所有值,执行结果如

下:

mysql>SELECTgoods_idFROMorders;

+----------+

|goods_id|

+......................+

|1|

|1|

|4|

|5|

|6|

|15|

++

6rowsinset(0.00sec)

步骤3执行SQL语句,使用上述查询结果作为子查询,在goods表中查询

goods_id值对应的商品的详细信息,执行结果如下:

mysql>SELECT*FROMgoodsWHEREidIN(SELECTgoods.idFROMorders);

+--+----+---------+------+------+-------------------+

|id|type|name|price|num|add」ime|

+——+----+---------+------+------+-------------------+

|1I书籍I西游记I50.40|2012018-01-0113:40:40|

|4|服饰|休闲西服|800.00|1012018-04-0413:40:40|

|5|饮品|果汁|2.50|7012018-05-0513:40:40|

|6|书籍|论语|109.0015012018-01-0313:40:40|

+----+----+----------+-----+------+-------------------+

4rowsinset(0.04sec)

执行结果成功显示出订单中商品的详细信息,但由于goods_id为15的商品不

在goods表中,所以没有显示出该商品的信息。

另外,子查询还可以和NOTIN配合使用,下面通过实例进行介绍。

【实例8-11】执行SQL语句,依然以前面的查询结果作为子查询,在goods

表中查询没有订单的商品的详细信息,执行结果如下:

mysql>SELECT*FROMgoodsWHEREidNOTIN(SELECTgoods_idFROM

orders);

+----+----+-------+--------+------+-------------------+

|id|type|name|price|num|add_time|

+——+----+-------+--------+------+-------------------+

I2|糖类|牛奶糖|7.50|20012018-02-0213:40:40|

|3|糖类|水果糖|2.50|10012018-06-0911:20:55|

|7|水果|西瓜|1.50INULL12018-02-0513:40:40|

|8|水果|苹果|3.00|10012018-03-0513:40:40|

|9|服饰|牛仔裤|120.00|1012018-05-0413:40:40|

|10I书籍I红楼梦I50.5011512018-05-0613:40:40|

+——+----+-------+-------+------+-------------------+

6rowsinset(0.04sec)

2.使用ANY、SOME关键字的子查询

ANY和SOME是同义词,表示满足其中任一条件。该类查询会创建一个表达

式对子查询的返回值列表进行比较,只要满足子查询中的任一个比较条件,就返回

一个结果。其语法形式如下:

SELECT(*|col_list)FROMtablc_namel

WHEREcol_namel<any

(SELECTcol_name2FROMtable_name2[WHEREcondition]);

【实例8-12】执行SQL语句,在goods表中查询2018年4月2号以后订单

中的商品信息。

步骤1登录MySQL,并执行以下语句,选择db.shop数据库。

USEdb_shop;

步骤2执行SQL语句,查询orders表中2018年4月2号以后的订单中的

goods_id的所有值,结果如下:

mysql>SELECTgoods_idFROMordersWHEREadd_time>'2018-04-02,;

+--------+

Igoods_id|

+--------+

16|

111

15|

111

115|

14|

+--------+

6rowsinset(0.00sec)

步骤3执行SQL语句,使用上述查询结果作为子查询,在goods表中查询

goods_id值对应的商品的详细信息,结果如下:

mysql>SELECT*FROMgoods

->WHEREid=ANY(SELECTgoodsjdFROMordersWHERE

add_time>'2018-04-02');

+----+----+--------+------+------+-------------------+

|id|type|name|price|num|add_time|

+--+----+--------+------+------+-------------------+

|6|书籍|论语|109.00|5012018-01-0313:40:40|

|1I书籍I西游记I50.40|2012018-01-0113:40:40|

|5|饮品|果汁|2.50|7012018-05-0513:40:40|

|41服饰|休闲西服1800.00|10|2018-04-0413:40:40|

+--+----+---------+------+-------+------------------+

4rowsinset(0.00sec)

【提示】

由上述查询结果可以看出,使用"=ANY"与使用关键字IN的效果实际上是相

同的,除"="外,ANY关键字前面可以使用的条件判断符还有"<="

和"〉=",读者可根据需要进行选择.

3.使用ALL关键字的子查询

与ANY和SOME不同,使用关键字ALL的子查询,表示当一条记录符合子查

询结果中所有的条件时,才会返回该记录。其语法形式如下:

SELECT{*|col_list}FROMtable_namel

WHEREcol_namel>All

(SELECTcol_name2FROMtable_name2[WHERE条件]);

【实例8-13]执行以下语句,查询goods表中id值比子查询结果中的最大数

据还要大的记录.

步骤1登录MySQL,并执行以下语句,选择db_sh叩数据库。

USEdb_shop;

步骤2执行SQL语句,查询orders表中2018年4月3号之前的订单中的

goods_id的所有值,结果如下:

mysql>SELECTgoods.idFROMordersWHEREadd_time<'2018-04-03';

+----------+

|goods_id|

+----------+

16|

14|

+----------+

2rowsinset(0.00sec)

【提示】

为验证查询结果,此处事先将orders表中第6条记录的添加时间改为了

2018-04-0114:47:24.

步骤3执行SQL语句,使用上述查询结果作为子查询,在goods表中查询

goods.id值对应的商品的详细信息,结果如下:

mysql>SELECT*FROMgoods

->WHEREid>ALL(SELECTgoodsjdFROMordersWHERE

addjime^O18-04-03');

+——+------------4------------------+--------------------4-----------------+-----------------------------------------------+

|id|type|name|price|num|add_time|

+——+----+-------+--------+------+------------------+

I7|水果|西瓜|1.50INULL12018-02-0513:40:40|

|8|水果|苹果|3.00|100R018-03-0513:40:40|

|9|服饰|牛仔裤|120.00|1012018-05-0413:40:40|

|10I书籍I红楼梦|50.5011512018-05-0613:40:40|

+——+-----+------+--------+------+-------------------+

4rowsinset(0.00sec)

可以看出,查询结果中所有记录的id值都同时大于子查询结果中的4和6。

【提示】

ALL关键字之前可以使用的条件判断符有">""<="和">=",但一般

不会使用.

4.使用EXISTS关键字的子查询

使用EXISTS关键字,系统会对子查询的返回结果进行判断,如果子查询至少

返回一行记录,那么EXISTS的结果为TRUE,此时主查询语句将会执行;如果子

查询没有返回任^记录,那么EXISTS的结果为FALSE,此时主查询语句将不会执

行。其语法形式如下:

SELECT{*|col_list)FROMtable_namel

WHEREEXISTS(SELECT*FROMtable_name2);

【实例8-14]查询orders表中是否存在goodsjd值为5的记录,如果存在,

则查询goods表中id值小于5的记录。

在选中数据库db_shop后,执行SQL语句,使用EXISTS关键字查询goods表

中id值小于5的记录,查询结果如下:

mysql>SELECT*FROMgoodsWHEREid<'5'AND

->EXISTS(SELECTo_idFROMordersWHEREgoods_id=,5,);

+——+----+---------+------+------+-------------------+

|id|type|name|price|num|add_time|

+--+----+---------+------+------+-------------------+

|1I书籍|西游记I50.40|20R018-01-0I13:40:40|

|21糖类|牛奶糖|7.50|20012018-02-0213:40:40|

|31糖类|水果糖|2.50|10012018-06-0911:20:55|

|4|服饰|休闲西服|800.00|1012018-04-0413:40:40|

+——+----+---------+------+-------+------------------+

4rowsinset(0.02sec)

由查询结果可知,子查询结果表明orders表中存在goods_id=5的记录,因此

EXISTS表达式返回true;主查询语句接收true之后根据查询条件id<5对goods表

进行查询,返回4条符合条件的记录。

NOTEXISTS与EXISTS使用方法相同,返回的结果相反,读者可自行尝试.

5.使用条件判断符的子查询

在子查询中,还可以单独使用条件判断符.其语法形式如下:

SELECT{*|col_list}FROMtable_name1

WHEREcol_nameloperators

(SELECTcol_name2FROMtable_name2);

上述语句中,operators表示条件判断符。

【实例8-15】查询goods表中ojd值等于3的商品的详细信息。

在选中数据库db_shop后执行SQL语句使用条件判断符查询goods表中o_id

值等于3的商品的详细信息。查询结果如下:

mysql>SELECT*FROMgoods

->WHEREid=(SELECTgoods_idFROMordersWHEREo_id=3);

+--+----+----+------+------+-------------------+

|id|type|name|price|num|add_time|

+--+----+----+------+-------+-------------------+

|5|饮品|果汁|2.50|7012018-05-0513:40:40|

+---+----+----+------+-------+-------------------+

1rowinset(0.06sec)

8.3合并查询结果

合并查询结果就是使用UNION关键字,将多条查询语句的结果合并在一起显

示。UNION有两种使用方法,一种是查询结果不重复(过滤掉重复的记录),另一

种是保留所有查询结果。

为便于讲解,首先创建两张表,分别为爱好音乐的学生表(music)和爱好舞蹈

的学生表(dance),具体操作见实例8-16.

【实例8-16]参照表8-3创建两张结构相同的表,分别命名为music和dance,

之后为各个表插入数据。

+【教师】通过多媒体展示"表结构"表格,介绍相关

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论