MySQLにおけるorder byの使用方法の詳細
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 の過去の記事を検索するか、引き続き以下の関連記事を参照してください。
関連
-
MySQLとOracleの一括挿入SQLの汎用的な記述例
-
MysqlからElasticsearchにデータを同期させる方法を説明します。
-
MySQLで正規表現を使う 詳細
-
面接では選択式で聞かれましたが......。.for updateはテーブルをロックするか、行をロックするか?
-
MySQL XAが分散型トランザクションを実装する方法を1記事にまとめました。
-
MySQLデータベースで数百万件のデータを10秒間で挿入
-
MySQLの一般的な分割ライブラリおよび分割テーブルスキームの概要
-
Mysql がエラー 1241 を報告 オペランドは 1 つのカラムを含む必要があります。
-
Mysqlデータベースへのリンク時にpymysqlがConnection refusedエラーを報告する
-
MySQLの起動エラー:ERROR 2003 (HY000)。localhost'上のMySQLサーバーに接続できない(10061)
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
mysqlでインデックスに障害が発生する原因は何ですか?
-
MySQLデータベース・インデックスの左端一致の原則
-
MySQL演算子(and, or, in, not)の具体的な使用方法
-
MySQL サービスとデータベース管理
-
mysqlインデックスが長すぎる特殊なキーが長すぎる解決策
-
[解決済み】MySQLで「すべての派生テーブルは独自のエイリアスを持つ必要があります」というエラーは何ですか?
-
[解決済み] ユニークなテーブル/エイリアスではない
-
MySQLにおけるvarchar型とchar型の違い
-
MySQL 接続タイムアウト。エラー SQLSTATE[HY000] [2002] 接続がタイムアウトしました 解決済み
-
msql クエリでのエラー 'where 節' の不明な列 'yellow fruit'