SQL Server 2000 读书笔记
孟培远 2005.7---2005.8
数据完整性:
实体完整性---表中数据的唯一性
区域完整性---字段数据范围的完整性
参考完整性----表与表之间关联的完整性
使用者定义的完整性----用户自己定义的完整性。如:客户欠6个月的钱,下次再下定单的时候就不卖给他。
数据库分离:使用SQL语句分离为EXEC sp_detach_db ‘销售数据库’ß指明欲分离的数据库名称即可。
分离后想再用该数据库,则需要附加该数据库,具体SQL语句为:
CREATE DATABASE 销售数据库
ON PRIMARY
(FILENAME=’C:\SQLTEST\销售数据文件_1。MDF’)
FOR ATTACH
或者使用sp_attach_db系统存储过程来附加数据库:
sp_attach_db 销售数据库
‘C:\SQLTEST\销售数据文件_1.MDF’
UNIQUE 和Primary key的差异
1、 UNIQUE允许输入NULL值(最多为一个),而Primary key不允许;
2、 一个数据表中可以定义多个UNIQUE条件约束,但只能定义一个Primary key条件约束。
CHECK约束可用来限制字段值是否在所允许的范围内。
例如:
CREATE TABLE 客户02
(
客户编号 int IDENTITY NULL UNIQUE,
身份证号 char[10] NOT NULL UNIQUE,
年龄 int CHECK (年龄>0) DEFAULT 25
)
建立计算列:
CREATE TABLE 估价
(
编号 int IDENTITY, //自动编号
单价 numeric(5,1),
数量 int,
总价 AS 单价*数量
)
insert 估价 values(21.5,8)
insert 估价 values(12,3)
delete from 估价 where 编号=5 or 编号=6
drop table 估价
创建约束字段:
Create table 客户
{
客户编号 int IDENTITY Primary Key,------------------------IDENTITY自动产生编号
身份证号 char 18 NOT NULL UNIQUE,
地址 char(50),
电话 char (12),
杂志编号 int REFERENCES 杂志种类(杂志编号),
订单编号 int NOT NULL,
FOREIGN Key(杂志编号,订户编号)
REFERENCES 杂志订户(杂志编号,订户编号),
Check(地址 is NOT NULL OR 电话 is NOT NULL)
}
修改数据表:
例如:
ALTER TABLE 客户A
ADD
类别编号 int
DEFAULT 1 WITH VALUES
CONSTRAINT FK_类型编号
FOREIGN KEY
REFERENCES 客户类别(类别编号)
删除约束字段
在表中建立了一个叫PK_订购项目A的PRIMARY KEY约束,现在将它删除掉:
ALTER TABAL订购项目A
DROP CONSTRAINT PK_订购项目A
下面删除订购项目A的两个字段
ALTER TABLE 订购项目A
DROP COLUMN 定单编号,项目编号
激活/关闭约束
ALTER TABLE table
{ CHECK | NOCHECK} CONSTRAINT
{ALL | constrant_name{,…….n}}
临时数据表以#或##开头,用户断开连接后表被自动删除
数据表中字段的种类:
Primary key, Foreign Key, NULL, NOT NULL, DEFAULT, UNIQUE, CHECK
用查询结果建立新数据表
Select * into newtablename from table_source where 条件
当记录中有重复的时候可以采用DISTINCT来获取单独的数据。
TOP N 为显示前N个数据
TOP N 30 PERSENT * FROM 表名
表示显示N的前30%的数据
ORDER BY 按什么方式排序显示结果
ASC升DESC降
JOIN
SELECT A,B,C FROM T1 JOIN T2 ON T1.NO=T2.NO
JOIN 的类型有多种:
INNER(默认)
LEFT(以左边为条件,如果右边没有符合的条件,则以NULL)
例如:SELECT 旗.产品名称AS旗旗公司产品名称,旗.价格,标.成品名称AS标标公司产品名称,标.价格
FROM 旗旗公司 AS 旗 LEFT JOIN 标标公司AS标
ON旗.产品名称=标产品名称
RIGHT(以右边为条件,如果左边没有符合的条件,则以NULL)
FULL(左边右边都显示,如果没有则以NULL)
CROSS(将两个表的数据进行比较,全部显示出来)
有时需要自己JOIN自己
例如:
SELECT 员工.姓名,员工.职位,长官.姓名AS主管
FROM 员工 LEFT JOIN 员工AS 长官
ON 员工.主管编号=主管.编号
| 姓名 | 职位 | 主管 |
1 | 陈圆圆 | 主任 | 刘敏敏 |
2 | 刘敏敏 | 经理 | NULL |
GROUP BY 按什么分组显示
UNION把两个查询结果合并到一个表中显示出来
查询时Group的使用,例如:
Name | Date | Quantity |
A | 2001-1-1 | 2 |
B | 2001-10-10 | 6 |
A | 2003-4-20 | 8 |
B | 2004-5-21 | 9 |
A | 2005-8-18 | 10 |
要求查询上面表格中A和B的数量分别为多少?
Select name AS名称,Sum(Quantity)数量 Form table Group By name
结果为:
GROUP BY后面如果有WITH CUBE则把各个组进行汇总计算后显示结果
例如:
Name | Date | Bookname | Quantity |
A | 2001-1-1 | X1 | 2 |
B | 2001-10-10 | Y1 | 6 |
A | 2003-4-20 | X1 | 8 |
B | 2004-5-21 | Y2 | 9 |
A | 2005-8-18 | X2 | 10 |
查询:select name AS出版社名称,bookname AS 书名,sum(quantity) AS 数量 from table group by name,bookname with cube
结果如下:
出版社名称 | 书名 | 数量 |
A | X1 | 10 |
A | X2 | 10 |
A | NULL | 20 |
B | Y1 | 6 |
B | Y2 | 9 |
B | NULL | 15 |
查询时改变要显示的数据:(1代表“男”,0代表“女”)
要求查询时如果是1则显示“男”,否则显示“女”
Select name AS 姓名,case sex when 0 then “女” else “男” End AS 性别 From table
比较清单有:
IN,ALL,ANY(SOME)结果为TRUE或FALSE
测试存在用EXISTS结果返回TRUE,FALSE
索引分为聚集索引和非聚集索引
聚焦索引数据的存放会依照该索引的顺序来存放
非聚焦索引数据的存放不会依照索引的顺序来存放
因为非聚焦索引不影响数据排列顺序,则可以设置多个非聚焦索引,而聚焦索引则最多只能设置一个,因为实际数据只能有一种排列顺序。
(Unique index)索引值是否唯一:如果索引值为唯一,则成为唯一索引
多个字段做为索引称为复合索引(Composite index)
Create [UNIQUE] -----指定唯一
[CLUSTERED | NONCLUSTERED] ------指定聚集/非聚集
INDEX index_name
ON table_name
(column [ASC|DESC][,…..n]) -----可指定排序方式(默认为升序ASC)
[WITH [PAD_INDEX] --------索引页预留空间
[,FILLFACTOR=X] ------填充因子
[,IGNORE_DUP_KEY] ------忽略重复值
[,DROP_EXISTING] ------删除现有的索引
[,STATISTICS_NORECOMPUTE]] --------不重新计算统计数据
[ON filegroup] --------指定文件组
例如:
CREATE TABLE KKK
(
ProductID smallint not null primary key,
ProductName char(30),
Price smallmoney,
Manufacturer char(30)
) ------创建表完毕
//创建索引
CREATE UNIQUE NONCLUSTERED INDEX indexname
ON KKK (Price DESC)
WITH PAD_INDEX, FILLFACTOR=30,IGNORE_DUP_KEY
//删除索引
DROP INDEX table.index_name
//修改索引
使用DROP_EXISTING修改索引
如果要修改索引,只要在CREATE INDEX语句的最后加上DROP_EXISTING即可(如果存在该索引,则修改之,否则会发生错误)
使用DBCC DBREINDEX重建索引
如果只想重建索引(而不修改索引的相关设置),那么使用DBCC DBREINDEX语句比较方便,而且使用时也可指定重建的填充因子。
DBCC DBREINDEX(’database_name.owner.table_name’, index_name, fillfactor)
数据库