mysql的启动

可以通过命令行,在管理员模式下执行以下命令:

net start mysql80

或者可以通过计算机管理中的服务打开。

客户端启动

  1. 使用mysql提供的命令行工具
  2. 通过命令提示符(cmd)执行以下命令:
mysql [-h IP地址] [-P 端口号] -u 用户名 -p

其中,IP地址和端口号可以省略,默认为本地连接。如果使用端口号,则需要指定正确的端口号。用户名为必填项,-p选项表示需要输入密码。

例如,默认连接本地的MySQL服务器,使用root用户登录,可以直接执行以下命令:

mysql -u root -p

基础

数据模型

MySQL是一个基于关系模型的数据库管理系统,它由多个相互连接的二维表组成。

特点:

  1. 使用表进行数据存储,格式统一,便于维护。
  2. 使用SQL语言进行操作,标准统一,使用方便。

DBMS:数据库管理系统

SQL

通用语法

  1. SQL语句可以单行或多行书写,以分号结尾。
  2. 可以使用空格或制表符提高可读性。
  3. SQL语句不区分大小写。
  4. 单行注释可以使用 “–” 或 “#” ,多行注释使用 “//“。

SQL的分类

DDL(数据定义语言):用于定义数据库、表和字段等

ddl:data definition language

数据库操作

  1. 查询所有数据库
SHOW DATABASES;
  1. 查询当前所在的数据库
SELECT DATABASE();
  1. 创建数据库
CREATE DATABASE [IF NOT EXISTS] 数据库名 [DEFAULT CHARSET 字符集][COLLATE 排序规则];
  1. 删除数据库
DROP DATABASE [IF EXISTS] 数据库名;
  1. 使用数据库,切换数据库
USE 数据库名;

表操作

  1. 查询当前数据库中的所有表
SHOW TABLES;
  1. 查询表结构
DESC 表名;
  1. 查询指定表的建表语句
SHOW CREATE TABLE 表名;
  1. 创建表
    创建表的时候可以指明:
  • 表名:表的名称,用于唯一标识该表。
  • 列名及数据类型:每列的名称和对应的数据类型,例如整数、字符串、日期等。
  • 约束:定义列的约束,如主键约束、唯一约束、非空约束等。
  • 默认值:为列指定默认值,当插入新记录时,若未提供该列的值,则自动使用默认值。
  • 索引:为表的列创建索引,以提高查询性能。
  • 分区方式:如果需要,可以指定表的分区方式,以便更高效地管理数据。
  • 存储引擎:指定表的存储引擎,如InnoDB、MyISAM等,不同存储引擎有不同的特性和适用场景。
  • 表空间:指定表所属的表空间,用于控制表的存储位置和空间管理。
  • 权限:指定表的访问权限,包括读取、写入、修改等权限。
CREATE TABLE 表名 (
字段1 类型 [注释],
字段2 类型 [注释],
...
字段n 类型 [注释]
) [注释];
  1. 修改表
# 添加字段
ALTER TABLE 表名 ADD 字段名 类型 [注释];

# 修改字段名和类型
ALTER TABLE 表名 CHANGE 旧字段名 新字段名 类型 [注释];

# 修改数据类型
ALTER TABLE 表名 MODIFY 字段名 新数据类型;

# 修改表名
ALTER TABLE 表名 RENAME TO 新表名;
  1. 删除表
DROP TABLE [IF EXISTS] 表名;

# 清空表数据,但不删除表结构
TRUNCATE TABLE 表名;

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 字段列表 
FROM 表名列表
[WHERE 条件列表]
[GROUP BY 分组字段列表]
[HAVING 分组后过滤条件]
[ORDER BY 排序字段序列]
[LIMIT 分页参数];

基础查询

SELECT * FROM 表名; -- 返回所有字段
SELECT 字段名1, 字段名2, 字段名3 FROM 表名;

设置别名

SELECT 字段1 [AS 别名1], 字段2 [AS 别名2] FROM 表名;

去除重复记录

SELECT DISTINCT 字段列表 FROM 表名;
select distinct

条件查询

SELECT 字段列表 FROM 表名 WHERE 条件列表;
条件运算符

不可以使用=NULL的法

=   -- 等于
<> -- 不等于
> -- 大于
< -- 小于
>= -- 大于等于
<= -- 小于等于
LIKE -- 模糊匹配
IN -- 在某个范围内
BETWEEN ... AND ... -- 在某个范围内 包含两端的数据
IS NULL -- 为空
IS NOT NULL -- 不为空
逻辑运算符
AND -- 与
OR -- 或
NOT -- 非
聚合函数

建议与分组函数配合食用更佳
将一列作为一个整体,进行纵向计算
null值不参与所有聚合函数的运算
聚合函数可以对一列数据进行统计计算,常见的聚合函数包括:

  • COUNT:统计数量
  • MAX:最大值
  • MIN:最小值
  • AVG:平均值
  • SUM:求和
SELECT COUNT(字段或*) FROM 表名; -- 统计数量
SELECT MAX(字段) FROM 表名; -- 最大值
SELECT MIN(字段) FROM 表名; -- 最小值
SELECT AVG(字段) FROM 表名; -- 平均值
SELECT SUM(字段) FROM 表名; -- 求和
分组查询
SELECT 字段 FROM 表名 [WHERE 条件] GROUP BY 分组字段 [HAVING 分组后过滤条件];

关于where和having:where是在分组之前进行筛选,不满足条件不参与分组,而having是分组之后对结果进行过滤 执行时机在分组之后 聚合之前
分组后只能查询聚合字段和分组的字段

排序查询
SELECT 字段 FROM 表名 ORDER BY 字段名 [排序方式], 字段名 [排序方式];

排序方式包括升序(ASC)和降序(DESC),默认为升序。

分页查询

注意数据库的索引是从1开始的

SELECT * FROM 表名 LIMIT 初始位置,要查询的记录条数
SELECT * FROM 表名 LIMIT 要查询的记录数 OFFSET 起始的位置;

DCL

(data control language):创建数据库的使用用户,及其访问权限
localhost——指只有当前主机,%指所有主机

用户控制

查询用户
use mysql;
select *from user;
创建用户
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;

## 授予权限后要刷新
flush privileges;
撤销权限
revoke 权限列表 on 数据库名.表名 from '用户名'@'主机名';

函数

字符串函数

在模糊查询之类的里边进行拼接
image-20230412221859692

使用方式

select +函数();
#拼接
select concat('hello','mysql');
#全部变成小写
select lower('hello');
#全部变成大写
select upper('hello');
#填充lpad,在左边填充达到n个字符
select lpad('01',5,'-');#执行结果是---01;
#rpad类似于lpad只不过填充在右边
select rpad('字符串1',总数,'字符串2')#字符串2是填充的内容
#trim 去除字符串首尾的空格
select trim(字符串);
#substring
select substring(字符串,起始位置,从起始位置往后数几个);

数值函数

#向上取整
ceil(x);
#向下取整
floor(x);
#返回x%y的值
mod(x/y);
#返回0-1的随机数
rand();
#求参数x的四舍五入的值,保留y位小数
round(x,y);

日期函数

==时间可以自己构造,形式’2022-13-14’==
image-20230413212713378

#返回当前日期
curdate();
#返回当前时间
curtime();
#返回当前日期和时间
now();
#获得指定的date的年份
year(date);
#获得指定data的月份
month(date);
#获得指定data的日期
day(date);
#返回一个日期/时间值加上一个时间间隔expxr后的时间值
date_add(date,interval expr type);
#type 不写就是天,还可以写month year;

#返回起始时间date 1 和结束时间date2 之间的天数
datediff(时间一,时间二);
#最后的结果是时间1-时间2

流程函数

#如果value为true,就返回t否则返回f
if(value,t,f);

#如果value1不为空,返回value1,否则返回value2
ifnull(value1,value2);
#类似于return a>b:a?b;

#如果value1为true返回res1....否则返回defalut
case when[value1] then [res1]....else[default] end
#类似if elseif else但是返回多个

#如果expr的值等于value1,返回res1,否则返回defalut默认值
case[expr] when [val] then [res1]....else[default] end;
#只返回一个
#类似于switch case

约束

对数据进行限制
mysql不支持检查约束
约束用于限制存储数据的规则,确保表中数据的正确性、有效性和完整性。约束作用于表中的字段上,可以在创建表或修改表时添加约束。
常见的约束类型包括:

  • 非空约束(NOT NULL):限制字段的值不能为NULL。
  • 唯一约束(UNIQUE):保证字段值的唯一性,不重复。
  • 默认约束(DEFAULT):设置字段的默认值,在存储数据时,如果输入的数据不符合约束,就使用该默认值。
  • 主键约束(PRIMARY KEY):定义主键,作为一行数据的唯一标识,要求非空且唯一。
  • 检查约束(CHECK):对字段的值进行条件检查,保证满足指定的条件。
  • 外键约束(FOREIGN KEY):建立两张表之间的联系,确保关联表中的外键值在主表中存在。
    在创建表或修改表时,可以添加这些约束来限制字段的取值范围,保证数据的完整性和正确性。

外键添加

外键用于建立两张表之间的关联关系。可以在创建表时添加外键约束,也可以在后续通过修改表的方式添加外键约束。

属于跨表的约束
创建外键约束的语法如下:

-- 在创建表时创建外键约束
CONSTRAINT 外键名称 FOREIGN KEY (外键字段名) REFERENCES 主表(主键字段名)

-- 后续修改表时添加外键约束
ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段名) REFERENCES 主表(主键字段名);

-- 取消外键的链接
ALTER TABLE 表名 DROP FOREIGN KEY 外键名称

外键中的删除和更新

在父表中更新或删除对应记录时,可能会影响到子表中的外键关联。可以通过设置外键的删除和更新规则来处理这种情况。
常见的处理方式包括:

  • NO ACTION:不允许在父表中更新或删除对应记录,如果有外键关联则不允许操作。
  • RESTRICT:与NO ACTION相同,在MySQL中等价。
  • CASCADE:在父表中更新或删除对应记录时,同时更新或删除子表中外键关联的记录。
  • SET NULL:在父表中更新或删除对应记录时,将子表中外键列设为NULL。
  • SET DEFAULT:在父表中更新或删除对应记录时,将子表中外键列设为默认值(仅适用于非InnoDB存储引擎)。
    使用方法如下:
ALTER TABLE 表名 ADD CONSTRAINT (外键字段) REFERENCES 主表名(主字段名) ON UPDATE [更新时的处理方式] ON DELETE [删除时的处理方式]

多表查询

多表关系

数据库中的多表关系有三种:

  1. 一对多关系(多对一关系):在多的一方建立外键,表示一个主表记录对应多个从表记录。
  2. 多对多关系:通过第三张中间表维护多对多关系,表示主表记录和从表记录之间的多对多关系。
  3. 一对一关系:通过设置唯一性约束来表示一对一关系。

多表查询

多表查询是指在查询过程中同时操作多张表,以获取所需的数据。常见的多表查询包括连接查询、子查询和联合查询。
把不经常和经常使用的数据分开可以一定程度上减少表的复杂程度并且有利于查询(字段少)

连接查询

连接查询用于将多个表进行关联查询,得到符合条件的数据。
内连接:返回两个表中交集部分的数据。

  • 隐式内连接:
    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
UNION [ALL] -- ALL表示保留重复记录
SELECT 字段列表 FROM 表b

注意:进行联合查询时,要确保每个SELECT语句的字段列表一致,类型兼容。

事务

事务是指一组操作被视为一个工作单元,要么全部成功提交,
要么全部失败回滚。事务能够保证数据的一致性和完整性。

事务操作

在MySQL中,可以通过设置自动提交和手动提交来控制事务的提交方式。

  1. 设置自动提交:

    -- 查看当前事务提交方式
    SELECT @@autocommit;

    -- 设置自动提交
    SET @@autocommit = 1; -- 1表示自动提交,0表示手动提交
  2. 手动提交:

    -- 开始一个事务
    START TRANSACTION; -- 或者使用 BEGIN

    -- 提交事务
    COMMIT;

    -- 回滚事务
    ROLLBACK;

事务四大特性

事务具有四大特性(ACID):

  1. 原子性(Atomicity):事务是一个不可再分割的工作单元,要么全部执行成功,要么全部不执行。
  2. 一致性(Consistency):事务执行前后,数据库的状态应保持一致。
  3. 隔离性(Isolation):并发执行的事务之间应该相互隔离,一个事务执行过程中的中间结果对其他事务是不可见的。
  4. 持久性(Durability):事务提交后,其结果应该永久保存在数据库中。

事务并发问题

事务并发可能会引发以下问题:

  1. 脏读(Dirty Read):一个事务读取到了另一个事务尚未提交的数据。
  2. 不可重复读(Non-repeatable Read):一个事务多次读取同一数据,在事务执行期间,数据被其他事务修改,导致两次读取的结果不一致。
  3. 幻读(Phantom Read):一个事务多次查询同一个范围的数据,在事务执行期间,其他事务插入或删除了满足条件的数据,导致查询结果发生变化。

为了解决并发问题,可以通过设置事务的隔离级别来控制事务之间的交互。

隔离级别

数据库事务的隔离级别用于控制事务之间的交互和并发操作。

MySQL支持如下四个隔离级别:

  1. READ UNCOMMITTED(读未提交):最低级别,事务可以读取未提交的数据,可能会出现脏读、不可重复读和幻读。
  2. READ COMMITTED(读已提交):默认隔离级别,事务只能读取已提交的数据,可以避免脏读,但仍可能出现不可重复读和幻读。
  3. REPEATABLE READ(可重复读):事务开始时创建一个快照,读取数据时只能读取该快照中的数据,可以避免脏读和不可重复读,但仍可能出现幻读。
  4. SERIALIZABLE(串行化)

复习

mysql的安装和初始化配置

数据库:存储数据的仓库,英文DataBase

数据库管理系统:MySQL等软件。简称DBM

sql:结构化的查询语句,操作关系型数据库的编程语言

常见的数据库

image-20230927152306359

配置文件

名称为my.ini

[mysql]
default-character-set=utf8

[mysqld]
character-set-server=utf8
default-storage-engine=INNODB
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

上面代码意思就是配置数据库的默认编码集为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 内含权限,安全等信息