MySQL

1. Install

1
2
3
4
5
首先打开 MySQL官网 -> https://www.mysql.com/
点击downloads
选择最下面的 MySQL Community (GPL) Downloads
选择 MySQL Community Server
然后点archives

或者直接打开安装网址↓

选择安装版本网址

下载完之后是个压缩包,解压它

2. 初始配置

困难版(每次都进入对应文件夹)

尽量以管理员身份运行cmd

解压压缩包之后会看到一个bin的文件

打开bin文件,在里面运行cmd 上方路径栏输入cmd就是在当前目录下启动cmd

输入mysqld(相当于一个服务端)

然后再开一个cmd 输入 mysql-h 127.0.0.1 -P 3306 -uroot -p

mysql(客服端启动)

-h 绑定主机 默认127.0.0.1

-P 端口 默认3306

-u 用户名 默认root

-p 密码 默认没有

也可以直接输入mysql -uroot -p 其他默认

如果只输入mysql表示进入的游客模式,权限少很多

简单版(配置环境变量)

1
2
3
4
5
6
7
8
9
10
11
12
'''
1. 右键此电脑 —> 属性
2. 左侧 -> 高级系统设置
3. 下方 -> 环境变量
4. 下方系统变量里面,双击path
5. 点击新建 -> 输入mysql的exe所在文件夹(看你下载到了哪个位置)
我的是D:\mysql-5.6.47-win32\bin

over——

现在直接cmd启动mysqld和mysql -uroot -p也可以了
'''

巨无敌简单版(服务器端放到系统服务里)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
'''
先把上面简单版做了

记住要用管理员权限运行cmd
cmd输入mysqld --install
出现successfully就表示安装成功了
可以进入任务管理器的服务查看
如果要移除就mysqld --remove

然后下次打开它就打开任务管理器,找到MySQL,点击开启

然后就cmd,mysql -uroot -p
即可
'''

设置密码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
'''
打开cmd输入
mysqladmin -uroot -p原密码 password新密码
原密码没有就不输入


如果密码忘了咋办,,,,,跳过验证密码

1. cmd输入mysqld --skip-grant-tables
2. 再开cmd mysql -uroot -p 即可

3. 修改当前用户密码(mysql界面输入)
update mysql.user set password=password(新密码) where user='root' and host='localhost';

4. 立刻讲修改数据刷到硬盘(还是在mysql界面)
flush privileges;

5. 关闭当前服务端,按照正常方式进入


上面的意思就是,进入mysql数据库的用户表,然后更改密码,以密文形式更改,更改账户名为root,主机为localhost的的密码
'''

3. 初识sql命令

所有sql命令都以分号; 结尾

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
'''
show databases; 查看所有的库名

\c 取消命令

exit
quit
退出客户端
'''

cmd命令
'''
查看当前具体进程
tasklist
tasklist |findstr mysqld

杀死具体进程
taskkill /F /PID 'pid号'
(需有管理员权限

进入MySQL后,\h 获取命令提示

'''

4. 统一编码配置

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
29
'''
mysql界面
\s 查看MySQL的信息

在MySQL文件里面,会看到my-default.ini文件,默认配置,可以打开看看
[mysqld] 表示一旦[]的东西启动,就执行在它下面的代码


自己新建一个my.ini文件
里面写入如下配置
[mysqld]
character-set-server=utf8
collation-server=utf8_general_ci
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
修改配置文件之后一定要重启MySQL服务

验证是否修改成功,启动mysql,输入 \s 就会发现编码都变成了utf-8

后续也可以继续修改配置文件
比如:把用户名和密码也加进去,就不用每次输入了
[mysql]下面加上
user='root'
password=041103

后续就可以直接mysql就可以进入管理员模式
'''

5. 增删改查

5.1 库操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
'''

create database name;
create database name charset='gbk';


show databases;
show create database name;


alter database name charset='gbk';


drop database name;
'''

5.2 表操作

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
29
30
31
32
33
'''
操作表(文件)时,先指定对应文件

进入demo1
use demo1;

查看当前选择的文件
select database();


create table t1(id int, name char(4)); # t1 是表名,括号里面是表里面的信息
create table demo1.t1(id int); # 用绝对路径创建

创表的完整语法 # 同一张表字段名不能重复,字段和类型为必填项,约束条件支持多个,最后一行不加逗号
create table 表名(
字段名1 类型(宽度) 约束条件,
字段名2 类型(宽度) 约束条件,
字段名3 类型(宽度) 约束条件
);




drop table t1;


alter table t1 modify name char(16);


show tables;
show create table t1;
describe t1; or 简写 desc t1;
'''

5.3 数据操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
'''

insert t1 values(1, 'jason'); # 加入单个数据,或者用insert into
insert t1 values(1, 'jason'), (2, 'Mi'), (3, 'ti'); # 加入多个数据
insert t1(name, id) values('json', 1); 对应值加入对应字段


delete from t1 where id > 1;
delete from t1 where name='LEC';
delete from t1; # 表数据全删


update t1 set name='LEC' where id > 1;


select * from t1; # 查看所有数据,如果数据特别大,不建议使用,会卡
select * from t1\G; # 一行一行的展示数据
select name from t1; # 只查看表头为name的数据
'''

5.4 约束条件

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
29
30
31
32
33
34
35
36
37
38
39
40
41
'''
create table t2(
id int,
name char,
gender enum('boy', 'girl', 'bg') default 'boy' # set default
);

insert t2(id, name) values(2, 'BD');
insert t2 values(2, 'BD', 'bg');
'''

'''
单列唯一

unique # 比如id,只能有一个id为1的

create table t2(
id int unique,
name char
);
'''

'''
联合唯一

create table t2(
id int,
ip char,
port int,
unique(ip, port) # unique后面的值不能同时都重复,否则报错
);

'''

'''
主键 primary key --一般设置id为主键
非空且唯一,不能null,不能duplicate

create table t2(id int primary key);

'''
1
2
3
4
5
6
7
8
9
10
11
12
13
'''
auto_increment 自增 id太多的话人为不好维护 只能加到主键值上
create table t10(
id int primary key auto_increment, # 后续如果加数据的话,给name值即可自动生成id值
name char
);

补充:
delete from t8 删除表的时候,主键自增不会刷新和停止
比如我删除了三个数据,再加一个数据的话就会自动从第四个加入
truncate t8 清空表数据并且重置主键

'''

6. 存储引擎

MySQL的主要存储引擎

  • innodb

    5.5 版本后默认引擎(安全)

  • myisam

    5.5 版本前默认引擎

    虽然这个速度快,但是安全最重要

  • memory

    内存引擎(数据全部放到内存中)

  • blackhole

    如其名,像个黑洞一样,存啥啥没 0.0

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
'''
# 查看所有的存储引擎
show engines;

# 不同存储引擎在存表时的异同点
create table t1(id int) engine=innodb; # default engine=innodb
create table t2(id int) engine=myisam;
create table t3(id int) engine=memory;
create table t4(id int) engine=blackhole;
打开文件夹,会发现文件结构不一样

# 存数据
insert t1 values(1); # 有数据
insert t2 values(1); # 有数据
insert t3 values(1); # 有数据,但是mysqld重启就没了
insert t4 values(1); # 没数据
可以select * from t1; 来验证下数据是否在里面
'''

7. 严格模式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
'''
严格模式就是规范你的输入数据,如果大于限制条件,报错,而不是写入最大值

show variables like "%mode";

模糊查询:like
% 表示匹配任意多个字符
_ 表示匹配任意单个字符

# 修改严格模式
set session 只在当前窗口有效
set global 全局有效

set global sql_mode = 'STRICT_TRANS_TABLES';
改完之后需要重启MySQL
'''

8. 基本数据类型

8.1 整型

1
2
3
4
5
6
7
8
'''
最常用就是 int
int 后面跟的数字表示
比如 int(7)
数字超过八位,有几位存几位;
没超过八位,空格补全;
所以一般不用去限制int后面的数字,默认为11
'''

8.2 浮点型

1
2
3
4
5
6
7
8
'''
float; double; decimal;

float(255, 30); 总共255位,小数部分占30位
这三者关系是小数越来越精确

平时用float和decimal都可
'''

8.3 字符型

1
2
3
4
5
6
7
8
9
10
11
'''
char
定长
char(4) 数据超过4个字符,报错,不够字符空格补全
varchar 推荐
变长
varchar(4) 数据超过4个字符,报错,不够的话有几个存几个

Tips:
select char_length(表头) from 表名;
'''

8.4 日期型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
'''
date: 2020-11-11
datetime: 2020-11-11 11:11:11
time: 11:11:11
year: 2020

create table student(
id int,
name varchar(16),
born_year year,
bd date,
study_time time,
reg_time datetime
);

简写也可以
insert student values(1, 'Loyaltys', '2003', '011207', '11:11', '010305');
'''

8.5 枚举和集合类型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
'''
枚举 enum:多选一
集合 set:多选多
数据只能来源可选项,不能凭空多出一个选项 如下

create table usern(
id int,
name char(16),
gender enum('male', 'female', 'other'),
hobby set('read', 'dj', 'tea')
);

insert usern values(1, 'ln', 'male', 'read');
insert usern values(2, 'lns', 'other', 'read,tea'); 集合可以多选,注意不要加空格
'''

9. 表与表建立关系 外键

1
2
3
4
5
6
7
8
9
10
'''
foreign key
关系:
一对多关系 外键字段写在多的一方
多对多关系
一对一关系
没关系

一定要先建被关联表,且写好被关联表的数据
'''

9.1 一对多

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
29
30
'''
create table 部门表(
id int primary key auto_increment,
dep_name char,
dep_desc char
);

create table 员工表(
id int primary key auto_increment,
name char,
gender enum('male', 'female') default 'male',
dep_id int,
foreign key(dep_id) references 部门表(id)
# 外键值,外键对应的外表值
);

这样的话,就不能删除数据和更改数据了,很麻烦
因为改一个数据,对应的数据也要更改,但是对应数据不能一下子更改,所以会报错
如果要采用同步更改,就要在创建表格时加参数: on update cascade on delete cascade
create table 员工表(
id int primary key auto_increment,
name char,
gender enum('male', 'female') default 'male',
dep_id int,
foreign key(dep_id) references 部门表(id)
on update cascade
on delete cascade
# 外键值,外键对应的外表值
);
'''

9.2 多对多

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
29
'''
要先创一个中间表,和两个普通表,中间表作为两个表格的中介
比如书名可以对应两个作者,作者可以对应两本书

create table book(
id int primary key auto_increment,
title char,
price int
);

create table author(
id int primary key auto_increment,
name char,
age int
);

create table book_author(
id int primary key auto_increment,
author_id int,
book_id int,
foreign key(author_id) references author(id)
on update cascade
on delete cascade,
foreign key(book_id) references book(id)
on update cascade
on delete cascade
);

'''

9.2 一对一

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
'''
一对一跟一对多是差不对的,只是要加个条件unique
比如QQ里的用户信息,平时只能看到qq号,昵称和性别
但是当点击详情信息的时候就会出来细节

这就是一对一,每个qq号只能对应一个qq细节信息

所以、、
create table worker(
id int primary key auto_increment,
name char,
gender char,
worker_id int unique,
foreign key(worker_id) references worker_detail(id)
on update cascade
on delete cascade
);

create table worker_detail(
id int primary key auto_increment,
saying char,
phone int,
address char
);
'''

10. 修改表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
'''
1. 修改表名
alter table 表名 rename 新表名;

2. 增加字段
alter table 表名 add 字段名 类型 约束条件;
约束条件有first——加到第一个位置 after 字段名--在字段名后面

3. 删除字段
alter table 表明 drop 字段名;

4. 修改字段
alter table 表名 modify 字段名 类型 约束条件;
alter table 表名 change 旧字段名 新字段名 类型 约束条件;
'''

11. 复制表

1
2
3
4
'''
create table 新表名 select * from 表名 约束条件;
!主键,外键,索引,复制不了,只能单纯表内容!
'''

12. sql语句

12.1 where

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
'''
where: 进行筛选操作

1. 范围内筛选
select id,name,age from t1 where id>=3 and id<=6;
select id,name,age from t1 where id between 3 and 6; 等于上面的
select id,name,age from t1 where id not between 3 and 6;

2. 值等于筛选
select * from t1 where salary=20000 or salary=18000 or salary=17000;
select * from t1 where salary in (20000,18000,17000); 等于上面的
select * from t1 where salary not in (20000,18000,17000);

3. 模糊筛选,名字里有字母a的
select name from t1 where name like '%a%';

4. 查询名字是否由四个字符组成
select name from t1 where name like '____'; # 四个下划线_
select name from t1 where char_length(name) = 4;

5. 查是否为空
select name from t1 where description is NULL; or is not NULL;
'''

12.2 group by

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
'''
group by 分组
select type from t1 group by type; 显示所有的type名字

select type,max(salary) from t1 group by type;
显示每个类型里的薪水最高的那一项

select type as '类型',max(salary) as '最高薪水' from t1 group by post;
结果显示出来把type用类型代替,就是方便查看

max(salary) 最大值
min(salary) 最小值
avg(salary) 平均值
sum(salary) 求和
count(id) 数量

?查询分组后的部门名称和每个部门下所有人员的姓名?
强大的 group_concat
select type,group_concat(name) from t1 group by type;
select type,group_concat(name, '_BIG') from t1 group by type; 拼接字符串
select type,group_concat(name,':',salary) from t1 group by type;

concat 没有group by的时候也想实现字符串拼接就用concat
select concat('姓名: ',name),concat('薪水:',salary) from t1;

结果运算
select name,salary*12 from t1;
'''

如果同时有where和group by,group by需出现在where后面

12.3 having

1
2
3
4
5
6
7
8
'''
having 分组之后的筛选条件
跟where功能一样,一个在分组之前筛选,一个在分组之后筛选

?各班年龄大于15的学生的平均分,且平均分大于80
select class,avg(score) from school where age>15 group by class having avg(score) > 80;

'''

12.4 distinct

1
2
3
4
5
6
7
'''
distinct 去重
必须完全一样才能去重
意思就是主键存在,不可能去重,先把主键筛选掉

select distinct age from t1;
'''

12.5 order by

1
2
3
4
5
6
7
8
9
10
'''
order by 排序
默认升序 asc
降序:desc
select * from t1 order by salary;
select * from t1 order by salary desc;

多个排序
select * from t1 order by age desc,salary asc;
'''

12.6 limit

1
2
3
4
5
6
'''
limit 数据过多时,进行分页操作,不然会卡死
select * from t1 limit 3; 只显示三条数据
select * from t1 limit 10,5; 从第十个数据开始,显示五条数据
两个数字时:第一个参数表示起始位置,第二个参数是展示条数
'''

12.7 regexp

1
2
3
4
5
6
'''
regex 正则
select * from t1 where regexp '^j.*(n|y)$';
拿到以j开头,n or y结尾的数据,中间商随意

'''

13 连表操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
'''
当我想通过一张表的数据对应到另外一张表数据时

select * from t1,t2 where t1.id = t2.dep_id;
上面的表达不清楚,MySQL有更细的对应方法

inner join 拼接两张表中共有的数据部分
left join 左边数据都显示没有对应部分时用NULL代替
right join 右边数据都显示没有对应部分时用NULL代替
union 不了解了

select * from t1 inner join t2 on t1.id = t2.dep_id;

'''

14 子查询

1
2
3
4
5
6
7
8
9
10
11
12
'''
将一个查询结果作为另一个查询条件去用

?查询部门是技术人员或者人力资源的员工信息
分开来:
select id from dep where name='技术' or name='人力资源';
select name from emp where dep_id in (200,201);

用子查询:
select * from emp where dep_id in (select id from dep where name='技术' or name='人力资源');

'''

15 Navicat软件(可视化表数据)

navicat破解

16 pymysql

  • python modules, 专门用来操作MySQL的
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import pymysql

conn = pymysql.connect(
host='127.0.0.1',
port=3306,
user='root',
password='041103',
database='demo10', # 指定操作的库
charset='utf8'
)

cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) # 创建游标
# cursor=pymysql.cursors.DictCursor 这个参数会使数据输出为键值对形式

sql = 'select * from author;' # sql语句
rsp = cursor.execute(sql) # 响应此sql语句
print(rsp) # 这个sql结果有几行
print(cursor.fetchone()) # take the first one
print(cursor.fetchall()) # take all
print(cursor.fetchmany(5)) # take 5
# 读取类似文件光标的移动
cursor.scroll(1, 'relative') # 想对于当前位置,往后移动一位
cursor.scroll(1, 'absolute') # 相对于起始位置,往后移动一位
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
'''
增删改 数据的时候,因为涉及到改变数据,在python里面不是单单sql语句执行就行了,还要额外操作

sql = 'insert user_info(name, pwd) values(%s, %s)'
rsp = cursor.execute(sql, ('Maria', '77776543')) # 增加一个数据
rsp = cursor.executemany(sql, [('a', '1'), ('b', '2'), ('c', '3')])
# 一次性增加多条数据 executemany
conn.commit()
# conn.commit() 相当于确认修改

如果觉得每次这样子太麻烦的话,加入autocommit参数
'''
conn = pymysql.connect(
host='127.0.0.1',
port=3306,
user='root',
password='041103',
database='demo10', # 指定操作的库
charset='utf8'
autocommit=True
)

# 完整配置 👆

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
29
30
# 模拟账户登录检测
import pymysql

conn = pymysql.connect(
host='127.0.0.1',
port=3306,
user='root',
password='041103',
database='demo10',
charset='utf8'
)

cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)

username = input('Username -> ')
password = input('Password -> ')

sql = f'select * from user_info where name=%s and pwd=%s;'

print(sql)

rsp = cursor.execute(sql, (username, password))
# 用python自带的这个格式化字符串可以使他自动排除掉一些影响账号密码的花里胡哨的符号

if rsp:
print('Login Successfully!')
print(cursor.fetchall())
else:
print('Incorrect info!')

17 扩展

17.1 视图

1
2
3
4
# 当需要频繁的用到一张拼接表的时候,可以保存这个拼接表

create view 表名 as 虚拟表的查询sql语句
# 会保存到扩展视图里,此表只用于查询,不用于数据修改

17.2 触发器

1
2
3
4
5
6
7
8
# 在满足增删改的情况下,自动触发的功能
# before/after insert/update/delete 六种情况
# 前后 增改删 = 增前,增后.....

create trigger 触发器的名字 before/after insert/update/delete on 表名 for each row begin sql语句 end

# 修改MySQL的默认语句结束符(只作用于当前窗口)
# delimiter $$ (修改结束符为$$)

17.3 事务

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
'''
开启一个事务可以包含多条sql语句
这些语句要么同时成功,要么同时失败

作用:保证数据的安全性

语法:
1. 开启事务
start transaction;
sql 语句1;
sql 语句2;
sql 语句3;

2. 回滚(如果想撤回刚刚操作的数据的话)
rollback;

3. 确认(确认之后,事务执行的代码就会永久保存了,不然只会暂时写到内里)
commit;
'''