一、SQL页
1.
Inner join:依据ON后接的条件返回两个表共同的交集。
left outer join: FROM后接的表为左表,依据ON后接的条件以左表为基准,不匹配的地方填充NULL, 返回数据集,数据集行数以左表为标准。
right outer join:FROM后接的表为右表,依据ON后接的条件以右表为基准,不匹配的地方填充NULL, 返回数据集,数据集行数以右表为标准。
full outer join:FROM后接的表为数据集基准表,相连接表相同数据合并到一行,不同的数据填充NULL,之后,和基准表不匹配的行数据与基准表填充NULL合并到一行进行显示。
cross join: FROM后接的表为数据集基准表,两个表进行笛卡尔乘积。
2.
主键:设计主键时往往要考虑到以下几点:
① 对用户来说无意义性。
②最好是产生后不会再变动的数据
③ 包含主键组成的字段尽量要少 主键中单个字段存储的存储类型简短。这样对表
聚集索引:物理存储按照索引排序,使用的情况如下:
①包含大量非重复
②经常要在一个范围内查询
③ 插入数据频率较低,主要用来进行数据访问
④ 返回大量数据结果的查询
⑤经常被用来连接或者groupby的列,一般来说是外键,使用这些列进行索引的时候,sqlsever可以不再对表进行排序,节省时间。
3
建表时数据类型要注意字段未来的增长需要,比如int类型取值范围是否能够满足业务增长需要,如不行,可以考虑BigInt;涉及到价格方面的信息,推荐使用money类型;对于需要精确到小数点几位的信息,比如考核类成绩等,推荐使用decimal类型;char类型 支持固定长度的数据,如果数据长度不可预测,应该设置为varchar和nvarchar ,如果数据会包含有中文,推荐使用nvarchar,反之,如果为纯英文数据,建议使用varchar;对于只存储0 1 2等类似状态信息标志的字段值,可以考虑使用char(1)类型;当对用户操作时间等信息进行记录时,如果需要精确到秒,需要使用datetime数据类型,反之,精确到分钟的话使用smalldatetime。
主键的选择参考第二题的答案。
4
count(*) 与count(1) 都是对值为NULL的统计,count(colum)对值为非NULL的统计,count(*)是ansi标准写法,推荐使用。据说,在执行效率上来说count(*)>count(1)>count(colum),如果某个表count(*)用的比较多,可以考虑在列数据长度最短的上面建立一个单列索引。
5.
视图的优点:
①数据安全性 对不同的用户定义不同的视图,使用户只能看到和自己相关的信息
②查询简单化:为复杂的查询建立一个视图,从而不必每次查询都后接很多条件,提供性能。
③逻辑数据独立性:有了视图,当基本表被改变或业务需求有变更的时候,只需要修改视图定义就可以,其它引用的地方可以不必一一修改。
视图的缺点:
①性能。
SQL Server必须把视图的查询转化成对基本表的查询,如果这个视图是由一个复杂的多表查询所定义,那么,即使是视图的一个简单查询,SQL Server也把它变成一个复杂的结合体,需要花费一定的时间。
②修改限制。
当用户试图修改视图的某些行时,SQL Server必须把它转化为对基本表的某些行的修改。事实上,当从视图中插入或者删除时,情况也是这样。对于简单视图来说,这是很方便的,但是,对于比较复杂的视图,可能是不可修改的,这些视图有如下特征:
a.有UNIQUE等集合操作符的视图。
b.有GROUP BY子句的视图。
c.有诸如AVGSUMMAX等聚合函数的视图。
d.使用DISTINCT关键字的视图。
e.连接表的视图(其中有些例外)
结论:视图使用情况应该依据具体业务情况进行判断。
6
对性能没有影响,查询分析器会给优化掉。
7
表变量是占用内存,编程时对于较小的的临时计算数据集采用表变量会更快,临时表是利用了硬盘(tempdb),如果数据集比较大,推荐使用临时表。
8
8.1、选择索引列可以参考下面几个条件:
①经常与其他表进行连接的表,在连接字段上可以考虑建立索引;
②经常出现在Where子句中的字段,特别是大表的字段,应该建立索引;
③索引应该建在小字段上,对于大的文本字段甚至超长字段,不要建索引。
8.2、打开表下面的索引,选择索引,右键编写索引脚本为->create 即可查看索引定义。
8.3、
①在查询的时候,where条件不要对索引的列做处理,而要对后面的条件字段做处理。否则用不上这个列上的索引。
②不要对存在索引的列使用函数
③字符型字段传入数值时需要加引号
④避免一些SQL的写法 例如.where子句中如果使用in、or、like、!= <>
8.4、
过滤索引是使用了过滤器的非聚集索引,这个过滤器一般是where语句,用来过滤索引列上的关键数组。
使用情况个人理解如下:在指定范围内进行大规模数据计算情况下,可以提升相当的性能。
创建索引的时候可以在索引语句后面加上WHERE条件进行判断。
9
可以在查询菜单列表中点击显示估计的执行计划查看执行计划。
表扫描:遍历整个表,查找所有匹配的记录行。这个操作将会一行一行的检查,效率最差。
聚集索引查找:直接根据聚集索引获取记录,索引即是位置,效率最快。
聚集索引扫描:按聚集索引来逐行扫描每一行记录,和表扫描一样。
索引查找:根据索引找到位置,定位到记录的存放位置,然后取得记录,因此,效率较快。
索引扫描:根据索引,从表中扫描过滤出来一部分记录,再查找所有匹配的记录行,相对表扫描,查询范围要小些,效率比表扫描快。
10
查看查询语句所用IO
SET STATISTICS IO ON
SET STATISTICS IO OFF
查看查询语句执行时间
SET STATISTICS TIME ON
SET STATISTICS TIME OFF
11.
left join 改成 inner join ,LEFT JOIN 更新全表 inner join 更新相同记录行
sum(isnull(money,0))更合理 sum(money)可能得到NULL值 对后面计算导致结果仍然为NULL.
12
select AreaNo,stuff((select DISTINCT ','+CITY from 表名 where a.AREANO=AREANO for xml path('')),1,1,'') as citys
from 表名 as a group by AreaNo
13
select 10/3 + 3 结果取整数+3 =6
select 10.0/3+3 和select 10/3.0+3 计算结果一样,带小数点。