《第7章数据查询电子课件 MySQL数据库管理与应用.pptx》由会员分享,可在线阅读,更多相关《第7章数据查询电子课件 MySQL数据库管理与应用.pptx(73页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第7章数据查询电子课件 MySQL数据库管理与应用第7章 数据查询主要内容7.1 SELECT语句7.2 单表查询7.3 连接查询7.4 子查询7.5 查询的集合操作7.6 本章小结7.1 SELECT语句数据查询是指从数据库中获取所需的数据,是数据库中最常用也是最重要的操作。关系数据库管理系统使用SELECT语句从一个或多个表中查询数据。语法格式:SELECT ALL|DISTINCT select_expr,select_expr.FROM tbl_name,tbl_name,WHERE where_condition GROUP BY col_name|expr|position,.WI
2、TH ROLLUP HAVING having_condition ORDER BY col_name|expr|position ASC|DESC,.LIMIT offset,row_count|row_count OFFSET offset7.1 SELECT语句说明:SELECT子句:指定查询语句返回的列或表达式;FROM子句:指定查询数据的来源,可以是表、视图、查询结果;WHERE子句:限定选择行必须满足的一个或多个条件。where_condition是一个表达式,对于要选择的每一行,该表达式的计算结果为true。如果没有WHERE子句,将选择所有行;GROUP BY子句:指定用于分组
3、的列或表达式;HAVING子句:指定返回的分组结果必须满足的条件;ORDER BY子句:指定查询结果的排序方式;LIMIT子句:限定查询结果包含的行数。7.2 单表查询7.2.1 挑选列SELECT子句指示从表中检索哪些列,关键字SELECT后可以是*、字段列表、计算表达式。1查询表中指定列l在SELECT子句中指定要查看的一个或多个列的名称,如果查看多个列,列名之间用逗号分隔。l查询结果中列的显示顺序由SELECT子句指定,与表中的存储顺序无关。7.2 单表查询7.2.1 挑选列1查询表中指定列【例7.1】查询所有学生的学号、姓名和性别。在MySQL命令行客户端输入命令:USE jwglSE
4、LECT sno,sname,ssex FROM student;7.2 单表查询7.2.1 挑选列2查询表中所有的列lSELECT子句中使用*可以获取表中所有列的值,而不需要指明各列的名称,通常在用户不清楚表中各列名称时使用。l查询结果中各列按照创建表时列的顺序显示。【例7.2】查询所有学生的基本信息。在MySQL命令行客户端输入命令:SELECT*FROM student;7.2 单表查询7.2.1 挑选列3使用计算表达式l实际应用中用户所需要的结果需要对表中的列进行计算才能获得,这时可以在SELECT子句中使用各种运算符、函数对表中的列进行计算获取所需结果。【例7.4】查询所有学生的学号
5、、姓名和年龄。在MySQL命令行客户端输入命令:SELECT sno,sname,YEAR(SYSDATE()-YEAR(sbirthday)FROM student;7.2 单表查询7.2.1 挑选列4改变列标题l查询结果中显示的各列的标题就是创建时定义的列名或者SELECT子句中使用的计算表达式。l在SELECT子句中,可以给列或计算表达式指定别名作为查询结果中的显示标题。【例7.4】查询所有学生的学号、姓名和年龄,改变列标题。在MySQL命令行客户端输入命令:SELECT sno AS 学号,sname AS 姓名,YEAR(SYSDATE()-YEAR(sbirthday)AS 年龄F
6、ROM student;7.2 单表查询7.2.1 挑选列4改变列标题l注意:AS可以省略,但是建议在指定列别名时养成显式使用AS的习惯;不允许在WHERE子句中使用列别名,因为在执行WHERE子句时可能尚未确定列的值;别名可以在GROUP BY、ORDER BY或HAVING子句中使用。7.2 单表查询7.2.1 挑选列5消除重复行l查询数据有时会获得重复的数据,尤其是在挑选表中的部分列的时候。l可以在SELECT子句中使用DISTINCT从查询结果中删除重复的行,使查询结果更加简洁。【例7.5】查询所有学生所属的专业。在MySQL命令行客户端输入命令:SELECT DISTINCT mno
7、 FROM student;7.2 单表查询7.2.2 选择行WHERE子句用于过滤表中的数据,对FROM子句中指定的表中的行进行判断,只有满足WHERE子句中的筛选条件的行才会返回,不满足条件的行不会出现在查询结果中。l语法格式为:WHERE where_condition l其中,where_condition指定从表中选择行的筛选条件,是由比较运算符、范围比较运算符、IN运算符、字符串模式匹配运算符、空值判断运算符以及逻辑运算符构成的表达式,表达式的运算结果为逻辑值真或假。7.2 单表查询7.2.2 选择行1.比较运算符l比较运算符用于比较两个表达式的值,WHERE子句中常用的比较运算符
8、有=(等于)、(不等于)、!=(不等于)、(小于)、!(不小于)、(大于)、!(不大于)和=(大于等于)。【例7.6】查询所有男生的基本信息。在MySQL命令行客户端输入命令:SELECT*FROM student WHERE ssex=男;【例7.7】查询2001-1-1之后出生的学生。在MySQL命令行客户端输入命令:SELECT*FROM student WHERE sbirthday2003-1-1;7.2 单表查询7.2.2 选择行2.范围比较运算符l范围比较运算符BETWEENAND用于判断字段或表达式的值是否在BETWEEN和AND设定的范围内,该范围是一个连续的闭区间。如果表达
9、式的值在指定的范围内则返回该行,否则不返回。语法格式为:col_name|expr NOT BETWEEN value1 AND value2【例7.8】查询年龄在18到20之间的学生的学号、姓名、性别和年龄。在MySQL命令行客户端输入命令:SELECT sno,sname,ssex,YEAR(SYSDATE()-YEAR(sbirthday)FROM student WHERE YEAR(SYSDATE()-YEAR(sbirthday)BETWEEN 18 AND 20;7.2 单表查询7.2.2 选择行3.IN运算符lIN运算符用于判断字段或表达式的值是否在指定的集合中,该集合是由逗号
10、分隔的一些离散值构成,不是连续的范围。如果表达式的值在指定的集合中则返回该行,否则不返回。语法格式为:col_name|expr NOT IN(value1,value2,)【例7.9】查询年龄为18或20的学生的学号、姓名、性别、年龄在MySQL命令行客户端输入命令:SELECT sno,sname,ssex,YEAR(SYSDATE()-YEAR(sbirthday)FROM student WHERE YEAR(SYSDATE()-YEAR(sbirthday)IN(18,20);7.2 单表查询7.2.2 选择行4.空值判断运算符lNULL表示“缺少的未知值”,它的处理方式与其他值有所
11、不同,不能使用诸如=、!=之类的比较运算符来测试空值,因为使用NULL进行任何比较的结果也是NULL。判断字段或表达式的值是否为空值使用IS NULL或IS NOT NULL,语法格式:col_name|expr IS NOT NULL【例7.10】查询未确定专业的学生。在MySQL命令行客户端输入命令:SELECT*FROM student WHERE mno IS NULL;7.2 单表查询7.2.2 选择行5.模式匹配运算符lLIKEu语法格式为:col_name|expr NOT LIKE pat_string ESCAPE escape_charu其中,pat_string是一个字符
12、串,可以包含普通字符和通配符。escape_char表示自己定义的转义字符。lMySQL中常用的通配符有:u%:匹配零个或多个任意字符构成的字符串;u_(下划线):匹配任意的单个字符。7.2 单表查询7.2.2 选择行5.模式匹配运算符【例7.11】查询学号以2021开头的学生。在MySQL命令行客户端输入命令:SELECT*FROM student WHERE sno LIKE 2021%;【例7.12】查询姓名的第二个字为明的学生。在MySQL命令行客户端输入命令:SELECT*FROM student WHERE sname LIKE _明%;7.2 单表查询7.2.2 选择行5.模式匹
13、配运算符【例7.13】查询姓名以_结尾的学生。在MySQL命令行客户端输入命令:SELECT*FROM student WHERE sname LIKE%_;或者:SELECT*FROM student WHERE sname LIKE%$_ ESCAPE$;说明:这里的$也可以是其它字符7.2 单表查询7.2.2 选择行5.模式匹配运算符lREGEXP或RLIKEuMySQL中可以使用 REGEXP 或RLIKE关键字指定正则表达式的字符匹配模式,实现复杂搜索的模式匹配。u语法格式为:col_name|expr NOT REGEXP|RLIKE pat_stringupat_string是一
14、个正则表达式,可以包含普通字符和特殊字符。7.2 单表查询7.2.2 选择行5.模式匹配运算符字符说明示例匹配值示例匹配文本的开始字符a 匹配以字母 a 开头 的字符串apple、ant、answer$匹配文本的结束字符gh$匹配以 gh 结尾的字 符串laugh、cough、heigh.匹配任何单个字符s.t 匹配任何 s 和 t 之间有一个字符sit、sat、set*匹配零个或多个在它前面的字符a*t 匹配字符 t 前面有任意个字符aat、aat、t+匹配前面的字符 1 次或多次fe+匹配以f开头,后面至少跟一个 efe、fee、feee匹配包含指定字符的文本ousoul、thought、
15、about字符集合匹配字符集合中的任何一个字符ab匹配 a 或者bfat、bit、bet、abs匹配不在括号中的任何字符abc 匹配任何不包含 a、b 或 c 的字符串duck、egg、fly字符串n,匹配前面的字符串至少 n 次a2 匹配 2 个或更多的aaa、aaaa、aaaaaaa字符串n,m匹配前面的字符串至少 n 次,至多m次a2,4 匹配最少2个,最多4个aaa、aaa、aaaa正则表达式的常用特殊字符7.2 单表查询7.2.2 选择行5.模式匹配运算符【例7.14】查询姓张或姓李的学生。在MySQL命令行客户端输入命令:SELECT*FROM student WHERE snam
16、e REGEXP 张李;【例7.15】查询姓名的第二个字为明的学生。在MySQL命令行客户端输入命令:SELECT*FROM student WHERE sname REGEXP.明;7.2 单表查询7.2.2 选择行6.逻辑运算符lWHERE子句中可以使用逻辑运算符将多个查询条件组合起来实现复杂的筛选条件。l常用的逻辑运算符有AND(与)、OR(或)和NOT(非),其中NOT的优先级最高,AND次之,OR的优先级最低。7.2 单表查询7.2.2 选择行6.逻辑运算符【例7.16】查询0101专业的男生的信息。在MySQL命令行客户端输入命令:SELECT*FROM student WHERE
17、 ssex=男 AND mno=0101;【例7.17】查询0101专业或0102专业的学生信息。在MySQL命令行客户端输入命令:SELECT*FROM student WHERE mno=0101 OR mno=0102;7.2 单表查询7.2.3 分组与统计1.聚合函数l聚合函数用于对一组数据进行计数或统计,获得一个计算结果。函数名语法格式功能描述COUNTCOUNT(*)返回SELECT语句检索到的行的个数COUNT(DISTINCT col_name|expression)返回SELECT语句检索到的行中指定列或表 达 式 的 非 空 值 的 个 数,如 果 使 用DISTINCT则
18、只对不重复的值计数SUMSUM(DISTINCT col_name|expression)返回SELECT语句检索到的行中指定列或表达式的值的和,忽略空值,如果使用DISTINCT则只对不重复的值求和AVGAVG(DISTINCT col_name|expression)返回SELECT语句检索到的行中指定列或表达式的值的平均值,忽略空值,如果使用DISTINCT则去除重复值后再求平均值MAXMAX(col_name|expression)返回SELECT语句检索到的行中指定列或表达式的最大值,忽略空值MINMIN(col_name|expression)返回SELECT语句检索到的行中指定列
19、或表达式的最小值,忽略空值常用聚合函数7.2 单表查询7.2.3 分组与统计1.聚合函数【例7.18】查询0101专业的学生个数。在MySQL命令行客户端输入命令:SELECT COUNT(*)FROM student WHERE mno=0101;7.2 单表查询7.2.3 分组与统计1.聚合函数【例7.19】查询student表中的学生的民族个数。在MySQL命令行客户端输入命令:SELECT COUNT(DISTINCT snation)FROM student;【例7.20】查询score表中学号为20190101001的学生所选课程的总分、平均分、最高分和最低分。在MySQL命令行客
20、户端输入命令:SELECT SUM(grade)AS 总分,AVG(grade)AS 平均分,MAX(grade)AS 最高分,MIN(grade)AS 最低分FROM scoreWHERE sno=20190101001;7.2 单表查询7.2.3 分组与统计2.GROUP BY子句l实际应用中有时需要将表中的数据或满足条件的数据按照某些字段的值进行分组,然后对每组中的数据分别进行统计,得到多个组的汇总结果。l可以利用GROUP BY子句创建分组数据,语法格式为:GROUP BY col_name|expr|position,.WITH ROLLUPlGROUP BY后的列或表达式称为分组列
21、或分组表达式,可以是一个也可以是多个。使用GROUP BY子句时,将分组列或分组表达式取值相同的行作为一组,对每组数据执行聚合函数,每组产生一行统计结果。7.2 单表查询7.2.3 分组与统计2.GROUP BY子句【例7.21】查询各专业的学生人数。在MySQL命令行客户端输入命令:SELECT mno,COUNT(*)AS 人数FROM studentGROUP BY mno;7.2 单表查询7.2.3 分组与统计2.GROUP BY子句【例7.22】查询各专业的男生和女生人数。在MySQL命令行客户端输入命令:SELECT mno,ssex,COUNT(*)AS 人数FROM stude
22、ntGROUP BY mno,ssex;7.2 单表查询7.2.3 分组与统计2.GROUP BY子句lGROUP BY子句中可以出现多个分组列或表达式,用逗号分隔,在所有分组列或表达式上取值相同的数据被认为是一组;l如果查询语句中使用了WHERE子句,先在表中筛选出满足WHERE子句中条件的记录,然后再将这些记录按照GROUP BY子句进行分组;lSQL-92及更早版本不允许SELECT列表、HAVING条件或ORDER BY列表出现不属于GROUP BY分组列或分组表达式的内容。7.2 单表查询7.2.3 分组与统计2.GROUP BY子句lSQL:1999及更高版本允许根据字段之间的函数
23、依赖关系决定此类查询是否合法,如果SELECT子句中的非分组列或表达式在功能上依赖于GROUP BY子句中的分组列,则查询是合法的。l例如下面的查询语句是合法的,因为mno列为主键,mname列依赖于mno列:SELECT major.mno,mname,COUNT(*)AS 人数FROM student,majorWHERE student.mno=major.mnoGROUP BY mno;7.2 单表查询7.2.3 分组与统计2.GROUP BY子句lMySQL中如果关闭了ONLY_FULL_GROUP_BY模式(MySQL 8.0的默认设置),则MySQL不执行SQL标准;MySQL中
24、如果开启ONLY_FULL_GROUP_BY模式,则MySQL执行SQL:1999标准。7.2 单表查询7.2.3 分组与统计2.GROUP BY子句lGROUPBY子句允许WITH ROLLUP关键字,该对分组统计结果进行更高级别的汇总从而产生额外的汇总结果。【例7.23】查询各专业的男生和女生人数,使用WITH ROLLUP关键字。在MySQL命令行客户端输入命令:SELECT mno,ssex,COUNT(*)AS 人数FROM studentGROUP BY mno,ssex WITH ROLLUP;7.2 单表查询7.2.3 分组与统计3.HAVING子句l利用GROUP BY子句和
25、聚合函数对记录进行分组和汇总之后,还可以利用HAVING子句对分组汇总之后的结果进行筛选l语法格式:HAVING having_conditionlHAVING子句与WHERE子句一样,指定筛选条件。WHERE子句指定对FROM子句中的表或视图中数据的筛选条件,HAVING子句指定对分组汇总数据筛选的条件,查询结果仅包括满足条件的组。7.2 单表查询7.2.3 分组与统计3.HAVING子句lSELECT语句中如果同时存在WHERE子句、GROUP BY子句和HAVING子句,执行顺序为先执行WHERE子句,再执行GROUP BY子句,然后执行HAVING子句。先用WHERE子句从数据源中筛选
26、出满足条件的记录,再用GROUP BY子句对筛选出的记录进行分组汇总,然后再根据HAVING子句的条件筛选出符合条件的组;lHAVING子句可以使用聚合函数,WHERE子句中不能使用聚合函数,因为执行WHERE子句时还没有分组没有执行聚合函数;7.2 单表查询7.2.3 分组与统计3.HAVING子句lSQL标准要求HAVING必须只引用GROUP BY子句中的列或聚合函数。但是,MySQL支持对该行为的扩展,并且允许引用SELECT子句中的列以及外部子查询中的列。l能出现在WHERE子句的条件应该在WHERE子句中使用,不应该使用HAVING;lHAVING子句中可以使用SELECT子句中的
27、列别名。7.2 单表查询7.2.3 分组与统计3.HAVING子句【例7.24】查询平均成绩高于85的学生学号和平均成绩。在MySQL命令行客户端输入命令:SELECT sno,AVG(grade)AS 平均成绩FROM scoreGROUP BY snoHAVING AVG(grade)85;或者:SELECT sno,AVG(grade)AS 平均成绩FROM scoreGROUP BY snoHAVING 平均成绩85;7.2 单表查询7.2.4 对查询结果排序ORDER BY子句可以对查询结果进行排序,使查询结果按照用户指定的顺序显示,其语法格式为:ORDER BY col_name|
28、expr|position ASC|DESC,.说明:lORDER BY子句指定对查询结果进行排序的依据,可以是列名、表达式、列的位置序号;l排序依据可以是一个也可以是多个,如果是多个,只有当待排序数据在第一列上的值相同时才会依据第二列排序,依次类推7.2 单表查询7.2.4 对查询结果排序说明:lASC|DESC指定排序的方式,ASC表示升序排序,为默认排序方式,DESC表示降序lORDER BY子句中可以使用SELECT子句中定义的别名,也可以使用SELECT子句中未出现的列或表达式作为排序依据。【例7.25】查询编号为101的课程的成绩信息,按照成绩从高到低排序。SELECT sno,g
29、rade FROM score WHERE cno=101 ORDER BY grade DESC;也可以是:SELECT sno,grade FROM score WHERE cno=101 ORDER BY 2 DESC;7.2 单表查询7.2.4 对查询结果排序【例7.26】查询各专业的学生人数,按照人数从低到高排序。在MySQL命令行客户端输入命令:SELECT mno,COUNT(*)AS 人数FROM studentGROUP BY mnoORDER BY COUNT(*);或者:SELECT mno,COUNT(*)AS 人数FROM studentGROUP BY mnoORD
30、ER BY人数;7.2 单表查询7.2.5 限制查询结果的数量LIMIT子句可用于限制SELECT语句返回的行数,其语法格式为:LIMIT offset,row_count或:LIMIT row_count OFFSET offset说明:loffset指定要返回的第一行的偏移量,初始行的偏移量为0(不是1),如果不指定偏移量,从第一行开始显示;lrow_count指定要返回的最大行数。7.2 单表查询7.2.5 限制查询结果的数量【例7.27】查询各专业的学生人数,返回人数最多的3个专业。在MySQL命令行客户端输入命令:SELECT mno,COUNT(*)AS 人数FROM studen
31、tGROUP BY mnoORDER BY COUNT(*)DESCLIMIT 3;或者:SELECT mno,COUNT(*)AS 人数FROM studentGROUP BY mnoORDER BY COUNT(*)DESCLIMIT 3 OFFSET 0;7.3 连接查询在查询数据时一个表往往不能提供想要的所有信息,需要从多个表中查询数据,这就需要进行多表连接查询。所谓的连接是指将多个“小表”中的数据按照给定的条件合并成一张“大表”。例如将major表和student表按照表中的记录在mno列的值相等(major.mno=student.mno)这个条件进行连接生成一个新的结果集。7.3
32、 连接查询student表major表 连接后产生的结果集7.3 连接查询7.3.1 交叉连接两个表的交叉连接的结果为两个表的笛卡儿积,即由第一个表的每一行与第二个表的每一行连接得到的结果集。结果集中的行数是两个表的行数的成绩,列数是两个表的列数的和。交叉连接的语法格式为:SELECT*FROM tbl_name1,tbl_name2,tbl_name3或者:SELECT*FROM tbl_name1 CROSS JOIN tbl_name2 CROSS JOIN tbl_name3交叉连接查询的结果中有大量无意义的数据,在实际应用中很少用到交叉连接查询,应该尽量避免。7.3 连接查询7.3.
33、2 内连接内连接是最常用的连接查询,通过设置连接条件限制两个表中相匹配(满足连接条件)的行,只有满足连接条件的记录才会出现在查询结果中。内连接查询的语法格式为:SELECT ALL|DISTINCT select_expr,select_expr.FROM tbl_name1,tbl_name2,tbl_name3WHERE join_condition AND where_conditon或者:SELECT ALL|DISTINCT select_expr,select_expr.FROM tbl_name1 INNER JOIN tbl_name2 ON join_condition IN
34、NER JOIN tbl_name3 ON join_conditionWHERE where_conditon7.3 连接查询7.3.2 内连接其中,join_condition表示连接条件,用于在两表之间匹配记录,通常由两个表的共同字段(或相关字段)和关系运算符组成。where_condtion为筛选条件,用于限制要在结果集中包括哪些行。7.3 连接查询7.3.2 内连接1.等值连接l等值连接的连接条件中使用的运算符为“=”,条件格式通常为“表1.列名=表2.列名”,查询结果只包含两个表中在指定字段上的值相等的行。【例7.28】查询每个学生和其所属的专业的详细信息。在MySQL命令行客户端
35、输入命令:SELECT*FROM student,majorWHERE student.mno=major.mno;或者:SELECT*FROM student INNER JOIN major ON student.mno=major.mno;7.3 连接查询7.3.2 内连接1.等值连接l需要注意的是,连接查询语句中如果用到两个表中的同名字段,必须使用“表名.列名”的方式进行限制。例如,查询每个学生的学号、姓名、性别、所属专业的编号、名称,因为major表和student表都有mno字段,SELECT子句中的mno字段如果不加表名限制,系统无法确定从哪个表中提取mno的值,就会出现“is
36、ambiguous”的错误。7.3 连接查询7.3.2 内连接2.非等值连接l非等值连接的连接条件中使用的运算符不是“=”,而是其他的关系运算符。实际应用中非等值连接使用的比较少。l示例:以查询学生的成绩等级为例说明非等值连接的使用创建一个grade_level表:CREATE TABLE grade_level(from_grade tinyint,to_grade tinyint,level ENUM(优秀,良好,中等,及格,不及格);7.3 连接查询7.3.2 内连接2.非等值连接l示例:以查询学生的成绩等级为例说明非等值连接的使用添加数据:INSERT INTO grade_level
37、VALUES(90,100,优秀),(80,89,良好),(70,79,中等),(60,69,及格),(0,59,不及格);7.3 连接查询7.3.2 内连接2.非等值连接l示例:以查询学生的成绩等级为例说明非等值连接的使用【例7.29】查询每个学生的学号、所选课程的编号、成绩和成绩等级。SELECT score.*,levelFROM score,grade_levelWHERE score.grade BETWEEN grade_level.from_grade AND grade_level.to_grade;或者:SELECT score.*,levelFROM score,grade
38、_levelON score.grade BETWEEN grade_level.from_grade AND grade_level.to_grade;7.3 连接查询7.3.2 内连接3.自然连接l自然连接是一种特殊的等值连接,不需要指定连接条件,由两个表中的同名字段自动进行等值比较。如果使用的是SELECT*,因为是同名字段的等值比较连接,所以结果集中的同名字段的值是完全一样的,自然连接在结果集中只包含一列同名字段和它的值。自然连接用NATURAL JOIN关键字实现。【例7.30】利用自然连接查询每个学生和其所属的专业的详细信息。在MySQL命令行客户端输入命令:SELECT*FROM
39、 student NATURAL JOIN major;7.3 连接查询7.3.2 内连接4.自连接l自连接是指一个表同其自身进行连接,即FROM子句中涉及的表为同一个表。【例7.31】查询和刘丽同一个专业的学生信息。在MySQL命令行客户端输入命令:SELECT t1.*FROM student t1,student t2WHERE t1.mno=t2.mno AND t1.sname刘丽 AND t2.sname=刘丽;7.3 连接查询7.3.2 内连接4.自连接l本例中参与连接的表物理上为同一个表student,逻辑上我们为其设置不同的别名t1和t2,作为两个表看待。l为表设置别名的方法
40、是在FROM子句中表名的后面加上“AS 别名”,AS可以省略。l除了在自连接中给表设置别名之外,其他的SELECT语句中如果需要都可以给表设置别名,比如表名比较复杂,为了简化语句提高可读性,就可以给表起别名。l需要注意的是,如果为表指定了别名,则SELECT语句中所有使用表名的地方都必须使用别名,不能再用原表名,否则就会提示出错。7.3 连接查询7.3.3 外连接内连接查询的结果中仅包含两个表中满足连接条件的行,一个表中的记录如果在另一个表中找不到相匹配的行就不会出现在查询结果中。有时候我们需要在查询结果中包含一个表中的所有记录,即使它在另一个表中没有相匹配的行,这时可以使用外连接查询。MyS
41、QL中外连接查询包括左外连接和右外连接。7.3 连接查询7.3.3 外连接左外连接的查询结果中包含两个表连接后满足连接条件行(内连接的查询结果)和FROM子句中指定的左表中不满足条件的行,即左表中的所有的行都会包含在查询结果中。如果左表中的某行记录在右表中没有相匹配的记录,查询结果中这些行在右表对应列的值为NULL。左外连接查询的语法格式为:SELECT ALL|DISTINCT select_expr,select_expr.FROM tbl_name1 LEFT OUTER JOIN tbl_name2 ON join_condition7.3 连接查询7.3.3 外连接右外连接的查询结果
42、中包含两个表连接后满足连接条件的行(内连接的查询结果)和FROM子句中指定的右表中不满足条件的行,即右表中的所有的行都会包含在查询结果中。如果右表中的某行记录在左表中没有相匹配的记录,查询结果中这些行在左表对应列的值为NULL。右外连接查询的语法格式为:SELECT ALL|DISTINCT select_expr,select_expr.FROM tbl_name1 RIGHT OUTER JOIN tbl_name2 ON join_condition7.3 连接查询7.3.3 外连接【例7.32】利用左外连接查询每个专业的信息和该专业的学生信息。在MySQL命令行客户端输入命令:SELE
43、CT*FROM major LEFT OUTER JOIN student ON major.mno=student.mno;7.4 子查询如果一个SELECT语句嵌套在另一个SQL语句(例如SELECT语句、INSERT语句、UPDATE语句、DELETE语句)中,则该SELECT语句称为子查询(也叫内层查询),包含子查询的SQL语句成为主查询(也叫外层查询)。子查询可以嵌套多层,即一个子查询中可以嵌套其他子查询,每层嵌套都需要用圆括号()括起来。嵌套查询的处理过程由内向外,每个子查询在其上级查询处理之前执行。通过嵌套查询可以用一系列简单查询构成复杂查询,从而增强SQL语句的查询能力。最常见
44、的子查询是在WHERE子句和HAVING子句中,与IN运算符、比较运算符或EXISTS一起构成筛选条件。7.4 子查询7.4.1 IN子查询IN子查询是指外层查询和子查询之间使用IN进行连接,判断某个列或表达式的值是否在子查询的结果中。IN子查询的一般语法格式为:WHERE col_name|expr NOT IN(SELECT)HAVING col_name|expr NOT IN(SELECT)【例7.33】查询选修了101课程的学生的学号和姓名。在MySQL命令行客户端输入命令:SELECT sno,snameFROM studentWHERE sno IN(SELECT sno FRO
45、M score where cno=101);7.4 子查询7.4.2 比较子查询可以使用比较运算符将外层查询和子查询进行连接,将某个列或表达式的值和子查询的结果进行比较。比较运算符包括=、!=、=、!、=、!。比较子查询的一般语法格式为:WHERE col_name|expr 比较运算符 ANY|SOME|ALL(SELECT)HAVING col_name|expr比较运算符 ANY|SOME|ALL(SELECT)7.4 子查询7.4.2 比较子查询【例7.34】查询和刘丽同一个专业的学生信息。在MySQL命令行客户端输入命令:SELECT*FROM studentWHERE mno=(
46、SELECT mno FROM student WHERE sname=刘丽)AND sname刘丽;7.4 子查询7.4.2 比较子查询如果子查询的返回结果多于一行,则必须使用关键字ANY、SOME或ALL,否则会提示“than”的错误。关键字ANY或SOME表示字段值或表达式的值和子查询结果中某一个值满足比较关系,结果就为真,比如:l=ANY表示等于子查询结果中的某一个,相当于INlANY表示大于子查询结果中的某一个,大于最小值即可lALL表示大于子查询结果中的所有值,相当于大于最大值lt.avggrade;7.5 查询的集合操作集合操作是指将两个或多个SELECT语句的查询结果合并到一起
47、,以完成复杂的查询任务。集合操作主要包括并集、交集和差集,MySQL目前仅支持并操作,由运算符UNION实现,语法格式为:SELECT.UNION ALL|DISTINCT SELECT.UNION ALL|DISTINCT SELECT.7.5 查询的集合操作默认情况下,MySQL将从联合结果中删除重复的行,与使用DISTINCT关键字具有相同的效果。使用ALL关键字,不会删除重复的行,结果包括所有SELECT语句中的所有匹配行。使用UNION操作的SELECT语句必须返回相同的列数,列的顺序必须一致,数据类型必须兼容,如果各SELECT语句中的列名不同,查询结果集中的列标题来自第一个SEL
48、ECT语句。7.5 查询的集合操作【例7.37】使用UNION操作实现全外连接。在MySQL命令行客户端输入命令:SELECT*FROM student LEFT OUTER JOIN major ON student.mno=major.mnoUNIONSELECT*FROM student RIGHT OUTER JOIN major ON student.mno=major.mno;7.6 本章小结SELECT语句是SQL语言中功能最强大、使用最频繁的语句之一,用于从数据库中查询符合条件的数据。本章主要介绍了MySQL中的数据查询操作,包括SELECT语句的语法、简单查询、分组统计、连接查询、子查询以及查询的集合操作。通过本章的学习,读者应该掌握SELECT语句的语法以及灵活应用SELECT语句实现具体的查询任务。