ADO.NET(一)

一:数据库设计

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
  用处:在查询结果处显示汇总

原文地址:https://www.cnblogs.com/BOSET/p/7077423.html