高级查询技术主要涉及多表联动查询技术、嵌入SELECT语句的子查询技术、组合多个查询的联合技术。
1.连接查询
需要同时从两个或多个表中检索数据。链接是允许同时从两个或多个表中检索数据,并指定这些表中的一列或几列作为连接条件。在SQLServer中,可以使用两种形式的连接语法。
一种是ANSI链接语法,即连接条件出现在FROM子句中;SQLServer链接语法的另一种形式,即连接条件出现在WHERE条件中。
1.ANSI链接
链接错误可以同时查询两个或多个表中的数据,生成的结果集包含多个表中的字段,因此需要使用链接表共同拥有的字段来连接多个表。
在连接操作期间,SQL逐行比较指定的字段,然后将比较结果与合格数据合并,以生成新记录。
有三种连接方式:内部连接、外部连接和交叉连接。在SELECT语句中,可以联接多个表;Link通过扩展SELECT语句的FROM语句添加了两个关键字:JOIN和ON。
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链接语法如下:
SELECTtable_name.column_name,table_name.column_name,……
FROM{table_name,table_name,……}
WHEREtable_name.column_namejoin_operatortable_name.column_name
在此种语法形式中,FROM子句列出了连接时所使用到的全部表名,WHERE子句指定哪些行应该出现在结果集中,即用WHERE子句设定过滤条件。在WHERE子句中,在两个连接的列中使用链接运算符。
例如:检索出至少已经有一门课程及格的同学的信息示例:
SELECTDISTINCT学生表*
FROM学生表选课表
WHERE学生表.学号=选课表.学号AND选课表.成绩=60
3.子查询
子查询是一系列SELECT语句。SELECT语句可以嵌套在其他许多语句中,例如SELECT、INSERT、UPDATE、DELETE等,这些嵌套的SELECT语句就称为子查询。
子查询可以把一个复杂的查询分解成一系列的逻辑步骤,这样就可以用一个单个的语句解决一个复杂的查询问题。当一个查询依赖于另一个查询的结果时,子查询会很有用。
使用子查询时,应注意:
子查询要用括号起来
只需要一个值或一系列的值,就可以用子查询代替一个表达式
子查询中不能查询包含数据类型是text或image的字段
子查询中也可以再包含子查询,嵌套可以多至32层
1.把子查询用作派生的表
可以用子查询产生一个派生的表,用于代替FROM子句中的表。派生表示FROM子句中子查询的一个特殊用法,用一个别名或用户自定义的名字来引用这个派生表。FROM子句中的子查询将返回一个结果集,
这个结果集所形成的表将被外层SELECT语句使用。
例如:内层查询用子查询产生了一个派生的表,外层查询将使用内层查询的结果集。在功能上,派生表本身就等同于一个完整的查询
SLECTA*
FROMselect学号,姓名,年龄from学生表
Where班级=‘GZ02计6’asa
2.把子查询用作表达式
在T-SQL中,所有使用表达式的地方,都可以用子查询来代替。此时子查询必须返回单个的值或某一个字段的值。子查询可以返回一系列的值来代替出现在WHERE子句中的IN关键字的表达式。
例如:查询GZ02计7班同学的平均年龄以及每个同学年龄与平均年龄的差
SELECTavg(年龄)FROM学生表as平均年龄
其计算结果作为选择列表中的一个输出列,并作为算术表达式的一部分输出:
年龄-(SELECTavg(年龄)FROM学生表)as年龄差
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