diff --git "a/30\345\220\264\350\266\205/\347\254\224\350\256\260/.keep" "b/30\345\220\264\350\266\205/\347\254\224\350\256\260/.keep" new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git "a/30\345\220\264\350\266\205/\347\254\224\350\256\260/8.29 -8.31sql\345\244\215\344\271\240.md" "b/30\345\220\264\350\266\205/\347\254\224\350\256\260/8.29 -8.31sql\345\244\215\344\271\240.md" new file mode 100644 index 0000000000000000000000000000000000000000..776183c00a7f93c9a1493344ba2ddd3efed0a093 --- /dev/null +++ "b/30\345\220\264\350\266\205/\347\254\224\350\256\260/8.29 -8.31sql\345\244\215\344\271\240.md" @@ -0,0 +1,145 @@ +#### 1.新建数据库 + +``` +1,创建数据库 create database+数据库名称 go + +2,使用数据库 use +数据库名称 go + +3,创建表 create table +表名 字段1+数据类型+属性+约束 ...... ==(不为空not null;不重复unique;默认default;检查check)== + +4,插入数据库 insert (into)+表名(字段1,....) values('字段1',.....) + +5,增加外键 外键字段+数据类型+foreign key ==references==+外键表名(外键字段) + +6,排序 select *from +表名+order by +字段+==desc(降序)(默认升序asc)== + +7,消除重复行 select distinct +字段 from +表名 + + 8.删除,drop table +表名 +``` + + + +### 2.修改update + +update + 表名称 + set + 列名称 = 新值 where 列名称 = 旧值 + +### 3.查询 + +#### 基础查询 + +#### 条件查询 + +**SQL中常用运算符** + +``` +=:等于,比较是否相等及赋值 +!=:比较不等于 +>:比较大于 +<:比较小于 +>=:比较大于等于 +<=:比较小于等于 +IS NULL:比较为空 +IS NOT NULL:比较不为空 +in:比较是否在其中 +like:模糊查询 +BETWEEN...AND...:比较是否在两者之间 50-100 BETWEEN 50 AND 100 +and:逻辑与(两个条件同时成立表达式成立) +or:逻辑或(两个条件有一个成立表达式成立) +not:逻辑非(条件成立,表达式则不成立;条件不成立,表达式则成立) +``` + +#### 模糊查询 + +模糊查询使用like关键字和通配符结合来实现,通配符具体含义如下: + +``` +%:代表匹配0个字符、1个字符或多个字符。 +_:代表匹配有且只有1个字符。 +[]:代表匹配范围内 +[^]:代表匹配不在范围内 +``` + +#### 聚合函数 + +SQL SERVER中聚合函数主要有: + +``` +count:求数量 +max:求最大值 +min:求最小值 +sum:求和 +avg:求平均值 +``` + +ROUND函数用法: + +``` +round(num,len,[type]) +其中: +num表示需要处理的数字,len表示需要保留的长度,type处理类型(0是默认值代表四舍五入,非0代表直接截取) +select ROUND(123.45454,3) --123.45500 +select ROUND(123.45454,3,1) --123.45400 +``` + +#### 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 | + +#### 分组查询 group by + +#### 连接查询 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.列 ..... + +#### 并集查询(用于两个select查询之间) + +select ...... 1,union (不允许有重复列) 2,union all (允许有重复列) select...... + +- 交集查询(用于两个select查询之间) select..... intersect(将两个结果集中相同的记录取出来成为一个新的结果集) select..... +- 减集查询(用于两个select查询之间) select.... except(比较两个结果集,将except关键字前的结果集除去交集部分而组成的新的集合) select.... + +#### 子查询 + +子查询;一个select-from-where语句称为一个查询块,将一个查询块嵌套在另一个查询块的 where字句或者having子句短语的条件中的查询称为子查询(嵌套查询)。 注意; + +- 可以使用子查询的位置:where,select,having,from +- 不可以使用子查询的位置:group by +- 主查询和子查询可以不是同一张表 +- 一般不在子查询中使用排序(但是在top-n问题分析中必须对子查询使用排序) +- 一般先执行子查询,再执行主查询(相关子查询除外) +- 单行子查询只能使用单行操作符;多行子查询只能使用多行操作符 +- 注意:当子查询为null值的问题 \ No newline at end of file diff --git "a/30\345\220\264\350\266\205/\347\254\224\350\256\260/9.1\346\225\260\346\215\256\345\272\223\350\256\276\350\256\241.md" "b/30\345\220\264\350\266\205/\347\254\224\350\256\260/9.1\346\225\260\346\215\256\345\272\223\350\256\276\350\256\241.md" new file mode 100644 index 0000000000000000000000000000000000000000..0265ac547f206db34a647c684657feda907f3036 --- /dev/null +++ "b/30\345\220\264\350\266\205/\347\254\224\350\256\260/9.1\346\225\260\346\215\256\345\272\223\350\256\276\350\256\241.md" @@ -0,0 +1,50 @@ +#### 实体对应关系 + +对应关系也叫影射基数,他指多个实体之间的数量比例关系。 + +1个学生 只在一个班级 + +1个班级有多个学生 + +#### E-R图转换为关系模型 + +- 1对1: + - 可以转换为一个独立的关系模式 + - 可以与任意一端对应的关系模式合并,***在任意一方加入对方的主键\*(主码)变为其外键(外码),并加入联系本身的属性**。 +- 1对n,n对1: + - 可以转换为一个独立的关系模式 + - 可以与n端对应的关系模式合并**,将1方的主键加入n方作为其外键**,**并将联系的属性也加入n方** +- m对n: + - 可以转换为一个独立的关系模式(新建一张关系表)**,将联系双方的主键(主码)加入其中,并将联系的属性也加入其中。** + +### **数据规范化** + +仅有好的RDBMS并不足以避免数据冗余,必须在数据库的设计中创建好的表结构。 + +Dr E.F.codd 最初定义了规范化的三个级别,范式是具有最小冗余的表结构。这些范式是: + +- 第一范式(1st NF -First Normal Fromate) +- 第二范式(2nd NF-Second Normal Fromate) +- 第三范式(3rd NF- Third Normal Fromate) + +#### 第一范式 (1st NF) + +- 第一范式的目标是**确保每列的原子性** + +- 如果每列都是不可再分的最小数据单元(也称为最小的原子单元),则满足第一范式(1NF) + +- #### 第二范式 (2nd NF) + + 如果一个关系满足第一范式,并且除了主键以外的其他列都依赖于该主键,则满足第二范式(2NF) + +#### 第三范式 (3rd NF) + +如果一个关系满足第二范式,并且除了主键以外的其他列都依赖,且直接于主键列,则满足第三范式(3NF) + +订单表(n):订单编号,订购日期,顾客编号 + +顾客表(1):顾客编号,顾客姓名 + +1-->1 + +1--n \ No newline at end of file