MySQL之连接查询和子查询

多表连接的基本语法

多表连接,即将多个表拼接成一个表,然后进行查询

[En]

Multi-table join, that is, several tables are spliced into one table and then queried

select 字段1, 字段2, ...

from 表1 {inner|lift|right} join 表2
on 连接条件;

有两个表:部门表和雇员表。

[En]

There are two tables: the department table and the employee table.

MySQL之连接查询和子查询

MySQL之连接查询和子查询

交叉连接和笛卡尔积现象

交叉连接

交叉连接,也称为无条件内部连接/笛卡尔连接

[En]

Cross connect, also known as unconditional inner connection / Cartesian connection

第一张表格的每一项将依次与另一张表格的每一项合并。

[En]

Each item of the first table will be combined with each item of the other table in turn.

select * from employee,department;

MySQL之连接查询和子查询

上述结果肯定不是我们想知道的。左桌上的每个人都有四个部门。仔细观察这四条记录正是将左表中的每条记录与右表中的每条记录进行匹配的结果。

[En]

The above results are certainly not what we want to know. Everyone in the left table has four departments. Careful observation of these four records is exactly the result of matching each record in the left table with that in the right table.

笛卡尔积现象

MySQL之连接查询和子查询

笛卡尔积现象产生的原因:两张表没有有效的连接条件。既然你没有连接条件,本表中的第一行肯定是能和另外表中的所有行进行一一匹配,同理,本表中的第二行肯定是能和另外表中的所有行进行一一匹配,以此类推,本表中的最后一行m也可以和另外表中的所有行进行一一匹配。若另外一张表有n行,那么最后显示的行数,肯定就是m*n行了。

如果不想产生笛卡尔积现象,就需要添加有效的表连接条件。拿上述例子来说,左表dep_id只有和右表id相等时,才代表他们的部门。

内连接

内连接(INNER JOIN)是找几张表的交集,即根据条件筛选出来正确的结果。

select emp.id,emp.name,emp.age,emp.dep_id,emp.gender,dep.id,dep.name
from employee as emp INNER JOIN department as dep
on emp.dep_id=dep.id;

MySQL之连接查询和子查询

由于部门表中没有 id=5的部门,所以员工表 dep_id=5的这条记录没有返回;而由于 行政部没有员工,所以这条记录也没返回。

外连接

左外连接

左连接(left join)是以 左表为准,如果右表中没有合适的记录,用 NULL补全;其本质是在内连接的基础上增加左表有结果而右表没有的记录(内连接时,这种情况的记录会忽略)。

select emp.id,emp.name,emp.age,emp.dep_id,emp.gender,dep.id,dep.name
from employee as emp left join department as dep
on emp.dep_id=dep.id;

MySQL之连接查询和子查询

右外连接

跟左连接正好相反,右连接(right join)是以右表为准,如果左表中某些字段没有合适的结果,用 NULL补全;其本质是在内连接的基础上增加右表有结果而左表没有的记录(内连接时,这种情况的记录会忽略)。

select emp.id,emp.name,emp.age,emp.dep_id,emp.gender,dep.id,dep.name
from employee as emp right join department as dep
on emp.dep_id=dep.id;

MySQL之连接查询和子查询

全外连接

全外连接,在内连接的基础上,展示左右表的所有的记录,而左右表中缺省记录以 NULL补全。

MySQL中并没有全外连接的 FULL JOIN语法,而是借助 UNION/UNION ALL语句实现。

UNIONUNION ALL的区别, UNION具有去重功能。

select emp.id,emp.name,emp.age,emp.dep_id,emp.gender,dep.id,dep.name
from employee as emp left join department as dep
on emp.dep_id=dep.id
union
select emp.id,emp.name,emp.age,emp.dep_id,emp.gender,dep.id,dep.name
from employee as emp right join department as dep
on emp.dep_id=dep.id;

MySQL之连接查询和子查询

子查询

子查询是将一条查询语句嵌套到另一条查询语句中的一种方式:

[En]

A subquery is a way of nesting one query statement into another query statement:

  • 子查询的内部查询结果可以作为外部查询语句,提供查询条件。
    [En]

    the inner query result of a subquery can be used as an outer query statement to provide query conditions.*

  • 子查询中可以包含 INNOT INANDALLEXISTSNOT EXISTS等关键字。
  • 子查询中还可以包含比较运算符,如 =!=><等。
-- &#x67E5;&#x8BE2;&#x5E73;&#x5747;&#x5E74;&#x9F84;&#x5728;20&#x4EE5;&#x4E0A;&#x7684;&#x90E8;&#x95E8;&#x540D;&#x79F0;select namefrom departmentwhere id in (select dep_idfrom employeegroup by dep_idhaving avg(age) > 20);-- &#x67E5;&#x8BE2;&#x8D22;&#x52A1;&#x90E8;&#x5458;&#x5DE5;&#x59D3;&#x540D;select namefrom employeewhere dep_id in (select idfrom departmentwhere name='&#x8D22;&#x52A1;&#x90E8;');-- &#x67E5;&#x8BE2;&#x6240;&#x6709;&#x5927;&#x4E8E;&#x5E73;&#x5747;&#x5E74;&#x9F84;&#x7684;&#x5458;&#x5DE5;&#x7684;&#x5E74;&#x9F84;&#x548C;&#x59D3;&#x540D;select name,agefrom employeewhere age > (select avg(age) from employee);

MySQL之连接查询和子查询

Original: https://www.cnblogs.com/pure3417/p/15225630.html
Author: pure3417
Title: MySQL之连接查询和子查询

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/508183/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 强烈推荐一款优秀且通用的后台管理系统

    最近看到一款优秀的通用管理后台——likeadmin,推荐给大家。likeadmin的部署方式简单,界面美观,基于MIT协议,完全免费,非常值得一用。 likeadmin快速开发通…

    数据库 2023年6月14日
    092
  • JavaWeb 05_JDBC入门及连接MySQL

    一、概念 *概念: Java DataBase Connectivity Java数据库连接, Java语言操作数据库* JDBC本质:其实是官方(sun公司)定义的一套操作所有关…

    数据库 2023年5月24日
    0103
  • 基于Spring实现策略模式

    背景: 看过很多策略模式,总结下来实现原理大体都差不多,在这里主要是讲解下自己基于Spring更优雅的实现方案;这个方案主要是看了一些开源rpc和Spring相关源码后的一些思路,…

    数据库 2023年6月6日
    0101
  • PHP array_count_values()

    array_count_values array_count_values() 函数用于统计数组中所有值出现的次数。 本函数返回一个数组,其元素的键名是原数组的值,键值是该值在原数…

    数据库 2023年6月14日
    075
  • mysql视图,索引

    一、视图 View 视图是一个 虚拟表,是sql语句的查询结果,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据,在使用视图时动态生成。视图的数据变化会影响到基…

    数据库 2023年6月9日
    069
  • Centos安装mysql57

    1.1 MySQL安装 1.1.1 下载 wget 命令 yum -y install wget 1.1.2 在线下载mysql安装包 wget https://dev.mysql…

    数据库 2023年5月24日
    0120
  • mysql data local的使用导入与导出数据到.txt

    一、先创建表 CREATE TABLE stu(id INT UNSIGNED AUTO_INCREMENT,NAME VARCHAR(15) UNIQUE, / 唯一约束 , 可…

    数据库 2023年6月9日
    085
  • Amazon Aurora解读(SIGMOD 2017)

    Amazon在SIGMOD 2017发表了论文《Amazon Aurora: DesignConsiderations for High Throughput Cloud-Nati…

    数据库 2023年6月9日
    085
  • [LeetCode]9. 回文数

    判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。 示例 1: 输入: 121输出: true示例 2: 输入: -121输出: false解…

    数据库 2023年6月9日
    0165
  • Redis小秘密

    Redis小秘密 临渊羡鱼,不如退而织网。 一、Redis基本数据类型 想必很多人都能脱口而出String、List、Hash、Sorted Set和Set五种基本数据类型。 以及…

    数据库 2023年6月14日
    072
  • 小试牛刀:Go 反射帮我把 Excel 转成 Struct

    背景 起因于最近的一项工作:我们会定义一些关键指标来衡量当前系统的健康状态,然后配置对应的报警规则来进行监控报警。但是当前的报警规则会产生大量的误报,需要进行优化。我所负责的是将一…

    数据库 2023年6月6日
    095
  • 数据结构与算法-农夫过河问题

    农夫过河问题——最短路径算法 问题描述:农夫用小木筏将狼、羊、菜从起始岸运到目标岸,小木筏每次只能带一种物品,也可以什么都不带,因为食物链的关系,人不在的时候,狼会吃羊,羊会吃菜,…

    数据库 2023年6月14日
    0109
  • MySQL处理Java客户端连接

    在MySQL里面往往有一个主线程,这是单线程,它不断的循环查看是否有socket是否有读写事件,如果有读写事件,再从线程池里面找个工作线程处理这个socket的读写事件,完事之后工…

    数据库 2023年6月11日
    0114
  • Linux–>软件包管理

    rpm用于互联网下载包的打包和安装工具,它包含在某些Linux分发版本中。 它生成具有.RPM扩展名的文件。 RPM是RedHat Package Manager(RedHat软件…

    数据库 2023年6月14日
    082
  • mysqlCRUD

    &#x67E5;&#x8BE2;&#x4E00;&#x4E2A;&#x6BB5;&#x91CC;&#x6240;&#…

    数据库 2023年6月9日
    071
  • centos 自己常用命令

    tar 1. 使用tar压缩文件 tar -zcvf test.tar.gz ./test/ 该命令表示压缩当前文件夹下的文件夹test,压缩后缀名为test.tar.gz 如果不…

    数据库 2023年6月11日
    082
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球