zoukankan      html  css  js  c++  java
  • 笔记二 sql 基础知识

    一. 透视

    列转行,用case when 即可,也可用其提供的函数PIVOT

    ps: 逆透视,行转列,比较少用,不掌握

    二 ,更新数据

    UPDATE BL SET BL.StockID = IDS.stockID,BL.StockPlaceID = IDS.stockPlaceID ,IsInStorage = 1
    FROM W_SC$$BarcodeLabel BL
    INNER JOIN t_CombinationIDS IDS ON BL.uid = IDS.barcodeID

    避免插入乱码

    insert into Sys_User values(2,N'蝈蝈',N'唐宁街十号',N'奥巴马的上铺','2017-11-16 20:45:05.603')

    三 ,删除数据

    TRUNCATE --清楚记录,id 不会增加

    delete --不清除记录,id 会增加

    四  联接查询

    1.内连接:先笛卡尔积,然后根据指定的谓词对结果进行过滤

    select e.empid,e.firstname,e.lastname,o.orderid
    from hr.Employees as e
        join sales.Orders as o
        on e.empid=o.empid;

    2.外连接: left outer join和left join的区别 --后者是前者的简写,

    笛卡尔积 (m*n)→对结果过滤→添加外部行 

    通过例子来理解外联结:根据客户的客户ID和订单的客户ID来对Customers表和Orders表进行联接,并返回客户和他们的订单信息。该查询语句使用的联接类型是左外连接,所以查询结果也包括那些没有发出任何订单的客户;

    --LEFT OUTER JOIN
    select c.custid,c.companyname,o.orderid
    from sales.Customers as c
      left outer join sales.Orders as o
      on c.custid=o.custid;

      另外,需要注意的是在对外联结中非保留值得列值进行过滤时,不要再WHERE子句中指定错误的查询条件。

      例如,下面请求返回在2007年2月12日下过订单的客户,以及他们的订单。同时也返回在2007年2月12日没有下过订单的客户。这是一个典型的左外连接的案例,但是我们经常会犯这样的错误:

    select c.custid,c.companyname,o.orderid,o.orderdate
    from sales.Customers as c
        left outer join sales.Orders as o
        on c.custid=o.custid 
    where o.orderdate='20070212';

      执行结果如下:

          

      这是因为对于所有的外部行,因为它们在o.orderdate列上的取值都为NULL,所以WHERE子句中条件o.orderdate='20070212'的计算结果为UNKNOWN,因此WHERE子句会过滤掉所有的外部行。

      我们应该将这个条件搬到on后边:

    select c.custid,c.companyname,o.orderid,o.orderdate
    from sales.Customers as c
        left outer join sales.Orders as o
        on c.custid=o.custid 
            and o.orderdate='20070212';

      这下的执行结果如下:

          

    子查询

    (1)独立子查询:不依赖于它所属的外部查询

    select orderid
    from sales.Orders
    where empid in (select e.empid 
        from hr.Employees as e
        where e.lastname like N'D%');

    (2)高级子查询:使用于少量数据

      ① 如何表示前一个或后一个记录?逻辑等式:上一个->小于当前值的最大值;下一个->大于当前值的最小值;

    -- 上一个订单ID
    select orderid, orderdate, empid, custid,
    (
    select MAX(o2.orderid) 
    from sales.Orders as o2
    where o2.orderid<o1.orderid
    ) as prevorderid 
    from sales.Orders as o1;

      ② 如何实现连续聚合函数?在子查询中连续计算

    -- 连续聚合
    select orderyear, qty, 
    (select SUM(o2.qty) 
     from sales.OrderTotalsByYear as o2
     where o2.orderyear<=o1.orderyear) as runqty 
    from sales.OrderTotalsByYear as o1
    order by orderyear;

       执行结果如下图所示:

            

  • 相关阅读:
    泛型系列<9>:使用相应的泛型版本替换Hashtable
    泛型系列<2> 创建泛型类
    泛型系列<5>:链表的实现
    泛型系列<4>使用相应的泛型版本替换Stack和Queue
    泛型系列<8>:使用泛型创建只读集合
    Visual Studio统计有效代码行数
    C++11 现代C++风格的新元素(转)
    神秘海域:顶级工作室“顽皮狗”成长史(中)
    沸腾十五年TX
    为你解惑之WPF经典9问详解
  • 原文地址:https://www.cnblogs.com/haigui-zx/p/13958630.html
Copyright © 2011-2022 走看看