Mysql中通用表达式WITH AS语句的使用实例代码

目录
  • 一、WITH AS 的含义
  • 二、WITH AS 的含使用
  • 三、WITH AS 的作用
  • 补充:使用with as应该注意
  • 总结

一、WITH AS 的含义

使用with as 可以让子查询重用相同的with查询块,并在select查询块中直接引用,一般用在select查询块会多次使用某个查询sql时,会把这个sql语句放在with as 中,作为公用的表达式,通过别名的方式在主查询语句中重复使用。

二、WITH AS 的含使用

现有两张表cust_info_detail(客户信息表,表中三个字段,id、name、sex)、order_info_detail(订单详情表,表中3个字段,order_id、order_time、cid,其中cid关联客户信息表中的id),现在要统计某天(作为查询入参)中每个用户下单的数量以及客户的相关信息,如果用户当天没有下单,显示下单数为0。

使用语法:
WITH 
(SELECT语句) AS 别名1,
 (SELECT语句) AS 别名2,
 ...
 SELECT  * FROM 别名1,别名2 WHERE 别名1.id = 别名2.id;

说明:下面这个SELECT * FROM 别名1,别名2 WHERE 别名1.id = 别名2.id;是主查询语句,可以调用上面定义好的select公用表达式
,需要注意的是主语句不仅仅局限于查询语句,也可以是更新或者删除和插入语句。

WITH
(SELECT id,name FROM cust_info_detail GROUP BY id) AS cust_info,
(SELECT cid, COUNT(order_id) as num FROM order_info_detail WHERE order_time = $datadt$ GROUP BY cid) AS order_num
SELECT
	  t.name   AS '客户姓名'
	 ,t.sex	   AS '客户性别'
	 ,IF(t1.num IS NULL, 0, t1.num)   AS '客户下单数'
	FROM cust_info t
	LEFT JOIN order_num t1 ON t.id = t1.cid

三、WITH AS 的作用

1.定义一个sql片断,该sql片断会被整个sql语句所用到,简化sql,提高可读性

2.with子查询只执行一次,将结果存储在用户临时表空间中,可以引用多次,增强性能

补充:使用with as应该注意

1 with as后面必须紧跟使用CTE(Common table Express--公用表) (with as)的语句

with  a as
(
select * from tb1
)
select * from tb2,a where a.id=tb1.id(就是这个)

2 多个CTE 之间加,分割

with t1 as
(
select * from t1
),(第一个CTE)
t2 as
(
select * from t2
),(第二个CTE)
t3 as
(
select * from t3
)(第三个CTE)

总结

到此这篇关于Mysql中通用表达式WITH AS语句使用的文章就介绍到这了,更多相关Mysql通用表达式WITH AS语句内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 图文详解mysql中with...as用法

    最近无意中接触到了一篇文章,里面写了一个SQL的用法,是with...as,中午抽空记录一下 用MySQL试了一下,发现并不支持该语法(版本:5.7) 于是换作以下(版本:8.0)不会报错: 总结一下with的用法,类似生成一个临时的表,和如下红框里的操作并无异样 感觉是个鸡肋语法...翻遍了mysql文档也没找到该语法到底是哪个版本开始支持的 更新大佬的原理链接---> MariaDB表表达式(2):CTE - 骏马金龙 总结 到此这篇关于mysql中with...as用法的文章就介绍到这了,

  • Mysql中通用表达式WITH AS语句的使用实例代码

    目录 一.WITH AS 的含义 二.WITH AS 的含使用 三.WITH AS 的作用 补充:使用with as应该注意 总结 一.WITH AS 的含义 使用with as 可以让子查询重用相同的with查询块,并在select查询块中直接引用,一般用在select查询块会多次使用某个查询sql时,会把这个sql语句放在with as 中,作为公用的表达式,通过别名的方式在主查询语句中重复使用. 二.WITH AS 的含使用 现有两张表cust_info_detail(客户信息表,表中三个

  • MySQL中一条SQL查询语句是如何执行的

    目录 前言 1. 处理连接 1.1 客户端和服务端的通信方式 1.1.1 TCP/IP协议 1.1.2 UNIX域套接字 1.1.3 命名管道和共享内存 1.2 权限验证 1.3 查看MySQL连接 2. 解析与优化 2.1 查询缓存 2.2 解析器 & 预处理器(Parser & Preprocessor) 2.2.1 词法解析 2.2.2 语法分析 2.2.3 预处理器 2.3 查询优化器(Optimizer)与查询执行计划 2.3.1 什么是查询优化器? 2.3.2 优化器究竟做了什

  • 分析mysql中一条SQL查询语句是如何执行的

    目录 一.MySQL 逻辑架构概览 二.连接器(Connector) 三.查询缓存(Query Cache) 四.解析器(Parser) 五.优化器(Optimizer) 六.执行器 七.小结 一.MySQL 逻辑架构概览 MySQL 最重要.最与众不同的特性就是它的可插拔存储引擎架构(pluggable storage engine architecture),这种架构的设计将查询处理及其他系统任务和数据的存储/提取分离开来.来看官网的解释: The MySQL pluggable stora

  • MySQL中如何优化order by语句

    order by 查询语句使用也是非常频繁,有时候数据量大了会发现排序查询很慢,本文就介绍一下 MySQL 是如何进行排序的,以及如何利用其原理来优化 order by 语句. 建立一张表: CREATE TABLE `cc4` ( `id` INT(11) NOT NULL, `user_name` VARCHAR(16) NOT NULL, `job` VARCHAR(16) NOT NULL, `company` VARCHAR(16) DEFAULT NULL, PRIMARY KEY

  • iOS 中根据屏幕宽度自适应分布按钮的实例代码

    下载demo链接:https://github.com/MinLee6/buttonShow.git 屏幕摆放的控件有两种方式,一种根据具体内容变化,一种根据屏幕宽度变化. 下面我分别将两个方式,用代码的方式呈现: 1:根据具体内容变化 // // StyleOneViewController.m // buttonShow // // Created by limin on 15/06/15. // Copyright © 2015年 信诺汇通信息科技(北京)有限公司. All rights

  • Android开发中通过手机号+短信验证码登录的实例代码

    首先,需要一个电话号码,目前很多账户都是将账户名设置成手机号,然后点击按钮获取手机验证码. 其次,你需要后台给你手机短信的验证接口,各个公司用的不一样,这个身为前端,不需要你来考虑,你只要让你后台给你写好接口,你直接调用就好了. activity_login.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.andr

  • iOS中只让textField使用键盘通知的实例代码

    代码: #import "ViewController.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. //为textField增加键盘事件 [[NSNotificati

  • java的Map集合中按value值进行排序输出的实例代码

    java的Map集合中按value值进行排序输出的实例代码 import java.util.Arrays; import java.util.Comparator; import java.util.HashMap; import java.util.Map; import java.util.Set; public class Test { public static void main(String[] args) { Map<String ,Integer> map = new Has

  • C++中vector可以作为map的键值实例代码

    因为项目中需要根据状态找到一个对应的结果,就采用了map的结构,但是状态本身较为复杂,存在一个vector中.上次使用map的经验是自定义类类型作为键值必须重载<操作符,因为map的快速查找是基于红黑树的构建,因而键值必须能相互之间比较.所以担心vector作为类类型的键值会引发一些错误,就写了一个例子测试.结果证明vector可以直接作为map的键值使用. #include<iostream> #include<string> #include<vector>

  • JavaScript中实现无缝滚动、分享到侧边栏实例代码

    废话不多说,直接给大家贴代码了,代码解决一起问题! 下面一段代码给大家介绍js无缝滚动实例代码: 代码如下所示: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml&

随机推荐