Mysql-多表查询

本文介绍了数据库中的多表关系,如一对多、多对多和一对一关系,并展示了如何通过外键来实现这些关系。接着,详细讨论了多表查询,包括内连接、外连接(左连接和右连接)和自连接的概念及语法。此外,还提到了消除笛卡尔积的方法以及联合查询和子查询的使用,子查询分为标量子查询、列子查询、行子查询和表子查询等类型。
摘要由CSDN通过智能技术生成

目录

多表关系

多表查询

多表查询分类

内连接

外连接

自连接


多表关系

分为一下几种关系:

  • 一对多(多对一)
    • 案例: 部门 与 员工的关系
    • 实现: 在多的一方建立外键,指向一的一方的主键
  • 多对多
    • 案例: 学生 与 课程的关系
    • 实现: 建立第三张中间表,中间表至少包含两个外键,分别关联两方主键
  • 一对一
    • 案例: 用户 与 用户详情的关系
    • 实现: 在任意一方加入外键,关联另外一方的主键,并且设置外键为唯一的

多表查询

概念:从多张表中查询数据

语法:

使用逗号隔开多张表,会产生笛卡尔积

如:select * from emp , dept;


笛卡尔积: 笛卡尔乘积是指在数学中,两个集合A集合 和 B集合的所有组合情况。

(在多表查询中,需要消除无效的笛卡尔积

解决办法:为筛选添加条件判断。

多表查询分类

连接查询

  • 需要多张数据表的数据进行查询,则可通过连接运算符实现多个查询

内连接

查询的是两张表交集部分的数据

  • 隐式内连接

    select  字段列表  from  表1,表2  where  条件...;

  • 显式内连接

    select  字段列表  from  表1   [ inner ]  join  表2  on  连接条件...;

外连接

  • 左外连接

    select  字段1,字段2,…  from  table_1  left  [ outer ]  join  table_2  on  条件;

    查询表1所有数据

  • 右外连接

    select  字段1,字段2,…  from  table_1  right [ outer ]  join  table_2  on  条件;

    查询表2所有数据

自连接

自己连接自己,将一张表连接查询多次。

select  字段列表   from  表A   别名A   join  表A    别名B   on  条件 ... ;

注意事项: 在自连接查询中,必须要为表起别名,要不然我们不清楚所指定的条件、返回的字段,到底是哪一张表的字段。

不同的SQL join对比

join 对比:

操作符名称

描述

INNER   JOIN

( JOIN )

如果表中有至少一个匹配,则返回行

LEFT JOIN

不论右表是否有匹配,都会返回左表的所有行

RIGHT JOIN

不论左表是否有匹配,都会返回右表的所有行

联合查询

使用union、union all关键字,就是把多次查询的结果合并起来,形成一个新的查询结果集

SELECT  字段列表   FROM   表A  ...

union  [ all ]
SELECT  字段列表  FROM   表B  ....;

注意:

  • 对于联合查询的多张表的列数必须保持一致,字段类型也需要保持一致。
  • union all 会将全部的数据直接合并在一起,union 会对合并之后的数据去重。

子查询

SQL语句中嵌套SELECT,称为嵌套查询,又称子查询。

SELECT  *  FROM   t1   WHERE  column1 =  ( SELECT  column1  FROM  t2 );

子查询外部的语句可以是INSERT / UPDATE / DELETE / SELECT 的任何一个。

分类:

根据子查询结果不同,分为:

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

根据子查询位置,分为:

  • where之后
  • from之后
  • select之后
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

愚人钊呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值