zoukankan      html  css  js  c++  java
  • 学习Microsoft SQL Server 2008技术内幕:T-SQL语法基础

    第 2 章: 单表查询

    use TSQLFundamentals2008;
    
    select * from Sales.orders;
    
    select empid, year(orderdate) as orderyear, Count(*) as numorders
    from Sales.Orders
    where custid='71'
    group by empid, year(orderdate)
    having count(*) >1
    order by empid, orderyear;
    
    select empid, year(orderdate) as orderyear, Count(distinct custid) as custnum
    from Sales.Orders
    group by empid, year(orderdate)
    order by empid, orderyear;
    
    select * from HR.Employees;
    
    select distinct country as cty, *  from HR.Employees
    order by country;
    
    select distinct country from HR.Employees as e
    order by country;
    
    
    select count(*) from Sales.Orders
    
    select top(861) * from Sales.Orders
    
    select top(5) orderid, orderdate, custid, empid 
    from Sales.Orders
    order by orderdate desc
    
    select top(5) orderid, orderdate, custid, empid 
    from Sales.Orders
    order by orderdate desc, orderid desc
    
    
    select top(5) with ties orderid, orderdate, custid, empid 
    from Sales.Orders
    order by orderdate desc
    
    --2.1.8 OVER 子句
    select orderid, custid, val
    from Sales.OrderValues;
    
    select orderid, custid, val,
    sum(val) over() as totalvalue,
    sum(val) over(partition by custid) as custtotalvalue
    from Sales.OrderValues;
    
    select orderid, custid, val,
    100. * val /sum(val) over() as totalvaluePer,
    100. * val /sum(val) over(partition by custid) as custtotalvaluePer
    from Sales.OrderValues;
    
    select OV.orderid, OV.custid, ov.val,
     ROW_NUMBER() over(order by val, OV.orderid) as rownum,
     Rank() over(order by val) as rank,
     Dense_rank() over(order by val) as dense_rank,
     NTile(10) over(order by val) as ntile
    from Sales.OrderValues as OV
    order by val
    
    select OV.orderid, OV.custid, ov.val,
     --ROW_NUMBER() over(order by val, OV.orderid) as rownum,
     --Rank() over(order by val) as rank,
     --Dense_rank() over(order by val) as dense_rank,
     NTile(10) over(order by val) as ntile
    from Sales.OrderValues as OV
    order by val
    
    -----------------------------------------------------
    select ov.val,
      ROW_NUMBER() over(order by val) as rownum
    from sales.OrderValues as ov
    
    select distinct ov.val,
      ROW_NUMBER() over(order by val) as rownum
    from sales.OrderValues as ov
    
    select val
    from sales.OrderValues as ov
    group by val
    
    select ov.val,
      ROW_NUMBER() over(order by val) as rownum
    from sales.OrderValues as ov
    group by val
    
    -----------------------------------------------------
    
    -----------------------------------------------------
    --2.3 Case子句
    -----------------------------------------------------
    
    select P.productid, p.productname, categoryid,
        Case categoryid
        when 1 then 'Beverages'
        when 2 then 'Condimets'
        when 3 then 'Confe'
        when 4 then 'Beverages'
        when 5 then 'sdf'
        when 6 then 'asd'
        when 7 then 'ghh'
        else '不知道'
        end as Categoryname
    from Production.Products as P
    
    select orderid, custid,val,
       case
           when val<1000.00 then '< 100'
           when val between 1000.00 and 3000.00 then '1000-3000'
           when val > 3000.00 then '> 3000'
           else '不知道'
       end as valueCategory
    from sales.OrderValues;
    
    --2.4
    select *
    from Sales.Customers
    where region=N'WA'
    
    select *
    from Sales.Customers
    where region <> N'WA'
    
    select *
    from Sales.Customers
    where region <>N'WA' or region IS NULL
    
    --------------------------------------
    --2.5
    --2.6.2
    select * 
    from sys.fn_helpcollations()
    
    select Len('abcde')
    select Len(N'abcde')
    select dataLength('abcde')
    select dataLength(N'abcde')
    
    select Len('abcde ')
    select dataLength(N'abcde ')
    ---2.7.5
    select 
    GETDATE() as "GetDate",
    CURRENT_TIMESTAMP as "CURRENT_TIMESTAMP",
    SYSDATETIME() as "SYSDATETIME",
    SYSUTCDATETIME() as "SYSUTCDATETIME",
    SYSDATETIMEOFFSET() as "SYSDATETIMEOFFSET"
    
    select 
    Cast(CURRENT_TIMESTAMP as date) as "date",
    Cast(CURRENT_TIMESTAMP as time) as "time"
    
    select 
    CURRENT_TIMESTAMP as "CURRENT_TIMESTAMP",
    Cast(CURRENT_TIMESTAMP as date) as "date1",
    Cast(CURRENT_TIMESTAMP as char(100)) as "date2"
    
    select CONVERT(Char(8),CURRENT_TIMESTAMP, 112),
    Cast(CONVERT(Char(8),CURRENT_TIMESTAMP, 112) as datetime)
    
    select CONVERT(Char(12),CURRENT_TIMESTAMP, 114),
    Cast(CONVERT(Char(12),CURRENT_TIMESTAMP, 114) as datetime),
    Cast(CONVERT(Char(12),CURRENT_TIMESTAMP, 114) as datetime2)
    
    
    select 
    DATEADD(year, 1, '20160526'),
    DATEADD(year, 1, CURRENT_TIMESTAMP)
    
    select datediff(DAY,'20080212', '20090212')
    
    select 
    CURRENT_TIMESTAMP,
    Datediff(day,'20160501', CURRENT_TIMESTAMP),
    DATEadd(day, Datediff(day,'20160501', CURRENT_TIMESTAMP), '20160501')
    
    select 
    CURRENT_TIMESTAMP,
    Datediff(MONTH,'20160501', CURRENT_TIMESTAMP),
    DATEadd(MONTH, Datediff(MONTH,'20160501', CURRENT_TIMESTAMP), '20160501')
    
    select 
    CURRENT_TIMESTAMP,
    Datediff(MONTH,'20151231', CURRENT_TIMESTAMP),
    DATEadd(MONTH, Datediff(MONTH,'20151231', CURRENT_TIMESTAMP), '20151231')
    
    select 
    CURRENT_TIMESTAMP,
    Datediff(YEAR,'20150101', CURRENT_TIMESTAMP),
    DATEadd(YEAR, Datediff(YEAR,'20150101', CURRENT_TIMESTAMP), '20150101')
    
    select 
    CURRENT_TIMESTAMP,
    Datediff(YEAR,'19991231', CURRENT_TIMESTAMP),
    DATEadd(YEAR, Datediff(YEAR,'19991231', CURRENT_TIMESTAMP), '19991231')
    
    select year(current_timestamp)
    select year('20150527')
    
    select datepart(month,'20160212')
    select datepart(month,CURRENT_TIMESTAMP)
    
    select datename(month,CURRENT_TIMESTAMP)
    select datename(month,'20170202')
    
    select *
    from sys.tables;
    
    select SCHEMA_NAME(schema_id),name as tablename
    from sys.tables;
    
    select * from sys.columns
    select TYPE_NAME(system_type_id),
    * 
    from sys.columns where object_id = OBJECT_ID(N'Sales.Orders')
    
    --2.6
    exec sys.sp_help
    @objname=N'Sales.Orders'
    
    exec sys.sp_columns @table_name=N'Orders', @table_owner=N'Sales'
    
    --2.10
    --2.10.1
    select orderid, orderdate, custid, empid
    from Sales.Orders as o
    where o.orderdate > '20070531' and o.orderdate < '20070701'
    
    --2.10.2
    select orderid, orderdate, custid, empid
    from Sales.Orders as o
    where o.orderdate= dateadd(month,datediff(month,'19991231',o.orderdate),'19991231')
    
    --select DateDiff(MONTH,'19991231',current_timestamp);
    --select Dateadd(MONTH,DateDiff(MONTH,'19991231','20160602'),'19991231');
    select Dateadd(MONTH,DateDiff(MONTH,'19991231','20160102'),'19991231');
    
    select Dateadd(MONTH,DateDiff(MONTH,'19990101','20160502'),'19990101');
    select Dateadd(MONTH,DateDiff(MONTH,'19990101','20160602'),'19990101');
    
    select Dateadd(MONTH,DateDiff(MONTH,'19991231','20160502'),'19991231');
    select Dateadd(MONTH,DateDiff(MONTH,'19991231','20160605'),'19991231');
    select Dateadd(MONTH,DateDiff(MONTH,'19991231','20160205'),'19991231');
    
    --2.10.3
    select empid, firstname, lastname
    from hr.Employees as e
    where e.lastname like N'%a%a'
    
    ----2.10.4
    select * from 
    Sales.OrderDetails
    
    select orderid, Sum(od.unitprice * od.qty) as totalValue
    from Sales.OrderDetails as od
    group by od.orderid
    having Sum(od.unitprice * od.qty) > 10000
    order by totalValue Desc
    
    ----2.10.5
    select * from Sales.Orders
    
    select top(3) o.shipcountry,AVG(o.freight) as avgfreight
    from Sales.Orders as o
    where o.orderdate >= '20070101' and o.orderdate < '20080101'
    group by o.shipcountry
    order by AVG(o.freight) desc
    
    
    ----2.10.6
    select custid, orderdate, orderid, 
    ROW_NUMBER() over(partition by custid order by orderdate,orderid) as rownum
    from Sales.Orders
    
    ----2.10.7
    select * from HR.Employees
    
    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 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 ='Ms.' then 'Female'
         when titleofcourtesy ='Mrs.' then 'Female'
         when titleofcourtesy ='Mr' then 'Male'
         else 'Unknown'
     end as gender
     from HR.Employees
    
     select empid, firstname, lastname, titleofcourtesy,
     case 
         when titleofcourtesy Like'M%s.' then 'Female'
         when titleofcourtesy Like'Mr' then 'Male'
         else 'Unknown'
     end as gender
     from HR.Employees
    
     select * from Sales.Customers
    
     select custid, region
     from Sales.Customers
     order by case when region is Null then 1 else 0 end ,region
    
     select custid, region
     from Sales.Customers
     order by case when region is Null then 4 else 3 end ,region
    View Code

    第 3 章 :联接查询

    Use TSQLFundamentals2008;
    --3.1.1
    select * from Sales.Customers as C
    select * from HR.Employees as E
    select *
    from Sales.Customers as C
        cross join HR.Employees as E
    
    --3.1.2
    select * from Sales.Customers, HR.Employees;
    
    --3.1.3
    select E1.empid, E2.empid 
    from HR.Employees as E1 cross join HR.Employees as E2 
    
    select E1.empid, E2.empid 
    from HR.Employees as E1 cross join HR.Employees as E2 
    order by E1.empid
    
    select E1.empid, E2.empid 
    from HR.Employees as E1 cross join HR.Employees as E2 
    order by E1.empid,E2.empid
    
    --3.1.4
    use tempdb;
    if OBJECT_ID('dbo.Digits') is not null drop table dbo.Digits
    create table dbo.Digits(
        digit int not null primary key
    )
    insert into dbo.Digits(digit)
    values(0),(1),(2),(3),(4),(5),(6),(7),(8),(9)
    
    select D1.digit, D2.digit
    from dbo.Digits as D1
         cross join dbo.Digits as D2
    
    select D1.digit, D2.digit, D3.digit
    from dbo.Digits as D1
         cross join dbo.Digits as D2
         cross join dbo.Digits as D3
    
    
    select D3.digit * 100 + D2.digit * 10 + D1.digit + 1 as n
    from dbo.Digits as D1
         cross join dbo.Digits as D2
         cross join dbo.Digits as D3
    order by n
    
    select D3.digit * 100 + D2.digit * 10 + D1.digit + 1 as n
    from dbo.Digits as D1
         ,dbo.Digits as D2
         ,dbo.Digits as D3
    order by n
    
    --3.2.1 
    select * 
    from dbo.Digits as D1
         join dbo.Digits as D2 on D1.digit = D2.digit
    
    --3.2.2 
    select * 
    from dbo.Digits as D1
         ,dbo.Digits as D2 where D1.digit = D2.digit
    
    use TSQLFundamentals2008
    
    --3.3.3
    select C.custid, O.orderid
    from Sales.Customers as C
         join Sales.Orders as O on c.custid=O.custid
    
    select o.orderid, od.productid
    from Sales.Orders as O
        JOIN Sales.OrderDetails AS OD on O.orderid=OD.orderid
    
    select C.custid, O.orderid
    from Sales.Customers as C
         join Sales.Orders as O on c.custid=O.custid
    
    select C.custid,o.orderid, od.productid
    from Sales.Customers as C
         JOIN Sales.Orders as O On c.custid= O.custid
         JOIN Sales.OrderDetails AS OD on O.orderid=OD.orderid
    
    --3.4
    --3.4.1
    
    select q.custid, o.orderid
    from Sales.Customers q
         join Sales.Orders o on q.custid= o.custid
    
    select q.custid, o.orderid
    from Sales.Customers q
        left join Sales.Orders o on q.custid= o.custid
    
    select q.custid, o.orderid
    from Sales.Customers q
        left join Sales.Orders o on q.custid= o.custid
    where o.orderid is null
    
    --
    select C.custid ,COUNT(*)
    from Sales.Customers  C
        left join Sales.Orders as O on c.custid=O.custid
    group by C.custid
    
    select C.custid ,COUNT(O.orderid)
    from Sales.Customers  C
        left join Sales.Orders as O on c.custid=O.custid
    group by C.custid
    
    --3.6.1
    set nocount on;
    use TSQLFundamentals2008;
    if OBJECT_ID('dbo.NUMS', 'U') is not null drop table dbo.NUMS;
    create table dbo.NUMS
    (    
        n int not null primary key
    );
    
    declare @i as int =1;
    begin tran
        while @i <= 100000
        begin
           insert into dbo.NUMS(n) values(@i);
           set @i = @i + 1;
        end
    commit tran
    set nocount off;
    
    --3.6.2
    select E.empid,e.firstname, e.lastname, n.n
    from HR.Employees as E
        join dbo.NUMS N on N.n < 5
    
    select E.empid,e.firstname, e.lastname, n.n
    from HR.Employees as E
        cross join dbo.NUMS N 
    where N.n < 5
    order by n.n,  E.empid
    
    select e.empid, DATEADD(day, n- 1,'20090612') as dt
    from HR.Employees as E
        Cross Join NUMS as D
    where d.n <= datediff(day,'20090612','20090616') + 1
    order by e.empid
    
    --3.6.2
    select  C.custid,COUNT(O.orderid),Sum(OD.qty)
    from Sales.Customers as C
        left join Sales.Orders as O on C.custid = O.custid
        left join Sales.OrderDetails as OD on O.orderid = OD.orderid
    where C.country ='USA'
    group by C.custid
    
    select  C.custid,COUNT(distinct O.orderid),Sum(OD.qty)
    from Sales.Customers as C
        left join Sales.Orders as O on C.custid = O.custid
        left join Sales.OrderDetails as OD on O.orderid = OD.orderid
    where C.country =N'USA'
    group by C.custid
    
    --3.6.3
    select C.custid, C.companyname, O.orderid, O.orderdate
    from Sales.Customers as C
        Left Join Sales.Orders  as O on C.custid=O.custid
     
     --3.6.4
    select C.custid, C.companyname, O.orderid, O.orderdate
    from Sales.Customers as C
        Left Join Sales.Orders  as O on C.custid=O.custid
    where O.orderid Is NUll
    
     --3.6.5
    select C.custid, C.companyname, O.orderid, O.orderdate
    from Sales.Customers as C
        Join Sales.Orders  as O on C.custid=O.custid
    where orderdate ='20070212'
    
     --3.6.6
    select C.custid, C.companyname, O.orderid, O.orderdate
    from Sales.Customers as C
        Left Join Sales.Orders  as O on C.custid=O.custid
    where orderdate ='20070212' or O.orderdate is NUll
    
    select C.custid, C.companyname, O.orderid, O.orderdate
    from Sales.Customers as C
        Left Join Sales.Orders  as O on C.custid=O.custid and orderdate ='20070212' 
    
    --3.6.7
    select C.custid, C.companyname, O.orderid, O.orderdate,
        Case
            when O.orderid Is Not null then 'Yes'
            else 'NO' 
        End as HasOrderOn20170212
    from Sales.Customers as C
        Left Join Sales.Orders  as O on C.custid=O.custid and orderdate ='20070212' 
    order by C.custid;
    
    select distinct C.custid, C.companyname, O.orderid, O.orderdate,
        Case
            when O.orderid Is Not null then 'Yes'
            else 'NO' 
        End as HasOrderOn20170212
    from Sales.Customers as C
        Left Join Sales.Orders  as O on C.custid=O.custid and orderdate ='20070212' 
    order by C.custid;
    View Code
  • 相关阅读:
    Laravel使用Eloquent ORM操作数据库
    Laravel查询构造器的使用方法整理
    [wordpress]后台自定义菜单字段和使用wordpress color picker
    Thinkphp kindeditor 内容转义
    WordPress 后台提示输入FTP信息
    [记录]gulp compass
    symonfy 项目根目录下没有 bin/console 文件的解决方法
    [gulp] gulp lint 忽略文件
    [转载]ubuntu Atheros Communications Device 1083 驱动
    SharpDevelop 编译时,任务失败,因为未找到“resgen.exe”的解决方法
  • 原文地址:https://www.cnblogs.com/easy5weikai/p/5552319.html
Copyright © 2011-2022 走看看