SQL Server 应用开发(七)

 

第5章 数据查询(2)
5.1 模糊查询:
一、使用LIKE进行模糊查询
    1、查询学生表中姓“张”的学生信息
       SELECT * FROM Students WHERE SName LIKE '张%'

    2、查询不是八月份发行的A卡或C卡:即前二位是0,第三位不能是8,卡号中要存在A或C
       SELECT * FROM Card WHERE ID LIKE '00[^8]%[A,C]%'

二、使用BETWEEN在某个范围内进行查询
    1、选择分数在60到80之间的学员信息
       SELECT * FROM StuScore WHERE Score BETWEEN 60 AND 80

    2、查询不在1992年8月1日到1993年8月1日之间订购的图书列表
       SELECT * FROM Sales WHERE or_date NOT BETWEEN '1992-8-1' AND '1993-8-1'

三、使用IN在列举值内进行查询
    查询家庭住址在“北京,广州,上海”的学生姓名并按地址升序进行排序
    SELECT SName AS 学生姓名 FROM Students WHERE Saddress IN ('北京','广州','上海')

5.2 SQL SERVER 中的聚合函数:
一、SUM():求和
    这种查询只返回一条记录,因此,不能直接与可能返回多行的一起使用来进行查询在titles表中查询type为business的所有ytd_sales的总和
    SELECT SUM(ytd_sales) FROM titles WHERE type = 'business'

二、AVG():求平均
    在stuScore表中统计分数大于等于60分的所有学生的平均成绩
    SELECT AVG(Score) AS 平均成绩 FROM stuScore WHERE Score >= 60

三、MAX():求最大值,MIN():求最小值
    在stuScore表中统计分数大于等于60分的所有学生的平均成绩和最高分以及最低分
    SELECT AVG(Score) AS 平均成绩, MAX(Score) AS 最高分, MIN(Score) AS 最低分 FROM stuScore WHERE Score >= 60

五、COUNT():统计
    统计考试成绩及格的人数(记录条数)
    SELECT COUNT(*) FROM stuScore WHERE Score >= 60

5.3 分组查询
一、完整的SELECT查询语句结构
    SELECT <列名>
    FROM <表名>
    [WHERE <查询条件表达式>]
    [GROUP BY <分组字段>]
    [HAVING <过滤表达式>]
    [ORDER BY <排序字段> [ASC|DESC]]

二、出现在GROUP BY中的项目,必须出现在SELECT指定的项目中,或者出现在聚合函数中

三、相关示例:
(一)有“学生考试成绩表”信息如下,现在要查询每个学科(CourseID)的学生考试平均成绩
StudentIDCourseIDScoreScoreID
222671
42782
162563
234574
254895
274457
285678
296789
3066710
3168811

    先对全部记录按CourseID进行分组后,再对每组的成绩(即每门学科的成绩)进行求平均运算
    SELECT CourseID, AVG(Score) FROM Score GROUP BY CourseID

(二)有“学生考试成绩表”信息如下,前7条记录为第一次内部测试成绩,第8-14条是第二次内部测试成绩,第15-21条是第三次内部测试成绩,对于在前三次内部测试没有及格的学生,需要进行补考,第22-25条是补考成绩,现要查询补考学员最后的成绩(第一次成绩与补考成绩的平均值),想要得到查询结果,要经过二个步骤:
      步骤1:首先学员的编号、内部测试的编号不能存在重复,两项都重复的行的分数值要取平均值。因此,这是一个既按学员编号、又按内部测试编号进行分组的查询
      步骤2:然后要解决只显示“补考过的学员”的成绩问题,这时需要进行分组统计后的条件限制。限制条件为COUNT(Score)>1,也就是相同的学员编号列和内部测试成绩列,至少出现过两次。这时使用WHERE子句不能满足查询要求,因为WHERE子句只能对没有分组统计前的数据进行筛选,对分组后的条件筛选必须使用HAVING子句
StudentIDCourseIDScoreScoreID
161661
231562
251673
271454
281705
291716
301607
162758
232809
2529010
2728811
2827812
2925913
3028414
1637015
2336016
2536717
2736818
2838119
2937220
3035621
2316722
2718723
3036824
2928025

    SELECT StudentID AS 学员编号, CourseID AS 内部测试, AVG(Score) AS 内部测试平均成绩 FROM Score GROUP BY CourseID,StudentID HAVING COUNT(Score) > 1

(三)在按照部门分类的员工表中,要查询“有多个员工的工资不低于2000的部门编号”
    SELECT 部门编号, COUNT(*) FROM 员工信息表 WHERE 工资>=2000 GROUP BY 部门编号 HAVING COUNT(*) > 1

5.4 多表联查
一、内联查询:多用来查询多表内具体相同字段信息的记录
(一)使用WHERE进行内联查询:性能较差
    查询参加了考试的学员的学员信息,对于有共用字段的二个表,需要用.来引用不同表的同名字段
    SELECT Student.Sname, Score.CourseID, Score.Score FROM Students,Score WHERE Students.Scode = Score.StudentID

(二)使用INNER JOIN ON进行内联查询
    查询参加了考试的学员的学员信息
    SELECT S.Sname, C.CourseID, C.Score FROM Students AS S INNER JOIN Score AS C ON (S.Scode = C.StudentID)

二、外联查询:
(一)左外联查询:LEFT OUTER JOIN ON:查询结果包括左表全部信息     查询全部学员的考试成绩,包括参加考试的和没有参加考试的
    SELECT S.Sname, C.CouresID, C.Sore FROM Students AS S LEFT JOIN Score AS C ON S.Code = C.StudentID

(二)右外联查询:RIGHT OUTER JOIN ON:查询结果包括右表全部信息     在PUBS数据库中,在Titles和Publishers表之间的右向外联接将包括所有的出版商,在Titles表中没有书名的也被列出
    SELECT Titles.Title_id, Titles.Title, Publishers.Pub_name FROM Titles RIGHT JOIN Publishers ON Titles.Pub_id = Publishers.Pub.id

(三)完全外联查询:FULL OUTER JOIN ON:查询结果包括左右表内部信息

三、交叉联接查询:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值