首页 > 数据库 >MySQL关联查询

MySQL关联查询

时间:2024-05-31 17:55:21浏览次数:26  
标签:sal 查询 emp MySQL deptno 关联 where select

一、关联查询

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;

 

标签:sal,查询,emp,MySQL,deptno,关联,where,select
From: https://www.cnblogs.com/liftsail/p/18225032

相关文章

  • python selenium mysql -- 数据爬取2
    fromseleniumimportwebdriverfromselenium.webdriver.common.byimportBydriver=webdriver.Chrome()driver.get('https://www.00ksw.com/html/120/120704/')zj_list=[]#使用更健壮的XPath或CSS选择器links=driver.find_elements(By.XPATH,'/html/bo......
  • mysql 导出库里所有表结构到word文件的表格
    方案一:SELECTc.table_name表名,t.TABLE_COMMENT表备注,c.COLUMN_NAME参数名称,c.COLUMN_COMMENT参数含义,c.COLUMN_TYPE类型,casec.IS_NULLABLEwhen'NO'then'不允许'else'允许'endas允许为空,c.COLUMN_COMMENT备注FROMINFORMATION_SCHEMA.COLUMNScLEFT......
  • mongodb数据库查询调优之explain方法详解
    在MongoDB中,explain()方法可以帮助我们了解查询语句的执行计划和性能。通过分析explain()的结果,我们可以找出潜在的性能问题并对其进行优化。以下是使用explain()方法对MongoDB查询语句进行优化的步骤:使用explain()方法获取查询的执行计划:db.collection.find(query).exp......
  • mysql针对中文和数字字段进行排序
    场景1field函数的使用field(str,str1,str2,str3,str4…)字段str按照字符串1、字符串2、字符串3、字符串4的顺序返回查询到的结果集。如果表字段值str不存在,放在结果集的最前面subString如七年级1班,想要截取第一个字符,就是substring(user_name,1,1),第一个参数写字段,第二个参数......
  • 【MySQL】数据库优化
    一、优化数据类型在MySQL中不同的数据类型长度不同,在磁盘上所需要的存储空间也不同,如果数据库中使用不合理的数据类型,会造成很大的空间浪费,并且在数据插入与读取时,也会造成MySQL的性能低下。更小的数据类型更好如果没有特殊情况,尽量使用可以正确保存数据的最小数据类型,因为更......
  • pymysql 模块演练代码
    importpymysqlfrompymysql.cursorsimportDictCursorconn=pymysql.connect(host='localhost',user='root',password='123456',database='day1',port=3306,cursorclass=DictCursor,connect_timeout=3)cursor=conn.cur......
  • Pymysql
    Pymysql安装:pipinstallpymysql导入模块:importpymysql创建连接对象:conn=pymysql.connect(user=root,password='',host='localhost',database='',port=3306,charset='',cursorclass=DictCursor)#cursorclass不指定返回结果就是元组,Dictcu......
  • 校园周边美食探索及分享平台,基于 SpringBoot+Vue+MySQL 开发的前后端分离的校园周边美
    目录一.前言二.功能模块2.1. 前台首页功能模块2.2. 用户功能模块2.3. 管理员功能模块三.部分代码实现四.源码下载一.前言美食一直是与人们日常生活息息相关的产业。传统的电话订餐或者到店消费已经不能适应市场发展的需求。随着网络的迅速崛起,互联网日益成......
  • ocker compose 部署mysql主从。并优化参数。
    原理图:  一、先部署两个mysql可以跨机器也可以同一台  准备两个mysql.yml文件和my.cnf配置文件(yml文件我放一起可以自行拆开部署)version:'3.1'services:mysql:image:mysql:8restart:alwayscontainer_name:mysqlenvironment:MYS......
  • mysql中key 、primary key 、unique key 与index区别
    索引被用来快速找出在一个列上用一特定值的行。没有索引,MySQL不得不首先以第一条记录开始并然后读完整个表直到它找出相关的行。表越大,花费时间越多。如果表对于查询的列有一个索引,MySQL能快速到达一个位置去搜寻到数据文件的中间,没有必要考虑所有数据。如果一个表有1000行,这比......