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テキストシャドウの徐々にぼやける効果の実装

推薦する

CSS3アニメーション属性に基づくWeChatタップアニメーション効果の実装

最近人気のWeChatタップ機能を見て、CSS3アニメーションを見直し、このボックスシェイクアニメー...

Nginx の構成と HTTP 実装コード分析との互換性

OpenSSL を使用して SSL キーと CSR ファイルを生成するHTTPS を設定するには、秘...

Reactでコンポーネントロジックを共有する3つの方法

簡単に説明すると、これら 3 つの方法は、レンダリング プロップ、高階コンポーネント、カスタム フッ...

Jsモジュール化の動作原理とソリューションの詳細な説明

目次1. モジュラーコンセプト2. モジュール化3. モジュール化プロセス1. 通常の記述(グローバ...

ブラウザでのjsのイベントループイベントキューの詳細な説明

目次序文スタックと2つのキューを理解する実行プロセス簡単な例より難しい例要約する序文以下の内容はブラ...

MySQL サブクエリ (ネストされたクエリ)、結合テーブル、複合クエリの詳細な説明

1. サブクエリMySQL 4.1以降はサブクエリをサポートしていますサブクエリ:別のクエリ内にネス...

IE6 で幅と高さがおかしいバグ

図に示すように: しかし、IE6で表示すると、right:1px:になります。 IE6 には、幅と高...

Navicat が MySql サーバーにリモート接続できない問題の解決策

Navicat が MySql サーバーにリモート接続できない問題の解決策は、先頭に書かれています:...

Vue のデータ応答性に関する詳細な理解

目次1. ES 構文のゲッターとセッター2. ES構文でのdefineProperty 3. Vue...

1 行のコードでさまざまな IE 互換性の問題を解決します (IE6-IE10)

x-ua-compatible は、IE ブラウザがページを解析およびコンパイルするためのモデルを...

CentOS7 上で KVM 仮想化プラットフォームを構築する (3 つの方法)

KVM はカーネルベースの仮想マシンの略で、Linux をハイパーバイザーに変換する Linux ...

Vue 折りたたみ表示の複数行テキスト コンポーネントの実装コード

折りたたみ表示の複数行テキストコンポーネント複数行のテキスト コンポーネントを折りたたんで表示し、展...

ウェブページの背景色を制御する CSS コード

誰もが自分の Web ページの背景にふさわしい画像を見つけることに悩むことが多いと思います。これは事...

ウェブデザイナーが知っておくべき効率的なナビゲーションデザインの3つの原則

ウェブサイトのナビゲーションを設計することは、家の基礎を築くようなものです。基礎がしっかりしていなけ...

ウェブデザインと制作におけるハイパーリンクの効果の向上

ハイパーリンクを使用すると、ページからページへ、またはサイトからサイトへ瞬時に移動できます。このよう...