iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >MySQL基础篇 | 连接查询、子查询(嵌套)
  • 478
分享到

MySQL基础篇 | 连接查询、子查询(嵌套)

数据库sql 2023-10-23 05:10:25 478人浏览 泡泡鱼
摘要

✅作者简介:大家好我是@每天都要敲代码,希望一起努力,一起进步! 📃个人主页:@每天都要敲代码的个人主页 🔥系列专栏:MySQL专栏 目录 一:连接查询 1. 连接查询原理以及笛卡尔积现象 2. 内连接

✅作者简介:大家好我是@每天都要敲代码,希望一起努力,一起进步!
📃个人主页:@每天都要敲代码的个人主页
🔥系列专栏:MySQL专栏

目录

一:连接查询

1. 连接查询原理以及笛卡尔积现象

2. 内连接

2.1 等值连接

2.2 非等值连接

2.3 自连接

3. 外连接(左外和右外)

二:子查询

1. where后面嵌套子查询

2. from后面嵌套子查询(重要)

3. select后面嵌套子查询


一:连接查询

连接查询:也可以叫跨表查询,需要关联多个表进行查询!

(1)根据语法出现的年代来划分的话,包括:
sql92(一些DBA可能还在使用这种语法。DBA:DataBase Administrator,数据库管理员)
SQL99(比较新的语法)
(2)根据表的连接方式来划分,包括:
内连接:
     等值连接
     非等值连接

     自连接
外连接:
     左外连接(左连接)
     右外连接(右连接)

全连接(很少用)

1. 连接查询原理以及笛卡尔积现象

笛卡尔积现象当两张表(m,n)进行连接查询的时候,没有任何条件进行限制,最终的查询结果条数是两张表(m,n)记录条数的乘积:m*n

例1:显示每个员工姓名,并显示所属的部门名称

第一步:先找出员工名,EMP表

select ename,deptno from emp;

第二步:找出部门名,DEPT表

select * from dept;

​第三步: 结合使用,实际上会有:14 * 4 = 56条数据;每一个EMP中的数据都会与DEPT中的数据结合一次

select ename,dname from emp,dept; --56条数据,笛卡尔现象

第四步:进行过滤,只有EMP的deptno 和 DEPT的deptno相等时,才进行拼接结合

怎么避免笛卡尔积现象?加条件进行过滤;但是不会减少记录的匹配次数,次数还是56次;只不过显示的是有效记录

select emp.ename, dept.dname from emp, dept where emp.deptno=dept.deptno;select e.ename, d.dname from emp e, dept d where e.deptno=d.deptno; --使用别名--表的别名有什么好处?--第一:执行效率高。--第二:可读性好。-- 以上是SQL92语法,老语法

2. 内连接

①如果查询语句中出现了多个表中都存在的字段,则必须指明字段所在的表!

②如果给表起了别名,一旦在select或where等中使用别名的话,则必须使用表的别名,而不能使用表的原名!究其原因还是SQL语句的执行顺序,先执行的是from并且是在from时取得别名,那么此时别名会把原来的表名给覆盖,所以后面的语句只能使用别名!

③如果有N个表实现多表的查询,则需要至少N-1个连接条件!

2.1 等值连接

最大特点是:条件是等量关系!

例1:还是那个例子,显示每个员工信息,并显示所属的部门名称;

使用SQL92和SQL99两种语法写出来!

SQL92:

SQL92语法的where不是真正用到过滤条件,要想加过滤条件,只能在后面用and加入过滤条件!

select     e.ename,d.dname from     emp e,dept d where     e.deptno = d.deptno; ---等值连接

SQL99: 

join.....on 连接条件;后面还可以继续跟where,where后面才是真正的过滤条件;

SQL99语法结构更清晰一些:表的连接条件和后来的where条件分离了;inner可以省略的,带着inner目的是可读性好一些,表示内连接!

select     e.ename,d.dname from     emp e join -- inner join 这里省略了inner    dept d on     e.deptno = d.deptno; ---等值连接

2.2 非等值连接

最大的特点是:连接条件中的关系是非等量关系!

例1:找出每个员工的工资等级,要求显示员工名、工资、工资等级

第一步:先找出每个员工的员工名和工资

select ename,sal from emp;

​第二步:再找出员工工资等级

select * from salgrade;

​第三步:根据emp sal的取值范围,在salgrade losal 和 hisal 范围之间进行关系建立

select e.ename,e.sal,s.gradefromemp einner joinsalgrade sone.sal between s.losal and s.hisal;

2.3 自连接

最大的特点是:一张表看做两张表;自己连接自己!

例1:找出每个员工的上级领导,要求显示员工名和对应的领导名

解析:员工和上级领导在同一张表中,因为领导也是员工!

查看表中所有信息

select * from emp;

这张表既可以看成员工表,又可以看成领导表 ;我们只需要让:

员工的领导编号 = 领导的员工编号

select a.ename as '员工名',b.ename as '领导名'fromemp ainner join --inner可省略emp bona.mgr = b.empno; --员工的领导编号 = 领导的员工编号

注:只有13条数据,因为king虽然也是员工,但是他没有上级领导!

3. 外连接(左外和右外)

(1)什么是外连接,和内连接有什么区别?

内连接:假设A和B表进行连接,使用内连接的话,凡是A表和B表能够匹配上的记录查询出来,这就是内连接AB两张表没有主副之分,两张表是平等的。

外连接:假设A和B表进行连接,使用外连接的话,AB两张表中有一张表是主表一张表是副表,主要查询主表中的数据,捎带着查询副表,当副表中的数据没有和主表中的数据匹配上,副表自动模拟出NULL与之匹配。
(2)外连接的分类
左外连接(左连接):表示左边的这张表是主表。
右外连接(右连接)表示右边的这张表是主表。

左连接有右连接的写法,右连接也会有对应的左连接的写法。

(3)外连接最重要的特点是:主表的数据无条件的全部查询出来!

(1)找出每个员工的上级领导?(所有员工必须全部查询出来包括King)

注:我们在使用“内连接---等值查询”时,没有显示king的信息,因为他的上级是NULL,匹配不上所以没有显示,只显示了13条信息;那么我们如果使用外连接,会显示14条信息!

使用左外连接: 

select a.ename '员工', b.ename '领导'fromemp aleft outer join -- 左外链接,outer可以省略emp bona.mgr = b.empno;

 使用右外连接:

select a.ename '员工', b.ename '领导'fromemp bright outer join -- 右外链接,outer可以省略emp aona.mgr = b.empno;

(2)找出哪个部门没有员工?

第一步:找员工表EMP

第二步:找部门表 DEPT

第三步:从两张表中可以看出部门编号为40的没有员工,那么怎么显示出来呢?

select e.*,d.*from emp eright join dept don e.deptno = d.deptno;

我们发现14个员工,却有15条数据,因为我们是以dept表为主表查询的,没有员工的会自动匹配为NULL;所以我们只需要最后一条数据,利用where进行进一步的筛选

 select d.*,e.ename  from emp e right join dept d --采用右连接,dept是主表 on e.deptno = d.deptno where e.ename is null; -- 进一步筛选信息

 (3)找出每一个员工的部门名称以及工资等级(三张表连接查询)

第一步:拿到员工信息

select empno,ename,deptno,sal from emp;

第二步:拿到部门信息

select * from dept;

第三步:拿到等级信息

select * from salgrade;

第四步:先通过deptno让员工表EMP和部门表DEPT连接(两张表)

select e.ename,d.dname from emp ejoin dept don e.deptno = d.deptno;

第五步:在通过薪资sal与等级表建立联系(三张表)

select e.ename,d.dname,s.grade from emp ejoin dept don e.deptno = d.deptnojoin salgrade son e.sal between s.losal and s.hisal;-- 两个内连接

(4)找出每一个员工的部门名称、工资等级、以及上级领导

注:这就需要外连接了,因为king虽然没有上级领导,但是有部门名称、工资等级,必须显示出来!

select e.ename '员工',d.dname,s.grade,e1.ename '领导' from emp ejoin dept don e.deptno = d.deptnojoin salgrade son e.sal between s.losal and s.hisalleft join emp e1 --表示e1与e是左连接(这里实际上是增加了一个自连接)on e.mgr = e1.empno; --员工的领导编号 = 领导的员工编号-- 不使用外连接left,实际上带有null的信息就会不显示,只有13条数据

二:子查询

什么是子查询?select语句当中嵌套select语句,被嵌套的select语句是子查询。
子查询可以出现在哪里?出现在selelct后面、from后面、where后面。

子查询就是嵌套的select语句,可以理解为子查询是一张表

select   ..(select) --出现在selelct后面from   ..(select) --出现在from后面where   ..(select) --出现在where后面

1. where后面嵌套子查询

一般查询的结果都是可以直接使用的,不需要表连接等操作;例如:直接数据比大小!

(1)找出高于平均薪资的员工信息

注:select * from emp where sal > avg(sal); 错误的写法,where后面不能直接使用分组函数。

第一步:找出平均薪资

select avg(sal) from emp;

第二步:where过滤

select * from emp where sal > 2073.214286;

第三步:联合嵌套使用

select ename,sal from emp where sal > (select avg(sal) from emp);

 (2)查询员工信息,查询哪些人是管理者?要求显示出其员工编号和员工姓名

 第一步:首先取得管理者的编号,去除重复的;并且排查出NULL

select distinct mgr from emp where mgr is not null;--提出重复的,并且让显示出其员工编号和员工姓名,肯定要排查出NULL

第二步: 查询员工编号包含管理者编号的

 select empno,ename from emp where empno in (select distinct mgr from emp where mgr is not null);-- 子查询中,先找到mgr的编号,再根据员工编号包含mgr的编号,是就代表是管理者

2. from后面嵌套子查询(重要)

一般都是把查询的结果作为一张临时表处理,有表连接等操作!

(1)找出每个部门平均薪水的等级

第一步:找出每个部门平均薪水(按照部门分组,求sal的平均值)

select deptno,avg(sal) as avgsal from emp group by deptno;

第二步:将以上的查询结果当做临时表t,让t表和salgrade s表连接,条件是:t.avgsal between s.losal and s.hisal

select t.*,s.grade from (select deptno,avg(sal) as avgsal from emp group by deptno) t --上一个运行的结果看成一个表,起别名tjoin salgrade son t.avgsal between s.losal and s.hisal;

(2)找出每个部门平均的薪水等级

注:这道题与上面有所不同,我们第一步查询的数据都是原数据,并没有新数据,我们不需要临时表,直接拿来用就行!

第一步:先找出每个部门的薪水对应的等级

select e.ename,e.sal,e.deptno,s.gradefrom emp ejoin salgrade son e.sal between s.losal and s.hisal;

 第二步:基于以上结果,继续按照deptno分组,求grade字段平均值

select e.deptno,avg(s.grade)from emp ejoin salgrade son e.sal between s.losal and s.hisalgroup by e.deptno;

3. select后面嵌套子查询

(1)找出每个员工所在的部门名称,要求显示员工名和部门名

第一种方法:使用连接

select e.ename,d.dnamefrom emp ejoin dept don e.deptno = d.deptno;

 第二种方法:使用select嵌套

select e.ename,(select d.dname from dept d where e.deptno = d.deptno) as dname from emp e;

来源地址:https://blog.csdn.net/m0_61933976/article/details/126288297

您可能感兴趣的文档:

--结束END--

本文标题: MySQL基础篇 | 连接查询、子查询(嵌套)

本文链接: https://www.lsjlt.com/news/440146.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • MySQL基础篇 | 连接查询、子查询(嵌套)
    ✅作者简介:大家好我是@每天都要敲代码,希望一起努力,一起进步! 📃个人主页:@每天都要敲代码的个人主页 🔥系列专栏:MySQL专栏 目录 一:连接查询 1. 连接查询原理以及笛卡尔积现象 2. 内连接...
    99+
    2023-10-23
    数据库 sql
  • MySQL子查询(嵌套查询)
    子查询指一个查询语句嵌套在另一个查询语句内部的查询,这个特性从 MySQL 4.1 开始引入。 在SELECT 子句中先计算子查询,子查询结果作为外层另一个查询的过滤条件,查询可以基于一 个表或者多个表。子查询中常用的操作符有 AN...
    99+
    2023-09-04
    mysql 数据库 sql Powered by 金山文档
  • MySQL基础-子查询
    文章目录 MySQL基础-子查询一、子查询概念1、什么是子查询2、子查询的分类 二、单行子查询1、单行比较操作符2、基本子查询3、HAVING 子查询4、CASE中的子查询5、子查询其他问题 三、多行子查询1、多...
    99+
    2023-12-22
    mysql 数据库 sql
  • MySQL嵌套查询实现子查询的方法
    目录一个查询语句嵌套在另一个查询语句内部的查询1.带ANY(SOME)关键字的子查询2.带ALL关键字的子查询3.带EXISTS关键字的子查询4.带IN关键字的子查询5.带比较运算符...
    99+
    2022-11-13
  • 详解MySQL子查询(嵌套查询)、联结表、组合查询
    一、子查询 MySQL 4.1版本及以上支持子查询 子查询:嵌套在其他查询中的查询。 子查询的作用: 1、进行过滤: 实例1:检索订购物品TNT2的所有客户的ID = + 一般,在WHERE...
    99+
    2022-10-18
  • MySQL之连接查询和子查询
    多表连接的基本语法 多表连接,就是将几张表拼接为一张表,然后进行查询 select 字段1, 字段2, ... from 表1 {inner|lift|right} join 表2 on 连接条件; 有如下两张表:部门表和员工...
    99+
    2015-01-24
    MySQL之连接查询和子查询
  • 【MySQL】查询操作(基础篇)
    目录 1、查询操作(Retrieve) 1.1 全列查询 1.2 指定列查询 1.3 查询字段为表达式 1.4 别名 1.5 去重:DISTINCT 1.6 排序:ORDER BY 1.7 条件查询:WHERE  1.8 分页查...
    99+
    2023-09-01
    mysql 数据库
  • Mysql中的嵌套子查询问题
    目录Mysql嵌套子查询在WHERE子句中使用子查询单行单列子查询单行多列子查询。多行单列子查询FROM子查询:总结:select子查询用子查询用子查询Mysql嵌...
    99+
    2022-11-13
  • MySQL基础篇 | 简单的查询、条件查询、排序查询
    ✅作者简介:大家好我是@每天都要敲代码,希望一起努力,一起进步! 📃个人主页:@每天都要敲代码的个人主页 🔥系列专栏:MySQL专栏 目录 一:简单的查询 1. 查询一个字段 2. 查询多个字段  3...
    99+
    2023-09-01
    mysql 数据库 sql
  • mysql 基础篇-数据查询(1)
    一、查询数据的概念:查询数据、筛选数据、确定数据的以什么样的格式输出。二、数据查询的基本语句   1、基本语句格式 :select 字段列表  FROM 表或者视图 ...
    99+
    2022-10-18
  • 如何使用mysql连接查询、联合查询、子查询
    这篇文章主要讲解了如何使用mysql连接查询、联合查询、子查询,内容清晰明了,对此有兴趣的小伙伴可以学习一下,相信大家阅读完之后会有帮助。连接查询:连接查询就是将多个表联合起来查询,连接查询方式有内连接、外...
    99+
    2022-10-18
  • MySQL中连接查询和子查询的问题
    目录多表连接的基本语法交叉连接和笛卡尔积现象交叉连接笛卡尔积现象内连接外连接左外连接右外连接全外连接子查询多表连接的基本语法 多表连接,就是将几张表拼接为一张表,然后进行查询 s...
    99+
    2022-11-12
  • MySQL基础:基础查询
    DQL语言:数据查询语言 3.1 基础查询 语法 select 查询列表 from 表名; 特点 查询列表可以是字段、常量、表达式、函数,也可以是多个 查询结果是一个虚拟表 示例 1、查询单个字段 selec&#...
    99+
    2016-06-13
    MySQL基础:基础查询
  • SpringBoot之QueryDsl嵌套子查询问题
    目录QueryDsl嵌套子查询这是MyBatis的查询格式这是JPA的QueryDsl格式需要注意的是还可以通过占位符的样式来写总结QueryDsl嵌套子查询 我项目中要求所有的SQ...
    99+
    2023-03-15
    SpringBoot QueryDsl QueryDsl嵌套子查询 SpringBoot嵌套子查询
  • 【MySQL系列】MySQL复合查询的学习 _ 多表查询 | 自连接 | 子查询 | 合并查询
    「前言」文章内容大致是对MySQL复合查询的学习。 「归属专栏」MySQL 「主页链接」个人主页 「笔者」枫叶先生(fy) 目录 一、基本查询回顾二、多表查询三、自连接四、子查询4.1 单行子查询4.2 多行子查询4....
    99+
    2023-08-30
    mysql 学习 android
  • 连接查询(多表查询)——MySQL
    连接查询(多表查询) 又称多表查询,当查询的字段涉及多个表的时候,就要用到连接查询 分类: 为表起别名: 提高语句的简洁度区分多个重名字段注意:如果为表起了别名,则查询的字段就不能使用原来的别名去限定 内连接 查询A、B 交集部分数据 语...
    99+
    2023-08-18
    数据库 mysql 多表查询
  • mysql json 基础查询
    mysq json 主要有JSON 对象(json object )和JSON 数组(json array )两种类型 $表示整个json对象,在索引数据时用下标(对于json array,从0开始)或键值(对于json object,含有...
    99+
    2023-08-16
    mysql java
  • Mysql基础04-查询
    关联查询 内连接:实现A∩B select 字段列表 from A表 inner join B表 on 关联条件 where 等其他子句; 左外连接 #实现查询结果是A select 字段列表...
    99+
    2019-10-28
    Mysql基础04-查询
  • thinkphp:数据库查询二,嵌套别的表的查询(别的表做子查询)
     例子 从 vendors 表中选择记录。在 vendors 表中,筛选出具有满足以下条件的 vendor_code 值: 对应的采购订单(在 po_headers_all 表中)存在未完全接收的采购行(在 po_lines_all 表...
    99+
    2023-09-13
    数据库 sql php
  • 怎么分析Mysql中的嵌套子查询问题
    小编今天带大家了解怎么分析Mysql中的嵌套子查询问题,文中知识点介绍的非常详细。觉得有帮助的朋友可以跟着小编一起浏览文章的内容,希望能够帮助更多想解决这个问题的朋友找到问题的答案,下面跟着小编一起深入学习“怎么分析Mysql中的嵌套子查询...
    99+
    2023-06-29
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作