什么是数据库
数据库的定义
数据库(Database,DB)指长期存储在计算机内的、有组织的、可共享的数据集合。通俗的讲,数据库就是存储数据的地方,就像冰箱是存储食物的地方一样。
在开发中,常说的数据库实际上是指数据库管理系统(Database Management System ,DBMS)。是数据库系统的核心软件之一,是位于用户与操作系统之间的数据管理软件,用于建立,使用和维护数据库。它的主要功能包括数据定义、数据操作、数据库的运行管理、数据库的建立和维护等几个方面。
为什么要使用数据库
- 数据库可以结构化存储大量的数据信息,方便用户进行有效的检索和访问。例如,我们平时使用百度搜索内容时,百度也是基于数 据库和数据分类技术来达到快速搜索的目的。
- 数据库可以有效地保持数据信息的一致性、完整性、降 低数据冗余。
- 数据库可以满足应用的共享和安全方面的要求,把数据 放在数据库中在很多情况下也是出于安全的考虑。例如 如果把所有员工信息和工资数据都放在磁盘文件上,则 工资的保密性就无从谈起。如果把员工信息和工资数据 放在数据库中,就可以只允许查询和修改员工信息,而 工资信息只允许指定人(如财务人员)查看,从而保证 数据的安全性。
- 数据库技术能够方便智能化地分析,产生新的有用信息
DBMS的分类
1. 关系型数据库
- 概念:关系型数据库是指采用了关系模型来组织数据的数据库。简单来说,关系模式就是一个二维表格模型,可以类比Excel。
- 主要代表:MS SQL Server、Oracle、MySQL、PostgreSQL等等。
- 优点:容易理解、使用方便、易于维护。
2. 非关系型数据库
- NoSQL提出了另一种理念,泛指非关系型的数据库,区别于关系数据库,它们不保证关系数据的ACID特性。例如常用的Redis采用键值存储形式,而 MangoDB为文档型等。
- 主要代表:Redis、MangoDB 等等。
- 优点:易扩展、大数据量、高性能。
MySQL的优势
- 上手简单
- 免费使用、开放源码
- 高性能、强安全、可依赖
- 有一定的市场占有率
MySQL的基本知识
基本数据类型
-
数值
数据类型 字节数 备注 tinyint 1 smallint 2 mediumint 3 int 4 最常用的int类型 bigint 8 float 4 double 8 精度更大 decimal 字符串形式的浮点数,一般在金融计算中使用 -
字符串
数据类型 字符串长度 备注 char 固定长度大小0~255 varchar 可变字符串0~65535 可以指定长度大小 text 文本串2^16-1 保存大文本 -
时间日期
数据类型 时间格式 date YYYY-MM-DD,日期格式 time HH:MM:SS,时间格式 datetime YYYY-MM-DD HH:MM:SS,最常用的时间格式字段属性
字段属性
-
主键
- 主键是一个列或者多个列的组合(主键可以有多个),其值能唯一地标识表中的每一行。也就是说,我们在设计表时,需要有一个东西能够让每一行唯一确定,所以主键是强制要被设定的。并且,设定主键之后,主键是不能为null值的。另外如果我们有两个相同的主键,会报错误。
- 一般在开发中,我们基本会将id设置为主键,之后给一个自动递增防止重复。
-
默认值
默认值直观易懂,就是每个字段在初始化时如果没有赋值,那么就会给予一个设定的默认值。
-
自增
默认每次增加一条数据记录时都会在原有的基础上+1,也可以自己设置自增的步进。
-
无符号
相当于unsigned,声明这一列的数据不能是负数。
-
填充零
字面意思,不够的位数使用0来填充,比如你使用了一个长度为3的int类型的字段。前面的空位会用0自动填充。
基础CRUD
写在前面
- MySQL的DML(数据库操作语言)遵守SQL的DML规范,主要就是对数据库里的数据增删改查操作
- 如果你使用Navicat或DataGrip等数据库可视化工具,所有的增删改查操作都可以像Excel一样,直接使用可视化操作,这些操作的对应的SQL语句都可以直接在SQL预览中看到。当然,不能说你有可视化界面我们就可以不用去学MySQL的语句。我们这节课只是皮毛的东西,之后的包括事务、索引优化、三大范式等等,都需要你熟练掌握MySQL的基本的CRUD。
- 所谓的CRUD就是对数据库进行增删改查,主要涉及SELECT、INSERT、UPDATE和DELETE等语句
基本语法于简单应用
1. SELECT语句
-
基本语法
select <data> from <tableName> -
简单应用
-
条件查询(关键字where)
SELECT * FROM student WHERE `name` = 'cxy'; #在一般的项目开发中,一般都是前端传一个特定的值给我们,然后我们根据这个值返回数据库中的数据。所以这个语句使用非常频繁 SELECT * FROM `data` WHERE `number` BETWEEN 1 AND 100 ORDER BY `number` DESC; #使用between and 进行一个闭区间内的查询,并且进行排序 SELECT * FROM student WHERE `name` = 'cxy' AND `age` = 18; #使用and/or进行多个条件约束 SELECT * FROM `data` WHERE `number` IN('1', '3'); #选择表中,number值为1或者3的数据 -
模糊查询(关键字like)
-
通配符
- %代替任意字符
- _代替一个字符
-
举例
SELECT * FROM student WHERE `like` LIKE '乐%'; #查出like字段以 乐 开头的数据 SELECT * FROM student WHERE `like` LIKE '_ nice'; #相当于用_代替任意一个字符
-
-
分组查询(关键字group by)
# 查询一个公司每个工种的最高工资 SELECT MAX(salary),job_id FROM employees GROUP BY job_id; #查询每个位置上的部门个数 SELECT COUNT(*),location_id FROM departments GROUP BY location_id; #查询每个工种有奖金的员工的最高工资>12000的工种编号和最高工资 SELECT MAX(salary),job_id FROM employees GROUP BU job_id HAVING MAX(salary)>12000; #查询领导编号>102的每个领导手下的员工最低工资>5000的领导编号,以及其最低工资 SELECT MIN(salary),manager_id FROM employees WHERE manager_id>102 GROUP BY manager_id HAVING MIN(salary)>5000 -
子查询
-
放在where后
SELECT * FROM student WHERE age > (SELECT age FROM student WHERE uid = 5); #查询age大于uid=5的age的数据值 -
放在from后
# 查询每个部门的平均工资的工资等级 select ag_dep.*, g.level from( select avg(salary) ag ,department_id from employees group by department_id ) ag_dep inner join job_grades g on ag_dep.ag between lowest_sal and highest_sal;
-
-
连接查询
-
内连接
SELECT * FROM dept d INNER JOIN emp e ON e.dept_id=d.id; +----+------------+----+------+---------+ | id | name | id | name | dept_id | +----+------------+----+------+---------+ | 3 | 后勤部 | 1 | 刘备 | 3 | | 3 | 后勤部 | 2 | 关羽 | 3 | | 3 | 后勤部 | 3 | 张飞 | 3 | | 2 | 财务部 | 4 | 张角 | 2 | | 2 | 财务部 | 5 | 张宝 | 2 | | 2 | 财务部 | 6 | 张梁 | 2 | | 1 | 人力资源部 | 7 | 曹操 | 1 | | 1 | 人力资源部 | 8 | 曹丕 | 1 | | 1 | 人力资源部 | 9 | 曹植 | 1 | | 1 | 人力资源部 | 10 | 曹冲 | 1 | +----+------------+----+------+---------+ -
外连接
比较复杂,可以参考MySQL连接查询
-
-
2. INSERT语句
-
基本语法
insert into <tableName> (<data>) values (<content>)
3. UPDATE语句
-
基本语法
update <tableName> set <data> = <contant> (where ...)
4. DELETE语句
-
基本语法
delete from <tableName> (where ...)
使用SpringBoot+Mybatis进行开发
在SpringBoot中连接数据库
-
添加MySql数据库驱动依赖
-
可以在初始化项目时进行勾选
-
在pom.xml中进行添加
<dependency> <groupId>com.mysql</groupId> <artifactId>mysql-connector-j</artifactId> <scope>runtime</scope> </dependency>
-
-
application.yml连接配置MySQL
spring: datasource: url: jdbc:mysql://localhost:3306/edu_dg?useSSL=false&characterEncoding=utf8&serverTimezone=Asia/Shanghai password: 20021014 username: root driver-class-name: com.mysql.cj.jdbc.Driver
配置Mybatis
-
添加Mybatis依赖
<!-- https://mvnrepository.com/artifact/org.mybatis.spring.boot/mybatis-spring-boot-starter --> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.3.0</version> </dependency> -
配置mapper对应xml文件路径
mybatis: mapper-locations: classpath:mapper/*.xml
结合数据库的接口
-
建立controller、service等
-
创建mapper软件包,建立mapper接口
package com.example.workwithmysql.mapper; import org.apache.ibatis.annotations.Mapper; @Mapper public interface SearchMapper { String searchLikeByName(String name); } -
resource下建立mapper目录,编写xml文件
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.example.workwithmysql.mapper.SearchMapper"> <select id="searchLikeByName" resultType="String"> select `like` from student where name = #{name} </select> </mapper> -
在service中注入mapper并调用方法,完善service、controller
-
测试接口