单表查询,基础练习

单表查询,基础练习

1.重临 每月最后一天订单

本内容是自身就学tsql二〇〇八的翻阅笔记

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

哪些是涉嫌模型?

 使用EMONTH 对输入的日子再次回到月末日期   相通动态条件

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

DATEDIFF(month, ‘一九九七1231’, orderdate)  相差多少月 
从19971231到 orderdate之间先查多少月

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

DATEADD(month, DATEDIFF(month, ‘一九九六1231’, 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

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 对相应的基准进行排序

开窗函数使用OVEXC90子句提供窗口作为上下文,对窗口中的生机勃勃组值举行操作,并不是使用GROUP
BY 子句提供的上下文。那样能够并且重回底蕴行的列和聚合列。

ROW_NUMBEENVISION()
函数用于为查询的结果聚焦的各行分配二个递增的种类号。其论理顺序通过OVE普拉多子句中的OMuranoDER
BY语句来开展点名。但不怕OOdysseyDER
By的列不唯大器晚成,则类别值也会大增,那样会产生再次回到的值不明显。

RANK 和 DENSE_RANK为富有同样逻辑排序值的富有行生成相似的排名。

RANK代表前边有稍稍行更低的排序值,而DENSE
RANK表示前面某些许个不等的排序值。

 

能够以为在同风流浪漫SELECT子句中区别有的时候间钦定DISTINCT和ROW NUMBEEnclave是一条最棒实践,

因为DISTINCT在这里种状态下不起此外功能。

 

SELECT empid,firstname,lastname

FROM HR.Employees

WHERE lastname like N’D%’;

N表示National,用于表示字符串是Unicode数据类型(NCHA大切诺基或NVARCHA牧马人).

 

SQL中的三值逻辑,假若想回到region列不等于WA的具备行,如下:

SELECT custid,country,region,city

FROM Sales.Customers

WHERE region<>N’WA’

OR region IS NULL;

 

SQL匡助三种字符数据类型:普通字符和Unicode字符。

通常说来字符使用三个字节来保存每一个字符,所以约束那个列所匡助的言语只可以是立陶宛(Lithuania卡塔尔国语。

 

使用定长的字符串时,SQLSELANDVEQX56会预先分配相应的空中,使其不只怕扩充,它更相符以写入为主的系统,可是那连串型的存款和储蓄消耗不是最优的,读取的时候恐怕要付出更多的代价。

变长字符的存款和储蓄空间由实际数据量来调节,但是改过数据的时候可能会要求多少移动,超过当前页的约束,所以更新时的频率相对会低一些。

 

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

能够接收Replace来测算某字符在字符串中现身的次数,方法是先把它替换到空,然后比对前后的差值再除以要合营的字符串的长短就能够了。

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

 

DateTimeoffset 不经常区部分可以张开辨别

DateTime2 精度可控,况兼帮助的范围从0001发端到9999.

 

将字符串文字转成日期类型时,若无一些名时间,sqlserver则暗许用上午日子作为其时间值.

在大大多状态下,在过滤条件中对列进行函数化管理,极有超级大可能率变成相应列上的目录不或许使用,减少查询作用,应用方案是应用等值的限量查询.举例:

SELECT orderid FROM sales.Orders WHERE YEAR(ORDERDATE)=2007

:SELECT orderid FROM sales.Orders WHERE ORDERDATE >=’20070101′ AND
ORDERDATE<‘20080101’

 

SELECT

current_timestamp as [current_timestamp],

GETDATE() as [getdate],

getutcdate() as [getutcdate],

SYSDATETIME() as [sysdatetime],

SYSUTCDATETIME() as [sysutcdatetime],

SYSDATETIMEOFFSET() as [sysdatetimeoffset]

小编们尽量使用正式的SQL,并非TSQL,如若她们能表示成雷同的固守.举个例子得到当几日前牛时间时接收current_timestamp比GetDate()要好些.

cast是ANSI的标准SQL.

SELECT

SWITCHOFFSET(SYSDATETIMEOFFSET(),’+00:00′) AS
[UTCDATETIME],–能够把时光转成UTC的

CURRENT_TIMESTAMP AS [CURRENTDATE],

SYSUTCDATETIME() AS [SYSUTCDATETIME]

 

获取表的元数据消息:

exec sp_tables

EXEC sp_columns N’SCORE’,N’DBO’

EXEC sp_helpconstraint N’SCORE’

 

—-每一种月最后一天生成的订单

–SELECT

–orderid,

–orderdate,

–custid,

–empid

–FROM

–SALES.ORDERS

–WHERE

–ORDERDATE = DATEADD(DD,-1,Convert(CHAR(7),DATEADD(mm,1,ORDERDATE),121)
+’-01′)

–ORDERDATE =
dateadd(month,datediff(month,’19991231′,orderdate),’19991231′)

 

–return lastname has a more than twice

–select

–empid,firstname,lastname

–from

–hr.employees

–where

–LEN(lastname) – len(replace(lastname,’a’,”))>1

–lastname like ‘%a%a%’

回去总价值抢先10000的订单

–select

–orderid,

–SUM(qty*unitprice) as totalvalue

–from

–sales.orderdetails

–group by orderid

–having SUM(qty*unitprice) >10000

admin

网站地图xml地图