1、16.1 SELECT语句语句SELECT语句是SQL语言的核心,其基本语法格式如下:语法格式:语法格式:SELECT ALL|DISTINCT|DISTINCTROW 列名或表达式./*SELECT子句*/FROM 源表./*FROM子句*/WHERE 条件/*WHERE子句*/GROUP BY 列名|表达式|position ASC|DESC,.WITH ROLLUP /*GROUP BY子句*/HAVING 条件 /*HAVING 子句*/ORDER BY 列名|表达式|position ASC|DESC,./*ORDER BY子句*/LIMIT offset,row_count|row
2、_count OFFSET offset /*LIMIT子句*/数据库原理与应用(基于MySQL)26.1 SELECT语句语句说明:说明:(1)SELECT子句:用于指定要显示的列或表达式。(2)FROM子句:用于指定查询数据来源的表或视图,可以指定一个表,也可以指定多个表。(3)WHERE子句:用于指定选择行的条件。(4)GROUP BY子句:用于指定分组表达式。(5)HAVING 子句:用于指定满足分组的条件。(6)ORDER BY子句:用于指定行的升序或降序排序。(7)LIMIT子句:用于指定查询结果集包含的行数。数据库原理与应用(基于MySQL)36.2 投影查询投影查询投影查询用于
3、选择列,投影查询通过SELECT语句的SELECT子句来表示。语法格式:语法格式:SELECT ALL|DISTINCT|DISTINCTROW 列名或表达式.其中,如果没有指定这些选项ALL|DISTINCT|DISTINCTROW,则默认为ALL,即返回投影操作所有匹配行,包括可能存在的重复行。如果指定DISTINCT或DISTINCTROW,则清除结果集中重复行。DISTINCT与DISTINCTROW为同义词。1投影指定的列投影指定的列使用SELECT语句可选择表中的一个列或多个列,如果是多个列,各列名中间要用逗号分开。数据库原理与应用(基于MySQL)46.2 投影查询投影查询【例6
4、.1】查询student表中所有学生的学号、姓名和专业。mysql SELECT sno,sname,speciality -FROM student;查询结果:查询结果:+-+-+-+|sno|sname|speciality|+-+-+-+|191001|刘清泉|计算机|191002|张慧玲|计算机|191003|冯涛|计算机|196001|董明霞|通信|196002|李茜|通信|196004|周俊文|通信|+-+-+-+6 rows in set(0.00 sec)数据库原理与应用(基于MySQL)56.2 投影查询投影查询 2投影全部列投影全部列在SELECT子句指定列的位置上使用*号
5、时,则为查询表中所有列。【例6.2】查询student表中所有列。mysql SELECT*-FROM student;该语句与下面语句等价mysql SELECT sno,sname,ssex,sbirthday,speciality,tc -FROM student;查询结果:查询结果:+-+-+-+-+-+-+|sno|sname|ssex|sbirthday|speciality|tc|+-+-+-+-+-+-+|191001|刘清泉|男|1998-06-21|计算机|52|191002|张慧玲|女|1999-11-07|计算机|50|191003|冯涛|男|1999-08-12|计算
6、机|52|196001|董明霞|女|1999-05-02|通信|50|196002|李茜|女|1998-07-25|通信|48|196004|周俊文|男|1998-03-10|通信|52|+-+-+-+-+-+-+6 rows in set(0.00 sec)数据库原理与应用(基于MySQL)66.2 投影查询投影查询3修改查询结果的列标题修改查询结果的列标题为了改变查询结果中显示的列标题,可以在列名后使用AS。语法格式:语法格式:SELECT.列名 AS 列别名【例6.3】查询student表中所有学生的学生的sno、sname、speciality,并将结果中各列的标题分别修改为学号,姓名
7、,专业。mysql SELECT sno AS 学号,sname AS 姓名,speciality AS 专业 -FROM student;查询结果:查询结果:+-+-+-+|学号|姓名|专业|+-+-+-+|191001|刘清泉|计算机|191002|张慧玲|计算机|191003|冯涛|计算机|196001|董明霞|通信|196002|李茜|通信|196004|周俊文|通信|+-+-+-+6 rows in set(0.00 sec)数据库原理与应用(基于MySQL)76.2 投影查询投影查询4计算列值计算列值使用SELECT子句对列进行查询时,可以对数字类型的列进行计算,可以使用加()、减
8、()、乘(*)、除(/)等算术运送符,SELECT子句可使用表达式。语法格式语法格式:SELECT ,【例6.4】设student1表的表结构和样本数据与student表相同。且已创建和插入数据;在student1表中,列出学号、学分和增加4分后的学分。mysql SELECT sno AS 学号,tc AS 学分,tc+4 AS 增加4分后的学分 -FROM student1;数据库原理与应用(基于MySQL)86.2 投影查询投影查询查询结果:查询结果:+-+-+-+|学号|学分|增加4分后的学分|+-+-+-+|191001|52|56|191002|50|54|191003|52|56
9、|196001|50|54|196002|48|52|196004|52|56|+-+-+-+6 rows in set(0.07 sec)数据库原理与应用(基于MySQL)96.2 投影查询投影查询5去掉重复行去掉重复行去掉结果集中的重复行可使用DISTINCT关键字。语法格式:语法格式:SELECT DISTINCT ,【例6.5】查询student表中speciality列,消除结果中的重复行。mysql SELECT DISTINCT speciality -FROM student;+-+|speciality|+-+|计算机|通信|+-+2 rows in set(0.07 sec
10、)数据库原理与应用(基于MySQL)106.3 选择查询选择查询选择查询用于选择行,选择查询通过WHERE子句实现,WHERE子句通过条件表达式给出查询条件,该子句必须紧跟FROM子句之后。语法格式:语法格式:WHERE 条件条件=:逻辑运算符 =:表达式 =|=|!=表达式 /*比较运算*/|表达式 NOT LIKE表达式 ESCAPE escape_character /*LIKE运算符*/|表达式 NOT REGEXP|RLIKE 表达式 /*REGEXP运算符*/|表达式 NOT BETWEEN 表达式AND 表达式 /*指定范围*/|表达式IS NOT NULL /*是否空值判断*/
11、|表达式 NOT IN(subquery|表达式,n)/*IN子句*/|表达式=|=|!=ALL|SOME|ANY (subquery)/*比较子查询*/|EXIST(子查询)/*EXIST子查询*/数据库原理与应用(基于MySQL)116.3 选择查询选择查询说明:说明:(1)判定运算包括比较运算、模式匹配、指定范围、空值判断、子查询等。(2)判定运算的结果为TRUE、FALSE或UNKNOWN。(3)逻辑运算符包括.AND(与)、OR(或)、NOT(非),逻辑运算符的使用是有优先级的,三者之中,NOT优先级最高,AND次之,OR优先级最低。(4)条件表达式可以使用多个判定运算通过逻辑运算符
12、成复杂的查询条件。(5)字符串和日期必须用单引号括起来。1表达式比较表达式比较比较运算符用于比较两个表达式值,共有7个运算符:=(等于)、(小于)、(大于)、=(大于等于)、(不等于)、!=(不等于),其语法格式如下。语法格式:语法格式:=|=|!=数据库原理与应用(基于MySQL)126.3 选择查询选择查询【例6.6】查询student表中专业为计算机或性别为女的学生。mysql SELECT*-FROM student -WHERE speciality=计算机 or ssex=女;查询结果:查询结果:+-+-+-+-+-+-+|sno|sname|ssex|sbirthday|spec
13、iality|tc|+-+-+-+-+-+-+|191001|刘清泉|男|1998-06-21|计算机|52|191002|张慧玲|女|1999-11-07|计算机|50|191003|冯涛|男|1999-08-12|计算机|52|196001|董明霞|女|1999-05-02|通信|50|196002|李茜|女|1998-07-25|通信|48|+-+-+-+-+-+-+5 rows in set(0.05 sec)2指定范围指定范围 BETWEEN、NOT BETWEEN、IN是用于指定范围的三个关键字,用于查找字段值在(或不在)指定范围的行。数据库原理与应用(基于MySQL)136.3
14、选择查询选择查询当要查询的条件是某个值的范围时,可以使用BETWEEN关键字。BETWEEN关键字指出查询范围。语法格式:语法格式:NOT BETWEEN AND【例6.7】查询score表成绩为92、95的记录。mysql SELECT*-FROM score -WHERE grade in(92,95);查询结果:查询结果:+-+-+-+|sno|cno|grade|+-+-+-+|191001|1004|95|191001|1201|92|191001|8001|92|196004|1201|92|+-+-+-+4 rows in set(0.05 sec)数据库原理与应用(基于MySQ
15、L)146.3 选择查询选择查询【例6.8】查询student表中不在1998年出生的学生情况。mysql SELECT*-FROM student -WHERE sbirthday NOT BETWEEN 19980101 AND 19981231;查询结果:查询结果:+-+-+-+-+-+-+|sno|sname|ssex|sbirthday|speciality|tc|+-+-+-+-+-+-+|191002|张慧玲|女|1999-11-07|计算机|50|191003|冯涛|男|1999-08-12|计算机|52|196001|董明霞|女|1999-05-02|通信|50|+-+-+-
16、+-+-+-+3 rows in set(0.03 sec)数据库原理与应用(基于MySQL)156.3 选择查询选择查询3空值判断空值判断判定一个表达式的值是否为空值时,使用IS NULL关键字。语法格式:语法格式:IS NOT NULL【例6.9】查询已选课但未参加考试的学生情况。mysql SELECT*-FROM score -WHERE grade IS null;查询结果:查询结果:+-+-+-+|sno|cno|grade|+-+-+-+|196002|8001|NULL|+-+-+-+1 row in set(0.00 sec)数据库原理与应用(基于MySQL)166.3 选择
17、查询选择查询4使用使用LIKE关键字的字符串匹配查询关键字的字符串匹配查询关键字LIKE用于进行字符串匹配。语法格式:语法格式:NOT LIKE ESCAPE 在使用LIKE关键字时,可以含有通配符,通配符有以下两种:%:代表0或多个字符。_:代表一个字符。LIKE匹配中使用通配符的查询也称模糊查询。数据库原理与应用(基于MySQL)176.3 选择查询选择查询【例6.10】查询student表中姓董的学生情况。mysql SELECT*-FROM student -WHERE sname LIKE 董%;查询结果:查询结果:+-+-+-+-+-+-+|sno|sname|ssex|sbirt
18、hday|speciality|tc|+-+-+-+-+-+-+|196001|董明霞|女|1999-05-02|通信|50|+-+-+-+-+-+-+1 row in set(0.07 sec)5使用正则表达式进行查询使用正则表达式进行查询 在MySQL中,使用REGEXP关键字来匹配查询正则表达式。REGEXP是正则表达式(Regular Expression)的缩写,它的一个同义词是RLIKE。数据库原理与应用(基于MySQL)186.3 选择查询选择查询 数据库原理与应用(基于MySQL)选项说明例子匹配值示例匹配包含指定的字符串的文本 fafan,afa,faad 匹配 中的任何一个
19、字符abbay,big,app 匹配不在 中的任何一个字符 abcdesk,six,匹配文本的开始字符 bbed,bridge$匹配文本的结束字符 er$worker,teacher.匹配任何单个字符 b.tbit,better*匹配零个或多个*前面的字符 f*nfn,fan,begin+匹配+前面的字符1次或多次 ba+bay,bare,battlen匹配前面的字符串至少n次 b2bb,bbb,bbbbbb表6.1 正则表达式中常用的字符匹配选项语法格式:语法格式:match_表达式 NOT REGEXP|RLIKE match_表达式常用字符匹配选项如表6.1所示。196.3 选择查询选择
20、查询【例6.11】查询含有“系统”或“数字”的所有课程名称。mysql SELECT*-FROM course -WHERE cname REGEXP 系统|数字;查询结果:查询结果:+-+-+-+|cno|cname|credit|+-+-+-+|1004|数据库系统|4|1017|操作系统|3|4002|数字电路|3|+-+-+-+3 rows in set(0.19 sec)数据库原理与应用(基于MySQL)206.4 分组查询和统计计算分组查询和统计计算1聚合函数聚合函数聚合函数实现数据的统计计算,用于计算表中的数据,返回单个计算结果。聚合函数包括COUNT、SUM、AVG、MAX、M
21、IN等函数,下面分别介绍。(1)COUNT函数COUNT函数用于计算组中满足条件的行数或总行数。语法格式:语法格式:COUNT(ALL|DISTINCT|*)其中,ALL表示对所有值进行计算,ALL为默认值,DISTINCT指去掉重复值,COUNT函数用于计算时忽略NULL值。数据库原理与应用(基于MySQL)216.4 分组查询和统计计算分组查询和统计计算【例6.12】求学生的总人数。mysql SELECT COUNT(*)AS 总人数 -FROM student;该语句采用COUNT(*)计算总行数,总人数与总行数一致。查询结果:查询结果:+-+|总人数|+-+|6|+-+1 row i
22、n set(0.09 sec)数据库原理与应用(基于MySQL)226.4 分组查询和统计计算分组查询和统计计算【例6.13】查询通信专业学生的总人数。mysql SELECT COUNT(*)AS 总人数 -FROM student -WHERE speciality=通信;该语句采用COUNT(*)计算总人数,并用WHERE子句指定的条件进行限定为201836。查询结果:查询结果:+-+|总人数|+-+|3|+-+1 row in set(0.01 sec)(2)SUM和AVG函数SUM函数用于求出一组数据的总和,AVG函数用于求出一组数据的平均值,这两个函数只能针对数值类型的数据。数据库
23、原理与应用(基于MySQL)236.4 分组查询和统计计算分组查询和统计计算语法格式:语法格式:SUM/AVG(ALL|DISTINCT )其中,ALL表示对所有值进行计算,ALL为默认值,DISTINCT指去掉重复值,SUM/AVG函数用于计算时忽略NULL值。【例6.14】查询1201课程总分。mysql SELECT SUM(grade)AS 课程1201总分 -FROM score -WHERE cno=1201;该语句采用SUM()计算课程总分,并用WHERE子句指定的条件进行限定为1201课程。查询结果:查询结果:+-+|课程1201总分|+-+|515|+-+1 row in s
24、et(0.00 sec)数据库原理与应用(基于MySQL)246.4 分组查询和统计计算分组查询和统计计算(3)MAX和MIN函数MAX函数用于求出一组数据的最大值,MIN函数用于求出一组数据的最小值,这两个函数都可以适用于任意类型数据。语法格式:语法格式:MAX/MIN(ALL|DISTINCT )其中,ALL表示对所有值进行计算,ALL为默认值,DISTINCT指去掉重复值,MAX/MIN函数用于计算时忽略NULL值。【例6.15】查询8001课程的最高分、最低分、平均成绩。mysql SELECT MAX(grade)AS 课程8001最高分,MIN(grade)AS 课程8001最低分
25、,AVG(grade)AS 课程8001平均成绩 -FROM score -WHERE cno=8001;该语句采用MAX求最高分、MIN求最低分、AVG求平均成绩。数据库原理与应用(基于MySQL)256.4 分组查询和统计计算分组查询和统计计算查询结果:查询结果:+-+-+-+|课程8001最高分|课程8001最低分|课程8001平均成绩|+-+-+-+|94|84|89.0000|+-+-+-+1 row in set(0.14 sec)2GROUP BY子句子句GROUP BY子句用于指定需要分组的列。语法格式:语法格式:GROUP BY ALL ,n其中,分组表达式通常包含字段名,A
26、LL显示所有分组。数据库原理与应用(基于MySQL)266.4 分组查询和统计计算分组查询和统计计算【例6.16】查询各门课程的最高分、最低分、平均成绩。mysql SELECT cno AS 课程号,MAX(grade)AS 最高分,MIN(grade)AS 最低分,AVG(grade)AS 平均成绩 -FROM score -WHERE NOT grade IS null -GROUP BY cno;该语句采用MAX、MIN、AVG等聚合函数,并用GROUP BY子句对cno(课程号)进行分组。查询结果:查询结果:+-+-+-+-+|课程号|最高分|最低分|平均成绩|+-+-+-+-+|1
27、004|95|87|91.6667|1201|93|76|85.8333|8001|94|84|89.0000|4002|90|79|85.6667|+-+-+-+-+4 rows in set(0.05 sec)数据库原理与应用(基于MySQL)276.4 分组查询和统计计算分组查询和统计计算3HAVING子句子句HAVING子句用于对分组按指定条件进一步进行筛选,过滤出满足指定条件的分组。语法格式:语法格式:HAVING 其中,条件表达式为筛选条件,可以使用聚合函数。当WHERE子句、GROUP BY子句、HAVING子句、ORDER BY子句在一个SELECT语句中时,执行顺序如下:(1
28、)执行WHERE子句,在表中选择行。(2)执行GROUP BY子句,对选取行进行分组。(3)执行聚合函数。(4)执行HAVING子句,筛选满足条件的分组。(5)执行ORDER BY子句,进行排序。数据库原理与应用(基于MySQL)286.4 分组查询和统计计算分组查询和统计计算【例6.17】查询平均成绩在90分以上的学生的学号和平均成绩。mysql SELECT sno AS 学号,AVG(grade)AS 平均成绩 -FROM score -GROUP BY sno -HAVING AVG(grade)90;查询结果:查询结果:+-+-+|学号|平均成绩|+-+-+|191001|93.00
29、00|196004|91.3333|+-+-+2 rows in set(0.02 sec)数据库原理与应用(基于MySQL)注意:HAVING子句要放在GROUP BY子句的后面,ORDER BY子句放在HAVING子句后面。296.4 分组查询和统计计算分组查询和统计计算【例6.18】查询至少有5名学生选修且以8开头的课程号和平均分数。mysql SELECT cno AS 课程号,AVG(grade)AS 平均分数 -FROM score -WHERE cno LIKE 8%-GROUP BY cno -HAVING COUNT(*)5;查询结果:查询结果:+-+-+|课程号|平均分数|
30、+-+-+|8001|89.0000|+-+-+1 row in set(0.07 sec)数据库原理与应用(基于MySQL)306.5 排序查询和限制查询结果的数量排序查询和限制查询结果的数量1.排序查询排序查询ORDER BY子句用于对查询结果进行排序。语法格式:语法格式:ORDER BY ASC|DESC ,n 其中,排序表达式,可以是列名、表达式或一个正整数,ASC表示升序排列,它是系统默认排序方式,DESC表示降序排列。【例6.19】将计算机专业的学生按出生时间降序排序。mysql SELECT*-FROM student -WHERE speciality=计算机 -ORDER B
31、Y sbirthday DESC;查询结果:查询结果:+-+-+-+-+-+-+|sno|sname|ssex|sbirthday|speciality|tc|+-+-+-+-+-+-+|191002|张慧玲|女|1999-11-07|计算机|50|191003|冯涛|男|1999-08-12|计算机|52|191001|刘清泉|男|1998-06-21|计算机|52|+-+-+-+-+-+-+3 rows in set(0.00 sec)数据库原理与应用(基于MySQL)316.5 排序查询和限制查询结果的数量排序查询和限制查询结果的数量2.限制查询结果的数量限制查询结果的数量LIMIT子句
32、用于限制SELECT语句返回的行数。语法格式:语法格式:LIMIT offset,row_count|row_count OFFSET offset说明:说明:(1)offset:位置偏移量,指示从哪一行开始显示,第1行的位置偏移量是0,第2行的位置偏移量是1,以此类推,如果不指定位置偏移量,系统会从表中第1行开始显示。(2)row_count:返回的行数。(3)LIMIT子句有两种语法格式,例如,显示表中第2行到第4行,可写为:”LIMIT 1,3”,也可写为:”LIMIT 3 OFFSET 1”。数据库原理与应用(基于MySQL)326.5 排序查询和限制查询结果的数量排序查询和限制查询结
33、果的数量【例6.20】查询成绩表中成绩前3位学生的学号、课程号和成绩。mysql SELECT sno,cno,grade -FROM score -ORDER BY grade DESC -LIMIT 0,3;或mysql SELECT sno,cno,grade -FROM score -ORDER BY grade DESC -LIMIT 3 OFFSET 0;查询结果:查询结果:+-+-+-+|sno|cno|grade|+-+-+-+|191001|1004|95|196004|8001|94|191003|1201|93|+-+-+-+3 rows in set(0.00 sec)
34、数据库原理与应用(基于MySQL)336.6 连接查询连接查询6.6.1 交叉连接交叉连接交叉连接(CROSS JOIN)又称笛卡尔积,由第一个表的每一行与第二个表的每一行连接起来后形成的表。语法格式:语法格式:SELECT*FROM table1 CROSS JOIN table 2;或SELECT*FROM table 1,table 2;【例6.21】采用交叉连接查询教师和和讲课地点所有可能组合。mysql SELECT tname,location -FROM teacher CROSS JOIN lecture;或mysql SELECT tname,location -FROM t
35、eacher,lecture;该语句采用交叉连接。数据库原理与应用(基于MySQL)346.6 连接查询连接查询+-+-+|tname|location|+-+-+|何艺杰|2-311|何艺杰|6-215|何艺杰|1-106|何艺杰|6-104|孙浩然|2-311|孙浩然|6-215|孙浩然|1-106|孙浩然|6-104|刘颖|2-311|刘颖|6-215|刘颖|1-106|刘颖|6-104|李亚兰|2-311|李亚兰|6-215|李亚兰|1-106|李亚兰|6-104|袁万明|2-311|袁万明|6-215|袁万明|1-106|袁万明|6-104|+-+-+20 rows in set(0
36、.00 sec)数据库原理与应用(基于MySQL)356.6 连接查询连接查询6.6.2 内连接内连接在内连接(INNER JOIN)查询中,只有满足查询条件的记录才能出现在结果集中。内连接使用比较运算符进行表间某些字段值的比较操作,并将与连接条件相匹配的数据行组成新记录,以消除交叉连接中没有意义的数据行。内连接有两种连接方式:使用INNER JOIN的显示语法结构语法格式:语法格式:SELECT 目标列表达式1,目标列表达式2,.,目标列表达式n,FROM table1 INNOR JOIN table2 ON 连接条件WHERE 过滤条件 数据库原理与应用(基于MySQL)366.6 连接
37、查询连接查询 使用WHERE子句定义连接条件的隐示语法结构语法格式:语法格式:SELECT 目标列表达式1,目标列表达式2,.,目标列表达式n,FROM table1,table2 WHERE连接条件AND过滤条件说明:说明:(1)目标列表达式:需要检索的列的名称或别名。(2)table1,table2:进行内连接的表名。(3)连接条件:连接查询中用来连接两个表的条件,其格式为:其中,比较运算符有:、=、!=、。当 数据库原理与应用(基于MySQL)376.6 连接查询连接查询(4)在使用INNER JOIN的连接中,连接条件放在FROM子句的ON子句中,过滤条件放在WHERE子句中。(5)在
38、使用WHERE子句定义连接条件的连接中,连接条件和过滤条件都放在WHERE子句中。内连接是系统默认的,可省略INNER关键字。经常用到的内连接有等值连接与非等值连接、自然连接和自连接等,下面分别介绍。1.等值连接与非等值连接等值连接与非等值连接表之间通过比较运算符“=”连接起来,称为等值连接,而使用其它运算符为非等值连接。数据库原理与应用(基于MySQL)386.6 连接查询连接查询【例6.22】查询每个学生选修课程的情况。mysql SELECT student.*,score.*-FROM student,score -WHERE student.sno=score.sno;或mysql
39、SELECT student.*,score.*-FROM student INNER JOIN score ON student.sno=score.sno;该语句采用等值连接。查询结果:查询结果:+-+-+-+-+-+-+-+-+-+|sno|sname|ssex|sbirthday|speciality|tc|sno|cno|grade|+-+-+-+-+-+-+-+-+-+|191001|刘清泉|男|1998-06-21|计算机|52|191001|1004|95|191001|刘清泉|男|1998-06-21|计算机|52|191001|1201|92|191001|刘清泉|男|19
40、98-06-21|计算机|52|191001|8001|92|191002|张慧玲|女|1999-11-07|计算机|50|191002|1004|87|数据库原理与应用(基于MySQL)396.6 连接查询连接查询|191002|张慧玲|女|1999-11-07|计算机|50|191002|1201|78|191002|张慧玲|女|1999-11-07|计算机|50|191002|8001|88|191003|冯涛|男|1999-08-12|计算机|52|191003|1004|93|191003|冯涛|男|1999-08-12|计算机|52|191003|1201|93|191003|冯涛
41、|男|1999-08-12|计算机|52|191003|8001|84|196001|董明霞|女|1999-05-02|通信|50|196001|1201|84|196001|董明霞|女|1999-05-02|通信|50|196001|4002|90|196001|董明霞|女|1999-05-02|通信|50|196001|8001|87|196002|李茜|女|1998-07-25|通信|48|196002|1201|76|196002|李茜|女|1998-07-25|通信|48|196002|4002|79|196002|李茜|女|1998-07-25|通信|48|196002|8001|
42、NULL|196004|周俊文|男|1998-03-10|通信|52|196004|1201|92|196004|周俊文|男|1998-03-10|通信|52|196004|4002|88|196004|周俊文|男|1998-03-10|通信|52|196004|8001|94|+-+-+-+-+-+-+-+-+-+18 rows in set(0.00 sec)由于连接多个表存在公共列,为了区分是哪个表中的列,引入表名前缀指定连接列。例如,student.sno表示student表的sno列,score.sno表示score表的sno列。为了简化输入,SQL允许在查询中使用表的别名,可在FR
43、OM子句中为表定义别名,然后在查询中引用。数据库原理与应用(基于MySQL)406.6 连接查询连接查询【例6.23】查询选修了数据库系统课程且成绩在80分以上的学生情况。mysql SELECT a.sno,sname,cname,grade -FROM student a,score b,course c -WHERE a.sno=b.sno AND o=o AND cname=数据库系统 AND grade=80;或mysql SELECT a.sno,sname,cname,grade -FROM student a JOIN score b ON a.sno=b.sno JOIN c
44、ourse c ON o=o -WHERE cname=数据库系统 AND grade=80;该语句采用内连接,省略INNER关键字,使用了WHERE子句。查询结果:查询结果:+-+-+-+-+|sno|sname|cname|grade|+-+-+-+-+|191001|刘清泉|数据库系统|95|191002|张慧玲|数据库系统|87|191003|冯涛|数据库系统|93|+-+-+-+-+3 rows in set(0.11 sec)数据库原理与应用(基于MySQL)416.6 连接查询连接查询2.自然连接自然连接自然连接在FROM子句中使用关键字NATURAL JOIN,自然连接在目标列
45、中去除相同的字段名。【例6.24】对例6.22进行自然连接查询。mysql SELECT*-FROM student NATURAL JOIN score;该语句采用自然连接。查询结果查询结果:+-+-+-+-+-+-+-+-+|sno|sname|ssex|sbirthday|speciality|tc|cno|grade|+-+-+-+-+-+-+-+-+|191001|刘清泉|男|1998-06-21|计算机|52|1004|95|191001|刘清泉|男|1998-06-21|计算机|52|1201|92|191001|刘清泉|男|1998-06-21|计算机|52|8001|92|1
46、91002|张慧玲|女|1999-11-07|计算机|50|1004|87|191002|张慧玲|女|1999-11-07|计算机|50|1201|78|191002|张慧玲|女|1999-11-07|计算机|50|8001|88|191003|冯涛|男|1999-08-12|计算机|52|1004|93|数据库原理与应用(基于MySQL)426.6 连接查询连接查询|191003|冯涛|男|1999-08-12|计算机|52|1201|93|191003|冯涛|男|1999-08-12|计算机|52|8001|84|196001|董明霞|女|1999-05-02|通信|50|1201|84|
47、196001|董明霞|女|1999-05-02|通信|50|4002|90|196001|董明霞|女|1999-05-02|通信|50|8001|87|196002|李茜|女|1998-07-25|通信|48|1201|76|196002|李茜|女|1998-07-25|通信|48|4002|79|196002|李茜|女|1998-07-25|通信|48|8001|NULL|196004|周俊文|男|1998-03-10|通信|52|1201|92|196004|周俊文|男|1998-03-10|通信|52|4002|88|196004|周俊文|男|1998-03-10|通信|52|8001|
48、94|+-+-+-+-+-+-+-+-+18 rows in set(0.00 sec)3.自连接自连接将某个表与自身进行连接,称为自表连接或自身连接,简称自连接,使用自连接需要为表指定多个别名,且对所有查询字段的引用必须使用表别名限定。举例如下。数据库原理与应用(基于MySQL)436.6 连接查询连接查询【例6.25】查询选修了“1201”课程的成绩高于学号为“191002”的成绩的学生姓名。mysql SELECT o,a.sno,a.grade -FROM score a,score b -WHERE a.gradeb.grade AND o=1201 AND o=1201 AND b
49、.sno=191002 -ORDER BY a.grade DESC;或mysql SELECT o,a.sno,a.grade -FROM score a JOIN score b ON a.gradeb.grade -WHERE o=1201 AND o=1201 AND b.sno=191002 -ORDER BY a.grade DESC;该语句实现了自连接,使用自连接时为一个表指定了两个别名。查询结果查询结果:+-+-+-+|cno|sno|grade|+-+-+-+|1201|191003|93|1201|191001|92|1201|196004|92|1201|196001|8
50、4|+-+-+-+4 rows in set(0.00 sec)数据库原理与应用(基于MySQL)446.6 连接查询连接查询6.6.3 外连接外连接在内连接的结果表,只有满足连接条件的行才能作为结果输出。外连接的结果表不但包含满足连接条件的行,还包括相应表中的所有行。外连接有以下2种:左外连接(LEFT OUTER JOIN):结果表中除了包括满足连接条件的行外,还包括左表的所有行,当左表有记录而在右表中没有匹配记录时,右表对应列被设置为空值NULL。右外连接(RIGHT OUTER JOIN):结果表中除了包括满足连接条件的行外,还包括右表的所有行,当右表有记录而在左表中没有匹配记录时,左