无知者__

在知识的海洋中我们永远是一个无知的人!
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

SqlServer初学笔记

Posted on 2011-03-07 14:09  旅行者1号  阅读(280)  评论(0编辑  收藏  举报

●业务实体是什么?
:把查询出的结果包装为一个对象。

●cross join 怎么连接的?

笛卡尔积:是把两张表的行相乘后的虚拟表。
原理:用第一张表的第一条记录遍历一遍第二个表的所有记录遍历的结果放到一张虚拟表,这个结果就是笛卡尔积。如果是内连接就只把符合条件的结果放到虚拟表中。
用A表的第一个外键和B表的所有主键连接一遍,接着用A表的第二个外键和B表的所有主键再连接一遍 这样一直把A表的所有外键都和B表的所有主键都连接一遍后最后得出的表就是两张表行的乘积了。这张表叫做笛卡尔积也叫虚拟表,如果没有on条件那么这张表将包含了所有的可能它把所有的可能都列了出来放到这张新的虚拟表中。
inner join :内连接查询只把符合条件的列出来。
select username  from table1 inner join table2 on table1.userid = table2.userid;

●null值于任何数据运算结果都是null。

●in 和 = 有区别?

in针对集合
= 针对唯一的值
not in 值域范围

●group by 后是否是分成了几个表?
:是把分组条件的字段值一样的放在一起逻辑上形成一个组,要对分组后的数据表进行筛选必须用having组函数。
:只有列在分组条件中的字段才能出现在select子句中。
:其实就是以group by 后的列名为依据分为了逻辑上的组,group by 后的列数决定了分为了几组,所以select 后返回的字段不能多用group by 后的列名数。
select s_id,s_name from s group by s_id,s_name;

●两个筛选关键字
where 针对没有分组的原始表进行筛选
having 针对分组后的所有表进行筛选

使用标准SQL嵌套语句查询不选修课程编号为’C2’的学员姓名和所属单位?

一张表里某个列上一旦出现了两次内容就必定会有两行,行中的其他列也要再复制出来一遍。

姓名 选修课程

张三 C1

张三 C2

张三 C3

张三 C4

张三 C5

所以不能用   选修课程!=C2  这样张三其实选了C2但他被选出来了。原因是数据库是从上往下一行一行的筛选的。第一行就把张三分到了不选修课程编号为C2的范围里了,以后怎么选都没用了,结果开始就错了。

●字段名一般都用[]括起来。

●where后有多个条件时用and 连接多个条件。
 select * from s where s_name = 'Tom' and s_age = 20 and s_Id = '数学系'

●ado.net是一种访问数据库的技术。最主要的五个对象:
SqlConnection
SqlCommand
SqlDataReader
SqlParameter
SqlTransaction
如果用oracle的就改为OracleConnection后面同理。

●怎样设计数据库?
一个业务对象简单的可以用一张表,复杂的需要分成多张表。
建表时也是遵循一级级的分类下来。
业务对象一种表,业务对象之间的关系设计一种表。
表的字段信息是根据业务需要抽象出来的,与业务无关的信息就不要了。

三个原则:
1.表的完整性  足够存储业务数据
2.不能有冗余  不要有重复
3.满足三个范式 Normal Form
3.1
一个字段中只能包含一条信息。一条信息也只能放在一个字段中。
3.2
在满足第一范式的前提下,能用一个或几个字段的组合来确定表中的某一条字段。
3.3
在满足第二范式的前提下,能用一个或几个字段的组合来唯一的确定表中的某一条字段。
me:设计表的思想就是把业务对象分到不能再分,一个业务对象对应一个表。把最紧密相关的一组信息放到一个表中。如老师和办公室分成两个表。
●存储过程
存储过程是保持在数据库中的一段经过编译的且命名过的sql程序,
和视图就是一段sql程序,相当于C#中的方法,他们于方法的区别就是存储过程没有返回值,视图有返回值.
create process abc
as
//sql程序

●视图

视图就是个复杂的select语句,相当于C#的方法,于存储过程的区别在于视图永远不接受参数,创建视图后可以把视图当做表的用,
但不能排序。它有返回结果。
视图只能查看不能修改。
视图是经过语法检查和编译的一张虚表,所以能提高速度。
大项目中往往只能查看视图,视图可以屏蔽掉数据库中的数据结构,提高安全。
缺点是视图是内存中的一张虚表,创建的多会占内存。

视图语法上可以修改数据库表的结构但是视为违规不建议。

create view abc
as
//sql程序

●触发器
触发器是一个存储过程。
系统自动执行触发器。
触发器不接收任何参数,也不能返回任何数据。
触发器不是独立的数据库对象,必须寄生在一张表上。
触发器是在改动表时而触发。所以只有三种类型的触发器、增、删、改。

触发器缺点是系统自动调用,有时候可能有程序代码层无法预测的bug。
触发器的执行是基于两张虚拟表进行的。一个inserted表一个delete表。
inserted表放的是新加入的数据deleted表放的是旧的数据这两张表与绑定的表同时更新,
所以可以做一个不允许删除或插入的用触发器工作原理就是用户删除一条让触发器自动把刚才的插入回去。同理。

●用户自定义函数
create function myfun(@name nchar(25))
returns int //返回值的类型
as
begin
//逻辑代码
 declare @a int
 select @a = count(*) from course where tname = @name
 return @a
end
//调用用户自定义函数必须加上自定义函数的拥有者
declare @x int
set @x = dbo.myfun('张明')
print @x

●事务
多线程就像大军要通过独木桥到对岸。
独木桥就是临界区。
事务就是把多个语句看做一个整体。要么都执行要么都不执行。这些工作是数据库服务器完成的。
就像是在exel中你写了一大堆数据当你打第一个字的时候开始了事务,结束事务的时候分为两种要么保存了要么撤销。

●动态的sql语句
用拼字符串的形式实现
declare @sql nvarchar(2000)
set @sql = 'select [name]'
select @sql = @sql+', sum(case when course = '''+course+''' then score else 0 end)'+course
from (select distinct course from T) x
set @sql = @sql +'from T group by[name]'
exec(@sql)

●索引
优点是查询速度快
缺点影响增删改时的速度
分为物理索引和逻辑索引
物理索引会使数据库表的数据重新排序,物理索引就是当前表本身。
逻辑索引是又建了一张独立的表,表里有一列记录了原始记录的行号
索引是自己建立的但是是系统帮助调用的。当执行查询语句时系统会检查一下有没有为当前表建立索引,根据索引进行查询。
没有查找条件的时候系统只对当前表本身进行查询。有查询条件时系统会对当前表的索引进行查询。所以嵌套查询时要保证外层查询和内层查询要么都有查询条件要么都没有查询条件。否则查询的表不是同一张。

●什么时候用索引什么时候不用?
.数据量巨大时或频繁的查询时需要考虑建索引。
.数据量小或频繁的更新时不要用索引

●top 后必须是常量,但怎么让他跟变量呢?
:拼字符串语句。