了解数据库与mysql

数据库是一个有组织的数据集合,通常以电子方式存储和管理。数据库的主要目的是有效地存储、检索和管理数据。数据库可以根据不同的需求和结构进行分类。包括关系数据库、非关系数据库、对象数据库和图数据库,MySQL是一个开源的关系数据库管理系统(RDBMS),采用结构化查询语言(SQL)来管理和操作数据。它是最流行的数据库之一,广泛用于各种应用程序和网站。

官网安装

推荐安装在linux中

1
https://dev.mysql.com/

详细安装教程参考文章Mysql超详细安装配置教程(保姆级)_mysql安装及配置超详细教程-CSDN博客

不同类型linux版本对应这不同类型的mysql版本,所需要下载的包也不同,当然你在下在的过程中,网页会自动检测你需要安装哪个版本的mysql

mysql社区版的安装网页MySQL :: Download MySQL Community Server

进去网页会自动的为你识别电脑需要用到哪个版本的mysql,直接无脑第一个就行

kali是自带MySQL的,所以这边直接用命令启动就行了

注意:你在使用MySQL的过程中,发现自己的启动服务是MariaDB,请不用慌张,因为MariaDB就是 MySQL 的一个分支,由 MySQL 的原始开发者创建,旨在提供一个开源的替代方案。所以不用觉得自己下载了一个假的MySQL,放心使用与学习

Windows安装MySQL

首先MySQL的下载地址MySQL :: Download MySQL Installer (Archived Versions)

然后这边推荐跟着视频安装,推荐手把手教你安装MySQL(最新版本安装)_哔哩哔哩_bilibili

如果安装错误,可能需要geek的卸载,下载地址为Geek Uninstaller - the best FREE uninstaller

使用图形化工具推荐navicat,激活教程【2024最新】navicat17 安装、激活、配置、破解、连接数据库、连接mysql、安装教程、激活教程、破解教程、使用教程_哔哩哔哩_bilibili

激活资源Navicat - 飞书云文档

注意:这里安装电脑名与路径都不能有中文

基本操作

启动MySQL服务

1
sudo systemctl start mysql

关闭MySQL服务

1
sudo systemctl stop mysql

重启MySQL服务

1
sudo systemctl restart mysql

检查MySQL的服务状态

1
sudo systemctl status mysql

SQL基础

概述:按照功能不同,SQL语句可以分为以下几类

DDL 数据库定义语言

概述:用来定义数据库对象,比如数据库、表、列等等,相关的关键之包括CREATEDROPALTERTRUNCATE等等

DML 数据库操作语言

概述:用于对数据库中的记录进行新增、删除或者修改,关键字包括INSERT、UPDATE、DELETE、CALL等等

DQL 数据库查询语言

概述:用来查询数据库中的记录,关键字包括SELECT、WHERE等等

DCL 数据控制语言

概述:用来定义数据库的访问权限和安全级别,以及创建用户等等,关键字包括GRANT、REVOKE

创建数据库

首先用root用户启动mysql

1
mysql -u root -p

显示当前存在的数据库

1
SHOW DATABASES;

创建数据库

1
CREATE DATABASES 库名;

删除数据库

1
DROP DATABASES 库名

创建表

选择数据库

1
USE 库名;

创建表

1
CREATE TABLE 表名 ();

注意:括号中是字段的名称和数据类型,字段之间用逗号隔开,最后的字段后面不用加逗号

示例:创建一个玩家数据的表

1
2
3
4
5
6
7
create table player(
id INT,
name VARCHAR(100),
level INT,
exp INT,
gold DECIMAL(10,2)
)

mysql数据类型

数值类型

整数类型

1
2
3
4
5
根据空间储存1-8分为
TINYINT 1字节
SMALLINT 2字节
INT 4字节
BIGINT 8字节

浮点数类型

1
2
3
Float 4字节
Double 8字节
DECIMAL(长度,保留几位小数)
日期和时间类型
1
2
3
4
DATE 日期
TIME 时间
DATETINME 日期时间
TINESTAMP 时间戳
字符串类型
1
2
3
4
CHAR 定长字符串
VACHAR 变长字符串
TEXT 文本
BLQB 二进制数据

查看表的结构

1
DESC 表名;

修改表结构

修改表中列的数据类型

1
ALTER table 表名 MODIFY COLUMN 列名 新的数据类型;

修改表中列名的名称

1
ALTER TABLE 表名 RENAME COLUMN 原列名 to 新列名;

添加新列

1
ALTER TABLE 表名 ADD COLUMN 列名 数据类型;

删除列

1
ALTER TABLE 表名 DROP COLUMN 列名;

删除表

1
DROP TABLE 表名;

数据的增删查改

插入数据

1
INSERT INTO 表名(想加入数据的列) VALUES (对应数据)

注意:如果values括号中包括了所有列,并且顺序结构与表的结构一致,就可以省略表名后面的括号

注意:如果想要插入多条数据,可以在values后面添加多个括号

查询数据

1
select 列名或者* from 表名;

条件约束

1
2
3
4
5
6
DEFAULT 默认值
NULL 可以为空
NOT NULL 不可以为空
UNIQUE 指定唯一
主键约束:用来保证数据的唯一性,不为空,每个表只有一个主键
外键约束:保证数据的一致性,一个表的外键必须是另个表的主键

修改数据

1
UPDATE 表名 set 列名 = 值 where 条件子句(列:name='王五');

注意:修改多列可以用逗号隔开列举的列,如果没加where会修改整个列的值

删除数据

1
DELETE FROM 表名 where 条件子句;

数据库的导入与导出

导出

1
mysqldump -u root(用户名) -p 库名 表名 > 文件名.sql 

注意:表名可以省略,省略之后就会导出里面全部的表

导入

1
mysql -u root(用户名) -p 库名 < 文件名.sql 

常用语句

where

概述:用于提取满足标准的记录,它可以同select、update、delete一起使用,后面加上条件语句即可,根据条件的复杂程度配合NOT、AND、OR和括号,如果同时使用需要注意他们的优先级NOT>AND>OR

IN

概述:可以指定多个值

BETWEEN…AND…

概述:可以用于指定一个连续的范围

NOT

概述:表示取反

LIKE

概述:用于模糊查询,其中用到两个字符,%_,%表示任意个字符,_表示任意一个字符

REGEXP

概述:使用正则表达式

NULL

概述:表示空值,查询中不能用某某=null语句,应该用某某 IS NULL,这条语句可以搭配NOT。

注意:NULL需要使用IS NULL来判断,而空字符串用等号判断

ORDER BY

概述:指定某个字段来排序,如果不指定默认升序(ASC),在列名后面加DESC可以指定降序,如果需要指定多个字段,可以使用逗号连接

注意:字段或列可以通过数字表示,即第几列

聚合函数

概述:对某列进行一些计算

1
2
3
4
5
6
7
8
9
常用聚合函数
AVG() 返回集合的平均值
COUNT() 返回集合中的项目个数
MAX() 返回最大值
MIN() 返回最小值
SUM() 求和 \\括号指定列名
SUBSTR(数据类型为字符串的列名,开始位置,截取长度)
ROUND() 对小数进行四舍五入
LEFT(string, length) 函数用于从字符串的左侧提取指定数量的字符。

GROUP BY

概述:对查询结果进行分组,后面接列名

HAVING

概述:一般对分租后的结果筛选,后面接条件语句

LIMIT

概述:对结果限制数量,如果后面只接一个数字,就是限制出现几条结果,如果后面出现两个数字并用逗号隔开,第一数字表示偏移量,结果会从这个数字列之后开始显示,第二个数值表示显示几条数据

UNION

概述:用来合并两个查询的结果,把两个语句用UNION连接即可,此命令会默认清除重复的记录,用UNION ALL就不会清楚重复数据

示例:

1
2
3
4
5
SELECT name, email
FROM employees
UNION ALL
SELECT name, email
FROM contractors;

INTERSECT

概述:用来取两个查询结果的交集

示例:

1
2
3
4
5
SELECT name, email
FROM employees
INTERSECT
SELECT name, email
FROM contractors;

AS

概述:给一个结果的列取别名

EXCEPT

概述:用于取两个查询结果的差集

示例:

1
2
3
4
5
SELECT name, email
FROM employees
EXCEPT
SELECT name, email
FROM contractors;

EXISTS

概述:判断一个查询是否有结果,返回1或0

示例:

1
2
3
4
5
6
7
SELECT department_name
FROM departments d
WHERE EXISTS (
SELECT 1
FROM employees e
WHERE e.department_id = d.id
);

JOIN

概述:可以根据一个或多个列之间的关系来组合这些表的行。

示例:

1
2
3
SELECT e.name, d.department_name
FROM employees e
FULL JOIN departments d ON e.department_id = d.id;

DISTINCT

概述:可以与 SELECT 语句一起使用,以确保返回的结果集中的每一行都是唯一的。

示例:

1
2
3
4
SELECT DISTINCT department_id
FROM employees
ORDER BY department_id;

子查询

概述:一个查询的结果作为另个一查询的条件

表关联

内连接

概述:只返回两个表中都有的数据

左连接

概述:返回左表中的所有数据和右表中匹配的数据,右表中没有的数据用NULL填充

右连接

概述:返回右表中的所有数据和左表中匹配的数据,左表中没有的数据用NULL填充

索引

概述:可以提高查询速率

创建索引

1
2
3
4
5
6
CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name
ON tal_name(index_col_name,....)
解释:UNIQUE表示唯一索引,FULLTEXT表示全文索引,SPATIAL表示空间索引,后面的索引名、表名、列名就不解释了

在修改表结构的时候也可以创建索引
alter table 表名 add index 索引名(列名)

查看索引

1
show index from 表名

删除索引

1
DROP INDEX 索引名 on 表名

视图

概述:是一种虚拟存在的表,本身并不包含数据,而是作为一个查询语句保存在数据字典中,当我们查询视图的时候,它会根据查询语句的定义来动态的生成数据

创建视图

1
2
3
CREATE VIEW 视图名
AS
SELECT语句

修改视图

1
2
3
alert VIEW 视图名
AS
SELECT语句

删除视图

1
drop view 视图名;

存储过程

概述:存储过程(Stored Procedure)是一种在数据库中存储的预编译的 SQL 代码块,可以被多个应用程序或用户重复调用。存储过程在数据库中以一种独立的方式存在,可以接受参数并执行一系列的 SQL 语句。存储过程是一种强大的工具,可以帮助开发者更高效地管理数据库操作,封装复杂的业务逻辑,提升性能和安全性。在大型应用中,合理使用存储过程可以显著提高开发效率和系统的可维护性。

查看库里的存储过程

1
SHOW PROCEDURE STATUS WHERE Db = 'your_database_name';

使用

示例:在pubs数据库中创建存储过程max_price,根据指定的图书类型(输入参数)返回该类图书的最高单价(输出参数)。要求在创建存储过程前要先判断该存储过程是否已存在,如果存在,则将其删除。

在sql server中语句表达

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
use pubs
if exists (select name from sysobjects
where name='max_price'and type='P')
drop procedure max_price
go

create procedure max_price
@Max_price money output,
@type char(12)
as
begin
select @Max_price= max(price)
from titles
where type = @type
end
go

declare @max_price money
execute max_price @type ='mod_cook' ,@Max_price = @max_price output
print @max_price

示例:在MySQL语句表达

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
USE pubs;

-- 删除存储过程,如果存在
DROP PROCEDURE IF EXISTS max_price;

-- 创建存储过程
DELIMITER // -- 设置结束符

CREATE PROCEDURE max_price(
OUT Max_price DECIMAL(10, 2), -- 使用 DECIMAL 代替 MONEY
IN type CHAR(12)
)
BEGIN
SELECT MAX(price) INTO Max_price
FROM titles
WHERE type = type; -- 注意这里的 type 是输入参数
END //

DELIMITER ; -- 设置结束符

-- 声明变量
SET @max_price = 0; -- 初始化变量

-- 调用存储过程
CALL max_price(@max_price, 'mod_cook');

-- 输出结果
SELECT @max_price AS max_price; -- 使用 SELECT 输出变量