MySQL での order by の使用に関する詳細

MySQL での order by の使用に関する詳細

1. はじめに

selectステートメントを使用する場合、 order byを組み合わせてクエリされたデータを並べ替えることができます。 order byを使用しない場合、 MySQLによって返されるデータ セットは、デフォルトで基になるテーブルと同じ順序になります。これは、テーブルにデータを追加した順序と一致しない場合があります (テーブルを変更または削除すると、 MySQLメモリをソートし、データの順序が変わります)。したがって、データを順序どおりにしたい場合は、ソート方法を指定する必要があります。

2. 本文

まず、 Userテーブルを準備します。DDL とテーブルDDLは以下のとおりで、そのままコピーして使用できます。

名前を設定します utf8mb4;
FOREIGN_KEY_CHECKS = 0 を設定します。

-- ----------------------------
-- ユーザー用テーブル構造
-- ----------------------------
`user` が存在する場合はテーブルを削除します。
テーブル `user` を作成します (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主キー',
  `name` varchar(255) 文字セット utf8 COLLATE utf8_general_ci NOT NULL COMMENT 'ユーザー名',
  `age` int(11) NOT NULL COMMENT '年齢',
  `sex` smallint(6) NOT NULL COMMENT '性別',
  BTREE を使用した主キー (`id`)
) ENGINE = InnoDB AUTO_INCREMENT = 8 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- ユーザーの記録
-- ----------------------------
`user` に VALUES (1, '李子8', 18, 1) を挿入します。
INSERT INTO `user` VALUES (2, '张三', 22, 1);
`user` VALUES (3, '李四', 38, 1) に INSERT INTO します。
`user` VALUES (4, '王五', 25, 1) に INSERT INTO します。
INSERT INTO `user` VALUES (5, '六麻子', 13, 0);
`user` VALUES (6, '田七', 37, 1) に INSERT INTO します。
`user` VALUES (7, 'Thank you', 18, 1) に INSERT INTO します。

FOREIGN_KEY_CHECKS = 1 を設定します。

データの初期順序は次のとおりです。

mysql> ユーザーから * を選択します。
+----+--------+-----+-----+
| ID | 名前 | 年齢 | 性別 |
+----+--------+-----+-----+
| 1 | プラム 8 | 18 | 1 |
| 2 | 張三 | 22 | 1 |
| 3 | 李思 | 38 | 1 |
| 4 | 王武 | 25 | 1 |
| 5 | 劉麻子 | 13 | 0 |
| 6 | 天斉 | 37 | 1 |
| 7 | ありがとう | 18 | 1 |
+----+--------+-----+-----+
セット内の行数は 7 です (0.00 秒)

2.1 単一列のソート

まず、 order byを使用して 1 つの列を並べ替える方法を見てみましょう。

必要:

ユーザーの年齢を昇順に並べ替えます。

声明:

ユーザーから年齢順に*を選択します。

結果:

mysql> select * from user order by age;
+----+--------+-----+-----+
| ID | 名前 | 年齢 | 性別 |
+----+--------+-----+-----+
| 5 | 劉麻子 | 13 | 0 |
| 1 | プラム 8 | 18 | 1 |
| 7 | ありがとう | 18 | 1 |
| 2 | 張三 | 22 | 1 |
| 4 | 王武 | 25 | 1 |
| 6 | 天斉 | 37 | 1 |
| 3 | 李思 | 38 | 1 |
+----+--------+-----+-----+
セット内の行数は 7 です (0.00 秒)

分析:

userテーブルの出力順がageの昇順でソートされていることがわかりますので、 MySQLデフォルトのソート方法は昇順であると推測できます。さらに、* ワイルドカードを使用してすべての列をクエリし、 age列を明示的に指定していません。実際、 MySQLの order order byに続く列は、 select name from user order by ageのようにクエリする必要はなく、同じ効果が得られます。

2.2 複数の列を並べ替える

order by単一の列を並べ替えるだけでなく、複数の列を並べ替えることもできます。並べ替える列をorder by後に置くだけです。

テストする前に、同じ年齢のデータをテーブルに追加してみましょう。

mysql> insert into user (name, age, sex) values ​​('李子柒', 18, 1);
クエリは正常、1 行が影響を受けました (0.01 秒)

必要:

ユーザーの年齢で昇順、次にユーザー名で並べ替えます。

声明:

年齢、名前でユーザー順序から * を選択します。

結果:

mysql> select * from user order by age, name;
+----+--------+-----+-----+
| ID | 名前 | 年齢 | 性別 |
+----+--------+-----+-----+
| 5 | 劉麻子 | 13 | 0 |
| 1 | プラム 8 | 18 | 1 |
| 8 | 李子奇 | 18 | 1 |
| 7 | ありがとう | 18 | 1 |
| 2 | 張三 | 22 | 1 |
| 4 | 王武 | 25 | 1 |
| 6 | 天斉 | 37 | 1 |
| 3 | 李思 | 38 | 1 |
+----+--------+-----+-----+
セット内の行数は 8 です (0.00 秒)

分析:

order by複数の列に適用でき、 MySQL order by後の列の順序に従って列を完全にソートします。ただし、 MySQLの中国語文字のソートでは、データベースの文字セットのエンコーディングの問題を考慮する必要があります。よく理解していない場合は、中国語文字をソートしないことをお勧めします。ほとんどの場合、ピンインのソート結果を取得する必要がありますが、満足のいく結果が得られないことが多いためです。また、ここでは年齢と名前の後の並べ替え方法がないので、デフォルトは昇順で、最初に年齢の昇順で並べ替え、次に名前の昇順で並べ替えます。降順を使用する必要がある場合は、 DESC指定する必要があります。たとえば、 select id, name, age from user order by age, name desc;

2.3 ソート方法

並べ替えには 2 つの方法があります。

ASC ->昇順で並べ替え(デフォルトの並べ替え方法)
DESC ->降順で並べ替え

注:前述のように、order by は複数の列を並べ替えますが、並べ替え方法は 1 つの列に対してのみ機能します。たとえば、ユーザー テーブル内のデータを年齢と名前の両方で降順で並べ替える必要がある場合は、両方の列に対して降順を指定する必要があります。

mysql> select * from user order by age desc, name desc;
+----+--------+-----+-----+
| ID | 名前 | 年齢 | 性別 |
+----+--------+-----+-----+
| 3 | 李思 | 38 | 1 |
| 6 | 天斉 | 37 | 1 |
| 4 | 王武 | 25 | 1 |
| 2 | 張三 | 22 | 1 |
| 7 | ありがとう | 18 | 1 |
| 8 | 李子奇 | 18 | 1 |
| 1 | プラム 8 | 18 | 1 |
| 5 | 劉麻子 | 13 | 0 |
+----+--------+-----+-----+
セット内の行数は 8 です (0.00 秒)

age列の降順ソートのみを指定し、 name列を指定しない場合、 MySQL ageに基づいてデータを降順でソートし、次にname列に基づいてデフォルトの昇順ソートを実行します。

mysql> select * from user order by age desc, name;
+----+--------+-----+-----+
| ID | 名前 | 年齢 | 性別 |
+----+--------+-----+-----+
| 3 | 李思 | 38 | 1 |
| 6 | 天斉 | 37 | 1 |
| 4 | 王武 | 25 | 1 |
| 2 | 張三 | 22 | 1 |
| 1 | プラム 8 | 18 | 1 |
| 8 | 李子奇 | 18 | 1 |
| 7 | ありがとう | 18 | 1 |
| 5 | 劉麻子 | 13 | 0 |
+----+--------+-----+-----+
セット内の行数は 8 です (0.00 秒)

Li Ziba、Li Ziqi、Xie Liの3行のデータの並び替え方法が変わったことがわかります。

2.4 order by と limit の組み合わせ

order by limitを組み合わせると、ソートされたデータ行レコードの数を取得できます。たとえば、ユーザー テーブルから最も古いユーザーを取得します。李思同志は38歳であり、かなり高齢であり、最年長者の一人であることがわかります。

mysql> select * from user order by age desc limit 1;
+----+------+-----+-----+
| ID | 名前 | 年齢 | 性別 |
+----+------+-----+-----+
| 3 | 李思 | 38 | 1 |
+----+------+-----+-----+
セット内の 1 行 (0.00 秒)

limit order by従う必要があります。位置が正しくない場合、 MySQL例外をスローします。

mysql> select * from user limit 1 order by age des;
エラー 1064 (42000): SQL 構文にエラーがあります。1 行目の 'order by age des' 付近で使用する正しい構文については、MySQL サーバーのバージョンに対応するマニュアルを確認してください。

MySQL での order by の使用に関する詳細についての記事はこれで終わりです。MySQL での order by の使用に関する詳細については、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • MySQL の group by に関する簡単な説明
  • MySQLでインデックスエラーが発生する状況について簡単に説明します
  • MySQLデータベースインデックスの左端一致原則
  • MySQL のインデックス有効条件とインデックス無効条件の結合
  • MySQLの整数および文字列インデックスの無効化または暗黙的な変換に関する簡単な説明
  • Windows/Mac で Docker を使用して MySQL (utf8 を含む) をインストールする
  • mysql5.7のインストールとNavicateの長期無料利用の実施手順
  • GinとMySQLを使ったシンプルなRestfulスタイルAPIの実装例を詳細に解説
  • MySQL での正規表現の使用に関する詳細

<<:  20個のJavaScriptワンラインコードを共有する

>>:  CSSテキストシャドウの徐々にぼやける効果の実装

推薦する

Mac インストール mysqlclient プロセス分析

仮想環境で pip 経由でインストールしてみてください: pip で mysqlclient をイン...

ウェブページでグレーまたはブラックモードを実現するための CSS3 フィルターコード

フロントエンドcss3 フィルターは、Web ページのグレー効果を実現できるだけでなく、ナイト モー...

最も完全な 50 の MySQL データベース クエリ演習

このデータベース クエリ ステートメントは、インターネット上の 50 個のデータベース クエリ練習問...

HTML の相対パス (Relative Path) と絶対パス (Absolute Path) の詳細な理解

私は 1 年以上 Java Web 開発に携わっており、HTML または JSP ページの作成は避け...

JavaScriptにおける評価戦略の詳細な説明

目次それを覆う栗パラメータの受け渡し値渡し共同配送要約する拡張機能 - 遅延評価私は最近、JavaS...

Vueは小さなカウントダウン機能を実装します

多くのプロジェクトでは、検証コードの送信など、カウントダウン機能を実装する必要があります。ここで、簡...

シンプルなウェブ計算機を実装するJavaScript

背景私は新しいプロジェクト チームに配属されたので、プロジェクトでは js を使用する必要があります...

MySQLパーティションテーブルの詳細な説明

序文:パーティショニングはテーブル設計パターンです。一般的に、テーブル パーティショニングとは、条件...

Windows 10 で Ubuntu 20.04 LTS をアップデートする方法

2020 年 4 月 23 日、本日、Windows 上の Ubuntu 20.04 では、Ubun...

プロジェクトにおけるVue3のロジック抽出とフィールド表示についての簡単な説明

目次論理階層化異なる地域から事業を分離するこれを実行する利点このようなシナリオにどう対処するか最適化...

Vue3 トランジションアニメーションの落とし穴記録について

目次背景問題の場所さらなる分析要約する背景私のコース「Vue 3 エンタープライズレベルの音楽アプリ...

Vue プラグイン エラー: このページで Vue.js が検出されました。問題は解決しました

Vue プラグインがエラーを報告しました: このページで Vue.js が検出されましたVueプラグ...

Vue カプセル化コンポーネント アップロード画像コンポーネント

この記事の例では、参考のためにvueアップロード画像コンポーネントの具体的なコードを共有しています。...

nginx keepaliveの具体的な使い方

http1.1 プロトコルのデフォルトのリクエスト ヘッダーでは、図に示すように、デフォルトで ke...

JS の toFixed() メソッドの丸め精度の問題の詳細な説明

目次落とし穴充填方法何の穴ですか?要約する落とし穴最近、仕事で商品の割引価格を計算すると、いつも1セ...