2024年9月MySQL联合查询?SQL多表链接查询、嵌入SELECT语句的子查询技术
⑴MySQL联合查询?SQL多表链接查询、嵌入SELECT语句的子查询技术
⑵语法形式如下:SQL多表链接查询、嵌入SELECT语句的子查询技术高级查询技术主要是涉及多个表的链接查询技术嵌入SELECT语句的子查询技术把多个查询联合起来的联合技术等连接查询需要同时从两个或者连个以上的表中检索数据链接就是允许同时从两个表或者两个以上的表中检索数据指定这些表中的某个或者某些列作为连接条件在SQLServer中可以使用两种连接语法的形式一种是ANSI链接语法形式这是连接条件出现在FROM子句中;另外一种SQLServer链接语法形式这是连接条件出现在WHERE条件中ANSI链接链接错做可以同时查询两个或者多个表中的数据所生成的结果集包含多个表中的字段需要使用连个表***同拥有的字段以连接多个表进行连接操作时SQL一行一行地比较所指定的字段然后把比较后的结果和满足条件的数据合并并生成新的记录有三种连接方式内连接外连接和交叉连接在一个SELECT语句中可以连接多个表;链接通过扩展SELECT语句的FROM字句增加了两个关键字JOIN和ONJOIN指定要了链接的表ON指定这些表共同拥有的字段在表的主键和外部键的基础上指定连接条件ANSI链接语法形式如下所示SELECTtable_namecolumn_nametable_namecolumn_name……FROM{table_nameJOINtable_nameONsearch_conditions}WHERE其中可以为如下三个关键字形式INNER(内连接)链接查询结果集中仅包含满足条件的行内连接是SQLServer缺省的连接方式可以把INNERJOIN简写成JOIN;OUTER(外连接)链接查询结果集中既包含哪些满足条件的行还包含其中某个表的全部行有三种形式的外连接左外连接右外连接全外连接例如已经选修了号课程的同学信息的示例该示例涉及到了学生表和选修课SELECT学生表FROM学生表JOIN选课表ON学生表学号选课表学号WHERE选课表课程号=SQLServer链接多表连接可以在FROM子句后直接指定多个表语义上表示从这几个表的笛卡尔积中检索数据可以用WHERE子句设定过滤条件SQLServer链接语法形式如下SELECTtable_namecolumn_nametable_namecolumn_name……FROM{table_nametable_name……}WHEREtable_namecolumn_namejoin_operatortable_namecolumn_name在此种语法形式中FROM子句列出了连接时所使用到的全部表名WHERE子句指定哪些行应该出现在结果集中即用WHERE子句设定过滤条件在WHERE子句中在两个连接的列中使用链接运算符例如检索出至少已经有一门课程及格的同学的信息示例SELECTDISTINCT学生表*FROM学生表选课表WHERE学生表学号=选课表学号AND选课表成绩=子查询子查询是一系列SELECT语句SELECT语句可以嵌套在其他许多语句中例如SELECTINSERTUPDATEDELETE等这些嵌套的SELECT语句就称为子查询子查询可以把一个复杂的查询分解成一系列的逻辑步骤这样就可以用一个单个的语句解决一个复杂的查询问题当一个查询依赖于另一个查询的结果时子查询会很有用使用子查询时应注意子查询要用括号起来只需要一个值或一系列的值就可以用子查询代替一个表达式子查询中不能查询包含数据类型是text或image的字段子查询中也可以再包含子查询嵌套可以多至层把子查询用作派生的表可以用子查询产生一个派生的表用于代替FROM子句中的表派生表示FROM子句中子查询的一个特殊用法用一个别名或用户自定义的名字来引用这个派生表FROM子句中的子查询将返回一个结果集这个结果集所形成的表将被外层SELECT语句使用例如内层查询用子查询产生了一个派生的表外层查询将使用内层查询的结果集在功能上派生表本身就等同于一个完整的查询SLECTA*FROMselect学号姓名年龄from学生表Where班级=‘GZ计’asa把子查询用作表达式在TSQL中所有使用表达式的地方都可以用子查询来代替此时子查询必须返回单个的值或某一个字段的值子查询可以返回一系列的值来代替出现在WHERE子句中的IN关键字的表达式例如查询GZ计班同学的平均年龄以及每个同学年龄与平均年龄的差SELECTavg(年龄)FROM学生表as平均年龄其计算结果作为选择列表中的一个输出列并作为算术表达式的一部分输出年龄(SELECTavg(年龄)FROM学生表)as年龄差相关子查询相关子查询可被用作动态表达式这个表达式的值相对于外层查询的每一行而变化查询处理器为外层查询的每一个记录计算子查询的值一次一行而这个子查询每次都会被作为一个表达式而被计算并返回给外层查询相关子查询是动态执行的子查询和外层查询间的一个非常有效的联合使用相关子查询时内层子查询被反复执行外层查询有多少记录内层查询就被齿形多少次例如查询已选修课程号的且成绩在分以上的同学的学号及姓名SELECT学号姓名FROM学生表WHERE《=(SELECT成绩FROM选课表WHERE学生表学号=选课表学号AND课程号=)使用EXISTS和NOTEXISTS操作符在相关子查询中可以使用EXISTS和NOTEXISTS操作符判断某个值是否在一系列的值中SQLServer处理带有EXISTS和NOTEXISTS操作符的子查询时外层查询测试子查询返回的记录是否存在基于查询所指定的条件子查询返回TRUE或FALSE子查询不产生任何数据例如同时选修了号课程和号课程的同学的信息SELECT学号姓名班级FROM学生表WHEREEXISTS(SELECT*FROM选课表WHERE学号=学生表学号AND课程号=)ANDEXISTS(SELECT*FROM选课表WHERE学号=学生表学号AND课程号=)①找外层表“学生表”的第行根据其“学号”值处理内层查询②用外层的“学号”与内层表“选课表”的“学号”比较由此决定外层条件的真假如果为真则此记录为符合条件的结果反之则不输出③顺序处理外层表“学生表”中的第行检索出每一门选修课都几个的同学信息SELECT*FROM学生表WHERENOTEXISTS(SELECT*FROM选课表WHERE学生表学号=选课表学号AND成绩《)ANDEXISTS(SELECT*FROM选课表WHERE学生表学号=选课表学号)使用TOP限制结果集在使用SELECT语句进行查询时有时我们希望列出前几个结果而不是全部结果例如竞赛时可能只取成绩最高的前三名这时就需要使用TOP关键字来选取输出的结果使用TOP的格式为SELECTTOPn查询列表其中n为非负整数TOPn表示取查询结果的前n行TOPnpercent表示取查询结果的前n%行Withties表示包括并列的结果例如检索出总分在前位的同学的学号及其总分SELECTTOPWITHTIES学号SUM(成绩)AS总分FROM选课表GROUPBY学号ORDERBY总分DESC使用TOP时注意最好与ORDERBY子句一起使用因为这样的前几名才有意义但当使用WITHTIES时要求必须使用ORDERBY子句合并多个结果集可以将两个或多个查询的结果组合为一个结果集这就是合并多个届国际的含义使用UNION可以实现合并多个查询结果集的目的作用UNION的格式为SELECT语句UNIONSELECT语句UNION……SELECT语句n使用UNION应注意几点在默认情况下UNION运算符删除全部空余如果使用ALL选项那么空余行不删除所有查询语句中的列数和列的顺序必须相同所有查询语句中的对应列的数据类型必须兼容如果在UNION语句中包含一个ORDERBY子句那么整个结果集都要排序在结果集中列名来自第个SELECT子句例如对GZ计班和GZ计班学生的查询结果合并为一个结果集SELECT*FROM学生表WHERE班级=‘GZ计’UNIONlishixinzhi/Article/program/MySQL//,join常常被翻译成“联合查询“,join被翻译为“连接查询“,只是翻译问题,而联合查询则是纵向组合,大家注意一下,我们以书籍为准,和连接查询相比。
⑶联合查询的关键字是union,连接查询的关键字是join,而在MySQL手册中,join常常被翻译成“联合查询“,但绝大多数书籍和文章中,join被翻译为“连接查询“,我们以书籍为准,只是翻译问题,大家注意一下。和连接查询相比,连接查询是多个表的横向组合,而联合查询则是纵向组合。语法形式如下:
⑷SQL多表链接查询、嵌入SELECT语句的子查询技术
⑸高级查询技术主要是涉及多个表的链接查询技术嵌入SELECT语句的子查询技术把多个查询联合起来的联合技术等
⑹需要同时从两个或者连个以上的表中检索数据链接就是允许同时从两个表或者两个以上的表中检索数据指定这些表中的某个或者某些列作为连接条件在SQLServer中可以使用两种连接语法的形式一种是ANSI链接语法形式这是连接条件出现在FROM子句中;另外一种SQLServer链接语法形式这是连接条件出现在WHERE条件中
⑺链接错做可以同时查询两个或者多个表中的数据所生成的结果集包含多个表中的字段需要使用连个表***同拥有的字段以连接多个表
⑻进行连接操作时SQL一行一行地比较所指定的字段然后把比较后的结果和满足条件的数据合并并生成新的记录
⑼有三种连接方式内连接外连接和交叉连接在一个SELECT语句中可以连接多个表;链接通过扩展SELECT语句的FROM字句增加了两个关键字JOIN和ON
⑽JOIN指定要了链接的表
⑾ON指定这些表共同拥有的字段
⑿在表的主键和外部键的基础上指定连接条件
⒀ANSI链接语法形式如下所示
⒁SELECTtable_namecolumn_nametable_namecolumn_name……
⒂FROM{table_nameJOINtable_nameONsearch_conditions}
⒃其中可以为如下三个关键字形式
⒄INNER(内连接)链接查询结果集中仅包含满足条件的行内连接是SQLServer缺省的连接方式可以把INNERJOIN简写成JOIN;
⒅OUTER(外连接)链接查询结果集中既包含哪些满足条件的行还包含其中某个表的全部行有三种形式的外连接左外连接右外连接全外连接
⒆例如已经选修了号课程的同学信息的示例该示例涉及到了学生表和选修课
⒇FROM学生表JOIN选课表ON学生表学号选课表学号
⒈WHERE选课表课程号=
⒉SQLServer链接
⒊多表连接可以在FROM子句后直接指定多个表语义上表示从这几个表的笛卡尔积中检索数据可以用WHERE子句设定过滤条件
⒋SQLServer链接语法形式如下
⒌SELECTtable_namecolumn_nametable_namecolumn_name……
⒍FROM{table_nametable_name……}
⒎WHEREtable_namecolumn_namejoin_operatortable_namecolumn_name
⒏在此种语法形式中FROM子句列出了连接时所使用到的全部表名WHERE子句指定哪些行应该出现在结果集中即用WHERE子句设定过滤条件在WHERE子句中在两个连接的列中使用链接运算符
⒐例如检索出至少已经有一门课程及格的同学的信息示例
⒑SELECTDISTINCT学生表*
⒒FROM学生表选课表
⒓WHERE学生表学号=选课表学号AND选课表成绩=
⒔子查询是一系列SELECT语句SELECT语句可以嵌套在其他许多语句中例如SELECTINSERTUPDATEDELETE等这些嵌套的SELECT语句就称为子查询子查询可以把一个复杂的查询分解成一系列的逻辑步骤这样就可以用一个单个的语句解决一个复杂的查询问题当一个查询依赖于另一个查询的结果时子查询会很有用
⒕只需要一个值或一系列的值就可以用子查询代替一个表达式
⒖子查询中不能查询包含数据类型是text或image的字段
⒗子查询中也可以再包含子查询嵌套可以多至层
⒘把子查询用作派生的表
⒙可以用子查询产生一个派生的表用于代替FROM子句中的表派生表示FROM子句中子查询的一个特殊用法用一个别名或用户自定义的名字来引用这个派生表FROM子句中的子查询将返回一个结果集这个结果集所形成的表将被外层SELECT语句使用
⒚例如内层查询用子查询产生了一个派生的表外层查询将使用内层查询的结果集在功能上派生表本身就等同于一个完整的查询
⒛FROMselect学号姓名年龄from学生表
Where班级=‘GZ计’asa
在TSQL中所有使用表达式的地方都可以用子查询来代替此时子查询必须返回单个的值或某一个字段的值子查询可以返回一系列的值来代替出现在WHERE子句中的IN关键字的表达式
例如查询GZ计班同学的平均年龄以及每个同学年龄与平均年龄的差
SELECTavg(年龄)FROM学生表as平均年龄
其计算结果作为选择列表中的一个输出列并作为算术表达式的一部分输出
年龄(SELECTavg(年龄)FROM学生表)as年龄差
相关子查询可被用作动态表达式这个表达式的值相对于外层查询的每一行而变化查询处理器为外层查询的每一个记录计算子查询的值一次一行而这个子查询每次都会被作为一个表达式而被计算并返回给外层查询相关子查询是动态执行的子查询和外层查询间的一个非常有效的联合
使用相关子查询时内层子查询被反复执行外层查询有多少记录内层查询就被齿形多少次
例如查询已选修课程号的且成绩在分以上的同学的学号及姓名
SELECT学号姓名
WHERE《=(SELECT成绩
WHERE学生表学号=选课表学号AND课程号=)
使用EXISTS和NOTEXISTS操作符
在相关子查询中可以使用EXISTS和NOTEXISTS操作符判断某个值是否在一系列的值中SQLServer处理带有EXISTS和NOTEXISTS操作符的子查询时
外层查询测试子查询返回的记录是否存在
基于查询所指定的条件子查询返回TRUE或FALSE
子查询不产生任何数据
例如同时选修了号课程和号课程的同学的信息
SELECT学号姓名班级
WHEREEXISTS(SELECT*FROM选课表
WHERE学号=学生表学号AND课程号=)
ANDEXISTS(SELECT*FROM选课表
WHERE学号=学生表学号AND课程号=)
找外层表“学生表”的第行根据其“学号”值处理内层查询
用外层的“学号”与内层表“选课表”的“学号”比较由此决定外层条件的真假如果为真则此记录为符合条件的结果反之则不输出
顺序处理外层表“学生表”中的第行
检索出每一门选修课都几个的同学信息
SELECT*FROM学生表WHERE
NOTEXISTS(SELECT*FROM选课表
WHERE学生表学号=选课表学号AND成绩《)
ANDEXISTS(SELECT*FROM选课表
WHERE学生表学号=选课表学号)
使用TOP限制结果集
在使用SELECT语句进行查询时有时我们希望列出前几个结果而不是全部结果例如竞赛时可能只取成绩最高的前三名这时就需要使用TOP关键字来选取输出的结果
SELECTTOPn查询列表
TOPn表示取查询结果的前n行
TOPnpercent表示取查询结果的前n%行
Withties表示包括并列的结果
例如检索出总分在前位的同学的学号及其总分
SELECTTOPWITHTIES学号SUM(成绩)AS总分
ORDERBY总分DESC
使用TOP时注意最好与ORDERBY子句一起使用因为这样的前几名才有意义但当使用WITHTIES时要求必须使用ORDERBY子句
可以将两个或多个查询的结果组合为一个结果集这就是合并多个届国际的含义使用UNION可以实现合并多个查询结果集的目的作用UNION的格式为
使用UNION应注意几点
在默认情况下UNION运算符删除全部空余如果使用ALL选项那么空余行不删除
所有查询语句中的列数和列的顺序必须相同
所有查询语句中的对应列的数据类型必须兼容
如果在UNION语句中包含一个ORDERBY子句那么整个结果集都要排序
在结果集中列名来自第个SELECT子句
例如对GZ计班和GZ计班学生的查询结果合并为一个结果集
SELECT*FROM学生表WHERE班级=‘GZ计’
UNIONlishixinzhi/Article/program/MySQL//