目录
一、数据库的基本架构:
二、关系模型的规范化(范式)
三、Mysql数据库
四、SQL语言
五、选择查询
1.数据 data
定义:对客观事物的符号表示,如图形符号,数字,字母等等。
数据是数据库存储的基本对象。
2.数据库 database (DB)
定义:长期存储在计算机内,有组织,可共享的数据集合。
数据库中数据的特征:较小的冗余度,较高的数据独立性;易扩展性;为各个用户所共享。
冗余:重复
扩展性:指的是可修改的
3.数据库管理系统 DBMS
定义:位于应用程序和存储数据之间的一层数据管理软件。
用途:科学的组织和存储数据;高效的获取和处理数据
四方面的功能:
1).数据库的定义功能:
在SQL语言中---DDL语言(数据库定义语言),提供了三个语句:create(创建),alter(修改),drop(删除),操作的对象是数据库中的基本架构----表。
备注:虽然数据库中存储的是各种各样的数据,但是数据是以表的形式来组织和存放的。
2.)数据库的操作功能:
借助于SQL语言中---DML语言(数据库操作语言),实现对数据库中存储的数据进行增删改查的操作(insert,delete,update,select)
3.)数据库的保护功能:
保护数据的完整性和安全性
4.)数据库的维护功能:
数据库中表结构和数据的维护功能
4.数据库系统 DBS
data,database,dbms,dbs的关系
数据库系统(DBS)=数据库(DB)+数据库管理系统(DBMS)+应用系统+数据库管理员(DBA)+用户
5.数据库系统经历的三个阶段:
网状数据库,层次数据库,关系数据库
数据组织方式: 网状模型 层次模型 关系模型
6.数据库 架构: 图形结构 树形结构 表
现实世界:存在于人脑之外的客观世界。
信息世界(观念世界):指的是现实世界在人们头脑中的反映
数据世界:指的就是信息世界的产物在计算机中的表示
2.实体-联系模型------>E-R图
实体:客观事物在信息世界中被称为实体
属性:描述实体的数据项
3.联系:反映的是实体与实体之间的关联
常见的联系:一对一,一对多,多对多
4.关系模型(关系型数据库中数据的组织方式)
关系:指的是一张表,没有重复行和重复列
关系名:表名
元组:指的是表中的行,也叫作记录,因为每一行代表一条记录
属性:指的是表中的列,也叫作字段
属性名:指的是列名,也叫作字段名
属性值:指的是每个列的取值
域:指的是属性的取值范围(列的取值范围)
关键字:指的是列(可以把一个列或者多个列看成是关键字),做到唯一区分的作用。比如:学生信息表中的学号。一旦把某个列看成是关键字,就要求这个列的内容:唯一,不重复,不能为空。
可以互推的过程:关键字<===>唯一,不重复,不能为空
5.关键字:
1.主键(主关键字);针对一个表中某个列来说的,假如把一个表中的某个列设置成主键,那么这个列就一定要求:唯一,不重复,不为空。
2.外键:针对两个表来说的,加强表与表之间的联系。外键的设置也是在于列
6.关系的完整性约束 约束--->限制
1.实体完整性:主属性值不能为空。(主键)
2.参照完整性:说的主键和外键之间的关系。(主表和从表的关系)
会把两个表分别拆分成一个主表,一个从表;参照关系:从表参照主表(列);
当从表需要做操作的时候,首先询问主表的意见,主表中有的,允许你从表做操作;如果主表中没有的,从表是没办法进行操作的。
当从表的某个列参照主表的某个列,要求主表的这个列必须是主键或者唯一约束
1.定义:关系模型要满足的条件被称为规范化形式,简称范式NF。
2.目的:减少数据冗余,消除存储异常,保证数据的完整性和存储效率。一般是3NF。
第一范式(1NF):如果关系R的所有属性是简单属性:每个属性都不可再分,则称R满足第一范式
其实就是没有重复的列。
第二范式(2NF):如果关系R先满足第一范式,非主键字段完全依赖于主键,则称R满足第二范式
第三范式(3NF):如果关系R满足第二范式,非键字段之间不存在任何的依赖关系,则称R满足第三范式。
一个基本的关系型数据库要满足第一范式,一个完整的关系型数据库要满足第三范式。
3.ER图 实体联系图
实体:矩形,矩形内部写的是实体的名字
属性:椭圆,椭圆内写的是属性的名字
联系:菱形,菱形内部写的是联系名
用线段给连接
m n 1 m和n代表的是多的意思
常见的联系:一对一 一对多 多对多
1:1 1:m或者1:n m:n
1优点:体积小,速度快,成本低,开源,可以和开发语言来结合,可移植性(跨平台),可以在不同的操作系统中使用
查看现有的数据库:show databases;
创建数据库:create database 数据库的名字;
删除数据库:drop database 数据库的名字;
2.MySql中数据类型:
1).数值型:
整数类型:int
小数类型:decimal
小数格式:decimal(总长度,小数位)
decimal(5,2) 要求你传递过来的数据总长度是5位,小数位是2位 123.45
价格 decimal(3,2) -------------->9.99
2).日期和时间类型
datetime YYYY-MM-DD HH:MM:SS 精确到秒
date YYYY-MM-DD 年月日
3).字符串类型
char(字符串的长度) 定长
varchar(字符串的长度) 变长
姓名 char(10) tom-->3 10个字符-3=7个字符的空间 剩余的空间不会释放,系统会用空格给填充满
varchar(10) tom--3 还剩下7个字符空间,给释放出来
3.创建表语法格式:
create table 表名(
列名1 数据类型,
列名2 数据类型,
列名3 数据类型,
);
数据库中注释:
单行注释: -- 注释的内容
多行注释: /*多行注释的内容*/
4.切换数据库:use 数据库的名字;
删除表:drop table 表名;
删除多张表: drop table 表名1,表名2...
5.修改表结构
1.添加列 :alter table 表名 add 列名 数据类型;
2.删除列:alter table 表名 drop 列名;
3.修改列的数据类型:alter table 表名 modify 列名 新的数据类型;
4.修改列名:alter table 表名 change 旧列名 新列名 数据类型;
显示表结构:desc 表名;
1.创建表的同时创建主键约束
格式一:
create table 表名(
列名1 数据类型 primary key,
列名2 数据类型
);
格式二: 主键约束名字的写法: PK_列名
create table 表名(
列名1 数据类型,
列名2 数据类型,
constraint 主键约束的名字 primary key(列名1)
);
格式三:
create table 表名(
列名1 数据类型,
列名2 数据类型,
primary key(列名1)
);
2.针对已经存在的表,添加主键约束
格式一:
alter table 表名 modify 列名 数据类型 primary key;
格式二:
alter table 表名 add primary key(列名);
格式三:
alter table 表名 add constraint 主键约束的名字 primary key(列名);---à通用
3.删除主键约束
格式:alter table 表名 drop primary key;
联合主键:指的是把两个列看成是一个整体,这个整体是不为空,唯一,不重复
1.创建表的同时创建联合主键
格式二: 主键约束名字的写法: PK_列名
create table 表名(
列名1 数据类型,
列名2 数据类型,
constraint 主键约束的名字 primary key(列名1,列名2)
);
格式三:
create table 表名(
列名1 数据类型,
列名2 数据类型,
primary key(列名1,列名2)
);
2.针对已经存在表,添加联合主键
格式二:
alter table 表名 add primary key(列名1,列名2);
格式三:
alter table 表名 add constraint 主键约束的名字 primary key(列名1,列名2);
特征:1.不允许有重复的值,保证数据的唯一性。
创建表的同时创建唯一约束 UN_列名
格式一:
create table 表名(
列名1 数据类型,
列名2 数据类型,
constraint 唯一约束的名字 unique(列名1),
constraint 唯一约束的名字 unique(列名2)
);
格式二:
create table 表名(
列名1 数据类型 unique,
列名2 数据类型 unique,
列名3 数据类型
)
一个表中是可以存在多个约束的
2.针对已经存在的表,添加唯一约束
格式:alter table 表名 add unique(列名[,列名2]);
3.删除唯一约束
格式:alter table 表名 drop index 唯一约束的名字;
1.创建表的同时创建默认约束
格式:create table 表名(
列名1 数据类型 default ‘字符串类型或者日期类型的默认值’,
列名2 数据类型 default 数值,
列名3 数据类型
);
2.针对已经存在的表,添加默认约束
格式:alter table 表名 modify 列名 数据类型 default '值';
3.删除默认约束
格式:alter table 表名 modify 列名 数据类型;
1.在创建表的同时创建非空约束
格式:create table 表名(
列名1 数据类型 not null,
列名2 数据类型 not null,
列名3 数据类型
);
2,针对已经存在的表,添加非空约束
格式:alter table 表名 modify 列名 数据类型 not null;
3.删除非空约束
格式:alter table 表名 modify 列名 数据类型;
外键约束 foreign key(相对于两个表来说 一个主表, 一个从表)
1.创建表的同时创建外键约束
主表(接下来再建新表的时候,要参照的表)
create table 表1(
列名1 数据类型 primary key,
列名2 数据类型
);
从表(外键约束所在的表) FK_列名
create table 表名2(
列名1 数据类型,
列名2 数据类型,
constraint 外键约束的名字 foreign key(从表的列名1) references 主表表名1(列名1) --------引用
);
注意:关于引用的列是要求:从表的列和主表的列,列名可以不一样,但是,这两个列的数据类型和内容必须保持一致。
1.创建表的同时创建外键约束
格式:
create table 从表表名(
列名1 数据类型,
列名2 数据类型,
constraint 外键约束的名字 foreign key(从表的列名1) references 主表表名(主表的列名1)
)
2.针对已经存在的表,添加外键约束
格式:
alter table 从表表名 add constraint 外键约束的名字 foreign key(从表列名1) references 主表表名(主表列名);
3.删除外键约束
格式:alter table 表名 drop foreign key 外键约束的名字;
1.DDL语句 数据库定义语言
create·创建库表 alter:修改表 drop:删除库表
2.DML语言 数据操作语言 对表中数据的操作
insert 插入(增) delete 删除(删) update 更新(改)
格式一:
insert into 表名(列名1,列名2,列名3...) values(值1,值2,值3...);
格式二:
insert into 表名 values(值1,值2,值3....);
格式三:
insert into 表名 values(值1,值2,值3...),(值1,值2,值3...),(....);
和drop区别:delete仅限于把表中数据给删除,表还在留着;drop是把表和数据一并给删除了
格式一:
delete from 表名; 把整个表中的数据全部删除
格式二:
delete from 表名 where 条件; 根据条件来删除数据
and 条件是同时满足 delete from 表名 where 条件1 and 条件2 and 条件3....
or 多个条件只需要满足其中一个 delete from 表名 where 条件1 or 条件2 or 条件
删除数据 注意外键的影响
格式一:
update 表名 set 列名=值;
格式二:
update 表名 set 列名1=值1,列名2=值2...
格式三:有条件的更新
update 表名 set 列名=值 where 条件;
对查询结果进行去重复 distinct
格式:select distinct 列名 from 表名;
格式一:
select 列名1 ‘别名1’,列名2 '别名2',列名3 '别名3'... from 表名;
格式二:
select 列名 as '别名',列名2 as '别名2'... from 表名;
1.针对查询结果满足某个范围内的数据
在某个范围之内: between ....and....
select 列名 from 表名 where 列名 between 开始值 and 结束值;
不在某个范围之内的数据 not between .... and....
select 列名 from 表名 where 列名 not between 开始值 and 结束值;
[开始值,结束值]
2.通过in关键字使用户拿上条件可以和列表中任意值来做匹配,只要满足其中一个就会有查询结果
在这个列表范围内的查询 in
格式:select 列名 from 表名 where 列名 in(值1,值2,值3....);
不在这个列表范围之内的 not in --->不要列表中的内容
格式:select 列名 from 表名 where 列名 not in(值1,值2,值3....);
3.字符匹配符 like 模糊查询
通配符:
% 代表的是零个或多个字符
_ 代表的是一个字符
格式:select 列名 from 表名 where 列名 like '字符模式';
只说like是用来匹配到某个字符模式,假如我不想要某个字符模式怎么办呢?
扩充:not like
例:不要姓王学生的信息
select * from student where sname not like '王%';
4.空值查询 不确定的值 null
判断为空:
select 列名 from 表名 where 列名 is null;
判断不为空:
select 列名 from 表名 where 列名 is not null;
5.聚合函数
sum(列名) 对某个列进行求和
avg(列名) 对某个列进行求平均值
max(列名) 对某个列求最大值
min(列名) 对某个列求最小值
格式:select 聚合函数 from 表名;
count(*) 统计元组的个数(看一个表有多少条记录)
count(列名) 统计某个列有多少个值
除了count(*)外,其他函数再做操作时,均忽略空值(null)
6.行数限定 limit
格式:select 列名 from 表名 limit [指定开始查询的行,]查询的总行数;
mysql数据库中行数是从0开始的
7.分组 group by 针对查询出来的结果进行分组
格式:
select 列名,聚合函数 from 表名 group by 列名;
分组:1.先查询结果(先统计出相关的总数或者总和);2.统计出来之后或者查询出来之后,再来进行分组(依据某个列来进行的分组);
统计每个年级的总人数:1.先求出整个学校的总人数;2.求出总人数之后,再依据年级进行分组
8.having 在分组中进行条件限制(对分组的结果添加条件)
格式:
select 列名 from 表名 group by 列名 having 条件(一般情况下都是聚合函数当做条件);
注意:1.having必须和group by固定搭配;2.having后面可以写聚合函数,但是where后面不能写。
9.排序 order by
格式:select 列名 from 表名 order by 列名 [asc | desc];
默认情况下,是升序asc排列,降序desc
有时候排序,是根据两个列来进行排列的
格式:select 列名 from 表名 order by 列名1 asc,列名2 desc;
例子:查询成绩表中所有学生的记录,要求按照成绩升序排列,成绩相同时,按照学号进行降序排列
select * from 成绩表 order by 成绩 asc,学号 des