From 8c1676c2b474c0a7d1faf45a956162b754917763 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=90=B4=E6=98=8E=E6=9D=B0?= <3090356592@qq.com> Date: Sat, 3 Sep 2022 18:26:08 +0800 Subject: [PATCH] 9.1 --- ...56\345\272\223\350\256\276\350\256\241.md" | 165 ++++++++++++++++++ ...72\350\241\250\347\273\203\344\271\240.md" | 5 +- ...45\350\257\242\347\273\203\344\271\240.md" | 18 +- ...74\345\220\210\347\273\203\344\271\240.md" | 18 +- ...41\344\270\211\350\214\203\345\274\217.md" | 138 +++++++++++++++ 5 files changed, 341 insertions(+), 3 deletions(-) create mode 100644 "15\345\220\264\346\230\216\346\235\260/\347\254\224\350\256\260/\344\270\200\343\200\201\346\225\260\346\215\256\345\272\223\350\256\276\350\256\241.md" rename "15\345\220\264\346\230\216\346\235\260/220829\345\273\272\350\241\250\347\273\203\344\271\240.md" => "15\345\220\264\346\230\216\346\235\260/\347\273\203\344\271\240/220829\345\273\272\350\241\250\347\273\203\344\271\240.md" (97%) rename "15\345\220\264\346\230\216\346\235\260/220830-\346\237\245\350\257\242\347\273\203\344\271\240.md" => "15\345\220\264\346\230\216\346\235\260/\347\273\203\344\271\240/220830-\346\237\245\350\257\242\347\273\203\344\271\240.md" (96%) rename "15\345\220\264\346\230\216\346\235\260/220831-\347\273\274\345\220\210\347\273\203\344\271\240.md" => "15\345\220\264\346\230\216\346\235\260/\347\273\203\344\271\240/220831-\347\273\274\345\220\210\347\273\203\344\271\240.md" (95%) create mode 100644 "15\345\220\264\346\230\216\346\235\260/\347\273\203\344\271\240/220901-\346\225\260\346\215\256\345\272\223\350\256\276\350\256\241\344\270\211\350\214\203\345\274\217.md" diff --git "a/15\345\220\264\346\230\216\346\235\260/\347\254\224\350\256\260/\344\270\200\343\200\201\346\225\260\346\215\256\345\272\223\350\256\276\350\256\241.md" "b/15\345\220\264\346\230\216\346\235\260/\347\254\224\350\256\260/\344\270\200\343\200\201\346\225\260\346\215\256\345\272\223\350\256\276\350\256\241.md" new file mode 100644 index 0000000..f0aa245 --- /dev/null +++ "b/15\345\220\264\346\230\216\346\235\260/\347\254\224\350\256\260/\344\270\200\343\200\201\346\225\260\346\215\256\345\272\223\350\256\276\350\256\241.md" @@ -0,0 +1,165 @@ +# 一、数据库设计 + +## (一)什么是数据库设计? + +规划和结构化数据库中的数据对象及这些数据之间关系的过程 + +### 1.良好的数据库设计 + +- 节省数据的存储空间 +- 能够保证数据的完整性 +- 方便进行数据库应用系统的开发 + +### 2.糟糕的数据库设计 + +- 数据冗余、存储空间浪费 +- 内存空间浪费 +- 数据更新和插入异常 + +### 3.查看数据库关系图 + +双击目标数据库展开->数据库关系图->新建数据库关系图->添加表 + +******** + +## (二)数据库设计步骤 + +分为6个阶段: + +1. 需求分析阶段:分析客户的业务和数据处理需求 +2. 概要设计阶段:设计数据库的E-R模型图,确认需求信息的正确和完整性 +3. 详细设计阶段:应用三大范式审核数据库结构 +4. 代码编写阶段:物理实现数据库,编码实现应用 +5. 软件测试阶段 +6. 安装部署 + +***** + +### 1.需求分析 + +1. 收集信息 + + 与该系统有关人员进行交流、座谈,充分了解用户需求,理解数据库需要完成的任务 + +2. 标识实体 + + 标识数据库要管理的关键对象或实体,实体一般是名词 + +3. 标识每个实体的属性 + + 就是字段或者列 + +4. 标识实体之间的关系 + +******* + +### 2.概要设计 + +#### 2.1绘制E-R图 + +- 正方形:实体,一般是名词 +- 椭圆形:属性,一般是名词 +- 菱形:关系,一般是动词 + +******* + +#### ==2.2实体—关系== + +- **实体**:凡是可以互相区别而被人们认识的事、物、概念等统统抽象为实体 +- **属性**:实体一般具有若干特征,称之为实体的属性;属性对应表中的列 +- **关系**:实体与实体之间的关系抽象为联系 + +***** + +#### 2.3映射基数 + +- 一对一:汽车和停车位的关系(一辆车停一个车位) +- 一对多:客房和客人的关系(一个客房可以住多个客人) +- 多对一 +- 多对多:学生和教师的关系(一个教师可以教多个学生,一个学生可以听多名教师讲课) + +***** + +#### 2.4转化E-R图为数据库模型图 + +==使用Microsoft Visio 2010== + +cdm表:单纯看结构 + +![image-20220901111541826](%E4%B8%80%E3%80%81%E6%95%B0%E6%8D%AE%E5%BA%93%E8%AE%BE%E8%AE%A1.assets/image-20220901111541826.png) + +pdm表:有多对多关系需要加一个表,设置联合主键 + +![image-20220901111648963](%E4%B8%80%E3%80%81%E6%95%B0%E6%8D%AE%E5%BA%93%E8%AE%BE%E8%AE%A1.assets/image-20220901111648963.png) + +多 指向---> 一 + +- 将各实体转换为对应的表,将各属性转换为各表对应的列 +- 标识每个表的主键列. +- 在表之间建立主外键,体现实体之间的映射关系 + +******* + +## (三)数据库设计 三大范式 + +### 1.了解规范和不规范设计 + +**不规范的表设计** + +>- 信息重复 +>- 更新异常 +>- 插入异常:无法正确表示信息 +>- 删除异常:丢失有效信息 + +****** + +**规范的表设计** + +> - 尽可能少的数据冗余 +> - 没有插入异常 +> - 没有删除异常 +> - 没有更新异常 + +### 2.第一范式(1NF) + +==关系中的每个属性必须是不可再分的简单项==,不能是属性组合,即属性的取值必须是不可拆分的原子值 + +比如一个地址列,中国北京市 拆成 中国 北京 + +(根据情况而定) + +******** + +### 3.第二范式(2NF) + +==表必须符合第一范式 ,表中的每列必须依赖主键== + +就是要求每个表只描述一件事情 + +比如: + +| 学号 | 姓名 | 课程号 | 课程名称 | 成绩 | +| ---- | ---- | ------ | --------- | ---- | +| s001 | 张三 | k001 | java | 60 | +| s002 | 李四 | k001 | sqlserver | 75 | +| s001 | 张三 | k002 | java | 95 | + +因为没有合适的主键会用联合主键学号和课程号,会出现部分依赖,成绩依赖于课程,课程依赖于课程号,姓名依赖于学号 + +要消除部分依赖,即把字段拆开形成新的表:学生表 课程表 成绩表 + +**** + +### 4.第三范式(3NF) + +**确保每列都和主键列直接相关,而不是间接相关** + +定义: + +==如果一个关系满足2NF,并且除了主键外的其他列既不部份依赖也不传递依赖于主键列,则满足第三范式== + +C依赖B依赖A就叫做**传递依赖** + +******* + +==规范过程即拆分过程:把表分的非常细,一旦出现多对一就会有主外键关系,N->1== \ No newline at end of file diff --git "a/15\345\220\264\346\230\216\346\235\260/220829\345\273\272\350\241\250\347\273\203\344\271\240.md" "b/15\345\220\264\346\230\216\346\235\260/\347\273\203\344\271\240/220829\345\273\272\350\241\250\347\273\203\344\271\240.md" similarity index 97% rename from "15\345\220\264\346\230\216\346\235\260/220829\345\273\272\350\241\250\347\273\203\344\271\240.md" rename to "15\345\220\264\346\230\216\346\235\260/\347\273\203\344\271\240/220829\345\273\272\350\241\250\347\273\203\344\271\240.md" index fb5dd34..fc318bc 100644 --- "a/15\345\220\264\346\230\216\346\235\260/220829\345\273\272\350\241\250\347\273\203\344\271\240.md" +++ "b/15\345\220\264\346\230\216\346\235\260/\347\273\203\344\271\240/220829\345\273\272\350\241\250\347\273\203\344\271\240.md" @@ -1,3 +1,4 @@ +```sql create database DBTEST go use DBTEST @@ -62,4 +63,6 @@ insert worklnfo values select * from sectionlnfo select * from userlnfo -select * from worklnfo \ No newline at end of file +select * from worklnfo +``` + diff --git "a/15\345\220\264\346\230\216\346\235\260/220830-\346\237\245\350\257\242\347\273\203\344\271\240.md" "b/15\345\220\264\346\230\216\346\235\260/\347\273\203\344\271\240/220830-\346\237\245\350\257\242\347\273\203\344\271\240.md" similarity index 96% rename from "15\345\220\264\346\230\216\346\235\260/220830-\346\237\245\350\257\242\347\273\203\344\271\240.md" rename to "15\345\220\264\346\230\216\346\235\260/\347\273\203\344\271\240/220830-\346\237\245\350\257\242\347\273\203\344\271\240.md" index f5641f2..b6153f6 100644 --- "a/15\345\220\264\346\230\216\346\235\260/220830-\346\237\245\350\257\242\347\273\203\344\271\240.md" +++ "b/15\345\220\264\346\230\216\346\235\260/\347\273\203\344\271\240/220830-\346\237\245\350\257\242\347\273\203\344\271\240.md" @@ -1,10 +1,17 @@ --4. 查询公司员工所在城市(不需要重复数据) + +``` select distinct PeopleAddress from People +``` + --5. 假设工资普调10%,查询原始工资和调整后的工资,显示(姓名,性别,月薪,加薪后的月薪)(添加列查询)。 +``` select top 10 percent * from People ------- +``` --16. 查询出巨蟹 6.22--7.22 的员工信息 + +``` select * from People where (month(PeopleBirth) = 6 and DAY(PeopleBirth) >= 22) or (month(PeopleBirth) = 7 and DAY(PeopleBirth) <= 22) @@ -12,13 +19,22 @@ select * from People where select * from People where PeopleSalary >( select PeopleSalary from People where PeopleName='赵云' ) +``` --18. 查询出和赵云在同一个城市的人 + +``` select * from People where PeopleAddress in( select PeopleAddress from People where PeopleName='赵云' ) +``` + --19. 查询出生肖为鼠的人员信息 + +``` select * from People where year(PeopleBirth) % 12 = 4 +``` + --20. 查询所有员工信息,添加一列显示属相(鼠,牛,虎,兔,龙,蛇,马,羊,猴,鸡,狗,猪) ``` diff --git "a/15\345\220\264\346\230\216\346\235\260/220831-\347\273\274\345\220\210\347\273\203\344\271\240.md" "b/15\345\220\264\346\230\216\346\235\260/\347\273\203\344\271\240/220831-\347\273\274\345\220\210\347\273\203\344\271\240.md" similarity index 95% rename from "15\345\220\264\346\230\216\346\235\260/220831-\347\273\274\345\220\210\347\273\203\344\271\240.md" rename to "15\345\220\264\346\230\216\346\235\260/\347\273\203\344\271\240/220831-\347\273\274\345\220\210\347\273\203\344\271\240.md" index e0bcae5..5b53b03 100644 --- "a/15\345\220\264\346\230\216\346\235\260/220831-\347\273\274\345\220\210\347\273\203\344\271\240.md" +++ "b/15\345\220\264\346\230\216\346\235\260/\347\273\203\344\271\240/220831-\347\273\274\345\220\210\347\273\203\344\271\240.md" @@ -3,30 +3,46 @@ select * from [Rank] select * from People --1. 查询出武汉地区所有的员工信息,要求显示部门名称以及员工的详细资料 + +``` select p.*,DepartmentName from People p join Department d on p.DepartmentId=d.DepartmentId where PeopleAddress='武汉' +``` --2. 查询出武汉地区所有的员工信息,要求显示部门名称,职级名称以及员工的详细资料 + +``` select p.*,DepartmentName,RankName from People p join Department d on p.DepartmentId=d.DepartmentId join [Rank]r on p.RankId=r.RankId where PeopleAddress='武汉' +``` --3. 根据部门分组统计员工人数,员工工资总和,平均工资,最高工资和最低工资。 + +``` select DepartmentName,count(*) 员工人数,sum(PeopleSalary) 工资总和,avg(PeopleSalary) 平均工资,max(PeopleSalary)最高工资,min(PeopleSalary)最低工资 from People p join Department d on p.DepartmentId=d.DepartmentId group by DepartmentName +``` --4. 根据部门分组统计员工人数,员工工资总和,平均工资,最高工资和最低工资,平均工资在10000 以下的不参与统计,并且根据平均工资降序排列。 + +``` select DepartmentName,count(*) 员工人数,sum(PeopleSalary) 工资总和,avg(PeopleSalary) 平均工资,max(PeopleSalary)最高工资,min(PeopleSalary)最低工资 from People p join Department d on p.DepartmentId=d.DepartmentId group by DepartmentName having avg(PeopleSalary)>10000 order by avg(PeopleSalary) desc +``` --5. 根据部门名称,然后根据职位名称,分组统计员工人数,员工工资总和,平均工资,最高工资和最低工资 + +``` select DepartmentName, RankName,count(*) 员工人数,sum(PeopleSalary) 工资总和,avg(PeopleSalary) 平均工资,max(PeopleSalary)最高工资,min(PeopleSalary)最低工资 from People p join Department d on p.DepartmentId=d.DepartmentId join [Rank]r on p.RankId=r.RankId -group by DepartmentName,RankName \ No newline at end of file +group by DepartmentName,RankName +``` + diff --git "a/15\345\220\264\346\230\216\346\235\260/\347\273\203\344\271\240/220901-\346\225\260\346\215\256\345\272\223\350\256\276\350\256\241\344\270\211\350\214\203\345\274\217.md" "b/15\345\220\264\346\230\216\346\235\260/\347\273\203\344\271\240/220901-\346\225\260\346\215\256\345\272\223\350\256\276\350\256\241\344\270\211\350\214\203\345\274\217.md" new file mode 100644 index 0000000..cddf8a8 --- /dev/null +++ "b/15\345\220\264\346\230\216\346\235\260/\347\273\203\344\271\240/220901-\346\225\260\346\215\256\345\272\223\350\256\276\350\256\241\344\270\211\350\214\203\345\274\217.md" @@ -0,0 +1,138 @@ +```sql +create database Rabobank +go +use Rabobank +go +create table [user](--账号信息表 + useNO int primary key identity(1,1),--用户id + useName nvarchar(20) ,--用户姓名 + usephone char(11) unique,--手机号 + usepcard int check(usepcard<=3),--拥有卡的数量 + useAge int check(useAge between 18 and 100),--用户年龄 + useSex varchar(10) check(useSex in ('男','女'))--用户性别 +) +go + +create table bankcard--银行卡表 +( + banCardNO char(16) primary key ,--银行卡号 + remaining decimal(12,2),--余额 + banpass varchar(30) check(len(banpass)>=8),--密码 + useNO int references [user](useNO)--用户id +) +go + +create table Transinfo(--交易信息表 + traNO int primary key identity(1,1),--交易id + traTime date ,--交易时间 + trastype varchar(20) check(trastype in ('存钱','取钱')), --交易类型 + trasmoney decimal(12,2),--交易金额 + banNO char(16) references bankcard(banCardNO)--交易卡号 +) +go + +create table [transfer](--转账表 + tranNO int primary key identity(1,1),--交易id + tranTime date ,--交易时间 + transmoney decimal(12,2),--交易金额 + banNO char(16) references bankcard(banCardNO),--交易卡号 + trancaed char(16),--接收账号 +) +go + +create table Ttype(--银行卡状态表 + Tno int primary key identity(1,1),--状态id + banNO char(16) references bankcard(banCardNO),--卡号 + tType varchar(20) check(tType in('正常','挂失','冻结','注销')) +) + +insert [user] values +('张三',17828902422,1,20,'女'), +('李四',18528944562,1,18,'男'), +('王五',15856212433,1,19,'男') +go + +insert bankcard values +(5896549536512458,200,12345678,1), +(3659854652135654,25000,12345678,2), +(2365984512369411,10000,12345678,3) +go + +create trigger tr1_Transinfo +on Transinfo +for insert +as + declare @banNO char(16) --交易卡号 + declare @trastype char(16)--交易类型 + declare @smoney decimal(12,2)--金额 + declare @smoneyh decimal(12,2)--更新后的金额 + select @banNO=banNO,@trastype=trastype,@smoney=trasmoney from Transinfo + if(@trastype='取钱') + begin + update bankcard set @smoneyh=remaining-@smoney where banCardNO=@banNO + if(@smoneyh>0) + begin + update bankcard set remaining=remaining-@smoney where banCardNO=@banNO + end + else + begin + print'交易失败' + rollback transaction + end + + end + else + begin + update bankcard set remaining=remaining+@smoney where banCardNO=@banNO + end +go + +create trigger tr2_transfer +on [transfer] +for insert +as + declare @banNO char(16) --交易卡号 + declare @smoney decimal(12,2)--金额 + declare @smoneyh decimal(12,2)--更新后的金额 + declare @trancaed char(16)--接收卡号 + select @banNO=banNO,@smoney=transmoney,@trancaed=trancaed from [transfer] + update bankcard set @smoneyh=remaining-@smoney where banCardNO=@banNO + + if(@smoneyh>0) + begin + update bankcard set remaining=remaining-@smoney where banCardNO=@banNO + + update bankcard set remaining=remaining+@smoney where banCardNO=@trancaed + end + else + begin + print'交易失败' + rollback transaction + end +go + +insert Transinfo values +(GETDATE(),'取钱',50,5896549536512458), +(GETDATE(),'取钱',5000,3659854652135654), +(GETDATE(),'存钱',500,2365984512369411) +go + + +insert [transfer] values +(GETDATE(),500,2365984512369411,5896549536512458) +go + + +insert Ttype values +(2365984512369411,'正常'), +(5896549536512458,'正常'), +(3659854652135654,'正常') + +select * from [user] +select * from bankcard +select * from Transinfo +select * from [transfer] +select * from Ttype + +``` + -- Gitee