自增特性

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

  1. create table t(
  2. id int primary key auto_increment,
  3. name varchar(16)
  4. );
  5. # 添加数据
  6. insert into t(name) value('tom'),('mike'),('jake');
  7. # 手动添加自增字段的值
  8. insert into t value(20,'jason');
  9. # 再添加数据
  10. insert into t(name) value('jerry');
  11. # 查询数据
  12. select * from t;

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

  1. create table t(
  2. id int primary key auto_increment,
  3. name varchar(16)
  4. );
  5. # 添加数据
  6. insert into t(name) value('tom'),('mike'),('jake');
  7. # 删除数据
  8. delete from t where id=3;
  9. # 再次添加数据
  10. insert into t(name) value('jason');
  11. # 查询结果
  12. select * from t;

3.删除所有数据并重置

  1. truncate 表名;

外键

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

外键关系

外键的关系一共三种:

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

外键创建

创建外键语法:

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

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

  1. # 优先创建被关联表班级class
  2. create table class(
  3. cid int primary key auto_increment,
  4. cla_name varchar(255)
  5. );
  6. # 创建外键关联表学生student
  7. create table student(
  8. sid int primary key auto_increment,
  9. stu_name varchar(255),
  10. cid int,
  11. foreign key(cid) references class(cid)
  12. );

外键的约束效果

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

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

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

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

级联更新级联删除

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

级联更新:

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

级联删除:

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

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

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

多对多关系

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

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

  1. # 创建班级表class
  2. create table class(
  3. cid int primary key auto_increment,
  4. c_name varchar(32)
  5. );
  6. insert into class(c_name) value('高一(1)'),('高一(2)'),('高一(3)');
  7. # 创建教师表
  8. create table teacher(
  9. tid int primary key auto_increment,
  10. t_name varchar(32)
  11. );
  12. insert into teacher(t_name) value('jack'),('jason'),('mike');
  13. # 第三张表:关系表
  14. create table class_teacher(
  15. cid int,
  16. tid int,
  17. foreign key(cid) references class(cid)
  18. on update cascade on delete cascade,
  19. foreign key(tid) references teacher(tid)
  20. on update cascade on delete cascade
  21. );
  22. insert into class_teacher value(1,2),(1,1),(2,3),(3,1);

一对一关系

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

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

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

  1. # 用户信息表
  2. create table user_info(
  3. uid int primary key auto_increment,
  4. age int,
  5. birthday date,
  6. email varchar(32),
  7. address varchar(32)
  8. );
  9. # 用户账号表
  10. create table user_account(
  11. uid int unique, # 添加外键字段唯一
  12. username varchar(32),
  13. password varchar(32),
  14. foreign key(uid) references user_info(uid)
  15. on update cascade on delete cascade
  16. );

表查询关键字

select与from

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

  1. select 查询的字段 from 表名

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

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

where筛选

where关键字用于筛选数据。

  1. 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可以把性别为男的分为一组,把性别为女的分为一组。

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

语法:

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

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

聚合函数

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

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

举例:

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

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

group_concat()方法:

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

也可以自定义分隔符:

  1. 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,成绩)
点击查看答案
  1. 班级与学生:一对多
  2. 教师与课程:一对多
  3. 学生与课程:多对多

查询练习

数据准备

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

预览:

题目:

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

答案:

点击查看代码
  1. # 1. 查询岗位名以及岗位包含的所有员工名字
  2. select name,post from emp;
  3. # 2. 查询岗位名以及各岗位内包含的员工个数
  4. select post,count(name) from emp group by post;
  5. # 3. 查询公司内男员工和女员工的个数
  6. select sex,count(name) from emp group by sex;
  7. # 4. 查询岗位名以及各岗位的平均薪资
  8. select post,avg(salary) from emp group by post;
  9. # 5. 查询岗位名以及各岗位的最高薪资
  10. select post,max(salary) from emp group by post;
  11. # 6. 查询岗位名以及各岗位的最低薪资
  12. select post,min(salary) from emp group by post;
  13. # 7. 查询男员工与男员工的平均薪资,女员工与女员工的平均薪资
  14. 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. c++实现职责链模式--财务审批

    内容: 某物资管理系统中物资采购需要分级审批,主任可以审批1万元及以下的采购单,部门经理可以审批5万元及以下的采购单,副总经理可以审批10万元及以下的采购单,总经理可以审批20万元及以下的采购单,20 ...

  2. VISIO下载+安装+第一个数据流图

    一. 下载地址 Visio2021 (64bit).zip_免费高速下载|百度网盘-分享无限制 (baidu.com) 码3333 二. 安装步骤 Visio2021安装教程 (qq.com) 三. ...

  3. java中“类”和“对象”到底有什么联系

    4.object和Class配合工作原理    [新手可忽略不影响继续学习] Class是"类"的意思,是抽象的,并没有具体的说是哪个东西.而object是具体的,实实在在存在的一 ...

  4. Windows测试Hadoop报错解决

    错误1:HADOOP_HOME and hadoop.home.dir are unset 原因:没有在Windows配置环境变量 解决办法:配置环境变量:记得配置到bin目录 错误2:Could n ...

  5. MyEclipse如何刷新项目

    第一种:选中项目,点右键Refresh即可, 第二种:选择project->clean,选中所要编译得项目,点ok即可

  6. MFC软件国际化的几个问题及其解决方案

    作者:马健 邮箱:stronghorse_mj@hotmail.com主页:https://www.cnblogs.com/stronghorse/ 以前我以为PDG相关软件只会在国内流行,所以发行简 ...

  7. Python入门-字符串格式化

    一.不推荐使用:%号 #正常按照位置传递参数 print('%s asked %s to do something' % ('egon', 'lili')) #先后顺序不能乱 #字典传递参数 prin ...

  8. 网络编程学习——Linux epoll多路复用模型

    前言 后端开发的应该都知道Nginx服务器,Nginx是一个高性能的 HTTP 和反向代理服务器,也是一个 IMAP/POP3/SMTP 代理服务器.后端部署中一般使用的就是Nginx反向代理技术. ...

  9. 面试官:ZAB协议是什么?

    哈喽!大家好,我是小奇,一位不靠谱的程序员 小奇打算以轻松幽默的对话方式来分享一些技术,如果你觉得通过小奇的文章学到了东西,那就给小奇一个赞吧 文章持续更新 一.前言 这天是越来越热了,但是还是有很多 ...

  10. javaWeb代码整理02-jdbcTemplete数据库连接工具

    jar包: maven坐标: /**属于spring框架的包*/<dependency> <groupId>org.springframework</groupId> ...