mysql基础
mysql的启动
可以通过命令行,在管理员模式下执行以下命令:
net start mysql80 |
或者可以通过计算机管理中的服务打开。
客户端启动
- 使用mysql提供的命令行工具
- 通过命令提示符(cmd)执行以下命令:
mysql [-h IP地址] [-P 端口号] -u 用户名 -p |
其中,IP地址和端口号可以省略,默认为本地连接。如果使用端口号,则需要指定正确的端口号。用户名为必填项,-p选项表示需要输入密码。
例如,默认连接本地的MySQL服务器,使用root用户登录,可以直接执行以下命令:
mysql -u root -p |
基础
数据模型
MySQL是一个基于关系模型的数据库管理系统,它由多个相互连接的二维表组成。
特点:
- 使用表进行数据存储,格式统一,便于维护。
- 使用SQL语言进行操作,标准统一,使用方便。
DBMS:数据库管理系统
SQL
通用语法
- SQL语句可以单行或多行书写,以分号结尾。
- 可以使用空格或制表符提高可读性。
- SQL语句不区分大小写。
- 单行注释可以使用 “–” 或 “#” ,多行注释使用 “/…/“。
SQL的分类
DDL(数据定义语言):用于定义数据库、表和字段等
ddl:data definition language
数据库操作
- 查询所有数据库
SHOW DATABASES; |
- 查询当前所在的数据库
SELECT DATABASE(); |
- 创建数据库
CREATE DATABASE [IF NOT EXISTS] 数据库名 [DEFAULT CHARSET 字符集][COLLATE 排序规则]; |
- 删除数据库
DROP DATABASE [IF EXISTS] 数据库名; |
- 使用数据库,切换数据库
USE 数据库名; |
表操作
- 查询当前数据库中的所有表
SHOW TABLES; |
- 查询表结构
DESC 表名; |
- 查询指定表的建表语句
SHOW CREATE TABLE 表名; |
- 创建表
创建表的时候可以指明:
- 表名:表的名称,用于唯一标识该表。
- 列名及数据类型:每列的名称和对应的数据类型,例如整数、字符串、日期等。
- 约束:定义列的约束,如主键约束、唯一约束、非空约束等。
- 默认值:为列指定默认值,当插入新记录时,若未提供该列的值,则自动使用默认值。
- 索引:为表的列创建索引,以提高查询性能。
- 分区方式:如果需要,可以指定表的分区方式,以便更高效地管理数据。
- 存储引擎:指定表的存储引擎,如InnoDB、MyISAM等,不同存储引擎有不同的特性和适用场景。
- 表空间:指定表所属的表空间,用于控制表的存储位置和空间管理。
- 权限:指定表的访问权限,包括读取、写入、修改等权限。
CREATE TABLE 表名 ( |
- 修改表
# 添加字段 |
- 删除表
DROP TABLE [IF EXISTS] 表名; |
DML(数据操作语言):用于对数据进行增、删、改
新增数据
INSERT INTO 表名 (字段1, 字段2, ...) VALUES (值1, 值2, ...),(值1, 值2, ...),(值1, 值2, ...),(值1, 值2, ...),(值1, 值2, ...),(值1, 值2, ...),(值1, 值2, ...); |
修改数据
UPDATE 表名 SET 字段1 = 值1, 字段2 = 值2, ... [WHERE 条件]; |
删除数据
DELETE FROM 表名 WHERE 条件; |
DQL(数据查询语言):用于查询数据
语法结构:必需按照顺序,否则会出错
SELECT 字段列表 |
基础查询
SELECT * FROM 表名; -- 返回所有字段 |
设置别名
SELECT 字段1 [AS 别名1], 字段2 [AS 别名2] FROM 表名; |
去除重复记录
SELECT DISTINCT 字段列表 FROM 表名; |
条件查询
SELECT 字段列表 FROM 表名 WHERE 条件列表; |
条件运算符
不可以使用=NULL的法
= -- 等于 |
逻辑运算符
AND -- 与 |
聚合函数
建议与分组函数配合食用更佳
将一列作为一个整体,进行纵向计算
null值不参与所有聚合函数的运算
聚合函数可以对一列数据进行统计计算,常见的聚合函数包括:
- COUNT:统计数量
- MAX:最大值
- MIN:最小值
- AVG:平均值
- SUM:求和
SELECT COUNT(字段或*) FROM 表名; -- 统计数量 |
分组查询
SELECT 字段 FROM 表名 [WHERE 条件] GROUP BY 分组字段 [HAVING 分组后过滤条件]; |
关于where和having:where是在分组之前进行筛选,不满足条件不参与分组,而having是分组之后对结果进行过滤 执行时机在分组之后 聚合之前
分组后只能查询聚合字段和分组的字段
排序查询
SELECT 字段 FROM 表名 ORDER BY 字段名 [排序方式], 字段名 [排序方式]; |
排序方式包括升序(ASC)和降序(DESC),默认为升序。
分页查询
注意数据库的索引是从1开始的
SELECT * FROM 表名 LIMIT 初始位置,要查询的记录条数 |
DCL
(data control language):创建数据库的使用用户,及其访问权限
localhost——指只有当前主机,%指所有主机
用户控制
查询用户
use mysql; |
创建用户
create user '用户名'@'主机名' identified by '密码'; |
修改用户密码
alter user '用户名'@'主机名' identified with mysql_native_password by '新密码'; |
删除用户
drop user '用户名'@'主机名' |
权限控制
all表示所有的权限
![[权限展示.png]]
查询权限
show grants for '用户名'@'主机名' |
授予权限
grant 权限列表 on 数据库名.表名 to '用户名'@'主机名' identified by '用户密码' with grant option; |
撤销权限
revoke 权限列表 on 数据库名.表名 from '用户名'@'主机名'; |
函数
字符串函数
在模糊查询之类的里边进行拼接
使用方式
select +函数(); |
数值函数
#向上取整 |
日期函数
==时间可以自己构造,形式’2022-13-14’==
#返回当前日期 |
流程函数
如果value为true,就返回t否则返回f |
约束
对数据进行限制
mysql不支持检查约束
约束用于限制存储数据的规则,确保表中数据的正确性、有效性和完整性。约束作用于表中的字段上,可以在创建表或修改表时添加约束。
常见的约束类型包括:
- 非空约束(NOT NULL):限制字段的值不能为NULL。
- 唯一约束(UNIQUE):保证字段值的唯一性,不重复。
- 默认约束(DEFAULT):设置字段的默认值,在存储数据时,如果输入的数据不符合约束,就使用该默认值。
- 主键约束(PRIMARY KEY):定义主键,作为一行数据的唯一标识,要求非空且唯一。
- 检查约束(CHECK):对字段的值进行条件检查,保证满足指定的条件。
- 外键约束(FOREIGN KEY):建立两张表之间的联系,确保关联表中的外键值在主表中存在。
在创建表或修改表时,可以添加这些约束来限制字段的取值范围,保证数据的完整性和正确性。
外键添加
外键用于建立两张表之间的关联关系。可以在创建表时添加外键约束,也可以在后续通过修改表的方式添加外键约束。
属于跨表的约束
创建外键约束的语法如下:
-- 在创建表时创建外键约束 |
外键中的删除和更新
在父表中更新或删除对应记录时,可能会影响到子表中的外键关联。可以通过设置外键的删除和更新规则来处理这种情况。
常见的处理方式包括:
- NO ACTION:不允许在父表中更新或删除对应记录,如果有外键关联则不允许操作。
- RESTRICT:与NO ACTION相同,在MySQL中等价。
- CASCADE:在父表中更新或删除对应记录时,同时更新或删除子表中外键关联的记录。
- SET NULL:在父表中更新或删除对应记录时,将子表中外键列设为NULL。
- SET DEFAULT:在父表中更新或删除对应记录时,将子表中外键列设为默认值(仅适用于非InnoDB存储引擎)。
使用方法如下:
ALTER TABLE 表名 ADD CONSTRAINT (外键字段) REFERENCES 主表名(主字段名) ON UPDATE [更新时的处理方式] ON DELETE [删除时的处理方式] |
多表查询
多表关系
数据库中的多表关系有三种:
- 一对多关系(多对一关系):在多的一方建立外键,表示一个主表记录对应多个从表记录。
- 多对多关系:通过第三张中间表维护多对多关系,表示主表记录和从表记录之间的多对多关系。
- 一对一关系:通过设置唯一性约束来表示一对一关系。
多表查询
多表查询是指在查询过程中同时操作多张表,以获取所需的数据。常见的多表查询包括连接查询、子查询和联合查询。
把不经常和经常使用的数据分开可以一定程度上减少表的复杂程度并且有利于查询(字段少)
连接查询
连接查询用于将多个表进行关联查询,得到符合条件的数据。
内连接:返回两个表中交集部分的数据。
- 隐式内连接:
SELECT 字段列表 FROM 表一, 表二 WHERE 条件 ...
- 显式内连接:
SELECT 字段列表 FROM 表一 [INNER] JOIN 表二 ON 连接条件 ...
外连接:返回指定表的所有数据,以及与其他表的交集部分数据。
- 左外连接:返回左表的所有数据,以及与右表的交集部分数据。
SELECT 字段列表 FROM 表一 LEFT [OUTER] JOIN 表二 ON 条件 ...
- 右外连接:返回右表的所有数据,以及与左表的交集部分数据。
SELECT 字段列表 FROM 表一 RIGHT [OUTER] JOIN 表二 ON 条件 ...
子连接:在查询中嵌套查询,实现对自身表的查询。
根据子查询的结果不同判断的也不同
单行单列:即结果只有一个值用”=“
多行单列:结果多个值 用in
多行多列 作为表
例子:select 字段 from (子查询) where 条件;
select 字段 from table where 条件(子查询)
联合查询
联合查询将多次查询的结果合并起来。使用UNION操作符可以将多个SELECT语句的结果集合并为一个结果集。
SELECT 字段列表 FROM 表a |
注意:进行联合查询时,要确保每个SELECT语句的字段列表一致,类型兼容。
事务
事务是指一组操作被视为一个工作单元,要么全部成功提交,
要么全部失败回滚。事务能够保证数据的一致性和完整性。
事务操作
在MySQL中,可以通过设置自动提交和手动提交来控制事务的提交方式。
设置自动提交:
-- 查看当前事务提交方式
SELECT @@autocommit;
-- 设置自动提交
SET @@autocommit = 1; -- 1表示自动提交,0表示手动提交手动提交:
-- 开始一个事务
START TRANSACTION; -- 或者使用 BEGIN
-- 提交事务
COMMIT;
-- 回滚事务
ROLLBACK;
事务四大特性
事务具有四大特性(ACID):
- 原子性(Atomicity):事务是一个不可再分割的工作单元,要么全部执行成功,要么全部不执行。
- 一致性(Consistency):事务执行前后,数据库的状态应保持一致。
- 隔离性(Isolation):并发执行的事务之间应该相互隔离,一个事务执行过程中的中间结果对其他事务是不可见的。
- 持久性(Durability):事务提交后,其结果应该永久保存在数据库中。
事务并发问题
事务并发可能会引发以下问题:
- 脏读(Dirty Read):一个事务读取到了另一个事务尚未提交的数据。
- 不可重复读(Non-repeatable Read):一个事务多次读取同一数据,在事务执行期间,数据被其他事务修改,导致两次读取的结果不一致。
- 幻读(Phantom Read):一个事务多次查询同一个范围的数据,在事务执行期间,其他事务插入或删除了满足条件的数据,导致查询结果发生变化。
为了解决并发问题,可以通过设置事务的隔离级别来控制事务之间的交互。
隔离级别
数据库事务的隔离级别用于控制事务之间的交互和并发操作。
MySQL支持如下四个隔离级别:
- READ UNCOMMITTED(读未提交):最低级别,事务可以读取未提交的数据,可能会出现脏读、不可重复读和幻读。
- READ COMMITTED(读已提交):默认隔离级别,事务只能读取已提交的数据,可以避免脏读,但仍可能出现不可重复读和幻读。
- REPEATABLE READ(可重复读):事务开始时创建一个快照,读取数据时只能读取该快照中的数据,可以避免脏读和不可重复读,但仍可能出现幻读。
- SERIALIZABLE(串行化)
复习
mysql的安装和初始化配置
数据库:存储数据的仓库,英文DataBase
数据库管理系统:MySQL等软件。简称DBM
sql:结构化的查询语句,操作关系型数据库的编程语言
常见的数据库
配置文件
名称为my.ini
[mysql] |
上面代码意思就是配置数据库的默认编码集为utf - 8和默认存储引擎为INNODB。
初始化
mysqld --initialize-insecure |
mysql注册成为服务
mysqld -install |
修改默认账户密码
mysqladmin -u root password 密码 |
登录参数
mysql -u用户名 -p密码 -h要连接的mysql服务器的ip地址(默认127.0.0.1) -P端口号(默认3306)
#表示单行注释
自带数据库
information_schema 表示可视化的数据库
mysql 内含权限,安全等信息