1. ホーム
  2. データベース
  3. マイサク

MySQLにおけるorder byの使用方法の詳細

2022-01-06 18:51:39

1. はじめに

を使用する場合 select ステートメントと組み合わせることができます。 order by でクエリデータをソートすることができます。もし order by で、デフォルトは MySQL は、テーブルへのデータの追加順 (テーブルを修正したり削除したりしたとき) と同じ順番でデータセットを返します。 MySQL がメモリを整理すると、その時点でデータの順番が変わってしまいます)なので、データを順番通りにしたい場合は、ソートの方法を明示的に指定する必要があります。

2. 本体

まず User テーブルを作成します。 DDL とテーブルのデータを以下に示しますので、そのままコピーして使用することができます。

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'primary key',
  `name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT 'username',
  `age` int(11) NOT NULL COMMENT 'age',
  `sex` smallint(6) NOT NULL COMMENT 'gender',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 8 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES (1, 'Li Zixi', 18, 1);
INSERT INTO `user` VALUES (2, 'Zhang San', 22, 1);
INSERT INTO `user` VALUES (3, '李四', 38, 1);
INSERT INTO `user` VALUES (4, '王五', 25, 1);
INSERT INTO `user` VALUES (5, 'Liu Ma Zi', 13, 0);
INSERT INTO `user` VALUES (6, 'Tian Qi', 37, 1);
INSERT INTO `user` VALUES (7, 'Xie Li', 18, 1);

SET FOREIGN_KEY_CHECKS = 1;



初期状態の並び順は以下の通りです。

mysql> select * from user;
+----+--------+-----+-----+
| id | name | age | sex |
+----+--------+-----+-----+
| 1 | Li Zi Hsi | 18 | 1 |
| 2 | Zhang San | 22 | 1 |
| 3 | Li Si | 38 | 1 |
| 4 | Wang Wu | 25 | 1 |
| 5 | Six Pocky | 13 | 0 |
| 6 | Tian Qi | 37 | 1 |
| 7 | Xie Li | 18 | 1 |
+ ----+--------+-----+-----+
7 rows in set (0.00 sec)



2.1 単一の列で並べ替える

まず order by を使用して、1つの列を並べ替えることができます。

要求事項

ユーザーを年齢に応じて昇順に並べ替える。

ステートメントを表示します。

select * from user order by age;



結果

mysql> select * from user order by age;
+----+--------+-----+-----+
| id | name | age | sex |
+----+--------+-----+-----+
| 5 | Six Pocky | 13 | 0 |
| 1 | Li Zi Hei | 18 | 1 |
| 7 | Xie Li | 18 | 1 |
| 2 | Zhang San | 22 | 1 |
| 4 | Wang Wu | 25 | 1 |
| 6 | Tian Qi | 37 | 1 |
| 3 | Li Si | 38 | 1 |
+ ----+--------+-----+-----+
7 rows in set (0.00 sec)



解析する。

と見ることができます。 user の順でテーブルが出力されます。 age が昇順で表示されることから、推測されるのは MySQL デフォルトのソート方法は昇順です。また、ここではワイルドカードの * を使ってすべてのカラムにクエリをかけていますが、明示的にクエリを指定しているわけではありません age カラムがあります。 MySQL order by その後に続くカラムはクエリする必要はありません、例えば select name from user order by age これも同様に機能する。

2.2 複数列での並べ替え

order by 1列のソートだけでなく、複数の列のソートも可能で、ソートが必要な列を順番に以下のように記述するだけです。 order by で完了です。

テストする前に、テーブルに等しい年齢を追加します。

mysql> insert into user (name, age, sex) values ('Li ZiQi', 18, 1);
Query OK, 1 row affected (0.01 sec)



要求事項

ユーザーの年齢で昇順にソートし、さらにユーザー名でソートします。

ステートメント

select * from user order by age, name;



結果

mysql> select * from user order by age, name;
+----+--------+-----+-----+
| id | name | age | sex |
+----+--------+-----+-----+
| 5 | Six Pocky | 13 | 0 |
| 1 | Li Zi H | 18 | 1 |
| 8 | Li Zi Qi | 18 | 1 |
| 7 | Xie Li | 18 | 1 |
| 2 | Zhang San | 22 | 1 |
| 4 | Wang Wu | 25 | 1 |
| 6 | Tian Qi | 37 | 1 |
| 3 | Li Si | 38 | 1 |
+ ----+--------+-----+-----+
8 rows in set (0.00 sec)



解析する。

order by は複数のカラムに作用することができます。 MySQL は、すべて order by その後に続く列の順番はソートされています。ただし MySQL 中国語のソートについては、我々は非常によくわからない場合は、データベースの文字セットのエンコーディングを考慮する必要がある、それは我々がピンインでソート結果を取得する必要がある時間のほとんどは、しばしばそれが満足されていないため、中国語をソートしないようにお勧めします また、我々は年齢と名前がソート方法とされていない後にここにいるので、デフォルトでは、昇順、まず年齢昇順ソートによると、次に名前昇順ソートによるとされています。あなたが降順で使用する必要がある場合は、指定する必要があります。 DESC 例えば select id, name, age from user order by age, name desc; .

2.3 並べ替えの方法

order byには2種類の並べ替えがあります。

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

注意事項 上記でorder byは複数の列をソートすると言いましたが、ソート方法は1つの列に対してのみ機能します。例えば、userテーブルのデータを年齢と名前の両方で降順にする必要がある場合、両方の列に対して降順にするよう指定する必要があります。

mysql> select * from user order by age desc, name desc;
+----+--------+-----+-----+
| id | name | age | sex |
+----+--------+-----+-----+
| 3 | Li Si | 38 | 1 |
| 6 | Tian Qi | 37 | 1 |
| 4 | Wang Wu | 25 | 1 |
| 2 | Zhang San | 22 | 1 |
| 7 | Xie Li | 18 | 1 |
| 8 | Li Zi Qi | 18 | 1 |
| 1 | Li Zi H | 18 | 1 |
| 5 | Six Pocky | 13 | 0 |
+ ----+--------+-----+-----+
8 rows in set (0.00 sec)



のみを指定した場合 age カラムを降順でソートする場合 name カラムが指定されていない場合は MySQL age に従って降順にソートされ、さらに name カラムはデフォルトで昇順にソートされます。

mysql> select * from user order by age desc, name;
+----+--------+-----+-----+
| id | name | age | sex |
+----+--------+-----+-----+
| 3 | Li Si | 38 | 1 |
| 6 | Tian Qi | 37 | 1 |
| 4 | Wang Wu | 25 | 1 |
| 2 | Zhang San | 22 | 1 |
| 1 | Li Zi H | 18 | 1 |
| 8 | Li Zi Qi | 18 | 1 |
| 7 | Xie Li | 18 | 1 |
| 5 | Six Pocky | 13 | 0 |
+ ----+--------+-----+-----+
8 rows in set (0.00 sec)



LiZiHi、LiZiGi、XieLiの3行について、データのソート方法が変わっていることがわかりますね。

2.4 制限付き並び順

order by と組み合わせる limit を使うと、ソートされたデータ行のレコード数を取得することができます。例えば、userテーブルから最も古いユーザーの一人を取得します。同志Li4は38歳で、比較的高齢で、高齢者の中に入っていることがわかります。

mysql> select * from user order by age desc limit 1;
+----+------+-----+-----+
| id | name | age | sex |
+----+------+-----+-----+
| 3 | Li Si | 38 | 1 |
+----+------+-----+-----+
1 row in set (0.00 sec)



limit の後に続く必要があります。 order by 位置が正しくない場合は MySQL は例外メッセージを投げます。

mysql> select * from user limit 1 order by age des;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ' order by age des' at line 1



MySQLでのorder byの使い方についての記事です。MySQL での order by の使用については、Script House の過去の記事を検索するか、引き続き以下の関連記事を参照してください。