zoukankan      html  css  js  c++  java
  • SQL语句简介

    1、Top、Distinct

    Top 获取前几条数据,top一般都与order by连用

    获得年纪最小的5个学生  select top 5 * from A order by classesId

    获得年纪最大的10%的学生  select top 10 percent * from A order by classesId desc

    Distinct 去除重复数据

    select distinct sName from student

    select distinct sName,sAge from student

    DISTINCT是对查询出的整个结果集进行数据重复处理的,而不是针对某一个列。

    2、聚合函数

    SQL聚合函数:

    MAX(最大值)、MIN(最小值)、AVG (平均值)、SUM (和)、COUNT(数量:记录的条数。)

    聚合函数对null值不计算。

    如果一行的数据都是null,count(*)包含对空值行、重复行的统计。

    平均成绩select avg(english) from score

    男学生出生日期的最大值和最小值:select max(sBirthday),min(sBirthday) from student where sSex='男'

    3、带条件的查询

    Select …from…where …

    --查询没有及格的学生的学号

    --查询年龄在20-30岁之间的男学生

    Between…and …在之间

    --查询年龄在20-30岁之间的男学生

    --查询math成绩在80-90分之间的所有学生

    --建议:优先使用between … and …,而不是“列>=值1 and 列<=值2 ”,between … and …已做过优化处理,效率高。

    查询班级id为1,2,3的所有学生

    --select sName,sAge from student where sClassId=1 or sClassId=2 or sClassId=3

    --select sName,sAge from student where sClassId in (1,2,3)

    4、带条件的查询-模糊查询(都是针对字符串操作的)

    查询所有姓张的同学

    Select * from student where left(sName,1)=‘张‘ 看上去很美,如果改成查询名字中带亮的学生怎么做?

    换一种做法 like

    Select * from student where sName like ‘张%’ 会把所有姓张的都查询到,现在我想查询姓张并且名字是一个字的学生?

    Select * from student where sName like ‘%亮%’ _ 、 % 、 [] 、 ^

    ^只有MSSQL Server支持,其他DBMS用not like。

    %通配符多字符匹配的通配符,它匹配任意次数(零或多个)出现的任意字符

    _通配符单字符匹配,它匹配单个出现的字符

    [] 只匹配一个字符 并且这个字符必须是[]范围内的 [0-9] [a-z]

    not与like一起使用:not like ….

    要通配_、%、[、^这些字符怎么办?[_]、[%]、[ [ ]、^(不需要放到中括号里,因为^只有放到中括号中才认为是通配符)

    5、空值处理

    数据库中,一个列如果没有指定值,那么值就为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 )

    6、数据排序

    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 以后返回的数据集合叫“游标”。

    7、数据分组

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

    select 语句中可以使用group by 子句将行划分成较小的组,然后,使用聚组函数返回每一个组的汇总信息。//分组一般都和聚合函数连用。

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

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

    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

    8、Having语句

    对表中的数据分组后,会得到一个分组后的结果集,如何对该结果集在进行筛选?→ having

    查询班级人数超过三个人的班级。(见备注1)

    注意Having中不能使用未参与分组的列,Having不能替代where。作用不一样,Having是对组进行过滤。

    Having 是Group By的条件对分组后的数据进行筛选(与Where类似,都是筛选,只不过having是用来筛选分组后的组的。)

    在Where中不能使用聚合函数,必须使用Having,Having要位于Group By之后。

    Having的使用几乎是与where一样的,也可以用in。 Having count(*) in (5,8,10)

    9、SQL语句的执行顺序

    5>…Select 5-1>选择列,5-2>distinct,5-3>top

    1>…From 表

    2>…Where 条件

    3>…Group by 列

    4>…Having 筛选条件

    5>…Order by 列

    10、类型转换函数

    CAST ( expression AS data_type)

    CONVERT ( data_type, expression,[style])

    Select ‘您的班级编号’+ 1 错误这里+是数学运算符

    SELECT FIdNumber,

    CAST(RIGHT(sNo,3) AS INTEGER) as 后三位的整数形式,

    CAST(RIGHT(sNo,3) AS INTEGER)+1 as 后三位加1,

    CONVERT(INTEGER,RIGHT(sNo,3))/2 as 后三位除以2 FROM student

    对编号排序,但编号是字符串类型。1、2、11、3、21、36… 对日期的转换。

    转换成各种国家格式的日期。

    select convert(varchar(20),getdate(),104)

    Style的格式,查sql帮助。(输入convert函数查询)

    将日期转换为指定格式的字符串。日期→字符串

    11、联合结果集union(集合运算符)

    集合运算符是对两个集合操作的,两个集合必须具有相同的列数,列具有相同的数据类型(至少能隐式转换的),最终输出的集合的列名由第一个集合的列名来确定。

    (可以用来连接多个结果) 联合(union)与连接(join)不一样

    简单的结果集联合(老师、学生):

    select tName,tSex from teacher union

    select sName,sSex from student

    基本的原则:每个结果集必须有相同的列数;每个结果集的列必须类型相容。

    select tName,tSex,-1 from teacher union

    select sName,sSex,sClassId from student

    联合:将多个结果集合并成一个结果集。

    union(去除重复,相当于默认应用了distinct)、union all 常见应用:底部汇总。

    12、Union all

    select tName,tSex from teacher union

    select sName,sSex from student

    UNION合并两个查询结果集,并且将其中完全重复的数据行合并为一条

    select tName,tSex from teacher union all

    select sName,sSex from student

    Union因为要进行重复值扫描,所以效率低,因此如果不是确定要合并重复行,那么就用UNION ALL

    12、字符串函数(*)

    LEN() :计算字符串长度(字符的个数。)

    datalength();//计算字符串所占用的字节数,不属于字符串函数。

    测试varchar变量与nvarchar变量存储字符串a的区别。

    见备注1. LOWER() 、UPPER () :转小写、大写

    LTRIM():字符串左侧的空格去掉

    RTRIM () :字符串右侧的空格去掉

    LTRIM(RTRIM(' bb '))

    LEFT()、RIGHT() 截取取字符串

    SELECT LEFT('abcdefg',2)

    SUBSTRING(string,start_position,length),索引从1开始。

    参数string为主字符串,start_position为子字符串在主字符串中的起始位置,length为子字符串的最大长度。

    SELECT SUBSTRING('abcdef111',2,3) 尝试使用SQLServer的帮助。

    13、日期函数

    GETDATE() :取得当前日期时间

    DATEADD (datepart , number, date ),计算增加以后的日期。

    参数date为待计算的日期;

    参数number为增量;

    参数datepart为计量单位,可选值见备注。

    DATEADD(DAY, 3,date)为计算日期date的3天后的日期,而DATEADD(MONTH ,-8,date)为计算日期date的8个月之前的日期 。

    (入职一年以上的员工发1000$)

    DATEDIFF ( datepart , startdate , enddate ) :计算两个日期之间的差额。 datepart 为计量单位,可取值参考DateAdd。

    统计不同入学年数的学生个数: select DateDiff(year,sInDate,getdate()),count(*) from student Group by DateDiff(year,sInDate,getdate())

    DATEPART (datepart,date):返回一个日期的特定部分 Month()、year()、day()来代替。

    统计学生的生日年份个数: select DatePart(year,sBirthday),count(*) from student group by DatePart(year, sBirthday) 1990年出生的人的个数?

  • 相关阅读:
    单链表的逆转
    树的子结构和树的深度
    升级版爬楼梯问题
    蛇形数组
    正则表达式匹配
    构建乘积数组
    N皇后问题
    IOS计算文字高度
    Block的copy时机
    转:CocoaPods pod install/pod update更新慢的问题
  • 原文地址:https://www.cnblogs.com/genesis/p/4935474.html
Copyright © 2011-2022 走看看