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
时间日期
类型 描述 格式 date YYYY-MM-DD 日期 time HH:mm:ss 时间 datetime YYYY-MM-DD HH:mm:ss 日期时间 timestamp 1970.1.1到现在毫秒数 时间戳 year 年份 年
NULL
1.3、字段属性
Unsigned
- 无符号整数
- 声明不能为负数
zerofill
- 0 填充
- 不足位数用 0 填充 int(3) , 5 >>> 005
自增
- 自增,默认自动 +1
- 通常设计唯一主键 index , 必须整数类型
- 可自定义起始值和步长
非空
- 假设设置not null,不赋值会报错
- NULL,不填写默认NULL
默认
- 不填写默认赋值
1.4、创建表
-- 表和字段尽量用 `` 括起来
-- AUTO_INCREMENT 自增
-- 字符串使用单引号括起来
-- 所有语句后加 , 号 最后一个不用加
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格式
CREATE TABLE [IF NOT EXISTS] `表名` (
`字段名` 列类型 [属性] [索引] [注释],
PRIMARY KEY (`id`)
)[表类型][字符集设置][注释]1.5、表的类型(引擎)
-- 关于数据库引擎
INNODB 默认使用
MYISAM 早些年使用
| MYISAM | INNODB | |
|---|---|---|
| 事务支持 | X | Y |
| 数据行锁定 | X | Y |
| 外键约束 | X | Y |
| 全文索引 | Y | X |
| 表空间大小 | 较小 | 较大,约2倍 |
常规使用操作:
- MYISAM 节约空间,速度较快
- INNODB 安全性高,事务处理,多表多用户操作
在物理空间
所有数据库都在 data 目录下,一个文件夹对应一个数据库
本质是文件存储!
MySQL引擎在物理上文件的区别
- InnoDB 在表中只有一个 *.frm 文件,以及上级目录下ibdata1文件
- MYISAM 对应文件
- *.frm - 表结构定义文件
- *.MYD 数据文件(data)
- *.MYI 索引文件(index)
设置数据表字符集编码
CHARSET=utf8默认编码是Latin1,不支持中文
1.6、修改表
修改表名
ALTER TABLE teacher RENAME AS teacher1增加字段
ALTER TABLE teacher1 ADD age INT(11)修改字段
ALTER TABLE teacher1 MODIFY age VARCHAR(2) -- 修改约束
ALTER TABLE teacher1 CHANGE age age1 -- 字段重命名删除表字段
ALTER TABLE teacher1 DROP age1删除表
DROP TABLE IF EXISTS teacher1==所有的创建和删除操作尽量加上判断,以免报错==
注意点:
- `` 字段名,用这个包裹
- -- /* */ 注释
- sql关键字大小写不敏感 建议全部小写
- 所有符号全部用英文
2.1、外键(了解)(不用)(库级别)
ALTER TABLE `student`
ADD CONSTRAINT `FK_gradeid` FOREIGN KEY('gradeid') REFERENCES `grade`(`gradeid`);
-- 格式
-- ALTER TABLE 表 ADD CONSTRAINT 约束名 FOREIGN KEY(做外键的列) REFERENCES 哪个表(字段);== 物理约束不建议使用 ==
2.DML语言(增删改)
-- 增(添加)
-- INSERT INTO 表名([字段1,字段2,字段3]) VALUES ('值1','值2','值3')
-- 一般一定要数据和字段一一对应!
INSERT INTO test(`name`,`age`,`sex`) VALUES ('名字1',19,'男'),('名字2',20,'男')-- 删(删除)
-- DELETE FROM 表名 WHERE [条件]
DELETE FROM test WHERE id=1
-- TRUNCATE
-- 完全清空数据库
TRUNCATE test
/*
- 都能删除数据,都不会删除表结构
- TRUNCATE 重新设置 自增列 计数器归零
- TRUNCATE 不会影响事务
*/-- 改(更新)
-- 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 | || 或者 | |
| Not | not a !a | 逻辑非,取反 |
3.DQL 查询(重点)
Data Query LANGUAGE:数据查询语言
- 所有查询操作都用 SELECT
- 简单和复杂查询都能查
- 数据库最核心语言
- 使用频率最高的语句
-- 查询全部
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 testwhere 条件子句
- 检索数据中 符合条件 的值
模糊查询:比较运算符
| 运算符 | 语法 | 描述 |
|---|---|---|
| IS NULL | a IS NULL | 如果操作符为NULL结果为真 |
| IS NOT NULL | a IS NOT NULL | 如果操作符不为NULL 结果为真 |
| BETWEEN | a BETWEEN b AND c | 在a和b和c之间,则结果为真 |
| LIKE | a LIKE b | 如果a匹配b,则为真 |
| IN | a IN(a1,a2,a3...) | a在a1、a2...其中一个值,为真 |
- like 结合
%(代表0到任意字符)_(代表一个字符)
联表查询
INNER JOIN
- 如果表中至少有一个匹配,就返回行
LEFT JOIN
- 即使右表没有匹配,也返回左表所有制
RIGHT JOIN
- 即使左表没有匹配,也返回右表所有制
FULL JOIN
- 只要其中某个表存在匹配,FULL JOIN 关键字就会返回行。
分页和排序
DESC 倒序、降序
ASC 顺序、升序
SELECT name, age FROM user ORDER BY name DESC, age ASCLIMIT 起始值,页面大小
-- 第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 --通过什么来分组
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 是默认开启事务自动提交的
-- 事务开始
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基础上消除传递依赖)
第三范式需要确保数据表中的每-列数据都和主键直接相关,而不能间接相关。