点击上方蓝字关注我们
MySQL中的函数和关键字是个庞大的族群,还有很多非常实用的技术,我们将在本篇推送中以实例的方式逐步更新~~在第5期和第9期我们分别梳理了数据处理函数、排名窗口函数、自定义函数和一些高级函数,简单回忆一下:

文本函数:Concat(), Length(), Trim(), Soundex()
日期函数:DateDiff(), Date(), Time()
数值函数:Mod(), Sqrt(), Pi(), Rand()
聚集函数:Sum(), COUNT(), Avg()
排名函数:Rank(), Dense_rank()
其他函数:IF(), IFNULL(), ISNULL(), User()
自定义:CREATE FUNCTION f_n(para) return_type

1
小数函数
-- round(), truncate(), format()USE crashcourse;SELECT order_num, prod_id, quantity, item_price,item_price*quantity AS total_price,round(item_price*quantity, 1) AS total_price1,truncate(item_price*quantity, 1) AS total_price2,format(item_price*quantity, 1) AS total_price3FROM orderitemsWHERE order_num = 20005;

Note:format()函数返回值的数据类型是字符型!
2
窗口函数
-- lag(), lead(), rank(), sum()...SELECT sales_employee, fiscal_year, sale AS 'this_year_sale',lag(sale, 1, 0) over(partition by sales_employee order by fiscal_year) AS 'last_year_sale',lead(sale, 1, 0) over(partition by sales_employee order by fiscal_year) AS 'next_year_sale',Rank() Over(partition by fiscal_year order by sale desc) AS 'ranking_year',sum(sale) over(partition by fiscal_year) AS 'total_year',sum(sale) over(partition by sales_employee) AS 'total_employee'FROM sales;

Note: 窗口函数允许你站在当前行通过“窗口”观察到不在此地的风景!
3
WITH与临时表
-- 创建表 departmentCREATE TABLE department(id INT AUTO_INCREMENT PRIMARY KEY,name varchar(50) NOT NULL);-- 向 department中插入数据INSERT INTO department(name)VALUES('IT'), ('Sales');-- 创建表 employeeCREATE TABLE employee(id int auto_increment,name varchar(50) NOT NULL,salary int NOT NULL,departmentid int NOT NULL,PRIMARY KEY(id));-- 添加外键约束ALTER TABLE employee ADD constraint fk_employee_department FOREIGN KEY (departmentid) REFERENCES department(id);-- 向 employee表中插入数据INSERT INTO employee(name, salary, departmentid)VALUES('Joe',85000, 1),('Henry', 80000, 2),('Sam', 60000, 2),('Max', 90000, 1),('Janet', 69000, 1),('Randy', 85000, 1),('Will', 70000, 1),('Vincent', 70000, 2),('Galary', 55000, 2);
-- 查询每个部门工资前三的员工-- 临时表创建方式1:在FROM子句中用AS关键字封装结果集为临时表,适用于简单查询SELECT department, employee, salary, depart_inner_ranking, depart_outer_rankingFROM(SELECT department.name AS 'department',employee.name AS 'employee',employee.salary AS 'salary',Dense_Rank() Over(PARTITION BY departmentid ORDER BY salary DESC) AS 'depart_inner_ranking',dense_rank() over(ORDER BY salary DESC) AS 'depart_outer_ranking'FROM employee INNER JOIN department ON employee.departmentid = department.id) AS temp_tableWHERE depart_inner_ranking <= 3ORDER BY department ASC, salary DESC;-- 临时表创建方式2(推荐):用WITH...AS()建立临时视图,适用于复杂查询WITH temp_table AS(SELECT department.name AS 'department',employee.name AS 'employee',employee.salary AS 'salary',Dense_Rank() Over(PARTITION BY departmentid ORDER BY salary DESC) AS 'depart_inner_ranking',Dense_Rank() over(ORDER BY salary DESC) AS 'depart_outer_ranking'FROM employee INNER JOIN department ON employee.departmentid = department.id) -- 用WITH封装起来的临时表类似于临时视图SELECT department, employee, salary, depart_inner_ranking, depart_outer_rankingFROM temp_tableWHERE depart_inner_ranking <= 3ORDER BY department ASC, salary DESC;

note: 1、与视图长期存在于数据库服务器不同,临时表的作用域仅为当前语句,执行完毕后临时表随即销毁;2、可以同时在一条SQL语句中建立多个临时表,当需要建立多个临时表或者某临时表需要反复使用时,强烈建议使用WITH,语法:WITH temp_table1 AS(), [temp_table2 AS(), ...] SELECT...
4
数据类型转换
-- CAST(value AS type), convert(value, type)-- type支持的数据类型包括:-- BINARY, CHAR(), DATE, TIME, DATETIME, DECIMAL-- 整型 SIGNED, 无符号整型 UNSIGNEDSELECT CAST('2021-08-28 19:31:00' AS date) AS 'cast1',CAST('2021-08-28 19:31:00' AS time) AS 'cast2',CAST('-2021' AS signed) AS 'cast3',convert('2021', unsigned) AS 'convert1',convert('-2021', decimal(10,2)) AS 'convert2',convert(2021, char(4)) AS 'convert3';

note: 时间日期数据的转换和提取可以通过时间日期处理函数,也可以通过数据类型转换函数完成
未完待续......
分支语句与循环语句的应用:WHILE expr DO 循环体 END WHILE...
用mysql计算常用商业指标:日活、留存率、转化率......
BACKPACK

点击下方名片关注我们




