作为MySQL数据库的初学者,多表查询的知识点多,内容复杂,很令人头大。这篇文章作为总结,以案例的形式,供大家理解和记忆。

目录

概述

一、内连接

案例:查询每个学生的姓名和选课的名称

二、外连接

案例:1.查询学生表的所有数据和对应的选课名称(左查询)

案例:2.查询选课表所有数据和对应的学生名称(右查询)

三、自连接

案例:查询每个学生和对应组长的姓名(没有组长的也要查询)

四、标量子查询

案例:1.查询选MySQL课程的所有学生的全部信息

​案例:2.查询比张三年龄大的所有学生的全部信息

五、列子查询

案例:查询比选C语言学生的年龄都要大的学生

六、行子查询

案例:查询与小明年龄和分数相同的学生信息

七、表子查询

案例:查询年龄大于18岁,的学生信息及选课信息


概述

多表查询主要分以下两个方面:

一、连接查询

1.内连接

2.外连接

3.自连接

二、子查询

1.标量子查询

2.列子查询

3.行子查询

4.表子查询

我们就用这样的两张学生选课信息表格作为数据

student
id name age score group leader id classid
1 张三 18 88 null 1
2 李四 18 77 null 1
3 王五 17 70 1 2
4 小明 19 92 2 2
5 小红 20 52 2 3
6 小刚 19 92 1 null
class
id name
1 MySQL
2 C语言
3 Java
4 Python

一、内连接

内连接有两种表现形式:

隐式内连接:

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

显式内连接:(中括号内的内容可省略)

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

内连接查询的是两个表格交集的部分。

两者不同主要在于隐式内连接用“ , ”连接两个表格,条件用where ;显式内连接用“ join ”连接两个表格,条件用on。

案例:查询每个学生的姓名和选课的名称

分析:以学生的classid与课程的id相等为条件查询(两表的交集部分),并列出student.name和class.name字段

1.隐式内连接:

select s.name,c.name from student s,class c where s.classid=c.id;

2.显式内连接:

select s.name,c.name from student s join class c on s.classid=c.id;

运行结果:

注:小刚没有选课,所以他与选课表无交集,故没有显示。

二、外连接

外连接主要分为两种:左外连接、右外连接。

左外连接:

selcet 字段列表 from 表1 left [outer] join 表2 on 条件;

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

右外连接:

selcet 字段列表 from 表1 right [outer] join 表2 on 条件;

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

两者在字面意思上就可以区分,左外连接查询的是左表全部和交集部分,右外连接查询的是右表全部和交集部分,两者只需记住左外连接即可(右外连接也可),实际应用时交换左外连接中两表顺序即可达到右外连接效果。

案例:1.查询学生表的所有数据和对应的选课名称(左查询)

select s.name,c.name from student s left join class c on s.classid = c.id;

运行结果

案例:2.查询选课表所有数据和对应的学生名称(右查询)

select s.name,c.name from student s right join class c on s.classid = c.id;

运行结果

ru=

可见,外连接可以将两表中非交集的部分查询出来。小刚没有选课,他对应的选课名称就是null

Python没有人选,学生姓名也是null。

三、自连接

自连接语法

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

自连接查询,是同一张表用两个别名查询,可以是内连接查询,也可以是外连接查询

案例:查询每个学生和对应组长的姓名(没有组长的也要查询)

分析:组长也是学生,那么表格中的group leader id字段代表的就是组长的id,例如王五的group leader id为1,张三的id为1,那么张三就是王五的组长。张三李四无group leader id,二人为组长。

select A.name,B .name from student A left join student B on A.`group leader id`=B.id

注:group为关键字所以group leader id要用单引号引起来。

运行结果

这个案例中,自连接用的是左外连接,因为没有组长的也要查询。这里的自连接可以理解为两张相同的表以左外连接的查询方式进行查询。

四、标量子查询

标量子查询返回的结果是单个值(数字、字符串、日期等)

常用操作符: = , <> , > , >= , < , <=

可以理解为嵌套。

案例:1.查询选MySQL课程的所有学生的全部信息

select * from student where student.classid=
(select class.id from class where class.name ='MySQL');

代码分析:

1.        select class.id from class where class.name ='MySQL'查询并返回出MySQL课程的id

2.        select * from student where student.classid=返回的id值

3.        将两个式子嵌套在一起,并加括号

运行结果

案例:2.查询比张三年龄大的所有学生的全部信息

select * from student s where s.age>
(select s.age from student s where s.name='张三');

运行结果

五、列子查询

子查询返回的结果是一列(可以是多行)

常用操作符: in , not in , any(满足一个) , some(满足一个) , all(满足全部)

案例:查询比选C语言学生的年龄都要大的学生

分析:第一步,查询出选C语言的id;第二部,查询出选C语言学生的年龄。第二步,查询出所有比选C语言学生的年龄都要大的学生。

select *from student s where age>all
(select s.age from student s where s.classid=
(select c.id from class c where c.name='C语言'));

代码分析:

1.        select c.id from class c where c.name='C语言'

查询出选C语言的id

2.        select s.age from student s where s.classid=

查询出选C语言学生的年龄

3.        select *from student s where age>all

询出所有比选C语言学生的年龄都要大的学生。all表示比每一个都大

最后嵌套在一起

运行结果

六、行子查询

行子查询返回的结果是一行(可以是多列)

常用操作符:= , <> , in , not in

案例:查询与小明年龄和分数相同的学生信息

select *from student where (age,score)=(select age,score from student where name='小明');

这个比较好理解,注意括号内的对应关系

运行结果

七、表子查询

返回的结果是多行多列

案例:查询年龄大于18岁,的学生信息及选课信息

select *from (select * from student where age>18) s left join class on class.id=s.classid;

代码分析:

1.        select * from student where age>18

查询年龄大于18岁的学生信息,作为一张表并起别名

2.        select *from (select * from student where age>18) s left join class on class.id=s.classid;

以这张大于18岁的学生信息表作为一张表,查询选课信息

运行结果

MySQL多表查询小总结相关推荐

  1. mysql多表查询详解_MySQL多表查询详解上

    时光在不经意间,总是过得出奇的快.小暑已过,进入中暑,太阳更加热烈的绽放着ta的光芒,...在外面被太阳照顾的人们啊,你们都是勤劳与可爱的人啊.在房子里已各种姿势看我这篇这章的你,既然点了进来,那就由 ...

  2. mysql水果表查询_最全MySQL数据库表的查询操作

    序言 本节比较重要,对数据表数据进行查询操作,其中可能大家不熟悉的就对于INNER JOIN(内连接).LEFT JOIN(左连接).RIGHT JOIN(右连接)等一些复杂查询. 通过本节的学习,可 ...

  3. Mysql多表查询效率的研究(一)

    Mysql多表查询效率的研究(一) 本文探究了mysql InnoDB引擎在多表查询的应用场景下,使用子表.内连接和左联接运行速度的差别,并且比较了索引使用与否对查询效率的影响. 第一部分简略地概括了 ...

  4. 浅谈 MySQL 连表查询

    浅谈 MySQL 连表查询 连表查询是一把双刃剑, 优点是适应范式, 减少数据冗余; 缺点是连表查询特别是多张表的连表会增加数据库的负担, 降低查询效率. 简介 连表查询就是 2 张表或者多张表的联合 ...

  5. Mysql 单表查询where初识

    Mysql 单表查询where初识 准备数据 -- 创建测试库 -- drop database if exists student_db; create database student_db ch ...

  6. java mysql 多表查询_解析Mysql多表查询的实现

    查询是数据库的核心,下面就为您介绍Mysql多表查询时如何实现的,如果您在Mysql多表查询方面遇到过问题,不妨一看. Mysql多表查询: CREATE TABLE IF NOT EXISTS co ...

  7. mysql教程多表查询_解析Mysql多表查询的实现

    查询是数据库的核心,下面就为您介绍Mysql多表查询时如何实现的,如果您在Mysql多表查询方面遇到过问题,不妨一看. Mysql多表查询: CREATE TABLE IF NOT EXISTS co ...

  8. 零基础带你学习MySQL—多表查询笛卡尔集(二十)

    零基础带你学习MySQL-多表查询笛卡尔集(二十) 一.多表查询 多表查询:就是指基于两个和两个以上的表的查询,在实际应用中,单个表并不能满足你的需求,我们经常需要在很多个表之间查询数据 二.笛卡尔集 ...

  9. mysql 大表查询慢_mysql大表查询慢怎么优化?

    mysql大表查询慢的优化方法:1.合理建立索引,通常查询利用到索引比不用索引更快:2.对关键字段建立水平分区,比如时间字段,若查询条件往往通过时间范围来进行查询,能提升不少性能:3.建立粗粒度数据表 ...

最新文章

  1. 自然语言处理NLP之语义相似度、语言模型、doc2vec
  2. 如何将OpenCV中的Mat类绑定为OpenGL中的纹理
  3. CTFshow php特性 web128
  4. CentOs下php连mssql并配置unixODBC
  5. 自定义configureMessageConverters和ObjectMapper解决json序列化问题实例
  6. 洪筱楠(1996-),女,对外经济贸易大学国际经济贸易学院经济学荣誉学士实验班本科生。...
  7. 【汇编优化】之内联汇编
  8. ddt-TypeError: test_add_department_1() missing 3 required positional arguments
  9. WebAssembly 的 Wasmer JNI
  10. FileReader读取本地文件
  11. vrPlus之ARView教程,可实现zView效果,无需二次开发
  12. 企业微信api接口调用-通过手机号或微信好友添加客户
  13. so库方法的调用过程
  14. addon游戏_addon_game_mode游戏基本情况设置
  15. 微信小程序获取当前日期和时间
  16. 如何对U盘文件数据加密,U盘加密方法教程分享
  17. 网络分析仪测试线损_求e5071c网络分析仪校50欧姆阻抗与线损方法,标准...
  18. matlab计算全球价值链的程序,全球价值链核算程序与指标数据库公开
  19. 2021-2022学年广州市华师附中九年级第一学期期中考试英语试题
  20. Linux 键盘/鼠标 按键事件 编程

热门文章

  1. python构造字典_python字典构造
  2. 723 驶向天堂的列车
  3. 使用C++开发wxWidgets程序
  4. 360随身wifi原理,功能特点,使用说明
  5. 以下关于关键字super的描述中,正确的是:
  6. 怎么让chatGPT写作文-ChatGPT如何写作
  7. C# 多线程与高并发处理并且具备暂停、继续、停止功能
  8. PHPmailer发送邮件(以sina邮箱为例)
  9. kubernete简单指令
  10. c4d-创建参数几何体与可编辑对象-3