一:数据库设计
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
用处:在查询结果处显示汇总