MySQL多表联合查询、连接查询、子查询的实现

 更新时间:2023年07月25日 10:24:16   作者:小贾-同志  
本文主要介绍了MySQL多表联合查询、连接查询、子查询的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

 【1】连接查询

连接查询的意义: 在用户查看数据的时候,需要显示的数据来自多张表.

内连接查询

内连接查询是最常见的连接查询,内连接查询可以查询两张或两张以上的表

内连接:[inner] join:从左表中取出每一条记录,去右表中与所有的记录进行匹配: 匹配必须是某个条件在左表中与右表中相同最终才会保留结果,否则不保留.

基本语法:左表 [inner] join 右表 on 左表.字段 = 右表.字段;on表示连接条件: 条件字段就是代表相同的业务含义(如my_student.c_id和my_class.id)

当两个表中存在相同意义的字段的时候,就可以通过该字段来连接查询这两个表,当该字段的值相同时就可以查出该记录。

内连接可以没有连接条件: 没有on之后的内容,这个时候系统会保留所有结果。

例:

select a.id,a.name,a.sex,b.country,b.city,b.street 
from student a 
join addr b 
on a.addrid=b.addrid;

外连接查询

以某张表为主,取出里面的所有记录, 然后每条与另外一张表进行连接: 不管能不能匹配上条件,最终都会保留: 能匹配,正确保留; 不能匹配,其他表的字段都置空NULL。

左连接

left join: 左外连接(左连接), 以左表为主表基本语法: from 左表 left join 右表 on 左表.字段 = 右表.字段;

左表不管能不能匹配上条件,最终都会保留:能匹配,正确的保留; 若不能匹配,右表的字段都置NULL。

例:

select a.id,a.name,a.addrid,b.country,b.city
from student a left join addr b
on a.addrid=b.addrid;

右连接

right join: 右外连接(右连接), 以右表为主表基本语法: from 左表 right join 右表 on 左表.字段 = 右表.字段;右表不管能不能匹配上条件,最终都会保留:能匹配,正确的保留; 若不能匹配,左表的字段都置NULL。

例:

select a.id,a.name,a.addrid,b.country,b.city
from student a right join addr b
on a.addrid=b.addrid;

【2】联合查询

联合查询联合查询结果是将多个select语句的查询结果合并到一块因为在某种情况下需要将几个select语句查询的结果合并起来显示。比如现在需要查询两个公司的所有员工的信息,这就需要从甲公司查询所有员工信息,再从乙公司查询所有的员工信息,然后将两次的查询结果进行合并。可以使用union和union all关键字进行操作

语法格式如下:

select 语句1
union[union 选项]
select 语句2
union|[union 选项]
select 语句n

其中union选项有两个选项可选

  • all:表示无论重复都输出
  • distinct: 去重(整个重复)(默认的)
select *from addr
union all
select *from addr;

select id,addrid 
from addr 
union all 
select id,addrid 
from student;

联合查询只要求字段一样, 跟数据类型和顺序无关

select id,addrid,sex,score 
from student 
union all 
select sex,addrid,id,score 
from student;

联合查询的意义:

  • 查询同一张表,但是需求不同 如查询学生信息, 男生身高升序, 女生身高降序
  • 多表查询: 多张表的结构是完全一样的,保存的数据(结构)也是一样的.

联合查询order by的使用

在联合查询中: order by不能直接使用(不能出现两次),需要对查询语句使用括号才行;

select *from student 
where sex="woman" 
order by score
union
select *from 
student where sex="man" 
order by score;

这种情况是会报错的。因为语句中不允许出现两个order by。

select *from student where sex="woman" 
union
select *from student where sex="man" order by score;

如果是上边这样只出现一次他的意义就是等合并完成之后再进行排序就没有任何意义了,因为又把前边sex分好的类打乱了

(select *from student 
where sex="woman" 
order by score )
union
(select *from 
student where sex="man" 
order by score;)

这种方式的目的是为了让两个结果集先分别order by,然后再对两个结果集进行union。但是你会发现这种方式虽然不报错了,但是两个order by并没有产生最后的效果,所以应该改成如下:

select *from
(select *from student 
where sex="woman" 
order by score)student
union
select *from
(select *from student 
where sex="man" 
order by score)student ;

也就是说,order by不能直接出现在union的子句中,但是可以出现在子句的子句中。

【3】子查询

通常我们在查询的SQL中嵌套查询,称为子查询。子查询通常会使复杂的查询变得简单,但是相关的子查询要对基础表的每一条数据都进行子查询的动作,所以当表单中数据过大时,一定要慎重选择

带in关键字的子查询

使用in关键字可以将原表中特定列的值与子查询返回的结果集中的值进行比较如果某行的特定列的值存在,则在select语句的查询结果中就包含这一行。

例:查询成绩大于80的学生的所有信息,先在子查询中查出成绩大于80的结果集,然后将原成绩表中的成绩与结果集进行比较,如果存在,就输出这条学生的记录。

select *
from student 
where score in
(select score from student where score>80);

带比较运算符的子查询

如果可以确认子查询返回的结果只包含一个单值,那么可以直接使用比较运算符连接子查询。经常使用的比较运算符包括等于(=)、不等于(<>或!=)、小于(<)、大于(>)、小于等于(<=)和大于等于(>=)。

select *
from student 
where score> 
(select score 
from scholarship
where dengji=1);

查询奖学金等级为1的学生信息

带exists的子查询

exists: 是否存在的意思, exists子查询就是用来判断某些条件是否满足(跨表),exists是接在where之后exists返回的结果只有0和1.

例:如果存在成绩大于90的人则列出整个表的记录

select *
from student 
where exists
(select *from student where score>90);

带any关键字的子查询

any关键字表示满足其中的任意一个条件,使用any关键字时,只要满足内层查询语句结果的的任意一个,就可以通过该条件来执行外层查询语句。

select *
from student 
where addrid<any
(select addrid 
from addr);

带all关键字的子查询

all和any刚好是相反的,all关键字表示满足所有结果,使用all关键字,要满足内层查询语句的所有结果,才可以通过该条件来执行外层查询语句。

select *
from student 
where addrid>all
(select addrid 
from addr);

到此这篇关于MySQL多表联合查询、连接查询、子查询的实现的文章就介绍到这了,更多相关MySQL多表联合查询、连接查询、子查询内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!                                                          

相关文章

  • InnoDB存储引擎中的表空间详解

    InnoDB存储引擎中的表空间详解

    这篇文章主要介绍了InnoDB存储引擎中的表空间详解,表空间内部,所有页按照区extent为物理单元进行划分和管理,extent由64个物理连续的页组成,表空间可以理解为由一个个物理相邻的extent组成,需要的朋友可以参考下
    2023-09-09
  • linux系统中使用openssl实现mysql主从复制

    linux系统中使用openssl实现mysql主从复制

    在MySQL的主从复制中,其传输过程是明文传输,并不能保证数据的安全性,今天我们就来讨论下linux系统中使用openssl实现mysql主从复制,有需要的小伙伴可以参考下
    2016-11-11
  • mysql用户创建与授权的简单实例

    mysql用户创建与授权的简单实例

    MySQL等主流数据库的最高权限一般是root用户,有时我们需要提供数据库的账号和密码以使用某些服务,下面这篇文章主要给大家介绍了关于mysql用户创建与授权的相关资料,需要的朋友可以参考下
    2022-03-03
  • mysql查询当天的数据

    mysql查询当天的数据

    这篇文章主要介绍了mysql查询当天的数据,第一种数量小的时候用,数据量稍微起来巨慢,第二种速度快,但是最好配合复合索引来查,避免全表扫描,需要的朋友可以参考下
    2023-08-08
  • MySQL数据库索引与事务从基础到实践指南

    MySQL数据库索引与事务从基础到实践指南

    本文全面介绍了MySQL索引与事务的关键知识,索引通过提升查询效率,降低写操作开销,确保数据一致性,合理创建和维护索引,选择合适的隔离级别,是优化数据库性能和保障数据一致性的关键,感兴趣的朋友跟随小编一起看看吧
    2025-12-12
  • MySQL慢日志输出问题及快速解决方法

    MySQL慢日志输出问题及快速解决方法

    文章介绍了MySQL慢日志输出问题的原因和解决方法,慢日志记录了执行时间超过设定阈值的SQL语句,但有时即使查询时间小于阈值,未使用索引的查询也会被记录,感兴趣的朋友跟随小编一起看看吧
    2025-11-11
  • 超详细MySQL8.0.22安装及配置教程

    超详细MySQL8.0.22安装及配置教程

    这篇文章主要介绍了超详细MySQL8.0.22安装及配置教程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • mysql表分区的方式和实现代码示例

    mysql表分区的方式和实现代码示例

    通俗地讲表分区是将一个大表,根据条件分割成若干个小表,下面这篇文章主要给大家介绍了关于mysql表分区的方式和实现代码,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-02-02
  • MySql 5.7.21免安装版本win10下的配置方法

    MySql 5.7.21免安装版本win10下的配置方法

    这篇文章主要介绍了MySql 5.7.21免安装版本win10下的配置方法,本文图文并茂给大家介绍的非常详细,需要的朋友可以参考下
    2018-05-05
  • MySQL用户与权限的管理详解

    MySQL用户与权限的管理详解

    这篇文章主要介绍了MySQL用户与权限的管理,详细分析了mysql用户密码、权限设置与使用相关操作原理及注意事项,需要的朋友可以参考下
    2019-07-07

最新评论