测试面试题:数据库表连接查询:子查询、内连接、外连接

1. 多表查询

  • 去重

    • 显式

      sql 复制代码
      	 select [distinct] A.列名,B.列名,C.列名,... from C 
      	 join A on A.key=C.FKeyA 
      	 join B on B.key=C.FKeyA and B.key=A.key
      	 [GROUP BY 字段名]
    • 隐式

      sql 复制代码
      	select [distinct] A.列名,B.列名,C.列名,... from 表A,
      	表B,
      	表C
      	 where 表A.字段1 = 表B.字段1 and
      	 表B.字段2 = 表C.字段2 and ....
      	 [GROUP BY 表名.字段名]
  • 排序

    sql 复制代码
    select  A.列名,B.列名,C.列名,... from C 
     join A on A.key=C.FKeyA 
     join B on B.key=C.FKeyA and B.key=A.key
    [ORDER BY 表名.字段名]

2. 子查询

  • 子查询只返回一个值
  • 子查询首选使用in做匹配
  • 子查询在其他查询结果的基础上提供了一种有效的方式来表示where字句的条件 。
  • 子查询的selec查询总是使用圆括号括起来。
  • 对于子查询来说,外查询条件要什么,子查询就查什么。 一一对应的关系。
  • 子查询结果分类:
    • 标量子查询(子查询结果为单个值):

      • 子查询返回的结果是单个值〔数字、字符串、日期等)
      • 常用操作符:= <> > >= <= <
    • 列子查询(子查询结果为一列):子查询返回的结果是一列

      • 常用操作符:in、not in、any、some、all
      sql 复制代码
      	select 列表名 from 表名 where 字段名 > all (子查询语句);
      	select 列表名 from 表名 where 字段名 > any (子查询语句)
    • 行子查询(子查询结果为一行):

      • 常用操作符:=、<>、 in、not in
      sql 复制代码
      select 字段名,... from 表名A where (字段名1,字段名2,...) = (select 字段名1值,字段名2值,... from 表名B where 条件)
    • 表子查询(子查询结果为多行多列):in
      *

      sql 复制代码
      select 字段名,... from 表名A where (字段名1,字段名2,...) in (select 字段名1值,字段名2值,... from 表名B where 条件)

3. 内连接:只有匹配到的情况下才会返回结果值

  • 格式一(隐式):

    sql 复制代码
    from 表名1.列名1,表名1.列名2,表名2.列名1,表名2.列名2... 
    form 表名1,表名2
    where 表名1.列=表名2.列; //列为相同的列
  • 格式二(显式):

    sql 复制代码
    select 表名1.列名1,表名1.列名2,表名2.列名1,表名2.列名2... 
    from 表名1 inner join 表名2
    on 表名1.列=表名2.列

4. 外连接

  • 外部连接会返回from字句中提到的至少一个表或视图中的所有行

  • 左连接:显示左边所有行。如果左表的某行在右表中没有找到匹配的行,则结果集中的右表相对应位置为null。

    sql 复制代码
    select 表名1.列名1,表名1.列名2,表名2.列名1,表名2.列名2
    from 表名1 left outer join 表名2
    on 表名1.列=表名2.列; //列为大家共有的列
  • 右连接:显示右边所有行

    sql 复制代码
    right outer join
    select 表名1.列名1,表名1.列名2,表名2.列名1,表名2.列名2
    from 表名1 right outer join 表名2
    on 表名1.列=表名2.列; 
  • 区分是左连接还是右连接:左连接以坐标为参考,左表没有则返回null,右连接以右表为参考,右表没有则返回null

5.联合查询

  • 把多次查询的结果合并起来,形成一个新的查询结果集

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

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

    sql 复制代码
    select 字段名 from 表A ....
    UNION [ALL]
    select 字段名 from 表B ...;
相关推荐
明月醉窗台30 分钟前
qt使用笔记二:main.cpp详解
数据库·笔记·qt
沉到海底去吧Go1 小时前
【图片自动识别改名】识别图片中的文字并批量改名的工具,根据文字对图片批量改名,基于QT和腾讯OCR识别的实现方案
数据库·qt·ocr·图片识别自动改名·图片区域识别改名·pdf识别改名
老纪的技术唠嗑局1 小时前
重剑无锋,大巧不工 —— OceanBase 中的 Nest Loop Join 使用技巧分享
数据库·sql
未来之窗软件服务2 小时前
JAVASCRIPT 前端数据库-V6--仙盟数据库架构-—-—仙盟创梦IDE
数据库·数据库架构·仙盟创梦ide·东方仙盟·东方仙盟数据库
寒山李白2 小时前
MySQL复杂SQL(多表联查/子查询)详细讲解
sql·mysql·子查询·多表联查
一只爱撸猫的程序猿3 小时前
构建一个简单的智能文档问答系统实例
数据库·spring boot·aigc
nanzhuhe3 小时前
sql中group by使用场景
数据库·sql·数据挖掘
消失在人海中4 小时前
oracle sql 语句 优化方法
数据库·sql·oracle
Clang's Blog4 小时前
一键搭建 WordPress + MySQL + phpMyAdmin 环境(支持 PHP 版本选择 & 自定义配置)
数据库·mysql·php·wordpr
zzc9214 小时前
MATLAB仿真生成无线通信网络拓扑推理数据集
开发语言·网络·数据库·人工智能·python·深度学习·matlab