什么是数据库
狭义:存储数据的仓库
广义:可以对数据进行存储和管理的软件 以及 数据本身 统称为数据库。
数据库是由表、关系、操作组成
为什么需要数据库
- 几乎所有的应用软件的后台都需要数据库
- 数据库存储数据占用空间小,容易持久保存
- 存储比较安全
- 容易维护和升级
- 数据库移植比较容易
- 简化对数据的操作
- B/S架构里面包含数据库
数据库安装和卸载(遗爱可思议)
预备知识
-
学习数据库必须学习的原理么?
视频中会讲解数据库原理知识
-
学习Sql sever必须先学习一门语言么?
不需要,但是懂一门编程语言对学习sql sever会有一定的帮助
-
数据结构和数据库的区别
数据库是在应用软件的层次来研究数据的存储和操作
数据结构是在系统软件层次来研究数据的存储和操作
-
什么是连接?
-
有了编程语言为什么还要学数据库?
对内存数据操作是编程语言的强项,但对硬盘操作确实编程语言的的弱项
对硬盘数据操作确实数据库的强项,是数据库研究问题的核心
-
建议初学者从三个方面学习数据库
数据库是如何存储数据的
字段、记录、表、约束(主键、外键、唯一键、非空、check default)
数据库是如何操作数据的
insert、update、delect、T-SQL
数据库是如何展示数据的
select
必备的一些操作
-
如何建数据库
选中数据库右键新建
-
如何删除数据库
选中数据库右击删除
-
如何附加和分离数据库
数据库是如何解决存储问题的
-
表的相关数据
-
create table 命令
-
什么是约束
定义:对一个表中的属性操作的限制叫约束
分类:
主键约束:不允许重复元素,避免数据冗余
外键约束:通过外键约束从语法上保证了本事物所关联的其他事物一定是存在的.
事物和事物之间的关系是通过外键来实现的
Check约束:保证事务属性的取值在合法的范围之内
default约束:保证事物的属性一定会有一个默认值
唯一(unique)约束:保证了事物属性的取值不允许重复,但允许其中有一列且只能有一列为空。
(Sql sever2005只允许唯一列为空,oracle允许多个列为空)
not null:
-
表和约束的区别
数据库是通过表来解决事物的存储问题的
数据库是通过约束来解决事物取值的有效性和合法性的问题
建表的过程就是指定事物属性及其事物属性的各种约束的过程
-
什么是关系
定义:表和表之间的联系
实现方式:通过设置不同形式的外键来体现表和表不同的关系
分类(假设是A表和B表):
一对一:既可以把A表的主键充当B表的外键;又可以把B表的主键充当A表的外键
一对多:把表A的主键充当表B的外键,且表A中单个实例在表B中有多个实例与之联系,表B中每个实例在表A中最多只有一个实例与之联系,则称为一对多的关系
多对多:两个表,生成第三个表作为关系表
-
主键
能够唯一标识一个事物的字段或者多个字段的组合,称为主键
附注:含有主键的表叫做主键表;
主键通常都是整数,不建议使用字符串作为主键;(除非主键是用于集群式服务,才可以考虑字符串当主键)
主键的值通常不允许修改,除非该条记录被删除;
主键不要定义成id,而是定义成表名_id,或者表名id;
要用代理主键,不要用业务主键
任何一张表,强烈建议不要使用含有业务含义的字段充当主键
我们通常都是在表中单独添加一个整形编号充当业务主键
-
外键
定义:如果一个表中若干个字段是来自另外若干个表的主键或唯一键,则这若干个字段就是外键;
注意:
外键通常是来自另外表的主键而不是唯一键,因为唯一键可能为null;
外键不一定是来自另外的表,也可能来自本表的主键;
含有外键的表叫外键表,外键字段来自的哪一张表叫做主键表
查询:
-
计算列
-
distinct【不允许重复的】
-
between【属于若干个孤立的值】
-
in
-
top
-
null
零和null是不一样的,null表示空值,没有值,零表示一个确定的值
-
order by【以某个字段排序】
注意:如果不指定排序的标准,则默认是升序,升序用desc表示,默认可以不写
为一个字段指定的排序标准并不会对另一个字段产生影响
建议每个字段都指定排序的标准
-
模糊查询
格式:
select 字段的集合 from 表名 where 某个字段名 like 匹配的条件;
匹配的条件通常含有通配符
通配符:
% :表示0个或多个符号
_ :表示任意单个字符
[a-f] :a到f中的任意单个字符
[^a-f]:除a-f外所有的字符
注意:匹配的条件必须要单引号括起来,不能省略,也不能用双引号
-
聚合函数
函数的分类
单行函数:每行返回一个值
多行函数:多行返回一个值
例子:select lower(ename) from emp;
聚合函数分类:
max()
min()
avg()
count() 求个数
count(*) :返回表中所有记录的个数
count(字段名):返回字段非空的记录的个数,重复的值也会被当做有效记录
count(distinct 字段名):返回字段不重复且非空的记录的个数
-
group by
格式:group by
功能:把表中的记录按照字段分成不同的组
注意:聚合函数可以直接使用的
-
having【对分组之后的信息过滤】
-
having子句是用来对分组之后的数据进行过滤
因此使用having时通常都会先使用group by
-
如果没有使用group by 但是用了having
则意味着having把所有的记录当做一组来进行过滤,极少用
-
having子句出现的字段必须是分组之后组的整体信息
having子句不允许出现组内详细信息
-
尽管select字段中可以出现别名
但是havin子句中不能出现字段别名,只能使用字段最原始的名字
having和where区别
相同点:都是对数据的过滤,只保留有效数据
不同点:where是对原始数据过滤,having是对分组后的数据过滤
where必须写在having之前,顺序不可颠倒,否则运行出错
-
-
连接查询
定义:将两个表或者两个以上的表以一定的连接条件连接起来,从中检索出满足条件的数据
分类
内连接【重点】
1.select … from A,B的用法
结果:笛卡尔积,行数是A*B的值,列数是A+B的值
2.select … from A,B where …
外连接
完全连接
结果集包括三个部分:
1.两个表中匹配的所有行记录
2.左表中那些在游标中到不到匹配行记录,这些记录右边为null 3.反之左边为null
自连接
联合
嵌套查询
identity 【主键自动增长,用户不需要为identity修饰的主键赋值】.
如果删了数据导致主键不连续,不重要
如何手动给被identity修饰的主键赋值,不需要
视图
为什么需要视图
查看scott表里的视图
总结:简化查询;避免代码冗余,避免大量重复sql语句
什么是视图
视图从sql语句上看是个select语句
视图从逻辑上被当作一个虚拟表看待
视图的格式
creat view 视图的名字
as
– select的前面不能添加begin
select语句
– select的后面不能添加end
视图的优点
- ·简化查询
- 增加数据保密性
视图的缺点
增加了数据库维护成本
视图只是简化了查询,但是并不能加快查询的速度,这也是使用不足的地方之一
注意的问题
创建视图的select语句必须为所有的计算列指定别名
create view v$_
视图不是物理表,是虚拟表
不建议通过视图更新所依附的原始表的数据或结果
事物【*】
一系列操作要么全部执行成功,要么全部失败,或者单方面使用,则另一方面不可干预。这就是事物
分页查询
select * from emp
select top 3 * from emp order by sal --输出结果看,先制性order by 后执行top
--工资从高到低,输出工资是第4~6的员工信息
select top 3 *
from emp
where empno not in (select top 3 empno from emp order by sal)
order by sal
--思路:先把工资最低的三个人排除掉,排序后再取前三个最低工资的
--工资从高到低,输出工资是第10~12的员工信息
select top 3 *
from emp
where empno not in (select top 9 empno from emp order by sal)
order by sal
--工资从高到低,输出工资是第12~15的员工信息
select top 3 *
from emp
where empno not in (select top 11 empno from emp order by sal)
order by sal
假设每页显示n条记录,当前要显示的是第m页
表名是A,主键A_id
select top n *
from A
where A_id not in (select top (m-1)*n A_id from A)