当前位置:   article > 正文

浅谈mysql中子查询_子查询原理

子查询原理

当一个查询是另一个查询的条件时,称之为子查询。子查询可以使用几个简单命令构造功能强大的复合命令。子查询最常用于SELECT-SQL命令的WHERE子句中。子查询是一个 SELECT 语句,它嵌套在一个 SELECT、SELECT…INTO 语句、INSERT…INTO 语句、DELETE 语句、或 UPDATE 语句或嵌套在另一子查询中。

需要用到的表:

account表
这里写图片描述

borrower表
这里写图片描述

branch表
这里写图片描述

customer表
这里写图片描述

depositor表
这里写图片描述

loan表
这里写图片描述


1.嵌套在where中

a.
操作:找出所有同时在本银行中有账号且有贷款的用户名

SQL

SELECT DISTINCT
    customer_name
FROM
    borrower
WHERE
    customer_name IN (
        SELECT
            customer_name
        FROM
            depositor
    );
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

结果:

这里写图片描述

事实上这两个表中的确同时又这三个用户这里写图片描述

这里给出另外一种查询方法:

SELECT DISTINCT
    customer_name 
FROM
    borrower 
WHERE
    EXISTS (
        SELECT
            *
        FROM
            depositor
        WHERE
            depositor.customer_name = borrower.customer_name
    );
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

查询的结果当然是一样的啦。

b.
要找出在”perryridge”支行同时有账户且还有贷款的用户名:

首先我们得找出那个用户在perryridge支行有账户

SQL

SELECT
    customer_name
FROM
    account,
    depositor
WHERE
    account.Account_number = depositor.account_number
AND Branch_name = 'perryridge';
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

hayes这个用户满足条件:
这里写图片描述

这里博主要提醒各位一下在做这个查询的时候一定要先将两个表进行自然连接,然后才进行筛选
也就是必须现有

    account.Account_number = depositor.account_number
  • 1

才能有筛选条件
Branch_name = 'perryridge'

否则的话会产生这样结果:不能拿到我们想要的结果
这里写图片描述

接下来就是找出哪些用户在perryridge这个支行有贷款的
SQL:

SELECT
    customer_name
FROM
    borrower,
    loan
WHERE
    borrower.loan_number = loan.loan_number AND branch_name='perryridge';
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

结果:
这里写图片描述

好了,经过两次查询,我们可以看到满足条件的是用户名为Hayes的用户。那么我们应该如何一步到位拿到查询结果呢?

SQL:

SELECT DISTINCT
    customer_name
FROM
    borrower,
    loan
WHERE
    borrower.loan_number = loan.loan_number
AND branch_name = 'Perryridge'
AND (branch_name, customer_name) IN (
    SELECT
        branch_name,
        customer_name
    FROM
        depositor,
        account
    WHERE
        depositor.account_number = account.account_number
);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

看看查询结果:

这里写图片描述

看这不是得到了查询结果了嘛

细心的人肯定会注意到,这个子查询并没有指明支行名称,这是为什么呢?
因为查询条件中是三个条件的交集!


2. 嵌套在From中

这种子查询也叫做派生查询(Derived Relations)

类似这样的
需求:

找到平均帐户余额超过1200美元的分支机构的平均帐户余额

SELECT
    branch_name,
    avg_balance 
FROM
    (
        SELECT
            branch_name AS branch_name,
            avg(balance) AS avg_balance
        FROM
            account 
        GROUP BY
            branch_name
    ) AS branch_avg  
WHERE
    avg_balance > 500;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

这个SQL语句的意思是:从account这个表中以branch_name来分组,计算每一个分行的平均资产,然后将查询结果重新投影到一个虚拟表(表名叫做branch_avg(branch_name,avg_balance));

查询结果:

这里写图片描述

博主现在所接触到的子查询就只有这两大类了,希望对你有所帮助!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/代码探险家/article/detail/871443
推荐阅读
相关标签
  

闽ICP备14008679号