Atitit 提升可读性sql subquery udf 子查询 目录 1. 使用udf 和参数@简化join和subquery 1 1.1.1. 子查询分类 1 2. 2.1 按返回结果集分类

Atitit 提升可读性sql subquery udf 子查询

 

 

目录

1. 使用udf 和参数@简化join和subquery 1

1.1.1. 子查询分类 1

2. 2.1 按返回结果集分类 2

2.1.     2.2 按照对返回结果的调用方法 2

2.2. 行子查询实例 3

2.3. 标量子查询实例 3

2.4.   4.6 列子查询实例 in any all 4

 

 

  1. 使用udf 和参数@简化join和subquery

Use in select fld by udf....can not need join,,and enhance readable.

 

 

      1. 子查询分类
        1. 按结果集的行列数不同分为4种
  • 标量子查询(结果集只有一行一列)
  • 列子查询(结果集只有一列多行)
  • 行子查询(结果集有一行多列)
  • 表子查询(结果集一般为多行多列)
        1. 按子查询出现在主查询中的不同位置分
  •  

select后面:仅仅支持标量子查询。

  •  
  •  

from后面:支持表子查询。

  •  
  •  

where或having后面:支持标量子查询(单列单行)、列子查询(单列多行)、行子查询(多列多行)

  •  
  •  

exists后面(即相关子查询):表子查询(多行、多列)

  •  

 

 

  1. 1 按返回结果集分类

        子查询按返回结果集的不同分为4种:表子查询,行子查询,列子查询和标量子查询。

        表子查询:返回的结果集是一个行的集合,N行N列(N>=1)。表子查询经常用于父查询的FROM子句中。

        行子查询:返回的结果集是一个列的集合,一行N列(N>=1)。行子查询可以用于福查询的FROM子句和WHERE子句中。

        列子查询:返回的结果集是一个行的集合,N行一列(N>=1)。

        标量子查询:返回的结果集是一个标量集合,一行一列,也就是一个标量值。可以指定一个标量表达式的任何地方,都可以用一个标量子查询。

 

        从定义上讲,每个标量子查询也是一个行子查询和一个列子查询,反之则不是;每个行子查询和列子查询也是一个表子查询,反之也不是。

 

    1.     2.2 按照对返回结果的调用方法

        子查询按对返回结果集的调用方法,可分为where型子查询,from型子查询及exists型子查询。

        where型子查询:(把内层查询结果当作外层查询的比较条件)

        定义:where型的子查询就是把内层查询的结果当作外层查询的条件。

        from型子查询:(把内层的查询结果供外层再次查询)

        定义:from子查询就是把子查询的结果(内存里的一张表)当作一张临时表,然后再对它进行处理。

        exists型子查询:(把外层查询结果拿到内层,看内层的查询是否成立)

        定义:exists子查询就是对外层表进行循环,再对内表进行内层查询。和in ()差不多,但是它们还是有区别的。主要是看两个张表大小差的程度。若子查询表大则用exists(内层索引),子查询表小则用in(外层索引);

3 使用子查询原则

    1.一个子查询必须放在圆括号中。

    2.将子查询放在比较条件的右边以增加可读性。

    子查询不包含 ORDER BY 子句。对一个 SELECT 语句只能用一个 ORDER BY 子句,并且如果指定了它就必须放在主 SELECT 语句的最后。

    3.在子查询中可以使用两种比较条件:单行运算符(>, =, >=, <, <>, <=) 和多行运算符(IN, ANY, ALL)。

4

————————————————

    1. 行子查询实例

    如:获取和100号球员性别相同并且居住在同一城市的球员号码。

 

mysql> select playerno

from players

where (sex, town) = (

    select sex, town

    from players

    where playerno = 100);

————————————————

    1. 标量子查询实例 

    可以指定一个标量表达式的任何地方,几乎都可以使用一个标量子查询。

    如:获取和27号球员出生在同一年的球员的号码

 

mysql> select playerno

from players

where year(birth_date) =

    (select year(birth_date)

    from players

    where playerno = 27)

and playerno <> 27;

————————————————

    1.   4.6 列子查询实例 in any all

    由于列子查询返回的结果集是 N 行一列,因此不能直接使用 =   >   <   >=   <=   <> 这些比较标量结果的操作符。在列子查询中可以使用 IN、ANY(SOME)和ALL操作符:

    IN:在指定项内,同 IN(项1,项2,…)。

    ANY:与比较操作符联合使用,ANY关键字必须接在一个比较操作符的后面,表示与子查询返回的任何值比较为 TRUE ,则返回 TRUE 。

    SOME:ANY 的别名,较少使用。

    ALL:与比较操作符联合使用,ALL关键字必须接在一个比较操作符的后面,表示与子查询返回的所有值比较都为 TRUE ,则返回 TRUE 。

————————————————

mysql查询语句select-子查询_数据库_jesseyoung-CSDN博客

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值