MySQL主键外键
主键:primary key
相当于not null加unique
InnoDB规定了一个表必须要有且只有一个主键
如果你不指定主键则会采用隐藏的字段作为主键
当表中没有主键但是有非空且唯一的字段则自动升级为主键(自上而下第一个)
(相当于目录,可以加快查询速度)
约束条件之自增:auto_increment
配合主键使用,让主键自动逐个加一
(自增不会因delete from删除数据而重置顺序号,但可以通过truncate重置)
外键:foreign key
记录表和表之间数据关系的字段
外键字段的特性
1.在创建表的时候一定要先创建被关联表(自身没有外键字段的表)
2.在插入数据的时候也是先插入被关联表再插入关联表
只能够填写被关联字段中出现的值
3.被关联表中的数据无法自有删除和修改
4.级联更新:on update cascade 级联删除:on delete cascade
(写了级联更新,级联删除之后,对一个表中的字段进行更新和删除时,另一个表中的对应字段也会被修改和删除)
修改表相关SQL语句
1.修改表名 rename
alter table 表名 rename 新表名;
2.增加字段 add
2.1.
alter table 表名 add 字段名 数据类型 [完整性约束条件],
add 字段名 数据类型[完整性约束条件];
2.2.
alter table 表名 add 字段名 数据类型 [完整性约束条件]first;
alter table 表名 add 字段名 数据类型 [完整性约束条件]after 字段名;
3.删除字段 drop
alter table 表名 drop 字段名;
4.修改字段 change
(modify只能改数据类型,完整约束,不能改字段名
change可以,建议用change)
alter table 表名 modify 字段名 数据类型 [完整性约束条件];
alter table 表名 change 旧字段名 新字段名 旧数据类型 [完整性约束条件];
alter table 表名 change 旧字段名 新字段名 新数据类型 [完整性约束条件];
MySQL数据查询
where筛选
where后面写条件——根据该条件筛选
模糊查询:
关键字:
like
关键符号
% 匹配任意个数的任意字符
_ 匹配单个个数的任意字符
group by分组
分组之后默认只可以直接获取到分组的依据,无法再获取内部单个个体数据,如果想要获取需要借助一些方法
set global sql_mode="strict_trans_tables,only_full_group_by"
融合函数
主要用于分组之后的数据处理
max 最大值
min 最小值
avg 平均值
sum 求和
count 计数
having过滤
where用于分组之前的筛选
having用于分组之后的过滤
distinct去重
select distinct post from emp;
order by排序
select * from emp order by salary; 默认是升序
select * from emp order by salary asc; 手动升序,asc是升序关键字
select * from emp order by salary desc; 降序,desc是降序关键字
select * from emp order by age asc,salary desc; 先按age升序,再按salary降序
limit分页
select * from emp limit 5; 一个数字表示条数
select * from emp limit 5,10; 第一个数字表示起始位置,第二个表示条数
regexp正则(了解)
(正则:使用一些特殊符号的组合去字符串中筛选出符合条件的数据(爬虫再讲))
select * from emp where name regexp '^j.*(n|y)$';
group_concat()方法 用于分组之后
获取除分组以外其他字段数据,本质可以理解为是拼接操作
select post,group_concat(name) from emp group by post;
select post,group_concat(name,':',salary) from emp group by post;
2.concat()方法 用于分组之前
select post,concat(name,':',salary) from emp;
3.concat_ws()方法 用于分组之前,多个字段相同分隔符情况
select concat_ws('|',name,age,salary,gender) from emp;
MySQL多表查询
多表查询:所需数据来源于多张表数据的组合
多表查询之联表
inner join 内链接(用的最多)
select * from emp inner join dep on emp.dep_id=dep.id;
(只链接两个表中都有对应的数据)
left join 左链接
select * from emp left join dep on emp.dep_id=dep.id;
(以关键字左表为基础展示左表所有的数据,没有对应的以null填充)
right join 右链接
select * from emp right join dep on emp.dep_id=dep.id;
(以关键字右表为基础展示右表所有的数据,没有对应的以null填充)
union
select * from emp left join dep on emp.dep_id=dep.id
union
select * from emp right join dep on emp.dep_id=dep.id;
(同时以关键字两边为基础,展示两表所有的数据,没有对应的以null填充)
多表查询之子查询
(将一张表的查询结果用括号括起来当成另一条SQL语句的条件)
子查询即日常生活中解决问题的思路:分步操作
1.先查询技术和人力资源id号
select id from dep where name in ('技术','人力资源');
2.再去员工表里面根据部门id号筛选出员工数据
select * from emp where dep_id in (select id from dep where name in ('技术','人力资源'));
可视化软件之Navicat
在工作中有时候需要更加快速的完成一些基本操作,可视化软件可以大大提升工作效率,Navicat是一款可以操作多种数据库的软件,内部其实就是封装了相应的SQL语句
Navicat软件也是需要收费的,只能免费试用14天,但是我们可以使用破解版本
破解地址:自己百度去(当心垃圾软件)
pymysql模块
下载模块的基本语句
方式1:cmd终端
pip3 install pymysql
方式2:pycharm终端
pip3 install pymysql
方式3:pycharm快捷方式
settings>>>
(详见pymysql模块 - 雾雨黑白 - 博客园 (cnblogs.com))
远程仓库
pip3下载模块的时候默认都是从国外的仓库下载模块数据的
下载过程有时候会非常的慢,我们可以切换到国内的仓库
(1)阿里云 http://mirrors.aliyun.com/pypi/simple/
(2)豆瓣 http://pypi.douban.com/simple/
(3)清华大学 https://pypi.tuna.tsinghua.edu.cn/simple/
(4)中国科学技术大学 http://pypi.mirrors.ustc.edu.cn/simple/
(5)华中科技大学http://pypi.hustunique.com/
切换方法:
方式1:cmd命令临时切换
pip3 install 模块名 -i 仓库地址
方式2:pycharm更改仓库地址
settings 下载模块界面下方点击manage后添加网址
方法3:永久更新
需要修改python解释器内置的配置文件
pip3下载模块报错
1.报错信息内包含timeout关键字
原因:当前计算机网络不稳定
措施:try again and again
2.报错信息里面含有warning警告版本过低
原因:pip3工具版本过低需要更新
措施:直接拷贝提示的更新命令输入即可更新
3.报错信息里面没有任何关键字就是一堆红色字体
原因:可能是即将下载的模块对计算机环境有要求
措施:下载之前需要先准备好环境(百度去)
pymysql
基本格式
import pymysql conn = pymysql.connect( host='127.0.0.1', port=3306, user='root', password='123', # 支持简写passwd database='db6', # 支持简写db charset='utf8', autocommit=True # 自动确认 ) cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
使用python操作数据库有权限要求,因此pymysql模块针对增删改,需要二次确认,可以在基本格式里加上自动确认
autocommit=True
SQL注入
pymysql登录代码使用%插入数据时,将插入数据写在后面时会引发严重漏洞
因此在SQL注入中涉及到关键性的数据不要自己手动拼接
交由固定的方法拼接(方法会自动过滤掉特殊符号)
固定方法:
sql = "select * from userinfo where name=%s and password=%s" affect_rows = cursor.execute(sql, (username, password))
用户管理
1.创建用户
create user 用户名 identified by '密码';
"""修改密码"""
set password for 用户名 = Password('新密码');
set password = Password('新密码'); # 针对当前登录用户
2.重命名
rename user 新用户名 to 旧用户名;
3.删除用户
drop user 用户名;
4.查看用户访问权限
show grants for 用户名;
5.授予访问权限
grant select on db1.* to 用户名;
# 授予用户对db1数据库下所有表使用select权限
6.撤销权限
revoke select on db1.* from 用户名;
其他权限范围:
整个服务器
grant all/revoke all
整个数据库
on db.*
特定的表
on db.t1
事务(四大特性:ACID)
修改数据之前先开启事务操作
start transaction;
修改操作
update user set balance=900 where name='jason'; #买支付100元
update user set balance=1010 where name='kevin'; #中介拿走10元
update user set balance=1090 where name='tony'; #卖家拿到90元
回滚到上一个状态
rollback;
确认事务没有问题
commit; # 确认之后就无法再回退
视图
视图就是通过查询得到一张虚拟表,然后保存下来,下次直接使用即可
create view teacher2course as
select * from teacher inner join course on teacher.tid = course.teacher_id;
别用
触发器
在满足对某张表数据的增、删、改的情况下,自动触发的功能称之为触发器
语法结构
create trigger 触发器的名字 before/after insert/update/delete on 表名 for each row
begin
sql语句
end
针对触发器的名字有一个小习惯
tri_before_insert_t1
触发器简写_之前或之后_操作_表名
存储过程
相对于python中的自定义函数
delimiter $$
create procedure p1()
begin
select * from cmd;
end $$
delimiter ;
调用
call p1()
函数
相对于python中的内置方法
(ps:可以通过help 函数名 查看帮助信息!)
1.移除指定字符
Trim、LTrim、RTrim
2.大小写转换
Lower、Upper
3.获取左右起始指定个数字符
Left、Right
4.返回读音相似值(对英文效果)
Soundex
5.日期格式:date_format
(在MySQL中表示时间格式尽量采用2022-11-11形式)
CREATE TABLE blog (
id INT PRIMARY KEY auto_increment,
NAME CHAR (32),
sub_time datetime
);
INSERT INTO blog (NAME, sub_time)
VALUES
('第1篇','2015-03-01 11:31:21'),
('第2篇','2015-03-11 16:31:21'),
('第3篇','2016-07-01 10:21:31'),
('第4篇','2016-07-22 09:23:21'),
('第5篇','2016-07-23 10:11:11'),
('第6篇','2016-07-25 11:21:31'),
('第7篇','2017-03-01 15:33:21'),
('第8篇','2017-03-01 17:32:21'),
('第9篇','2017-03-01 18:31:21');
select date_format(sub_time,'%Y-%m'),count(id) from blog group by date_format(sub_time,'%Y-%m');
1.where Date(sub_time) = '2015-03-01'
2.where Year(sub_time)=2016 AND Month(sub_time)=07;
更多日期处理相关函数
adddate 增加一个日期
addtime 增加一个时间
datediff 计算两个日期差值
...
流程控制
if条件语句
if i = 1 THEN
SELECT 1;
ELSEIF i = 2 THEN
SELECT 2;
ELSE
SELECT 7;
END IF;
while循环语句
SET num = 0;
WHILE num < 10 DO
SELECT
num;
SET num = num + 1 ;
END WHILE;
索引
索引就是一种数据结构,类似于书的目录。
意味着以后在查数据应该先找目录再找数据,而不是用翻页的方式查询数据
索引在MySQL中也叫做"键",是存储引擎用于快速找到记录的一种数据结构
主键 primary key
除了可以加快查询之外还有其他的功能
唯一键 unique
除了可以加快查询之外还有其他的功能
索引键 index key
除了可以加快查询之外没有其他的功能
外键 foreign key
跟索引半毛钱关系都没有 也不存在提升查询速度一说
索引的影响
* 在表中有大量数据的前提下,创建索引速度会很慢
* 在索引创建完毕后,对表的查询性能会大幅度提升,但是写的性能会降低