diff --git "a/13 \346\264\252\347\201\277\350\212\263/\344\275\234\344\270\232/8.29 day1\344\275\234\344\270\232.md" "b/13 \346\264\252\347\201\277\350\212\263/\344\275\234\344\270\232/8.29 day1\345\273\272\345\272\223\344\275\234\344\270\232.md" similarity index 100% rename from "13 \346\264\252\347\201\277\350\212\263/\344\275\234\344\270\232/8.29 day1\344\275\234\344\270\232.md" rename to "13 \346\264\252\347\201\277\350\212\263/\344\275\234\344\270\232/8.29 day1\345\273\272\345\272\223\344\275\234\344\270\232.md" diff --git "a/13 \346\264\252\347\201\277\350\212\263/\344\275\234\344\270\232/8.30 day2 \344\275\234\344\270\232.md" "b/13 \346\264\252\347\201\277\350\212\263/\344\275\234\344\270\232/8.30 day2 \346\237\245\350\257\242\344\275\234\344\270\232.md" similarity index 100% rename from "13 \346\264\252\347\201\277\350\212\263/\344\275\234\344\270\232/8.30 day2 \344\275\234\344\270\232.md" rename to "13 \346\264\252\347\201\277\350\212\263/\344\275\234\344\270\232/8.30 day2 \346\237\245\350\257\242\344\275\234\344\270\232.md" diff --git "a/13 \346\264\252\347\201\277\350\212\263/\344\275\234\344\270\232/9.1 day4 \346\225\260\346\215\256\345\272\223\350\256\276\350\256\241\344\275\234\344\270\232.md" "b/13 \346\264\252\347\201\277\350\212\263/\344\275\234\344\270\232/9.1 day4 \346\225\260\346\215\256\345\272\223\350\256\276\350\256\241\344\275\234\344\270\232.md" new file mode 100644 index 0000000000000000000000000000000000000000..52e92d44a0107ddbd36317f39c6158093c054870 --- /dev/null +++ "b/13 \346\264\252\347\201\277\350\212\263/\344\275\234\344\270\232/9.1 day4 \346\225\260\346\215\256\345\272\223\350\256\276\350\256\241\344\275\234\344\270\232.md" @@ -0,0 +1,85 @@ +# 9.1 day4 数据库设计作业 + +## 1.第一题 + +1. 数据库E-R图设计(cdm,pdm):某教学管理系统涉及教员、学生、课程、教室四个实体,他们分别具有下列属性: + + 教师:教室号, 姓名,年龄,职称 学生:学号、姓名、年龄、性别 + + 课程:课程号、课程名、课时数 教室:教室编号、地址 + + 这些实体间的联系如下:一个教师可讲授多门课程,一个课程只能被一个教师讲授:一个学生选修多门课程,每门课程有多个学生选修,学生学习有成绩,一门课只在一个教室上,一个教室可上多门课。 + + 请画出教员,学生,课程,教室的E-R图 + + ![](C:\Users\24090\Desktop\git\advanced-sql\13 洪灿芳\作业\img\9.1\9.1-1.jpg) + +## 2.第二题 + +2.**业务需求说明:** +模拟银行业务,设计简易版的银行数据库表结构,要求可以完成以下基本功能需求: +1.银行开户(注册个人信息)及开卡(办理银行卡)(一个人可以办理多张银行卡,但是最多只能办理3张) +2.存钱 +3.查询余额 +4.取钱 +5.转账 +6.查看交易记录 +7.账户挂失 +8.账户注销 + +**表设计:** + +1.账户信息表:存储个人信息。 +2.银行卡表:存储银行卡信息。 +3.交易信息表(存储存钱和取钱的记录) +4.转账信息表(存储转账信息记录) +5.状态信息变化表(存储银行卡状态变化的记录,状态有1:正常,2:挂失,3:冻结,4:注销) + +![](C:\Users\24090\Desktop\git\advanced-sql\13 洪灿芳\作业\img\9.1\9.1-2.jpg) + +### 2.1建表 + +```sql +create database Bank +go +use Bank +go +--客户信息表 +create table Customerinfo( + CustimerId int primary key check(len(custimerid)=17) ,--身份id + CustName varchar(20) not null,--姓名 + Quantity int not null check(len(Quantity) <= 3) --银行卡数量 +) +go +--银行卡卡号以及存款 +create table Bankcard( + CustId int references Customerinfo(CustimerId),--身份外键 + BankId int check(Len(BankId)=18) primary key, --卡号 + Balance decimal(20,2) --存款 +) +go +--存取款记录 +create table Dealinfo( + odd int primary key,--交易单号 + BankId int references Bankcard (BankId), --卡号外键 + saveup decimal(20,2) not null, --存款 + fetchup decimal(20,2) not null, --取款 + tradinghour datetime not null, --交易时间 +) +go +--转账信息 +create table transferrecord( + odd int primary key,--交易单号 + BankId int references Bankcard (BankId), --卡号外键 + BankId2 int check(Len(BankId)=18), --转入的卡号 + Moneys decimal(20,2) not null ,--金额 +) +go +--状态 +create table states( + BankId int references Bankcard (BankId), + States varchar(8) check(States ='正常' or States ='挂失' or States ='冻结' or States ='注销') +) +go +``` + diff --git "a/13 \346\264\252\347\201\277\350\212\263/\344\275\234\344\270\232/img/9.1/9.1-1.jpg" "b/13 \346\264\252\347\201\277\350\212\263/\344\275\234\344\270\232/img/9.1/9.1-1.jpg" new file mode 100644 index 0000000000000000000000000000000000000000..fac66ce384d4d6d3c650813988325ec114528fd4 Binary files /dev/null and "b/13 \346\264\252\347\201\277\350\212\263/\344\275\234\344\270\232/img/9.1/9.1-1.jpg" differ diff --git "a/13 \346\264\252\347\201\277\350\212\263/\344\275\234\344\270\232/img/9.1/9.1-2.jpg" "b/13 \346\264\252\347\201\277\350\212\263/\344\275\234\344\270\232/img/9.1/9.1-2.jpg" new file mode 100644 index 0000000000000000000000000000000000000000..b01fb98df2c329ade3f66fe9a4d1ecbf5621e4d6 Binary files /dev/null and "b/13 \346\264\252\347\201\277\350\212\263/\344\275\234\344\270\232/img/9.1/9.1-2.jpg" differ diff --git "a/13 \346\264\252\347\201\277\350\212\263/\347\254\224\350\256\260/Sql server \351\253\230\347\272\247\347\254\224\350\256\260.md" "b/13 \346\264\252\347\201\277\350\212\263/\347\254\224\350\256\260/Sql server \351\253\230\347\272\247\347\254\224\350\256\260.md" new file mode 100644 index 0000000000000000000000000000000000000000..ab028bd109f0fd960ddacd7729f31faf1005998c --- /dev/null +++ "b/13 \346\264\252\347\201\277\350\212\263/\347\254\224\350\256\260/Sql server \351\253\230\347\272\247\347\254\224\350\256\260.md" @@ -0,0 +1,218 @@ +# Sql server 高级笔记 + +## 1.常用的运算符 + +```sql +=:等于,比较是否相等及赋值 +!=:比较不等于 +>:比较大于 +<:比较小于 +>=:比较大于等于 +<=:比较小于等于 +IS NULL:比较为空 +IS NOT NULL:比较不为空 +in:比较是否在其中 +like:模糊查询 +BETWEEN...AND...:比较是否在两者之间 50-100 BETWEEN 50 AND 100 +and:逻辑与(两个条件同时成立表达式成立) +or:逻辑或(两个条件有一个成立表达式成立) +not:逻辑非(条件成立,表达式则不成立;条件不成立,表达式则成立) +``` + +## 2.常用的聚合函数以及时间函数 + +```Sql +count:求数量 +max:求最大值 +min:求最小值 +sum:求和 +avg:求平均值 + +--时间函数 +select DATEDIFF(day, '2019-08-20', getDate()); --获取指定时间单位的差值 +SELECT DATEADD(MINUTE,-5,GETDATE()) --加减时间,此处为获取五分钟前的时间,MINUTE 表示分钟,可为 YEAR,MONTH,DAY,HOUR +select DATENAME(month, getDate()); --当前月份 +select DATENAME(WEEKDAY, getDate()); --当前星期几 +select DATEPART(month, getDate()); --当前月份 +select DAY(getDate()); --返回当前日期天数 +select MONTH(getDate()); --返回当前日期月数 +select YEAR(getDate()); --返回当前日期年数 + +SELECT CONVERT(VARCHAR(22),GETDATE(),20) --2020-01-09 14:46:46 +SELECT CONVERT(VARCHAR(24),GETDATE(),21) --2020-01-09 14:46:55.91 +SELECT CONVERT(VARCHAR(22),GETDATE(),23) --2020-01-09 +SELECT CONVERT(VARCHAR(22),GETDATE(),24) --15:04:07 +Select CONVERT(varchar(20),GETDATE(),14) --15:05:49:330 +``` + +### 2.1 时间格式字符串 + +| 名称 | 日期单位 | 缩写 | +| ------------ | ----------- | --------- | +| 年 | year | yyyy 或yy | +| 季度 | quarter | qq,q | +| 月 | month | mm,m | +| 一年中第几天 | dayofyear | dy,y | +| 日 | day | dd,d | +| 一年中第几周 | week | wk,ww | +| 星期 | weekday | dw | +| 小时 | Hour | hh | +| 分钟 | minute | mi,n | +| 秒 | second | ss,s | +| 毫秒 | millisecond | ms | + +## 3.数据库的设计 + +### 3.1什么是ER图 + +ER图中E代表Entity实体 R代表Relationship关系,总结来说ER图就是在项目开始前设计数据库模型时用来直观表示概念模型的工具。 + +### 3.2常用的数据模型 + +常用的数据数据模型有 + +#### 实体联系模型 + +客观存在并且可以相互区别的事务一般称为实体,实体也可以指具体的对象如一名学生,也可以指抽象的事件 比如一次比赛等 + +**实体模型就是ER模型 也就是ER图** + +#### 结构数据模型 + +#### 面向对象模型 + +### 3.3ER图跟关系模型的转换 + +关系模型可以分为 + +#### 1-1 + +1对1 可以转换成一个独立的关系模式 + +1对1的关系可以直接与其他关系合并(只要在任意一边加入对方的主键,并且属性有联系即可) + +#### 1-N or N-1 + +1-N 可以转换成一个独立的关系模式 + +把 1 的主键放入N做外键就可以合并起来成一个关系模式 + +#### M-N(多对多) + +要转换成独立的关系模式的话 就需要重新建一张表 并且把双方的主键都加入 + +## 4.数据的规范化(范式) + +为了建立冗余较小、结构合理的数据库,设计数据库时必须遵循一定的规则。在关系型数据库中这种规则就称为范式。范式是符合某一种设计要求的总结。要想设计一个结构合理的关系型数据库,必须满足一定的范式。 + +### 4.1 第一范式(1NF) + +数据库中所有的属性字段都是不可分解的,即我们创建的属性在此字段中一定是你设计表的最小的字段值,遵循数据的原子性 + +**设计关系型数据库 满足第一范式是最基本的要求** + +第一范式(1NF)是指数据库表的每一列都是不可分割的基本数据项,同一列中不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性。如果出现重复的属性,就可能需要定义一个新的实体,新的实体由重复的属性构成,新实体与原实体之间为一对多关系。在第一范式(1NF)中表的每一行只包含一个实例的信息。 + +例如 + +| 订单号 | 日期 | 用户id | 用户名称 | 产品编码 | 产品名称 | 数量 | +| ------ | ----- | ------ | -------- | --------- | ------------- | ---- | +| X2001 | 12-02 | U001 | 白展堂 | P101,P102 | 路由器,充电宝 | 1,1 | +| X2002 | 11-30 | U002 | 吕秀才 | P203,P304 | 手机,电脑 | 2,1 | +| X2003 | 11-11 | U003 | 郭老板 | P101,P102 | 路由器,充电宝 | 1,1 | + +在单元格产品编码、产品名称、数量中 拥有多个值的字段 ,它即没有满足我们的第一范式,即数据只能为原子性,它在单元格中存储了多个值。 + +如过要满足第一范式就应该将其拆分出来新建两张表:订单表和订单信息表 + +订单表 + +| 订单号 | 日期 | 用户id | 用户名称 | +| ------ | ----- | ------ | -------- | +| X2001 | 12-2 | U001 | 白展堂 | +| X2002 | 11-30 | U002 | 吕秀才 | +| X2003 | 11-11 | U003 | 郭老板 | + +订单信息表 + +| 订单号 | 产品编码 | 产品名称 | 单价 | 数量 | +| ------ | -------- | -------- | ---- | ---- | +| X2001 | P101 | 路由器 | 137 | 1 | +| X2001 | P102 | 充电宝 | 69 | 1 | +| X2002 | P203 | 手机 | 1999 | 2 | +| X2001 | P304 | 电脑 | 7865 | 1 | +| X2001 | P101 | 路由器 | 137 | 1 | +| X2002 | P202 | 充电宝 | 69 | 1 | + +以上方式就满足了第一范式 + +### 4.2 第二范式(2NF) + +第二范式:在满足第一范式的同时 表中的字段必须依赖于这张表的主键 + +从订单信息表中可以看出 + +| 订单号 | 产品编码 | 产品名称 | 单价 | 数量 | +| ------ | -------- | -------- | ---- | ---- | +| X2001 | P101 | 路由器 | 137 | 1 | +| X2001 | P102 | 充电宝 | 69 | 1 | +| X2002 | P203 | 手机 | 1999 | 2 | +| X2001 | P304 | 电脑 | 7865 | 1 | +| X2001 | P101 | 路由器 | 137 | 1 | +| X2002 | P202 | 充电宝 | 69 | 1 | + +如果想添加一个新的产品进入数据库时,就必须添加一份新订单,否则无法添加 + +联系第二范式就可以发现,这张表其实有两个主键:订单号和产品编号,而产品名称,单价都于订单号这一个主键没有关系,所以这张表没有满足第二范式 + +如果要满足第二范式的话就需要进行拆分成两张表 如 + +产品表 + +| 产品编号 | 产品名称 | 单价 | +| -------- | -------- | ---- | +| P101 | 路由器 | 137 | +| P102 | 充电宝 | 69 | +| P203 | 手机 | 1999 | +| P304 | 电脑 | 7865 | + +订单信息表 + +| 订单号 | 产品编码 | 数量 | +| ------ | -------- | ---- | +| X2001 | P101 | 1 | +| X2001 | P102 | 1 | +| X2002 | P203 | 2 | +| X2001 | P304 | 1 | +| X2001 | P101 | 1 | +| X2002 | P202 | 1 | + +## 4.3 第三范式(3NF) + +第三范式:如果一个关系满足第二范式,并且除了主键以外的其他列都依赖,且直接于主键列,则满足第三范式(3NF) + +简单来说就是,将表继续进行拆分使所有的列都直接属于该表的主键类 + +例如 + +订单表 + +| 订单号 | 日期 | 用户id | 用户名称 | +| ------ | ----- | ------ | -------- | +| X2001 | 12-2 | U001 | 白展堂 | +| X2002 | 11-30 | U002 | 吕秀才 | +| X2003 | 11-11 | U003 | 郭老板 | + +该表中订单号为主键 并且关联用户id 和用户名称 这样就会导致用户的信息没办法单独管理 + +举例:当用户id u001 下单20件商品 那么对应的用户id 用户名称在你输入的时候也会重复录入20边 + +所有应该将他拆分出用户表来满足第三范式 + +用户表 + +| 用户id | 用户名称 | +| ------ | -------- | +| U001 | 白展堂 | +| U002 | 吕秀才 | +| U003 | 郭老板 | \ No newline at end of file