影刀RPA 影刀中的SQL查询大全:从简单查询到多表联查

影刀RPA 影刀中的SQL查询大全:从简单查询到多表联查

作者:林焱

影刀内置了SQLite指令,但很多新手只会最简单的SELECT *。这篇把RPA场景中最常用的SQL语句整理出来——不是数据库教科书,而是你在写影刀流程时打开就能抄的速查表。

基础查询

-- 查全部SELECT*FROMproducts;-- 查特定列SELECTname,priceFROMproducts;-- 条件筛选SELECT*FROMproductsWHEREprice>100;-- 多条件SELECT*FROMproductsWHEREprice>100ANDstock>0;SELECT*FROMproductsWHEREcategory='数码'ORcategory='家电';![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/1cf08cda066d4f33874624a2d2a7520f.png#pic_center)-- 模糊搜索SELECT*FROMproductsWHEREnameLIKE'%手机%';-- 排序SELECT*FROMproductsORDERBYpriceDESC;-- 降序SELECT*FROMproductsORDERBYsalesASC;-- 升序-- 取前N条SELECT*FROMproductsORDERBYsalesDESCLIMIT10;

聚合统计

-- 计数SELECTCOUNT(*)FROMorders;SELECTcategory,COUNT(*)ascntFROMproductsGROUPBYcategory;-- 求和SELECTSUM(amount)FROMordersWHEREdate>='2024-06-01';-- 平均值SELECTAVG(price)FROMproductsWHEREcategory='数码';-- 最大值/最小值SELECTMAX(price),MIN(price)FROMproducts;[video(video-9wo1KKmt-1784060842079)(type-csdn)(url-https://live.csdn.net/v/embed/526818)(image-https://v-blog.csdnimg.cn/asset/582d14c3bd0451c5399cd990b56e2a0d/cover/Cover0.jpg)(title-拼多多店群自动化报活动上架!)]-- 分组统计(RPA最常用)SELECTcategory,COUNT(*)astotal,AVG(price)asavg_price,SUM(stock)astotal_stockFROMproductsGROUPBYcategoryHAVINGtotal>5-- 只显示商品数大于5的分类ORDERBYtotalDESC;

去重与数据清洗

-- 查重复数据SELECTname,COUNT(*)ascntFROMproductsGROUPBYnameHAVINGcnt>1;-- 去重查询SELECTDISTINCTcategoryFROMproducts;![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/e2c5f6fa5ced4874a728da9dbae284e4.png#pic_center)-- 找NULL值SELECT*FROMproductsWHEREpriceISNULL;SELECT*FROMproductsWHEREdescriptionISNULLORdescription='';-- 替换NULLSELECTname,COALESCE(price,0)aspriceFROMproducts;

多表联查

-- 内连接:只返回两表都匹配的SELECTo.order_id,p.name,o.quantityFROMorders oINNERJOINproducts pONo.product_id=p.id;-- 左连接:返回左表全部,右表没匹配的填NULLSELECTp.name,o.order_idFROMproducts pLEFTJOINorders oONp.id=o.product_id;-- 子查询SELECTname,priceFROMproductsWHEREprice>(SELECTAVG(price)FROMproducts);-- 联合查询(两个表结构相同,上下拼接)SELECTname,priceFROMproducts_2023UNIONALLSELECTname,priceFROMproducts_2024;

数据操作(增删改)

-- 插入INSERTINTOproducts(name,price,stock)VALUES('新产品',99.00,50);-- 批量插入(影刀采完数据后写入)INSERTINTOdaily_sales(date,product,sales)VALUES('2024-06-26','商品A',100),('2024-06-26','商品B',85);-- 更新UPDATEproductsSETprice=129.00WHEREid=1;![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/374b49e370c54d76b1991cc432f87e6f.png#pic_center)-- 条件更新UPDATEproductsSETstock=stock-1WHEREidIN(1,2,3);-- 删除DELETEFROMproductsWHEREstock=0;-- 清空表(保留结构)DELETEFROMtemp_data;

RPA场景常用SQL

-- 增量更新:新数据插入,冲突则更新INSERTORREPLACEINTOproducts(id,name,price)VALUES(1,'商品A',99.00);-- 查今天的记录SELECT*FROMordersWHEREdate=DATE('now');-- 查最近7天SELECT*FROMordersWHEREdate>=DATE('now','-7 days');-- 查本月SELECT*FROMordersWHEREstrftime('%Y-%m',date)=strftime('%Y-%m','now');-- 数据对比:昨天和今天的差异SELECTtoday.product,today.sales-yesterday.salesaschangeFROMdaily_sales todayLEFTJOINdaily_sales yesterdayONtoday.product=yesterday.productANDyesterday.date=DATE('now','-1 days')WHEREtoday.date=DATE('now');

踩坑实录

坑1:SQLite的日期函数和其他数据库不同

MySQL用NOW(),SQLite用DATE('now')DATE_ADD在SQLite中不存在,用DATE('now', '+7 days')

坑2:字符串拼接用 || 而不是 +

SELECT '商品' || name FROM products;对。SELECT '商品' + name会得到数字0。

坑3:SQLite的LIKE默认不区分大小写(英文字母)

TEMU店群矩阵自动化运营核价报活动

WHERE name LIKE 'apple%'能匹配 “Apple” 也匹配 “apple”。但中文字符是区分大小写的(虽然中文没有大小写)。

坑4:sqlite3默认自动提交

影刀的SQLite执行完INSERT/UPDATE/DELETE自动提交,不需要手动commit。但如果用Python的sqlite3模块,每次修改后需要conn.commit()

坑5:大量写入时性能低

SQLite一次INSERT一条在循环里会很慢。用executemany()批量插入,速度提升几十倍:

data=[(1,'A',99),(2,'B',199),...]cursor.executemany("INSERT INTO products VALUES (?,?,?)",data)

写在最后

SQL是RPA数据处理的基本功。90%的数据操作SQL都能搞定,不需要写Python循环去处理列表。掌握上述SQL语句,你就不需要为了"按分类统计"或"查重复数据"去写一堆Python代码了。