• 【MySQL】多表连接查询


    在数据量庞大的数据库中,为了发挥数据库的作用,便开发了多种数据库操作语言来查询数据,其中多表连接查询就是常用的一个模块。

    多表连接查询,顾名思义,就是将多张表的信息数据进行归纳查询,从而得到我们想要的的数据。

    接下来我们便来学习常用的查询方式吧。

    笛卡尔集:

    笛卡尔集就是在查询数据时简单的将表关联在一起,数据以m*n的形式组合,类似于矩阵相乘,造成了大量重复的无逻辑的数据,丧失了最初筛选数据的初衷。

    造成笛卡尔集的原因:

    * 产生条件:
            1. 省略连接条件
            2. 连接条件无效
            3. 所有表中所有行互相连接
        * 解决方案:
            添加有效筛选条件

    内连接:

        * SQL92语法:
          

    1. SELECT 查询列表
    2. FROM 表名1 别名1 ,表名2 别名2
    3. WHERE 连接条件
    4. AND 筛选条件
    5. GROUP BY 分组列表
    6. HAVING 分组后筛选条件
    7. ORDER BY 排序列表


        * SQL99语法:
          

    1. select 字段列表
    2. from 表名1
    3. [inner] join 表名2 on 条件
    4. where 筛选条件
    5. group by 分组条件
    6. having 分组后的筛选条件
    7. order by 排序字段


    * 注意:
        1. 使用表名前缀在多个表中区分相同的列
        2. 在不同表中具有相同列名的列可以用表的别名加以区分
        3. 如果使用了表别名,则在select语句中需要使用表别名代替表名
        4. 表别名最多支持32个字符长度,但建议越少越好

    外连接(常用):

     左外连接

    1. * 语法:
    2. select 字段列表
    3. from1
    4. left [outer] join2 on 条件
    5. ...


        * 注意:
            左外连接查询的是左表所有数据以及其交集部分,表1为查询主表
    -------------------------------------------------------------------------
    5. 右外连接
        * 语法:
        

    1. select 字段列表
    2. from1
    3. right [outer] join2 on 条件
    4. ...


        * 注意:
            右外连接查询的是右表所有数据以及其交集部分,表2为查询主表

    子查询:查询中嵌套查询,称嵌套查询为子查询

    简单来说就是将复杂的查询要求拆分实现,括号内为拆分的查询结果或者内容。

     特点:
        1、子查询都放在小括号内
        2、子查询可以放在from后面、select后面、where后面、having后面,但一般放在条件的右侧
        3、子查询优先于主查询执行,主查询使用了子查询的执行结果
        4、子查询根据查询结果的行数不同分为以下两类:
            ① 单行子查询
                结果集只有一行

                一般搭配单行操作符使用:> < = <> >= <=
                非法使用子查询的情况:
                    a、子查询的结果为一组值
                    b、子查询的结果为空
               ② 多行子查询
                结果集有多行
                一般搭配多行操作符使用:any、all、in、not in
                in: 属于子查询结果中的任意一个就行
                any和all往往可以用其他查询代替

       

    分页查询:顾名思义,就是将查询结果的显示做出页数上的调整。

    * 语法:
     

    1. select 字段|表达式,...
    2. from
    3. where 条件
    4. group by 分组字段
    5. having 条件
    6. order by 排序的字段
    7. limit 起始的条目索引,条目数;
    8. * 示例:每页显示3条记录
    9. * SELECT * FROM student LIMIT 0,3; -- 第1页
    10. * SELECT * FROM student LIMIT 3,3; -- 第2页
    11. * SELECT * FROM student LIMIT 6,3; -- 第3页


    * 特点:
        1.起始条目索引从0开始

        2.limit子句放在查询语句的最后

        3.公式:select * from  表 limit (page-1)*sizePerPage,sizePerPage
        假如:
            每页显示条目数sizePerPage
            要显示的页数 page

    联合查询:

    * 语法:

    1. select 字段|常量|表达式|函数 fromwhere 条件 unionall
    2. select 字段|常量|表达式|函数 fromwhere 条件 unionall
    3. select 字段|常量|表达式|函数 fromwhere 条件 unionall
    4. .....
    5. select 字段|常量|表达式|函数 fromwhere 条件


    * 特点:
        1、多条查询语句的查询的列数必须是一致的
        2、多条查询语句的查询的列的类型几乎相同
        3、union代表去重,union all代表不去重

    一点小思考:如何不使用max函数查询数据,以最高工资为例:

    方法一:利用排序和分页查询:

    1. SELECT employee_id,salary
    2. FROM employees
    3. ORDER BY salary DESC
    4. LIMIT 1;

    方法二:子查询

    1. SELECT
    2. employee_id,salary
    3. FROM
    4. employees e
    5. WHERE
    6. e.salary NOT IN (
    7. SELECT DISTINCT
    8. a.salary
    9. FROM
    10. employees a
    11. JOIN employees b ON a.salary < b.salary
    12. )

           
           

  • 相关阅读:
    Docker--harbor私有仓库部署与管理
    关于系统/网络运维面试经验总结
    【技术积累】Linux中的命令行【理论篇】【九】
    【开发心得】架构企业OA平台只需3步
    【历史上的今天】6 月 23 日:图灵诞生日;互联网奠基人出生;Reddit 上线
    JDBC编程
    L1926. bfs
    操作教程:EasyDSS如何将MP4点播文件转化成RTSP视频流?
    Polygon zkEVM R1CS与Plonk电路转换
    数据结构与算法(一)
  • 原文地址:https://blog.csdn.net/akisi/article/details/125463872