原标题:《MySQL数据库》关联查询

一、关联查询

1、概念

在查询数据时,所需要的数据不只在一张表中,可能在两张或多张表中。这个时候,需要同时操作这些表来查询数据,即关联查询。

关联查询所涉及到的表与表之间都会存在有关联的字段,如员工表的部门编号和部门表的部门编号。

2、笛卡尔积

在做关联查询时,数据库会使用某一张表中的每一条记录都与另外一张表的所有记录进行组合。比如表A有x条记录,表B有y条记录,最终组合数为x*y,这个值就是笛卡尔积,通常没有意义。

3、等值连接

在做关联查询时,这些表中存在着有关联的两个字段。我们使用某一张表中的一条记录通过相关联的字段与另外一张表的记录进行匹配,组合成一条新的记录。使用"="连接关联字段

需求1:查询员工的姓名,职位及其所在部门的名称 、地址

4、内连接

内连接返回所有满足条件的记录,关键字join on。查询效果与等值连接一样。用法:表A [inner] join 表B on 关联条件

5、外连接

在做关联查询时,我们所需要的数据,除了那些满足关联条件的数据外,还有不满足关联条件的数据。此时需要使用外连接。

会涉及到两个概念:

驱动表(主表):除了显示满足条件的数据,还需要显示不满足条件的数据的表

从表(副表):只显示满足关联条件的数据的表

mysql外连接只支持左外连接,右外连接,不支持全外连接

左外连接:

表A left [outer] join 表B on 关联条件。

表A是驱动表,表B是从表

右外连接

表A right [outer] join 表B on 关联条件

表B是驱动表,表A是从表

全外连接:

两张表的数据不管满不满足条件,都做显示。

表A full [outer] join 表B on 关联条件

PS:mysql 不支持全外连接

需求1:查询所有员工的姓名,职位,及其部门编号,部门名称----分析:员工表为驱动表,部门表为从表

select e.ename,e.job,e.deptno,d.dname from emp e left join dept d on e.deptno = d.deptno;

6、自连接

自连接是一种特殊的关联查询。数据的来源是同一个表,这样的表内的多个字段要存有关系。我们要使用表别名来虚拟出两个表。

需求1:查询员工姓名,职位及其上司姓名,职位。

mysql > select a.ename 员工姓名,

a.job 员工职位,

b.ename 上司姓名,

b.job 上司职位

from emp a join emp b on a.mgr=b.empno;

分析:可以看出 a的mgr与b的empno关联,所以,a是员工表,b是领导表

二、高级关联查询

有的时候,我们要查询的数据,一个简单的查询语句完成不了,并且我们使用的数据,表中不能直观体现出来。而是预先经过一次查询才会有所体现。那么先执行的查询,我们称之子查询。被子查询嵌入的查询语句称之为父查询或主查询。

主查询可以是select语句,也可以是DML语句或者是DDL语句。

根据子查询返回结果的不同,可以分为单行单列子查询、多行单列子查询、多行多列子查询。

子查询所在的位置,有可能出现在以下地方:

1)子查询可以在where子句中

2)子查询可以在from子句中

3)子查询可以在having子句中

4)子查询可以在select字句中,相当于外连接的另外一种写法。

1、在where子句中

需求1:查询和员工姓名scott同职位的员工信息。

select ename,job,hiredate,sal,deptno from emp where job=(select job from emp where ename='scott');

需求2:查询薪水比所有员工的平均薪水高的员工信息

mysql > select ename,job,hiredate,sal from emp where sal > (select avg(ifnull(sal,0)) from emp);

需求3:查询出部门中有salesman但是职位不是salesman的员工信息

select ename,job,hiredate,sal,deptno from emp where deptno in (select distinct deptno from emp where job='salesman') and job <> 'salesman';

exists 关键字

有时候,子查询需要引用主查询的字段数据,我们使用exists关键字。exists后面的子查询至少返回一条记录,则整个条件为true;

需求:查询有员工的部门信息

mysql > select deptno,dname,loc from dept d where exists (select * from emp e where d.deptno =e.deptno);

2、在from子句中

from子句用于指定表,如果想在一个子查询的结果里继续查询,则子查询需要写在from子句中,相当于一个表。

需求1:查询工资大于本部门平均工资的员工的信息。

mysql > select e.ename,e.sal,t.avg_sal,t.deptno from emp e join (select deptno,avg(ifnull(sal,0)) 'avg_sal' from emp group by deptno) t on e.deptno = t.deptno and e.sal>t.avg_sal order by t.deptno;

需求2:查询每个员工的工资,姓名和其部门的平均工资。

select e.ename, e.sal, t.avg_sal from emp e , (select deptno,avg(ifnull(sal,0)) 'avg_sal' from emp group by deptno) t where e.deptno = t.deptno order by t.deptno;

3、在having子句中

需求:查询平均工资大于30号部门平均工资的部门号、平均工资

mysql > select deptno,avg(ifnull(sal,0)) from emp group by deptno having avg(ifnull(sal,0))>(select avg(ifnull(sal,0)) from emp where deptno=30);

4、在select子句中

需求1:查询每个员工的姓名,工资,及其部门的平均工资,工资之和

select ename,sal,

(select avg(ifnull(sal,0)) from emp a where a.deptno=b.deptno) avg_sal ,

(select sum(sal) from emp c where c.deptno=b.deptno ) sum_sal

from emp b order by b.deptno;返回搜狐,查看更多

责任编辑:

关联查询mysql_《MySQL数据库》关联查询相关推荐

  1. 小白 MySQL数据库链接查询语句_MySQL数据库——连接查询

    今天将用 "手" 来教大家关于MySQL连接查询的知识! ============================================================= ...

  2. java查询mysql装载bean_jsp与javabean链接mysql数据库并查询数据表的简单实例源码

    jsp与javabean链接mysql数据库并查询数据表的简单实例源码.这个简单的实例是给新手学习的,或者一些高手临时忘记怎么使用jsp操作mysql数据库时候查找的,包括了建立mysql数据库连接的 ...

  3. php 查看mysql连接数据库_php基础之连接mysql数据库和查询数据

    php基础之连接mysql数据库和查询数据 文章主要介绍了php连接mysql数据库和查询数据的方法和示例,需要的朋友可以参考下,就跟随百分网小编一起去了解下吧,想了解更多相关信息请持续关注我们应届毕 ...

  4. 查询 oracle_关于oracle和mysql数据库的查询问题

    近期在写mysql数据库报表时,需要给查询排序后的数据增加一列序号,用来统计查询数据的排名,在这里遇到一个视图和排序冲突的问题. Part 1 在oracle数据库中可以直接给查询语句增加一列ROWN ...

  5. 宋体查询1.mysql数据库复习加强 2.mysql事务触发器 3.mysql 索引外键加强 4.zendstudio 的安装使用 5.svn版本控制器的使用-java教程...

    上班之余抽点间时出来写写博文,希望对新接触的朋友有帮助.今天在这里和大家起一学习一下宋体查询 1.mysql数据库温习增强 1,导出mysql数据库里ecshop到d盘 mysqldump 指令和 m ...

  6. mysql 数据库里查询语句中不等于的两种写法

    mysql 数据库里查询语句中不等于的两种写法 ps:本人亲测,阿里云2核4G5M的服务器性价比很高,新用户一块多一天,老用户三块多一天,最高可以买三年,感兴趣的可以戳一下:阿里云折扣服务器 1.my ...

  7. Mysql数据库分页查询及优化

    最近遇到个数据库分页查询问题,mysql数据库分页查询默认是升序查询,就是第一页查询的是最先插入的数据,最后一页才是最新插入的数据,弄了个小的数据库表单,记录下我的操作过程,还有优化查询速度的方法. ...

  8. MySQL数据库select查询命令大全

    MySQL数据库select查询命令大全 --数据库操作前的准备 -- 创建数据库 -- create database python_test_1 charset=utf8; -- 使用数据库 -- ...

  9. mysql数据库查询游戏_MySQL数据库高级查询和多表查询

    MySQL多表查询 添加练习表 -- 用户表(user) CREATE TABLE `user`( `id` INT AUTO_INCREMENT PRIMARY KEY COMMENT '用户id( ...

  10. Mysql数据库常用查询方法及演示(where条件查询、分页、排序等)

    Mysql数据库常用查询方法及演示 where条件查询的介绍 使用where条件查询可以对表中的数据进行筛选,条件成立的记录会出现在结果集中. where语句支持的运算符: 比较运算符 逻辑运算符 模 ...

最新文章

  1. java控制台next_java读取控制台输入以及next() ,nextLine(), nextInt() 和nextDouble()的比较...
  2. 《卫生信息基本数据集编制规范》等23项行业标准的通告
  3. PS2019进阶笔记(二)
  4. php按照文件名字排序,php readdir 排序问题,如何按照日期进行排序
  5. LeetCode 1169. 查询无效交易
  6. [Python]网络爬虫(六):一个简单的百度贴吧的小爬虫
  7. 不分享“年度报告”的人,多少有点难言之隐
  8. 自从用了Less 编写css,你比以前更快了~
  9. 【信息系统项目管理师】第10章 上篇-项目沟通管理 知识点详细整理
  10. RAR Extractor Max for Mac(解压缩软件)
  11. matlab2010b数值分析,matlab2010b教程
  12. cydia无法加载未能连接服务器,cydia无法加载_Cydia无法加载如何办?Cydia加载失败故障的解决方...
  13. EDA与VHDL题目——38译码器
  14. windows 7 桌面图标变白板的问题解决方法
  15. ArcGIS 制作3D遥感影像图
  16. 一元多项式加减法的C++实现
  17. 滤波算法、中值和均值滤波区别
  18. Unity 背景图片自适应Text长度
  19. Matlab中FFT运算加窗函数的验证
  20. 华硕B250M+I5-7500黑苹果EFI引导文件

热门文章

  1. Mongo数据库搭建
  2. Android检测是否有悬浮窗,Android 获取判断是否有悬浮窗权限的方法
  3. Shell else if mysql_Shell if else语句(详解版)
  4. java项目遇到的问题_java系列:项目中遇到的一些问题(持续更新中)
  5. 浏览器各个属性的作用
  6. CSS属性之attr()
  7. vagrant网站中box下载方法
  8. 辗转相除法求最大公约数(c++)
  9. spring boot高性能实现二维码扫码登录(上)——单服务器版
  10. C#调用Power Shell 管理Office365 执行脚本时遇到的问题