自增特性

1.如果你手动添加自增字段的值,并且你的添加的值比之前的自增字段的值大,那么会从你添加的值开始自增。

create table t(
id int primary key auto_increment,
name varchar(16)
);
# 添加数据
insert into t(name) value('tom'),('mike'),('jake');
# 手动添加自增字段的值
insert into t value(20,'jason');
# 再添加数据
insert into t(name) value('jerry');
# 查询数据
select * from t;

2.自增不会因为删除数据而回退,比如:

create table t(
id int primary key auto_increment,
name varchar(16)
);
# 添加数据
insert into t(name) value('tom'),('mike'),('jake');
# 删除数据
delete from t where id=3;
# 再次添加数据
insert into t(name) value('jason');
# 查询结果
select * from t;

3.删除所有数据并重置

truncate 表名;

外键

外键是用于建立两个表数据之间的连接,使用外键表示一个表中的一个字段被另一个表中的一个字段引用。

外键关系

外键的关系一共三种:

  • 一对多:表t1的某个字段值可以对应多个表t2的某个字段值;比如一个班级可以对应多个学生。
  • 多对多:表t1的字段值可以对应多个表B的字段值,并且表B的字段值也可以对应多个表A的字段值;比如一个老师可以教多个班级,一个班级也可以有多个老师教。
  • 一对一:表t1的某个字段值只能对应一个表t2的某个字段值;比如用户账户表和用户信息表,用户账户存储账号密码,用户信息表存储用户信息。

外键创建

创建外键语法:

foreign key(外键字段) references 主键表(主键字段)

举例:创建学生与班级的关联关系

# 优先创建被关联表班级class
create table class(
cid int primary key auto_increment,
cla_name varchar(255)
);
# 创建外键关联表学生student
create table student(
sid int primary key auto_increment,
stu_name varchar(255),
cid int,
foreign key(cid) references class(cid)
);

外键的约束效果

1.创建表的时候,应该先创建被关联表(没有外键字段的表)。

2.添加数据的时候,应该先添加被关联表(没有外键字段的表)的数据。

3.外键字段添加的值只能是被关联表中已经存在的值。

3.修改、删除被关联表的数据都会出现障碍,需要优先修改、删除外键字段的值。

级联更新级联删除

因为在修改、删除被关联表的数据会出现障碍,所以我们可以在添加外键字段时设置级联更新和级联删除来同时修改或删除外键字段和主键字段的数据。

级联更新:

foreign key(外键字段) references 主键表(主键字段) on update cascade

级联删除:

foreign key(外键字段) references 主键表(主键字段) on delete cascade

同时设置级联更新、级联删除:

foreign key(外键字段) references 主键表(主键字段) on update cascade on delete cascade

多对多关系

两张表之间如果是多对多关系,是无法互相建立外键的,这时需要单独创建第三张表用于存储关系。

比如班级表和教师表之间的关系是多对多关系:一个班级有多个教师讲课,一个教师会在多个班级讲课。

# 创建班级表class
create table class(
cid int primary key auto_increment,
c_name varchar(32)
);
insert into class(c_name) value('高一(1)'),('高一(2)'),('高一(3)');
# 创建教师表
create table teacher(
tid int primary key auto_increment,
t_name varchar(32)
);
insert into teacher(t_name) value('jack'),('jason'),('mike');
# 第三张表:关系表
create table class_teacher(
cid int,
tid int,
foreign key(cid) references class(cid)
on update cascade on delete cascade,
foreign key(tid) references teacher(tid)
on update cascade on delete cascade
);
insert into class_teacher value(1,2),(1,1),(2,3),(3,1);

一对一关系

有时数据库为了节省资源并降低数据库压力,会将一个表一分为二,对这两个表建立一对一关系。

对于两个一对一关系的表,外键字段建在任意一方都可以,但是推荐建在查询频率较高的一方。

比如用户表一分为二,建立用户账号表和用户信息表,外键字段可以建立在用户账号表。

# 用户信息表
create table user_info(
uid int primary key auto_increment,
age int,
birthday date,
email varchar(32),
address varchar(32)
);
# 用户账号表
create table user_account(
uid int unique, # 添加外键字段唯一
username varchar(32),
password varchar(32),
foreign key(uid) references user_info(uid)
on update cascade on delete cascade
);

表查询关键字

select与from

select用于指定查询的字段,from用于指定查询的表。

select 查询的字段 from 表名

也可以给查询的字段起别名:

select 字段1 as 别名,字段2 as 别名 from 表名

where筛选

where关键字用于筛选数据。

select 查询的字段 from 表名 where 条件
条件 含义
id>3 筛选id字段值大于3的记录
id>3 and id<6 筛选id字段值大于3并且小于6的记录
id between 3 and 6 筛选id字段值在[3,6]之间的记录
id=2 or id=3 筛选id字段值等于2或者3的记录
id in (2,3) 筛选id字段值等于2或者3的记录
not id=2 筛选id字段值不等于2的记录
id is null 筛选id字段值为空的记录

模糊查询

模糊查询指查询条件不是很明确的情况。

模糊查询 含义
like 开启模糊查询的关键字
% 匹配任意个任意字符
_ 匹配一个任意字符

举例:

例子 含义
name like '%k%' 查询name字段值中包含'k'的记录
name like '张%' 查询name字段值中以'张'开头的记录
name like '张_' 查询name字段值中以'张'开头,并且只有两个字符的记录
name like '___' 查询name字段值中为三个字符组成的记录

group by分组

group by关键字可以根据字段把相同的值组成一个整体,比如性别有男和女,group by可以把性别为男的分为一组,把性别为女的分为一组。

作用:可以快速的统计出一些数据。

语法:

select 字段名 from 表名 group by 字段名;

分组后不能直接获取分组以外其他字段的数据,需要用特殊方法

聚合函数

专门用于分组之后的数据统计。

聚合函数 含义
max() 统计最大值
min() 统计最小值
sum() 统计求和
count() 统计计数
avg() 统计平均值

举例:

# 统计男生和女生中年龄最大的人
select sex,max(age) from person group by sex;
# 统计男生和女生的人数
select sex,count(age) from person group by sex;
# 统计男生和女生的平均年龄
select sex,avg(age) from person group by sex;

间接获取分组以外其他字段的数据

group_concat()方法:

select group_concat(字段1,字段2) from 表名 group by 分组字段

也可以自定义分隔符:

select group_concat(字段1,'|',字段2) from 表名 group by 分组字段

补充

mysql5.7及以上版本默认自带 sql_mode=only_full_group_by,该模式要求分组之后默认只可以直接获取分组的依据不能直接获取其他字段;

如果是MySQL5.6及以下版本,需要自己手动添加。

练习

关系练习

有如下表,判断表之间的关系:

  • 班级表(班级id,说明)
  • 学生表(学生id,姓名,性别,班级id)
  • 教师表(教师id,姓名)
  • 课程表(课程id,名称,教师id)
  • 成绩表(id,学生id,课程id,成绩)
点击查看答案
班级与学生:一对多
教师与课程:一对多
学生与课程:多对多

查询练习

数据准备

# 数据准备
create table emp(
id int primary key auto_increment,
name varchar(20) not null,
sex enum('male','female') not null default 'male', #大部分是男的
age int(3) unsigned not null default 28,
hire_date date not null,
post varchar(50),
post_comment varchar(100),
salary double(15,2),
office int, #一个部门一个屋子
depart_id int
); #添加记录
#三个部门:教学,销售,运营
insert into emp(name,sex,age,hire_date,post,salary,office,depart_id) values
('jason','male',18,'20170301','张江第一帅形象代言',7300.33,401,1), #以下是教学部
('tom','male',78,'20150302','teacher',1000000.31,401,1),
('kevin','male',81,'20130305','teacher',8300,401,1),
('tony','male',73,'20140701','teacher',3500,401,1),
('owen','male',28,'20121101','teacher',2100,401,1),
('jack','female',18,'20110211','teacher',9000,401,1),
('jenny','male',18,'19000301','teacher',30000,401,1),
('sank','male',48,'20101111','teacher',10000,401,1),
('哈哈','female',48,'20150311','sale',3000.13,402,2),#以下是销售部门
('呵呵','female',38,'20101101','sale',2000.35,402,2),
('西西','female',18,'20110312','sale',1000.37,402,2),
('乐乐','female',18,'20160513','sale',3000.29,402,2),
('拉拉','female',28,'20170127','sale',4000.33,402,2),
('僧龙','male',28,'20160311','operation',10000.13,403,3), #以下是运营部门
('程咬金','male',18,'19970312','operation',20000,403,3),
('程咬银','female',18,'20130311','operation',19000,403,3),
('程咬铜','male',18,'20150411','operation',18000,403,3),
('程咬铁','female',18,'20140512','operation',17000,403,3);

预览:

题目:

1. 查询岗位名以及岗位包含的所有员工名字
2. 查询岗位名以及各岗位内包含的员工个数
3. 查询公司内男员工和女员工的个数
4. 查询岗位名以及各岗位的平均薪资
5. 查询岗位名以及各岗位的最高薪资
6. 查询岗位名以及各岗位的最低薪资
7. 查询男员工与男员工的平均薪资,女员工与女员工的平均薪资

答案:

点击查看代码
# 1. 查询岗位名以及岗位包含的所有员工名字
select name,post from emp;
# 2. 查询岗位名以及各岗位内包含的员工个数
select post,count(name) from emp group by post;
# 3. 查询公司内男员工和女员工的个数
select sex,count(name) from emp group by sex;
# 4. 查询岗位名以及各岗位的平均薪资
select post,avg(salary) from emp group by post;
# 5. 查询岗位名以及各岗位的最高薪资
select post,max(salary) from emp group by post;
# 6. 查询岗位名以及各岗位的最低薪资
select post,min(salary) from emp group by post;
# 7. 查询男员工与男员工的平均薪资,女员工与女员工的平均薪资
select sex,avg(salary) from emp group by sex;

最新文章

  1. My97DatePicker时间控件使用
  2. WEB压力测试
  3. nginx+php+flight 构建RESTFul API
  4. Linux之mount命令详解
  5. SQL Server 2012 Express LocalDB
  6. 浙江大学PAT上机题解析之5-05. QQ帐户的申请与登陆
  7. [Jobdu] 题目1506:求1+2+3+...+n
  8. kNN(K-Nearest Neighbor)最近的分类规则
  9. NEON简单介绍
  10. 蓝桥网试题 java 基础练习 特殊回文数
  11. 通过 PHP,可以把文件上传到服务器。
  12. JavaScript术语:shim 和 polyfill
  13. Mysql 数据类型(基础5)
  14. ElasticSearch入门3: Spring Boot集成ElasticSearch
  15. 《Netty权威指南》
  16. Spring Cloud Sleuth Zipkin - (1)
  17. 简单了解 iTextSharp实现HTML to PDF
  18. BZOJ 4517--[Sdoi2016]排列计数(乘法逆元)
  19. webstrom如何配置babel来转换es6
  20. activity启动模式launchMode区别和优化

热门文章

  1. canvas —— globalCompositeOperation
  2. ES6-11学习笔记--模块化
  3. leetcode-剑指 Offer II 012. 左右两边子数组的和相等
  4. 【Android开发】控件外边框自定义
  5. Android中的Preference结构的设计与实现
  6. Linux安装JDK报错
  7. IDEA个人常用快捷键
  8. ELK日志保留7天-索引生命周期策略
  9. 自学java如何快速地达到工作的要求?
  10. 学习Java必用的9个网站,最后一个最好用!