浅谈mysql中子查询

原创 2016年06月01日 12:52:35

当一个查询是另一个查询的条件时,称之为子查询。子查询可以使用几个简单命令构造功能强大的复合命令。子查询最常用于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
    );

结果:

这里写图片描述

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

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

SELECT DISTINCT
    customer_name 
FROM
    borrower 
WHERE
    EXISTS (
        SELECT
            *
        FROM
            depositor
        WHERE
            depositor.customer_name = borrower.customer_name
    );

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

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

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

SQL

SELECT
    customer_name
FROM
    account,
    depositor
WHERE
    account.Account_number = depositor.account_number
AND Branch_name = 'perryridge';

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

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

    account.Account_number = depositor.account_number

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

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

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

SELECT
    customer_name
FROM
    borrower,
    loan
WHERE
    borrower.loan_number = loan.loan_number AND branch_name='perryridge';

结果:
这里写图片描述

好了,经过两次查询,我们可以看到满足条件的是用户名为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
);

看看查询结果:

这里写图片描述

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

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


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;

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

查询结果:

这里写图片描述

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

版权声明:本文为博主原创文章,未经博主允许不得转载。

mysql查询语句select-子查询

1 子查询定义     在一个表表达中可以调用另一个表表达式,这个被调用的表表达式叫做子查询(subquery),我么也称作子选择(subselect)或内嵌选择(inner select)。子查询...
  • JesseYoung
  • JesseYoung
  • 2014年10月15日 11:41
  • 18569

mysql查询语句select-子查询

1 子查询定义     在一个表表达中可以调用另一个表表达式,这个被调用的表表达式叫做子查询(subquery),我么也称作子选择(subselect)或内嵌选择(inner select)。子查询...
  • JesseYoung
  • JesseYoung
  • 2014年10月15日 11:41
  • 18569

MySQL子查询

子查询 子查询是指在另一个查询语句中的SELECT子句。 例句:SELECT * FROM t1 WHERE col1 = (SELECT col2 FROM t2); 其中,SELECT * F...
  • yuan13826915718
  • yuan13826915718
  • 2016年08月23日 14:51
  • 107

MySQL里面的子查询

一、子查询定义   定义:   子查询允许把一个查询嵌套在另一个查询当中。   子查询,又叫内部查询,相对于内部查询,包含内部查询的就称为外部查询。   子查询可以包含普通se...
  • yw419728
  • yw419728
  • 2017年05月27日 14:34
  • 279

MySQL子查询(一)—— EXISTS与IN

原文:http://www.innomysql.net/article/69.html EXISTS是一个非常强大的谓词,它允许数据库高效地检查指定查询是否产生某些行。通常EXISTS的输入...
  • qiuyepiaoling
  • qiuyepiaoling
  • 2016年01月05日 16:03
  • 605

MYSQL数据库(十一)- 子查询、子查询用到的关键字ANY、SAME、ALL

目录子查询简介、成立条件、三种查询方法一、准备数据二、普通方法算出大于平均商品价格的数据第一步:使用普通的方法来查询商品的平均价格。第二步:使用普通的方法来查询商品的平均价格再进行四舍五入。第三部:我...
  • bobo89455100
  • bobo89455100
  • 2017年06月13日 10:09
  • 734

MySql基本查询、连接查询、子查询、正则表达查询讲解

  • 2017年08月24日 18:38
  • 619KB
  • 下载

mysql子查询

mysql子查询: where子查询、from子查询、exists子查询
  • whereismatrix
  • whereismatrix
  • 2015年12月08日 14:49
  • 449

MySQL在字段中使用select子查询

前几天看别人的代码中看到在字段中使用select子查询的方法,第一次见这种写法,然后研究了一下,记录下来 大概的形式是这样的: select a .*,(select b.* from b where...
  • kankan231
  • kankan231
  • 2015年08月07日 12:53
  • 13433

【mysql】SQL嵌套子查询和相关子查询的执行过程有什么区别(推荐)

SQLServer子查询可以分为 相关子查询 和 嵌套子查询 两类。前提,假设Books表如下:类编号 图书名 出版社 价格 --------------...
  • yanhui_wei
  • yanhui_wei
  • 2014年04月03日 15:11
  • 9869
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:浅谈mysql中子查询
举报原因:
原因补充:

(最多只允许输入30个字)