您的位置:金沙游乐场85155 > 大数据库 > T-SQL:基础练习(杂)

T-SQL:基础练习(杂)

发布时间:2019-10-02 09:53编辑:大数据库浏览(84)

    1.返回 每月最后一天订单

    本内容是我学习tsql2008的阅读笔记

    SELECT orderid, orderdate, custid, empid
    FROM Sales.Orders
    WHERE orderdate = EOMONTH(orderdate);
    

    什么是关系模型?

     使用EMONTH 对输入的日期返回月末日期   类似动态条件

    若对列创建唯一约束,背后中的物理机制也是创建了一个唯一索引.

    DATEDIFF(month, '19991231', orderdate)  相差多少月  从19991231到 orderdate之间先查多少月

    SQL语句的逻辑解析顺序是FROM

    DATEADD(month, DATEDIFF(month, '19991231', orderdate), '19991231') 中间是加上的月数  最后一个从什么时间开始加

    WHERE

    SELECT orderid, orderdate, custid, empid
    FROM Sales.Orders
    WHERE orderdate = DATEADD(month, DATEDIFF(month, '19991231', orderdate), '19991231');
    

    GROUP BY

    两种写法  记住 可以用动态条件 区分记录

    HAVING

     

    SELECT

    1. 姓氏a上有相同的 

      SELECT empid, firstname, lastname FROM HR.Employees WHERE lastname LIKE '%a%a%';

    OVER

    金沙85155登入,3.对每个客户的订单日期排序

    DISTINCT

    SELECT custid, orderdate, orderid,
      ROW_NUMBER() OVER(PARTITION BY custid ORDER BY orderdate, orderid) AS rownum
    FROM Sales.Orders
    ORDER BY custid, rownum;
    

    TOP

    4.条件筛选case

    ORDER BY

    SELECT empid, firstname, lastname, titleofcourtesy,
      CASE titleofcourtesy
        WHEN 'Ms.'  THEN 'Female'
        WHEN 'Mrs.' THEN 'Female'
        WHEN 'Mr.'  THEN 'Male'
        ELSE             'Unknown'
      END AS gender
    FROM HR.Employees;
    
    SELECT empid, firstname, lastname, titleofcourtesy,
    CASE 
    WHEN titleofcourtesy IN('Ms.', 'Mrs.') THEN 'Female'
    WHEN titleofcourtesy = 'Mr.' THEN 'Male'
    ELSE 'Unknown'
    END AS gender
    FROM HR.Employees;
    

     如果SELECT语句中涉及到分组,则后面的select order having的操作对象将是分组。

    第一种 是指向搜索  固定的指向  第二种没有可以多字段条件

     所有聚合函数都会忽略NULL值,只有count(*)除外。

    5.在order by 加限制排序条件

    带有order by子句的查询被ANSI称之为游标。表表达式不能处理游标。

    SELECT custid, region
    FROM Sales.Customers
    ORDER BY
      CASE WHEN region IS NULL THEN 1 ELSE 0 END, region;
    

    TOP 是TSQL所特有的,用来限制返回的行数或百分比。

    两个条件 0,1 默认排序规则 通过int 对相应的条件进行排序

    开窗函数使用OVER子句提供窗口作为上下文,对窗口中的一组值进行操作,而不是使用GROUP BY 子句提供的上下文。这样可以同时返回基础行的列和聚合列。

    ROW_NUMBER() 函数用于为查询的结果集中的各行分配一个递增的序列号。其逻辑顺序通过OVER子句中的ORDER BY语句来进行指定。但即使ORDER By的列不唯一,则序列值也会增加,这样会造成返回的值不确定。

    RANK 和 DENSE_RANK为具有相同逻辑排序值的所有行生成相同的排名。

    RANK表示前面有多少行更低的排序值,而DENSE RANK表示前面有多少个不同的排序值。

     

    可以认为在同一SELECT子句中不同时指定DISTINCT和ROW NUMBER是一条最佳实践,

    因为DISTINCT在这种情况下不起任何作用。

     

    SELECT empid,firstname,lastname

    FROM HR.Employees

    WHERE lastname like N'D%';

    N表示National,用于表示字符串是Unicode数据类型(NCHAR或NVARCHAR).

     

    SQL中的三值逻辑,如果想返回region列不等于WA的所有行,如下:

    SELECT custid,country,region,city

    FROM Sales.Customers

    WHERE region<>N'WA'

    OR region IS NULL;

     

    SQL支持两种字符数据类型:普通字符和Unicode字符。

    普通字符使用一个字节来保存每个字符,所以限制这个列所支持的语言只能是英语。

     

    使用定长的字符串时,SQLSERVER会预先分配相应的空间,使其无法扩展,它更适合以写入为主的系统,但是这种类型的存储消耗不是最优的,读取的时候可能要付出更多的代价。

    变长字符的存储空间由实际数据量来决定,但是更新数据的时候可能会需要数据移动,超出当前页的范围,所以更新时的效率相对会低一些。

     

    SELECT PATINDEX('%[0-9]%','abcd123efgh');

    可以使用Replace来计算某字符在字符串中出现的次数,方法是先把它替换成空,然后比对前后的差值再除以要匹配的字符串的长度就可以了。

    SELECT STUFF('A2DEFG',2,1,'BC') 返回:ABCDEFG

     

    DateTimeoffset 有时区部分可以进行识别

    DateTime2 精度可控,而且支持的范围从0001开始到9999.

     

    将字符串文字转成日期类型时,如果没有指定时间,sqlserver则默认用午夜时间作为其时间值.

    在大多数情况下,在过滤条件中对列进行函数化处理,极有可能造成相应列上的索引无法使用,降低查询效率,解决方案是使用等值的范围查询.例如:

    本文由金沙游乐场85155发布于大数据库,转载请注明出处:T-SQL:基础练习(杂)

    关键词:

上一篇:没有了

下一篇:没有了