mysql 专业笔记 -- 第 8 章:使用变量

mysql 专业笔记 -- 第 8 章:使用变量 第 8.1 节设置变量你可以使用SET将变量设置为特定的字符串、数字或日期SETvar_stringmy_var;SETvar_num2;SETvar_date2015-07-20;你可以使用:将变量设置为 SELECT 语句的结果SELECTvar:123;注意当不使用SET语法赋值时你需要使用:因为其他语句如 SELECT、UPDATE中的用于比较所以当你添加冒号后跟等号时表示“这不是比较而是 SET”。你可以使用INTO将变量设置为 SELECT 语句的结果这在需要动态选择要查询的分区时特别有用SETstart_date2015-07-20;SETend_date2016-01-31;-- 获取用作分区名的年月值SETstart_yearmonth(SELECTEXTRACT(YEAR_MONTHFROMstart_date));SETend_yearmonth(SELECTEXTRACT(YEAR_MONTHFROMend_date));-- 将分区放入变量SELECTGROUP_CONCAT(partition_name)FROMinformation_schema.partitionsWHEREtable_namepartitioned_tableANDSUBSTRING_INDEX(partition_name,p,-1)BETWEENstart_yearmonthANDend_yearmonthINTOpartitions;-- 将查询放入变量。你需要这样做因为 MySQL 在那个位置不能识别变量。你需要将变量的值与查询的其余部分拼接然后作为预处理语句执行。SETqueryCONCAT(CREATE TABLE part_of_partitioned_table (PRIMARY KEY(id)) ,SELECT partitioned_table.* ,FROM partitioned_table PARTITION(,partitions,) ,JOIN users u USING(user_id) ,WHERE DATE(partitioned_table.date) BETWEEN ,start_date, AND ,end_date);-- 从 query 准备语句PREPAREstmtFROMquery;-- 删除表如果存在DROPTABLEIFEXISTStech.part_of_partitioned_table;-- 使用语句执行创建表EXECUTEstmt;第 8.2 节在 SELECT 语句中使用变量实现行号和分组假设我们有一个team_person表如下所示[图片占位符]CREATETABLEteam_personASSELECTAteam,JohnpersonUNIONALLSELECTBteam,SmithpersonUNIONALLSELECTAteam,WalterpersonUNIONALLSELECTAteam,LouispersonUNIONALLSELECTCteam,ElizabethpersonUNIONALLSELECTBteam,Wayneperson;要为team_person表添加行号列可以使用以下任一方法SELECTrow_no:row_no1ASrow_number,team,personFROMteam_person,(SELECTrow_no:0)t;或者SETrow_no:0;SELECTrow_no:row_no1ASrow_number,team,personFROMteam_person;以上都会输出以下结果示例----------------------------- | row_number | team | person | ----------------------------- | 1 | A | John | | 2 | A | Walter | | 3 | A | Louis | | 4 | B | Smith | | 5 | B | Wayne | | 6 | C | Elizabeth | -----------------------------最后如果我们想要按team列分组生成行号SELECTrow_no:IF(prev_valt.team,row_no1,1)ASrow_number,prev_val:t.teamASteam,t.personFROMteam_person t,(SELECTrow_no:0)x,(SELECTprev_val:)yORDERBYt.teamASC,t.personDESC;输出结果示例----------------------------- | row_number | team | person | ----------------------------- | 1 | A | Walter | | 2 | A | Louis | | 3 | A | John | | 1 | B | Wayne | | 2 | B | Smith | | 1 | C | Elizabeth | -----------------------------