一、数据库的基本概念
1、数据库:用于存储和管理数据的仓库
2、数据库的特点:持久化存储数据的(将数据存储到文件),其实数据库就是一个文件系统。方便存储和管理数据;使用了统一的方式来操作数据库---SQL;
3、常见的数据库软件
4、如果卸载干净mysql,不仅要卸载软件,还需要删除数据文件,去mysql的安装目录找到my.ini文件,复制datadir,然后找到这一文件夹并删除。
5、要使用mysql的时候,一定要确定服务是打开的
6、mysql的目录结构
1、安装目录
2、数据目录
数据库:文件夹
表:文件
数据:
二、SQL(可以操作多种数据库软件,是一种规则,可以支配所有关系型数据库)
1、什么是Sql
Structured Query Language:结构化查询语言
定义了操作所有关系型数据库的规则。每一种数据库操作的方式还是会存在一些不一样的地 方。
2、SQL通用语法
1、sql语句可以单行可以多行,以分号结尾
2、使用空格和制表符增强语句的可读性
3、在MYsql中sql语句不区分大小写,但是关键字建议使用大写
4、3种注释
单行注释:-- 注释内容 或者#注释内容
多行注释/* 注释内容*/
5、SQL分类
1、DDL:数据定义语言(操作数据库和数据库中的表)
2、DML:数据操作语言(增、删、改表中的数据)
3、DQL:(查询表中的数据)
4、DCL:用于定义数据库中的访问权限和安全级别(进行授权)
三、DDL:操作数据库、表
1、操作数据库(CRUD)
1、Create:创建
*创建数据库
create database 数据库名称
*创建数据库,判断不存在,再创建
create database if not exists 数据库名称
*创建数据库并制定字符集
create database 数据库名称 character set 字符集名
*创建数据库,判断是否存在,并指定字符集为gbk
create database if not exists db4 character set gbk;
2、Retrieve:查询
*查询所有数据库的名称:SHOW databases;
*查看某个数据库的字符集:show create database mysql:查询创建数据库的语法
3、Update:修改
*修改数据库的字符集
alter database 数据库名称 character set 字符集名称
4、Delete:删除
*删除数据库
drop database 数据库名称
*判断数据库存在,存在再删除
drop database if exists 数据库名称;
5、使用数据库
*查询当前正在使用的数据库名称
SELECT DATABASE();
*使用数据库
use 数据库名称;
2、操作表:
1、Create:创建
1、语法:
create table 表名(
列名1 数据类型1,
列名2 数据类型2,
...
列名n 数据类型n
);
注意最后一列不需要加逗号
*数据库类型:
1、int:整数类型
2、double 小数类型 score double(5,2)总共5位,小数点后有两位
3、date:日期,只包含年月日,格式:YYYY-MM-DD
4、datetime:日期,包含年月日时分秒,格式 YYYY-MM-DD HH:mm:ss
5、timestamp:时间戳类型 ,包含年月日时分秒,格式 YYYY-MM-DD HH:mm:ss
如果将来不给这个字段赋值,或者赋值为null,则默认使用系统当前时间来赋值。
6、字符串 varchar (50),50为最大长度
*创建表
mysql> create table student(
id int,
name varchar(20),
age int,
score double(4,1),
bir date,
modify_time timestamp
);
*复制表
create table 表名 llke 被复制的表名
2、Retrieve:查询
*查询某个数据库中所有的表名称
show tables;
*查询表结构
DESC 表名
3、Update:修改
*修改表名
alter table 原表名 rename 新表名;
*修改表的字符集
alter table 表名 character set 字符集名称;
*添加一列
alter table 表名 add 列名 数据类型;
*修改列名称、类型
*alter table 表名 change 列名 修改后的新列名 新数据类型;
*alter table 表名 modify 列名 新数据类型;
*删除列
alter table 表名 drop 列名;
4、Delete:删除
* drop table 表名;
* drop table student if exists;
四、客户端图形化工具:SQLYog
五、DML:增删改表中的数据(重点掌握)
1、添加数据
*基本语法:
insert into 表名(列名1,列名2,...,列名n)values(值1,值2,...,值n);
*注意:
1、列名和值要一一对应
2、如果表名后不定义列名,则默认给所有列添加值
3、除了数字类型,其他类型需要引号引起来,单双引号都可以
2、删除数据
*语法:
*delete form 表名[where 条件]
*TRUNCATE stu;删除表,并复制一个一模一样的表
*注意:
1、如果不加where条件,会把表中所有数据都删除掉
2、如果删除所有记录:可以delete 表名,不推荐使用,有多少条记录,就会执行多少次删除操作。另外一种TRUNCATE stu,推荐使用,效率更高。
3、修改数据
*语法
update 表名 set 列名1=值1,列名2=值2,...,列名n=值n;
*注意:
1、如果不加任何条件,则会将表中所有记录全部修改
六、DQL:查询表中的数据(一)
*select *from 表名
1、语法:
select
字段列表
from
表名列表
where
条件列表
group by
分组字段
having
分组之后的条件
order by
排序
limit
分页限定
2、基础查询
1、多个字段的查询
select 字段名1,字段名2...from 表名
如果查询所有字段,则可以使用*来替代字段的列表;
2、去除重复 distinct
只有两个结果集的数据完全一样才可以去重
3、计算列
一般可以使用四则运算计算一些列的值(一般只能进行数值型的运算)
ifnull(表达式1,表达式2)
表达式1:哪个字段需要判断是否为null
表达式2:如果该字段为null后的替换值
4、起别名 AS
as也可以省略,用空格代替
3、条件查询
1、where子句后跟条件
2、运算符
<>是不等于的意思,相当于!=
null值不能==来判断,用is
转存失败重新上传取消
like:模糊查询
占位符:
_:单个任意字符
%:0或者多个字符
七、DQL查询语句(二)
1、排序查询
*语法:order by 子句
order by 排序字段1 排序方式1,排序字段2 排序方式2,....
*排序方式
ASC:升序,默认的
DESC:降序
*注意:如果有多个排序条件,则当前面的条件值一样时,才会去判断第二条件
2、聚合函数:将一列数据作为一个整体,进行纵向计算。
1、count:计算个数
1、一般选择非空的列:主键
2、count(*)
3、
2、max:计算最大值
3、min:计算最小值
4、sum:求和
5、avg:计算平均值
*聚合函数的计算,会排除null值,就是统计个数不算null
解决办法如下:
第一种:选择不包含非空的列进行计算
第二种:IFNULL函数
转存失败重新上传取消
3、分组查询:
1、语法:group by 分组字段;
2、注意:分组之后查询的字段可以是分组字段或者是聚合函数;
where和having的区别:where在分组之前进行限定,如果不满足条件,则不参与分组。having在分组之后进行限定,如果不满足结果,则不会被查询出来;where后不可以跟聚合函数,having可以进行聚合函数的判断。
4、分页查询(在数据库层面,学习完web就可以在页面上完成):
1、语法:limit开始的索引,每页查询的条数;
2、公式:开始的索引=(当前的页码-1)*每条页面的条数
3、分页操作在不同数据库中实现方式不一样
2、约束
*概念:对表中的数据进行限定,保证数据的正确性、有效性和完整性。
*分类:1、主键约束primary key;2、非空约束:not null;3、唯一约束:不能够重复unique;4、外键约束:foreign key
1、非空约束:值不能为null
创建表添加非空约束
转存失败重新上传取消
转存失败重新上传取消
创建表后添加非空约束
转存失败重新上传取消
2、唯一约束:unique,值不能重复
*创建表时添加唯一约束:
转存失败重新上传取消
mysql中唯一约束限定的列的值可以有多个null
*删除唯一约束:
转存失败重新上传取消
*在创建表之后添加唯一约束
转存失败重新上传取消
3、主键约束:primary key
1、注意:
含义:非空且唯一
一张表只能有一个字段为主键
主键就是表中记录的唯一标识
2、在创建表时,添加主键约束
转存失败重新上传取消
3、删除主键
转存失败重新上传取消
4、在表创建完成后添加主键
转存失败重新上传取消
5、主键约束的自动增长
*概念:如果某一列是数值类型的,使用auto_increment可以完成值的自动增长
*在创建表是,添加主键约束,并且完成主键自增长
转存失败重新上传取消
*删除自动增长
转存失败重新上传取消
*添加自动增长
转存失败重新上传取消
5、外键约束:foreign key让表与表产生关系,从而保证数据的正确性
1、在创建表时,可以添加外键
语法:
create table 表名(
...
外键列
constraint 外键名称 foreign key (外键列名称) references 主表名称(主表列名称)
);
2、删除外键
转存失败重新上传取消
3、创建标准之后,增加外键
转存失败重新上传取消
4、级联操作
转存失败重新上传取消
##数据库的设计:
1、多表之间的关系
1、分类
1、一对一:如,人和身份证,一个人只有一个身份证,一个身份证只能对应一个人
2、一对多(多对一)
如:部门和员工;一个部门有多个员工,一个员工只能对应一个部门
3、多对多
如:学生和课程;一个学生可以选择多门课程,一个课程可被很多学生选择
2、实现
表和表之间的关系,其实就是靠外键约束
1、一对多关系:
在多的一方建立外键,指向一的一方的主键
2、多对多关系
多对多关系实现借助第三张中间表。中间表至少包含两个字段,这两个字段作为第三张表的外键,分别指向两张表的主键。可以设置联合主键。
3、一对一关系
一对一关系实现,可以在任意一方添加唯一外键指向另一方的主键,让外键唯一unique。
但是如果真的是一对一关系,一般情况下都是合成一张表
3、案例:旅游网站
2、数据库设计的范式
*概念:设计数据库时,需要遵循的一些规范。要遵循后边的范式要求,必须要先遵循前边的所有范式要求。
*分类:
1、第一范式(1NF):每一列都是不可分割的原子数据项
存在的问题:1、存在非常严重的数据冗余(重复);
2、数据添加时存在问题,添加新开设的系和系主任时,数据不合法
3、删除数据存在问题:张无忌毕业了,删除数据会将系的数据一起删除
2、第二范式(2NF):在1NF的基础上,非码属性必须完全依赖于候选码(在1NF基础上消除非主属性对主码的部分函数依赖)
*几个概念:
1、函数依赖,A-->B,如果通过A属性(属性组)的值可以唯一确定B的属性值,就称作B依赖于A;学号——>姓名;(学号,课程名称)——>成绩
2、完全依赖函数:A-->B,如果A是一个属性组,则B属性值得需要依赖于A属性组中所有的属性值,则称完全依赖函数。(学号,课程名称)——>成绩
3、部分函数依赖:A-->B,如果A是一个属性组,则B属性值的确定只需要依赖于A属性组某一些值即可
4、传递函数依赖:A-->B,B-->C,如果通过A属性(属性组)的值,可以确定唯一B的属性的值,再通过B属性(属性组)的值可以确定唯一C属性的值,则称C传递函数依赖于A。
例如:学号--->系名,系名-->系主任
5、码:如果在一张表中,一个属性或属性组,被其他所有属性所完全依赖,则称这个属性(属性值)为该表的码
主属性:码属性组中的所有属性
非主属性:除过码属性组的属性
*解决了数据冗余问题
3、第三范式(3NF):在2NF的基础上,任何非主属性不依赖于其他非主属性(在2NF基础上消除依赖传递)
*解决了1NF里的所有问题
3、数据库的备份和还原
1、命令行:
*备份语法 mysqldump -u用户名 -p密码 数据库名>保存的路径
*还原:
1、登录数据库
2、创建数据库
3、使用数据库
4、执行文件。source 文件路径
2、图形化工具: