Mysql多表操作

文章目录

  • [1. 概述](#1. 概述)
  • [2. 内连接](#2. 内连接)
  • [3. 外连接](#3. 外连接)
  • [4. 自连接](#4. 自连接)
  • [5. 联合查询-union,union all](#5. 联合查询-union,union all)
  • [6. 子查询](#6. 子查询)

1. 概述

在项目开发中,在进行数据库表结构设计是,会根据业务需求和业务模块之间的关系,分析并设计表结构,由于业务之间相互关联,所以各个表结构之间也存在着各种联系,基本上分为三种

  • 一对多(多的一方,外键指向一的主键)
  • 多对多(通过中间表来表示两表之间的关系)
  • 一对一(用于单表拆分,将一张表的基础字段放在一张表中,其它详情字段放在另一张表中,以提高操作效率)

多表查询指从多张表中查询数据(就会出现迪卡尔积现象),在多表查询时需要消除无效的笛卡尔积。多表查询主要的分类如下:

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

2. 内连接

内连接查询的是两张表交集的部分

  • 内连接查询语法
    • 隐式内连接
sql 复制代码
Select 字段列表 from 表1,表2 Where 条件...;

-- 显示内连接

sql 复制代码
Select 字段列表 From 表1 [Inner] Join 表2 On 连接条件....;

3. 外连接

  • 左外连接

查询左表的所有数据,包含表1和表2交集部分的数据

sql 复制代码
Select 字段列表 From 表1 Left [outer] Join 表2 On 条件...;
  • 右外连接

查询右表的所有数据,包含表1和表2交集部分的数据

sql 复制代码
Select 字段列表 From 表1 Right [outer] Join 表2 On 条件...;

4. 自连接

自连接的查询可以是内连接查询,也可以是外连接查询

sql 复制代码
Select 字段列表 From 表1 别名A  Join 表1 别名B On 条件...;

5. 联合查询-union,union all

对于union查询,就是把多次查询的结果合并起来,形成一个新的查询结果集

sql 复制代码
Select 字段列表 From 表A ...
Union[All]
Select 字段列表 From 表B....;

对于联合查询的多张表的列数必须保持一致,字段类型也需要保持一致

union all会将全部数据直接合并在一起,union会对合并之后的数据去重

6. 子查询

Sql 语句中嵌套Select语句,称为嵌套查询,又称子查询

sql 复制代码
Select * from t1 where column1=(select column1 from t2);

子查询外部的语句可以是增删改查的任何语句,内部职能是查询语句

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

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

根据子查询的位置,分为Where之后、From之后、Select之后

  • 标量子查询

子查询的结果是单个值(数字、字符串、日期等),最简单的形式,这种查询称为标量子查询

常见的操作函数 > < = >= <=

  • 列子查询

子查询结果是一列(可以是多行),这种查询称为列子查询

常见的操作符

操作符 描述
IN 在指定的集合范围中,多选1
NOT IN 不在指定的集合范围之内
ANY 子查询返回列表中,有任意一个满足即可
SOME 与ANY等同
ALL 子查询返回列表的所有值都必须满足
  • 行子查询

子查询返回的结果是一行(可以是多列),这种查询称为行子查询

常见的操作符:= <> IN NOT IN

  • 表子查询

子查询返回的结果是多行多列,这种子查询称为表子查询

相关推荐
Fleshy数模8 小时前
CentOS7 安装配置 MySQL5.7 完整教程(本地虚拟机学习版)
linux·mysql·centos
az44yao9 小时前
mysql 创建事件 每天17点执行一个存储过程
mysql
秦老师Q10 小时前
php入门教程(超详细,一篇就够了!!!)
开发语言·mysql·php·db
橘子1311 小时前
MySQL用户管理(十三)
数据库·mysql
Dxy123931021611 小时前
MySQL如何加唯一索引
android·数据库·mysql
我真的是大笨蛋11 小时前
深度解析InnoDB如何保障Buffer与磁盘数据一致性
java·数据库·sql·mysql·性能优化
怣5011 小时前
MySQL数据检索入门:从零开始学SELECT查询
数据库·mysql
人道领域12 小时前
javaWeb从入门到进阶(SpringBoot事务管理及AOP)
java·数据库·mysql
千寻技术帮13 小时前
10404_基于Web的校园网络安全防御系统
网络·mysql·安全·web安全·springboot
spencer_tseng13 小时前
MySQL table backup
mysql