1 .连表查询

为什么需要连表查询?

1.如果查询得结果在一张表中无法获取,需要关联多张表,那么这时就需要连表查询。

2.连表查询大多数都作用在外键得基础上。--- 表与表之间有关联。

1.1 表与表之间存在得关系

  1. 一对多: 在多得一方添加外键列

  2. 多对多: 需要在创建一个中间表,该表中至少有两个外键列。

1.3 内连接:

连接演示---结果都是一样,只是语法不同。看个人习惯用哪个?
1.查询每一个员工的姓名,及关联的部门的名称〔隐式内连接实现)

2.查询每一个员工的姓名,及关联的部门的名称〔显式内连接实现)

DROP TABLE IF EXISTS `tb_emp`;
CREATE TABLE `tb_emp`  (`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '员工编号',`name` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '员工姓名',`age` int(11) NULL DEFAULT NULL COMMENT '员工年龄',`job` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '岗位',`salary` int(11) NULL DEFAULT NULL COMMENT '薪水',`entrydate` date NULL DEFAULT NULL COMMENT '员工入职时间',`managerid` int(11) NULL DEFAULT NULL COMMENT '员工领导编号',`dept_id` int(11) NULL DEFAULT NULL COMMENT '员工所在部门编号',PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 18 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;INSERT INTO `tb_emp` VALUES (1, '金庸', 66, '总裁', 20000, '2000-01-01', NULL, 5);
INSERT INTO `tb_emp` VALUES (2, '张无忌', 20, '项目经理', 12500, '2005-12-01', 1, 1);
INSERT INTO `tb_emp` VALUES (3, '杨逍', 33, '开发', 8400, '2000-11-03', 2, 1);
INSERT INTO `tb_emp` VALUES (4, '韦一笑', 48, '开发', 11000, '2002-03-05', 2, 1);
INSERT INTO `tb_emp` VALUES (5, '常豫川', 43, '开发', 10500, '2004-09-01', 2, 1);
INSERT INTO `tb_emp` VALUES (6, '小昭', 19, '程序员鼓励师', 6600, '2004-10-12', 2, 1);
INSERT INTO `tb_emp` VALUES (7, '灭绝', 60, '财务总监', 8500, '2002-09-12', 1, 3);
INSERT INTO `tb_emp` VALUES (8, '周芷若', 60, '会计', 48000, '2006-06-01', 7, 3);
INSERT INTO `tb_emp` VALUES (9, '丁敏君', 19, '出纳', 4000, '2009-06-01', 7, 3);
INSERT INTO `tb_emp` VALUES (10, '赵敏', 23, '市场总监', 14000, '2009-06-01', 1, 2);
INSERT INTO `tb_emp` VALUES (11, '鹿仗客', 56, '职员', 3750, '2009-06-01', 10, 2);
INSERT INTO `tb_emp` VALUES (12, '鹤比翁', 19, '职员', 3750, '2009-06-01', 10, 2);
INSERT INTO `tb_emp` VALUES (13, '方东白', 19, '职员', 3750, '2009-06-01', 10, 2);
INSERT INTO `tb_emp` VALUES (14, '张三丰', 88, '销售总监', 14000, '2004-06-01', 1, 4);
INSERT INTO `tb_emp` VALUES (15, '玉莲舟', 38, '销售', 4600, '2009-06-01', 14, 4);
INSERT INTO `tb_emp` VALUES (16, '宋远桥', 40, '销售', 4600, '2009-06-01', 14, 4);
INSERT INTO `tb_emp` VALUES (17, '陈友谅', 42, NULL, 2000, '2022-04-25', 1, NULL);
DROP TABLE IF EXISTS `tb_dept`;
CREATE TABLE `tb_dept`  (`id` int(11) NOT NULL AUTO_INCREMENT,`name` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 6 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;-- ----------------------------
-- Records of tb_dept
-- ----------------------------
INSERT INTO `tb_dept` VALUES (1, '研发部');
INSERT INTO `tb_dept` VALUES (2, '市场部');
INSERT INTO `tb_dept` VALUES (3, '财务部');
INSERT INTO `tb_dept` VALUES (4, '销售部');
INSERT INTO `tb_dept` VALUES (5, '总经办');SET FOREIGN_KEY_CHECKS = 1;-- 隐式查询 select 列名.... from 表1,表2 where 连表得条件。
-- 连表查询时,如果不使用连表条件则出现笛卡尔集。
-- 所谓笛卡尔集 就是A表中每一条记录关联B中中得每条记录
1.查询每一个员工的姓名,及关联的部门的名称〔隐式内连接实现)
select * from tb_emp,tb_dept where tb_emp.dept_id=tb_dept.id;-- 如果表的名字很长 可以为表起别名
select * from tb_emp e, tb_dept d where e.dept_id=d.id;-- 显示连接: A表 inner join B表 on 连表条件。
2.查询每一个员工的姓名,及关联的部门的名称〔显式内连接实现)
select * from tb_emp  inner join tb_dept on tb_emp.dept_id=tb_dept.id;
select * from tb_emp e inner join tb_dept d on e.dept_id=d.id;-- 上面的 inner可以省略。
select * from tb_emp e  join tb_dept d on e.dept_id=d.id;

1.4 外连接

外连接演示
--1.查询emp表的所有数据, 和对应的部门信息(左外连接)

--2.查询dept表的所有数据,和对应的员工信息(右外连接)

-- 语法: select 查询列集 from A表 left join B表 on 连表条件
-- 1.查询emp表的所有数据, 和对应的部门信息(左外连接)
select * from tb_emp e left outer join tb_dept d on e.dept_id = d.id;
select * from tb_emp e left join tb_dept d on e.dept_id=d.id;-- 2.查询dept表的所有数据,和对应的员工信息(右外连接)
select * from tb_emp e right join tb_dept d on e.dept_id=d.id;

1.5 自联查询

自己和自己相连接查询。
select * from A表 join A表 on 连表条件。

-- 1.查询员工及其所属领导的名字。你要查询的结果再一张表中,但是还不能使用单表查询得到结果。
select a.name,b.name from tb_emp a join tb_emp b on a.managerid=b.id;-- 2.查询所有员工 emp及其领导的名字emp ,如果员工没有领导,也需要查询出来
select a.name,b.name from tb_emp a left join tb_emp b on a.managerid=b.id;

2. 子查询---嵌套查询

一个查询的结果 作为另一个查询的条件 或者 临时表。
-- 查询市场部的员工信息-----
-- 子查询返回的结果一列一条记录。 这个时候可以用=
select * from tb_emp where dept_id=(select id from tb_dept where name='市场部')-- 查询市场部和研发部员工的信息。in -- -- 查询市场部和研发部员工的信息。-- a) 查询市场部和研发部的编号select id from tb_dept where name in('市场部','研发部')-- b) 再员工表中根据部门编号查询员工信息select * from tb_emp where dept_id in (select id from tb_dept where name in('市场部','研发部'))-- 查询在“方东白”入职之后的员工信息
select * from tb_emp where entrydate>(select entrydate from tb_emp where name='方东白')-- -- 查询比财务部所有人工资都高的员工信息。a)求出财务部中最高的工资。select max(salary) from tb_emp e join tb_dept d on e.dept_id=d.id where d.name='财务部'b) 根据财务部最高工资查询其他员工信息select * from tb_emp where salary>( select max(salary) from tb_emp e join tb_dept d on e.dept_id=d.id where d.name='财务部')

3. 组合查询

多个查询的结果 组合到一起。
sql union sql --->把这两条sql查询的结果组合到一起。如果有重复记录则合并成一条。
sql union all sql--->把这两条sql查询的结果组合到一起。如果有重复记录,不合并。 注意: 这两条sql返回的字段必须一样。select name from tb_emp where salary>8000UNION select * from tb_emp where age>40;

mysql( 连表查询 子查询 联合查询)相关推荐

  1. Mysql的查询语句(联合查询、连接查询、子查询等)

    Mysql的各个查询语句(联合查询.连接查询.子查询等) 一.联合查询 关键字:union 语法形式 select语句1 union[union选项] select 语句2 union[union选项 ...

  2. Mysql进阶学习(七)联合查询与DML语言

    Mysql进阶学习(七)联合查询与DML语言 进阶9:联合查询 语法: 特点:★ 案例 DML语言 1.插入语句(insert) 方式一:经典的插入 1.1.插入的值的类型要与列的类型一致或兼容 1. ...

  3. MySQL 基础 -- 多表关系(一对一、1对多(多对一)、多对多)、多表查询(内连接、外连接、自连接、子查询(嵌套查询)、联合查询 union)、笛卡儿积

    文章目录 1. 多表关系 1.1 一对多 1.2 多对多 1.3 一对一 2. 多表查询 2.1 数据准备 2.2 概述 2.3 笛卡尔积 2.4 多表查询分类 3. 内连接 3.1 示例1:查询每一 ...

  4. mysql 事务关联_MySQL 关联、联合查询,事务ACID见解

    MySQL 关联.联合查询,事务ACID见解 1.关联查询分为几种情况: 1.1.内连接: 1.1.1.INNER JOIN INNER JOIN 产生的结果是两个表的交集 1.1.2.CROSS J ...

  5. mysql select符合查询_MySQL SELECT 联合查询

    这里主要分享一下联合查询的用法. MySQL使用UNION和UNION ALL实现数据的联合查询. 假设有以下两个表: mysql>select * from staff; +----+---- ...

  6. mysql 种子表_mysql之3种子查询

    mysql有3种子查询,包括,where型,from型和exists型. where型子查询 where后面跟的是条件表达式,条件为真时便取出该行,where型子查询是指内层的select语句的查询结 ...

  7. mysql左联和右联_MySQL联合查询语法内联、左联、右联、全联

    MySQL联合查询效率较高,以下例子来说明联合查询(内联.左联.右联.全联)的好处: T1表结构(用户名,密码) userid(int)   usernamevarchar(20)   passwor ...

  8. mysql 左联 右联一块_MySQL联合查询语法(内联、左联、右联、全联)

    MySQL联合查询效率较高,以下例子来说明联合查询(内联.左联.右联.全联)的好处: T1表结构(用户名,密码)   userid(int)   usernamevarchar(20)   passw ...

  9. mysql查询学生表的总人数,MySQL(表)-实操数据查询

    MySQL(表)-实操数据查询 MySQL(表)-实操:数据查询 练习1:成绩表筛选 创建成绩表(exam): CREATE TABLE exam( id INT PRIMARY KEY AUTO_I ...

  10. 微服务跨数据库联合查询_MySQL数据库联合查询

    大家好,我是anyux.数据库联表查询很重要,内联查询更是尤为重要. 需要将school.sql文件导入到数据库中 数据库多表联合查询,school库下表的逻辑结构关系都在下图中.可以通过驱动表加子表 ...

最新文章

  1. 隐藏Nginx版本号的安全性与方法
  2. python学习点滴记录-Day10-线程
  3. linux按内容查找文件
  4. Xcode 8 插件安装
  5. mybatis之trim prefix= suffix= suffixOverrides= prefixOverrides=/trim
  6. mysql客户端安装错误_windows下mysql 5.7以上版本安装及遇到的问题
  7. 工作31:传参对接口
  8. 反转单向链表(JAVA)
  9. 邮件协议POP3/IMAP/SMTP服务的区别
  10. vue 第八天 小结 作业模拟购物车
  11. 在电脑上修改apk、重新签名apk
  12. NYOJ 144 小柯的烦恼
  13. 应届毕业生怎么快速找到高薪工作?
  14. 打印机墨水添加方法(二)
  15. 李德毅院士:大数据认知
  16. python词云去除词_Python生成歌词词云
  17. 开源流媒体解决方案,流媒体服务器,推拉流,直播平台,SRS,WebRTC,移动端流媒体,网络会议,优秀博客资源等分享
  18. OPPO出货量超越苹果跻身全球第四,直逼小米
  19. python爬虫脚本获取网易招聘某个职业的全部数据信息
  20. android adb命令唤醒屏幕,Android adb命令点亮屏幕说明

热门文章

  1. C++网络摄像头数据的获取与显示
  2. 黑马day06_regex collection-app
  3. 巧解图像处理经典难题之图像配准
  4. 新形势下中国金融科技的数字化运营
  5. 微信公众号H5页面中获取openId
  6. java利用POI替换word文档中的标签
  7. Cause: java.sql.SQLException: Zero date value prohibited
  8. 中文语音合成,文本到语音的转换类库。只支持中文发音。识别数字发音。不支持多音字的识别。
  9. mg动画制作软件分享,让你惊喜满满! | 万彩动画大师
  10. 有关zookpeer华为云kerberos认证