认识数据库——MySQL
数据库的简单认识
什么是数据库
数据库,顾名思义,它就是根据数据结构来对数据进行组织、存储、管理的仓库。
而后就陆续出现了很多专业的数据库软件,如:MySQL数据库、Oracle数据库、SQL Server等等。
这些软件就是专门对数据进行创建、访问、管理、搜索的软件。相比于文件用读写的方式对数据进行管理会更加的方便、快捷、有效率。
数据库的分类
数据库又分为关系型数据库和非关系型数据库。
关系型数据库以表结构方式存储,存储在有行和列的二维表里。这样管理操作数据很方便。通过外键来关联表与表之间的关系。常见的关系型数据库:MySQL、Oracle、SQL Server
非关系型数据库以大块的数据集进行存储,像图结构、键值对、文档等结构。非关系型数据库相比于关系型数据库的最大优势就是它支持高并发读写、海量数据的高效率存储和访问以及它的高扩展性。常见的非关系型数据库:redis内存数据库、MongDb文档数据库
当然关系型数据结构也有它自己独特的优势,它支持SQL语言从而更好的操作繁杂的数据。这是非关系型数据库无法比拟的。
数据库的作用
- 可以对数据进行持久化的保存
- 方便数据的存储和查询,速度快,安全,方便
- 可以处理并发访问
- 更加安全的权限管理访问机制
认识MySQL数据库
MySQL是当前最流行的关系型数据库管理系统。当然还要其他数据库,我们都可以去了解一下。
只是我认为MySQL数据库安装方便,容量小,容易操作。适合新手初步学习。
当我们安装完MySQL数据库后,你会看见电脑的服务里多了这么一项服务:
这是MySQL数据库的服务器,需要先进行启动,这样才能打开我们的客户端。
客户端如图:
这里由于我在安装时设置了默认用户,这时只要输入密码即可进入操作数据库。
在我们未设置默认用户前,一般输入以下命令,进行登录
mysql -u root -p
当我们看到 mysql> 时就说明我们登录成功了,这时我们就可以输入SQL语言进行操作。或许有人觉得这样一步一步敲很复杂的SQL语言去管理数据库,实在是不方便,也太low啦。有没有什么工具软件能够通过鼠标点击就可以操作数据库。
有!但是我们也必须把SQL语言学会,因为我们不仅仅是在终端里用它,我们学了Java,如果需要连接数据库的话,就必须用到SQL语言,当然不仅Java,以后我们学python、php、go语言等也都是如此。
现在我们来看这个工具吧。
现在我们打开这个工具:
如上图,左边界面的
这就是数据库,在数据库下面有很多像右边图
这样的表和Excel一样,有行有列。不过在这里我们不叫它行或列,我们称每一列为一个字段,每一行为一个记录。
现在我们就来开始学习SQL语言操作数据库吧
SQL语言
SQL,即结构化查询语言(Structured Query Language)的简称。把它的功能可以划分为:
DDL(数据定义语言)
常用的DDL语句:
- 创建数据库
`create database 库名 default charset=utf8;`
- 查看数据库
show databases;
- 删除数据库
drop database 库名;
- 打开数据库
- use 库名;
- 查看表:
- show tables;
- 创建表:
- create table 表名(字段名1 类型,字段名2类型......)engine=innodb default charset=utf8;
- 删除表:
- drop table 表名;
- 表结构:
- desc 表名;
DML(数据操作语言)
常用的DML语句:
-
添加数据
-
修改数据
- 删除数据
DQL(数据查询语言)
虽然只是查询,但它最难。我们要知道从浩瀚的数据里查到用户需要的数据,这怎么去找到呢?找到了之后又该如何显示出来,是都要显示,还是只是需要显示一部分数据,需不需要顺序,又根据什么进行排序?这么一系列的问题问下来,是不是有点难度?
别慌,我们有攻克的办法。
请看格式:
- 基础查询
这个查询是没有难度的,用户需要查看一张表的所有数据,或者是一部分的数据,没有条件。
查询表中所有列 所有数据
select * from users;
查询表中一部分列的所有数据
select id,name,phone from users;
- Where 条件查询
可以在where子句中指定任何条件
如:查年龄大于22岁用户的所有列资料数据
select * from users where age > 22;
- 可以使用 and 或者 or 指定一个或多个条件
如: 查询 users 表中 年龄在22到25之间的数据
select * from users where age >= 22 and age <= 25;
如:查询 users 表中 年龄为22或者25 的女生信息
select * from users where(age=22 or age = 25)and sex = '女';
- between表示两者之间的数据
如:查询 users 表中 年龄在18到80之间的数据
select * from users where age between 18 and 80;
- like语句进行某个字段的模糊搜索,使用 % 模糊搜索。%代表任意个任意字符。或者_模糊搜索,_代表一个任意字符。
如:查询某个叫王五的用户所有列数据
select * from users where name like '王五';
如:查询某个姓赵的用户所有列数据
select * from users where name like '赵%';
如: 查询表中 name 字段为两个字符的数据
select * from users where name like '__';
- where条件不仅可以运用查询,我们也可以运用在update和delete语句的后面
如:删除表中name字段为王五的数据
delete from users where name like "王五";
如:修改表中name字段姓刘的用户年龄都为18.
update users set age = 18 where name like "刘%";
- Mysql中的统计函数(聚合函数)
max(),min(),count(),sum(),avg()
如:计算 users 表中 最大年龄,最小年龄,年龄和及平均年龄
select max(age),min(age),sum(age),avg(age) from users;
- 为了美化,让人看到获得的数据一目了然。可以对字段名取别名。
select max(age) as "最大年龄",min(age) as " 最小年龄",sum(age) as "年龄和" ,avg(age) as "平均年龄" from users;
- Group BY 分组,group by 语句根据一个或多个列对结果集进行分组。
如: 统计users表各班的人数
select classid,count(*) from users group by classid;
注意:在使用group by分组时,一般除了聚合函数,其它在select后面出现的字段列都需要出现在grouop by 后面。
- Having 子句
having时在分组聚合计算后,对结果再一次进行过滤,类似于where,where过滤的是行数据,having过滤的是分组数据
如:统计各班级人数,并且要人数达到5人及以上的班级及其人数
select classid,count(*) as num from users group by classid having num >=5;
- Order by 排序
如果需要排序需使用order by对返回的结果进行排序
asc 升序,默认
desc降序
如:按照年龄对结果进行排序,从大到小
select * from users order by age desc;
那么从小到大就是
select * from users order by age;
//或者
select * from users order by age asc;
- Limit 数据分页
limit n 提取n条数据,
limit m,n 跳过前m跳数据,提取n条数据
如: 查询users表中的数据,只要3条
select * from users limit 3;
如:-- 跳过前4条数据,取3条数据
select * from users limit 4,3;
DCL(数据控制语句)
常用的DCL语句:
- GRANT语句
格式如下:
- REVOKE语句
格式如下:
好了,以上所述就是我们的所有SQL语句了。
子查询与计算字段
子查询也可以理解为嵌套查询。即查询中还可以查询。
如:在users表中查询年龄大于所有姓刘的人的平均年龄的用户所有数据。
select * from users where age>(select avg(age) from users where name like "刘%" );
计算字段也用到了子查询,区别就在于这个查询是嵌套在查询的字段中。
如:假如需要显示customers表中每个客户的订单总数。订单与相应的客户ID存储在orders表中。
select id,name,(select count(*) from orders where orders.id = customers.id) from customers;
表连接
表连接,顾名思义就是表与表之间有关联,有连接。通过外键进行关联。比如学生有成绩表和课程表。而这些表都与学生有关系,成绩表与课程表也有关系。而SQL语言最强⼤的功能之⼀——能在数据检索查询的执行过程中联结(join)表。
当我们要查询的数据存储在多个表中,怎么可能只用单条Select语句查询查询出来呢?
这时候就需要使用--------表联结
许多联结将一个表中的行与另一个表中的行相关联。但有时候会需要包含没有关联行的那些行。
通常格式如下:
select 字段1,字段 2, 字段3 ... from 表1,表2...where 表1.字段1 = 表2.字段 and...;
表联结又有自联结、外部联结、内部联结、自然联结。
- 自联结
自联结,顾名思义就是相同的两个表进行关联。
格式:
select 字段1,字段2... from 表1 as "a1",表1 as "a2" where a1.字段1 = a2.字段1 and a1.字段1 = "条件值";
- 内部联结
内部联结也可称作等值联结,说明在两张表中每一行彼此都通过一个外键互相关联,有着联系。一般以inner join 或者 join 进行联结两张表。条件关键字不再是where,而是on。
格式示例:
select * from users as 'u1' inner join users as 'u2' on u1.id = u2.id;
- 外部联结
外部联结与内部联结不同的是两张表中每一行彼此不必有关联,但这样需要有个基表。以每个基表的每一行和另一张表的所有行进行连接。这样就会出现笛卡儿积。可以指定条件用于避免。
以左边的表为基表 : 用left join
以右边的表为基表: 用right join
格式示例:
select * from users as 'u1' left join users as 'u2' on u1.id = u2.id and u1.age>20;
数据类型及约束
通常我们在创建一个数据表时,是需要给每个字段添加数据类型的。
和我们Java变量的数据类型一样,不过数据库的数据类型要比Java的数据类型要丰富很多。
- 串数据类型
- 数值类型
- 日期和时间类型
- 二进制类型
除了给字段添加数据类型外,如果有哪些字段的数据我们需要它遵守一些条件。那我们可以为字段设置约束。
约束有下列几种:
- unsigned 无符号(给数值类型使用,表示为正数,不写可以表示正负数都可以)
- 字段类型后面加括号限制宽度 char(5). varchar(7) 在字符类型后面加限制
- not null 不能为空,在操作数据库时如果输入该字段的数据为NULL ,就会报错
- default 设置默认值
- primary key 主键不能为空,且唯一,一般和自动递增一起配合使用。
- auto_increment 定义列为自增属性,一般用于主键,数值会自动加1
- unique 唯一索引(数据不能重复:用户名)可以增加查询速度,但是会降低插入和更新速度
MySQL事务
MySQL默认的存储引擎是innodb,这种引擎支持事务。
事务就是我们对系统的数据进行访问和操作的一系列过程。可以这么理解。
它的作用就是为了保证数据的一致性和完整性,避免出现数据信息异常等错误。
事务的特性
- 原子性
原子,表示一个小的不能再小,没法再切割,再细分的东西。它是一个不可分割的整体。用原子来比喻我们的事务,要么不做,要么做完。
- 一致性
当两个不同的事务在执行同一个数据时,数据在执行事务之前和之后都需要保持一致性。
比如 A给B转了钱,A扣了钱,那么B肯定要多出钱来。
- 隔离性
事务可以并发执行,但如果并发执行,那么就会出现一些问题。所以每个事务需要有隔离性,有自己单独的完整空间。
- 持久性
当事务已提交时,那么在这事务中执行的一系列增删的数据将会永久性的保存下来。无论是服务器崩溃还是宕机。
事务并发可能会引出的问题
- 脏读
当两个并发的事务执行同一个数据时,B事务执行了一个增删改查数据的操作,恰恰这个时候A事务读取到了B事务执行的操作。就在这个时候B事务回滚了,也就是撤销了。那么A事务读取的数据就是脏读
- 不可重复读
当两个并发的事务执行同一个数据时,事务A老是在执行查询数据,而B数据更新了一个操作并提交,导致事务A查询的数据不一样了。
- 幻读
当多个事务并发执行一个数据时,一个事务重复的查询,却发现数据要么增加了,要么减少了。
隔离级别
既然事务能够引发出那么多问题,那有没有对应之策呢?
有,别忘了,事务有隔离性。所以也有隔离级别。
- 读未提交
读未提交,该隔离级别允许脏读,其隔离级别是最低的。换句句话说,如果一个事务正在处理某一数据,并对其进行了更新,但同时尚未完成事务,因此还没有提交事务;而以此同时,允许另一个事务也能够访问该数据。
- 读已提交
读已提交是不同的事务执行的时候只能获取到已经提交的数据。 这样就不会出现上面的脏读的情况了。但是在同一个事务中执行同一个读取,结果不一致。
- 可重复读
可重复读就是保证在事务处理理过程中,多次读取同一个数据时,该数据的值和事务开始时刻是一致的。因此该事务级别限制了不可重复读和脏读,但是有可能出现幻读的数据。
- 顺序读
顺序读是最严格的事务隔离级别。它要求所有的事务排队顺序执行,即事务只能⼀个接⼀个地处理,不能并发。
总共有四种事务隔离级别,从上往下,级别越高,并发性也就越差,但安全性会越来越高。 一般数据默认级别是读已提交或可重复读。
事务的语法
- 开始事务
BEGIN; 或者 START TRANSACTION;
代表着事务的起点。
- 提交事务
COMMIT;
代表提交事务的所有操作,把事务所更新的数据都放入数据库中去,永久的保存下来,从而正常的结束事务。
- 回滚(撤销)
ROLLBACK;
代表执行某个操作时,遇见某个故障或者后悔执行某个操作,可进行回滚操作,回到事务的起点,重新再操作。
结语:
话说上篇博客结尾说到要给数据库立个传,可万万没想到,这一等,竟是如此之久,连我自己都恨我自己,怎么能这样子呢?其实之前我有做过计划去完成,可有时候计划赶不上变化,或是惰性升起姑且放纵一回,亦或是追求完美以至于无法迈开第一步。然此种种,皆为逃避,非大丈夫所为也。吾等当以此为戒,时刻勉励自己,奥利给!!!
搞懂数据库,算得上是JavaWeb的一个里程碑了吧。然后就是Java连接数据库,再用AJAX让前端页面连接后端Java。通过MVC模式一步步降低代码的耦合性,这样就算基本搞懂了JavaWeb,请保持好奇,期待下一篇博客。。。