app教程网 学习教程 sql多表连接查询语句(sql多表关联查询)

sql多表连接查询语句(sql多表关联查询)

高级查询技术主要涉及多表联动查询技术、嵌入SELECT语句的子查询技术、组合多个查询的联合技术。

1.连接查询

需要同时从两个或多个表中检索数据。链接是允许同时从两个或多个表中检索数据,并指定这些表中的一列或几列作为连接条件。在SQLServer中,可以使用两种形式的连接语法。

一种是ANSI链接语法,即连接条件出现在FROM子句中;SQLServer链接语法的另一种形式,即连接条件出现在WHERE条件中。

1.ANSI链接

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

在连接操作期间,SQL逐行比较指定的字段,然后将比较结果与合格数据合并,以生成新记录。

JOIN:指定要链接的表。

开:指定这些表格共有的字段。

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

ANSI link的语法形式如下:

Select table name, column name, table name, column name, …

FROM{table_name[join_type]JOINtable_nameONsearch_conditions}

WHERE[search_conditions]

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

内部:链接查询的结果集只包含合格的行。INNERJOIN是SQLServer的默认连接模式,可以缩写为JOIN。

外部(外部连接):链接查询结果集不仅包括合格的行,还包括表中的所有行。外部联接有三种形式:左外部联接、右联接和全外部联接。

例如,选修了4号课程的学生的信息示例涉及学生列表和选修课:选择学生列表。

从学生表连接学生表上的选课表学号选课表学号

选课表课程号。=4

2.SQLServer链接

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

SQLServer链接语法如下:

Select table name, column name, table name, column name, …

From {table name, table name, …}

WHEREtable_name.column_namejoin_operatortable_name.column_name

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

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

Select a different student table *

从学生列表课程选择列表

学生桌在哪里。学号=选课表。学生证和选课表。分数=60。

3.子查询

子查询是一系列SELECT语句。SELECT语句可以嵌套在许多其他语句中,如SELECT、INSERT、UPDATE、DELETE等。这些嵌套的SELECT语句称为子查询。

子查询可以将复杂的查询分解成一系列的逻辑步骤,这样复杂的查询问题就可以用一条语句解决。当一个查询依赖于另一个查询的结果时,子查询非常有用。

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

子查询应该用括号括起来。

只需要一个值或一系列值,并且可以使用子查询来代替表达式。

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

子查询还可以包含子查询,最多有32层嵌套。

1.将子查询用作派生表。

您可以使用子查询来生成派生表,以替换FROM子句中的表。派生表示子查询在FROM子句中的一种特殊用法,它使用别名或用户定义的名称来引用这个派生表。FROM子句中的子查询将返回一个结果集。

外部SELECT语句将使用由此结果集形成的表。

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

SLECTA*

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

Where is the class='GZ02 6'asa

2.将子查询用作表达式

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

比如查询GZ02,计算7班学生的平均年龄以及每个学生的年龄与平均年龄的差值。

从学生表中选择avg(年龄)作为平均年龄。

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

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

3.相关子查询

相关的子查询可以用作动态表达式,该表达式的值随着外部查询的每一行而变化。查询处理器为外部查询的每条记录计算子查询的值,一次一行,并且该子查询每次都作为表达式计算并返回给外部查询。

相关子查询是动态执行的子查询和外层查询之间非常有效的组合。

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

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

SELECT学号姓名

FROM学生表

WHERE90=(SELECT成绩

FROM选课表

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

4.使用EXISTS和NOTEXISTS操作符

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

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

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

子查询不产生任何数据

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

SELECT学号,姓名,班级

FROM学生表

WHEREEXISTS(SELECT*FROM选课表

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

ANDEXISTS(SELECT*FROM选课表

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

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

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

顺序处理外层表“学生表”中的第2、3、4、行

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

SELECT*FROM学生表WHERE

NOTEXISTS(SELECT*FROM选课表

nbsp

本文来自网络,不代表本站立场,转载请注明出处:https: