一、自增主键特性
自增主键,每次生成会将主键值+1,自增主键所属的记录被删除时,该主键值会一直缺失。(例如删除主键id为2的记录,新增记录后,id为2的记录不会再次插入)
为拥有自增主键的表添加记录时,如果自行给定主键id,那后续插入再次遇到已插入的主键di会自行插入下一个id值。(例如表中没有记录,此时添加一条id为5的记录,那当我们顺序插入8条不带id的记录时,会自动插入1,2,3,4,6,7,8,9;并不会重新插入id为5的记录)
存在主键时,使用delete删除表中数据不会重置id,也就是说id依旧会保留之前的记录id。使用truncate不仅删除记录还会重置主键id。
eg :
delete from table_name; # 删除表中记录,但不重置id
truncate table_name; # 删除表中记录,且重置id
二、外键
1. 外键的作用
外键主要用来描述表与表之间的关系。
- 一对多关系
- 一对一关系
- 多对多关系
每张表对应一类事物,每条记录对应一类事物中的一个,事物与事物之间是存在关联的。
eg:
一个学校中有多个学生 =》 一对多
一个中国公民有一个身份信息 =》 一对一
一门课程有多个学生,一个学生有多个课程 =》 多对多
面对这种情况独立的几个表是无法完成这些联系的,所以需要用到外键来设置这些联系。
2.外键的使用
使用外键之前需要明白表与表之间是什么关系,这样才好设置外键。
外键设置时要保证参照对象和被参照对象至少是唯一约束的,最好是主键。
语法:[ ]中的可以不设置,mysql会自动设置
[constraint 约束名] foreign key(参照字段) references 被参照表(被参照字段)
可在外键设置语句后添加级联更新或级联删除:
on delete cascade 级联删除,在删除外键参照的表中记录会自动删除拥有级联删除外键的表中的记录
on update cascade 级联更新,在更新外键参照的表中记录会自动更新拥有级联更新外键的表中的记录
针对一对一的关系,外键可以设置在任意一方(表),最好设置在经常需要查询数据的一方。
eg: 一个人对应一个身份信息
create table identity(
inentity_id int auto_increment primary key,
id_card varchar(18) unique,
); # 必须先创建被参照的表
create table poeple(
people_id int auto_ increment primary key,
name varchar(20),
birthday date,
identity_id int,
[constraint 约束名] foreign key(identity_id ) references identity(inentity_id )
); # 参照表
针对一对多关系,外键必须设置在多的一方(表)。
eg: 一个班级有多个学生
create table classs(
cid int auto_increment primary key,
cname varchar(10)
);
create table student(
sid int auto_increment primary key,
sname varchar(20),
cid int,
[constraint 约束名] foreign key(cid) references classs(cid)
);
针对多对多关系,必须将联系拆分为三张表
eg: 一个学生有多个老师,一个老师有多个学生
create table student(
sid int auto_increment primary key,
sname varchar(20)
);
create table teacher(
tid int auto_increment primary key,
tname varchar(20)
);
create table teacher_and_student(
tsid int auto_increment primary key,
tid int,
sid int,
[constraint 约束名] foreign key(tid) references teacher(tid),
[constraint 约束名] foreign key(sid) references student(sid)
);
三、查询(上)
查询时可以用as为查询结果的字段起别名。
1.select
使用select查询记录
语法:
select 需要查询的字段 from 查询字段所在的表;
eg:
select sid from student; # 从学生表查询记录,记录中只有id字段
select * from student; # 从学生表查询记录,记录中有所有字段
2.where
使用where可以从查询到的记录中筛选符合条件的记录
>、<、>=、<=、=、 可以用于日期、整型,不能与not in 组合
eg:
时间大于2012年1月1日的记录
select * from k1 where now_time > “2012-01-01”;
not 取反
时间不为2012-01-02或2015-03-02的所有记录
select * from k1 where now_time not in (“2012-01-02”, “2015-03-02”);
and 交集
id在3到6之间的记录
select * from k2 where id>=3 and id<=6;
or 并集
id为3或者5的记录
select * from k2 where id = 5 or id = 3;
in 是否符合in后的条件
时间为2019-01-02或2012-03-02的记录
select * from k1 where now_time in (“2019-01-02”, “2012-03-02”);
between 俩者之间
id在3到5之间的记录
select * from k2 where id between 3 and 5;
is 针对于判断null使用
时间为null的记录
select * from k1 where now_time is null;
模糊查询:
使用like来进行模糊查询
%:匹配任意个数的任意字符
_:匹配单个个数的任意字符
eg:
查询日期为201开头的
select * from k1 where now_time like “201%”;
3.group by
对记录进行分组
mysql5.7及以上版本默认自带sql_mode=only_full_group_by
该模式要求分组之后默认只可以直接获取分组的依据不能直接获取其他字段
原因是分组的目的就是按照分组的条件来管理诸多数据 最小单位应该是分组的依据而不是单个单个的数据
如果是MySQL5.6及以下版本 需要自己手动添加
或者通过group_concat来获取分组是别的数据
聚合函数:
专门用于分组之后的数据统计
函数名 | 作用 |
---|---|
max | 统计最大值 |
min | 统计最小值 |
sum | 统计求和 |
count | 统计计数 |
avg | 统计平均值 |
查询按照金钱来分组,没种金钱对应多少人
select count(name), money from k3 group by money;
±————±——+
| count(name) | money |
±————±——+
| 2 | 1500 |
| 2 | 9000 |
±————±——+