MochiuWiki : SUSE, EC, PCB
検索
個人用ツール
ログイン
Toggle dark mode
名前空間
ページ
議論
表示
閲覧
ソースを閲覧
履歴を表示
MySQL - ORDER BYのソースを表示
提供: MochiuWiki : SUSE, EC, PCB
←
MySQL - ORDER BY
あなたには「このページの編集」を行う権限がありません。理由は以下の通りです:
この操作は、次のグループのいずれかに属する利用者のみが実行できます:
管理者
、new-group。
このページのソースの閲覧やコピーができます。
== 概要 == <code>ORDER BY</code> 句は、クエリ結果の並び順を指定するために使用される。<br> <br> <code>SELECT</code> 文の末尾に記述し、指定した列の値に基づいて結果セットをソートする。<br> 昇順 (ASC) または降順 (DESC) を指定でき、複数列による多段階ソートも可能である。<br> <br> <code>ORDER BY</code> 句は、単純な列名の指定だけでなく、関数の結果、式、CASE式、列番号、エイリアス等、柔軟な指定方法をサポートしている。<br> また、<code>LIMIT</code> 句と組み合わせることにより、上位N件の取得やページネーションの実装が可能である。<br> <br> パフォーマンスの観点では、インデックスの有無が実行速度に大きく影響する。<br> インデックスを使用できる場合、MySQLはファイルソート (<code>filesort</code>) を回避し、インデックス順で直接データを読み取ることができる。<br> インデックスを使用できない場合は、ソートバッファを使用した <code>filesort</code> が発生し、大量のデータに対してはディスクソートが必要になる場合がある。<br> <br> MySQL 8.0以降では、ウィンドウ関数と組み合わせた高度なソート処理や、インクリメンタルソートバッファ割り当て等の最適化が導入されている。<br> <br><br> == 基本構文 == ==== ORDER BY句の基本形式 ==== ORDER BY句は、SELECT文の末尾に記述する。<br> <br> <syntaxhighlight lang="mysql"> # 基本構文 SELECT column1, column2, ... FROM table_name ORDER BY column [ASC|DESC]; # 昇順ソート (ASC、デフォルト) SELECT name, salary FROM employees ORDER BY salary ASC; # 降順ソート (DESC) SELECT name, salary FROM employees ORDER BY salary DESC; # ASCは省略可能 SELECT name, salary FROM employees ORDER BY salary; </syntaxhighlight> <br> <code>ASC</code> は昇順 (Ascending) を意味し、小さい値から大きい値の順にソートされる。<br> <code>DESC</code> は降順 (Descending) を意味し、大きい値から小さい値の順にソートされる。<br> <br> <code>ASC</code> を指定しない場合、デフォルトで昇順ソートとなる。<br> <br> ==== 複数列によるソート ==== 複数の列を指定することで、多段階のソートが可能である。<br> <br> <syntaxhighlight lang="mysql"> # 複数列によるソート SELECT name, department_id, salary FROM employees ORDER BY department_id ASC, salary DESC; # 最初の列で並び替え、同値の場合は2番目の列で並び替え SELECT product_name, category_id, price FROM products ORDER BY category_id, price DESC; # 3つ以上の列でソート SELECT name, department_id, hire_date, salary FROM employees ORDER BY department_id, hire_date DESC, salary DESC; </syntaxhighlight> <br> 複数列を指定した場合、最初の列でソートし、同値の行については2番目の列でソート、さらに同値の場合は3番目の列でソート、という処理が行われる。<br> <br> 各列ごとに <code>ASC</code> または <code>DESC</code> を個別に指定できる。<br> <br> <syntaxhighlight lang="mysql"> # 各列ごとにソート順を指定 SELECT name, department_id, salary FROM employees ORDER BY department_id ASC, salary DESC; # department_idは昇順、salaryは降順 # 混在も可能 SELECT name, hire_date, salary FROM employees ORDER BY hire_date DESC, salary ASC; # hire_dateは降順、salaryは昇順 </syntaxhighlight> <br><br> == 列番号とエイリアスによるソート == ==== 列番号によるソート ==== ORDER BY句では、SELECT句に記述した列の順序を示す番号 (1から始まる) を指定できる。<br> <br> <syntaxhighlight lang="mysql"> # 列番号によるソート SELECT name, salary FROM employees ORDER BY 2 DESC; # 2番目の列 (salary) で降順ソート # 複数列の指定も可能 SELECT name, department_id, salary FROM employees ORDER BY 2 ASC, 3 DESC; # 2番目の列 (department_id) で昇順、3番目の列 (salary) で降順 </syntaxhighlight> <br> ただし、列番号によるソートは非推奨である。<br> 理由は、SELECT句の列順序が変更されると、ソート対象も意図せず変わってしまうためである。<br> <br> <syntaxhighlight lang="mysql"> # 列番号は非推奨 SELECT name, salary FROM employees ORDER BY 1 DESC; # nameで降順ソート # SELECT句が変更されると、ソート対象も変わる SELECT salary, name FROM employees ORDER BY 1 DESC; # salaryで降順ソート (意図と異なる可能性) </syntaxhighlight> <br> 列名を直接指定する方が、保守性と可読性が高い。<br> <br> ==== エイリアスによるソート ==== SELECT句で定義した列のエイリアス (別名) をORDER BY句で使用できる。<br> <br> <syntaxhighlight lang="mysql"> # エイリアスによるソート SELECT name, salary * 12 AS annual_salary FROM employees ORDER BY annual_salary DESC; # CONCAT関数の結果にエイリアスを付けてソート SELECT CONCAT(first_name, ' ', last_name) AS full_name FROM employees ORDER BY full_name; # 複数のエイリアスを使用 SELECT name, salary * 12 AS annual_salary, YEAR(hire_date) AS hire_year FROM employees ORDER BY hire_year DESC, annual_salary DESC; </syntaxhighlight> <br> エイリアスにバッククォート (`) を使用すると、予約語や特殊文字を含む名前も使用できる。<br> <br> <syntaxhighlight lang="mysql"> # バッククォートを使用したエイリアス SELECT salary * 12 AS `年収` FROM employees ORDER BY `年収` DESC; # 予約語をエイリアスとして使用 SELECT name AS `order` FROM employees ORDER BY `order`; </syntaxhighlight> <br> エイリアスを使用することで、複雑な式をORDER BY句で再記述する必要がなくなり、可読性が向上する。<br> <br><br> == NULLの扱い == ==== NULLの基本的な動作 ==== ORDER BY句では、<code>NULL</code> 値は最小値として扱われる。<br> <br> <syntaxhighlight lang="mysql"> # NULLは最小値扱い SELECT name, salary FROM employees ORDER BY salary ASC; # NULLが最初、次に小さい値から大きい値の順 SELECT name, salary FROM employees ORDER BY salary DESC; # 大きい値から小さい値の順、最後にNULL </syntaxhighlight> <br> <code>ASC</code> (昇順) では、<code>NULL</code> が最初に表示される。<br> <code>DESC</code> (降順) では、<code>NULL</code> が最後に表示される。<br> <br> ==== NULLを最後に配置する方法 ==== NULLを最後に配置したい場合、<code>ISNULL()</code> 関数または <code>IS NULL</code> を使用する方法がある。<br> <br> <syntaxhighlight lang="mysql"> # ISNULL()関数を使用してNULLを最後に配置 SELECT name, salary FROM employees ORDER BY ISNULL(salary) ASC, salary ASC; # ISNULL(salary)は、NULLの場合1、それ以外は0を返す # 0 (非NULL) が最初、1 (NULL) が最後になる # IS NULLを使用した方法 SELECT name, salary FROM employees ORDER BY salary IS NULL, salary ASC; # salary IS NULLは、NULLの場合1、それ以外は0を返す # 降順でNULLを最後に配置 SELECT name, salary FROM employees ORDER BY ISNULL(salary) ASC, salary DESC; </syntaxhighlight> <br> <code>ISNULL(column)</code> は、NULLの場合に <code>1</code>、それ以外の場合に <code>0</code> を返す。<br> この特性を利用して、非NULL値を先にソートし、NULLを最後に配置できる。<br> <br> ==== COALESCE()関数による代替値指定 ==== <code>COALESCE()</code> 関数を使用すると、<code>NULL</code> に代替値を指定してソートできる。<br> <br> <syntaxhighlight lang="mysql"> # COALESCE()で代替値を指定 SELECT name, salary FROM employees ORDER BY COALESCE(salary, 9999999) ASC; # salaryがNULLの場合、9999999として扱われる # NULLを最小値として扱う SELECT name, salary FROM employees ORDER BY COALESCE(salary, 0) DESC; # salaryがNULLの場合、0として扱われる # 文字列の場合 SELECT name, department_name FROM employees ORDER BY COALESCE(department_name, 'ZZZZZ'); # department_nameがNULLの場合、'ZZZZZ'として扱われ、最後に配置される </syntaxhighlight> <br> <code>COALESCE(column, default_value)</code> は、<code>column</code> がNULLの場合に <code>default_value</code> を返す。<br> これにより、NULLを任意の値として扱ってソートできる。<br> <br><br> == 式と関数によるソート == ==== 関数の結果によるソート ==== ORDER BY句では、列名だけでなく、関数の結果でソートすることができる。<br> <br> <syntaxhighlight lang="mysql"> # LENGTH()関数で文字列の長さでソート SELECT name FROM employees ORDER BY LENGTH(name) DESC; # YEAR()関数で年だけを抽出してソート SELECT name, hire_date FROM employees ORDER BY YEAR(hire_date) DESC; # MONTH()関数で月だけを抽出してソート SELECT name, hire_date FROM employees ORDER BY MONTH(hire_date), DAY(hire_date); # UPPER()関数で大文字小文字を無視してソート SELECT name FROM employees ORDER BY UPPER(name); # ABS()関数で絶対値でソート SELECT name, balance FROM accounts ORDER BY ABS(balance) DESC; </syntaxhighlight> <br> 関数を使用することで、データの加工結果に基づいたソートが可能になる。<br> <br> ==== 式によるソート ==== ORDER BY句では、算術演算やその他の式を使用できる。<br> <br> <syntaxhighlight lang="mysql"> # 算術演算の結果でソート SELECT name, salary, bonus FROM employees ORDER BY salary + bonus DESC; # 複数列の演算結果でソート SELECT product_name, price, quantity FROM products ORDER BY price * quantity DESC; # 条件式と組み合わせたソート SELECT name, salary FROM employees ORDER BY salary / 12 DESC; </syntaxhighlight> <br> 式によるソートは、計算結果に基づいた柔軟なソートを実現する。<br> <br> ==== CASE式によるカスタムソート ==== <code>CASE</code> 式を使用すると、カスタムの優先順位でソートできる。<br> <br> <syntaxhighlight lang="mysql"> # CASE式でステータスの優先順位を指定 SELECT order_id, status FROM orders ORDER BY CASE status WHEN 'urgent' THEN 1 WHEN 'processing' THEN 2 WHEN 'pending' THEN 3 WHEN 'completed' THEN 4 ELSE 5 END; # 複数条件での優先順位指定 SELECT name, department_id, salary FROM employees ORDER BY CASE WHEN department_id = 10 THEN 1 WHEN department_id = 20 THEN 2 ELSE 3 END, salary DESC; # NULL値を特定の位置に配置 SELECT name, manager_id FROM employees ORDER BY CASE WHEN manager_id IS NULL THEN 0 ELSE 1 END, manager_id; </syntaxhighlight> <br> <code>CASE</code> 式を使用することで、ビジネスロジックに基づいた任意の順序でソートできる。<br> <br> ==== FIELD()関数による任意順序指定 ==== <code>FIELD()</code> 関数を使用すると、任意の順序でソートできる。<br> <br> <syntaxhighlight lang="mysql"> # FIELD()関数で任意順序を指定 SELECT name, status FROM orders ORDER BY FIELD(status, 'urgent', 'processing', 'pending', 'completed'); # 特定の値を優先的にソート SELECT product_name, category FROM products ORDER BY FIELD(category, 'Electronics', 'Books', 'Clothing'), price; # 任意の値リストでソート SELECT name FROM employees ORDER BY FIELD(department_id, 30, 10, 20); # department_idが30、10、20の順で表示される </syntaxhighlight> <br> <code>FIELD(column, value1, value2, value3, ...)</code> は、<code>column</code> が <code>value1</code> の場合に1、<code>value2</code> の場合に2、という順序番号を返す。<br> これにより、任意の順序でソートできる。<br> <br><br> == LIMITとの組み合わせ == ==== 上位N件の取得 ==== ORDER BY句とLIMIT句を組み合わせることにより、ソート後の上位N件を取得できる。<br> <br> <syntaxhighlight lang="mysql"> # 上位10件の給与を取得 SELECT name, salary FROM employees ORDER BY salary DESC LIMIT 10; # 最新の5件の注文を取得 SELECT order_id, ordered_at FROM orders ORDER BY ordered_at DESC LIMIT 5; # 価格が最も高い商品を取得 SELECT product_name, price FROM products ORDER BY price DESC LIMIT 1; # 最も古い3件のレコードを取得 SELECT name, hire_date FROM employees ORDER BY hire_date ASC LIMIT 3; </syntaxhighlight> <br> <code>LIMIT</code> 句は、ソート後の結果から指定した件数のみを返す。<br> 詳細は、[[MySQL - LIMIT句]]のページを参照すること。<br> <br> ==== ページネーション ==== <code>LIMIT</code> 句と <code>OFFSET</code> を組み合わせることにより、ページネーション (ページ分割) を実装できる。<br> <br> <syntaxhighlight lang="mysql"> # 最初の10件 (ページ1) SELECT name, salary FROM employees ORDER BY salary DESC LIMIT 10 OFFSET 0; # 11件目から20件目 (ページ2) SELECT name, salary FROM employees ORDER BY salary DESC LIMIT 10 OFFSET 10; # 21件目から30件目 (ページ3) SELECT name, salary FROM employees ORDER BY salary DESC LIMIT 10 OFFSET 20; # 一般的な形式 # LIMIT rows OFFSET (page - 1) * rows </syntaxhighlight> <br> ただし、<code>OFFSET</code> を使用したページネーションは、大きなオフセット値に対してパフォーマンスが低下する。<br> MySQLは、オフセット分の行を読み飛ばす必要があるためである。<br> <br> ==== シーク法 (キーセットページネーション) ==== 大量のデータに対するページネーションでは、シーク法 (キーセットページネーション) が推奨される。<br> <br> <syntaxhighlight lang="mysql"> # 最初のページ (通常通り) SELECT id, name, created_at FROM posts ORDER BY id DESC LIMIT 10; # 結果: id = 100, 99, 98, ..., 91 (最後のidは91) # 次のページ (WHERE句で前ページの最後のidより小さいものを取得) SELECT id, name, created_at FROM posts WHERE id < 91 ORDER BY id DESC LIMIT 10; # 結果: id = 90, 89, 88, ..., 81 # さらに次のページ SELECT id, name, created_at FROM posts WHERE id < 81 ORDER BY id DESC LIMIT 10; </syntaxhighlight> <br> シーク法は、インデックスを効率的に使用できるため、大量のデータに対しても高速である。<br> <br> <syntaxhighlight lang="mysql"> # 昇順ソートの場合 SELECT id, name FROM employees WHERE id > 100 ORDER BY id ASC LIMIT 10; # 複合ソートの場合 SELECT id, name, created_at FROM posts WHERE (created_at, id) < ('2024-01-01', 100) ORDER BY created_at DESC, id DESC LIMIT 10; </syntaxhighlight> <br><br> == パフォーマンス最適化 == ==== インデックスによるORDER BY最適化 ==== ORDER BY句で指定した列にインデックスが存在する場合、MySQLはインデックス順でデータを読み取ることができる。<br> これにより、ファイルソート (<code>filesort</code>) を回避し、高速にソートを実行できる。<br> <br> <syntaxhighlight lang="mysql"> # インデックスが使用される例 CREATE INDEX idx_salary ON employees(salary); SELECT name, salary FROM employees ORDER BY salary DESC; # インデックスが使用され、filesortは発生しない # WHERE句とORDER BY句の列が同一インデックスに含まれる場合 CREATE INDEX idx_dept_salary ON employees(department_id, salary); SELECT name, salary FROM employees WHERE department_id = 10 ORDER BY salary DESC; # インデックスが使用され、filesortは発生しない </syntaxhighlight> <br> インデックスを使用できる条件は以下の通りである。<br> <br> * <code>ORDER BY</code> 句の列にインデックスが存在する *: 単一列または複合インデックスの先頭列から順に使用されている。 * <code>WHERE</code> 句と <code>ORDER BY</code> 句の列が同一インデックスに含まれる *: <code>WHERE</code> 句の列とソート列が同一のインデックスに含まれている場合、インデックスのみで処理できる。 * ソート順がインデックスの順序と一致する *: インデックスは昇順で作成されるため、昇順ソートが最も効率的。 <br> ==== filesort (ファイルソート) ==== インデックスを使用できない場合、MySQLはファイルソート (<code>filesort</code>) を実行する。<br> <br> <syntaxhighlight lang="mysql"> # filesortが発生する例 SELECT name, salary FROM employees ORDER BY salary DESC; # salaryにインデックスがない場合、filesortが発生 # 複数列のソートでインデックスが使用できない場合 SELECT name, salary FROM employees ORDER BY department_id, hire_date DESC; # (department_id, hire_date)のインデックスがない場合、filesortが発生 # 関数を使用したソート SELECT name, hire_date FROM employees ORDER BY YEAR(hire_date); # 関数を使用しているため、インデックスが使用できず、filesortが発生 </syntaxhighlight> <br> ファイルソートには、以下に示す3つのアルゴリズムがある。<br> <br> * <code><sort_key, rowid></code> アルゴリズム *: ソートキーと行IDをソートし、ソート後に再度テーブルを読み取る。 * <code><sort_key, additional_fields></code> アルゴリズム *: ソートキーと必要な列を全てソートバッファに格納し、再読み取りを回避する。 * <code><sort_key, packed_additional_fields></code> アルゴリズム *: ソートキーと必要な列を圧縮形式で格納する。最も効率的。 <br> MySQLは、データの特性とソートバッファのサイズに基づいて、最適なアルゴリズムを自動的に選択する。<br> <br> ==== sort_buffer_sizeの調整 ==== <code>sort_buffer_size</code> は、ファイルソート用のメモリバッファサイズを指定する。<br> <br> <syntaxhighlight lang="bash"> # 現在の設定を確認 SHOW VARIABLES LIKE 'sort_buffer_size'; # デフォルト: 256[KB] (262144バイト) # セッション単位で変更 SET SESSION sort_buffer_size = 1048576; # 1[MB]に変更 # グローバルで変更 SET GLOBAL sort_buffer_size = 2097152; # 2[MB]に変更 </syntaxhighlight> <br> <u><code>sort_buffer_size</code> を増やすと、大量のデータをメモリ内でソートできるため、ディスクI/Oを削減できる。</u><br> <u>ただし、各セッションごとにバッファが確保されるため、過度に大きくするとメモリ不足になる可能性がある。</u><br> <br> MySQL 8.0.12以降では、ソートバッファは増分割り当て (incremental allocation) されるため、実際に必要なメモリのみが使用される。<br> <br> ==== EXPLAINでの確認 ==== <code>EXPLAIN</code> を使用して、ORDER BYがインデックスを使用しているか、filesortが発生しているかを確認できる。<br> <br> <syntaxhighlight lang="mysql"> # EXPLAINで実行計画を確認 EXPLAIN SELECT name, salary FROM employees ORDER BY salary DESC; # Extra列に "Using filesort" が表示される場合、filesortが発生している # Extra列に何も表示されない場合、インデックスが使用されている </syntaxhighlight> <br> <code>Extra</code> 列の内容を確認することで、ソート処理の詳細がわかる。<br> <br> * <code>Using filesort</code> *: ファイルソートが発生している。インデックスを使用していない。 * <code>Using index</code> *: インデックスのみで処理が完了している (カバリングインデックス)。 * <code>Using temporary; Using filesort</code> *: 一時テーブルを作成してからファイルソートを実行している。 <br> ==== 最適化のベストプラクティス ==== ORDER BY句のパフォーマンスを最適化するためのベストプラクティスを以下に示す。<br> <br> * ソート列にインデックスを作成する *: 頻繁にソートされる列にはインデックスを作成すべきである。 * 複合インデックスの順序に注意する *: <code>WHERE</code> 句とソート列を含む複合インデックスは、<code>(filter_column, sort_column)</code> の順序で作成する。 * <code>SELECT *</code> を避ける *: 必要な列のみを取得することで、ソートバッファの使用量を削減できる。 * <code>LIMIT</code> 句を使用する *: 上位N件のみが必要な場合、<code>LIMIT</code> 句を使用することで、優先キューソートが使用され、全件ソートを回避できる。 * 大量のデータに対するページネーションではシーク法を使用する *: <code>OFFSET</code> を避け、<code>WHERE</code> 句とインデックスを活用したシーク法を使用する。 <br> <syntaxhighlight lang="mysql"> # 良い例: 必要な列のみを取得 SELECT id, name, salary FROM employees ORDER BY salary DESC LIMIT 10; # 悪い例: SELECT *を使用 SELECT * FROM employees ORDER BY salary DESC LIMIT 10; # ソートバッファに不要な列も格納される # 複合インデックスの作成例 CREATE INDEX idx_dept_salary ON employees(department_id, salary); # インデックスが効率的に使用される SELECT name, salary FROM employees WHERE department_id = 10 ORDER BY salary DESC; </syntaxhighlight> <br><br> == MySQL 8.0以降の機能 == ==== ウィンドウ関数でのORDER BY ==== MySQL 8.0以降では、ウィンドウ関数内で ORDER BYを使用できる。<br> <br> <syntaxhighlight lang="mysql"> # ROW_NUMBER()でランキング付け SELECT name, salary, ROW_NUMBER() OVER (ORDER BY salary DESC) AS salary_rank FROM employees; # RANK()で同順位を考慮したランキング SELECT name, salary, RANK() OVER (ORDER BY salary DESC) AS salary_rank FROM employees; # DENSE_RANK()で連続したランキング SELECT name, salary, DENSE_RANK() OVER (ORDER BY salary DESC) AS salary_rank FROM employees; # パーティション内でのソート SELECT name, department_id, salary, ROW_NUMBER() OVER (PARTITION BY department_id ORDER BY salary DESC) AS dept_rank FROM employees; </syntaxhighlight> <br> ウィンドウ関数を使用することにより、グループごとのランキングや累積計算等が可能になる。<br> <br> ==== GROUP BY ASC/DESC構文の廃止 ==== MySQL 8.0.13以降、GROUP BY句でのASC / DESC構文は廃止された。<br> <br> <syntaxhighlight lang="mysql"> # MySQL 8.0.12以前 (非推奨) SELECT department_id, COUNT(*) FROM employees GROUP BY department_id ASC; # MySQL 8.0.13以降 (エラー) # ERROR: 'GROUP BY ASC/DESC' is not supported # 代わりにORDER BY句を使用 SELECT department_id, COUNT(*) FROM employees GROUP BY department_id ORDER BY department_id ASC; </syntaxhighlight> <br> <code>GROUP BY</code> 句でソートが必要な場合は、明示的に <code>ORDER BY</code> 句を使用する必要がある。<br> <br> ==== インクリメンタルソートバッファ割り当て ==== MySQL 8.0.12以降、ソートバッファは増分割り当て (incremental allocation) される。<br> <br> 以前のバージョンでは、<code>sort_buffer_size</code> で指定されたサイズのバッファが最初に確保されていた。<br> MySQL 8.0.12以降では、実際に必要なサイズのみが段階的に割り当てられるため、メモリ使用量が削減される。<br> <br> これにより、<code>sort_buffer_size</code> を大きな値に設定しても、メモリの無駄が発生しにくくなった。<br> <br><br> {{#seo: |title={{PAGENAME}} : Exploring Electronics and SUSE Linux | MochiuWiki |keywords=MochiuWiki,Mochiu,Wiki,Mochiu Wiki,Electric Circuit,Electric,pcb,Mathematics,AVR,TI,STMicro,AVR,ATmega,MSP430,STM,Arduino,Xilinx,FPGA,Verilog,HDL,PinePhone,Pine Phone,Raspberry,Raspberry Pi,C,C++,C#,Qt,Qml,MFC,Shell,Bash,Zsh,Fish,SUSE,SLE,Suse Enterprise,Suse Linux,openSUSE,open SUSE,Leap,Linux,uCLnux,電気回路,電子回路,基板,プリント基板 |description={{PAGENAME}} - 電子回路とSUSE Linuxに関する情報 | This page is {{PAGENAME}} in our wiki about electronic circuits and SUSE Linux |image=/resources/assets/MochiuLogo_Single_Blue.png }} __FORCETOC__ [[カテゴリ:MySQL]]
MySQL - ORDER BY
に戻る。
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
ツール
リンク元
関連ページの更新状況
特別ページ
ページ情報
We ask for
Donations
Collapse