一:数据库设计
1、数据库解决的问题:持久化存储,优化读写,保证数据的有效
2、关系型数据库:先来学习一下E-R模型(E:Entity,R:Relationship,实体关系模型),后面再说NOSQL非关系型数据库
3、数据库分类:文档型(例如SQLite,用于移动开发)。服务型(ex:SQL Server)
4、三范式:列不可拆分,必须有唯一标识,表之间引用主键
5、关系及存储:
1对1:1个对象A对应着1个对象B,1个对象B对应着1个对象A 关系可以存入A或B对象中(例如:国家规定的夫妻关系) 1对多:1个对象A对应着n个对象B,1个对象B对应着1个对象A 关系存入B对象中(学生和班级,一个班级可以有多个学生,但一个学生只许有一个班级) 多对多:1个对象A对应着n个对象B,1个对象B对应着m个对象A 关系存入新建的一个关系表中(学生和选课, 1个学生可以有多门选课,一门选课可以有多个学生)6、字段类型介绍:int,bit,datetime,decimal(5,2),char/varchar/nvarchar
字符串类型n的区别:有n表示unicode编码,每个字符占一个字节; 没有n表示非unicode编码,英文或数字占一个字节,中文占两个字节 字符串类型var的区别:有var表示可变长度 没有var表示不可变长度,如果长度不够,会在末尾补空格 如果选择int值时,可以设置标识:此列的值为系统帮助维护,更轻松的实现唯一标识7、约束:主键约束,非空约束,唯一约束,默认约束,检查约束,外键约束,在这里只说一下容易搞混淆的外键约束
外键约束:就是对关系进行约束,例如UserInfo表与ActionInfo表,两表是多对多的关系,那么在中间表
UserInfoActionInfo中给ActionInfoID这个字段添加一个外键约束,就可以达到检查ActionInfoID这个字段,ActionInfoID对应的就是ActionInfo的ID字段
所以ID字段是由ActionInfo这个表决定的,所以ActionInfo就是主键表。UserInfoActionInfo就是外键表
总结一句话:外键约束,给哪个字段添加外键约束,那该字段的值由哪个表决定的,那么这个表就是主键表,其他就是外键表,添加外键约束后
如果该字段的值在主键表找不到,那么就报错,约束用户无法完成添加
8、脚本操作
-》不区分大小写,字符串使用单引号,末尾不需要加分号
-》按照功能分类:
DDL:数据定义语言,用于进行各种数据库对象的创建,主要操作包括create、alter、drop DML:数据管理语言,用于对表数据的添加、修改、删除、查询,主键操作包括insert、update、delete、select DCL:数据控制语言,用于进行权限分配等-》注释:--单行注释,/**/多行注释
-》数据库:
显示当前存在的所有数据库:select * from sysdatabases
创建:
create database 数据库名 on primary ( name='stuDB_data', -- 主数据文件的逻辑名称 filename='D:\stuDB_data.mdf', -- 主数据文件的物理名称 size=5mb, --主数据文件的初始大小 maxsize=100mb, -- 主数据文件增长的最大值 filegrowth=15%--主数据文件的增长率 ) log on ( name='stuDB_log', filename='D:\stuDB_log.ldf', size=2mb, filegrowth=1mb ) 删除: drop database 数据库名-》使用数据库:use 数据库名
-》表:创建、修改、删除
通过select * from sysobjects where xtype='U'可以查看所有存在的表 多个列间使用逗号分隔 主键:primary key 非空:not null 惟一:unique 默认:default() 检查:check() 外键:foreign key(列名) references 表名(列名)9、表数据的操作
-》简单查询:select * from 表名 -》增加数据:insert into 表名(列名) values(值) 说明1:要求值的列名与值要位置对应 说明2:如果所有列都插入值,可以省略列名部分批量插入数据:
select * from 表名 insert into 表名(列名1,列名2) values('值1','值2')-》修改数据:update 表名 set 列名1=值1,列名2=值2... where ...
-》删除数据:delete from 表名 where ... 删除表用这个比delete快:truncate table 表名 说明:from关键字可以省略不写 通常实现:逻辑删除,物理删除10、常用辅助命令及快捷键
set statistics time on/off:在消息栏显示详细执行时间 ctrl+e执行 ctrl+r隐藏消息栏 ctrl+l计划任务,对sql语句进行分析
11、查询
-》排序:select top 2 percent * from StudentInfo order by 字段1 asc|desc,字段2 asc|desc...,先按字段1排,如果字段1相等再按字段2排 -》消除重复行:distinct -》条件查询:写在where后面 对行进行筛选,返回bool类型的值,如果某行中的列数据满足条件,则加入结果集,否则不出现在结果集中 比较运算符:=,>,>=,<,<=,!=或<> between ... and ...表示在一个连续的范围内 in表示在一个非连续的范围内 逻辑运算符:and,or,not 模糊查询:用于处理字符串类型的值,运算符包括:like % _ [] ^ %与_写在[]中表示本身的含义 在[]表示一个连续的范围可以使用- ^写在[]内部的开头,表示不使用内部的任何字符 null的判断:使用is null或is not null,与其它值计算时返回null,排序时null被认为是最小 优先级:小括号,not,比较运算符,逻辑运算符12、多表连接:当需要的结果在多张表里面就要用连接查询,关键是两表中的对应关系,例如现在有科目表,学生表,分数表,班级表,要求出小明所在的班级,科目,分数
select class.cTitle,stu.sName,sub.sTitle,score.scoreValue
from ScoreInfo as score inner join StudentInfo as stu on score.stuId=stu.sId inner join SubjectInfo as sub on score.subId=sub.sId inner join ClassInfo as class on stu.cid=class.cId内连接:inner join,两表中完全匹配的数据
左外连接:left join,两表中完全匹配的数据,左表中特有的数据 右外连接:right join,两表中完全匹配的数据,右表中特有的数据 完全外连接:full join,两表中完全匹配的数据,左表中特有的数据,右表中特有的数据13、聚合函数:对行数据进行合并
常用聚合函数:sum,avg,count,max,min,一般是对数字类型的列进行操作 一条查询中可以同时写多个聚合函数,但是不能与普通列混写 聚合中的null问题:不参与计算 --需求:求出语文科目的平均分 关键要分析需求看用到哪些表,首先语文在科目表,成绩在分数表,所以肯定要连表查询,用到SubjectInfo,ScoreInfo 最后连表查询出结果后,对结果avg(scoreValue)进行求平均分 select AVG(scoreValue) from SubjectInfo inner join ScoreInfo on subId=SubjectInfo.sId where sTitle='语文'14、开窗函数:over()
将统计出来的数据分布到原表的每一行中 结合聚合函数、排名函数使用15、分组:group by 列名1,列名2..
聚合函数一般结合分组使用,进行分组内的数据进行统计
根据指定列进行分组 分组后条件筛选:having ...16、联合查询:将多个查询的结果集合并成一个结果集(跟联表inner join这些不一样,联表是要的结果在多个表内,所以要联起来查才能得到,union是把平时查到的那些结果汇总)
联合要求: 结果集列数要一致 对应列的类型要一致 联合查询关键字:union、union all、except、intersect 用处:在查询结果处显示汇总