宝哥软件园

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

编辑:宝哥软件园 来源:互联网 时间:2021-08-03

类型:PPC|WM平台大小:322KB语言:中文评分:6.6标签:立即下载。高级查询技术主要涉及多表的链接查询技术、嵌入SELECT语句的子查询技术、多查询组合的联合技术。

1.连接查询

必须同时从两个或多个表中检索数据。链接是为了允许同时从两个或多个表中检索数据,并指定这些表中的一列或几列作为连接条件。在SQLServer中,可以使用两种形式的连接语法,一种是ANSI链接语法,这意味着连接条件出现在FROM子句中;另一种形式的SQLServer链接语法,其中连接条件出现在WHERE条件中。

1.ANSI链接

错误链接可以同时查询两个或多个表中的数据,生成的结果集包含多个表中的字段,因此需要使用偶数表共享的字段来连接多个表。

在联接操作过程中,SQL逐行比较指定的字段,然后将比较结果与满足条件的数据相结合,生成新的记录。

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

JOIN:指定要链接的表

开:指定这些表共享的字段

根据表的主键和外键指定联接条件。

ANSI链接语法如下:

选择表名。列名,表名。列名,…

FROM { table _ name[join _ type]joint able _ name onsearch _ conditions }

[搜索条件]

[join_type]可以是以下三个关键字的形式:

INNER (INNERJOIN):链接查询的结果集只包含满足条件的行。Inner JOIN是SQLServer的默认连接模式,inner join可以缩写为JOIN;

OUTER join:链接查询结果集不仅包含符合条件的行,还包含表的所有行。外连接有三种形式:左外连接、右连接和全外连接。

例如:参加过4号课程的学生信息示例,涉及学生表和选修课:SELECT学生表

FROM学生表在学生表上加入课程选择表。学号选课表。学生人数

其中课程选择表课程编号=4

2.SQLServer链接

对于多表连接,可以在FROM子句之后直接指定多个表,这在语义上意味着从这些表的笛卡尔乘积中检索数据,并且可以通过WHERE子句设置过滤条件。

SQLServer链接语法的形式如下:

选择表名。列名,表名。列名,…

FROM{table_name,table_name,…}

where table _ name . column _ name join _ operatortable _ name . column _ name

在此语法中,FROM子句列出了连接中使用的所有表名,WHERE子句指定了哪些行应该出现在结果集中,也就是说,WHERE子句设置了筛选条件。在WHERE子句中,链接运算符用在两个相连的列中。

例如,检索至少通过一门课程的学生的信息。

SELECTDISTINCT学生表*

来自学生表课程选择表

学生桌。学生人数=选课表。学生人数和课程选择表。分数=60

3.子查询

子查询是一系列SELECT语句。SELECT语句可以嵌套在许多其他语句中,如SELECT、INSERT、UPDATE、DELETE等。这些嵌套的SELECT语句称为子查询。子查询可以将一个复杂的查询分解成一系列逻辑步骤,这样就可以用一条语句来解决一个复杂的查询问题。当一个查询依赖于另一个查询的结果时,子查询很有用。

使用子查询时,您应该注意:

子查询应放在括号内

用子查询替换表达式只需要一个值或一系列值

子查询不能查询包含文本或图像数据类型的字段

子查询也可以包含在子查询中,嵌套可以多达32层

1.使用子查询作为派生表

子查询可用于生成派生表,以替换FROM子句中的表。派生表示FROM子句中子查询的特殊用法,它通过别名或用户定义的名称引用派生表。FROM子句中的子查询将返回一个结果集,由该结果集形成的表将由外部SELECT语句使用。

例如,内部查询生成带有子查询的派生表,外部查询使用内部查询的结果集。在功能上,派生表本身相当于一个完整的查询

SLECTA*

从学生表中选择学生证、姓名、年龄

其中class=' gz02计6'asa

2.使用子查询作为表达式

在T-SQL中,所有使用表达式的地方都可以被子查询替换。此时,子查询必须返回单个值或某个字段的值。子查询可以返回一系列值,而不是出现在WHERE子句中的in关键字的表达式。

例如,查询GZ02来统计7班学生的平均年龄以及每个学生的年龄与平均年龄之间的差异

从学生表中选择年龄作为平均年龄

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

年龄-(从学生表中选择)作为年龄差

3.相关子查询

相关的子查询可以用作动态表达式,其值根据外部查询的每一行而变化。查询处理器为外部查询的每条记录计算子查询值,一次一行,并且该子查询作为表达式计算,并且每次都返回到外部查询。相关子查询是动态执行的子查询和外部查询之间非常有效的联合。

当使用相关子查询时,内部子查询被重复执行,并且内部查询的齿数与外部查询中的记录数一样多。

比如查询选修过1号课且成绩在90分以上的学生的学号和姓名:

选择学生证名称

来自学生表

其中90=(选择分数

从课程选择表

学生桌。学生人数=选课表。学生人数和课程人数=1)

4.使用EXISTS和NOTEXISTS运算符

在相关的子查询中,可以使用EXISTS和NOTEXISTS运算符来判断一个值是否在一系列值中。当SQLServer使用EXISTS和NOTEXISTS运算符处理子查询时:

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

子查询根据查询指定的条件返回真或假

子查询不产生任何数据

例如,同时参加过1号和2号课程的学生信息:

选择学生证、姓名、班级

来自学生表

存在地点(从课程选择表中选择*

其中学生证=学生表。学生证和课程证=1)

ANDEXISTS(从课程选择表中选择*

其中学生证=学生表。学生证和课程证=2)

找到外部表“学生表”的第一行,根据其“学生号”值处理内部查询

将外层的“学号”与内层表“选课表”的“学号”进行对比,判断外层条件的真假。如果为真,则记录为符合条件的结果;否则,将不会输出。

依次处理外表“学生表”中的第2、3、4、2。线条

检索每门选修课几个学生的信息

从学生表中选择*

注意现有(从课程选择表中选择*

学生桌。学生人数=选课表。学生人数和分数60)

ANDEXISTS(从课程选择表中选择*

学生桌。学生id=课程选择表。学生id)

使用TOP限制结果集

当使用SELECT语句进行查询时,有时我们希望列出前几个结果,而不是所有的结果。例如,在比赛中,可能只选择得分最高的前三名,因此需要使用TOP关键字来选择输出结果

使用TOP的格式是:

选择查询列表中的[百分比]

其中:

n:是非负整数

TOPn:表示获取查询结果的前n行

TOPnpercent:指示获取查询结果的前n%行

附带:包含附带结果的手段

比如检索前5名学生的学号和总分;

选择5个学生人数,总和作为总分

从课程选择表

GROUPBY学生编号

DESC总得分

使用TOP时,请注意最好与ORDERBY子句一起使用,因为它是最先有意义的几个单词。但是,在使用WITHTIES时,必须使用ORDERBY子句

合并多个结果集

两个或多个查询的结果可以组合成一个结果集,这就是合并多个会话的含义。UNION可用于合并多个查询结果集。活动UNION的格式为:

SELECT语句1

联盟

SELECT语句2

联合[所有]

……

SELECT语句n

使用UNION时,应注意几点:

默认情况下,UNION运算符删除所有空缺。如果使用“全部”选项,则不会删除备用行:

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

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

如果UNION语句中有ORDERBY子句,则整个结果集都应该排序

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

例如,GZ02的6班和7班学生的查询结果被合并成一个结果集:

从学生表中选择*其中类=' gz02计数6 '

联盟

从学生表中选择*其中类=' gz02计数7 '

更多资讯
游戏推荐
更多+