浅谈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));

查询结果:

这里写图片描述

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

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

相关文章推荐

RSA加密解密及RSA签名和验证

1.RSA加密解密:  (1)获取密钥,这里是产生密钥,实际应用中可以从各种存储介质上读取密钥 (2)加密 (3)解密 2.RSA签名和验证  (1)获取密钥,这里是产生密钥,实际应用中可以从各...

mysql嵌套语句查询

嵌套查询的意思是,一个查询语句(select-from-where)查询语句块可以嵌套在另外一个查询块的where子句中,称为嵌套查询。其中外层查询也称为父查询,主查询。内层查询也称子查询,从查询。 ...

Mysql子查询-select语句嵌套-检索多个表

Mysql的子查询其实就是Select语句的嵌套,用于从多个表格检索数据的情况。 检索订购了TNT2这个商品的所有客户的信息(客户的姓名,联系方式等),通过对数据库的了解,发现这里给定的条件和检索的结...

MySQL 的复合查询或者嵌套查询

MySQL 的复合查询或者嵌套查询,有表两张,要以 clrTheme 表两张为表列,将 clrColor 横向列出,故选择嵌套查询。 create table clrTheme ( clrTh...
  • joyous
  • joyous
  • 2016-06-24 01:30
  • 8725

优化mysql嵌套查询和联表查询

嵌套查询糟糕的优化 在上面我提到过,不考虑特殊的情况,联表查询要比嵌套查询更有效。尽管两条查询表达的是同样的意思,尽管你的计划是告诉服务器要做什么,然后让它决定怎么做,但有时候你非得告诉它改怎么做。...

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

SQLServer子查询可以分为 相关子查询 和 嵌套子查询 两类。前提,假设Books表如下:类编号 图书名 出版社 价格 --------------...

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

SQLServer子查询可以分为 相关子查询 和 嵌套子查询 两类。前提,假设Books表如下:类编号 图书名 出版社 价格 --------------...

MySQL数据高级查询之连接查询、联合查询、子查询

大圣网络 2017-01-31 09:19 连接查询 连接查询: 将多张表(>=2)进行记录的连接(按照某个指定的条件进行数据拼接)。 连接查询的意义: 在用户查看数据的...

C# Java间进行RSA加密解密交互 .

这里,讲一下RSA算法加解密在C#和Java之间交互的问题,这两天纠结了很久,也看了很多其他人写的文章,颇受裨益,但没能解决我的实际问题,终于,还是被我捣鼓出来了。 首先,介绍一下写这代码的目的:完...

mysql update in 嵌套子查询更新

更新该句update punchcard_tblset percheck=3where id in (select id punchcard where id=1) 在 MySQL 命令列工具中传回:...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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