MySQL:with...as的根本使用

打印 上一主题 下一主题

主题 977|帖子 977|积分 2931


一、概述

with as 语句是SQL中的一种常用语法,它可以为一个查询结果或子查询结果创建一个临时表,并且可以在后续的查询中使用这个临时表,在查询竣事后该临时表就被扫除了。这种语法的使用可以使得复杂的查询变得简单,同时也可以提高查询效率。
版本支持:


  • mysql版本:8以及8以上的
  • sql server:sql server 2005以后的版本
  • oracle:Oracle 9i的第二版本数据库
二、语法

  1. WITH cte_name1[(column_name_list)] AS (inner_query_definition_1)
  2.    [,cte_name2[(column_name_list)] AS (inner_query_definition_2)]
  3. [,...]
  4. outer_query_definition
复制代码
三、案例1:重命名

  1. CREATE TABLE user(
  2.     id INT NOT NULL PRIMARY KEY,
  3.     sex CHAR(3),NAME CHAR(20)
  4. );
  5. INSERT INTO user VALUES
  6. (1,'nan','陈一'),
  7. (2,'nv','珠二'),
  8. (3,'nv','张三'),
  9. (4,'nan','李四'),
  10. (5,'nv','王五'),
  11. (6,'nan','赵六');
  12.   
  13. # 定义CTE,顺便为每列重新命名,且使用ORDER BY子句
  14. WITH nv_user(myid,mysex,myname) AS (
  15.     SELECT * FROM user WHERE sex='nv' ORDER BY id DESC
  16. )
  17. # 使用CTE
  18. SELECT * FROM nv_user;
  19. +------+-------+-------------+
  20. | myid | mysex | myname      |
  21. +------+-------+-------------+
  22. |    5 | nv    | 王五        |
  23. |    3 | nv    | 张三        |
  24. |    2 | nv    | 珠二        |
  25. +------+-------+-------------+
复制代码
三、案例1:简化查询写法

  1. -- 分类表
  2. CREATE TABLE category ( cid VARCHAR ( 32 ) PRIMARY KEY, cname VARCHAR ( 50 ) );
  3. -- 商品表
  4. CREATE TABLE products (
  5.         pid VARCHAR ( 32 ) PRIMARY KEY,
  6.         pname VARCHAR ( 50 ),
  7.         price INT,
  8.         category_id VARCHAR ( 32 ),
  9.         FOREIGN KEY ( category_id ) REFERENCES category ( cid )
  10. );
  11. -- 分类数据
  12. INSERT INTO category(cid,cname) VALUES('c001','家电');
  13. INSERT INTO category(cid,cname) VALUES('c002','鞋服');
  14. INSERT INTO category(cid,cname) VALUES('c003','化妆品');
  15. INSERT INTO category(cid,cname) VALUES('c004','汽车');
  16. -- 商品数据
  17. INSERT INTO products(pid, pname,price,category_id) VALUES('p001','小米电视机',5000,'c001');
  18. INSERT INTO products(pid, pname,price,category_id) VALUES('p002','格力空调',3000,'c001');
  19. INSERT INTO products(pid, pname,price,category_id) VALUES('p003','美的冰箱',4500,'c001');
  20. INSERT INTO products (pid, pname,price,category_id) VALUES('p004','篮球鞋',800,'c002');
  21. INSERT INTO products (pid, pname,price,category_id) VALUES('p005','运动裤',200,'c002');
  22. INSERT INTO products (pid, pname,price,category_id) VALUES('p006','T恤',300,'c002');
  23. INSERT INTO products (pid, pname,price,category_id) VALUES('p007','冲锋衣',2000,'c002');
  24. INSERT INTO products (pid, pname,price,category_id) VALUES('p008','神仙水',800,'c003');
  25. INSERT INTO products (pid, pname,price,category_id) VALUES('p009','大宝',200,'c003');
复制代码
如上图,如果我想查询“家电”中“格力空调”与“美的冰箱”的信息,不用with as写法如下:
  1. select * from category c
  2. left join products p on c.cid = p.category_id
  3. where c.cname = '家电' and p.pname in ('格力空调','美的冰箱');
复制代码
使用with as写法如下:
  1. with c as (select * from category where cname = '家电'),
  2.      p as (select * from products where pname in ('格力空调','美的冰箱'))
  3.      
  4. select * from c,p where c.cid = p.category_id;
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

火影

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表