• 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.根据多列分组

  • 相关阅读:
    检测Linux硬盘IO数据
    获取OrangePI板子CPU温度
    ASP.Net开发WebAPI跨域访问(CORS)的精简流程
    一些常用复合命令
    关于Linux的虚拟内存管理
    Linux中组 与 用户的管理
    linux加载与使用ko驱动
    7z命令行 极限压缩指令
    nodejs的POST请求
    案例:用ajax 方法 解析xml
  • 原文地址:https://www.cnblogs.com/CSharpLover/p/5193685.html
Copyright © 2020-2023  润新知