前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >MySQL多表查询

MySQL多表查询

作者头像
WuShF
发布2023-09-21 08:43:38
2050
发布2023-09-21 08:43:38
举报
文章被收录于专栏:笔记分享

浅记sql中多表查询的相关语法

笛卡尔积

单表查询:select * from table1; 多表查询:select *from table1,table2;

id

name

age

status

gender

id

des

1

张三

22

1

3

禁止

1

张三

22

1

2

受限

1

张三

22

1

1

正常

2

李四

12

1

3

禁止

2

李四

12

1

2

受限

2

李四

12

1

1

正常

3

王五

1

1

3

禁止

3

王五

1

1

2

受限

3

王五

1

1

1

正常

直接采用这种方法进行多表查询,结果是集合A和集合B的所有组合情况,这对应关系代数中的“笛卡尔积”。在多表查询时,需要消掉无效的笛卡尔积。

  • 这需要加上where条件:
代码语言:javascript
复制
select *
from user,status where user.status=status.id;

连接查询

内连接:相当于查询A、B交集的部分。 左外连接:查询左表所有数据,以及两张表交集部分的数据。 右外连接:查询右表所有数据,以及两张表交集部分的数据。 自连接:当前表与自身连接查询,必须使用表的别名。

内连接

隐式内连接:select 字段列表 from 表1,表2 where 条件; 显式内连接:select 字段列表 from 表1 join 表2 on 连接条件;

代码语言:javascript
复制
#显式内连接
select *
from user,
     status
where status.id = user.status;
#隐式内连接
select *
from user
         join status on status.id = user.status;

外连接

左外连接:select 字段列表 from 表1 left join 表2 on 条件; 右外连接:select 字段列表 from 表1 right join 表2 on 条件;

代码语言:javascript
复制
#左外连接
select *
from user
         left join status on status.id = user.status;
#右外连接
select *
from user
         right join status on status.id = user.status;

右外连接查询结果

id

name

age

status

gender

id

des

1

张三

22

1

1

正常

2

李四

12

1

1

正常

3

王五

1

1

1

正常

null

null

null

null

null

2

受限

null

null

null

null

null

3

禁止

自连接

自连接查询可以是内连接,也可以是外连接。 自连接需要起别名:select 字段列表 from 表A 别名A join 表A 别名B on 条件; 自连接往往出现在一下场景:

  • 员工A的记录中有领导id,而领导也是员工,也在员工表中。这就需要自连接,拼接员工和员工的领导。
  • 领导没有领导,如果使用内连接,那么会导致结果中没有领导。此时需要左外连接,即使没有领导,也要显示出来。
代码语言:javascript
复制
select *
from user
         join test.user u on user.status = u.id;

联合查询

使用union联合查询需要多个查询结果的字段相同。

代码语言:javascript
复制
select 字段列表 from 表A...
union [all]
select 字段列表 from 表B...;

加不加all的区别是:

  • all:直接将查询的结果合并,不去重
  • all:将查询的结果合并后去重,没有重复项
代码语言:javascript
复制
#示例,直接将查询的结果合并
select *
from user where id>1
union all
select *
from user where id<3;
#将查询的结果合并后去重
select *
from user where id>1
union
select *
from user where id<3;

子查询

子查询的外部语句可以是insertupdatedeleteselect。 这些查询方式的区别在于子查询的返回值格式,限制了可用的运算符:

  • 标量子查询:子查询结果为单个值。
  • 列子查询:子查询结果为一列。
  • 行子查询:子查询结果为一行。
  • 表子查询:子查询结果为多行多列。

标量子查询

子查询返回的结果是单个值,如数字、字符串、日期等。 子查询返回的结果会自动类型转换,使用where id = '2'where id = 2结果是一样的。

根据姓名查询状态id

image.png
image.png

根据上一步获取到的状态id查询状态描述

image.png
image.png

列子查询

标量子查询返回的结果是单个值,列子查询返回的结果是多个值。 假如有如下需求:查询工资比任意员工工资高的员工列表

  • where salary > any(select salary...)//查询工资比任意员工工资高的员工列表
  • where salary > some(select salary...)//跟上一条一样的效果
  • where salary > all(select salary...)//查询工资比所有员工工资高的员工列表
image.png
image.png

行子查询

代码语言:javascript
复制
#查询与张三相同状态和性别的用户
select *
from user
where (status,gender)=(select status,gender from user where name='张三');

表子查询

子查询的结果是多行多列。 常用操作符是in

代码语言:javascript
复制
#查询与张三或李四相同状态和性别的用户
select *
from user
where (status, gender) in (select status, gender from user where name = '张三' or name = '李四');
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 笛卡尔积
  • 连接查询
    • 内连接
      • 外连接
        • 自连接
        • 联合查询
        • 子查询
          • 标量子查询
            • 列子查询
              • 行子查询
                • 表子查询
                相关产品与服务
                云数据库 MySQL
                腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档