SQLメモ(随時更新)

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()に関する注意

  1. group_concatを使用した後、selectで制限を使用すると、機能しなくなります
  2. group_concatを使用してフィールドを接続する場合、長さに制限があります。group_concat_max_lenシステム変数を使用して、許可される最大長を設定してください。SET [セッション|グローバル] group_concat_max_len = val;
  3. システムのデフォルトのセパレータはカンマです

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 '\'

おすすめ

転載: blog.csdn.net/H_X_P_/article/details/107233245