目次
concat()、concat_ws()、group_concat()
concat():複数の文字列を1つの文字列に連結し、接続パラメータによって生成された文字列として結果を返します。パラメータがnullの場合、戻り値はnullです。
SELECT CONCAT(1,',',2,',',3,',',4) result;
演算結果:1、2、3、4
SELECT CONCAT(1,',',NULL,',',3,',',4) result;
演算結果:NULL
concat_ws():(区切り記号付き連結)concat()と同じで、複数の文字列を1つの文字列に連結しますが、区切り文字は一度に指定できます。セパレータがnullの場合、結果はすべてnullです。セパレータの後のパラメータがnullの場合、nullはスキップされます。
SELECT CONCAT_WS(',',1,2,3,4) result;
演算結果:1、2、3、4
SELECT CONCAT_WS(',',1,NULL,3,4) result;
演算結果:1,3,4
SELECT CONCAT_WS(',',1,2,3,4) result;
演算結果:NULL
group_concat():group by queryステートメントで、同じグループ内のデータの複数の行を単一の文字列に連結します。
構文:group_concat([distinct]接続するフィールド[order by sort field asc / desc] [separator'separator '])
説明:重複を使用して値を除外できます。distinctを使用して除外できます。結果の値をソートする場合は、 order by句、区切り文字は文字列値、デフォルトはカンマ。
group_concat()を使用して、スペースを区切り文字として各ユーザーの成績を一覧表示します
SELECT `name`,GROUP_CONCAT(mark SEPARATOR ' ') result
FROM score1 GROUP BY `name`;
group_concat()を使用して、キーと値のペアの形式で全員の成績を一覧表示します
SELECT `name`,GROUP_CONCAT(`subject`,':',mark ORDER BY `subject`) result
FROM score1 GROUP BY `name`;
group_concat()に関する注意:
- group_concatを使用した後、selectで制限を使用すると、機能しなくなります
- group_concatを使用してフィールドを接続する場合、長さに制限があります。group_concat_max_lenシステム変数を使用して、許可される最大長を設定してください。SET [セッション|グローバル] group_concat_max_len = val;
- システムのデフォルトのセパレータはカンマです
COALESCE()、IFNULL()
COALESCE()は主にnull値の処理とそのパラメーター形式に使用されます:COALESCE(expression、value1、value2……、valuen)
COALESCE()関数の最初のパラメーター式はテストされる式で、次のパラメーターは数は不明です。
COALESCE()関数は、式を含むすべてのパラメーターで最初の空でない式を返します。
expressionがnull値でない場合は式を返します。それ以外の場合は、value1がnull値かどうかを判別します。value1がnull値で
ない場合はvalue1を返します。それ以外の場合は、value2がnull値かどうかを判別します。value2がnull値で
ない場合は、value2を返します。
すべての式の場合式がnullの場合、NULLが返されます。
SELECT COALESCE(1,2,3) result1,
COALESCE(NULL,2,3) result2,
COALESCE(NULL,NULL,3) result3;
演算結果:1、2、3
COALESCE()関数は、ほとんどすべてのnull値の処理を完了するために使用できますが、多くのデータベースシステムで簡略化されたバージョンが提供されています。これらの簡略化されたバージョンは、IFNULL()などの2つの変数のみを受け入れます
SELECT IFNULL(NULL,666) result;
実行結果:666
SUM()は複数の列を計算します
SELECT *,SUM( Chinese + Math + English ) sum
FROM score2 GROUP BY `name`
列から行および行から列
列から行、列から行
SELECT `name`,
MAX(IF(`subject`='语文',mark,0)) Chinese,
MAX(IF(`subject`='数学',`mark`,0)) Math,
MAX(IF(`subject`='英语',`mark`,0)) English
FROM score1
GROUP BY `name`;
行から列、行から列
SELECT `name`,'语文' `subject`,Chinese mark FROM score2
UNION
SELECT `name`,'数学' `subject`,Math mark FROM score2
UNION
SELECT `name`,'英语' `subject`,English mark FROM score2
ORDER BY `name`;
DISTINCTおよびGROUP BY変換
次のようなテーブルがあります。idはレコードID、user_idはユーザーIDで、レコードとユーザーの数をカウントします。
DISTINCTのアプローチ
SELECT COUNT(id) sum_id,COUNT(DISTINCT user_id) sum_user FROM t1;
GROUP BYの実践
SELECT sum(sum) sum_id,COUNT(user_id) sum_user FROM (
SELECT user_id,COUNT(1) sum FROM t1 GROUP BY user_id ) temp;
サブクエリの名前
サブクエリの名前を設定する必要があります。設定しない場合、エラーが報告されます。
関連付けられたサブクエリと存在するサブクエリ
SELECT product_type, product_name, sale_price
FROM product t1 WHERE sale_price > (
SELECT avg(sale_price) FROM product t2
WHERE t1.product_type = t2.product_type);
実行ロジックは次のとおりです。
(1)最初に外側のループを実行し、次にproduct _type列の最初の値を取得し、サブクエリを入力し、where句の条件を判断し、一致する場合は平均値を計算して結果を返します。
(2)メインクエリのProductテーブルのproduct _type列のすべてのレコードが取得されるまで、上記の操作を繰り返します。
articleテーブルのデータを見つけますが、uidはuserテーブルに存在している必要があります。SQLステートメントは次のとおりです。
SELECT * FROM article WHERE EXISTS (
SELECT * FROM user WHERE article.uid = user.uid);
メインクエリのデータを条件付き検証のサブクエリに入れ、メインクエリのデータ結果を検証結果に従って保持できるかどうかを決定します(TRUEまたはFALSE、したがって選択は任意です)。
特殊文字に一致するような
escapeは、likeで使用されているエスケープ文字を指定でき、エスケープ文字の後の文字は元の文字と見なされます
select * from table where name like '1\_%' escape '\'
select * from table where name like '%\%%' escape '\'