作为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. Pyhton 操作MySQL数据库
  2. ubuntu linux本地源,搭建Ubuntu 12.04 本地源
  3. Python账号密码登陆判断(三次机会)
  4. java中bubblesort是什么意思_排序--冒泡排序BubbleSort(Java)
  5. navicat如何连接腾讯mysql_使用Navicat连接腾讯云Mysql数据库
  6. MyBatis复习(六):MyBatis二级缓存
  7. 火线精英手游服务器维护,火线精英手机版登录失败进不去解决办法
  8. asp 退出登录修改cookie能进入后台_某logCMS的代码审计:越权到后台getshell
  9. tms intraweb html5,TMS VCL Chart
  10. 23. PHP include and require 文件
  11. 如何利用MATLAB(plot 3函数和fplot3函数)绘制三维曲线?
  12. 如何运营ASO积分墙用户,aso积分墙是什么意思
  13. 国内wifi用不了谷歌_如何使用Google Wifi阻止不适当的网站
  14. android qq 文件怎么打开,如何更改腾讯QQ手机版默认的文件打开方式
  15. Win10系统文件名太长导致无法删除
  16. 思科tar格式IOS升级方法
  17. LeetCode 1665. 完成所有任务的最少初始能量
  18. 图像处理篇二:图像颜色转换(OpenCV、PIL)
  19. 如何使用《背景音乐提取器》提取歌曲中的伴奏
  20. GDI+ 画路径(消除锯齿的效果很不错)

热门文章

  1. vue路由通过url传参
  2. 上市企业获得的政府补助金额数据(2008-2019年)
  3. [Unity实战]一个简单的任务系统(一)
  4. 越野车轮胎型号你都了解吗?韩泰轮胎教你如何识别
  5. 科大讯飞t20pro和t10区别 对比评测 哪个好
  6. 文件路径太长删不掉怎么办?
  7. php xpath注入工具,科普:XPATH注入
  8. Stata学习——dir命令
  9. Mysql 删除数据库表中某一列的方法
  10. WQS二分 学习笔记 + 例题([BZOJ2654]Tree、[联考2018]林克卡特树)