优化MySchool数据库设计

学东西要学活学透,用对方能理解的方式讲解(最好以贴近生活的方式讲解)怎么用
编程思维:用空间换时间
项目的开发包括以下几个阶段:
需求分析:分析客户的业务和数据处理需求
概要设计:绘制数据库的E-R图,用于在项目团队内部、设计人员和客户进行沟通,确认需求信息的正确性和完整性
详细设计:将E-R图转换成多张表,进行逻辑设计(即数据库模式图),确认各表的主外键,并应用数据库的三大范式进行审核
代码编写:
运行测试:
打包发行:
对数据库进行系统分析时的步骤:
1:收集数据
2:标志实体(我的理解:一个实体就是一个对象):
实体可以是有形的事物,如人或产品,也可以是无形的事物,商业交易,发薪周期
实体一般是名词,一个 实体只描述一件事情,不能出现含义相同的实体,如联系方式和电话就是含义相同的
3:标识每个实体需要存储的详细信息(即属性)
4:标志实体之间的关系(如客房与客人有主从关系)
sys.objects=sysobjects 
sysobjects是对于用户数据库而言的,对于不同的数据库sysobjects 是不同的
所以在不同的数据库创建的存储过程一定要指定数据库名
在外键表中写:添加主外键关联
[bookid] [int] reference [dbo].[book] ([bookid])  NOT NULL,
-----------------------------------------------------------
if object_id ( 'usp_geterrorinfo', 'p' ) is not null 
    drop procedure dbo.usp_geterrorinfo;
go
use master
if (db_id('Hotel')is  not null ) drop database Hotel

sql语句执行的时间
declare @time1 datetime  -- 声明时间变量
select @time1=getdate() --获得系统当前时间
--测试语句开始
select s.StudentName,sj.SubjectName,r.ExamDate,r.StudentResult 
from student s,Subjects sj,result r  where s.StudentNo=r.StudentNo and sj.SubjectNo=r.SubjectNo
select s.StudentName,sj.SubjectName,r.ExamDate,r.StudentResult 
from student s,Subjects sj,result r with(index=IX_Result_StudentResult) where s.StudentNo=r.StudentNo and sj.SubjectNo=r.SubjectNo
--测试语句结束
select convert(varchar(50), datediff(ms,@time1,getdate()))+'毫秒'--计算时间差
go
set statistics profile on 
set statistics io on 
set statistics time on 
go
 /*--你的sql脚本开始*/
select s.studentname,sj.subjectname,r.examdate,r.studentresult 
from student s,subjects sj,result r with(index=ix_result_studentresult) where s.studentno=r.studentno and sj.subjectno=r.subjectno
 go
 /*--你的sql脚本结束*/
set statistics profile off --statistics 统计 项目组合表
set statistics io off 
set statistics time off
go

                            第一章

本章工作任务:
完成酒店管理系统数据库的设计:
完成员工晋级系统数据库的设计:
本章技能目标:
了解数据库的步骤
掌握如何绘制数据库的E-R图(实体关系模型Entity-Relationship)
掌握如何绘制数据库的模式图--逻辑设计
使用三大范式实现数据库设计规范化

第一范式:每个列不可再分(原子性)
生活举例:地址的拆分,方便于送货送快递
第二范式:主键列,一旦确定,其他属性都确定,要求每个表只描述依赖主键列一件事主键列
第三范式:非主键列之间不相互依赖
数据库设计的第三范式(3NF)要求一个关系中不包含已在其它关系已包含的非主关键字信息。
例如,教师信息表中包含有教师编号、姓名、性别这些与教师编号有直接关系的字段,但不应该包含教师讲授的课程名、
所在的院系名称或教师所在的办公室名称等信息;否则就会有大量的数据冗余。简而言之,
第三范式就是属性不依赖于其它非主属性,也就是在满足2NF的基础上,任何非主属性不得传递依赖于主属性。
范式:英文名称是 Normal Form,它是英国人 E.F.Codd(关系数据库的老祖宗)在上个世纪70年代提出关系数据库模型后总结出来的,范式是关系数据库理论的基础,也是我们在设计数据库结构过程中所要遵循的规则和指导方法。目前有迹可寻的共有8种范式,依次是:1NF,2NF,3NF,BCNF,4NF,5NF,DKNF,6NF。通常所用到的只是前三个范式,即:第一范式(1NF),第二范式(2NF),第三范式(3NF)。下面就简单介绍下这三个范式。 
◆ 第一范式(1NF):强调的是列的原子性,即列不能够再分成其他几列。 
考虑这样一个表:【联系人】(姓名,性别,电话) 
如果在实际场景中,一个联系人有家庭电话和公司电话,那么这种表结构设计就没有达到 1NF。要符合 1NF 我们只需把列(电话)拆分,即:【联系人】(姓名,性别,家庭电话,公司电话)。1NF 很好辨别,但是 2NF 和 3NF 就容易搞混淆。  ◆ 第二范式(2NF):首先是 1NF,另外包含两部分内容,一是表必须有一个主键;二是没有包含在主键中的列必须完全依赖于主键,而不能只依赖于主键的一部分。 
考虑一个订单明细表:【OrderDetail】(OrderID,ProductID,UnitPrice,Discount,Quantity,ProductName)。  因为我们知道在一个订单中可以订购多种产品,所以单单一个 OrderID 是不足以成为主键的,主键应该是(OrderID,ProductID)。显而易见 Discount(折扣),Quantity(数量)完全依赖(取决)于主键(OderID,ProductID),而 UnitPrice,ProductName 只依赖于 ProductID。所以 OrderDetail 表不符合 2NF。不符合 2NF 的设计容易产生冗余数据。  可以把【OrderDetail】表拆分为【OrderDetail】(OrderID,ProductID,Discount,Quantity)和【Product】(ProductID,UnitPrice,ProductName)来消除原订单表中UnitPrice,ProductName多次重复的情况。 
◆ 第三范式(3NF):首先是 2NF,另外非主键列必须直接依赖于主键,不能存在传递依赖。即不能存在:非主键列 A 依赖于非主键列 B,非主键列 B 依赖于主键的情况。 
考虑一个订单表【Order】(OrderID,OrderDate,CustomerID,CustomerName,CustomerAddr,CustomerCity)主键是(OrderID)。 
其中 OrderDate,CustomerID,CustomerName,CustomerAddr,CustomerCity 等非主键列都完全依赖于主键(OrderID),所以符合 2NF。不过问题是 CustomerName,CustomerAddr,CustomerCity 直接依赖的是 CustomerID(非主键列),而不是直接依赖于主键,它是通过传递才依赖于主键,所以不符合 3NF。 
通过拆分【Order】为【Order】(OrderID,OrderDate,CustomerID)和【Customer】(CustomerID,CustomerName,CustomerAddr,CustomerCity)从而达到 3NF。 
第二范式(2NF)和第三范式(3NF)的概念很容易混淆,区分它们的关键点在于,2NF:非主键列是否完全依赖于主键,还是依赖于主键的一部分;3NF:非主键列是直接依赖于主键,还是直接依赖于非主键列。
diagram:图表
formate:结构
为什么需要规范的数据库设计:
如果设计不当,会造成数据冗余,修改复杂,数据操作异常
通过规范的数据库设计可以提高项目的应用性能
什么是数据库设计:
数据库设计就是将数据库中的数据实体以及这些数据实体之间的关系,进行规划和结构化的过程
数据库设计非常重要:
数据库中创建的数据结构的种类和在数据实体中建立的复杂关系是决定数据库系统效率的重要因素
 
良好的数据库设计表现在以下方面:
效率高
便于进一步拓展
使得应用程序的开发更容易
                    什么是实体关系模型
简单的说,实体关系模型就是描述实体之间复杂的关系的模型
实体一般是名词 ,它对应表中的一行数据
如客人张三所在的这一行数据:包括姓名,性别,身份证等信息

实体用矩形表示,一般是名词
属性用椭圆表示, 一般也名词
联系用菱形表示,一般是动词
映射基数:
一对一
一对多
多对一
多对多:一个顾客可以买多个商品,一个商品可以被多个顾客买
关系数据库的规范化理论要解决的问题 如何构造合适的数据库逻辑结构


Visio环境中,绘制数据库模型图的步骤是:新建数据库模型图;添加实体,在“数据库属性”中定义数据表的物理名称和概念名称;添加数据列及相应的属性,添加列、数据类型和注释;添加实体之间的映射关系,利用连接线指定主表和子表之间的主外键之间关系。本题中,“商店”实体主键是商店编号,“销售”实体主键则是由商店编号和商品编号组合而成,“商品”实体主键是商品编号。“商品”表和“销售”表之间映射关系是“商品”表是主表,“销售”表是子表;“商店”表是主表,“销售”表是子表


use master
if (db_id('Hotel')is  not null ) drop database Pet
create database Pet
on primary
(
     --数据文件的具体描述
  name='Pet_data',--主数据库文件的逻辑名
  filename ='D:\\java\\Pet_data.mdf',--主数据库文件的物理名称和存放位置
  size=5MB,
  maxsize=100MB,
  filegrowth=15%
)
log on
(
  --日志文件的具体描述,各参数含义同上
   name='Pet_log',
  filename ='D:\\java\\Pet_log.ldf',
  size=2MB,
  filegrowth=1MB
)
use Pet
if object_id('pet','U') is not null 
drop table pet
create table pet
(
  petid int identity(1,1) primary key(petid)  not null,
  --主外键约束要放在not null 后,在外键表里写
  masterid int not null references  master(masterid) ,
  name varchar(20) not null,
  typeid int not null references petType(typeId),
  health int default(100),
  love int default(0),
  adoptTime datetime default(getdate()),
  status int default(1),
)
go
if object_id('master','U') is not null 
drop table master
create table master
(
  masterid int identity(1,1) primary key(masterid)   not null,
  loginid varchar(20) not null,
  password varchar(20) not null
)
go
if object_id('petType','U') is not null 
drop table petType
create table petType
(
  typeId int identity(1,1) primary key(typeId)  not null,
  name varchar(20) not null
)
go
数据库设计的第三范式(3NF)要求一个关系中不包含已在其它关系已包含的非主关键字信息。例如,职工信息表中包含有职工编号、姓名、工种后,就不能再将工种、定额等与工种有关的信息再加入员工信息表中。如果不存在工种信息表,则根据第三范式(3NF)也应该构建它,否则就会有大量的数据冗余。简而言之,第三范式就是属性不依赖于其它非主属性,也就是在满足2NF的基础上,任何非主属性不得传递依赖于主属性。
                             第二章:用代码建库,建表,建约束
create database MySchool2
on primary
(
  --数据文件的具体描述
  name='MySchool2_data',--主数据库文件的逻辑名
  filename ='D:\\project\\MySchool2_data.mdf',--主数据库文件的物理名称和存放位置
  size=5MB,
  maxsize=100MB,
  filegrowth=15%
)
log on
(
  --日志文件的具体描述,各参数含义同上
   name='MySchool2_log',
  filename ='D:\\project\\MySchool2_log.ldf',
  size=2MB,
  filegrowth=1MB
  
)
go
create table Student
(
--具体的列名 数据类型 列的特征(是否为空)--
StudentNo int identity(2,1) not null,
LoginPwd nvarchar(20) not null,
StudentName nvarchar(20) not null,
Sex int not null,
GradeId int not null,
phone nvarchar(50) not null,
BornDate datetime not null,
Address nvarchar(255),
Email nvarchar(50),
IDENTITYcard varchar(18)
)
go
--一次添加多个约束
alter table Student
add 
constraint PK_StudentNo primary key(StudentNo),
constraint UQ_IDENTITYcard unique(IDENTITYcard),
constraint DF_Address default('地址不详') for Address,
constraint CK_BornDate check(BornDate>='1980-01-01')
go
if exists(select * from sysobjects where name='Result')
drop table Result
create table Result
(
   StudentNo int not null,
   SubjectNo int not null,
   ExamDate datetime not null,
  StudentResult int not null
)
go
if exists(select * from sysobjects where name='Subjects')
drop table Subjects
/*
if (object_id('Subjects','U') is not null )drop table Subjects
*/
create table Subjects
(
   SubjectNo int identity(1,1) not null,
   SubjectName nvarchar(50) not null,
   ClassHour int  not null,
   GradeID int  not null
)
go
use MySchool2
create table Grade
(
  GradeID int identity(1,1)  not null,
  GradeName nvarchar(50) not null
)
go
alter table Result
add constraint FK_StudentNo foreign key (StudentNo) references Student(StudentNo) 
go
alter table Grade
add constraint PK_GradeID primary key (GradeId)
go
alter table Subjects
add 
constraint PK_SubjectNo primary key (SubjectNo),
constraint CK_ClassHour check(ClassHour>=0)
go
alter table Subjects
add constraint FK_GradeID foreign key (GradeID) references Grade(GradeID) 
go
alter table Result
add constraint PK_StudentNo_SubjectNo_Examdate primary key(StudentNo,SubjectNo,Examdate),
constraint DF_ExamDate default (getDate())for ExamDate,
constraint CK_StudentResult check(StudentResult between 0 and 100),
constraint FK_StudentNo1 foreign key(SubjectNo) references Subjects(SubjectNo)
go
                      第三章 :SQL编程
局部变量:
局部变量的名称必须以标记@作为前缀
declare @variable_name DataType
局部变量的赋值有两种方法:使用set 和select 语句
set @variable_name=value
select @variable_name=value
  set 赋值语句一般用于给常量赋值,不支持对多个变量赋值
表达式未返回值时 变量被赋予null
而select 赋值语句一般用于从表中查询数据,再赋给变量
select 语句需要确保筛选的记录不多于一条,如果查询的记录多于一条,
则将把最后一条记录的值赋给变量 表达式未返回值时 变量保持原值
给一个变量赋值时,set 耗用资源较少,使用set 效率较高
SQL server 中所有全局变量都使用两个@@符号作为前缀
@@error用于表示最近一条sql语句是否有错误,如果正确返回
0
输出语句:
print '该学员Java成绩是'+Convert(varchar(10),@studentResult)
SQL server数据类型的转换
显式转换类型:convert()
Convert(varchar(10),@studentResult)
隐式转换:
Cast(@studentResult as varchar(10))
逻辑控制语句:
在T-SQL语言中,常用的逻辑控制语句有以下几种
顺序结构:begin---end
分支结构:if--else 和case--end
循环结构:while语句
查获某门课程最近一次考试时间的两种方法:
一是:select @date=examdate from..........
二是:通过top关键字
while语句
while(条件)
begin
  语句或语句块
  [break|continue]
end
use MySchool2
declare @minStudentResult int
select @minStudentResult=Min(StudentResult) 
from Result where SubjectNo = 2
print @minStudentResult
while (@minStudentResult<60)
begin
    update Result set StudentResult = StudentResult+2
    where SubjectNo = 2 and StudentResult < 95
    --为了避免出现死循环,需要改变@minStudentResult,以使可以不满足循环条件
    select @minStudentResult=Min(StudentResult) 
    from Result where SubjectNo = 2
    print @minStudentResult
end
print @minStudentResult
go
case 多分支语句
case--end语句计算一组条件表达式,并返回其中一个符合条件的结果
语法:
case
   when  若满足条件1  then 则执行结果1
   when  若满足条件2  then 则执行结果2
   [else 其他结果]
end
记住case 没有begin 
当所有条件都不满足时,则返回null
select *,Level=
case
    when StudentResult>=90 then '优秀'
    when StudentResult>=80 then '良好'
    when StudentResult>=60 then '及格'
    else '不及格'
end
from Result
go
select *,Level = 
case
    when ClassHour>=30 then '重点科目'
    else '一般科目'
end
from Subject
order by Level desc
go
--统计不及格的次数
select 不及格的次数=Count(*),学号=StudentNo,处理=
case
    when Count(*)=1 then '警告'
    when Count(*)=2 or Count(*)=3 then '肄业'
    when Count(*)>3 then '退学'
end
from Result where StudentResult<60
group by StudentNo
go指令:批处理
以一条命令的方式来组织一组命令的过程称为批处理
批处理的好处是能够简化数据库的管理
--在T-SQL中,请问下列打印出来是多少
print 10+10+'10'+'10'---40
go
print '10'+'10'+''+12------1022
go
print '10'+'10'+10+10-----1030
go
print '1994-2-3'------1994-2-3
go
print '1994'-'2'-'3' 出错
go
print '1994'+'2'+10----19952
go
总结:当没有使用数字时,数字字符串相加时,会按照字符串的形式拼凑,但是数字字符串遇到数字时,会被转换成数字
                       第四章:高级查询
本章任务:
 查询指定学生的考试成绩
查询某学期开设的课程
查询某课程最近一次考试缺考的学生名单
检查并更新S1的学生为s2
sql语句综合应用

制作学生成绩单

本章技能:
掌握简单子查询的用法:
包括:in,exist,综合查询
     子查询必须放在括号内,sql server 在执行时,先执行子查询,再执行父查询
因为子查询作为where条件的一部分,所以还可以和update、insert、delete 一起使用
将子查询和比较运算符联合使用,必须保证子查询的返回值不能多于一个
因为子查询是来替换join (关联字段)的,所子查询的关键还是关联字段
在我看来,not exist 就是使括号里的子查询为假
sql中exists,not exists的用法

exists : 强调的是是否返回结果集,不要求知道返回什么, 比如:  select name from student where sex = 'm' and mark exists(select 1 from grade where ...) ,只要exists引导的子句有结果集返回,那么exists这个条件就算成立了,大家注意返回的字段始终为1,如果改成“select 2 from grade where ...”,那么返回的字段就是2,这个数字没有意义。所以exists子句不在乎返回什么,而是在乎是不是有结果集返回。而 exists 与 in 最大的区别在于 in引导的子句只能返回一个字段,比如:  select name from student where sex = 'm' and mark in (select 1,2,3 from grade where ...)  ,in子句返回了三个字段,这是不正确的,exists子句是允许的,但in只允许有一个字段返回,在1,2,3中随便去了两个字段即可。而not exists 和not in 分别是exists 和 in 的 对立面。

exists (sql 返回结果集为真)  not exists (sql 不返回结果集为真)

下面详细描述not exists的过程:

如下:表AID NAME  1   A12   A23   A3表BID AID NAME1   1     B12   2     B2  3   2     B3表A和表B是1对多的关系 A.ID => B.AIDSELECT ID,NAME FROM A WHERE EXISTS (SELECT * FROM B WHERE A.ID=B.AID)执行结果为1 A12 A2原因可以按照如下分析SELECT ID,NAME FROM A WHERE EXISTS (SELECT * FROM B WHERE B.AID=1)--->SELECT * FROM B WHERE B.AID=1有值返回真所以有数据SELECT ID,NAME FROM A WHERE EXISTS (SELECT * FROM B WHERE B.AID=2)--->SELECT * FROM B WHERE B.AID=2有值返回真所以有数据SELECT ID,NAME FROM A WHERE EXISTS (SELECT * FROM B WHERE B.AID=3)--->SELECT * FROM B WHERE B.AID=3无值返回真所以没有数据NOT EXISTS 就是反过来SELECT ID,NAME FROM A WHERE NOT EXIST (SELECT * FROM B WHERE A.ID=B.AID)执行结果为3 A3===========================================================================EXISTS = IN,意思相同不过语法上有点点区别,好像使用IN效率要差点,应该是不会执行索引的原因SELECT ID,NAME FROM A  WHERE ID IN (SELECT AID FROM B)NOT EXISTS = NOT IN ,意思相同不过语法上有点点区别SELECT ID,NAME FROM A WHERE ID NOT IN (SELECT AID FROM B)

正确答案是选项A本题要查询选修了所有课程的学生信息,即查询有些学生没有一门课程他没有选的。如果有一门课没有选,
则此时(1)select * from select_course sc where sc.student_id=ts.id and sc.course_id=c.id 为false,
这说明(2)select * from course c 的查询结果中确实有记录不存在,查询结果返回没有选的课程,
此时select * from student ts 后的not exists 判断结果为false,不执行查询。

  第六章:事务、视图、索引

我 所理解的事务=完成某一件事情的步骤,若其中某一环节出错,则操作失败


  事务:

是一种机制、一个操作序列,它包含了一组数据库操作命令,并把所有的命令作为一个整体一起向系统提交或撤销操作请求(要么成功,要么失败)

是一个不可分割的工作逻辑单元

适用于多用户同时操作的数据库系统(订票系统、银行、保险公司)

一个逻辑工作单元必须有4个属性

原子性:Atomicity

事务的各项元素不可分割(要么成功,要么失败)

必须作为一个整体提交或回滚

(数据)一致性:consistency

钱的总数一致

隔离性:Isolation

事务之间相互独立

持久性:Durability

一旦事务被提交,事务的效果会被永久的保留在数据库中


如何执行事务

begin transaction 

这个语句显示的标记一个事务的起始点

commit transaction

提交成功后,释放连接时占用的资源

rollback transaction

将数据状态回滚到事务开始前

use Myschool2
go
if exists(select * from sysobjects where name='bank')drop table bank 
go
create table bank(customerName char(10) not null,currentMoney money check(currentMoney>=1) not null)
go
insert into bank values('张三',1000)
insert into bank values('李四',1)
go
set nocount on
print '查看转账事务前的余额'
select * from bank
go
begin transaction 
declare @errorsum int  --定义一个值为0的变量为的是作为下面的判断条件
set @errorsum=0
update bank set currentMoney-=500 where customerName='张三'
set @errorsum+=@@error
update bank set currentMoney+=500 where customerName='李四'
set @errorsum+=@@error
print '查看转账事务过程中的余额';select * from bank
if @errorsum <>0
begin
  print '交易失败,回滚事务'
  rollback transaction
end
else
begin 
   print '交易成功,提交事务,写入硬盘,永久保存'
  commit transaction
end
go
print '查看转账事务后的余额'
select * from bank

视图:(是对表的引用,改变视图的数据,也会改变原表的数据)

使用视图的原因:

1:处于安全考虑,用户不必看到整个数据库的结构,而是隐藏部分数据

2:符合用户日常业务逻辑,是他们对数据更容易理解

视图是一种虚拟的表,通常是作为来自一个或多个表的的行或列的子集创建的

视图充当着查询中指定表筛选器,也可基于数据库

if exists(select * from sysobjects where name='vw_student_result')drop view vw_student_result 
go
--创建视图必须是第一条语句,也就是说create前一定要有go
create view vw_student_result 
as
(select studentname,s.StudentNo,StudentResult,SubjectName,ExamDate from student s,result r, Subjects sj where s.StudentNo=r.StudentNo and sj.SubjectNo=r.SubjectNo
and sj.SubjectNo=(select SubjectNo from Subjects where SubjectName='Java Logic')
and ExamDate=(select max(ExamDate) from Result ,Subjects where Result.SubjectNo=Subjects.SubjectNo and SubjectName='Java Logic')) 
go
select * from vw_student_result

    每个视图都可以使用多个表
    与查询相似,一个视图可以嵌套另一个视图,但是最好不要超过3层
    视图定义中的select语句不能包括下列内容
     1 order by 子句,除非在select语句中的选择列表中也有一个top 子句
     2 into 关键字
     3 引用临时表或变量
索引:(说白了就是目录directory/catalogue)
作用:提高数据库的检索速度,改善数据库的性能
适用于大量数据的查询
唯一索引:为了获得最佳性能,人建议使用主键约束

使用聚集索引查询的速度要比非聚集索引速度快

主键是一种约束,唯一索引是一种索引,两者在本质上是不同的。
主键创建后一定包含一个唯一性索引,唯一性索引并不一定就是主键。
唯一性索引列允许空值,而主键列不允许为空值。
主键列在创建时,已经默认为空值 + 唯一索引了。
主键可以被其他表引用为外键,而唯一索引不能。
一个表最多只能创建一个主键,但可以创建多个唯一索引。
主键更适合那些不容易更改的唯一标识,如自动递增列、身份证号等。
主键索引:创建主键自动创建主键索引,主键索引是唯一索引的特殊类型,要求非空唯一
聚集索引:物理顺序与逻辑顺序相同 
一个表只能有一个聚集索引,因为一个表的物理顺序只有一种情况,所以,对应的聚集索引只能有一个

非聚集索引:

适用情况编辑

1、含有大量非重复值的列。
2、使用BETWEEN,>,>=,<或<=返回一个范围值的列
3、被连续访问的列
4、返回大型结果集的查询
5、经常被使用连接或GROUP BY子句的查询访问的列
下面的表总结了何时使用聚集索引或非聚集索引:
动作描述
使用聚集索引
使用非聚集索引
列经常被分组排序
返回某范围内的数据
不应
一个或极少不同值
不应
不应
小数目的不同值
不应
大数目的不同值
不应
频繁更新的列
不应
外键列
主键列
频繁修改索引列
不应
复合索引:
复合索引的结构与电话簿类似,它首先按姓氏对雇员 进行排序,然后按名字对所有姓氏相同的雇员进行排序。如果您知道姓氏,电话簿将非常有用,如果您知道名字和姓氏,电话簿则更为有用,但如果您只知道名字而 不知道姓氏,电话簿将没有用处。
CREATE INDEX name
ON employee (emp_lname, emp_fname)
全文索引:(倒排文档技术。)
是一种特殊类型的基于标记的功能性索引,全文索引主要用于大量文本文字中搜索字符串
效率大于like 关键字

use MySchool2
if exists(select name from sysindexes where name='IX_Result_StudentResult') drop index Result.IX_Result_StudentResult
/*要为哪个表的哪个列--创建非聚集索引,填充因子为30%  */
create nonclustered index IX_Result_StudentResult on Result(studentResult) with fillfactor =30
go
/*指定按索引 IX_Result_StudentResult 查询*/
select s.StudentName,sj.SubjectName,r.ExamDate,r.StudentResult 
from student s,Subjects sj,result r with(index=IX_Result_StudentResult) where s.StudentNo=r.StudentNo and sj.SubjectNo=r.SubjectNo
go
查看索引
用系统存储过程sp_helpindex 
execute sp_helpindex 表名
用视图sys.indexes 查看
select * from sys.indexes 
                   第七章:存储过程
sp (System Stored Procedure) 系统存储过程 
xp(Extend Stored Procedure)  拓展存储过程
parameter 参数
存储过程是在数据库管理系统中保存的、预编译的、能实现某种功能的SQL程序
它是数据库应用中比较广泛的一种数据对象
存储过程是一组预编译的sql的语句,存储过程可以包含数据操纵语言,逻辑控制语句,和调用函数
存储过程可加快查询的执行速度,提高访问数据的速度,帮助实现模块化编程,保持一致性和提高安全性,减少网络流通量
存储过程是个框,什么都可以装
常用的系统存储过程

sp_databases 列出服务器中所有数据库信息,包括名称和大小
sp_helpdb 数据库名  列出指定数据库的所有信息
sp_renamedb
sp_columns 表名
sp_helpconstraint 表名
sp_tables  当前环境下可查询的表或视图信息
sp_help 在help后可以加列名、主键、索引、等
sp_stored_procedures 显示当前数据库存储过程的列表
sp_password 添加或修改登录账户或密码
sp_helptext 显示默认值、未加密的存储过程、用户定义的存储过程、触发器或视图的实际文本
所谓的输出参数就是在外面还需要定义参数来接收
declare@bookid int;
declare@booknumber int;
set@bookid=1;
execStoredProcedureBookNumber @bookid,@booknumber output;
select@booknumber
go

常用的拓展存储过程(Extended Stored Procedures)
拓展存储过程允许使用其他编程语言如【C#】创建外部存储过程
为数据库用户提供从sql server 实例到外部程序的接口,以便进行各种维护活动。
他通常以“xp_”作为前缀,以DDL形式单独存在
一个常用的拓展存储过程为 xp_cmdshell 他可以完成DOS命令下的一些操作
例子:
exec sp_cmdshell 'mkdir D:\project'

create procedure usp_insertSubject @gradeid int,@subName varchar(20),@classHour int
as 
--开始事务
   begin transaction
   declare @error int
   set @error = 0
   insert into Subjects values(@subName,@classHour,@gradeid)
   set @error+=@@error 
   if(@error<>0)
   begin
     print '添加课程'+@subName+'失败'
     rollback transaction
   end
   else
   begin
     print '添加课程'+@subName+'成功'
     declare @gradeName varchar(20)
     declare @subID int
     select @gradeName=GradeName from grade where GradeID in(select gradeid from Subjects where SubjectName=@subName)
     select @subID=SubjectNo from Subjects where SubjectName=@subName
     select 学期编号=@gradeid,学期名称=@gradeName,课程编号是=@subID,课程名称是=@subName
     commit transaction
   end
   go
  execute  usp_insertSubject 1,'Java面向对象编程',140
   go
存储过程中,若有参数有默认值,最好放最后

- - -赋值是=null,判断是is null

        处理错误信息

在实际开发中,往往利用存储过程实现业务处理,使得存储过程变得越来越复杂,这就需要在存储过程中加入错误检查语句
raiseerror('错误提示信息!',16,1)
return--退出存储过程

优化MySchool数据库设计(SQL Server)相关推荐

  1. S2--《优化MySchool数据库设计》总结

    第一章    数据库的设计 1.1  数据库设计 数据库中创建的数据库结构的种类,以及在数据实体之间建立的复杂关系是决定数据库系统效率的重要因素. 糟糕的数据库设计表现在以下两个方面: *效率低下 * ...

  2. 数据库设计-SQL Server开发实现学习

    1.目录 SQL Server数据库基础 T-SQL语言编程框架 实例规范:项目 笔记1 SQL Server数据库基础 1. 1数据库及其对象 SQLserver的数据库是所涉及的对象以及数据的集合 ...

  3. 学生成绩管理系统数据库设计--MySQLSQL Server

    MySQL 数据库设计-学生成绩管理系统 设计大纲 友情链接 1.医疗信息管理系统数据库–MySQL 2.邮件管理数据库设计–MySQL 3.点餐系统数据库设计–SQL Server 4.商品管理系统 ...

  4. 使用PowerDesigner 设计SQL Server 数据库

    工具: Sybase PowerDesigner 12.5 Microsoft  SQL Server 2005 第一步:概念数据模型 打开PowerDesigner 软件,设计"概念数据模 ...

  5. sql数据库服务器怎么看性能,如何让你的SQL运行得更快!-数据库专栏,SQL Server

    一.不合理的索引设计 --例:表record有620000行,试看在不同的索引下,下面几个 sql的运行情况: -- 1.在date上建有一非个群集索引 select count(*) from re ...

  6. 应用程序的数据库从Sql Server迁移到Oracle

    应用程序的数据库从Sql Server迁移到Oracle 迁移案例一:数据库: Sql Server 2008到Oracle 9i 工具: Sybase PowerDesiner 12 试用版, PL ...

  7. 使用Microsoft数据迁移助手在Oracle数据库和SQL Server之间迁移的具体示例

    介绍 (Introduction) Intended audience 目标听众 This document is intended for application developers and da ...

  8. 使用数据库维护计划SQL Server更新统计信息

    This article explores SQL Server Update Statistics using the database maintenance plan. 本文探索使用数据库维护计 ...

  9. C# 自制微信登录窗口,100%还原,数据库(SQL Server)

    C# 自制微信登录窗口,100%还原,数据库(SQL Server) 看着还不错吧,源文件包含数据库链接类,以及窗体设计,需要的可以下载哦,欢迎留言交流 https://download.csdn.n ...

最新文章

  1. sklearn RandomForest(随机森林)模型使用RandomSearchCV获取最优参数及模型效能可视化
  2. Cissp-【第3章 安全工程】-2021-2-18(237页-248页)
  3. 【leetcode】500. Keyboard Row
  4. C/C++之动态分配内存
  5. C++覆盖和重载的区别
  6. GATT之Device information Service
  7. shell printf命令:格式化输出语句
  8. Debian/Ubuntu下安装Apache的Mod_Rewrite模块的步骤分享
  9. python if语句 for语句 while语句
  10. 【比原链】比原启动后去哪里连接别的节点
  11. ubuntu 截图快捷键设置
  12. python用双重循环输出菱形图案_使用循环创建菱形图案
  13. C语言--指针之空指针(void *)
  14. c语言停车场程序设计,停车场模拟管理程序的设计与实现,高手指教
  15. 什么是闭包,对闭包的理解,闭包的用途及优缺点
  16. XILINX FPGA+RK3399 PCIE X4
  17. 详细讲解go web框架之gin框架源码解析记录及思路流程和理解
  18. java中abstract详解
  19. 【买卖股票的最佳时机】
  20. 安卓Android版AutoCAD WS发布

热门文章

  1. python 制作淘宝秒杀脚本
  2. 美团小哥用计算机,美团2020算法工程师编程题--外卖小哥的保温箱
  3. 蓝桥杯嵌入式基于STM32G4的模块总结【HAL库】【省赛】
  4. 使用计算机录制声音10,Win10怎么录制电脑内部声音 Win10电脑自身录音教程
  5. 时光穿梭机(删除文件)
  6. ZO-Adam/ZO-Newton
  7. Git基础之(三)——时光穿梭机
  8. 学习太极创客 — MQTT 第二章(一)QoS 服务质量等级
  9. buu firmware
  10. 关于pyrit安装失败最新解决