
Select方法大集合(sql server).doc
9页关于select查询1. 输出表中的所有列 select * from 表名2. 输出表中的部分列 select 字段名表 from 表名3. 为结果集内的列指定列名 select {字段名1 [ as 列的别名] [,…n]} from 表名4. 消除取值重复的行,在select 后面紧跟 distinct 5. 限制返回的行数 select top 行数 列名表 from 表名6. 查询满足条件的元组 select * from 表名 where 查询条件1) 比较:列表达式1 比较运算符 [列]表达式22) 确定范围:列表达式 [NOT] Between 起始值 And 终止值select *from 学生where 出生日期 between '1980-05-01' and '1982-12-31'3) 确定集合:列表达式 [NOT] IN (列值1,列值2,……)select *from 班级where 系部代码 in('01','02')4) 字符匹配:列表达式 [NOT] Like ‘匹配串’ [escape<’换码字符’>] 匹配串中可以有:%、_、[…]、[^…] select *from 课程where 课程名 like 'Delphi/_6.0' escape'/'5) 涉及空值的查询:列表达式 IS [NOT] NULL6) 多重条件查询:使用AND、OR、NOT连接多个查询条件7. 对查询的结果排序:select * from 表名 [where 查询条件] ORDER BY <列名 [ASC|DESC]> [,…n]select 学号,成绩from 课程注册where 课程号='0001'order by 成绩 asc8. 对数据进行统计1) 使用集合函数:可以前带DISTINCT或ALL统计记录个数 COUNT(*)统计一列中值的个数 COUNT(列名)计算一列中值的总和 SUM(列名)计算一列中值的平均值 AVG(列名)计算一列中值的最大值 MAX(列名)计算一列中值的最小值 MIN(列名)2) 对结果进行分组操作:select * from 表名 [where 查询条件] GROUP BY 列名 [HAVING 筛选条件表达式]select 课程号,COUNT(*) AS 选课人数from 课程注册GROUP BY 课程号HAVING COUNT(*)>=33) 使用COMPUTE子句:可以对查询结果集中的所有记录进行汇总统计,并显示所有参加汇总记录的详细信息。
select * from 表名 [where 查询条件] ORDER BY 列名 COMPUTE 集和函数 [BY 列名]select *from 课程注册ORDER BY 学号COMPUTE SUM(成绩) BY 学号9. 用查询结果生成新表:select * into 新表名 from 表名 [where 查询条件]10. 合并结果集:相当于集合的并操作select 语句 {union select 语句} [,…n]11. 连接查询(在一个查询中涉及多个表)1) 交叉连接查询 交叉连接:又称非限制连接(广义笛卡尔积),它是将两个表不加约束地连接在一起,连接产生的结果集的纪录为两个表中记录的交叉乘积,结果集的列为两个表属性列的和交叉连接产生的结果集一般没有什么实际应用的意义,实际使用很少 语法格式:SELECT <列名表> FROM 表名1 CROSS JOIN 表名2 <列名表>中罗列的列名是结果集中出现的列名(取自表名1和表名2中的部分或全部)2) 等值与非等值连接查询连接查询中用来连接两个表的条件称为连接条件,连接条件的一般格式为;通常为主键[<表名1>.]<列名> <比较运算符> [<表名2>.]<列名>通常为外键<比较运算符>主要有:=,>,<,>=,<=,!=。
当比较运算符主要为=时,成为等值连接,其语法格式为:SELECT <列名表> FROM 表名1 [INNER] JOIN 表名2 ON [<表名1>.]<列名>=[<表名2>.]<列名>使用其它运算符的连接为非等值连接还可以有其他条件符号)SELECT *FROM 产品 INNER JOIN 产品销售 ON 产品.产品编号=产品销售.产品编号ALTER TABLE 产品ADD 产量 INTUPDATE 产品SET 产量=28WHERE 产品编号='0001'UPDATE 产品SET 产量=30WHERE 产品编号='0002'UPDATE 产品SET 产量=40WHERE 产品编号='0003'UPDATE 产品SET 产量=40WHERE 产品编号='0004'SELECT *FROM 产品SELECT *FROM 产品销售SELECT *FROM 产品 INNER JOIN 产品销售 ON 产品.产量>产品销售.销量SELECT *FROM 产品 INNER JOIN 产品销售 ON 产品.产量>产品销售.销量 AND 产品.产品编号=产品销售.产品编号或SELECT *FROM 产品 , 产品销售 where 产品.产量>产品销售.销量 AND 产品.产品编号=产品销售.产品编号3) 自身连接查询(目的是为了在一个表中查找具有相同列值的行)一个表与其自身进行的连接(也可以理解为一个表的两个副本之间的连接)。
在进行自身连接查询时,必须为表指定两个别名,且对所有列的引用均要用别名限定例:查找不同课程成绩相同的学生的学号、课程号和成绩select a.学号,a.课程号from 课程注册 as a join 课程注册 as bon a.学号=b.学号 and a.课程号!=b.课程号4) 外连接查询不仅将满足条件的记录列出,而且还可以将不满足条件的记录的基本信息列出外连接分为:左外连接:将左表作为主表,主表中所有记录分别与右表的每一条记录进行连接组合,结果集中除了满足条件的记录外,还有主表中不满足连接条件的记录并在右表的相应列上填充NULL值语法如下,SELECT 列名表 FROM 表名1 LEFT [OUTER] JOIN 表名2ON 表名1.列名=表名2.列名例:将“产品”表左外连接“产品销售”表SELECT *FROM 产品 LEFT OUTER JOIN 产品销售ON 产品.产品编号=产品销售.产品编号右外连接:将右表作为主表,主表中所有记录分别与左表的每一条记录进行连接组合,结果集中除了满足条件的记录外,还有主表中不满足连接条件的记录并在左表的相应列上填充NULL值语法如下,SELECT 列名表 FROM 表名1 RIGHT [OUTER] JOIN 表名2ON 表名1.列名=表名2.列名例:将“产品”表右外连接“产品销售”表SELECT *FROM 产品 RIGHT OUTER JOIN 产品销售ON 产品.产品编号=产品销售.产品编号全连接:讲左表所有记录分别与右表的每一条记录进行连接组合,结果集中除了满足连接条件的记录外,还有左、右表中不满足连接条件的记录并在左、右表的相应列上填充NULL值。
语法如下,SELECT 列名表 FROM 表名1 FULL [OUTER] JOIN 表名2ON 表名1.列名=表名2.列名例:用全连接的方法连接“产品”表与“产品销售”表SELECT *FROM 产品 FULL OUTER JOIN 产品销售ON 产品.产品编号=产品销售.产品编号5) 复合连接条件查询在ON连接表达式中可以有多个连接条件例如:查询成绩在75分以上的学生的学号、姓名,选修课的课程号、课程名、专业代码、成绩,任课教师的教师编号、姓名SELECT B.课程号,D.课程名,C.教师编号,C.姓名,A.学号,A.姓名,B.专业代码,B.专业学级,B.学期,B.成绩FROM 学生 AS A JOIN 课程注册 AS B ON A.学号=B.学号 AND B.成绩>75 JOIN 教师 AS C ON B.教师编号=C.教师编号 JOIN 课程 AS D ON B.课程号=D.课程号或SELECT 课程注册.课程号,课程.课程名,教师.教师编号,教师.姓名,学生.学号,学生.姓名,课程注册.专业代码,课程注册.专业学级,课程注册.学期,课程注册.成绩FROM 学生, 课程注册,教师,课程WHERE 学生.学号=课程注册.学号 AND 课程注册.成绩>75 AND 课程注册.教师编号=教师.教师编号 AND 课程注册.课程号=课程.课程号12. 子查询SELECT 语句可以嵌套在其他许多语句中,这些嵌套的SELECT语句就称为子查询,子查询的SELECT查询总是使用圆括号括起来,且不能包括COMPUTE或FOR BROWSE子句。
SQL Server对嵌套查询的求解方法是由里向外处理,即每个子查询在上一级查询处理之前求解,子查询的结果用于建立父查询的查询条件嵌套查询可以用多个简单的查询构造复杂的查询,但嵌套不能超过32层1) 带有IN运算符的子查询子查询的结果是一个结果集,父查询通过IN运算符将父查询中的一个表达式与子查询结果集中的每一个值进行比较,如果表达式的值与子查询结果集中的任何一个值相等,父查询中的“表达式 IN (子查询)”条件表达式返回TRUE,否则返回FALSENOT IN运算符与IN运算符结果相反SELECT 列名表FROM 表名WHERE 表达式 IN父查询 (SELECT 列名FROM 表名[WHERE 条件式]子查询 )例如:查询有产品销售记录的产品信息 查询选修了课程名为“大学语文”的学生学号和姓名SELECT 学号,姓名FROM 学生WHERE 学号 IN (SELECT 学号 FROM 课程注册 WHERE 课程号 IN (SELECT 课程号 FROM 课程 WHERE 课程名='大学语文' ) )2) 带有比较运算符的子查询父查询通过比较运算符将父查询中的一个表达式与子查询结果(单值)进行比较,如果比较运算的结果是TRUE,父查询中的“表达式 比较运算符(子查询)”条件表达式返回TRUE,否则返回FALSE。
例如:列出高于平均分的学生的信息SELECT *FROM 学生WHERE 学号 IN (SELECT 学号 FROM 课程注册 WHERE 成绩> (SELECT AVG(成绩) FROM 课程注册 ) )3) 带有ANY或ALL运算符的子查询子查询中返回单值是可以用比较运算符,当返回的是一个结果集时,可以使用ANY或ALL运算符(必须同时使用比较运算符)ANY或ALL与比较运算符一起使用的语义运 算 符语 义>ANY大于子查询结果中的某个值>ALL大于子查询结果中的所有值
