表的创建
存储引擎
日常生活中文件格式有很多种,并且针对不同的文件格式会有对应不同的存储方式
和处理机制
存储引擎就是不同的处理机制
mysql主要存储引擎
innodb
mysql5.5版本以后默认的存储引擎
存储数据更加的安全
myisam
mysql5.5版本以前默认的存储引擎
速度比innodb更快,但是我们更加注重数据的安全
memory
内存引擎(数据全部存放在内存中)
blackhole
无论存什么,都立刻消失
查看所有的存储引擎
show engines;
创建表的完整语法
create table 表名(
字段名1 类型(宽度) 约束条件,
字段名2 类型(宽度) 约束条件,
字段名3 类型(宽度) 约束条件
)
注意:
1在同一张表中字段名不能重复
2宽度和约束条件是可选的(可写可不写)而字段名和字段类型是必须的
约束条件写的话,,也支持写多个
3最后一行不能有逗号
宽度
一般情况下指的是对存储数据的限制
针对不同版本会出现不同的效果
5.6版本默认没有开启严格模式,规定只能存一个字符你给了多个字符,那么会帮你自动截取
5.7版本或者以上开启了严格模式,那么规定只能存几个,就不能超,一旦超出了范围立即报错
使用数据的准则
能尽量少让数据库干活就尽量少,不要给数据增加额外的压力
约束条件和宽度的关系
宽度是用来限制数据的存储
约束条件是在宽度的基础上增加额外的约束
基本数据类型
整形分类
tinyint
smalliny
meduimintint
bingint
作用
存储年龄、等级、id、号码
特例:只有整形括号里面的数字不是表示限制的位数
id int( 8 )
如果数字没有超出8位,那么默认用空格填充至8位
如果数字超出8位,那么有几位就存几位
针对整形字段,括号无需指定宽度,因为它默认的宽度以及足够显示所有的数据
如何查看严格模式
show variable like "%mode";
模糊匹配/查询
关键字 like
% 匹配任意多个字符
_ 匹配任意单个字符
修改严格模式
set session 只在当前窗口有效
set global 全局生效
set global sql_model = 'STRICT_TRANS_TABLES';
浮点型
分类
float
double
decimal
作用
身高、体重、薪资
字符类型
分类
char 定长
数据超过直接报错,不够空格补全
varchar 变长
数据超过直接报错,不够有几个存几个
统计字段长度
char_length
char与varchar对比
char
缺点:浪费空间
优点:存取都很简单
直接按照固定的字符存取数据即可
varchar
优点:节省空间
缺点:存取较为麻烦
时间类型
分类
date:年月日
datetime:年月日时分秒
time:时分秒
Year:年
枚举与集合类型
分类
枚举( enum ) 多选一
枚举字段后期在存数据的时候只能从枚举里面选择一个存储
集合( set ) 多选多
集合可以只写一个,但是不能写没有列举的
约束条件
zerofill
unsigned
not null
default 默认值
unique 唯一
单列唯一
联合唯一
primary key 主键
1单单从约束效果上看primary key等价于not null + unique非空且唯一
2它除了有约束效果之外,它还是innodb存储引擎组织数据的依据
innodb存储引擎在创建表的时候必须有primary key
a一张表有且只有一个主键,如果你没有设置主键,那么就会从上往下搜索直到
遇到一个非空且唯一的字段将它自动升级为主键
b如果表中没有主键也没有其他任何的非空且唯一的字段,那么innodb会采用自己
内部提供的一个隐藏的字段作为主键,隐藏意味着你无法使用到它,就无法提高查询速度
c一张表中通常应该有一个主键主键字段,并且将id/uid/sid字段作为主键
联合主键( 多个字段联合起来作为表的主键,本质还是一个主键)
auto_increment自增
当编号特别多的时候,人为的去维护太麻烦
truncate 清空数据并重置主键
表与表之间建关系
1表的组织建构不是很清晰
2浪费硬盘空间
3数据的扩展性极差
外键
就是用来帮助我们建立表与表之间的关系的
foreign key
1一对多关系表,外键字段建立在多的一方
2在创建表的时候,一定要先建被关联表
3在录入数据的时候,也必须先录入被关联表
表关系
有四种关系
一对多
多对多
一对一
没有关系
级联更新级联删除
on updata cascade
on delete cascade
一对多关系
判断表与表的关系的时候,前期不熟悉的情况下,一定要按照换位思考
分别站在两张表的角度考虑
多对多
针对多对多的字段表关系,不能在两张表原有的表中创建外键
需要你单独最开设一张,专门用来存储两张表数据之间的关系
一对一
外键字段建立在任意一方都可以,但是推荐建立在查询频率较高的表中
修改表
1修改表名
alter table 表名 rename 新表名;
2增加字段
alter table 表名 add 字段名 字段类型(宽度) 约束条件;
alter table 表名 add 字段名 字段类型(宽度) 约束条件 first;
alter table 表名 add 字段名 字段类型(宽度) 约束条件 after 字段名;
3删除字段
alter table 表名 drop 字段名;
4修改字段
alter table 表名 modify 字段名 字段类型(宽度) 约束条件;
alter table 表名 change 旧字段 新字段名 字段类型(宽度) 约束条件;
复制表
我们sql语句查询的结果其实就是一张表
create table 表名 select * from table 旧表;
不能复制主键哎,外键......
几个重要关键字的执行顺序
书写顺序
select * from emp where id >3;
执行顺序
from
where
select
虽然执行顺序和书写顺序不一致,你在书写sql语句的时候可能不知道怎么写
你就按照书写顺序的方式写sql
select * 先用*号占位
之后去补全后面的sql语句
最后将*号替换你想要的具体字段
where约束条件
作用:是对整体数据的一个刷选操作
in
and
or
not in
between
like %任意多个字符 _任意单个字符
group by分组
分组实际应用场景
男女比例
部门平均薪资
部门秃头率
国家之间数据统计
分组之后,最小可操作单位应该是组,不最是组内的单个数据
在没有设置严格模式的时候是可正常执行的,返回的是分组之后每个组的第一条数据
但是这不符合分组规范;分组之后不应该考虑单个数据,而应该以组为操作单位(分组之后
没办法直接获取组内单个数据)
set global sql_mode = 'strict_trans_tables,only_full_group_by';
设置严格模式之后,默认只能拿到分组的数据
其他字段不能直接获取,需要借助于一些方法(聚合函数)
聚合函数
max
min
sum
count
avg
需要分组关键字:
每个
平均
最高
最低
group_concat
不单单可以支持你获取分组之后的其他字段,还支持拼接操作
concat
不分组的时候用
concat_ws
如果多个字段之间的连接符号是相同的情况下
分组注意事项
关键字where和group by同时出现的时候group by必须在where的后面
where先对整体数据进行过滤之后最分组操作
where刷选条件不能使用聚合函数
having分组之后的刷选条件
having的语法跟where是一致的
只不过having是分组之后进行刷选操作
即having是可以直接使用聚合函数
distinct去重
一定要注意,必须是完全一样的数据才可以去重
不要忽视了主键,有主键存在的情况下是不可能去重的
order by排序
order by默认是升序,asc可以省略不写
也可以修改为降序desc
limit限制展示条数
针对数据过多的情况,我们通常都是做分页处理
第一个参数是起始位置
第二个参数是展示条数
正则
正则是一门独立的语言
在python中如果你想使用正则需要借助于re模块
1re模块常用的方法
findall 分组优先展示
match 从头匹配
search 从整体配置
2贪婪匹配与非贪婪匹配
正则表达式默认都是贪婪匹配的
将贪婪变成非贪婪只需要在正则表达式后面加?
.*贪婪
.*?非贪婪
多表操作
1mysql也知道,在后面的查询数据的过程中,肯定经常用到拼表操作
所以特地为你开设了对应的方法
inner join 内连接
只拼接两张表中公有的数据部分
left join 左连接
左连接所有的数据都展示出来,没有对应的项就用null
right join 右连接
右连接所有的数据都展示出来,没有对应的项就用null
union 全连接
左右两表所有的数据都展示出来
2子查询
我们平时解决问题的思路
将一个查询语句的结果当做另外一个查询语句的条件去使用