1 数据库概述
1.1 什么是数据库
DataBase,简称DB,数据库
数据库就是用来存储、管理数据的仓库
层次式数据库、网络型数据库、关系型数据库、非关系型数据库
1.2 什么是关系型数据库
其实就是以二维表的形式保存、管理数据的数据库
非关系型数据库底层是以键值对(key-value)结构保存数据
常见的关系型数据库:
SQL Server:微软提供,适用于中型、大型项目,收费,在java中的使用占比大概10%,.NET C#
Oracle:甲骨文公司提供,适用于大型、超大型项目,性能优异,功能强大,收费,在Java中使用占比50%
Mysql:瑞典mysqlAB公司提供,适用于小型、中型项目,小巧轻量,免费开源,性能也不差。在Java中使用占比20%
DB2:IBM公司提供,IBM 服务器软件、服务器硬件、数据库
Sqlite:迷你,嵌入式设备,智能家居,手机,ipad
1.3 数据库相关概念
1.31、数据库服务器
服务器软件,mysql 软件,将服务器软件装在电脑上,就可以作为一台服务器对外提供服务器。(存取数据)
1.3. 2、数据库
在每一个数据库服务器中,可以有很多个仓库(数据库),通常情况下,一个网站中的所有数据会存放在一个数据库中。
京东 db_jd数据库
百度 db_baidu数据库
淘宝 db_taobao数据库
…
1.3.3、表
一个数据库中可以创建多张表,而一张表用于存放一类信息
(Java中的类对应数据库中的表)
商品信息 tb_product表
购物车信息 tb_cart表
用户信息 tb_user表
订单信息 tb_order表
1.3.4、表记录
一张表中可以包含多条表记录,一个表记录用于存放某一条具体的信息
数据库服务器、数据库、表、表记录_17
2 Mysql数据类型
2.1 数值类型
Mysql中提供了很多的数值类型,其中最常用的:
int 对应Java中的int类型,占用4个字节
double 对应Java中的double类型,占用8个字节
…
2.2 字符串类型
2.2.1、char(n) – 定长字符串,长度固定
n表示字符数,范围是 0~255(个字符)
name char(10),表示存入的数据长度不能超过10(10是最大长度,不能超过10个字符),如果存入的数据长度不满足10,剩余的空间会用空格补全。因此无论存入的数据字符数是多少个,占用的空间都是固定的!
char类型在存入数据的效率上比varchar要略高一些。
char类型适用于存储长度固定的数据,比如身份证号,学生编号,存储长度固定的数据,既不会有空间浪费,还可以提高效率。
2.2.2、varchar(n) – 不定长字符串,长度不固定
mysql5.0之前的版本: n表示字符数,范围是 0~255(个字符)
mysql5.0之后的版本: n表示字符数,范围是 n*字节数 < 65535
name varchar(10),表示存入的数据长度不能超过10(10是最大长度,不能超过10个字符),如果存入的数据长度不满足10,剩余的空间可以留给别的数据使用。因此数据实际占用的空间和数据的长度是一致。
varchar类型适用于存储长度不固定的数据,虽然效率不如char类型高,但不会有空间的浪费。
** 面试题:char和varchar有什么区别?
text 范围是:0~65535个字节
bigtext 范围是:4GB
2.3 日期类型
date 日期(年月日)
time 时间(时分秒)
datetime 日期+时间(年月日 时分秒)
timestamp 时间戳,格式是年月日 时分秒,从1970年1月1日到指定时间之间的毫秒值
datetime和timestamp两者之间的差别:
(1)存的数据不同,datetime存入的就是一个年月日时分秒的时间字符串;而timestamp存入的是从1970年1月1日到某一个日期之间的毫秒值。
(2)范围不同:datetime的范围是 10009999年,而timestamp范围是19702038年
(3)datetime不能设置自动更新时间,而timestamp可以设置自动更新值为当前时间。
User表
3 新增、修改、删除表记录
数据库的创建、删除、修改、查看
表的创建、删除、修改、查看
!!!表记录的新增、修改、删除、!!!查询
3.1 通过cmd插入或查询数据的编码问题
3.2 mysql数据库的字段约束
思考1:如果id是编号,编号应该是唯一的且不能为空,如何保证这一点?
3.2.1、主键约束
:如果为一个列添加了主键约束,那么这个列就是主键,主键的特点是唯一且不能为空。
添加主键约束:
3.2.2、唯一约束
:如果为一个列添加了唯一约束,那么这个列的值就必须是唯一的(即不能重复),但可以为空。
添加唯一约束:
3.2.3、非空约束
:如果为一个列添加了非空约束,那么这个列的值就不能为空,但可以重复。
添加非空约束:
思考2:在插入数据时,如何保证插入的id不会因为重复而报错?
可以采用主键自增长策略,如果id主键是数值,可以设置主键自增,即在插入数据时,给id赋值一个null,数据库如果检测到id设置了自增策略,会自动获取一个id值插入到表中,而且每次插入完之后,都会自增1
思考3:如果id主键设置了自增后,在插入数据时,是否可以设置id的值?
可以,如果给自动增长的主键id设置了一个值,只要值不冲突,是可以设置的。并且设置完后,数据表中保存的自增变量的值,会在设置值的基础上+1
3.3 drop、delete、truncate之间的区别?
3.4 mysql中常见的函数
ifnull(列名, 值) – 对某一列中的null值进行处理, 如果有null则用第二个参数进行替换
---------------------多行函数-------------------
max( 列名 ) – 对某一列中的值求最大值
min( 列名 ) – 对某一列中的值求最小值
count( 列名 | * ) – 对某一列/所有列统计行数
sum( 列名 ) – 对某一列中的所有值求和
avg( 列名 ) – 对某一列中的所有值求平均值
以上函数分组和不分组, 返回的结果是不同的, 如果不分组, 默认整个查询结果是一组, 就会返回一个 最大值、最小值、行数、总和、平均值。
如果分了组,有多少个组,就返回多少个 最大值、最小值、行数、总和、平均值。
year( 日期 ) – 从日期中提取年份
month( 日期 ) – 从日期中提取月份
day( 日期 ) – 从日期中提取天数
curdate() – 获取当前日期, 格式为"年月日"
curtime() – 获取当前时间, 格式为"时分秒"
sysdate() – 获取当前日期加时间, 格式为"年月日 时分秒"
4 外键和表关系
4.1 外键约束
在现实生活中,有很多数据间往往是有关系, 比如:员工和部门之间存在一定的关系;学生和老师之间也存在一定的关系。
这些关系往往是需要我们保存起来的,那么:
思考1:如何在数据库中保存两张表数据之间的对应关系呢?
可以在其中的一张表中添加一个列,保存另外一张表的主键,从而来保存两张表数据之间的对应关系
思考2:指定某一列为外键和不指定外键有什么区别?
以部门和员工表为例,在员工表中添加一个列dept_id保存部门表的主键。
在将dept_id指定为外键之前,数据库认为dept_id这个列就是一个普通的列,和其他列没有什么区别, 所以数据库也不认为两张表之间有任何关系, 当然也不会帮我们维护这种关系.
如果将dept_id这个列指定为外键, 就等同于告诉数据库, 部门表和员工表之间是有关系的, 员工表中的dept_id列是要严格参考部门表的主键(id)这一列的, 数据库也会帮我们维护这段关系.
思考3:什么是外键?
外键其实就是用于通知数据库,两张表数据之间对应关系的这样一个列。
思考4:创建表的同时怎么添加外键?
思考5:如果在创建表时没有指定外键,那么后期该如何指定外键?
<<参见课件8.7>>
思考6:如何删除外键?
<<参见课件8.7>>
4.2 表关系
4.2.1、一对多(多对一)
对于一对多的关系,我们可以在多的一方(学生表)中添加列,保存一的一方(班级)的主键,从而保存两张表之间的对应关系。
4.2.2、一对一
对于一对一的关系,可以在任意一方添加列保存另一方的主键,从而保存两张表之间的对应关系
4.2.3、多对多
4.3 多表关联查询、外连接查询
1、笛卡尔积查询
2、关联查询:
3、左外连接查询:
4、右外连接查询:
4.4 where和having的区别
where和having都是用于筛选过滤,其区别在于:
(1)where是在分组之前进行筛序过滤
(2)having是在分组之后进行筛选过滤
(3)where中不能使用列别名和多行函数(count,max,min,sum,avg)
(4)having可以使用列别名和多行函数
5 数据库的备份和恢复
5.1 备份数据库
在cmd窗口中(未登录的状态下), 可以通过如下命令对指定的数据库进行备份: mysqldump -u用户名 -p 数据库的名字 > 备份文件的位置
例如: 对db40库中的数据(表, 表记录)进行备份, 备份到 d:/db40.sql文件中
5.2 恢复数据库
在cmd窗口中(未登录的状态下), 可以通过如下命令对指定的数据库进行恢复: mysql -u用户名 -p 数据库的名字 < 备份文件的位置
例如: 将d:/db40.sql文件中的数据恢复到db80库中
首先需要先创建db80库,在cmd窗口再执行如下命令:
– 在cmd窗口中(已登录的状态下)执行
– 在cmd窗口中(未登录的状态下)
或 例如: 将d:/db40.sql文件中的数据恢复到db100库中
– 在cmd窗口中(已登录的状态下)执行, 先创建db100库,进入db100库
– 在通过source执行指定位置下的文件中的sql语句。