优化Myschool数据库设计

第一章
(1)。 存在一对多关系, 一般会转换为主外键约束
(2)。 存在多对多关系,一般会转换成表.

第二章(数据库的创建)
1.用SQL语句创建数据库
IF EXISTS(Select * from sysdatabases where name='Myschool')  --判断系统表中是否存在这个数据库
Drop DATABASE Myschool     --删除数据库。

Create DATABASE MySchool  --创建数据库
on 
(
     Name = 'MySchool',  --主数据文件的逻辑名称
     FileName = 'D:\project\MySchool.mdf',--主数据文件的文件路径
     SIZE = 10MB ,  --主数据文件的初始大小
     --MAXSIZE = 10MB, 主数据文件的文件最大值
     Filegrowth = 20% --主数据文件的增长率
),                --加个逗号创建次要文件
(
     Name = 'MySchool',  --次要数据文件的逻辑名称
     FileName = 'D:\project\MySchool.ndf',--次要数据文件的文件路径
     SIZE = 10MB ,  --次要数据文件的初始大小
     --MAXSIZE = 10MB, 次要数据文件的文件最大值
     Filegrowth = 20% --次要数据文件的增长率
)

LOG on
(
     Name = 'MySchoolLog',  --日志文件的逻辑名称
     FileName = 'D:\project\MySchool_Log.ldf',--日志文件的文件路径
     SIZE = 3MB ,  --日志文件的初始大小
     MAXSIZE = 20MB, --日志文件的文件最大值
     Filegrowth = 1MB --日志文件的增长率
)

2. 设置自动增长 在数据类型后面加 identity(1,1)

3.用SQL语句创建表

Use MySchool  //到这个数据库去
GO
if exists(select * from sys.objects where name='Grade')  //判断系统表集合中存在这表没有
drop table Grade  //删除此表
CREATE  TABLE  Grade    --创建学生信息表 
    --列名 | 数据类型 | 列的特征
    id int primary key identity(1,1) not null, 带主键和自动增长
    GradeID int identity(1,1) Not NULL,
    GradeName nvarchar(50) Not NULL
)


  3.1 创建临时表  select * into #temp from titles   前面加#号创建的表就是临时表
4 用SQL语句添加约束

Use MySchool
GO
alter table Student  --设置主键约束
ADD CONSTRAINT PK_StudentNo primary key (StudentNo)     -- add constraint 约束名 约束类型

alter table Student --设置唯一约束
add constraint UQ_IDENTITYCard unique (IDENTITYCard)

alter table Student  --设置默认约束
add constraint DF_Address DEFAULT('地址不详') for Address

alter table Student --设置检查约束  如果在表名后面加上with nocheck  则可以对表中现有记录不做检查 但会导致以后插入或更新数据出现错误
add constraint CK_BornDate check(BornDate >='1980-01-01')

alter table Student  --设置外键约束
add constraint FK_stuNo
foreign KEY(GradeId) references Grade(GradeID)


5 删除约束
alter table Student
drop constraint 约束名


6  DATEADD(mm,1,getdate())  日期函数  添加时间 根据一个时间的基础上

7  添加列

--往book表添加BTotal列
USE Library
go
ALTER TABLE Book  --修改表
ADD BTotal int   --添加列

8 FileGroup 组名   创建组.
(

)

9 修改列
ALTER TABLE Result
ALTER Column StudnetResult Decimal(5,2)


第三章 (SQL编程)

1.声明变量和赋值变量
声明  declare @变量名 数据类型
如declare @name varchar(10)
 
赋值 SET @name = '小剑' 或者 SELECT @name = '小剑'
SET 一般用于给变量指定数据常量 ,,  不支持同时对多个变量赋值
SELECT 一般用于从表中查询数据再赋值, 注意。 要求查询出来的数据只能有一条 , 多了会把最后的一条数据赋值
支持对多个变量同时赋值

2.输出语句 和 不显示受影响的行数
PRINT '服务器名称:'+ @@SERVERNAME  输出在消息里面显示
set nocount on

SELECT @@SERVERNAME as 服务器名称 输入在结果里面显示


3.begin - end 流程控制语句   等同于C#中的 {}   
  if else ... 类似。。
  while 你懂得。。。

4. bttween 6 and  11. 范围取值..

5 . 批处理 GO关键字 ,简化数据库管理
   一个GO代表批处理的结束

6 case 多分支语句   --根据条件获得不同的值
  case  when 条件 then 值
        when 条件 then 值
  end


7 数据类型转换
Convert(数据类型,要转换的值)
Cast(要转换的值 as 数据类型)


8 常用全局变量
  @@ERROR 最后一个T-SQL错误的错误号
  @@IDENTITY 最后一次插入的标识值
  @@ROWCOUNT 上一个SQL语句受影响的行数



第4章 高级查询
   1.子查询。 select * from Student where StudentNo in(select StudentNo .....) --先执行括号里的子查询
   2.exists子查询 判断是否存在
   if exists(select * from sysdatabases where name = 'Student')
   drop database Student
   --把所有有成绩的学生显示出来
   SELECT * FROM Student   --先查询出这些数据
   WHERE EXISTS (
       SELECT * FROM Result
       WHERE   StudentNo = Student.StudentNo )  --然后再和exists里面的数据对比 比较 然后显示数据

  

   3.Union 连接查询

   2.去除重复关键字distinct;
     select distinct * from Student


  


第6章 事务 视图 索引  
   1.事务  -- 单个的工作单元,
   begin transaction  开始事务。
   commit transaction  事务成功,保存数据
   rollback transaction 事务失败  时光倒流  倒流到开始事务之前.
   一般配合@@ERROR
   判断事务是否出现错误, 如果没出现错误 则commit transaction
   否则 rollback transaction
  
   事务四个特性
     (1)原子性  : 事务是以个完整的操作,事务的各步操作是不可分的(原子的):要么都执行,要么都不执行
     (2)一致性  : 当事务完成时,数据必须处于一致状态
     (3)隔离性  :  并发事务之间彼此隔离,独立,他不应以任何方式依赖于或影响其他事务
     (4)永久性  : 事务完成后,它对数据库的修改被永久保持
  
   事务分为 : 显示事务, 隐式事务, 自动提交事务
   sqlserver默认是自动提交事务的,有的数据库不一定。
   隐式事务:是指默认情况下,在执行下一条sql语句时开启事务,但是需要你手动提交事务
   set implicit_transactions no --默认事务,锁定表,如果不提交事务或回滚事务,别的对这个表的操作都必须等待
   update Studnet set StudentName = '张三丰' where studentName='武林'
   commit transaction  不执行的话 别的操作会等待
   --新开一条事务
   update Studnet set StudentName = '武林' where studentName='张三丰'
   commit transaction  不执行的话, 也会等待,因为上面已经提交,这里是新的事务

   2.视图
   视图的优点: 可以从特殊的角度来赋予权限,不同人看到不同数据,保证安全性,降低sql的复杂度
Use MySchool
Go
if exists(select * from sys.objects where name = 'view_Student_Result')  --判断是否有这个视图 有就删除
drop view view_Student_Result  --删除
GO
Create view view_Student_Result  --创建视图, as 然后加 查询语句 ,
as
  select st.StudentName 姓名,st.StudentNo 学号,st.Phone 联系电话,g.GradeName 学期,SUM(r.StudnetResult) 成绩 from Result r
  join Student st on r.StudentNo = st.StudentNo
  join Subject sb on r.SubjectNo = sb.SubjectNo
  join Grade g on sb.GradeID = g.GradeID
  group by g.GradeName,st.StudentName,st.StudentNo,st.Phone
GO
select * from view_Student_Result   --查看视图

3.索引.
   (1).频繁搜索的列,经常用作查询选择的列,经常排序 分组的列,经常用作连接的列(主外键) 建立索引标准
   (2).仅包含举个不同值的列,小型表 ,   不要使用这些列做索引
   (3)创建索引.
      Create [可选部分] index 索引名
      on 表名(列名)
      [WITH FILLFACTOR = 5]  --可不写 指定填充因子数
      可选部分可以填. UNIQUE 唯一索引 , CLUSTERED 聚集索引 , NONCLUSTERED 非聚集索引

      聚集索引:如果一个列经常被查, 而且有重复的数据, 那么用它
      非聚集索引: 如果一个列经常被查,但没什么重复数据, 用它
    
   (4)删除索引
      DROP INDEX 表名.索引名
      注意:删除表时候,该表所有索引会同时被删除,如果要删除表的所有索引,首先要删除非聚集索引,然后再
      删除聚集索引
  (5)按指定索引查询
      select * from Student
      with (index = 索引名)
   (6)查看索引
      select * from sys.index 

第7章 存储过程  --(((((非常类似于C#中的方法))))))
   (1)存储过程分为 系统存储过程 sp_  扩展存储过程 xp_ 自定义存储过程 usp_
   (2)常用的系统存储过程:
      exec sp_database --列出当前系统中的数据库
      exec sp_renamedb 'MyBank','Bank' --改变数据库名称 (单用户访问)
      Use Myschool
      go
      exec sp_tables --当前数据库中可查询对象的信息
      exec sp_columns Student --查看表Student中列的信息
      exec sp_help Student -- 查看表Student的所有信息
      exec sp_helpconstraint Student -- 查看Student表的约束
      exec sp_helptext '视图名称.' -- 查看视图的语句文本
      exec sp_stored_procedures -- 返回当前数据库中的存储过程列表
      exec sp_password --填充或修改登录账户的密码
    (3)创建存储过程
       Create procedure 存储过程名 as sql语句
    (4)删除存储过程
       drop procedure 存储过程名

    (5)带参数的存储过程   --参数分为输入参数和输出参数, 输出参数关键字output 加在参数的数据类型后面
       参数也可以设置默认值 设置了默认值之后 调用的时候这个参数是可填可不填的
       Create procedure 存储过程名 [参数列表] as sql语句       

    (6)返回值的存储过程示例
       Create procedure usp_StudentInfo
       @count int output -- output相当于C#中的ref关键字。
       as
       select @count = Count(*) from Student
       go
       declare @count int
       exec usp_StudentInfo @count output  这样就可以获取值了
       注:或者用return获取返回值, return 只能获取int值!
       Create procedure usp_StudentInfo
       as
       declare @count int
       select @count = Count(*) from Student
       return @count
       go
       declare @count int
       exec @count = usp_StudentInfo 这样就可以获取值了


    (7)存储过程的调用 exec[ute] 存储过程名 [参数列表]  。 也可以直接用 存储过程名称调用, 不需要exec
    (8)raiserror  用户自定义的报错信息
       raiserror('报错信息。。。',16,1)
       第一个参数为报错的信息,第二个 错误的严重级别 0-18级可选 第三个 错误的状态 1为默认
   (9)
   使用sql 操作系统
   --启动sp_configure ,0是关闭 ,1是打开
   exec sp_configure 'show advanced options',1
   GO
   reconfigure  --重新配置sp_configure
   GO
   --启动xm_cmdshell ,0是关闭, 1是打开 必须先启动sp_configure
   exec sp_configure 'xp_cmdshell',1
   GO
   reconfigure  --重新配置xp_cmdshell
   GO
   --使用cmd的DOS系统命令创建文件夹
   exec xp_cmdshell 'mkdir E:\测试。\gmg'   
   --不出现提示的情况下删除指定目录和目录下的文件
   exec xp_cmdshell 'rd E:\测试。\fff /q/s'


第 9 章 项目
随机数的算法,没有重复的。随机种子=当前的月份数*100000+当前的秒数*1000+当前毫秒数
RAND(DATEPART(mm,getdate())*100000+DATEPART(ss,getdate())*1000
+DATEPART(MS,GETDATE()))

猜你喜欢

转载自514041590.iteye.com/blog/2212453