第 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