今天继续由杰龙标软技术总监讲解Sql Server数据库:
数据的完整性与约束:
用“宁可错杀一百,也不放过一个”和“一粒老鼠屎,坏了一锅粥的例子”来说明保持数据完整性的目的。就是宁可不让数据进去,也要保持进去的数据的正确性。
其中数据的不完整性又包括:
(1) 实体信息(行)导致的不完整。通过定义主键的方式来解决。
(2) 域(列)信息导致的不完整,例如输错了生日的情况,可以用表达式和Check约束等方式来解决。
(3) 表间引用的不完整性(很重要)。可以通过定义外键等方式解决。
(4) 业务规则的不完整性。可以通过程序,脚本和触发器等方式解决。
什么是约束?约束就是保证数据完整性的方式。
约束分为表级约束和列级约束。
实体完整性:
(1) 主键约束 (2)标识列 (3)唯一索引
域完整性:
(1) 指定相应的数据与宽度 (2)非空约束 (3)默认值 (4)Check约束
引用完整性:(表设计中用到的最多)
(1) 引用约束(外键约束)
一个表中的列要引用别人的列(这个列叫外键,别人的列叫主键),外键所在的表叫外键表,主键所在的表叫主键表。
一个例子:某公司招了一名员工,但是尚未给其安排部门,但是现在想将其先加入员工数据库中,如何解决?可设计员工的部门id允许为空。若要将一个现有的部门解散,但是又解雇员工,而又要在数据库中显示出最新的调整,如何解决?可以对删除外键的操作做设置,删除部门id,即主键表中的列,可将外键表中相应的列做几种处理:设置为null,设置为默认值,无操作,层叠(删除所有的记录),级联(删除相应的记录)。update和insert语句也有相应的操作。
SQL Server服务器端的设置:
SQL Server服务器端的设置:
1. 确认验证是混合验证模式(属性——安全性)
2. 创建帐号,安全性——登陆——创建帐号
a.创建时指定默认的数据库 b.给一个角色(如系统管理员等)
c.用户映射,给用户访问数据库的权限,默认的数据库不一定有访问权限
通过脚本建数据库的一些细节:一个脚本,如果需要保证它是能够多次执行的(注意和一次执行的区别),是需要进行数据库或者表是否存在的判断的。
如果要删除一个包含外键关系的表,删除顺序应该是先删外键表,再删主键表。如果互相引用,怎么办?用select * from sys.all_objects查询,type为f,即为外键约束类型。
如果要将互相关联的表删除,应该先删除它们之间的引用关系。
如果要删除一个包含外键关系的表,删除顺序应该是先删外键表,再删主键表。如果互相引用,怎么办?用select * from sys.all_objects查询,type为f,即为外键约束类型。
如果要将互相关联的表删除,应该先删除它们之间的引用关系。
例子:
if exits (select * from sys.all_objects where name=’FK_abc’ and type=f)
alter table student drop FK_abc
上面的语句删除了一个名为FK_abc的引用。
稍复杂的查询语句:
将查询的结果放入新表:select name,birthday into users2 from users
delete删除表的过程:删除所有的页,删除索引(如果有的话),日志是必须删除的,并且删除表时,需要将所有的记录写日志,当表的记录很多时,操作会很慢,如果不希望对删除操作记录日志,可使用truncate table user2语句。如果要完全删除表,则使用drop命令。
将查询结果放到存在的表中:inser users2(name,birthday) select name,birthday from users
SQL Server2000中,top后面跟常量,而SQL Server2005中,top后面可以跟变量。top是SQL Server中专用的,Oracle中没有。
联合查询union:合并结果集并且去掉重复(具体的执行顺序有待确认)
笛卡尔乘积:结果的列:参加乘积的表之和
结果的行:参加乘积的表之积
在写笛卡尔乘积相关的sql语句时,应该先用条件做过滤,再做笛卡尔,效率会比较高
内联接:先做笛卡尔乘积,再选出符合条件的记录。
左联接:做完笛卡尔乘积,除了挑选公共的记录,还会挑出左表中未被匹配的记录。(即左表中的记录,无论匹配与否,都会被挑出,但是记录数不能简单的理解为左表的数,应该是大于或者等于左表数)
右联接:做完笛卡尔乘积,除了挑选公共的记录,还会挑出右表中未被匹配的记录。
若要更改左右联接,只需要更改两表的顺序即可。
若要更改左右联接,只需要更改两表的顺序即可。
交叉联接(不重要):就是笛卡尔乘积
子查询:在查询内嵌套查询,一般来说,都可以用联接来代替,并且现在数据库的发展趋势是逐渐废除子查询,所以尽量不要使用。
分组 group:
原理:
1. 分组条件,根据一列或几列来分
2. 聚合函数
分组后,要显示符合某条件的记录,使用having关键字
原理:
1. 分组条件,根据一列或几列来分
2. 聚合函数
分组后,要显示符合某条件的记录,使用having关键字
where与having的区别:where过滤结果集,而having过滤组
例子:select DepID,count(*) from users group by DepID having DepID<>8
例子:select DepID,count(*) from users group by DepID having DepID<>8