Skip to content

mysql5.7忘记密码

windows下:

关闭mysql服务

my.ini的[mysqld]下添加skip_grant_tables

打开mysql服务

连接并执行use mysql;update user set authentication_string=password('123456') where user='root'; flush privileges;

结束;

// 阿里巴巴规范
id 主键
version 乐观锁
is_delete 伪删除
gmt_create 创建时间
gmt_update 修改时间

1.操作数据库

1.1、操作(了解)

1、创建数据库

  • CREATE DATABASE [IF NOT EXISTS] hellow

2、删除数据库

  • DROP DATABASE [IF EXISTS] hellow

3、使用数据库

  • USE hellow

4、查看所有库

  • SHOW DATABASES

5、查看创建数据库语句

  • SHOW CREATE DATABASE school

6、查看创建数据表语句

  • SHOW CREATE TABLE hellow

7、显示表的结构

  • DESC student

1.2、数据类型

数值
类型描述占用
tinyint十分小的数据1字节
smallint较小的数据2字节
mediumint中等大小的数据3字节
int标准的整数4字节
bigint较大的数据8字节
float浮点数4字节
double浮点数(精度问题)8字节
decimal字符串浮点数 金融计算
字符串
类型描述范围
char字符串固定大小的0-255
varchar**可变字符串 **0-65535
tinytext微型文本2^8-1
text文本串2^16-1
时间日期
类型描述格式
dateYYYY-MM-DD日期
timeHH:mm:ss时间
datetimeYYYY-MM-DD HH:mm:ss日期时间
timestamp1970.1.1到现在毫秒数时间戳
year年份
NULL

1.3、字段属性

Unsigned

  • 无符号整数
  • 声明不能为负数

zerofill

  • 0 填充
  • 不足位数用 0 填充 int(3) , 5 >>> 005

自增

  • 自增,默认自动 +1
  • 通常设计唯一主键 index , 必须整数类型
  • 可自定义起始值和步长

非空

  • 假设设置not null,不赋值会报错
  • NULL,不填写默认NULL

默认

  • 不填写默认赋值

1.4、创建表

-- 表和字段尽量用 `` 括起来

-- AUTO_INCREMENT 自增

-- 字符串使用单引号括起来

-- 所有语句后加 , 号 最后一个不用加

sql
CREATE TABLE IF NOT EXISTS `students` (
	`id` INT(4) NOT NULL AUTO_INCREMENT COMMENT '学号',
    `name` VARCHAR(30) NOT NULL DEFAULT '匿名' COMMENT '姓名',
    `pwd` VARCHAR(20) NOT NULL DEFAULT '123465' COMMENT '密码',
    `sex` VARCHAR(2) NOT NULL DEFAULT '女' COMMENT '性别',
    `birthday` DATETIME DEFAULT NULL COMENT '出生日期',
    `address` VARCHAR(100) DEFAULT NULL COMMENT '家庭住址',
    `email` VARCHAR(50) DEFAULT NULL COMMENT '邮箱',
    PRIMARY KEY (`id`)
)ENGINE=INNODB DEFAULT CHARSET=utf8

格式

sql
CREATE TABLE [IF NOT EXISTS] `表名` (
	`字段名` 列类型 [属性] [索引] [注释],
    PRIMARY KEY (`id`)
)[表类型][字符集设置][注释]

1.5、表的类型(引擎)

-- 关于数据库引擎

INNODB 默认使用

MYISAM 早些年使用

MYISAMINNODB
事务支持XY
数据行锁定XY
外键约束XY
全文索引YX
表空间大小较小较大,约2倍

常规使用操作:

  • MYISAM 节约空间,速度较快
  • INNODB 安全性高,事务处理,多表多用户操作

在物理空间

所有数据库都在 data 目录下,一个文件夹对应一个数据库

本质是文件存储!

MySQL引擎在物理上文件的区别

  • InnoDB 在表中只有一个 *.frm 文件,以及上级目录下ibdata1文件
  • MYISAM 对应文件
    • *.frm - 表结构定义文件
    • *.MYD 数据文件(data)
    • *.MYI 索引文件(index)
sql
设置数据表字符集编码
CHARSET=utf8

默认编码是Latin1,不支持中文

1.6、修改表

修改表名

sql
ALTER TABLE teacher RENAME AS teacher1

增加字段

sql
ALTER TABLE teacher1 ADD age INT(11)

修改字段

sql
ALTER TABLE teacher1 MODIFY age VARCHAR(2) -- 修改约束
ALTER TABLE teacher1 CHANGE age age1 -- 字段重命名

删除表字段

sql
ALTER TABLE teacher1 DROP age1

删除表

sql
DROP TABLE IF EXISTS teacher1

==所有的创建和删除操作尽量加上判断,以免报错==

注意点:

  • `` 字段名,用这个包裹
  • -- /* */ 注释
  • sql关键字大小写不敏感 建议全部小写
  • 所有符号全部用英文

2.1、外键(了解)(不用)(库级别)

sql
ALTER TABLE `student`
ADD CONSTRAINT `FK_gradeid` FOREIGN KEY('gradeid') REFERENCES `grade`(`gradeid`);
-- 格式
-- ALTER TABLE 表 ADD CONSTRAINT 约束名 FOREIGN KEY(做外键的列) REFERENCES 哪个表(字段);

== 物理约束不建议使用 ==

2.DML语言(增删改)

sql
-- 增(添加)
-- INSERT INTO 表名([字段1,字段2,字段3]) VALUES ('值1','值2','值3')
-- 一般一定要数据和字段一一对应!
INSERT INTO test(`name`,`age`,`sex`) VALUES ('名字1',19,'男'),('名字2',20,'男')
sql
-- 删(删除)
-- DELETE FROM 表名 WHERE [条件]
DELETE FROM test WHERE id=1

-- TRUNCATE
-- 完全清空数据库
TRUNCATE test


/*
 - 都能删除数据,都不会删除表结构
 - TRUNCATE 重新设置 自增列 计数器归零
 - TRUNCATE 不会影响事务
*/
sql
-- 改(更新)
-- UPDATE 表名 SET 列=value WHERE [条件]
-- 必须指定条件(WHERE)!否则更改整张表!!
UPDATE test SET name='名字66',age=99 WHERE id = 1 AND name = 'name1'

条件运算符 - 操作符

操作符含义范围
=等于id = 1
<> 或 !=不等于id <> 5 或 id != 5
>大于id > 10
<小于id < 10
>=大于等于
<=小于等于
BETWEEN ... AND ...范围内
AND&& 并且
OR|| 或者
Notnot a !a逻辑非,取反

3.DQL 查询(重点)

Data Query LANGUAGE:数据查询语言

  • 所有查询操作都用 SELECT
  • 简单和复杂查询都能查
  • 数据库最核心语言
  • 使用频率最高的语句
sql
-- 查询全部
SELECT * FROM test

-- 查询指定字段
SELECT id,name,age FROM test

-- 别名 AS
SELECT id AS 艾迪,name AS 名字,age AS 年龄 FROM test AS t
SELECT id 艾迪,name 名字,age 年龄 FROM test t    -- AS可以省略

-- 函数 CONCAT(a,b)
SELECT CONCAT('姓名:',name) FROM test

where 条件子句

  • 检索数据中 符合条件 的值

模糊查询:比较运算符

运算符语法描述
IS NULLa IS NULL如果操作符为NULL结果为真
IS NOT NULLa IS NOT NULL如果操作符不为NULL 结果为真
BETWEENa BETWEEN b AND c在a和b和c之间,则结果为真
LIKEa LIKE b如果a匹配b,则为真
INa IN(a1,a2,a3...)a在a1、a2...其中一个值,为真
  • like 结合 %(代表0到任意字符) _(代表一个字符)

联表查询

INNER JOIN

  • 如果表中至少有一个匹配,就返回行

LEFT JOIN

  • 即使右表没有匹配,也返回左表所有制

RIGHT JOIN

  • 即使左表没有匹配,也返回右表所有制

FULL JOIN

  • 只要其中某个表存在匹配,FULL JOIN 关键字就会返回行。

分页和排序

DESC 倒序、降序

ASC 顺序、升序

sql
SELECT name, age FROM user ORDER BY name DESC, age ASC

LIMIT 起始值,页面大小

sql
-- 第1页 5条数据
-- (limit*page)-1,limit
-- 0,5
SELECT name, age FROM user ORDER BY name DESC, age ASC LIMIT 0,5

常用函数

数学运算

SELECT ABS(-8) --绝对值

SELECT CEILING(9.4) --向上取整

SELECT FLOOR(9.4) --向下取整

SELECT RAND() --返回0-1之间的随机数

SELECT SIGN(-10) --判断一个数的符号 0返回0 正数1 负数-1

字符串函数

SELECT CHAR_LENGTH('字符串') --返回字符串长度 3

SELECT CONCAT('拼接','字符') --拼接字符串

SELECT INSERT('这是字符串',1,2,'不是啊') --替换 >> 不是啊字符串

SELECT LOWER('Power') -- 转大写

SELECT UPPER('Power') --转小写

SELECT INSTR('Power','o') --返回第一次出现的位置

SELECT REPLACE('坚持就能成功','坚持','努力') --替换指定字符

SELECT SUBSTR('坚持就能成功',3,2) --返回指定字符串 >> 就能

SELECT REVERSE('坚持就能成功') --反转

时间和日期喊出

SELECT CURRENT_DATE() --获取当前日期

SELECT CURDATE() --获取当前日期

SELECT NOW() --后取当前时间

SELECT LOCALTIME() --本地时间

SELECT SYSDATE() --系统时间

SELECT YEAR(NOW())

SELECT MONTH(NOW())

SELECT DAY(NOW())

SELECT HOUR(NOW())

SELECT MINUTE(NOW())

SELECT SECOND(NOW())

系统

SELECT SYSTEM_USER()

SELECT USER()

SELECT VERSION()

聚合函数(常用)

函数描述
COUNT()统计 COUNT(字段)忽略NULL、COUNT(*)、COUNT(1)
SUM()求和
AVG()平均分
MAX()最高
MIN()最低

BROUP BY a.age --通过什么来分组

sql
SELECT * 
FROM table_name AS T
	[left | right | inner join | table_name2] -- 联合查询
	[WHERE ...] -- 指定结果满足条件
	[GROUP BY ...] -- 指定结果按照哪个字段分组
	[HAVING] -- 过滤分组的记录必须满足的次要条件
	[ORDER BY ...] -- 指定查询记录按一个或多个条件排序
	[LIMIT {},{}] -- 指定查询的记录从哪条道哪条

4.事务

事务原则:ACID 原则 原子性、一致性、隔离性、持久性 (脏读、幻读、、)

原子性(Atomicity)

都成功,或都失败

一致性(Consistency)

事务前后数据完整性保持一致

持久性(Durability)

事务一旦提交则不可逆,被持久化的数据库中

隔离性(Isolation)

事物的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据库事务之间要相互隔离

隔离所导致的一些问题

脏读:

指一个事务读取了另一个事务未提交的数据。

不可重复读:

在一个事务内读取表中的某一行数据,多次读取结果不同。(不一定错误,只是某些场合不对)

虚读(幻读)

是指在一个事务内读取到了别的事务插入的数据,导致前后读取不一致。

执行事务

-- mysql 是默认开启事务自动提交的

sql
-- 事务开始
SET autocommit = 0 -- 关闭自动提交


-- 手动处理事务
START TRANSACTION	-- 标记一个事务的开始,从这个之后的sql 都在同一个事物内

INSERT xx
INSERT xx

-- 提交:持久化(成功!)
COMMIT

-- 回滚:回到原来的样子(失败!)
ROLLBACK

-- 事务结束
SET autocommit = 1 -- 开启自动提交

-- 了解  -----------------------------------
SAVEPOINT 保存点名称 -- 设置一个事务的保存点
ROLLBACK TO SAVEPOINT 保存点名称  -- 回滚到保存点
RELEASE SAVEPOINT 保存点名称	-- 撤销保存点

5.索引

官方:索引(INDEX)是帮助MySQL高效获取数据的数据结构

索引的分类

  • 主键索引(PRIMARY KEY)
    • 唯一的,不可重复,只能一个列做主键
  • 唯一索引(UNIQUE KEY)
    • 避免重复列出现,唯一可以有多个索引
  • 常规索引(KEY/INDEX)
  • 全文索引(FullText)

三大范式

第一范式(1NF)

原子性:保证每一列不可再分

第二范式(2NF)

前提:满足第一范式

每张表只描述一件事

第三范式(3NF)

在2NF基础上,任何非主属性不依赖于其它非主属性(在2NF基础上消除传递依赖)

第三范式需要确保数据表中的每-列数据都和主键直接相关,而不能间接相关。