类型: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 '