首先进入mysql安装
1.去MySQL官网下载压缩包,下载地址为:MySQL :: Download MySQL Community Server(官方网站下载地址)。
链接:https://pan.baidu.com/s/14R7sddsE_xLkUF2An5cVHw
提取码:0e0s
2.解压
3.配置环境变量
1.找到mysql下的bin目录,复制进来
2、打开电脑的环境变量:此电脑(右键)–>属性–>高级系统设置–>环境变量–>系统变量–>path–>点击编辑–>新建,直接把刚才复制的地址粘贴上去:D:\My-sql\mysql-5.7.33-winx64\mysql-5.7.33-winx64\bin,然后点击确定
4.在mysql文件夹下新建一个my.ini的配置文件,配置详情如下
#设置mysql客户端默认字符集
[mysqld]
character-set-server=utf8 #设置统一字符编码
collation-server=utf8_general_ci
#设置mysql的安装目录
basedir=D:\My-sql\mysql-5.7.33-winx64\mysql-5.7.33-winx64
#设置mysql数据库的数据的存放目录
datadir=D:\My-sql\mysql-5.7.33-winx64\mysql-5.7.33-winx64\data
#设置3306端口
port=3306
#允许最大连接数
max_connections=200
#skip-grant-tables #直接跳过登录认证,不过需要重启服务才会生效
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
5.配置完成后,以管理员运行cmd,然后cd命令到bin目录下
1.输入:mysqld -install
如果遇到上面这个报错可以试试安装一下我下面发的这个vc运行库
链接:https://pan.baidu.com/s/1oyoNpEfoHU3KHYa-VzUbPQ
提取码:j89g
2.初始数据库文件:mysqld --initialize-insecure --user=mysql
3.试试启动MySQL吧:net start mysql
4.然后进入:mysql -uroot -p
5.没有密码,这个时候修改密码(下面操作有两个版本修改密码的操作)
如果遇到下面的错误,先不要急,往下看
首先cd到MySQL的bin目录下
然后执行以下指令
mysqld –initialize
如何mysql服务可以启动了,那就皆大欢喜,如果 还是报错的话,那就下一步
1.删除mysql服务
mysqld --remove mysql
2.检查下my.ini配置是否正确
3.重新安装mysql服务
mysqld --install mysql
4.初始化data
mysqld --initialize-insecure
5最后启动即可
net start mysql
如果在第四步报了以下错误的话,意思是data下有文件,如果刚入门的话没有什么重要文件删除即可,再重新初始化data就可以
然后这样是没有密码的,设置密码
mysql5.7版本password这个字段被改成 authentication_string
mysql5.7:
update mysql.user set authentication_string=password("您要修改的密码") where user="root" and host="localhost";
mysql5.6版本:
update mysql.user set password=password("您要修改的密码") where user="root" and host="localhost";
哦,对啦,记得刷新一下MySQL权限
flush privileges;
下面是MySQL5.6版本
安装mysql
#启动/关闭MySQL服务
net start/stop mysql
#登录
mysql -u用户名 -p密码
#修改密码
update mysql.user set password=password("541366") where user="root" and host="localhost";
#新建用户并授予权限:
grant all on . to 'fei'@'%' identified by '010124';
flush privileges;
刷新下权限
flush privileges;
#找寻mysql的残余进程
tasklist |findstr "mysql"
#杀死进程
taskkill /F /PID
#当指令输入错误的时候输入\c,意思终止的意思
\c
#出现在select字段后面的只能是group by后面的分组字段,或使用聚合函数包裹着的字段
set global sql_mode="ONLY_FULL_GROUP_BY";
操作文件夹(库)
增
create database db1 charset utf8;
查
show create databse 库名;
show databases; # 展示所有库
改
alter database db1 charset gbk; # 修改db1的字符集为gbk
删
drop database db1;
操作文件(表)
切换文件夹 use db1
查看当前所在文件夹 select database();
增
create table t1(id int,name char)engine=innodb; # 设置存储引擎为innodb
create table t4(id int unsigned zerofill); # unsigned为约束条件代表无符号|zerofill为约束条件代表用0填充
create table t5(score float(255,30)); # 创建一个浮点数的表
create table t7(score decimal(65,30)); # decimal(65,30)这个精确度很高
查
show create table t1;
show tables; # 展示所有表 用行表示:\G
desc t1; # 查看表
改
alter table t1 modify name char(6); # 修改表t1中name的char宽度改为6
alter table t1 change name char(7); # 修改字段类型
alter table 表名 add 字段名 数据类型[完整性约束条件],add字段名 数据类型[完整性约束条件.] first/after 字段名; # 添加字段并指定位置
alter table 表名 drop 字段名 # 删除字段
alter table 表名 modify 字段 新类型; # 修改字段的类型
alter table 表名 change 旧字段 新字段 新类型; # 修改字段名字和类型
删
drop table t1;
create table 表名 select * from db1.t1; # 复制表结构
create table 表名 select * from db1.t1 where 1=2; # 只复制表结构不要记录,就添加一个限定语句不成立就可以
操作文件内容(记录)
增
insert into t1(id,Name) values(1,'zhangsan'),(2,'lisi'),(3,'wangwu');
insert into 表名(字段1,字段2) select (字段1,字段2) from 表名 where 限定条件; # 插入查询结果
查
select id,Name from db1.t1; # 直接输入t1是从当前表中查询
select * from db1.t1; # 查询表中所有内容
单表查询格式:
select distinct 字段1,字段2 from 库.表
where 条件 group by 分组条件 having 过滤 order by 排序字段 limit n; # where不能使用聚合函数,且在分组之前,having在分组之后,order by默认是升序
select distinct 字段 from 表名; # 避免重复distinct
select 字段,字段*12 as 新名称 from 表名; # 假设求年薪,就是将月薪*12然后as的意思就是给改一个新名称显示
concat用于连接字符串:
select concat('姓名:',name,'年薪:',字段*12 as 新名称 from 表名;
concat_as用于设置第一个参数为分割符:
select concat_ws(':'name,salary*12) as 新名称 from 表名;
select name,salary from employee where salary>=2000 and salary <=3000;
select name,salary from employee where salary between 2000 and 3000;
select name,salary from employee where salary not between 2000 and 3000; # 与上面相反
select name,salary from employee where age=78 or age=89 or age=23;
select name,salary from employee where age in (78,89,23);
select name,salary from employee where post is null; # 限定post字段为空
select name,salary from employee where post is not null; # 限定post字段不为空
select name,salary from employee where name like 'wupe%'; # 模糊语句,%可以作为多个字符
select name,salary from employee where name like 'wupe___'; # 一个下划线代表一个字符
正则查询regexp
select * from employee where name regexp '^wu.*(i|q)$'; # 以wu开头,以i或者结尾
分组group by
select post,group_concat(salary) from employee where age>50 group by post;
聚合函数
max()
min()
count()
avg()
sum()
select * from employee order by age asc,id desc # 先按照age升序asc如果相同再按照id降序desc:降序,order语句默认升序
select * from employee limit 5; # 取五条数据
select * from employee limit 0,5; # 0:从第一个开始 5:取五个
多表查询
select sname from student where sid=(select student_id from score where course_id in (select cid from course where teacher_id =(select tid from teacher where tname='李平老师'))
group by student_id
order by avg(num) desc
limit 1);
内连接:只取两张表的共同地方
select * from employee inner join department on employee.dep_id=department.id;
左连接:在内连接的基础上保留左表的记录
select * from employee left join department on employee.dep_id=department.id;
右连接:在内连接的基础上保留右表的记录
select * from employee right join department on employee.dep_id=department.id;
外连接:在内连接的基础上保留左右两表没有对应关系的记录
select * from employee left join department on employee.dep_id=department.id;
union
select * from employee right join department on employee.dep_id=department.id;
改
update db1.t1 set id=9 where Name='lisi'; # where限定语句,将Name='lisi'的id改为9
删
delete from t1 where id=3; # 将id=3的一行删除
truncate 表名; # 删除表并且将自增长下次添加记录的时候改为1
创建视图
create view 视图名称 as select * from teacher inner join student on teacher.id=student.tid;
drop view 视图名称;
char:定长
varchar:变长
create table t8(name char(6));
insert into t8 values('粥粥 ');
select char_length(name) from t8; # 查询长度
select name from t8 where name='粥粥';
select name from t8 where name like '粥粥';
set sql_mode='pad_char_to_full_length' # 取记录的时候不会去掉空格
约束条件
create table t9(id int,
name char(6),
sex enum('male','female') not null default 'male'); # 约束条件not null代表不能传入空值|default 'male'代表默认值为‘male’
unique # 约束条件里面代表这个是唯一的
key的单列唯一
方法一 #unique放在字段的约束条件里面代表这个是唯一的
create table t10(
id int unique,
name char(6) unique
);
方法二 #要将什么字段唯一就在后面unique(字段)就可以
create table t11(
id int,
name char(6),
unique(id),
unique(name)
);
key的联合唯一
create table services(
id int,
ip char(15),
port int,
unique(id),
unique(ip,port) #IP和port联合在一起要唯一
);
insert into services values
(1,'192.168.11.11',100),(2,'192.168.11.11',101),(3,'192.168.11.10',101);
primary key 约束条件:not null unique
单列主键
create table t12(
id int primary key,
name char(6)
);
create table t13(
id int not null unique,
name char(6)
);
联合主键
create table t14(
id int,
ip char(15),
port int,
primary key(ip,port)
);
auto_increment # 自动增长
create table t15(
id int primary key auto_increment, #自动增长一般需要设置在key里,如果自己添加了记录的话,它会默认按照你的记录继续自增长
name char(6)
);
insert into t15(name) values
('Bob'),('Mary');
truncate 表名; #删除表并且将自增长下次添加记录的时候改为1
#了解
show variables like 'auto_inc%'; #查看步长和起始偏移量的配置
#步长:
auto_increment_increment默认为1
#起始偏移量
auto_increment_offset默认1
#设置步长
set session auto_increment_increment=5; #sssion 是设置本次,下次就变回了
set global auto_increment_increment=5; #global是设置全局,不过需要先exit退出一下重新加载
#设置起始偏移量
set global auto_increment_offset=3;
强调:起始偏移量<=步长
foreign key:建立表之间的关系 #但是了解即可,一般考虑到拓展性,建议使用逻辑来达到关系
# 1、建立表关系:
# 先建被关联的表,并且保证被关联的字段唯一
create table dep(
id int primary key,
name char(16),
comment char(50));
#再建立关联的表
create table emp(
id int primary key,
name char(10),
sex enum('male','female'),
dep_id int,
foreign key(dep_id) references dep(id) on delete cascade on update cascade); #on delete casecade代表删除同步, on update cascade代表更新同步
#2、插入数据
#先往被关联表插入记录
insert into dep values(1,"IT","技术能力有限部门"),(2,"销售","销售能力不足部门"),(3,"财务","花钱特别多部门");
#再往关联表插入记录
insert into emp values(1,'egon','male', 1);insert into emp values(2,'alex','male', 1),(3,'wupeiqi', 'female',2), (4,'yuanhao', 'male',3),(5,'jinximn','male',2);
触发器
delimiter // # 将结束符改为//
create trigger tri_after_insert_cmd after insert on cmd for each row
begin
if new.success = 'no' then #等值判断只有一个等号
insert into errlog(err_cmd, err_time) values(new.cmd, new.sub_time) ; #必须加分号
end if ; #必须加分号
end//
delimiter ; #将结束符改为;
存储过程
1、无参存储过程
delimiter //
create procedure p1()
begin
select * from db1.t1;
end //
delimiter ;
# MySQL中调用
call p1();
# python中调用
cursor.callproc('p1')
print(cursor.fetchall())
2、有参存储过程
delimiter //
create procedure p2(in n1 int,in n2 int,out res int)
begin
select * from db1.t1 where id>n1 and id<n2;
set res = 1; # 返回值
end //
delimiter ;
# MySQL中调用
set @x=0
call p2(1,3,@x);
select @x;
# python中调用
cursor.callproc('p2',(1,3,0)) # @_p2_0=1,@_p2_1=3,@_p2_2=0
cursor.execute('select @_p2_2')
print(cursor.fetchall())
事务
start transaction;
rollback; # 出错就返回刚才的操作
commit; # 保存刚才的操作
while循环语句
delimiter //
drop procedure if exist 'youhua'; # 如果存在youhua存储过程则删除
create procedure youhua() # 创建无参存储过程,名称为youhua
begin
declare i int; # 申明变量
set i = 1;
while (i<300000) do # 结束循环的条件: 当i大于300000时跳出while循环
insert into s1 values(i,'粥粥','male',concat('粥粥',i,'boy')); # 往youhua表添加数据
set i = i+1; # 循环一次,i加1
end while; # 结束while循环
end // # 结束定义语句
delimiter ; # 重新将分隔符设置为;
建立索引
create index 索引名称 on 表(字段);