MySQL でよく使われる関数とウィンドウ関数の基本的な使い方
1. 基本機能
1. 集計関数:
SELECT COUNT(*) FROM table_name;
: テーブル内の行数をカウントします。SELECT SUM(column_name) FROM table_name;
: テーブル内の指定された列の合計を計算します。SELECT AVG(column_name) FROM table_name;
: テーブル内の指定された列の平均を計算します。SELECT MAX(column_name) FROM table_name;
: テーブル内の指定された列の最大値を返します。SELECT MIN(column_name) FROM table_name;
: テーブル内の指定された列の最小値を返します。
2. 文字列関数:
SELECT CONCAT(first_name, '-', last_name) AS full_name FROM table_name;
:first_name
フィールドとlast_name
フィールドを完全名に連結します。SELECT SUBSTRING(column_name, start_position, length) FROM table_name;
: 指定された位置から指定された長さの部分文字列を抽出します。SELECT LENGTH(column_name) FROM table_name;
: 文字列の長さを返します。SELECT LOWER(column_name) FROM table_name;
:文字列を小文字に変換します。SELECT UPPER(column_name) FROM table_name;
:文字列を大文字に変換します。
3. 日付と時刻の機能
SELECT NOW();
: 現在の日付と時刻を返します。SELECT DATE(column_name) FROM table_name;
:日時値から日付部分を抽出します。SELECT TIME(column_name) FROM table_name;
: 日時値から時刻部分を抽出します。SELECT YEAR(column_name) FROM table_name;
:日付から年を抽出します。SELECT MONTH(column_name) FROM table_name;
:日付から月を抽出します。
# 获取当前日期,当前时间,截取日期,截取时分秒,截取年,截取月,截取日
select curdate() ,now(),date(now()),time(now()) ,year(now()),month(now()),day(now())
DATE_FORMAT() :日期格式化
具体的な用途:
select DATE_FORMAT(CURDATE(), '%Y%m')
select DATE_FORMAT('2023-06-20 19:10:45', '%Y%m')
4. 数値関数
SELECT ABS(column_name) FROM table_name;
: 列の絶対値を返します。SELECT ROUND(column_name, decimal_places) FROM table_name;
: 値を指定された小数点以下の桁数に丸めます。SELECT CEILING(column_name) FROM table_name;
:切り上げ。SELECT FLOOR(column_name) FROM table_name;
:切り捨てます。SELECT MOD(column_name, divisor) FROM table_name;
: 2 つの数値を除算した余りを返します。
5. 条件付き関数
CASE
: 条件に基づいて異なる値を返します。
# CASE 使用和java的 switch 类似
select name,length(name),
case
when length(name) <= 10 then '名字长度太短' #when 条件 then 输出
when length(name) >10 and length(name) <= 20 then '名字长度正常'
else '名字长度过长'
end 'name长度判定' # 列名
from user
COALESCE()
: 最初の非 null 式の値を返します。
# COALESCE 返回第一个非null的值,以此类推,如果都是null才返回null
select coalesce(null,0),coalesce(100,0)
NULLIF(A,B)
: 2 つの式が等しい場合は NULL を返し、それ以外の場合は最初の式の値を返します。
# 如果A=B则返回null,不等于则返回第一个值
select nullif('MySQL','MySQL') as 相等,
nullif('MySQL ','sqlserver ') as 不相等 from user
IF()
:ミキ式と同様に、
# IF() 满足条件则返回值1,不满足则返回值2
select if(1>0 , "张三","ZHANG"),if(1<0 , "张三","ZHANG")
2. 窓関数(OVER)
オーバーの定義
OVER は、行のウィンドウを定義するために使用されます。データをグループ化するために GROUP BY 句を使用せずに、一連の値を操作します。基本行の列と同じ行内の集計された列の両方を返すことができます。
OVER 構文
OVER ( [ PARTITION BY 列 ] [ ORDER BY 列 ] )
PARTITION BY
条項はグループ化されています。
ORDER BY
条項が並べ替えられます。
ウィンドウ関数 OVER() は行のセットを指定し、ウィンドウ関数はウィンドウ関数から出力された結果セット内の各行の値を計算します。
ウィンドウ関数は、GROUP BY を使用せずにデータをグループ化でき、ベース行の列を返し、同時に列を集計することもできます。
OVERの使い方
SUM(),MAX(),MIN,COUNT(),AVG()
OVER ウィンドウ関数は、集計関数または並べ替え関数と一緒に使用する必要があります。集計関数とは、通常、 などの一般的な関数を指します。ソート関数とは一般にRANK(),ROW_NUMBER(),DENSE_RANK(),NTILE()
などを指します。
集計関数での OVER の使用例
例として SUM 関数と COUNT 関数を使用して説明します。
-建立测试表和测试数据
CREATE TABLE Employee
(
ID INT PRIMARY KEY,
Name VARCHAR(20),
GroupName VARCHAR(20),
Salary INT
)
INSERT INTO Employee
VALUES(1,'小明','开发部',8000), (4,'小张','开发部',7600), (5,'小白','开发部',7000), (8,'小王','财务部',5000), (9, null,'财务部',NULL), (15,'小刘','财务部',6000), (16,'小高','行政部',4500), (18,'小王','行政部',4000), (23,'小李','行政部',4500), (29,'小吴','行政部',4700);
SUM後のウィンドウ関数
SELECT *,
SUM(Salary) OVER(PARTITION BY Groupname) 每个组的总工资,
SUM(Salary) OVER(PARTITION BY groupname ORDER BY ID) 每个组的累计总工资,
SUM(Salary) OVER(ORDER BY ID) 累计工资,
SUM(Salary) OVER() 总工资
from Employee
結果は次のとおりです。
それぞれのウィンドウ関数には異なる意味があるので、詳しく説明します。
SUM(Salary) OVER (PARTITION BY Groupname)
PARTITION BY 以降の Groupname 列のみがグループ化され、Salary の合計はグループ化後に計算されます。
SUM(Salary) OVER (PARTITION BY Groupname ORDER BY ID)
PARTITION BY の後に Groupname 列をグループ化し、ORDER BY の後に ID で並べ替えて、グループ内の Salary を累積します。
SUM(Salary) OVER (ORDER BY ID)
ORDER BY以降のID内容のみをソートし、ソートされたSalaryを累積します。
SUM(Salary) OVER ()
給与を要約する
COUNT後の窓関数
SELECT *,
COUNT(*) OVER(PARTITION BY Groupname ) 每个组的个数,
COUNT(*) OVER(PARTITION BY Groupname ORDER BY ID) 每个组的累积个数,
COUNT(*) OVER(ORDER BY ID) 累积个数 ,
COUNT(*) OVER() 总个数
from Employee
返される結果は以下のとおりです。
次の各ウィンドウ開始関数は 1 つずつ解釈されませんが、SUM の後に上記のウィンドウ開始関数と比較できます。
ソート関数での OVER の使用例
4 つの並べ替え機能を 1 つずつ説明します
-先建立测试表和测试数据
WITH t AS
(SELECT 1 StuID,'一班' ClassName,70 Score
UNION ALL
SELECT 2,'一班',85
UNION ALL
SELECT 3,'一班',85
UNION ALL
SELECT 4,'二班',80
UNION ALL
SELECT 5,'二班',74
UNION ALL
SELECT 6,'二班',80
)
SELECT * INTO Scores FROM t;
SELECT * FROM Scores