数据库

位置:IT落伍者 >> 数据库 >> 浏览文章

SQL多表链接查询、嵌入SELECT语句的子查询技术


发布日期:2022年12月08日
 
SQL多表链接查询、嵌入SELECT语句的子查询技术

高级查询技术主要是涉及多个表的链接查询技术嵌入SELECT语句的子查询技术把多个查询联合起来的联合技术等

连接查询

需要同时从两个或者连个以上的表中检索数据链接就是允许同时从两个表或者两个以上的表中检索数据指定这些表中的某个或者某些列作为连接条件在SQL Server中可以使用两种连接语法的形式一种是ANSI链接语法形式这是连接条件出现在FROM子句中;另外一种SQL Server链接语法形式这是连接条件出现在WHERE条件中

ANSI链接

链接错做可以同时查询两个或者多个表中的数据所生成的结果集包含多个表中的字段需要使用连个表中共同拥有的字段以连接多个表

进行连接操作时SQL一行一行地比较所指定的字段然后把比较后的结果和满足条件的数据合并并生成新的记录

有三种连接方式内连接外连接和交叉连接在一个SELECT语句中可以连接多个表;链接通过扩展SELECT语句的FROM字句增加了两个关键字JOIN和ON

JOIN指定要了链接的表

ON指定这些表共同拥有的字段

在表的主键和外部键的基础上指定连接条件

ANSI链接语法形式如下所示

SELECT table_namecolumn_name table_namecolumn_name……

FROM { table_name[ join_type] JOIN table_name ON search_conditions}

WHERE[ search_conditions]

其中[ join_type ]可以为如下三个关键字形式

INNER(内连接)链接查询结果集中仅包含满足条件的行内连接是SQL Server缺省的连接方式可以把INNER JOIN简写成 JOIN;

OUTER(外连接)链接查询结果集中既包含哪些满足条件的行还包含其中某个表的全部行有三种形式的外连接左外连接右外连接全外连接

例如已经选修了号课程的同学信息的示例该示例涉及到了学生表和选修课

SELECT 学生表

FROM 学生表 JOIN 选课表 ON 学生表学号 选课表学号

WHERE 选课表 课程号=

SQL Server链接

多表连接可以在FROM子句后直接指定多个表语义上表示从这几个表的笛卡尔积中检索数据可以用WHERE子句设定过滤条件

SQL Server链接语法形式如下

SELECT table_namecolumn_nametable_namecolumn_name……

FROM { table_nametable_name……}

WHERE table_namecolumn_name join_operator table_namecolumn_name

在此种语法形式中FROM子句列出了连接时所使用到的全部表名WHERE子句指定哪些行应该出现在结果集中即用WHERE子句设定过滤条件在WHERE子句中在两个连接的列中使用链接运算符

例如检索出至少已经有一门课程及格的同学的信息示例

SELECT DISTINCT 学生表 *

FROM 学生表 选课表

WHERE 学生表学号=选课表学号 AND 选课表成绩=

子查询

子查询是一系列SELECT语句SELECT语句可以嵌套在其他许多语句中例如SELECTINSERTUPDATEDELETE等这些嵌套的SELECT语句就称为子查询子查询可以把一个复杂的查询分解成一系列的逻辑步骤这样就可以用一个单个的语句解决一个复杂的查询问题当一个查询依赖于另一个查询的结果时子查询会很有用

使用子查询时应注意

子查询要用括号起来

只需要一个值或一系列的值就可以用子查询代替一个表达式

子查询中不能查询包含数据类型是text或image的字段

子查询中也可以再包含子查询嵌套可以多至

把子查询用作派生的表

可以用子查询产生一个派生的表用于代替FROM子句中的表派生表示FROM子句中子查询的一个特殊用法用一个别名或用户自定义的名字来引用这个派生表FROM子句中的子查询将返回一个结果集这个结果集所形成的表将被外层SELECT语句使用

例如内层查询用子查询产生了一个派生的表外层查询将使用内层查询的结果集在功能上派生表本身就等同于一个完整的查询

SLECT A *

FROM select 学号姓名年龄 from 学生表

Where 班级=‘GZ’ as a

把子查询用作表达式

在TSQL中所有使用表达式的地方都可以用子查询来代替此时子查询必须返回单个的值或某一个字段的值子查询可以返回一系列的值来代替出现在WHERE子句中的IN关键字的表达式

例如查询GZ班同学的平均年龄以及每个同学年龄与平均年龄的差

SELECT avg(年龄) FROM 学生表 as 平均年龄

其计算结果作为选择列表中的一个输出列并作为算术表达式的一部分输出

年龄(SELECT avg(年龄) FROM 学生表) as 年龄差

相关子查询

相关子查询可被用作动态表达式这个表达式的值相对于外层查询的每一行而变化查询处理器为外层查询的每一个记录计算子查询的值一次一行而这个子查询每次都会被作为一个表达式而被计算并返回给外层查询相关子查询是动态执行的子查询和外层查询间的一个非常有效的联合

使用相关子查询时内层子查询被反复执行外层查询有多少记录内层查询就被齿形多少次

例如查询已选修课程号的且成绩在分以上的同学的学号及姓名

SELECT 学号 姓名

FROM 学生表

WHERE <=( SELECT 成绩

FROM 选课表

WHERE 学生表学号=选课表学号 AND 课程号=)

使用EXISTS和NOT EXISTS操作符

在相关子查询中可以使用EXISTS和NOT EXISTS操作符判断某个值是否在一系列的值中SQL Server处理带有EXISTS和NOT EXISTS操作符的子查询时

外层查询测试子查询返回的记录是否存在

基于查询所指定的条件子查询返回TRUE或FALSE

子查询不产生任何数据

例如同时选修了号课程和号课程的同学的信息

SELECT 学号姓名班级

FROM 学生表

WHERE EXISTS(SELECT * FROM 选课表

WHERE 学号=学生表学号 AND 课程号=)

AND EXISTS(SELECT * FROM 选课表

WHERE 学号=学生表学号 AND 课程号=)

① 找外层表“学生表”的第根据其“学号”值处理内层查询

② 用外层的“学号”与内层表“选课表”的“学号”比较由此决定外层条件的真如果为真则此记录为符合条件的结果反之则不输出

③ 顺序处理外层表“学生表”中的第

检索出每一门选修课都几个的同学信息

SELECT * FROM 学生表 WHERE

NOT EXISTS( SELECT * FROM 选课表

WHERE 学生表学号=选课表学号 AND 成绩<)

AND EXISTS( SELECT * FROM 选课表

WHERE 学生表学号=选课表学号)

使用TOP限制结果集

在使用SELECT语句进行查询时有时我们希望列出前几个结果而不是全部结果例如竞赛时可能只取成绩最高的前三名这时就需要使用TOP关键字来选取输出的结果

使用TOP的格式为

SELECT TOP n[ percent] [with ties] 查询列表

其中

n为非负整数

TOP n表示取查询结果的前n行

TOP n percent表示取查询结果的前n%行

With ties表示包括并列的结果

例如检索出总分在前位的同学的学号及其总分

SELECT TOP WITH TIES 学号 SUM(成绩) AS 总分

FROM 选课表

GROUP BY 学号

ORDER BY 总分 DESC

使用TOP时注意最好与ORDER BY子句一起使用因为这样的前几名才有意义但当使用WITH TIES时要求必须使用ORDER BY子句

合并多个结果集

可以将两个或多个查询的结果组合为一个结果集这就是合并多个届国际的含义使用UNION可以实现合并多个查询结果集的目的作用UNION的格式为

SELECT 语句

UNION

SELECT 语句

UNION [ALL]

……

SELECT 语句n

使用UNION应注意几点

在默认情况下UNION运算符删除全部空余如果使用ALL选项那么空余行不删除

所有查询语句中的列数和列的顺序必须相同

所有查询语句中的对应列的数据类型必须兼容

如果在UNION语句中包含一个ORDER BY子句那么整个结果集都要排序

在结果集中列名来自第个SELECT子句

例如对GZ班和GZ班学生的查询结果合并为一个结果集

SELECT * FROM 学生表 WHERE 班级=‘GZ

UNION

SELECT * FROM 学生表 WHERE 班级=‘GZ

               

上一篇:使用SQL语句取随机数的方法

下一篇:sqlstp.log文件提示[未发现数据源]的解决办法