1、本章要求:第5章数据库的查询 了解M ySQL的单表查询 了解使用聚合函数实现数据查询 掌握合并查询的使用 掌握连接查询和子查询 掌握为表和字段取别名的用法 掌握使用正则表达式的使用方法主要内容第5章数据库的查询1.基本查询语句2.单表查询3.聚合函数查询4.连接查询5.子查询6.合并查询结果7.定义表和字段的别名8.使用正则表达式查询9.综合实例一一使用正则表达式查询学生成绩信息 令 二二二.5.1基本查询语句S ELECT语句是最常用的查询语句,它的使用方式有些复杂,但功能是相当强大的。S ELECT语句的基本语法如下:select selectionjist from数据表名 where
2、 primary_constraint group by grouping_columns order by sorting_cloumns having secondary_constraint limit count限定输出的查询结果要查询的内容,选择哪些列指定数据表/查询时需要满足的条件,行必须满足的条件/如何对结果进行分组/如何对结果进行排序/查询时满足的第二条其中使用的子句将在后面逐个介绍。下面先介绍S ELECT语句的简单应用。(1)使用S ELECT语句查询一个数据表使用S ELECT语句时,首先要确定所要查询的列。“*”代表所有的列。例如:查询db_database06数 据库
3、user表中的所有数据,代码如下:mysql use db_database06Database changedmysql select*from user;+-+-+-+|id|user|Ixdh|jtdz|+-+-+-+|1|mr|12345678|长春市|2|mrsoft 187654321|四平市|+-+-+-+2 rows in set(0.00 sec)这是查询整个表中所有列的操作,还可以针对表中的某一列或多列进行查询。(2)查询表中的一列或多列针对表中的多列进行查询,只要在select后面指定要查询的列名即可,多列之间用“,”分隔o例如:查询user表中的id和Ixdh,代码如下
4、:mysql select id,Ixdh from user;+-+I id|Ixdh|+-+|1|12345678|2|87654321|+-+2 rows in set(0.00 sec)(3)从一个或多个表中获取数据使用S ELECT语句进行查询,需要确定所要查询的数据在哪个表中,或在哪些表中,在对多个表进 行查询时,同样使用“,”对多个表进行分隔。【例5-1 从tb admin表和tb students表中查询出tb admin,id、tb admin.tb_user.tb_students,id和tb students.name字段的值。其代码如下:mysql select tb_
5、admin.id,tb_admin.tb_user,tb_students.id,tb_students.name fromtb_admin,tb_students;+-+-+-+I id|tb_user|id|name|+-+-+-+I 1 Imr|1|潘攀|I 2|明日科技|1|潘攀|+一一+-+-+-+-一2 rows in set(0.03 sec),说明:.在查询数据库中的数据时,如果数据中涉及到中文字符串,有可能在输出时会出现乱码。那么 最后在执行查询操作之前,通过set names语句设置其编码格式,然后再输出中文字符串时就不会.出现乱码了。如上例中所示,应用set names语
6、句设置其编码格式为gb2312。.还可以在WHERE子句中使用连接运算来确定表之间的联系,然后根据这个条件返回查询结果。例.如:从家庭收入表(jtsr)中查询出指定用户的家庭收入数据,条件是用户的ID为1。其代码如下:mysql select jtsr from userjtsr-where user.user=jtsr.user and user.id=l;I jtsr|.+-+D|1OOOO I+2 rows in set(0.00 sec)其中,user,user=jtsr.user将表user和jtsr连接起来,叫做等同连接;如果不使用 user.user=jtsr.user,那么产生
7、的结果将是两个表的笛卡尔积,叫做全连接。5.2.15.2.25.2.35.2.45.2.55.2.65.2.75.2.85.2.95.2.105.2.115.2.125.2.135.2单表查询查询所有字段查询指定字段查询指定数据带IN关键字的查询带BETWEEN AN D的范围查询带L IKE的字符匹配查询用IS N UL L关键字查询空值带AN D的多条件查询带OR的多条件查询用DISTIN CT关键字去除结果中的重复行用ORDER BY关键字对查询结果排序用G ROUP BY关键字分组查询用L IM I邛艮制查询结果的数量5.2.1查询所有字段查询所有字段是指查询表中所有字段的数据。这种方
8、式可以将表中所有字段的数据都查询出来 o在MyS QL中可以使用“*”代表所有的列,即可查出所有的字段,语法格式如下:SELECT*FROM 表名;其应用已经在5.1基本查询语句中领教过,这里不再赘述。5.2.2查询指定字段.查询指定字段可以使用下面的语法格式:SELECT字段名FROM表名;.如果是查询多个字段,可以使用“,”对字段进行分隔。9【例5-2】查询db database06数据库tbogin表中“user”和“pwd”两个字段,S ELECT查询语.句如下:SELECT user,pwd FROM tbogin;一查询结果如图5-1所示。mysql select userpwd
9、from tb_login;+-+i user i pwd i+-i mrkj!nrkj i:lx:lx!i mr!mrsoft i+-+-+3 rows in set 大于Id5Betwee nn/aId betweenl and 15小于ld大于等 于Id=5N ot inn/aN ame not in(shi,li):小于等 于Id=5L ike模式匹 配N ame like(shi%)!=或不等于Id!=5N ot like模式匹 酉己N ame not like(shi%)Is nulln/aId is nullRegexp常规表 达式N ame正则表达式表5-1中列举的是WHERE
10、子句常用的比较运算符,例中的id是记录的编号,name是表中的用户名。537V:a【例5-3】应用where子句,查询tb_login表,条件是user(用户名)为mr,代码如下:select*from tbogin where user=mr;查询结果如图5-2所示。1 row in set nysqlselect*Fromtb_loginwhere user=,!id!user ipv/d!section!name!8;+-+-nr-nrsoft!PHP-!明日科技一-mysql _图5-2查询指定数据5.2.4带IN关键字的查询IN关键字可以判断某个字段的值是否在于指定的集合中。如果字段
11、的值在集合中,则满足查询条件,该记录将被查询出来;如果不在集合中,则不满足查询条件。其语法格式如下:SELECT*FROM表名 WHERE条件NOT IN(元素1,元素2,,元素n);“NOT”是可选参数,加上NOT表示不在集合内满足条件;“元素”表示集合中的元素,各元素之间用逗号隔开,字符型元素需要加上单引号。【例5-4】应用IN关键字查询tb login表中user字段为mr和lx的记录,查询语句如下:SELECT*FROM tbogin WHERE user INCmr/lx);查询结果如图5-3所示。mysqlmysqlselect*fromthlogin where iiser!id
12、!user!pwdsectionname1!6!8!lx!nr ilx mrsoftPHP程序开发部PHP;明日科技,明日科技 12 rowsin set select*from tb_login where user NOT IN;-+-+-+-+-id user i pwd i section!name+-+-+-+-+-:7!mrkj!mrkj:程序开发;明日科技;+-+-L row in set 图5-4使用NOT IN关键查询5.2.5 带BETWEEN AN D的范围查询BETWEEN AND关键字可以判断某个字段的值是否在指定的范围内。如果字段的值在指定范围内,则满足查询条件,该
13、记录将被查询出来。如果不在指定范围内,则不满足查询条件。其语法如下SELECT*FROM 表名 WHERE 条件NOT BETWEEN 取值 1 AND 取值2;图5-5 使用BETWEEN AND关键字查询如果要查询tbjogin表中id值不在5 7之间的数据,则可以通过NOT BETWEEN AND来完成。其查 询语句如下?NOT:是可选参数,加上NOT表示不在指定范围内满足条件;取值L表示范围的起始值;取值2:表示范围的终止值。【例5-6】查询tbjogin表中id值在57之间的数据,查询语句如下:SELECT*FROM tbjogin WHERE id BETWEEN 5 AND 7;
14、查询结果如图5-5所示nysql select*from tb_login where id BETWEEN 5 and 7;+-+-+-+-+-+!id user i pud!section i name!I 6 l lx t lx!PHP程序开发部;明日科技:7 I mrkj!mrkj i程序开爰;明日科技-2 rows in set SELECT*FROM tbjogin WHERE id NOT BETWEEN 5 AND 7;:,二二5.2.6带L IKE的字符匹配查询LIKE属于较常用的比较运算符,通过它可以实现模糊查询。它有两种通配符:“”和下划线“,“婷可以匹配一个或多个字符,
15、可以代表任意长度的字符串,长度可以为0。例如,“明技”表示以“明”开头,以“技”结尾的任意长度的字符串。该字符串可以代表明日科技、明日编程 科技、明日图书科技等字符串。只匹配一个字符。例如,m_n表示以H1开头,以n结尾的3个字符。中间的可以代表任意一个字符。说明:字符串和“入”都算做一个字符,在这点上英文字母和中文是没有区别的。仁口【例5-7】查询tb_login表中user字段中包含mr字符的数据,查询语句如下:select*from tbjogin where user like%mr%;查询结果如图5-6所示。ysql select*from tb_login where user l
16、ike*;id-+-user-+-!pwd-+-i section-+-+i name 7!nrkjnrkj:程序开发:席日科技8*nr!nrsoft PHP!明日科技!_-+-+-+-+-+rows in set 图5-6模糊查询仁口5.2.7 用IS N UL L关键字查询空值.IS NULL关键字可以用来判断字段的值是否为空值(NULL)。如果字段的值是空值,则满足查.询条件,该记录将被查询出来。如果字段的值不是空值,则不满足查询条件。其语法格式样如下:IS NOT NULL.其中,NOT是可选参数,加上NOT表示字段不是空值时满足条件。【例5-8】下面使用IS NULL关键字查询db_
17、database06数据库的tb)ook表中name字段的值为空的记录,查询语句如下::SELECT books,row FROM tb_book WHERE row IS NULL;查询结果如图5-7所示。二二iysql select booksrow from tbjook where row is null;books i row!+-:3项目整合;NULL!;JAUA范说完全自学手册;NULLrows in set 图5-7查询tb_book表中row字段值为空的记录仁口多二二二5.2.8带AN D的多条件查询AND关键字可以用来联合多个条件进行查询。使用AND关键字时,只有同时满足所
18、有查询条件的 记录会被查询出来。如果不满足这些查询条件的其中一个,这样的记录将被排除掉。AND关键字的语 法格式如下:select*from数据表名where条件1 and条件2.AND条件表达式n;AND关键字连接两个条件表达式,可以同时使用多个AND关键字来连接多个条件表达式。【例5-9】下面查询tb_login表中user字段值为mr,并且section字段值为PHP的记录,查询语句如下之select*from tbjogin where user=mr and section=php;查询结果如图5-8所示。mysql select*from tb_login where and se
19、ction=,php*;+-+-+-+-+-+!id i user i pwd i section i name i+-+-+-+:8:nr!nrsoft!PHP!明日科技;-1 row in set mysql图5-8使用AND关键字实现多条件查询仁5.2.9带OR的多条件查询 OR关键字也可以用来联合多个条件进行查询,但是与AND关键字不同,OR关键字只要满足查询条件中的一个,那么此记录就会被查询出来;如果不满足这些查询条件中的任何一个,这样的记录将 被排除掉。OR关键字的语法格式如下:.select*from数据表名where条件1 OR条件2.OR条件表达式n;OR可以用来连接两个条件
20、表达式。而且,可以同时使用多个OR关键字连接多个条件表达式。.【例5-10】下面查询tbjogin表中section字段的值为“PHP”或者“程序开发”的记录,查询语句如下:.select*from tbjogin where section=php or section=程序开发;查询结果如图5-9所示。iysql select*fron tb_login where section=,php/or section=程序开发;!id user pwd i section i name:?:mrkj!nrkj!程序开发;i 8 i mr i nrsoft PHP i 明日科技2 rows in
21、 set select distinct name from tb_login;!name髓琴技rows in set select name from tb_login;i name茂法 理北 经日日rows in set 图5-11去除重复记录前的name字段值 仁口5.2.11用ORDER BY关键字对查询结果排序使用ORDER BY可以对查询的结果进行升序(AS C)和降序(DES C)排列,在默认情况下,ORDER BY按升序输出结果。如果要按降序排列可以使用DES C来实现。语法格式如下:ORDER BY 字段名ASC|DESC;AS C表示按升序进行排序;DES C表示按降序进行
22、排序。说明:如果对含有NULL值的列进行排序时,如果是按升序排列,NULL值将出现在最前面,如果是按降 序排列,NULL值将出现在最后。二二二仁口【例5-12 查询tbjogin表中的所有信息,按照“id”进行降序排列,查询语句如下:select*from tb_login order by id desc;查询结果如图5 T2所示。iysql select*from tb_login order by id desc;-+-+-+-+-+id i user i pwd i section i name!+-8 i nr i nrsof t i PHP i 明日科技;!?;nrkj!mrkj;
23、程序开发;!6!lx!lx:PHP硬庠开发部;明日科技+-+-+-+3 rows in set 图5 T2按id序号进行降序排列口 仁5.2.12 用G ROUP BY关键字分组查询41 通过GROUP BY子句可以将数据划分到不同的组中,实现对记录进行分组查询。在查询时,所查V Q 询的列必须包含在分组的列中,目的是使查询到的数据没有矛盾。1.使用GROUP BY关键字来分组X s单独使用GROUP BY关键字,查询结果只显示每组的一条记录。【例5-13使用GROUP BY关键字对tb_book表中talk字段进行分组查询,查询语句如下:select id,books,talk from t
24、b_book GROUP BY talk;查询结果如图5 T 3所示。iysql select id.books.talk from tb_book GROUP BY talk;图5-13使用GROUP BY关键进行分组查询为了使分组更加直观明了,下面查询tb_book表中的记录,查询结果如图5 T4所示。iysql select idbooksj.talkuser From tb_hook;i id!books i talk i user i!26!JAUA 典型摸块;JAUA!mr!27!PHP典型模块;.net;mp!28!C*项目整合!.net!nr!29!aaaa!其它 i lx!:
25、30:aa!PHP!lx!25;JAUA范例完全自学手册;JAUA!mr irows in set is(yl _图5 T4 tb book表中的记录仁口2.GROUP BY关键字与GROUP_CONCAT()函数一起使用使用GROUP BY关键字和GROUP_CONCAT()函数查询,可以将每个组中的所有字段值都显示出来。【例5-14】下面使用GROUP BY关键字和GROUP_CONCAT()函数对tb_book表中的talk字段进行分组查询,查询语句如下:select id,books,GROUP _CONCAT(talk)from tb_book GROUP BY talk;查询结果如
26、图5 T5所示。图5-15使用GROUP BY关键字与GROUP_CONCAT()函数进行分组查询3.按多个字段进行分组使用GROUP BY关键字也可以按多个字段进行分组。【例5-15】下面对tb_book表中的user字段和sort字段进行分组,分组过程中,先按照talk字段进行分组。当talk字段的值相等时,再按照sort字段进行分组,查询语句如下:select id,books,talk,user from tb_book GROUP BY user,talk;查询结果如图5 T6所示。pysql select idbookstalk.user from tb_Jjook GROUP B
27、Y user,talk;4 rows in set select*from tb_login order by id asc Unit 3;!id-+-i user-+-i pwd-+-!section-+-+i name!6!lx!lx!PHP程序开发部明日科技:7!mrkji mrkj;程序开发1 1;明日科裴!1!8i nri nrsoft!PHP-+-+-+-+-+B rows in set select*from tb_login order by id asc limit 12;rows in set id-+-!user-pwd一-section-!name!7i mrkji m
28、rkj;程序开发;高经理8 mr-+-!mrsoft-+-!PHP-+-!明日科技-+-+图5-18使用limit关键字查询指定记录mm-二5.3聚合函数查询5.3.1COUN T。函数5.3.2SUM()函数5.3.3AVG()函数5.3.4M AX()函数5.3.5M IN()函数仁q5.3.1 COUN T。函数COUNT。函数,对于除以外的任何参数,返回所选择集合中非NULL值的行的数目;对于参 数“*”,返回选择集合中所有行的数目,包含NULL值的行。没有WHERE子句的COUNT(*)是经过内部 优化的,能够快速的返回表中所有的记录总数。【例5-18】下面使用count()函数统计
29、tb_login表中的记录数,查询语句如下:select count(*)from tbjogin;查询结果如图5 T9所示。结果显示,tb_login表中共有4条记录。nysql select count from tb_login;+-count!+-:4!-+L row in set 图5 T9使用count()函数统计记录数5.3.2 SUM()函数S UMO函数可以求出表中某个字段取值的总和。【例5-19 使用S UM()函数统计tb_book表中图书的访问量字段(row)的总和。在查询前,先来查询一下tb_book表中row字段的值,结果如图5-20所示。图5-20 tbbook表
30、中row字段的值 下面使用SUM。函数来查询。查询语句如下:select sum(row)from tb_book;仁口查询结果如图5-21所示。结果显示row字段的总和为116。nysql select sum from tbjbook;i-+sun i-+!116!i-+L row in set mysql._图5-21使用S UM()函数查询row字段值的总和5.3.3 AVG()函数AVG()函数可以求出表中某个字段取值的平均值。【例5-20】下面使用AVG()函数求tb_book表中row字段值的平均值,查询语句如下:select AVG(row)from tb_book;查询结果如
31、图5-22所示。二二二iysql select AUG from tbjtiook;-+AUG!-+29!-+row in set 图5-22使用AVG()函数求row字段值的平均值仁口,二二!n5.3.4 M AX()函数MAX()函数可以求出表中某个字段取值的最大值。【例5-21】下面使用MAX()函数查询tb_book表中row字段的最大值,查询语句如下:select MAX(row)from tb_book;查询结果如图5-23所示。nysql select MAX from tb_Jook;MAX1 row in set(0.00 sec图5-23使用MAX()函数求row字段的最大
32、值下面来看一下tb_book表中row字段的所有值,查询结果如图5-24所示。结果显示row字段中最大 值为95,与使用MAX函数查询的结果一致。n select row From tb_book;row!NULL!1!8!NULL6 rows in set select MIN from tb_boo k;!MIN;1二二pow in set select*from tb_login;!id!user i pwd i section i name7:mrkj i mrkj!程序开发;6:lx i lx!PHP程序开发部 i明日科技8 i mr!nrsof t!PHP i 明日科技;卜-+-+
33、-+-+-+)rows in set sortebooks from tb_book;i id!user!sort!books类 用RI RI*nr lx lx nr型块目例础例 壹项花基范应!JAUA典型模块;PHP典型慎隹,i Ctt项目整合i aaaa!aa;JAUA范例完全自学手册rows in set 从上面的查询结果中可以看出,在两个表中存在一个连接一一user字段,它在两个表中是等同的,tb login表的user字段与tb_book表的user字段相等,句如下:select name,books from tbjogin,tb_book where tb_login.user=
34、tb_book.user;查询结果如图5-28雨示。因此可以创建两个表的一个连接。查询语nysql select nameebooks from tb_login,tb_book where tb_login.user=tb_book.usei*i name i books支支支支支支 支支支支支支 二七 wRlrYlrYy L 7:lrTlrTlrYlrTlr3理科理 日日日日日经日经日日日日日日I JAUA典型模块:PHP典型模块!Cit项目整合;Word范例宝典:PHP24堂课!JM啜触全自学手册;UB苗型植块自学手册!C花例;PHP项目整合:PHP24堂课;UB范向宝券!PHP网络编程
35、自学手册;PHP编程宝典14 rows in set 图5-28内连接查询5.4.2外连接查询与内连接不同,外连接是指使用OUTER JOIN关键字将两个表连接起来。外连接生成的结果集不仅 包含符合连接条件的行数据,而且还包括左表(左外连接时的表)、右表(右外连接时的表)或两 边连接表(全外连接时的表)中所有的数据行。语法格式如下:,SELECT字段名称FROM表名1 LEFTRIGHT JOIN表名2 ON表名1.字段名1=表名2.属性名2;外连接分为左外连接(LEF T JOIN)、右外连接(RIGHT JOIN)和全外连接3种类型。1.左外连接左外连接(LEF T JOIN)是指将左表中
36、的所有数据分别与右表中的每条数据进行连接组合,返回的 结果除内连接的数据外,还包括左表中不符合条件的数据,并在右表的相应列中添加NULL值。【例5-24】下面使用左外连接查询tb_login表和tb_book表,通过user字段进行连接,查询语句如下:select section,tbjogin.user,books,row from tb_login left join tb_book on tbogin.user=tb_book.user;查询结果如图5-29所示。ysql select name,books from tb_login,tb_book where tb_login.use
37、i*=tb_book.user!name!books支支支支支支 支支支支支支 W W H.lrYlrY)书-YlrYlrYJW 日日日日日经日经日日日日日日I JAUA典型模块;PHP典型菅夬!5项目整合;Wo rd范例宝典:PHP24堂课;JAU琬触全自学手册;UB典型模块 嚅鱼自学手册;PHP项目整合!PHP24堂课;UB范初宝瓶!PHP网络编程自学手册:PHP编程金典14 rows in set 图5-29左外连接查询结果显示,第1条记录的books和row字段的值为空,这是因为在tb_book表中并不存在user字段 为mrkj的值。仁口2.右外连接右外连接(RIGHT JOIN)是
38、指将右表中的所有数据分别与左表中的每条数据进行连接组合,返 回的结果除内连接的数据外,还包括右表中不符合条件的数据,并在左表的相应列中添加NULL。【例5-25】下面使用右外连接查询tb_book表和tb_login表,两表通过user字段连接,查询语句如下:select section,tb_book.user,books,row from tb_book right join tbjogin on tb_book.user=tb_login.user;查询结果如图5-30所示。mysql select sect ion tb_book.user ebooks j.row from tb_b
39、ook right join tb_login on tb_book.usei*=tb_login.user;7 rows in set-+-+section!userbooks!row1程序开发!NULL!NULL!NULL 1PHP程住开发部5 lx!aaaa!1!PHP建岸开爰勒!lxi aa!8!PHP!nr!JAUA图5-30右外连接查询5.4.3复合条件连接查询在连接查询时,也可以增加其他的限制条件。通过多个条件的复合查询,可以使查询结果更加 准确。【例5-26】下面使用内连接查询tb_book表和tb_login表。并且tb_book表中row字段值必须大于5,查询语句如下:se
40、lect section,tb_book.user,books,row from tb_book,tb_login where tb_book.user=tb_login.user and row5;查询结果如图5-31所示。mysqlselect sect ion thjiiook.user,books,row from tb_book,tb_login where tb_boo.user=tb_login.user and row5;i section i user;books i row i+-+-+-+-+!PHP!mr!JAU哂型模块;12!PHP!nr!PHP典型模块;95:PHP
41、程序开发部;lx;aa!8+-+-+-+-+3 rows in set 图5-31复合条件连接查询5.5子查询5.5.1带IN关键字的子查询5.5.2带比较运算符的子查询5.5.3带EXISTS关键字的子查询5.5.4带AN Y关键字的子查询5.5.5带AL L关键字的子查询仁口J J 一三 V V 二二二 b5.5.1带IN关键字的子查询只有子查询返回的结果列包含一个值时,比较运算符才适用。假如一个子查询返回的结果集是 值的列表,这时比较运算符就必须用IN运算符代替。IN运算符可以检测结果集中是否存在某个特定的值,如果检测成功就执行外部的查询。【例5-27】下面查询tbogin表中的记录,但
42、user字段值必须在tb_book表中的user字段中出 现过,查询语句如下:select*from tbjogin where user in(select user from tb_book);在查询前,先来分别看一下tb login和tb book表中的user字段值,以便进行对比,tbogin表 中的user字段值如图5-32所示。mysql select user from tb_login;+-+user +-+!mrkj !lx!nr +-+3 rows in set 图5-32 tb_login表中的user字段值tbbook表中的user字段值如图5-33所示。nysql s
43、elect user from tb_Jook;-usernr nr nr lx lx nr lx nr lx lx nr nr lx mi%14 rows in set select*fron tb_login where user inCselect user from tb_book;id-+-!user-+-!pud-+-section-+-+name i6!lx:lx!PHP程序开发部明日科技8i nr-一i nrsoft-+-!PHP-+-;明日科技;-+-+rows in set 图5-34使用IN关键子实现子查询查询结果只查询出了user字段值为lx和mr的记录,因为在tb_b
44、ook表的user字段中没有出现.mrkj的值。说明:NOT IN关键字的作用与IN关键字刚好相反。在本例中,如果将IN换为NOT IN,则查询结果将会 只显示一条user字段值为mrkj的记录。仁口5.5.2带比较运算符的子查询lwm.二子查询可以使用比较运算符。这些比较运算符包括二、!二、二、二等。比较运算符在子查 询时使用的非常广泛。【例5-28】下面查询图书访问量为“优秀”的图书,在tbjow表中将图书访问量按访问数划分等级,如图5-35所示。nysql select*from tb_row;4-+-+i id row name i1;90;优秀 2:80:良好;3:70:一般;4;5
45、0;差;-rows in set 图5-35查询tb row表中的数据从结果中看出,当访问量大于等于90时即为“优秀”,下面再来查询tb_book图书信息表中row 字段的值,如图5-36所示。14 rows in set mysqlselect id,booksj.row fromtb_book;!id!books!row i!26!JAU辞蟹舞夬12:!27!PHP其型模块95:!28!c北项目整合!29!Wo rd范例宝典!1!30!PHP24堂课 1!81!25!JMA范例定全自学手册i 24!UB典型棋块!1!i 14!:20:嗑费全自学手册111!21!PHP项目整合:22!PHP
46、24堂课 11!23!31!UB范例宝典PHP网络编程自学手册!11!12!i 34!PHP编程宝典-+-!12!图5-36 查询tb_book表中row字段的值结果显示,第27条记录的访问量大于90。下面使用比较运算符的子查询方式来查询访问量为优 秀的图书信息,查询语句如下:select id,books,row from tb_book where row=(select row from tb_row where id=l);查询结果如图5.37所示。mysql select id,.books,row fron tb_book where row=;+-+-+-+i id i book
47、s i row;+-+-+-+5 27!PHP典型模块;95!+-+-+-+1 row in set mysql.).图5-37使用比较运算符的子查询方式来查询访问量为“优秀”的图书信息匕口5.5.3带EXISTS关键字的子查询使用EXIS TS关键字时,内层查询语句不返回查询的记录。而是返回一个真假值。如果内层查询 语句查询到满足条件的记录,就返回一个真值(true),否则,将返回一个假值(false)。当返回 的值为true时,外层查询语句将进行查询;当返回的为false时,外层查询语句不进行查询或者查询 不出任何记录。【例5-29】下面使用子查询查询tb_book表中是否存在id值为27
48、的记录,如果存在则查询tbjow表中的记录,如果不存在则不执行外层善询,查询语句如下:select*from tb_row where exists(select*from tb_book where id=27);查询结果如图5-38所示。tysql select*from tb_jrow where exists;i id i row i name i+-+-+-+;1 i 90!优秀i 2 I 80!良好!3!?0!一般;4;50;差;4 rows in set 图5-38使用EXIS TS关键字的子查询因为子查询tb_book表中存在id值为27的记录,即返回值为真,外层查询接收到真值
49、后,开始执彳丁o当EXIS TS关键与其他查询条件一起使用时,需要使用AND或者OR来连接表达式与EXIS TS关键字。【例5-30】查询如果tbjow表中存在name值为优秀的记录,则查询tb_book表中row字段大于.等于90的记录,查询语句而下:select id,books,row from tb_book where row=90 and exists(select*from tb_row where name=优秀);查询结果如图5-39所示。mysql select id,books,row from tb_book where row=90 and existsselect*
50、from b_row where name=优秀+-+-+-+!id i books!row!-!27!PHP典型模块;95:+-+-+1 row in set rwsql _图5-39使用EXIS TS关键字查询tb_book表中row字段大于等于90的记录说明:NOT EXIS TS与EXIS TS刚好相反,使用NOT EXIS TS关键字时,当返回的值是true时,外层查询语 句不执行查询;当返回值是false时,外层查询语句将执行查询。口 5.5.4带AN Y关键字的子查询ANY关键字表示满足其中任意一个条件。使用ANY关键字时,只要满足内层查询语句返回的结果 中的任意一个,就可以通过