MySQLのプロフェッショナルシリーズ - パート8:詳細なソートとページング(ORDER BY&限界)、及びピットの存在

これは最初のシリーズのMysql 8です。

プレゼンテーションmysql5.7.25、CMDコマンド:環境。

シンボルは、オプションの別のいずれかを示し|タグは、[]オプションは、含ま示しています。

この章で

  1. 詳細な注文照会
  2. 詳細な制限
  3. 既存のピット制限
  4. ページングクエリピット

ソートクエリ(ORDER BY)

我々は、我々が行われているデータベースでソート機能を使用することができ、降順での取引量に合わせて、今日の取引注文の全てを見てみたい:の電力供給。

ソート構文:

select 字段名 from 表名 order by 字段1 [asc|desc],字段2 [asc|desc];

ソート必要なフィールドが続いたorder by後、

ASC |プレゼンテーションルールの降順の並べ替え、ASC:昇順、降順:降順、デフォルトはASCです。

これは、コンマ複数のフィールドのソートで区切られたソートフィールド、複数のをサポートしています。

単一のフィールドの並べ替え

mysql> create table test2(a int,b varchar(10));
Query OK, 0 rows affected (0.01 sec)

mysql> insert into test2 values (10,'jack'),(8,'tom'),(5,'ready'),(100,'javacode');
Query OK, 4 rows affected (0.00 sec)
Records: 4  Duplicates: 0  Warnings: 0

mysql> select * from test2;
+------+----------+
| a    | b        |
+------+----------+
|   10 | jack     |
|    8 | tom      |
|    5 | ready    |
|  100 | javacode |
+------+----------+
4 rows in set (0.00 sec)

mysql> select * from test2 order by a asc;
+------+----------+
| a    | b        |
+------+----------+
|    5 | ready    |
|    8 | tom      |
|   10 | jack     |
|  100 | javacode |
+------+----------+
4 rows in set (0.00 sec)

mysql> select * from test2 order by a desc;
+------+----------+
| a    | b        |
+------+----------+
|  100 | javacode |
|   10 | jack     |
|    8 | tom      |
|    5 | ready    |
+------+----------+
4 rows in set (0.00 sec)

mysql> select * from test2 order by a;
+------+----------+
| a    | b        |
+------+----------+
|    5 | ready    |
|    8 | tom      |
|   10 | jack     |
|  100 | javacode |
+------+----------+
4 rows in set (0.00 sec)

マルチフィールドの並べ替え

たとえば、次のように学生テーブル、年齢の高い順に押して生徒の年齢は、昇順で同じ、その後、学生数です:

mysql> create table stu(id int not null comment '学号' primary key,age tinyint not null comment '年龄',name varchar(16) comment '姓名');
Query OK, 0 rows affected (0.01 sec)

mysql> insert into stu (id,age,name) values (1001,18,'路人甲Java'),(1005,20,'刘德华'),(1003,18,'张学友'),(1004,20,'张国荣'),(1010,19,'梁朝伟');
Query OK, 5 rows affected (0.00 sec)
Records: 5  Duplicates: 0  Warnings: 0

mysql> select * from stu;
+------+-----+---------------+
| id   | age | name          |
+------+-----+---------------+
| 1001 |  18 | 路人甲Java    |
| 1003 |  18 | 张学友        |
| 1004 |  20 | 张国荣        |
| 1005 |  20 | 刘德华        |
| 1010 |  19 | 梁朝伟        |
+------+-----+---------------+
5 rows in set (0.00 sec)

mysql> select * from stu order by age desc,id asc;
+------+-----+---------------+
| id   | age | name          |
+------+-----+---------------+
| 1004 |  20 | 张国荣        |
| 1005 |  20 | 刘德华        |
| 1010 |  19 | 梁朝伟        |
| 1001 |  18 | 路人甲Java    |
| 1003 |  18 | 张学友        |
+------+-----+---------------+
5 rows in set (0.00 sec)

エイリアスで並べ替え

mysql> select * from stu;
+------+-----+---------------+
| id   | age | name          |
+------+-----+---------------+
| 1001 |  18 | 路人甲Java    |
| 1003 |  18 | 张学友        |
| 1004 |  20 | 张国荣        |
| 1005 |  20 | 刘德华        |
| 1010 |  19 | 梁朝伟        |
+------+-----+---------------+
5 rows in set (0.00 sec)

mysql> select age '年龄',id as '学号' from stu order by 年龄 asc,学号 desc;
+--------+--------+
| 年龄   | 学号   |
+--------+--------+
|     18 |   1003 |
|     18 |   1001 |
|     19 |   1010 |
|     20 |   1005 |
|     20 |   1004 |
+--------+--------+

機能で並べ替え

学生テーブル(ID:ID、誕生:生年月日、名前:名)、次のように:

mysql> drop table if exists student;
Query OK, 0 rows affected (0.01 sec)

mysql> CREATE TABLE student (
    ->   id int(11) NOT NULL COMMENT '学号',
    ->   birth date NOT NULL COMMENT '出生日期',
    ->   name varchar(16) DEFAULT NULL COMMENT '姓名',
    ->   PRIMARY KEY (id)
    -> );
Query OK, 0 rows affected (0.01 sec)

mysql> insert into student (id,birth,name) values (1001,'1990-10-10','路人甲Java'),(1005,'1960-03-01','刘德华'),(1003,'1960-08-16','张学友'),(1004,'1968-07-01','张国荣'),(1010,'1962-05-16','梁朝伟');
Query OK, 5 rows affected (0.00 sec)
Records: 5  Duplicates: 0  Warnings: 0

mysql>
mysql> SELECT * FROM student;
+------+------------+---------------+
| id   | birth      | name          |
+------+------------+---------------+
| 1001 | 1990-10-10 | 路人甲Java    |
| 1003 | 1960-08-16 | 张学友        |
| 1004 | 1968-07-01 | 张国荣        |
| 1005 | 1960-03-01 | 刘德华        |
| 1010 | 1962-05-16 | 梁朝伟        |
+------+------------+---------------+
5 rows in set (0.00 sec)

要件:誕生年昇順番号順に応じて、番号、生年月日、誕生、名前の年を、チェックアウト2次のように言葉を選びました:

mysql> SELECT id 编号,birth 出生日期,year(birth) 出生年份,name 姓名 from student ORDER BY year(birth) asc,id asc;
+--------+--------------+--------------+---------------+
| 编号   | 出生日期     | 出生年份     | 姓名          |
+--------+--------------+--------------+---------------+
|   1003 | 1960-08-16   |         1960 | 张学友        |
|   1005 | 1960-03-01   |         1960 | 刘德华        |
|   1010 | 1962-05-16   |         1962 | 梁朝伟        |
|   1004 | 1968-07-01   |         1968 | 张国荣        |
|   1001 | 1990-10-10   |         1990 | 路人甲Java    |
+--------+--------------+--------------+---------------+
5 rows in set (0.00 sec)

mysql> SELECT id 编号,birth 出生日期,year(birth) 出生年份,name 姓名 from student ORDER BY 出生年份 asc,id asc;
+--------+--------------+--------------+---------------+
| 编号   | 出生日期     | 出生年份     | 姓名          |
+--------+--------------+--------------+---------------+
|   1003 | 1960-08-16   |         1960 | 张学友        |
|   1005 | 1960-03-01   |         1960 | 刘德华        |
|   1010 | 1962-05-16   |         1962 | 梁朝伟        |
|   1004 | 1968-07-01   |         1968 | 张国荣        |
|   1001 | 1990-10-10   |         1990 | 路人甲Java    |
+--------+--------------+--------------+---------------+
5 rows in set (0.00 sec)

説明:

年機能:日付機能を使用すると、対応する日付の年得ることができる、属します。

上記実施形態では、順序付けの二種類を使用し、第一の機能は、第二の別名ソートの使用で、順に使用されます。

どこソートした後、

次のようにデータがある注文があります。

mysql> drop table if exists t_order;
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> create table t_order(
    ->   id int not null auto_increment comment '订单编号',
    ->   price decimal(10,2) not null default 0 comment '订单金额',
    ->   primary key(id)
    -> )comment '订单表';
Query OK, 0 rows affected (0.01 sec)

mysql> insert into t_order (price) values (88.95),(100.68),(500),(300),(20.88),(200.5);
Query OK, 6 rows affected (0.00 sec)
Records: 6  Duplicates: 0  Warnings: 0

mysql> select * from t_order;
+----+--------+
| id | price  |
+----+--------+
|  1 |  88.95 |
|  2 | 100.68 |
|  3 | 500.00 |
|  4 | 300.00 |
|  5 |  20.88 |
|  6 | 200.50 |
+----+--------+
6 rows in set (0.00 sec)

需要:降順の量でソートクエリ注文量> = 100、データ表示部2、第一カラム:注文番号、注文量、次のように

mysql> select a.id 订单编号,a.price 订单金额 from t_order a where a.price>=100 order by a.price desc;
+--------------+--------------+
| 订单编号     | 订单金额     |
+--------------+--------------+
|            3 |       500.00 |
|            4 |       300.00 |
|            6 |       200.50 |
|            2 |       100.68 |
+--------------+--------------+
4 rows in set (0.00 sec)

制限導入

行の数を制限するための制限は、選択クエリを戻し、等は、一般的にページング動作に使用されます。

構文:

select 列 from 表 limit [offset,] count;

説明:

オフセット:デフォルトは0、0手段が行スキップされ、省略されてもよい、オフセットは、人気のある発言をスキップする行の数であるオフセットを示し、範囲[0、+∞)。

カウント:行のオフセットスキップ開始を取った後、行が取らカウント;範囲:[0、+∞)。

そして、式のオフセット値の上限を使用することはできません数えます。

我々が記載されているの下には、いくつかの一般的な例は、理解を深めます。

最初のn行を取得します。

select 列 from 表 limit 0,n;
或者
select 列 from 表 limit n;

以下のように、二つの記録順以前に取得した例、:

mysql> create table t_order(
    ->   id int not null auto_increment comment '订单编号',
    ->   price decimal(10,2) not null default 0 comment '订单金额',
    ->   primary key(id)
    -> )comment '订单表';
Query OK, 0 rows affected (0.01 sec)

mysql> insert into t_order (price) values (88.95),(100.68),(500),(300),(20.88),(200.5);
Query OK, 6 rows affected (0.01 sec)
Records: 6  Duplicates: 0  Warnings: 0

mysql> select * from t_order;
+----+--------+
| id | price  |
+----+--------+
|  1 |  88.95 |
|  2 | 100.68 |
|  3 | 500.00 |
|  4 | 300.00 |
|  5 |  20.88 |
|  6 | 200.50 |
+----+--------+
6 rows in set (0.00 sec)

mysql> select a.id 订单编号,a.price 订单金额 from t_order a limit 2;
+--------------+--------------+
| 订单编号     | 订单金额     |
+--------------+--------------+
|            1 |        88.95 |
|            2 |       100.68 |
+--------------+--------------+
2 rows in set (0.00 sec)
    
mysql> select a.id 订单编号,a.price 订单金额 from t_order a limit 0,2;
+--------------+--------------+
| 订单编号     | 订单金额     |
+--------------+--------------+
|            1 |        88.95 |
|            2 |       100.68 |
+--------------+--------------+
2 rows in set (0.00 sec)

最大のレコードを取得します

最初の降下量に応じて、その後、最初のレコードを取り、次のように:私たちは、あなたがこれを行うことができ、レコードの受注の最大量を取得する必要があります:

mysql> select a.id 订单编号,a.price 订单金额 from t_order a order by a.price desc;
+--------------+--------------+
| 订单编号     | 订单金额     |
+--------------+--------------+
|            3 |       500.00 |
|            4 |       300.00 |
|            6 |       200.50 |
|            2 |       100.68 |
|            1 |        88.95 |
|            5 |        20.88 |
+--------------+--------------+
6 rows in set (0.00 sec)

mysql> select a.id 订单编号,a.price 订单金额 from t_order a order by a.price desc limit 1;
+--------------+--------------+
| 订单编号     | 订单金额     |
+--------------+--------------+
|            3 |       500.00 |
+--------------+--------------+
1 row in set (0.00 sec)

mysql> select a.id 订单编号,a.price 订单金额 from t_order a order by a.price desc limit 0,1;
+--------------+--------------+
| 订单编号     | 订单金额     |
+--------------+--------------+
|            3 |       500.00 |
+--------------+--------------+
1 row in set (0.00 sec)

メートルの記録にランクnを取得します

私たちは次のように、M-N + 1の記録を取る、その後、N-1記録をスキップする必要があります。

select 列 from 表 limit n-1,m-n+1;

以下のような:私たちは、受注3-5の最高記録量を取得したい、我々は次のように、3つのレコードを取得し、その後、2をスキップする必要があります。

mysql> select a.id 订单编号,a.price 订单金额 from t_order a order by a.price desc;
+--------------+--------------+
| 订单编号     | 订单金额     |
+--------------+--------------+
|            3 |       500.00 |
|            4 |       300.00 |
|            6 |       200.50 |
|            2 |       100.68 |
|            1 |        88.95 |
|            5 |        20.88 |
+--------------+--------------+
6 rows in set (0.00 sec)

mysql> select a.id 订单编号,a.price 订单金额 from t_order a order by a.price desc limit 2,3;
+--------------+--------------+
| 订单编号     | 订单金额     |
+--------------+--------------+
|            6 |       200.50 |
|            2 |       100.68 |
|            1 |        88.95 |
+--------------+--------------+
3 rows in set (0.00 sec)

ページングクエリ

開発プロセス、我々は多くの場合、ページングを使用して、ページングは​​一般的に2つのパラメータを持っています:

ページ:+∞、範囲[1、最初から、最初の数ページを表します)

pageSize:ページあたりのレコード数、範囲[1、+∞)

等:ページ= 2、pageSizeを= 10、P 210は、データの部分を検索します。

私たちは、ページングの制限を使用して、以下のように、構文は次のとおりです。

select 列 from 表名 limit (page - 1) * pageSize,pageSize;

要件は、次のように我々は、すべての注文データを取得するために、1ページ、2ページ、3ページのデータをに、2ページごとに、発注量を降順に従います。

mysql> select a.id 订单编号,a.price 订单金额 from t_order a order by a.price desc;
+--------------+--------------+
| 订单编号     | 订单金额     |
+--------------+--------------+
|            3 |       500.00 |
|            4 |       300.00 |
|            6 |       200.50 |
|            2 |       100.68 |
|            1 |        88.95 |
|            5 |        20.88 |
+--------------+--------------+
6 rows in set (0.00 sec)

mysql> select a.id 订单编号,a.price 订单金额 from t_order a order by a.price desc limit 0,2;
+--------------+--------------+
| 订单编号     | 订单金额     |
+--------------+--------------+
|            3 |       500.00 |
|            4 |       300.00 |
+--------------+--------------+
2 rows in set (0.00 sec)

mysql> select a.id 订单编号,a.price 订单金额 from t_order a order by a.price desc limit 2,2;
+--------------+--------------+
| 订单编号     | 订单金额     |
+--------------+--------------+
|            6 |       200.50 |
|            2 |       100.68 |
+--------------+--------------+
2 rows in set (0.00 sec)

mysql> select a.id 订单编号,a.price 订单金额 from t_order a order by a.price desc limit 4,2;
+--------------+--------------+
| 订单编号     | 订单金额     |
+--------------+--------------+
|            1 |        88.95 |
|            5 |        20.88 |
+--------------+--------------+
2 rows in set (0.00 sec)

ピットステッピング避けます

制限は、式を使用することはできません

mysql> select * from t_order where limit 1,4+1;
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 'limit 1,4+1' at line 1
mysql> select * from t_order where limit 1+0;
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 'limit 1+0' at line 1
mysql>

結論:制限のみバック明確な数値とすることができます。

後者の2つの図は負制限することはできません

mysql> select * from t_order where limit -1;
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 'limit -1' at line 1
mysql> select * from t_order where limit 0,-1;
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 'limit 0,-1' at line 1
mysql> select * from t_order where limit -1,-1;
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 'limit -1,-1' at line 1

ページングピットの並べ替えがあります

データを準備します。

mysql> insert into test1 (b) values (1),(2),(3),(4),(2),(2),(2),(2);
Query OK, 8 rows affected (0.01 sec)
Records: 8  Duplicates: 0  Warnings: 0

mysql> select * from test1;
+---+---+
| a | b |
+---+---+
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
| 4 | 4 |
| 5 | 2 |
| 6 | 2 |
| 7 | 2 |
| 8 | 2 |
+---+---+
8 rows in set (0.00 sec)
    
mysql> select * from test1 order by b asc;
+---+---+
| a | b |
+---+---+
| 1 | 1 |
| 2 | 2 |
| 5 | 2 |
| 6 | 2 |
| 7 | 2 |
| 8 | 2 |
| 3 | 3 |
| 4 | 4 |
+---+---+
8 rows in set (0.00 sec)

ここでは、データを取得するために、2つのデータ・ページを昇順Bに従ってください。

ページ1、ページ2、ページ3、ページ4、データのページ5の順次のSQL、次のように

mysql> select * from test1 order by b asc limit 0,2;
+---+---+
| a | b |
+---+---+
| 1 | 1 |
| 2 | 2 |
+---+---+
2 rows in set (0.00 sec)

mysql> select * from test1 order by b asc limit 2,2;
+---+---+
| a | b |
+---+---+
| 8 | 2 |
| 6 | 2 |
+---+---+
2 rows in set (0.00 sec)

mysql> select * from test1 order by b asc limit 4,2;
+---+---+
| a | b |
+---+---+
| 6 | 2 |
| 7 | 2 |
+---+---+
2 rows in set (0.00 sec)

mysql> select * from test1 order by b asc limit 6,2;
+---+---+
| a | b |
+---+---+
| 3 | 3 |
| 4 | 4 |
+---+---+
2 rows in set (0.00 sec)

mysql> select * from test1 order by b asc limit 7,2;
+---+---+
| a | b |
+---+---+
| 4 | 4 |
+---+---+
1 row in set (0.00 sec)

上記の二つの質問があります。

質問1:同一のデータが得られ、それぞれ、最初の2つのSQL SQLおよび3を見て、3ページ2のデータは、力の無知ではありません。

質問2:わずか8レコードは、5ページのデータはどうなるのか、テーブル全体が、力の無知。

:のは上記の理由を分析してみましょうアップソートする方法がわからない、主に同じ値が存在ソート処理で同じ値bフィールドの存在、無他の照合、mysqlの無知な力を。

私たちの学校のスタンドと同様に、どのように背の高い時間の一種として、ソートの高さに応じて?同じ高さのカオス行。

推奨:同じ種類の現在値、必要に照合順序を指定するために次のように、何の曖昧さは、例えば上記の降順と結合することができるように、この照合に存在しません。

mysql> select * from test1 order by b asc,a desc;
+---+---+
| a | b |
+---+---+
| 1 | 1 |
| 8 | 2 |
| 7 | 2 |
| 6 | 2 |
| 5 | 2 |
| 2 | 2 |
| 3 | 3 |
| 4 | 4 |
+---+---+
8 rows in set (0.00 sec)

mysql> select * from test1 order by b asc,a desc limit 0,2;
+---+---+
| a | b |
+---+---+
| 1 | 1 |
| 8 | 2 |
+---+---+
2 rows in set (0.00 sec)

mysql> select * from test1 order by b asc,a desc limit 2,2;
+---+---+
| a | b |
+---+---+
| 7 | 2 |
| 6 | 2 |
+---+---+
2 rows in set (0.00 sec)

mysql> select * from test1 order by b asc,a desc limit 4,2;
+---+---+
| a | b |
+---+---+
| 5 | 2 |
| 2 | 2 |
+---+---+
2 rows in set (0.00 sec)

mysql> select * from test1 order by b asc,a desc limit 6,2;
+---+---+
| a | b |
+---+---+
| 3 | 3 |
| 4 | 4 |
+---+---+
2 rows in set (0.00 sec)

mysql> select * from test1 order by b asc,a desc limit 8,2;
Empty set (0.00 sec)

以上の結果を参照してください、データが正常である5ページもデータをページング。

概要

  • 昇順、降順::| ... [ASC DESC]によって順序がクエリの結果、ASC並べ替えに使用下降、ASCを| DESCを省略することができ、デフォルトはASCです
  • クエリ結果が返されるの行数を制限するための制限、二つのパラメータ(カウント、オフセット)、オフセットがありますカウント、スキップする行数を示します:行がオフセットの後にカウントがスキップラインを取って表し
  • オフセットを制限するデフォルト値は0であり、省略することができます
  • オフセットを制限し、カウントが0以上である必要があります
  • カウント式のオフセット値の制限は使用できません。
  • ページング、曖昧ではないソートは、あいまいな状況下で秩序のページアウトな結果を引き起こす可能性がある場合は、あなたが戻っての主ソートキーを付加することができます

MySQLのシリーズディレクトリ

  1. 最初の1:MySQLの基本
  2. パート2:詳細なMySQLのデータ型(キー)
  3. パート3:管理者に不可欠なスキル(習得しなければなりません)
  4. パート4:DDL共通の操作
  5. パート5:DML操作の概要(挿入、更新、削除)
  6. 最初の6:SELECTクエリの基本
  7. パート7:楽しい選択クエリ条件、採掘ピットを避けます

約20の記事のMySQLのシリーズは、のように見えるしてください!私は事前にあなたのすべての幸せな中秋節を願って!

おすすめ

転載: www.cnblogs.com/itsoku123/p/11512508.html