[2024] 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

おすすめ

転載: blog.csdn.net/weixin_52315708/article/details/132324660