1. 多表关系

MySQL多表之间的关系可以概括位:一对一、一对多或多对一、多对多。


1.1 一对多的外键约束

1.1.1 的创建




1.1.2 外键约束的插入、删除操作

插入:主表随便插入符合格式的数据,从表需要依赖主表的主键列。
删除:主表的数据被从表依赖时,主表和从表都有的主键,主表不能删除相关主键,否则可以删除;从表的数据可以随便删除。


1.1.3 删除外键约束键

1.2 多对多的外键约束



1.3 多表查询

1.3.1 交叉链接查询


笛卡尔积的内容来源:

1.3.2 内连接查询

1.3.3 外连接查询

1.3.4 多表联合查询






1.3.5 自关联查询

2. 案例

创建表

-- 创建test1数据库
CREATE DATABASE test1;
-- 选择使用test1数据库
USE test1
-- 创建部门表
CREATE TABLE dept(
deptno INT PRIMARY KEY, -- 部门编号
dname VARCHAR(20),   -- 部门名称
loc VARCHAR(20) -- 部门地址
)INSERT INTO dept VALUES (10,'accounting','new york');
INSERT INTO dept VALUES (20,'research','dallas');
INSERT INTO dept VALUES (30,'sales','chicago');
INSERT INTO dept VALUES (40,'operations','boston');-- 创建员工表
CREATE TABLE emp(
empno INT PRIMARY KEY, -- 员工编号
ename VARCHAR(10),  -- 员工姓名
job VARCHAR(9), -- 员工工作
mgr INT,  -- 员工指数领导编号
hiredate date, -- 入职时间
sal DOUBLE,  -- 工资
comm DOUBLE, -- 奖金
deptno INT  -- 对应dept表的外键
);-- 添加部门和员工之间的主外键关系
ALTER TABLE emp ADD CONSTRAINT FOREIGN KEY emp(deptno) REFERENCES dept (deptno);INSERT INTO emp VALUES (7369,'smith','clerk',7902,'1980-12-17',800,null,20);
INSERT INTO emp VALUES (7499,'allen','salesman',7698,'1981-02-20',1600,300,30);
INSERT INTO emp VALUES (7521,'ward','salesman',7698,'1981-02-22',1250,500,30);
INSERT INTO emp VALUES (7566,'jones','manager',7839,'1981-04-02',2975,null,20);
INSERT INTO emp VALUES (7654,'marthin','salesman',7698,'1981-09-28',1250,1400,30);
INSERT INTO emp VALUES (7698,'blake','manager',7839,'1981-05-01',2850,null,30);
INSERT INTO emp VALUES (7782,'clark','manager',7839,'1981-06-09',2450,null,10);
INSERT INTO emp VALUES (7788,'scott','analyst',7566,'1981-07-03',5000,null,20);
INSERT INTO emp VALUES (7839,'king','president',null,'1981-11-17',5000,null,10);
INSERT INTO emp VALUES (7844,'turner','salesman',7698,'1981-09-08',1500,0,30);
INSERT INTO emp VALUES (7876,'adams','clerk',7788,'1987-07-13',1100,null,20);
INSERT INTO emp VALUES (7900,'james','clerk',7698,'1981-12-03',950,null,30);
INSERT INTO emp VALUES (7902,'ford','analyst',7566,'1981-12-03',3000,null,20);
INSERT INTO emp VALUES (7934,'miller','clerk',7782,'1981-01-23',1300,null,10);-- 创建工资等级表
CREATE TABLE salgrade(
grade INT, -- 等级
losal DOUBLE, -- 最低工资
hisal double  -- 最高工资
);INSERT INTO salgrade VALUES (1,700,1200);
INSERT INTO salgrade VALUES (2,1201,1400);
INSERT INTO salgrade VALUES (3,1401,2000);
INSERT INTO salgrade VALUES (4,2001,3000);
INSERT INTO salgrade VALUES (5,3001,9999);

练习

-- 练习
-- 1、返回拥有员工的部门名、部门号
SELECT DISTINCT a.dname,a.deptno FROM dept a join emp b on a.deptno=b.deptno;
-- 2、工资水平多余smith的员工水平
SELECT * FROM emp WHERE sal > (SELECT sal FROM emp WHERE ename = 'smith');
-- 3、返回员工和所属经理的姓名
SELECT a.ename,b.ename FROM emp a join emp b on a.empno=b.mgr;
-- 4、返回雇员的雇佣日期早于其经理雇佣日期的员工及其经理姓名。
SELECT a.ename,a.hiredate,b.ename,b.hiredate FROM emp a join emp b on a.empno=b.mgr and a.hiredate > b.hiredate;
-- 5、返回员工姓名及其所在的部门名称。
SELECT a.ename,b.dname FROM emp a join dept b on a.deptno = b.deptno;
-- 6、返回从事clerk工作的员工姓名和所在部门的名称。
SELECT a.ename,a.job,b.dname FROM emp a join dept b on a.deptno=b.deptno and job = 'clerk';
-- 7. 返回部门号及其部门的最低工资
SELECT deptno,MIN(sal) FROM emp GROUP BY deptno;
-- 8. 返回销售部门所有员工的姓名。
SELECT a.ename,b.dname FROM emp a join dept b on a.deptno=b.deptno and b.dname='sales';
-- 9. 返回工资水平多于平均工资的员工
SELECT ename,sal FROM emp WHERE sal > (SELECT AVG(sal) FROM emp);
-- 10、返回于scott从事相同工作的员工。
SELECT * FROM emp WHERE job = (SELECT job FROM emp WHERE ename = 'scott');
-- 11、返回高于30部门员工工资水平的员工信息;
SELECT * FROM emp WHERE sal > ALL(SELECT sal FROM emp WHERE deptno=30);
-- 12、返回员工工作及其从事此工作的最低工资;
SELECT job,MIN(sal) FROM emp GROUP BY job;
-- 13、计算出员工的年薪,并且以年薪排序
SELECT ename,(sal * 12 + ifnull(comm,0)) as yeas_sal FROM emp ORDER BY yeas_sal DESC;
-- 14、返回工资处于第四级别的员工工资
SELECT * FROM emp
WHERE  sal BETWEEN  (SELECT losal FROM salgrade WHERE grade = 4) AND (SELECT hisal FROM salgrade WHERE grade = 4);-- 15、返回工资为二等级的职员名字、部门所在地
-- 这里硬将三个表结合成笛卡尔积,然后再用条件删选
SELECT
*
FROM dept a
JOIN emp b on a.deptno=b.deptno
JOIN salgrade c on grade = 2 and b.sal >= c.losal and  b.sal <= c.hisal;--------------------
SELECT
*
FROM dept a , emp b ,salgrade c
WHERE a.deptno=b.deptno
AND  grade = 2 and b.sal >= c.losal and  b.sal <= c.hisal;

3. 参考

https://www.bilibili.com/video/BV1iF411z7Pu?p=82&spm_id_from=pageDriver

MySQL的多表查询-多表关系与相关练习题相关推荐

  1. mysql数据库中,查询一个表的下一条数据减上一条数据的值的写法

    mysql数据库中,查询一个表的下一条数据减上一条数据的值的写法: select a.nodeId,a.cpuCharge-b.cpuCharge cpuCharge, a.chargeTime fr ...

  2. 数据库一对多做链接去重_数据库单表查询-多表查询

    """ 1.字段修改 alter modify alter change alter add ''|first|after alter drop 2.表关系: 一对一:外 ...

  3. day44 数据库单表查询-多表查询

    目录 复习 今日内容 单表查询 连表查询 复习 """ 1.字段修改alter modifyalter changealter add ''|first|afteralt ...

  4. python 全栈开发,Day62(外键的变种(三种关系),数据的增删改,单表查询,多表查询)...

    一.外键的变种(三种关系) 本节重点: 如何找出两张表之间的关系 表的三种关系 一.介绍 因为有foreign key的约束,使得两张表形成了三种了关系: 多对一 多对多 一对一 二.重点理解如果找出 ...

  5. MySQL数据库----多表查询,表连接

    一.查询概述: 查询:指的是针对表中已经存在的数据,可以按照特定组合,条件,或者次序等等来进行一系列的检索查看操作------>select语句. 二.查询的基本操作: 1.查询语句的基本结构: ...

  6. mysql左连接去重查询_MYSQL-多表查询

    多表查询 **交叉连接 cross join 内连接 inner join 外连接 左连接 left join 右连接 right join 联合查询 UNION 全连接 ** 1.多表纵向合并 纵向 ...

  7. mysql左驱动表_MySQL多表联表查询驱动表选择

    联表查询做开发的小伙伴会经常使用,但是可以大家都比较少去深入了解MySQL是怎么执行多表联表查询的,比如怎么选择驱动表(第一个被处理的表),是先联表还是说先根据where条件(前提是有where条件) ...

  8. Mysql的多表查询(表添加,多表查询练习:笛卡尔积、内连接、外连接、子查询、UNION组合查询)

    https://blog.csdn.net/hanhanwanghaha宝藏女孩 欢迎您的关注! 欢迎关注微信公众号:宝藏女孩的成长日记 如有转载,请注明出处(如不注明,盗者必究) 目录 一.表的创建 ...

  9. mysql连表查询,多表查询

    先展示两个表 学生表: 老师表: 年级班级表 普通连表查询 查询年级的管理老师和班级的管理老师 select gradeclass.name as gradeName,teacher.name as ...

最新文章

  1. [实变函数]6 微分与不定积分
  2. 被遗忘的Logrotate
  3. Java Web使用数据库连接池
  4. influxdb mysql对比_InfluxDB读写性能测试
  5. c++ so 反射_c++如何实现反射功能?
  6. C++:VS2019调试dump文件
  7. 想做DBA,多租户管理你一定要知道这些
  8. Ubuntu中Unable to acquire the dpkg frontend lock (/var/lib/dpkg/lock-frontend)问题的解决
  9. 转 python 闭包的说明
  10. python从入门到精通pdf下载-Python网络爬虫从入门到精通 PDF 下载
  11. libcurl代码示例
  12. 抖音从流量上游杀入本地生活市场,美团如何“以牙还牙”?
  13. 亿阳信通面试 亿阳信通笔试 面经大全
  14. bzoj1754 [Usaco2005 qua]Bull Math
  15. FFmpeg音视频播放器实现
  16. 手机java update_手机里的java菜单老是自动更新为什么啊
  17. 第七天 位置参数 变量运算if case || find locate compress
  18. 解剖学坐标体系(LPS , RAS和LAS)
  19. 张振民北京计算机专修学院,工行甘肃省分行张振民一行来校考察交流
  20. Unity踩坑:FindObjectsOfType can only be called from the main thread

热门文章

  1. Android判断软键盘 输入法 是否显示
  2. 【金字塔原理2】剖析金字塔的内部结构
  3. 利用gdal给影像添加金字塔
  4. opencv贾老师系列17——人脸识别实战
  5. 国庆七天测(五)马里奥
  6. Tableau:自定义地图的使用
  7. 炫酷黑色系北漂鱼引导页源码
  8. d3力导向图增加节点_d3.js力导向图节点如何都显示在边框内
  9. JAVA把指定文件放入压缩包
  10. Spring Boot缓存实战 EhCache