mysql 常用查询语句

SQL 常用查询语句 | 数学统计 - 众数 中位数 分位值 #

一、常用案例 #

  1. 根据不同条件,更新成不同值
1
2
3
4
5
6
UPDATE Salaries
SET salary = CASE 
	WHEN salary >= 300000  THEN salary * 0.9
	WHEN salary >= 250000 AND salary < 280000 THEN salary * 1.2
	ELSE salary -- 如果这里不标记 salary,会让不满足条件的行变成 null
END;
  1. 更换键值
1
2
3
4
UPDATE SomeTable
SET p_key = CASE 
    WHEN p_key = 'a' THEN 'b' WHEN p_key = 'b' THEN 'a' ELSE p_key END
WHERE p_key IN ('a', 'b');
  1. 索引变更
1
2
DROP INDEX [indexName] ON mytable;
ALTER table tableName ADD INDEX indexName(columnName);

二、删除重复行 #

rowid name price
1 apple 10.1
1
2
3
4
5
DELETE FROM Products P1
WHERE rowid < (
	SELECT MAX(P2.rowid) FROM Products P2 
    WHERE P1.name = P2.name AND P1.price = P2.price
);

三、价格相同的水果位次一致 #

name price
apple 10
banana 10
origin 20
1
2
3
4
5
6
7
SELECT P1.name,
 P1.price,
 (SELECT COUNT(P2.price)
 FROM Products P2
 WHERE P2.price > P1.price) + 1 AS rank_1
 FROM Products P1
ORDER BY rank_1;

四、统计学 #

众数(mode) #

1
2
3
4
SELECT income, COUNT(*) AS cnt
    FROM Graduates
    GROUP BY income
    HAVING COUNT(*) >= ALL ( SELECT COUNT(*) FROM Graduates GROUP BY income);

中位数(median) #

name income
jack 1000

将集合里的元素按照大小分为上半部分(S1)和下半部分(S2)两个子集,同时让这 2 个子集共同拥有集合正中间的元素。这样,共同部分的元素的平均值就是中位数,思路如下所示:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
SELECT AVG(DISTINCT income)
FROM (
    SELECT T1.income
    FROM Graduates T1, Graduates T2
    GROUP BY T1.income
    --S1 的条件
    HAVING SUM(CASE WHEN T2.income >= T1.income THEN 1 ELSE 0 END) >= COUNT(*) / 2
    --S2 的条件
    AND SUM(CASE WHEN T2.income <= T1.income THEN 1 ELSE 0 END) >= COUNT(*) / 2 
) TMP;

分位值(percentile) #

有些数据库会支持类似 approx_percentile 的函数做分位值统计,但 mysql 似乎没有这样的处理函数。

1
2
3
4
SELECT * FROM 
(SELECT t.*,  @row_num :=@row_num + 1 AS row_num FROM YOUR_TABLE t, 
    (SELECT @row_num:=0) counter ORDER BY YOUR_VALUE_COLUMN) 
temp WHERE temp.row_num = ROUND (.95* @row_num); 

sql 风格规范 sql 在线美化 sql 进阶教程