第一部分:https://zhuanlan.zhihu.com/p/63217422

第二部分:https://zhuanlan.zhihu.com/p/64153448

Day3

九.连接查询

1.什么是连接查询?

2.连接查询根据:年代分类

---SQL92【1992】

---SQL99【1999:更新的语法,主要掌握这种语法】

总结:

92语法和99语法的区别,

92语法中的from后面多表相互连接是用逗号,后用查询条件是用where。

而99语法中的from后面多表相互连接的是用join,后面查询条件前用 on。

3.连接查询根据:连接方式分类

---内连接:

*等值连接

*非等值连接

*自连接

---外连接

*左外连接(左连接)

*右外连接(右连接)

---全连接【很少使用】

内连接含义:

只连接匹配的行,即A表与B表相连接,能够匹配的记录查询出来。

外连接含义:

A表和B表能够完全匹配的记录查询出来之外,将其中一张表的记录无条件的完全查询出来,对方表没有匹配的记录时,会自动模拟出null值与之匹配;外连接的查询结果条数 >= 内连接的查询结果条数。

小知识点:在进行多表连接查询的时候,尽量给表起别名,这样mysql容易识别某个字段具体取自于哪张表。

> select e.ename,d.dname from emp e,dept d;

问:当多张表进行连接查询,若没有任何条件进行限制,会发生什么现象?

结论:若两张表进行连接查询的时候没有任何条件限制,最终的查询结果总数是两张表记录的乘积,该现在称为笛卡尔积现象。所以在使用表连接时,添加限制条件

以下为三张表具体信息内容:

emp员工信息表
dept部门信息表
salgrade工资表

内连接中的等值连接

案例1:查询每一个员工所在的部门名称,要求最终显示员工姓名和对应的部门名称。(两张表查询)

SQL92语法:

eg:select e.ename,d.dname from emp e,dept d where e.xx=d.xx

>select e.ename,d.dname from emp e,dept d where e.deptno=d.deptno;

SQL99语法

>select e.ename,d.dname from emp e inner join dept d on e.deptno=d.deptno; //inner 可以省略

>select e.ename,d.dname from emp e join dept d on e.deptno=d.deptno;(重点掌握)

内连接中的非等值连接

案例2:找出每一个员工对应的工资等级,要求显示员工姓名、工资、工资等级。(两张表查询)

SQL92语法:

> select e.ename,e.sal,s.grade from emp e , salgrade s where e.sal between s.losal and s.hisal;

SQL99语法:

> select e.ename,e.sal,s.grade from emp e inner join salgrade s on e.sal between s.losal and s.hisal; //inner 可以省略

> select e.ename,e.sal,s.grade from emp e join salgrade s on e.sal between s.losal and s.hisal;(重点掌握)

内连接中的自连接

案例3:找出每一个员工的上级领导,要求显示员工姓名及对应的领导姓名。(一张表查询)

92语法和99语法,主要是将join改为逗号,on 改为 where

SQL92语法:

>select a.ename empname,b.ename leadername from emp a , emp b where a.mgr=b.empno;

SQL99语法:

> select a.ename empname,b.ename leadername from emp a inner join emp b on a.mgr=b.empno;//inner 可以省略

> select a.ename empname,b.ename leadername from emp a join emp b on a.mgr=b.empno;(重点掌握)

外连

案例4:找出每一个员工对应的部门名称,要求部门名称全部显示。(给表起别名,a为员工表,b为领导表,两张表查询)

可以发现员工信息表中的部门编号只有10-30,没有出现40,即要求把部门名称全部显示的话,员工表需要对应空值。

#右外连接

> select a.ename,a.deptno,b.dname from emp a right outer join dept b on a.deptno=b.deptno;//outer可以省略

#左外连接

> select a.ename,a.deptno,b.dname from dept b left outer join emp a on a.deptno=b.deptno;

Ps:为什么 inner 和 outer 可以省略,加上去有什么好处?

可以省略,因为区分内连接与外连接不是依靠这两个关键字,而是看SQL语句中的left/right关键字;

加上left、right关键字增强SQL语句的可读性。

案例5:找出每一个员工对应的领导名,要求显示所有员工。

> select a.ename empname,b.ename leadername from emp a left outer join emp b on a.mgr=b.empno;//outer可省略

案例6:找出每一个员工对应的部门名称,以及该员工对应的工资等级,要求显示员工姓名、部门名、工资,工资等级。(三张表查询,以下自设表别名,a为员工表,b为部门表,c为工资等级表)

> > select a.ename,b.dname,a.sal,c.grade from emp a join dept b on a.deptno=b.deptno join salgrade c on a.sal between c.losal and c.hisal;

注意:使用多张表查询时,from后面可跟多个join ,join前面的表跟后面的表分别建立连接。

多张表进行表连接的语法格式:

原理:A表和B表通过连接条件1连接之后,A表再和C表通过连接条件2进行连接;

-----------------------------------------------------------------------------------------------

十,子查询

含义:select 语句嵌套 select 语句。

select子句可出现在select、from、where关键字后面,如下:

select … (select)…

from …(select)…

where …(select)…

10.1子查询--出现在where后面

案例1:找出薪水比公司平均薪水高的员工,要求显示员工名和薪水

having也可以用where。这里需要注意的是,where后面不能直接跟分组函数,所以需要分开写;下面另一种方法,可以用一行代码即可查询出来---where后面的子查询。

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

10.2子查询--出现在from后面

案例2:找出每个部门的平均薪水,并且要求显示平均薪水的薪水等级

解决思路:

第一步,找出每个部门的平均薪水。

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

第二步,将上面的查询结果当做临时表t,t表和salgrade s 表进行表连接,条件:t.avg(sal) between s.losal and s.hisal (t.avg(sal)要重命名,因为avg本意为分组函数)

>select t.deptno,t.avgsal,s.grade from salgrade s join t on t.avgsal between s.losal and s.hisal;

--------

以上如果直接粘贴到mysql,会显示t表不存在,所以,将第一步的看成一个整体,粘贴到 from后面的t表前面。

正确代码:

select

t.deptno,t.avgsal,s.grade

from

salgrade s

join

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

on

t.avgsal between s.losal and s.hisal;

----

> select t.deptno, t.avgsal, s.grade from ( select avg(sal) as avgsal,deptno from emp group by deptno) t join salgrade s on t.avgsal between s.losal and s.hisal;

PS:主要是根据现有的数据信息,利用子查询转换成想要的数据信息。

小总结:

本篇文章主要介绍了mysql最重要部分,select部分的连接查询和子查询。

本小节已结束,未完待续,敬请期待~~

mysql多张表join_mysql 连接查询(多表查询)+子查询-初学教程 3【重点】相关推荐

  1. mysql数据库表子查询语句_MySQL使用子查询教程

    #MYSQL#这是我MyySQL教程的第四篇了,可能对于一些大神来说这些都是小儿科,但是我还是相信这些东西会对一些人有帮助的,本篇主要会介绍上面是子查询以及如何使用它们.大概会从,什么是子查询,利用子 ...

  2. MySQL 嵌套子查询 with子句 from子查询 in子查询 join子查询

    一.适用场景和方法 (1)适用场景 考虑查询过程中是否存在以下情况: 查询某些数据时需要分组才能得到,某些数据不需要分组就能得到或者分组条件不同: 查询某些数据时需要where条件,某些列不需要whe ...

  3. mysql 新建子查询_Mysql创建SQL子查询ALIAS

    通常这些被称为视图.例如: CREATE VIEW vMyLongQuery AS SELECT a, b, c FROM (LONG QUERY) X WHERE ... 然后可以像这样引用: SE ...

  4. mysql中子查询是什么_mysql子查询是什么

    MySql的子查询是多表查询的一个重要组成部分,常常和连接查询一起使用,是多表查询的基础.下面本篇文章就来带大家了解一下子查询,希望对你们有所帮助. 什么是子查询? 子查询,又叫内部查询.当一个查询是 ...

  5. MySQL查询的进阶操作--子查询(内查询)

    目录 子查询的概念 子查询的分类 按照子查询出现的位置分类: where或having后面 1.标量子查询 2.列子查询 3.行子查询 select后面 from后面 exists后面 子查询的概念 ...

  6. mysql子查询的语法_MySQL子查询Subquery语法介绍

    MySQL子查询Subquery语法介绍 发布时间:2020-05-19 15:48:10 来源:51CTO 阅读:187 作者:三月 下面讲讲关于MySQL子查询Subquery,文字的奥妙在于贴近 ...

  7. mysql子查询过多慢_MySQL子查询慢现象的解决

    当你在用explain工具查看sql语句的执行计划时,若select_type 字段中出现"DEPENDENT SUBQUERY"时,你要注意了,你已经掉入了mysql子查询慢的& ...

  8. 零基础带你学习MySQL—单行子查询和多行子查询(二十二)

    零基础带你学习MySQL-多行子查询(二十二) 一.什么是子查询? 子查询是指嵌入在其它 sql 语句中的 select 语句,也叫嵌套查询 二.什么是单行子查询? 单行子查询是指只返回一行数据的子查 ...

  9. 计算机 vfp表间关系有,VFP表间连接和VFP表的更新操作

    VFP表间连接和VFP表的更新操作 分类:计算机等级 | 更新时间:2016-07-08| 来源:转载 一.建立表间连接:有时需要将不同表的内容按某种条件重新组成一个新表,可用连接命令join来实现该 ...

  10. Task03:复杂查询方法-视图、子查询、函数等-天池龙珠计划SQL训练营

    Task03:复杂查询方法-视图.子查询.函数等 3.1 视图 3.1.1 什么是视图 3.1.2 视图与表有什么区别 3.1.3 为什么会存在视图 3.1.4 如何创建视图 3.1.5 如何修改视图 ...

最新文章

  1. Hat’s Words(字典树)
  2. Python基于statsmodels包构建多元线性回归模型:模型构建、模型解析、模型推理预测
  3. 网站迁移的一般步骤、常见问题及解决措施
  4. python软件开发-有哪些值得推荐的 Python 开发工具?
  5. python装饰器实现对异常代码出现进行监控
  6. 从 2017 ChinaJoy 谈起,中国游戏如何数据化前行
  7. 学习SQL语句之SQL语句大全
  8. iframe嵌入页面白屏_封闭在家学网页制作!为页面嵌入PDF文件——零基础自学网页制作
  9. qt设置鼠标追踪后,鼠标还是需要点击后才能变样式
  10. 大数据下的精准营销,媒介们将何去何从
  11. html地址栏传值问题
  12. LINQ to SQL之使用Lambda Expression批量删除数据
  13. 为什么要有环回路由(zz)
  14. 【已解决】node.dll丢失怎么办?计算机丢失node.dll是什么意思?
  15. 黄永成-thinkphp讲解-个人博客讲解26集
  16. 链表:头插法与尾插法(简易图解和代码)
  17. 【华为面试手撕代码】
  18. 自学编程入门,先学什么语言好?
  19. 改变linux 背景修改命令,Linux命令行下更改桌面背景(GNOME环境)
  20. 基于CAT12的report数据做QC质量检查,排除离群点——IQR欧拉数

热门文章

  1. office 2007启动要安装配置?
  2. mysql横向扩展_高可用MySQL学习笔记-面向横向扩展的MYSQL复制
  3. 高教杯历年真题_喜报 | 2019“高教社”杯全国大学生数学建模竞赛获奖名单!...
  4. Java 并发编程之 Atomic 类
  5. 江苏省高邮2021年高考成绩查询,2021年江苏高考成绩排名及一分一段表
  6. Java复习提纲之面向对象
  7. Python Pandas导出Hbase数据到dataframe
  8. 解决Latex报错latex Unknown float option `H‘.
  9. Python使用wordnet工具计算词集与词条基本用法(一)
  10. 使用py2neo构建neo4j图模型小demo