diff --git "a/1.\345\273\272\350\241\250\345\273\272\345\272\223\347\254\224\350\256\260.md" "b/1.\345\273\272\350\241\250\345\273\272\345\272\223\347\254\224\350\256\260.md" new file mode 100644 index 0000000000000000000000000000000000000000..3bc56ee546be24539d097f77d73b5b79375d20be --- /dev/null +++ "b/1.\345\273\272\350\241\250\345\273\272\345\272\223\347\254\224\350\256\260.md" @@ -0,0 +1,151 @@ +### 1.建表建库 + +1,创建数据库 create database+数据库名称 + +2,使用数据库 use +数据库名称 + +3,创建表 create table +表名 字段1+数据类型+属性+约束 ...... ==(不为空not null;不重复unique;默认default;检查check 主键 primary key 外键 references) + +### 2,增加 insert (into)...values... + +1,插入数据库 insert (into)+表名(字段1,....) values('字段1',.....) + +2,增加外键 外键字段+数据类型+foreign key ==references==+外键表名(外键字段) + +3,排序 select *from +表名+order by +字段+==desc(降序)(默认升序asc)== + +4,消除重复行 select distinct +字段 from +表名 + +### 3,删除 + + ==drop table +表名== + +### 4,修改update + +update + 表名称 + set + 列名称 = 新值 where 列名称 = 旧值 + +update + 表名称 + set +add+ 列名 +类型 +约束 + +update + 表名称 + set +drop +column+列名 + +### 5.查询 + +#### 1.基础查询 + +#### 2.条件查询 + +3.**SQL中常用运算符** + +```sql +=:等于,比较是否相等及赋值 +!=:比较不等于 +>:比较大于 +<:比较小于 +>=:比较大于等于 +<=:比较小于等于 +IS NULL:比较为空 +IS NOT NULL:比较不为空 +in:比较是否在其中 +like:模糊查询 +BETWEEN...AND...:比较是否在两者之间 50-100 BETWEEN 50 AND 100 +and:逻辑与(两个条件同时成立表达式成立) +or:逻辑或(两个条件有一个成立表达式成立) +not:逻辑非(条件成立,表达式则不成立;条件不成立,表达式则成立) +``` + +#### 4.模糊查询 + +模糊查询使用like关键字和通配符结合来实现,通配符具体含义如下: + +```sql +%:代表匹配0个字符、1个字符或多个字符。 +_:代表匹配有且只有1个字符。 +[]:代表匹配范围内 +[^]:代表匹配不在范围内 +``` + +#### 聚合函数 + +SQL SERVER中聚合函数主要有: + +```sql +count:求数量 +max:求最大值 +min:求最小值 +sum:求和 +avg:求平均值 +``` + +ROUND函数用法: + +```sql +round(num,len,[type]) +其中: +num表示需要处理的数字,len表示需要保留的长度,type处理类型(0是默认值代表四舍五入,非0代表直接截取) +select ROUND(123.45454,3) --123.45500 +select ROUND(123.45454,3,1) --123.45400 +``` + +#### 5.SQL中常用的时间函数 + +```sql +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 +``` + +**时间格式控制字符串:** + +| 名称 | 日期单位 | 缩写 | +| ------------ | ----------- | --------- | +| 年 | 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 | + +#### 6.分组查询 group by + +#### 7.连接查询 inner join on + +- 内连接(自连接) select +表1.列1 from 表1 inner join 表2 on 表1.列=表2.列 ..... (where+条件;group by+字段;having+条件;order by+字段) +- 左连接 select +表1.列1 from 表1 left join 表2 on 表1.列=表2.列 left join 表3 on 表2.列=表3.列 ..... +- 右连接 select +表1.列1 from 表1 right join 表2 on 表1.列=表2.列 right join 表3 on 表2.列=表3.列 ..... + +#### 8.并集查询(用于两个select查询之间) + +select ...... 1,union (不允许有重复列) 2,union all (允许有重复列) select...... + +- 交集查询(用于两个select查询之间) select..... intersect(将两个结果集中相同的记录取出来成为一个新的结果集) select..... +- 减集查询(用于两个select查询之间) select.... except(比较两个结果集,将except关键字前的结果集除去交集部分而组成的新的集合) select.... + +#### 9.子查询 + +子查询;一个select-from-where语句称为一个查询块,将一个查询块嵌套在另一个查询块的 where字句或者having子句短语的条件中的查询称为子查询(嵌套查询)。 注意; + +- 可以使用子查询的位置:where,select,having,from +- 不可以使用子查询的位置:group by +- 主查询和子查询可以不是同一张表 +- 一般不在子查询中使用排序(但是在top-n问题分析中必须对子查询使用排序) +- 一般先执行子查询,再执行主查询(相关子查询除外) +- 单行子查询只能使用单行操作符;多行子查询只能使用多行操作符 +- 注意:当子查询为null值的问题 + + diff --git "a/2.\344\270\211\350\214\203\345\274\217\347\254\224\350\256\260.md" "b/2.\344\270\211\350\214\203\345\274\217\347\254\224\350\256\260.md" new file mode 100644 index 0000000000000000000000000000000000000000..5f37e5e3c90c10c8cee055e1e6294c2ad366cf4d --- /dev/null +++ "b/2.\344\270\211\350\214\203\345\274\217\347\254\224\350\256\260.md" @@ -0,0 +1,81 @@ +# 1.三范式 + +## 1.第一范式:列不能再分 + +1.每一列属性都是不可再分的属性值,确保每一列的[原子性](https://so.csdn.net/so/search?q=原子性&spm=1001.2101.3001.7020) + +2.两列的属性相近或相似或一样,尽量合并属性一样的列,确保不产生冗余数据 + +## 2.第二范式(2NF)(字段)属性完全依赖于主键 + +第二范式(2NF)是在第一范式(1NF)的基础上建立起来的,即满足第二范式(2NF)必须先满足第一范式(1NF)。第二范式(2NF)要求数据库表中的每个实例或行必须可以被惟一地区分。为实现区分通常需要为表加上一个列,以存储各个实例的惟一标识。这个惟一属性列被称为主键 + +## 3.第三范式(3NF)(字段)属性不依赖于其它非主属性 属性直接依赖于主键 + +数据不能存在传递关系,即每个属性都跟主键有直接关系而不是间接关系。像:a-->b-->c 属性之间含有这样的关系,是不符合第三范式的。 + +# 4.E-R 图简介 + +E-R :Entity Relationship Diagrams(实体关系模型) +E-R图:实体-联系图 +E-R图可以认为是关系模型的雏形,每个实体是一张表,实体与实体之间的关系可以合并到其中一个实体中,也可以是另外一张表,关系表和相关的实体表是通过主键或外键来联系的。 + +## 1.E-R图3个要素:实体,属性,关系。 + +实体:用矩形表示,矩形框内写明实体名。 + +属性:用椭圆形表示,椭圆内写明属性名称,并用连线与实体连接起来。如果属性较多,为使图形更加简明,有时也将实体与其相应的属性另外单独用列表表示。 + +联系:用菱形表示,菱形框内写明联系名,并用连线分别与有关实体连接起来,同时在连线旁标上联系的类型。 + +连线:实体和属性之间、实体与联系之间、联系与属性之间用直线连接,并在直线上标注联系的类型。(注意:对于1:1的联系,要在两个实体连线方向各写1,1:n关系的,要在一的方向写1,多的方向写N;对于N:M关系的,则要在两个实体连线方向各写N,M) + +## 2.E-R图设计步骤 + +确定所有的实体集合 +选择实体集应包含的属性 +确定实体集之间的联系 +确定实体集的关键字,用下划线在属性上表明上表明关键字的属性组合 +确定联系的类型,在用线将表示联系的菱形框联系到实体集时,在线旁注明1或N来表示联系的类型 + +# 分类: + +* 矩形框;表示实体类型(考虑问题的对象) +* 菱形框;表示联系类型(实体间的联系) +* 椭圆形框;表示实体类型和联系类型的属性 +* 直线;联系类型与其涉及的实体类型之间以直线连接,并在直线端部标上联系的种类 + +## 数据表之间的关联关系: + +1.一对一关系 + +可以与任意一端对应的关系模式合并,在任意一方加入对方的主键(主码)变为其外键(外码),并加入联系本身的属性。 + +2.一对多关系 + +可以与n端对应的关系模式合并,将1方的主键加入n方作为其外键,并将联系的属性也加入n方 + +3.多对多关系 + +(新建一张关系表),将联系双方的主键(主码)加入其中,并将联系的属性也加入其中。 + +## 二,关系模式的规范化(范式) + +尽量满足高标准的范式,适当建立索引,少采用储存过程,避免使用触发器 + +1,第一范式(1NF);起始结构简单,便于讨论 + +* 规定了一个关系中的属性值必须是”原子“的,排斥了属性值为元组,数组或某种复合数组的可能性,使关系的属性值都是”最简形式“ + +2,第二范式(2NF); + +* 如果一个关系满足第一范式,并且除了主键以外的其他列都依赖于该主键,则满足第二范式(2NF) + +3,第三范式(3NF); + +* 如果一个关系满足第二范式,并且除了主键以外的其他列都依赖,且直接于主键列,则满足第三范式(3NF) + + + + +