zoukankan      html  css  js  c++  java
  • MSSQLServer基础03(数据检索(查询))

    执行备注中的代码创建测试数据表。
    简单的数据检索 :SELECT * FROM Student
    只检索需要的列 :SELECT sName FROM Student 、ame FROM Student WHERE sSex=‘女’。
    还可以检索不与任何表关联的数据:select 1+1;select getdate();

    可以为列起别名


    Top、Distinct

    Top 获取前几条数据,top一般都与order by连用
    获得年纪最小的5个学生           Select top 5 sName,sAge from student
    获得年纪最大的10%的学生(percent)
    Distinct 去除重复数据
    select distinct sName from student
    select distinct sName,sAge from student
    DISTINCT是对查询出的整个结果集进行数据重复处理的,而不是针对某一个列。


    带条件的查询

    Select …from…where …

    查询没有及格的学生的学号                    select studentId from score where english < 60      
    查询年龄在20-30岁之间的男学生                    select sName,sAge,sSex from student where sAge >=20 and sAge <=30 and sSex ='男'

    Between…and …在之间

    查询年龄在20-30岁之间的男学生
    查询math成绩在80-90分之间的所有学生
    建议:使用between … and …。(闭区间)        select sName,sAge,sSex from student where sAge between 20 and 30 and sSex ='男'


    带条件的查询-模糊查询

    都是针对字符串操作的
    问题:查询所有姓张的同学
    _    、   %   、  []   、  ^
    ^只有MSSQL Server支持,其他DBMS用not like
    通配符 %多字符匹配的通配符,它匹配任意次数(零或多个)出现的任意字符
    通配符_ 单字符匹配,它匹配单个出现的字符
    [] 只匹配一个字符  并且这个字符必须是[]范围内的    [0-9]  [a-z]
    not与like一起使用:not like ….
    要通配_、%、[、^这些字符怎么办?[_]、[%]、[ [ ]、^(不需要放到中括号里,因为^只有放到中括号中才认为是通配符)


    空值处理

    数据库中,一个列如果没有指定值,那么值就为null,数据库中的null表示“不知道”,而不是表示没有。因此select null+1结果是null,因为“不知道”加1的结果还是“不知道”。
    select * from score where english = null ; 
    select * from score where english != null ;都没有任何返回结果,因为数据库也“不知道”。
    SQL中使用is null、is not null来进行空值判断: select * from score where english is null ; select * from score where english is not null ;
    函数ISNULL ( check_expression , replacement_value )


    数据排序

    ORDER BY子句位于SELECT语句的末尾,它允许指定按照一个列或者多个列进行排序,还可以指定排序方式是升序(从小到大排列,ASC)还是降序(从大到小排列,DESC)。 
    按照年龄升序排序所有学生信息的列表:SELECT * FROM  Student ORDER BY sAge ASC 
    按照英语成绩从大到小排序,如果英语成绩相同则按照数学成绩从大到小排序 :SELECT * FROM  Score ORDER BY english DESC,math DESC
    ORDER BY子句要放到WHERE子句之后 : SELECT * FROM  Score where english>=60 and math>=60 ORDER BY english DESC,math DESC
    Order by 语句一般要放到所有语句的后面,就是先让其他语句进行筛选,全部筛选完成后,最后排序一下。
    (表中数据是集合,集合是没有顺序的。Order by 返回的数据是有顺序的,故此我们把order by 以后返回的数据集合叫“游标”。)


    聚合函数

    SQL聚合函数:
    MAX(最大值)、MIN(最小值)、AVG (平均值)、SUM (和)、COUNT(数量:记录的条数。)
    聚合函数对null值不计算。
    如果一行的数据都是null,count(*)包含对空值行、重复行的统计。
    平均成绩select avg(english) from score
    男学生出生日期的最大值和最小值:select max(sBirthday),min(sBirthday) from student where sSex='男'

    类型转换:
    CAST ( expression AS data_type [ (length ) ]) 
    CONVERT ( data_type [ ( length ) ] , expression [ , style ] )


    数据分组

    在使用select查询的时候,有时需要对数据进行分组汇总(即:将现有的数据按照某列来汇总统计),这时就需要用到group by语句。

    1.请从学生表中查询出每个班的班级Id和班级人数:(见备注1)
    2 .请从学生表中查询出每个班的班级Id和班级中男同学的人数: (见备注2)

    备注1:
    select
    tSClassId as 班级Id,
    count(*) as 班级人数
    from TblStudent
    group by TSClassId
    备注2:
    select
    tSClassId as 班级Id,
    count(*) as 班级人数
    from TblStudent
    where tSGender='男'
    group by TSClassId

    GROUP BY子句必须放到WHERE语句的之后 ,Group By与Order By都是对筛选后的数据进行处理,而Where是用来筛选数据的。
    没有出现在GROUP BY子句中的列是不能放到SELECT语句后的列名列表中的 (聚合函数中除外)
    错误: select sClassId,count(sName),sAge from student group by sClassId
    正确: select sClassId,count(sName),avg(sAge) from student group by sClassId


    Having语句(对组的筛选,哪些组显示哪些组不显示)

    对表中的数据分组后,会得到一个分组后的结果集,如何对该结果集在进行筛选?→having
    查询班级人数超过三个人的班级。

    select
    tSClassId as 班级Id,
    count(*) as 班级人数
    from TblStudent
    group by TSClassId
    having count(*)>3

    在Where中不能使用聚合函数,必须使用Having,Having要位于Group By之后。
    Having的使用几乎是与where一样的,也可以用in。
    Having count(*) in (5,8,10)

    select sClassId,count(sName) from student where count(sName)>3 group by sClassId  (错误的)
    聚合函数不应出现在WHERE 子句中
    select sClassId,count(sName) from student group by sClassId having count(sName)>3

    Group by 前可以有where,是对筛选过后的数据进行分组
    select sClassId,count(sName) from student where sSex='男' group by sClassId 


    SQL语句的执行顺序

    5>…Select 5-1>选择列,5-2>distinct,7>top(应用top选项最后计算)
    1>…From 表 Join 表 on
    2>…Where 条件
    3>…Group by 列
    4>…Having 筛选条件 
    6>…Order by 列


    Group by 练习

    从MyOrders表中查询:
    1.热销售商品排名表,【即按照每种商品的总销售数量排序】。
    2.请统计销售总价超过3000元的商品名称和销售总价,并按销售总价降序排序。
    3.统计各个客户对"可口可乐"的喜爱度(既统计每个购买人对“可口可乐”的购买量)


    1.
    select 
    商品名称,
    销售总数量=sum(销售数量)
    from orders
    group by 商品名称
    order by 销售总数量desc


    2.

    select
    商品名称,
    销售总价=sum(销售单价*销售数量)
    from orders
    group by 商品名称
    having sum(销售单价*销售数量)>3000
    order by 销售总价desc





    3.
    select 

    sum(销售数量) as 销售总数量,
    购买人
    from orders
    where  商品名称='可口可乐'
    group by 购买人
    order by 销售总数量 desc


    group by
    1.简单分组
    2.分组后筛选
    3.分组后排序
    4.根据多列分组

  • 相关阅读:
    ArrayList用法
    MessageBox
    将文本文件导入Sql数据库
    在桌面和菜单中添加快捷方式
    泡沫排序
    Making use of localized variables in javascript.
    Remove double empty lines in Visual Studio 2012
    Using Operations Manager Connectors
    Clear SharePoint Designer cache
    Programmatically set navigation settings in SharePoint 2013
  • 原文地址:https://www.cnblogs.com/CSharpLover/p/5193685.html
Copyright © 2011-2022 走看看