多表联合查询的基本步骤:

select

  • 要查询的目标(可以是要查询的列,也可以是聚合函数)

from

  • 要查询的目标来自于哪个表

where

  • 查询的条件

group by

  • 分组的依据(分组的依据必须是查询的目标,或者是聚合函数)

having

  • 分组后要进行的限制条件

order by

  • 排序(默认的是升序:asc,降序:desc)

现在有两个表,用来进行多表联合查询:

  • 员工表
/*
Navicat MySQL Data TransferSource Server         : 隔壁老黄
Source Server Version : 50550
Source Host           : localhost:3306
Source Database       : mydb2Target Server Type    : MYSQL
Target Server Version : 50550
File Encoding         : 65001Date: 2020-08-02 14:55:48
*/SET FOREIGN_KEY_CHECKS=0;-- ----------------------------
-- Table structure for emp
-- ----------------------------
DROP TABLE IF EXISTS `emp`;
CREATE TABLE `emp` (`eno` int(11) NOT NULL AUTO_INCREMENT COMMENT '员工工号',`ename` varchar(255) DEFAULT NULL COMMENT '姓名',`job` varchar(255) DEFAULT NULL COMMENT '职位',`hiredate` datetime DEFAULT NULL COMMENT '入职时间',`age` int(11) DEFAULT NULL COMMENT '年龄',`sex` varchar(255) DEFAULT NULL COMMENT '性别',`sal` varchar(255) DEFAULT NULL COMMENT '月薪',`dno` int(11) DEFAULT NULL COMMENT '部门号',PRIMARY KEY (`eno`) USING BTREE,UNIQUE KEY `INDEX_eno` (`eno`),KEY `fg_dno` (`dno`),CONSTRAINT `fg_dno` FOREIGN KEY (`dno`) REFERENCES `dept` (`dno`)
) ENGINE=InnoDB AUTO_INCREMENT=124 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT;-- ----------------------------
-- Records of emp
-- ----------------------------
INSERT INTO `emp` VALUES ('2', '阿卡丽', '经理', '2017-04-01 00:00:00', '31', '女', '9800', null);
INSERT INTO `emp` VALUES ('3', '露露', '普通员工', '2020-03-22 00:00:00', '22', '女', '2200', '40');
INSERT INTO `emp` VALUES ('5', '阿木木', '普通员工', '2017-11-22 00:00:00', '27', '男', '5000', '40');
INSERT INTO `emp` VALUES ('6', '阿德', '普通员工', '2018-08-05 00:00:00', '21', '男', '3160', '30');
INSERT INTO `emp` VALUES ('7', '艾希', '经理', '2015-03-03 00:00:00', '29', '女', '10500', '20');
INSERT INTO `emp` VALUES ('8', '易大师', '经理', '2016-09-10 00:00:00', '35', '男', '8900', '30');
INSERT INTO `emp` VALUES ('9', '甄姬', '普通员工', '2017-09-09 00:00:00', '27', '女', '9900', '20');
INSERT INTO `emp` VALUES ('10', '后裔', '普通员工', '2020-01-01 00:00:00', '30', '男', '8400', '20');
INSERT INTO `emp` VALUES ('11', '猪八戒', '普通员工', '2020-07-22 00:00:00', '45', '男', '3200', '20');
INSERT INTO `emp` VALUES ('12', '廉颇', '普通员工', '2018-07-06 00:00:00', '55', '男', '6800', '40');
INSERT INTO `emp` VALUES ('13', '李青', '普通员工', '2019-07-22 00:00:00', '36', '男', '6900', '50');
INSERT INTO `emp` VALUES ('14', '李白', '经理', '2016-01-01 00:00:00', '36', '男', '16600', '40');
INSERT INTO `emp` VALUES ('15', '赵信', '经理', '2018-09-11 00:00:00', '38', '男', '7500', '50');
INSERT INTO `emp` VALUES ('16', '安妮', '普通员工', '2019-10-11 00:00:00', '18', '女', '3900', '60');
INSERT INTO `emp` VALUES ('17', '提莫', '普通员工', '2019-10-12 00:00:00', '19', '男', '5600', '60');
INSERT INTO `emp` VALUES ('18', '韦鲁斯', '经理', '2018-05-10 00:00:00', '30', '男', '7800', '60');
INSERT INTO `emp` VALUES ('19', '德莱文', '普通员工', '2018-09-11 00:00:00', '35', '男', '9000', '50');
INSERT INTO `emp` VALUES ('20', '艾维利亚', '普通员工', '2017-06-30 00:00:00', '26', '女', '2200', '30');
INSERT INTO `emp` VALUES ('123', '黄国志', null, null, null, null, null, null);
DROP TRIGGER IF EXISTS `trg_emp_insert`;
DELIMITER ;;
CREATE TRIGGER `trg_emp_insert` AFTER INSERT ON `emp` FOR EACH ROW BEGINUPDATE tbemp set dno = 70 WHERE eno=22;
END
;;
DELIMITER ;
DROP TRIGGER IF EXISTS `trg_del`;
DELIMITER ;;
CREATE TRIGGER `trg_del` BEFORE DELETE ON `emp` FOR EACH ROW BEGININSERT into emp_off (eno,ename,job,hiredate,age,sex,sal,dno)SELECT * FROM emp where eno=old.eno;
end
;;
DELIMITER ;
  • 部门表
/*
Navicat MySQL Data TransferSource Server         : 隔壁老黄
Source Server Version : 50550
Source Host           : localhost:3306
Source Database       : mydb2Target Server Type    : MYSQL
Target Server Version : 50550
File Encoding         : 65001Date: 2020-08-02 14:56:03
*/SET FOREIGN_KEY_CHECKS=0;-- ----------------------------
-- Table structure for dept
-- ----------------------------
DROP TABLE IF EXISTS `dept`;
CREATE TABLE `dept` (`dno` int(11) NOT NULL COMMENT '部门编号',`dname` varchar(255) DEFAULT NULL COMMENT '部门名称',`tel` varchar(255) DEFAULT NULL COMMENT '电话号码',PRIMARY KEY (`dno`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT;-- ----------------------------
-- Records of dept
-- ----------------------------
INSERT INTO `dept` VALUES ('7', '事业 部', '10986');
INSERT INTO `dept` VALUES ('8', '事业 部', '10986');
INSERT INTO `dept` VALUES ('20', '研发部', '10012');
INSERT INTO `dept` VALUES ('30', '市场部', '10013');
INSERT INTO `dept` VALUES ('40', '行政部', '10014');
INSERT INTO `dept` VALUES ('50', '培训部', '10015');
INSERT INTO `dept` VALUES ('60', '商务部', '10016');
INSERT INTO `dept` VALUES ('70', '后勤部', '10017');
DROP TRIGGER IF EXISTS `trg_del_dept`;
DELIMITER ;;
CREATE TRIGGER `trg_del_dept` BEFORE DELETE ON `dept` FOR EACH ROW BEGINUPDATE emp set dno = null WHERE  dno = OLD.dno;
END
;;
DELIMITER ;
  • 现在进行多表联合查询:
/*多表联合查询1,等值连接:查询的条件数目至少等于表的数目减一2,内连接:根据连接条件,获取相交的部分,和等值连接结果一致3,左外连接:左连接,以左表为基准连接右表,不论左表中是否存在与右表关联的数据,左表中的数据始终完全显示4,右外连接:右连接,以右表为基准连接右表,不论右表中是否存在与左表关联的数据,右表中的数据始终完全显示
*/--显示所有员工和所在部门的信息--
--笛卡尔积   SELECT * FROM emp,dept;----1等值连接--SELECT * FROM emp,dept WHERE emp.dno=dept.dno;
SELECT * from emp e,dept d where e.dno = d.dno;--查询所有员工的工号,姓名,职位,月薪和所在部门名称--
SELECT e.eno,e.ename,e.job,e.sal,d.dname FROM emp e,dept d WHERE e.dno=d.dno;--在以上基础上显示员工的薪资等级--
SELECT e.eno,e.ename,e.job,e.sal,d.dname,s.level
FROM sallevel s,emp e,dept d
WHERE e.dno=d.dno and e.sal BETWEEN s.lowsal and s.hisal;--查询所有T8等级的员工来自哪个部门,显示部门名和员工姓名,薪资--
SELECT e.eno,e.ename,e.job,e.sal,d.dname,s.level
FROM sallevel s,emp e,dept d
WHERE e.dno=d.dno and e.sal BETWEEN s.lowsal and s.hisal
AND s.level='T8';
--2,内连接----显示所有员工的基本信息包含部门信息--
SELECT * FROM emp e INNER JOIN dept d on e.dno=d.dno;--3,左外连接(左连接)----要求查询出所有员工信息包括部门信息,同时要求显示不属于任何部门的员工--
SELECT * FROM emp e left JOIN dept d ON e.dno=d.dno;--4,右连接和左连接正好相反--
--要求查询出所有员工和部门的信息,要求显示没有员工的部门信息--
SELECT * FROM dept d LEFT JOIN emp e ON e.dno = d.dno;/*需求:--查询与猪八戒同一个部门的其他员工信息--*/--子查询(单行单列)--
SELECT * FROM emp  WHERE  dno=(SELECT dno FROM emp where ename='猪八戒');--自连接--
SELECT e2.* FROM emp e1,emp e2 WHERE e1.dno = e2.dno AND e1.ename='猪八戒';--内连接--
SELECT e2.* FROM emp e1 INNER JOIN emp e2 on e1.dno = e2.dno AND e1.ename='猪八戒';/*需求:--查询在研发部和行政部的所有员工--*/--子连接(多行单列)--
SELECT * FROM emp WHERE dno=(SELECT dno FROM dept WHERE dname='研发部') OR dno=(SELECT dno FROM dept WHERE dname='行政部');--子连接  (多行多列)--
SELECT * FROM emp e,
(SELECT dno,job FROM emp WHERE ename='猪八戒') t
WHERE e.dno = t.dno AND e.job = t.job;--查询行政部中比研发部中任何一个员工工资都高的员工信息--
SELECT e.* FROM emp e,dept d WHERE e.sal>
(SELECT max(e.sal),e.ename FROM emp e,dept d WHERE e.dno = d.dno and d.dname='研发部')
AND d.dname='行政部' AND e.dno = d.dno;
  • 其实要进行查询,最重要的就是哟啊明白这几点:

    • 1,明确要查询的目标
    • 2,要查询的目标来自于哪几个表
    • 3,根据目标确定查询条件

MySQL中的多表联合查询相关推荐

  1. mysql中多表联合查询语句_mysql中的多表联合查询语句是什么

    mysql中的多表联合查询语句是:[select 语句1 union [union 选项] select 语句2 union [union 选项] select 语句n].多表联合查询结果是将多个se ...

  2. Mysql中实现多表关联查询更新操作

    今天一下要记录一下才行了,每次都要去网上查找方法,每次都难找得要命 Mysql在更新某些字段的数据时,有时候会依据其他表的数据进行更新,需要通过关联后对不同的行更新不同的值,传统的update set ...

  3. MYSQL中只知表名查询属于哪个SCHEMA

    只知道表名XXX查该表属于哪个schema.以及该表有哪些列等信息 SELECT * from information_schema.columns WHERE table_name = 'xxx'; ...

  4. mysql的多表联合查询

    mysql的多表联合查询 文章目录 mysql的多表联合查询 创建环境 什么是多表联合查询 交叉连接(CROSS JOIN) 笛卡尔积 交叉连接 内连接 外连接 左连接 右连接 分组查询 GROUP ...

  5. MySQL 多表联合查询有何讲究?

    今天我们来聊聊微信中的多表联合查询,应该是小表驱动大表还是大表驱动小表? 1. in VS exists 在正式分析之前,我们先来看两个关键字 in 和 exists. 假设我现在有两张表:员工表和部 ...

  6. mybatis学习五-mybatis的多表联合查询

    1. 一对一的关系 首先先看数据库 tb_user tb_orders 执行这条sql: 也就是查询所有的订单, 并每一个订单都联系上用户数据, 并再一次附上订单的id 也就是说, 从后面看, 就是每 ...

  7. jeecgboot多表联合查询

    在数据大屏中需要多表联合查询的业务处理,而Jeecgboot提供的生成工具只能满足最普遍的简单代码,mybatis-plus框架使用的QueryWrapper显然无法满足多表联合查询,需要重写API接 ...

  8. 第四篇:Mysql查询-多表联合查询-及子查询

    mysql查询语句 多表联合查询 几子查询 1,单表查询:select * from 表名; eg:  select * from t1; 2,按条件查询: select 字段1,字段2,字段n... ...

  9. mysql多表查询分页面_mysql多表联合查询分点经验给大家

    你的位置: 问答吧 -> MySQL -> 问题详情 mysql多表联合查询分点经验给大家 我在工作中天天研究zen cart的程序,那个叫人痛苦,最近比较痛苦的是经常碰见mysql多表联 ...

最新文章

  1. eBook 功能模块二之设置模块
  2. linux下如何修改weblogic console登陆的用户名和密码
  3. amd cpu排行_【每日热点】长盈精密成功开发纽扣电池壳体组件;AMD处理器全球份额有望达到20%;英伟达承诺将ARM总部留在英国...
  4. 如何把js变量传递给html页面,如何将js变量从一个html文件传递给另一个?
  5. VueJS ajax综合案例
  6. 【剑指offer】面试题54:二叉搜索树的第k大节点(java)
  7. 面试必备:Spring 面试 63 问!
  8. Spring —— 容器内部逻辑
  9. 用html做qq会员页面导航,untitledQQ会员页面导航3.html
  10. Ripple_vJZ
  11. 网安入门须知:注释的危害居然这么大?——注释漏洞导致的信息泄露
  12. 遗传算法初学-旅行商问题
  13. PHP微信公众号开发常用功能
  14. python 提取代码中的所有汉字
  15. 域名解析信息易语言代码
  16. 一淘网是马云手中的防守牌
  17. 多种方法教你如何让手机免费上网
  18. 米兰理工计算机博士申请,意大利博士申请:米兰理工大学16个博士/博士后项目招生中~...
  19. python春节对客流量的影响_春节对经济的影响
  20. Linux_2022/7/19_Day1

热门文章

  1. 计算机病毒生命开始周期,计算机病毒的生命周期病毒防治 -电脑资料
  2. 爬取淘宝任意商品数据,你上你也行
  3. 应用示例荟萃 | performance_schema全方位介绍
  4. linux快速杀进程
  5. python-常用模块xml、shelve、configparser、hashlib
  6. 最详细最易理解的linux启动流程解读及相关问题,万字高能无废话
  7. 淘宝裹裹寄件快递员上门取件后怎么支付运费?
  8. 5G时代加速到来,边缘计算何时取代“核心”计算?
  9. 计算机英语第四版英汉对照,计算机英语常用词英汉对照
  10. 怎样从0开始搭建一个测试框架_10——数据生成器(全网最全)