Skip to content

MySQL快速入门

一、数据库概述

1.1、为什么要使用数据库

持久化:把数据保存到可掉电式存储设备中以供之后使用。大多数情况下,特别是企业级应用,数据持久化意味着将内存中数据保存到硬盘中加以 "固化",而持久化的实现过程大多通过各种关系数据库来完成。

持久化的主要作用将内存中的数据存储在关系型数据库中,当然也可以存储在磁盘文件,XML 数据文件中

1.2、什么是数据库

1.2.1、数据库(Database)简化为DB

即存储数据的 "仓库",其本质是一个文件系统,它保存了一系列有组织的数据

1.2.2、数据库分类

关系型数据库:SQL(Structured Query Language)

  • 代表性数据库:MySQL、Oracle、Sql Server、DB2、SQLlite
  • 通过表和表之间,行和列之间的关系进行数据的存储
  • 通过外键关联来建立表与表之间的关系

非关系型数据库:NoSQL(Not Only SQL)

  • 代表性数据库:Redis、MongoDB
  • 指数据以对象的形式存储在数据库中,而对象之间的关系通过每个对象自身的属性来决定

1.2.3、数据库管理系统(Database Management System)简化为DBMS

是一种操纵和管理数据库的大型软件,用于建立,使用和维护数据库,对数据库进行统一管理和控制。用户通过数据库管理系统访问数据库中表内的数据

数据库管理系统(DBMS)可以管理多个数据库,一般开发人员会针对每一个应用创建一个数据库。为了保存应用中实体的数据,一般会在数据库创建多个表,以保存程序中实体用户的数据。

数据库管理系统,数据库和表的关系如下图所示

image-20240630113205751

1.2.4、常见的数据库管理系统排名

目前互联网常见的数据库管理软件有 Oracle、MySQL、MS SQL Server、DB2、PostgreSQL、Access 这几种。

二、MySQL安装和连接

2.1、MySQL安装

这里推荐使用 windows 环境下在 phpStudy 进行安装 MySQL,主要是安装快捷、方便。如下图所示

image-20241104195734456

安装成功之后就可进行启动

2.2、MySQL连接

这里推荐使用 Navicat Premium Lite 17,安装简单和使用都非常简单,并且免费使用,具体详细使用请自行搜索。

三、数据库命令操作

3.1、查看所有数据库

tex
show databases;

3.2、创建数据库

tex
create database student character set GBK;

3.3、修改数据库

tex
alter database student character set utf8;

3.4、删除数据库

tex
drop database student;

3.5、切换数据库

tex
use student;

3.6、查看当前使用的数据库

tex
 select database();

🔔注意:命令行后面的分号不可删除

四、MySQL数据类型和约束条件

4.1、数据类型

类型类型举例
整数类型tinyint、smallint、mediumint、int(interger)、bigint
浮点类型float、double
定点数类型decimal
位类型bit
日期时间类型year、time、date、datetime、timestamp
文本字符串类型char、varchar、tinytext、text、mediumtext、longtext
枚举类型enum
集合类型set
二进制字符串类型binary、varbinary、tinyblob、blob、mediumblob、longblob
JSON类型json
空间数据类型单值类型:geometry、potint、linestring、polygon;集合类型:multipoint、multilinestring、multipolygon、geometrycollection

4.2、约束条件

约束条件说明语法
primary key主键约束字段名 数据类型 primary key
not null非空约束字段名 数据类型 not null
unique唯一约束字段名 数据类型 unique
auto_increment自动增长约束字段名 数据类型 auto_increment
default默认约束字段名 数据类型 default
约束条件说明
主键约束作为主键的字段,其取值不能为空,也不可以重复,并且一个表中只能有一个主键,但是构成主键的字段可以是一个也可以是多个。也就是说,主键只能有一个,但是一个主键可以由多个字段构成,当多个字段的取值完全一样时会违反主键约束
唯一约束唯一约束要求该列的值必须是唯一的,也就是不能出现重复值。允许为null,但只能出现一个空值,一个表中可以由多个字段声明为唯一的,以确保数据表的一列或几列不出现重复值
自动增长约束自动增长约束要求指定字段的数据取值自动增长,默认从1开始,每增加一条,这个字段的记录就会加1,所以它只适用于正数的数值型字段。一个表只能有一个自动增长字段,且必须为主键一部分,因此自动增长的约束也是辨别表中主键的重要标志之一
非空约束非空约束要求字段的值不能为空值
默认约束默认约束指定某个字段的默认值,当插入记录时,如果没有明确为字段赋值,那么系统就会自动为这个字段赋值为默认约束设定的值

五、数据库的表和字段规范设计

5.1、表设计规范

  • 命名规则:使用小写字母,单词间用下划线分隔(如 user_info)。
  • 简洁性:表名应简洁且能准确描述内容。
  • 避免保留字:避免使用MySQL保留字。
  • 复数形式:表名通常使用复数形式(如 users)。

5.2、字段名设计规范

  • 命名规则:使用小写字母,单词间用下划线分隔(如 first_name)。
  • 简洁性:字段名应简洁且能准确描述内容。
  • 避免保留字:避免使用MySQL保留字。
  • 选择合适数据类型:选择最合适的数据类型,如 INTVARCHARDATE 等。
  • 避免过大类型:避免使用过大的数据类型,如 VARCHAR(255) 应合理设置长度。
  • 精度:对小数使用 DECIMAL 并指定精度。

六、数据表操作

6.1、现在当前数据库下所有表

tex
show tables;

6.2、创建表

tex
create table 表名(字段名 类型)

# 示例
create table students(name char(16),sex not null default '男'); # 如果输入性别为空,则默认为男

6.3、修改表

tex
alter table 表名 modify 字段名 char(6); # 修改字段数据类型
alter table 表名 rename 新表名;  # 修改表名
alter table 表名 add 字段名 数据类型;  # 新增字段
alter table 表名 drop 字段名;  # 删除字段
alter table 表名 chaneg 旧字段名 新字段名 数据类型; #修改字段名

6.4、删除表

tex
drop table 表名;

七、数据查询操作

7.1、查询表数据

tex
SELECT * FROM `employees` # 查询表所有数据和所有列

SELECT first_name, last_name,email FROM `employees` # 查询特定列

SELECT first_name, last_name, email AS "邮箱" FROM `employees` # AS 定义列别名

7.2、插入数据

tex
# 单个添加
INSERT INTO employees(first_name,last_name,email,phone_number,hire_date,job_id,salary) VALUES("Kyler","Tsai","545644454@qq.com","1548987787","1998-10-12","AD_VP","24000.00")

# 批量添加
INSERT INTO 表名(字段1,字段2,......) VALUES(值1,值2,...),(值1,值2,...),(值1,值2,...);
INSERT INTO 表名 VALUES(值1,值2,...),(值1,值2,...),(值1,值2,...);

7.3、更新数据

tex
UPDATE employees SET email = "18787987987@163.com",phone_number = "18379958465" WHERE employee_id = 0

7.4、删除数据

tex
DELETE FROM employees WHERE employee_id = 0 # 删除 employee_id = 0 的数据
DELETE FROM employee; #删除该表所有数据

八、条件查询

查询薪资大于 10000 的员工

tex
SELECT * FROM employees WHERE salary > 10000

查询薪资在 5000 和 10000 之间的员工

tex
SELECT * FROM employees WHERE salary > 5000 AND salary < 10000
# or
SELECT * FROM employees WHERE salary > 5000 && salary < 10000
# or
SELECT * FROM employees WHERE salary BETWEEN 5000 AND 10000

查询排除某个部门的员工

tex
SELECT * FROM employees WHERE NOT department_id = 100
# or
SELECT * FROM employees WHERE department_id != 100

查询雇佣日期是 2000 年的员工

tex
SELECT * FROM employees WHERE hire_date LIKE "2000-%"

查询某两个部分

tex
SELECT * FROM employees WHERE department_id IN (50, 100)

按照薪资降序排列查询

tex
SELECT * FROM employees ORDER BY salary DESC

查询出薪资最高前 5 名的员工信息

tex
SELECT * FROM employees ORDER BY salary DESC LIMIT 5

查询出薪资第 5 名到第 10 名的员工信息

tex
SELECT * FROM employees ORDER BY salary DESC LIMIT 5,10

九、分组查询

9.1、GROUP BY

查询各部门人数

tex
SELECT department_id AS "所属部分编号",COUNT(*) AS "各部门认识" FROM employees GROUP BY department_id

9.2、HAVING

查询各部门人数并且排除没加入部门

tex
SELECT department_id AS "所属部分编号",COUNT(*) AS "各部门认识" FROM employees GROUP BY department_id HAVING department_id IS NOT NULL

🔔注意:GROUP BY 和 HAVING 配合使用

十、聚合函数

10.1、COUNT

查询员工总人数

tex
SELECT COUNT(*) AS "员工人数" FROM employees

10.2、SUM

查询所有员工所发工资总和

tex
SELECT SUM(salary) AS "所有员工发的工资总和" FROM employees

10.3、AVG

查询所有员工的平均薪资

tex
SELECT AVG(salary) AS "平均薪资" FROM employe

10.4、MAX

查询员工中最高薪资

tex
SELECT MAX(salary) AS "员工最高工资" FROM employees

10.5、MIN

查询员工中最低薪资

tex
SELECT MIN(salary) AS "员工最高工资" FROM employees

十一、多表查询

11.1、JOIN连接

查询所有员工的所属部门

tex
SELECT *, department_name AS "部门" FROM employees JOIN departments ON employees.department_id = departments.department_id

11.2、子查询

查询薪资超出平均薪资的员工

tex
SELECT *  FROM employees WHERE salary > (SELECT AVG(salary) FROM employees )

11.3、连接查询

11.3.1、交叉连接

tex
SELECT * FROM employees CROSS JOIN departments

11.3.2、内连接

tex
SELECT * FROM employees INNER JOIN departments ON employees.department_id = departments.department_id

11.3.3、外连接

左外连接:以左边的表为基准

右外连接:以右边的表为基准

左连接

tex
# 以左边的表为基准,如果左边的表department_id为null,则会被过滤
SELECT * FROM employees e LEFT JOIN departments d ON e.department_id = d.department_id

右连接

tex
# 以右边的表为基准,如果存在员工的department_id为null,则会被过滤
SELECT * FROM employees e RIGHT JOIN departments d ON e.department_id = d.department_id

十二、视图

视图可以理解为一个虚拟的表,实际上就是将一个复杂的查询语句当作一个变量来使用

12.1、创建视图

方式一:CREATE VIEW 视图名 AS 查询语句

方式二:CREATE OR REPLACE VIEW 视图名 AS 查询语句,此方式的特点是如果该视图已经存在,则替换,如果不存在,则创建。

查询每个部门大于平均薪资的人数,视图写法如下

tex
# 创建视图
CREATE VIEW v1 
AS
SELECT department_id, AVG(salary) as v FROM employees GROUP BY department_id

# 将视图视为 内连接
SELECT e.department_id, COUNT(1) FROM employees e INNER JOIN v1 ON
e.department_id = v1.department_id WHERE e.salary > v GROUP BY e.department_id

12.2、修改视图

tex
# 语法
ALTER VIEW 视图名 AS 查询语句

# 示例
ALTER VIEW v1 AS SELECT *  FROM employees WHERE salary > (SELECT AVG(salary) FROM employees )

12.3、删除视图

tex
# 语法
DROP VIEW 视图名

# 示例
DROP view v1

十三、事务

13.1、什么是事务?

事务是数据库管理系统(DBMS)中的一个核心概念,它确保了一系列数据库操作,要么成功,要么全部失败,从而维护数据库的完整性和一致性

由于 Mysql 中的事务是存储引擎实现,而且只有 InnoDB 支持事务 ,其他常见的如 MyISAM 和 Memory 都是不支持事务的,因此我们讲解 InnoDB 的事务。

13.2、事务四大特性ACID

特性说明
原子性(Atomicity)原子性是指事务是一个不可分割的工作单位,事务内的操作要么都发生,要么都不发生
一致性(Consistency)事务前后数据的完整性必须保持一致
隔离性(Isolation)多个用户并发访问数据库时,一个用户的事务不能被其他用户的事务所干扰,多个并发事务之间数据要相互隔离。隔离性由隔离级别保障!
持久性(Durability)一个事务一旦提交,他对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响。

13.3、事务的使用

开启事务

tex
-- 开启事务
START TRANSACTION 或 BEGIN;

提交事务

tex
-- 提交事务
COMMIT ;

回滚事务

tex
-- 回滚事务
ROLLBACK;

保存点

tex
-- 设置保存点
SAVEPOINT;
-- 设置保存点并命名为S1
SAVEPOINT S1;