数据库学习
01数据库安装和配置
01:首先我安装的是mysql5.7.31版本的,原因是,虽然有八点多的版本,但是听说现在那个最新的版本的性能不是很稳定,而且实现的功能是和旧版的差不多的,现在很多的公司还是在使用旧版的
创建了环境变量之后,我可以不用敲绝对路径了,直接使用bin工具目录下面的
mysqld.exe 和 mysql.exe;
踩过的坑
01:配置文件的设置,主要是生成了一个data的文件夹,并且是在里面进行了初始化生成了很多配置文件,
初始化的设置,执行的命令有两种
一种是可以生成密码的
还有一种是生成空密码的
实际上两种都是可以的
账号都是root这个是超级用户,权限最大的用户
要是空密码的话后面登上去之后再设置也是可以的,问题不大,可是我一以为没有生成密码就是错的,一直在百度浪费了时间,
02
生成Windows服务命令,首先是可执行文件的绝对路径 然后加上 install 自己定义名字
对了,这些操作都是要在以管理员权限运行的cmd窗口执行,不然执行不了
然后开启服务的话
执行
net start mysql5731
这样服务就开启了
然后连接的指令是
mysql -u 用户名(现在只有root) -p
然后会提示输入密码
正确即可进入
03
操作的后面一定要加上 ; 号
忘记密码
数据库操作
01:
新建表单
02:
数据库增删改查
这里的concat函数就是拼接字符串的函数,表示的是 修改的时候在原有name的字符串的基础上面增加“123”,也就是实现了拼接。
where 跟在语句的后面表示附加条件。
python代码操作
增删改的后面的都要加上代码
conn.commit # 表示执行
第一句代码比之前多了一个参数,“db”表示直接打开userdb那个数据库,方便下面的操作,一般一个项目工程里面只会使用到一个数据库
sql注入了解
通过在Python里面拼接的sql语句,可以通过python的语法 or 实现不规范的输入跳过检查,即使是不存在的用户也可以实现登录操作。
mysql语句的 – 表示注释
这样一来,返回的结果result就不是 null了
所以为了安全,要控制不规范的输入
这两行代码都是通过内置的数据类型进行处理操作
无论是列表还是字典,再传参的时候都会做格式化,检查引号,空格什么的非法字符。
02数据库进阶操作
sql进阶查询
按三个反方向的点出代码框
还可以同时查找两张表,,,,,
通配符
& 表示n个字符 _ 表示一个字符
映射
通过一个sql语句的查询结果去判断是不是执行另一个sql语句
通常是在操作两张表的时候,见得比较多。
排序
查询表的时候把表单按照顺序排好
select * from 表名字 order by 列名 asc; -- 顺序排序
select * from 表名字 order by 列名 desc; -- 逆序排序
按照的是列名的大小排序,一般可以是年龄,id数字最为参照
select * from 表名字 order by 列名 asc, 列名 asc; -- 顺序排序好
如果第一个列名的参数是相等的,就按照第二个列名顺序排序
也可以直接加入限制取值,比如说在排好序之后加上, limit 5; 就表示只取前面的的5条数据
select * from 表名 limit 2 offset 2; -- 表示从第二条数据开始向后取前两条数据
分组
假设有一个这样的表
select * from info group by age; -- 表示将年龄相同的人分为一组查询
但是这样的表达是有问题的,年龄相同是可以合并的,但是其他的列不知道要取舍哪一个,所以会报错,一般这样的分组都是只查询相同的分组依据而已;
select age from info group by age; -- 表示将年龄相同的人分为一组查询
一定要加的话可以加上max(id)
select age, max(id) from info group by age; -- 查询到的id是比较大的一个
也可以加上count(id), 他们两个都是聚合条件,聚合条件要放在having后面
select age,count(id) from info group by age having count(id) > 2; --聚合条件放在后面
类似的聚合条件还有 sum(id) 求和显示, avg(id)求平均数显示
聚合条件的再次筛选,(也就是同一句sql语句里面两次操作count(id)) ,不能是用where 要使用having
现在可以联想到的是,创建好表单导入数据,然后进行分组,求整个集体的和操作或者是进行求平均数的操作
左右连表
select * from info left outer join depart on info.depart_id = depart.id;
以info为主表,左连接depart表,后面的 是连接的条件
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-br9vt6Ar-1647180395242)
select depart.title from info left outer join depart on info.depart_id = depart.id;
这样的操作实现了从一张表访问到另一张表,这里值得想多点
上下连表
要想实现上下联表,就要要求两张表的列数是相同的,查询的结果就会是按照列数两张表分别列出来。
03实际应用,根据需求设计表
多表问题一对多
在创建表的时候,就添加外键约束
create table depart(
id int not null auto_increment primary key,
title varchar(18) not null
)default charset=utf8;
create table info(
id int not null auto_increment primary key,
name varchar(18) not null,
email varchar(32) not null,
age int,
depart_id int not null,
constraint fk_info_depart foreign key (depart_id) references depart(id)
)default charset=utf8;
如果表已经修改好了,那就直接添加一个约束
alter table info add constraint fk_info_depart foreign key info(depart_id) references depart(id);
删除外键约束
alter table info drop foreign key fk_info_depart;
多表问题多对多
04数据库用户设置管理
用户查询
首先要知道的是,mysql的所有用户都是存在了默认数据库mysql中的默认的user表里,存储的包括账户,权限。
查看,不要select * , 使用
select user,authentication_string,host from user;
第二列是密码,第三列是ip地址(控制了只有在这个ip下才能连接到数据库)
用户创建
在自己的电脑上可以登陆,设置的ip是localhost,不能是127.0.0.1
百分号表示任意字符,使用的时候要用引号括起来,如果引号里面直接是百分号的,就表示匹配任意ip。
用户授权
命令格式:
grant 权限 on 数据库.表 to '用户'@'ip地址'
查看授权:
05mysql天花板操作
sql文件导入执行
写入sql文件,或者是拿到别人的sql文件,具有很多相同的操作,不想一个个执行,可以直接在终端导入sql文件,自动执行。
导入数据库命令:
mysql -u root -p 数据库 < /users/.../../...sql -- 文件的路径
把自己的数据库复制一份给别人,可以直接导出操作:
# 导出表结构,数据
mysqldump -u root -p 数据库 > /users/.../../...sql -- 要导出的路径
# 导出表结构,表里没有数据
mysqldump -u root -p -d 数据库 < /users/.../../...sql -- 要导出的地方
mysql导入csv文件
step1.首先,检查一个全局系统变量 ‘local_infile’ 的状态:
show global variables like ‘local_infile’;
如果得到如下显示 Value=OFF,则说明这是不可用的。如果得到的是 Value=ON,请直接跳往 step3
![img](https://i-blog.csdnimg.cn/blog_migrate/f097f0dd63a1467e3af28b845f60e688.png)
step2.要把这个值变为 ON,这里找到两种方法:
第一种方法:
1).在mysql客户端输入:
set global local_infile=1;
2).然后退出quit 退出mysql。再次进入时,便会出现 Value=ON
step3.在进入数据库的命令行要加上 –local_infile=1 这个配置,具体如下:
mysql --local_infile=1 -u <username> -p
导入文件代码
在windows的命令窗口路径中的 ’\‘会被吞掉,要再加 \ 实现转义。
load data local infile '要导入的文件路径' into table 要导入的表 character set gbk fields terminated by ',' optionally enclosed by '"' escaped by '"' lines terminated by '\r\n';
设置完成之后还是每一次都要弄一下才能导进去,不懂为啥,,
然后就是新建的表要对应导入的csv文件,