自增特性

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;

mysql外键与表查询的更多相关文章

  1. 主外键多表查询demo

    https://www.cnblogs.com/DragonFire/p/6949767.html mySQL练习-主外键多表查询 MySQL练习-主外键多表查询 练习: 1.建立表关系: 请创建如下 ...

  2. 【Hibernate】无外键多表查询

    无外键多表查询时编写hql,直接使用逗号分隔表,where作为联合查询条件进行查询.查询出来的结果可为两种,List<List<Object>>或者List<Map< ...

  3. mysql 外键和子查询,视图

    1.mysql 外键约束 建表时生成外键   foreing key ('sid') references' student'('id'); 建表后添加外键  alter table' course ...

  4. MySQL练习-主外键多表查询

    练习: 1.建立表关系: 请创建如下表,并创建相关约束 USE db1; CREATE TABLE class( cid INT AUTO_INCREMENT PRIMARY KEY, caption ...

  5. MySQL外键和高级查询(连接查询、联合查询、子查询、去重查询)

    MySQL的外键 什么是外键,很简单保持数据一致性的一个约束键.如果你有两张表,第一张是学生表,第二张表是一个成绩表,我们来看看保持数据一致性,其实在Django等框架的模型中中也能做关联获取对象. ...

  6. Flask-SQLAlchemy - 不使用外键连表查询。记得常回来看我

    前言 相比于 Django 的 ORM ,SQLAlchemy "不依靠外键进行跨表联查" 的解决方案就比较多. 没啥好说的,只能怪自己学艺不精..  _(:з」∠)_ 解决办法 ...

  7. MYSQL - 外键、约束、多表查询、子查询、视图、事务

    MYSQL - 外键.约束.多表查询.子查询.视图.事务 关系 创建成绩表scores,结构如下 id 学生 科目 成绩 思考:学生列应该存什么信息呢? 答:学生列的数据不是在这里新建的,而应该从学生 ...

  8. oracle查询某张表的外键,并用 truncate 命令有外键的表中的数据

    注:本文来源于<oracle查询某张表的外键(最终解决办法)> 一:几个查询表外键的脚本 select b.table_name, b.column_name from user_cons ...

  9. mysql 外键(FOREIGN KEY)

    最近有开始做一个实验室管理系统,因为分了几个表进行存储·所以要维护表间的关联··研究了一下MySQL的外键. (1)只有InnoDB类型的表才可以使用外键,mysql默认是MyISAM,这种类型不支持 ...

随机推荐

  1. FR9833 32V转5V

  2. testview属性之详解

    安卓开发当中TextView是最常用的组件之一了,那么现在就来详细的了解下TextView的属性: Android:autoLink设置是否当文本为URL链接/email/电话号码/map时,文本显示 ...

  3. java集合(arraylist详解)

    一.ArrayList概述 ArrayList是实现List接口的动态数组,所谓动态就是它的大小是可变的.实现了所有可选列表操作,并允许包括 null 在内的所有元素.除了实现 List 接口外,此类 ...

  4. WePY开发环境的安装和小程序生成WePY项目

    相对于微信开发者工具而言,WePY的安装和生成项目稍显复杂.特记录下安装顺序: 1.安装Node.js 在Node官网(https://nodejs.org/)下载Node.js的安装包,此处我下载的 ...

  5. Color Constancy 颜色恒定性

    1:Color Constancy? 世界上并不存在颜色.颜色仅仅是我们的眼睛和大脑对不同可见光的波长进行的一层映射.也就说颜色只是我们大脑和视网膜处理的结果. 1.1 关键问题 我们的视觉系统有一个 ...

  6. eBPF Cilium实战(2) - 底层网络可观测性

    在之前的平台中,对于组件之间的网络流向不具备直接的可观测性,用户组件间通信出现问题,只能通过传统命令行工具进行手动排查,而 cilium 的 Hubble 服务可以提供 UI 界面向用户展示实时的流量 ...

  7. MySQL 的 GRANT和REVOKE 命令

    MySQL 的 GRANT和REVOKE 命令 GRANT - 授权 将指定 操作对象 的指定 操作权限 授予指定的 用户; 发出该 GRANT语句的可以是数据库管理员,也可以是该数据库对象的创建者; ...

  8. EmlParse:一款超轻量级的批量解析EML格式电子邮件的工具

    工具特点 1.绿色纯天然,无任何依赖库,文件大小不到150K: 2.可批量解析EML格式的电子邮件: 3.可提取EML文件中的正文和附件到指定目录: 4.可生成HTML格式的邮件列表清单,方便用户进行 ...

  9. python的一些练习题

    1.目前工作上有一堆的ip地址,ip是ok的,但是需要找出来不在这里面的其他ip import os a = list() with open('ip.txt','r') as f: #print(f ...

  10. ValidForm5.3.2 忽略表单项校验详解

    ValidForm 官方文档 项目的需求是这样的:一个checkbox,一个input,选中checkbox的时候,需要校验input,取消选中的时候,不要校验input. <input typ ...