-
关系型数据库管理系统简介
数据库的集中式控制有如下优点:
1.降低数据存储的冗余度
2.更高的数据一致性
3.存储的数据可以共享
4.便于维护数据完整性
5.能够实现数据的安全性
数据在数据库中的存储形式
1.层次模型
2.网状模型
3.关系模型
4.对象模型
关系型数据库的基本概念
关系模型把世界是由实体和联系组成的。
实体就是指在现实世界中客观存在并可相互区别的事物。
实体所具有的某一特性称为属性。
以关系模型来创建的数据库称为关系型数据库。
表(table)是关系型数据库的核心单元,它是数据存储的地方。
在关系型数据库中用一个唯一的标识符来标识每一个行,这个标识符就是主键(Primary Key)。
在关系型数据库中,外键(Forergn Key)就是用来表达表与表之间的关联关系。
表与表的关联关系有:一对一关系 一对多关系 多对多关系
RDBMS是管理,操作和维护关系型数据库的一种软件程序。
分为本地和服务器数据库管理系统两种类型。
SQL(结构化查询语言)是关系型数据库的标准编程语言,我们可以通过编写SQL语句访问和操纵数据库中的数据。
SQL标准定义了操作关系型数据库及其包含的数据的多种技术,它分为数据定义语言(DDL),数据查询语言(DQL),数据操作语言(DML),数据控制语言(DCL)。
-
管理数据库和表
创建和使用数据库
创建数据库:
create database 数据库名;
数据库名在服务器中必须是唯一的,并符合标识符规则
第一个字符必须是Unicode标准3.0所定义的字母,下划线(-),at符号(@)或者数字符号(#)
后续字符可以是Unicode标准3.0所定义的字母,下划线(-),at符号(@),美元符号()或者数字符号(#),十进制数字
标识符不能是所用RDBMS的保留字
不允许嵌入空格或其它特殊字符
连接数据库:
use 数据库名;
删除数据库:
DROP DATABASE 数据库名;
数据类型
1.整数数据类型
2.浮点数据类型
3.字符串类型
4.日期和时间数据类型
创建表:
create table 表名(
列名 列的数据类型 列的约束
);
删除表:
drop table 表名;
查询所有信息:
select * from 表名;
复制表,包括数据结构和数据:
create table 复制的表名 select * from 被复制的表名;
复制表,只复制数据结构:
create table复制的表名select * from被复制的表名where 100=0(不等于ture的条件);
添加列:
alter table 表名 add 列名 列的数据类型;
修改列:
alter table 表名 change 旧列名 新列名 列的数据类型;
删除列:
alter table 表名 drop column 列名;
创建索引:
create index 索引名 on 表名(列名);
删除索引:
alter table 表名 drop index 索引名;
-
保证数据完整性
数据完整性概述
1.实体完整性
2.域完整性
3.引用完整性
4.用户自定义完整性
设置非空约束(NOT NULL)
设置主键约束(Primary Key Constraint)
设置唯一约束(Unique Constraint)
指定默认值(DEFAULT)
设置检查约束(Check Constraint)
创建主表:
create table 表名 (
列名1 int primary key,
列名2 char(20) not null,
列名3 char(20) not null
)charset=utf8;
创建从表:
create table 表名(
列名1 int primary key,
列名2 char(20)not null,
列名3 int not null,
列名1 int references 主表名(列名(主键)),
Constraint foreign key(列名1)references主表名(列名(主键))
)engine=innoDB default charset=utf8;
创建自增长:
create table 表名(
列名1 int primary key auto-increment,
列名2 char(20) not null,
列名3 int nto null
)charset=utf8;
设置自增长初始值:
alter table 表名 auto-inrement=100;
删除唯一约束:
alter table 表名 drop index 列名(unique);
添加主键:
alter table 表名 change 旧列名 新列名 列的数据类型, add primary key(新列名);
第四章 使用DML语句更改数据
-
插入单行记录:
insert into 表名 (列名列表) values (值列表);
在数据库中,字符串用单引号‘’包含。
2.可以省略列名列表,但插入的数值必须和表中的一一对应。
3.列名列表:指定插入记录的目标表的列名,是一个以逗号分隔的列名列表。
4.插入多行记录:(只能在my sql 中使用)
insert into 表名(列名列表) values(值列表),(值列表),(值列表),(值列表).........
5.复制表数据:(前提是:需要有一张与被复制的表的数据结构一模一样)
insert into 新表名 select * from 被复制的表名;
6.修改数据类型:alter table 表名 change 旧列名 新列名 数据类型;
7.更改已有数据:
update 表名 set 列名=值 where 过滤条件;
8.通过更新删除列的数据:
删除某列数据:把该列的值设置为null;前提是:该列允许为空值,即没有非空约束。
(1).将一列的数据全部删除:update 表名 set 列名=null;
(2).删除列中某一属性的值:update 表名 set 列名=null where 过滤条件;
10.删除数据:(如果一张表中存在外键约束,就不能使用有过滤条件(where)的约束)
(1).delete from 表名 where 过滤条件;
(2).删除多行:delete from 表名 where 过滤条件 or 过滤条件;
(3).删除某一区间的数据:delete from 表名 where 列名 between 下限 and 上限;
11.使用 truncate 语句(没有过滤条件)
truncate table 表名;
truncate table 不能用于有外键约束引用的表。
12.delete 会记录删除日志,删除数据后还能恢复,但执行效率低。
13.truncate table 不会记录删除日志,删除数据后不能恢复,但执行效率高。
14.复制表数据:insert into 新表名 select * from 被复制的表名;15.修改约束:alter table 表名 change 旧列名 新列名 数据类型;
第五章 简单的数据查询
投影操作:
Select 列名 from 表名;
Select 列名1,列名2 from 表名;
Select * from 表名;
表名前缀:
Select 表名.列名 from 表名;
列别名:
Select 列名1 AS a,列名2 AS b from 表名 AS c;
排除重复数据:
SELECT DISTINCT 列名 FROM 表名;
查询限定行数据:
SELECT * FROM 表名 LIMIT 1,50;
选择操作:
Select 列名 from 表名 where 条件1(and/or)条件2;
单条件选择操作:
Select列名1,列名2 from 表名 where 列名3 = 值;
执行范围操作:
Select 列名 from 表名 where 列名 beween 下and 上
定义集合:
Select 列名 from 表名 where 列名(in/not in);
模糊查询:
Select 列名 from 表名 where列名 like _%;
处理空值数据:
Select 列名 from where 列名(is null/is not null);
升序和降序:
Select 列 from 表 order by 列(asc/desc);
第六章 聚合函数与分组
聚合函数:
-
count;返回结果集中行的数目
Select count()from 表名;
2.sum;返回结果集中所有值得总和
Select sum()from 表名;
3.avg;返回结果集中所有值的平均值
Select avg()from 表名;
4.max;返回结果集中所有值的最大值
Select max()from 表名;
5.min;返回结果集中所有值的最小值
Select min()from 表名;
在带有group by 子句的查询语句中,在select 列表中指定的列要么是group by 子句中指定的列,要么包含聚合函数
查询语句的select 和group by ,having 子句是聚合函数唯一出现的地方,在where 子句中不能使用聚合函数。
当在gropu by 子句中使用having 子句时,查询结果中只返回满足having条件的组。在一个sql语句中可以有where子句和having子句。having 与where 子句类似,均用于设置限定条件。where 子句的作用是在对查询结果进行分组前,将不符合where条件的行去掉,即在分组之前过滤数据,条件中不能包含聚组函数,使用where条件显示特定的行。having 子句的作用是筛选满足条件的组,即在分组之后过滤数据,条件中经常包含聚组函数,使用having 条件显示特定的组,也可以使用多个分组标准进行分组。
第七章 组合查询
什么为子查询:
子查询又称之为内部查询,包含子查询的查询语句成为外部查询。
子查询我们又分为两类:
1.非相关子查询:是独立于外部查询的子查询,子查询总共执行一次,执行完后将值传递给外部查询。
2.相关子查询:她的执行依赖于外部查询的数据,外部查询返回一行,子查询就返回一次。
注意:如果子查询与外部查询使用同一个表,子查询也需要加上前缀作为限定,在这是我们一般使用表的别名来区分。 WHERE 子句中的子查询:
select columnA from table columnB =(子查询)
在子查询中使用运算符:
1:使用EXISTS运算符(后总是跟一个子查询,只要子查询返回了行,它的值就为真)
2:使用ALL运算符
3:使用ANY运算符
ANY与ALL不同的是:在子查询返回的值中,只要有一行满足比较运算,那么比较表达式就为真,如果所有值都不满足,则返回假。
组合查询数据:使用union的运算符
第八章 联接
内联接:
内部联接是使用比较运算符比较要联接列中的值的联接。
join on用在from子句后面,而= ,> ,< ,<>,>=,<=则用在where子句中。
外联接:
左外联接:则左表中的所有行存在于查询结果中,而匹配列中列值不匹配的将用空值填充。(lift join)
右外联接:则右表中的所有行存在于查询结果中,而匹配列中列值不匹配的将用空值填充。(right join)
完全外联接:将返回两个表的所有行 (full join)
第九章 数据库建模
传统软件开发五个阶段:
-
需求分析
-
设计
-
编码
-
测试
-
维护
数据库设计过程:
-
规划阶段(三步骤):系统调查,可行性分析(分析报告),开发计划
-
需求分析(工作):分析用户活动(业务流程图),确定系统范围(系统范围图),分析用户活动涉及的数据(数据流图),分析系统数据(数据字典)。
-
概念涉及(的主要步骤):进行数据抽象,涉及局部概念模式;将局部概念模式综合成全局概念模式;评审。
-
逻辑设计(目标):数据模型映射
-
物理设计(的步骤):存储记录结构设计,确定数据存放的位置,存储方法的设计,完整性和安全性考虑,程序设计。
-
数据库的实现(主要工作):用DDL定义数据库结构;组织数据入库;编制与调试应用程序;数据库试运行(功能测试,性能测试)。
-
数据库的运行与维护工作:数据库的转储和恢复;数据库安全性,完整性控制;数据库性能的监督,分析和改进;数据库的重组织和重构造。
概念设计---ER建模(概念数据模型):
为什么要用ER建模?
--- 通用的数据库建模的方法
--- 与具体数据库无关
什么是模型?
---ER:实体(Entity)关系(Relation)
范式一:列不可再分(值必须唯一),行不可重复(定义主键)。
范式二:非主键列必须依赖于主键列(非主依主)。
范式三:非主键列之间必须相互独立(非主独立)。