レコードをクエリする

クエリレコード

クエリを説明する前に、皆さんのためにデータテーブルを用意しました。このテーブルには、銀行の残高とユーザーに関する基本情報が保存されます。

money という名前のテーブル構造を定義しました。

テーブルを作成するステートメントは次のとおりです:

CREATE TABLE money (
 id INT NOT NULL AUTO_INCREMENT ,
 username VARCHAR(50) NOT NULL ,
 balance FLOAT NOT NULL , 
 province VARCHAR(20) NOT NULL , 
 age TINYINT UNSIGNED NOT NULL , 
 sex TINYINT NOT NULL , 
 PRIMARY KEY (id(10))
 ) ENGINE = InnoDB CHARACTER SET utf8;

テーブルの構造とデータは次のように表示されます:

QQ截图20161009154618.png

QQ截图20161009154630.png

注:
残高は残高を指します
州は州を指します

基本クエリ

QQ截图20161009154649.png

注: "*" は正規表現であり、すべてに一致することを意味します。上記のクエリ ステートメントは次と同等です。重複レコードのないフィールド unique

mysql> select * from money;
 +----+-----------+---------+-----------+-----+-----+
 | id | username | balance | province | age | sex |
 +----+-----------+---------+-----------+-----+-----+
 | 1 | 李文凯 | 120.02 | 湖北 | 29 | 1 |
 | 2 | 范冰冰 | 260.23 | 山东 | 40 | 0 |
 | 3 | 黄晓明 | 150.86 | 山东 | 40 | 1 |
 | 4 | 井柏然 | 810 | 辽宁 | 27 | 1 |
 | 5 | 李冰冰 | 20.15 | 黑龙江 | 43 | 0 |
 | 6 | 成龙 | 313 | 山东 | 63 | 1 |
 | 7 | 杨幂 | 123 | 北京 | 30 | 0 |
 | 8 | 刘诗诗 | 456 | 北京 | 29 | 1 |
 | 9 | 柳岩 | 23.4 | 湖南 | 36 | 0 |
 | 10 | 赵本山 | 3456 | 辽宁 | 63 | 1 |
 | 11 | 汪峰 | 34.32 | 北京 | 44 | 1 |
 | 12 | 郭德纲 | 212 | 天津 | 43 | 1 |
 +----+-----------+---------+-----------+-----+-----+
 12 rows in set (0.00 sec)
QQ截图20161009154709.png

条件付きクエリ where

QQ截图20161009154725.png

mysql> select id,username, balance from money;
 +----+-----------+---------+
 | id | username | balance |
 +----+-----------+---------+
 | 1 | 李文凯 | 120.02 |
 | 2 | 范冰冰 | 260.23 |
 | 3 | 黄晓明 | 150.86 |
 | 4 | 井柏然 | 810 |
 | 5 | 李冰冰 | 20.15 |
 | 6 | 成龙 | 313 |
 | 7 | 杨幂 | 123 |
 | 8 | 刘诗诗 | 456 |
 | 9 | 柳岩 | 23.4 |
 | 10 | 赵本山 | 3456 |
 | 11 | 汪峰 | 34.32 |
 | 12 | 郭德纲 | 212 |
 +----+-----------+---------+
 12 rows in set (0.00 sec)
where比較演算子が後に続く条件は、結果セット内の条件を満たすレコードをリストします。上の例では、where の後に追加されるのはフィールドの「=」です。

さらに、>、<、>=、<=、!=;などの比較演算子も使用できますQQ截图20161009154741.png

論理演算子

QQ截图20161009154754.png

複数の条件もOKですor や and などの演算子を使用して、複数条件の結合クエリを実行します

mysql> select distinct age deptno from  money;
 +--------+
 | deptno |
 +--------+
 | 29 |
 | 40 |
 | 27 |
 | 43 |
 | 63 |
 | 30 |
 | 36 |
 | 44 |
 +--------+
 8 rows in set (0.00 sec)

結果セットを並べ替えます

QQ截图20161009154833.png

select が出た後で結果セットを並べ替えるには、order by を使用します。ここで、desc と asc が含まれています。並べ替え順序のキーワード。 desc はフィールドごとに降順でソートすることを意味し、asc は昇順でソートすることを意味します。キーワードが記述されていない場合、デフォルトは昇順でソートします。

mysql> select * from money where age = 29;
 +----+-----------+---------+----------+-----+-----+
 | id | username | balance | province | age | sex |
 +----+-----------+---------+----------+-----+-----+
 | 1 | 李文凯 | 120.02 | 湖北 | 29 | 1 |
 | 8 | 刘诗诗 | 456 | 北京 | 29 | 1 |
 +----+-----------+---------+----------+-----+-----+
 2 rows in set (0.00 sec)

複数フィールドの並べ替えQQ截图20161009154905.png

order by の後に複数の異なるフィールドを並べ替えることができます。並べ替えフィールドの値が同じ場合、同じ値を持つフィールドの順序も異なります。 2 番目の並べ替えフィールドに従って並べ替えられます。

QQ截图20161009154934.png

* 注: 最初のフィールドにすでに結果が配置されている場合。 2 番目のフィールドの並べ替えフィールドは有効になりません。この場合、2 番目のフィールドは無効です。 *

mysql> select * from money where id <10 and province='湖北';
 +----+-----------+---------+----------+-----+-----+
 | id | username | balance | province | age | sex |
 +----+-----------+---------+----------+-----+-----+
 | 1 | 李文凯 | 120.02 | 湖北 | 29 | 1 |
 +----+-----------+---------+----------+-----+-----+
 1 row in set (0.00 sec)

結果セットの制限

クエリまたは並べ替えられた結果セットについて、すべてではなく一部のみを表示したい場合は、limit キーワードを使用して結果セットの数を制限します。

QQ截图20161009154951.png

mysql> select id,username, balance from money order by balance desc;
 +----+-----------+---------+
 | id | username | balance |
 +----+-----------+---------+
 | 10 | 赵本山 | 3456 |
 | 4 | 井柏然 | 810 |
 | 8 | 刘诗诗 | 456 |
 | 6 | 成龙 | 313 |
 | 2 | 范冰冰 | 260.23 |
 | 12 | 郭德纲 | 212 |
 | 3 | 黄晓明 | 150.86 |
 | 7 | 杨幂 | 123 |
 | 1 | 李文凯 | 120.02 |
 | 11 | 汪峰 | 34.32 |
 | 9 | 柳岩 | 23.4 |
 | 5 | 李冰冰 | 20.15 |
 +----+-----------+---------+
 12 rows in set (0.00 sec)

結果セットを制限して並べ替える

QQ截图20161009155004.png

mysql> select id,username, balance from money order by balance desc,age asc;
 +----+-----------+---------+
 | id | username | balance |
 +----+-----------+---------+
 | 10 | 赵本山 | 3456 |
 | 4 | 井柏然 | 810 |
 | 8 | 刘诗诗 | 456 |
 | 6 | 成龙 | 313 |
 | 2 | 范冰冰 | 260.23 |
 | 12 | 郭德纲 | 212 |
 | 3 | 黄晓明 | 150.86 |
 | 7 | 杨幂 | 123 |
 | 1 | 李文凯 | 120.02 |
 | 11 | 汪峰 | 34.32 |
 | 9 | 柳岩 | 23.4 |
 | 5 | 李冰冰 | 20.15 |
 +----+-----------+---------+
 12 rows in set (0.00 sec)

結果セットの間隔選択

0番目のレコードから始めて3つのレコードを取るとします。 3 番目から始まるさらに 3 つのレコードを取得したいと考えています。 6番目から4件のレコードを取得したい場合はどうすればよいですか?

現時点では、結果セット間隔の選択を使用する必要があります。

QQ截图20161009155016.png

QQ截图20161009155026.png

mysql> select * from money limit 5;
 +----+-----------+---------+-----------+-----+-----+
 | id | username | balance | province | age | sex |
 +----+-----------+---------+-----------+-----+-----+
 | 1 | 李文凯 | 120.02 | 湖北 | 29 | 1 |
 | 2 | 范冰冰 | 260.23 | 山东 | 40 | 0 |
 | 3 | 黄晓明 | 150.86 | 山东 | 40 | 1 |
 | 4 | 井柏然 | 810 | 辽宁 | 27 | 1 |
 | 5 | 李冰冰 | 20.15 | 黑龙江 | 43 | 0 |
 +----+-----------+---------+-----------+-----+-----+
 5 rows in set (0.00 sec)

3つ目からあと3つどうですか?

mysql> select id,username, balance from money order by balance desc limit 5;
 +----+-----------+---------+
 | id | username | balance |
 +----+-----------+---------+
 | 10 | 赵本山 | 3456 |
 | 4 | 井柏然 | 810 |
 | 8 | 刘诗诗 | 456 |
 | 6 | 成龙 | 313 |
 | 2 | 范冰冰 | 260.23 |
 +----+-----------+---------+
 5 rows in set (0.00 sec)

以上の考え方により、表示はページングを完了します。
各ページには 10 件のレコードが表示されます:

ページ 1 は制限 0、10
ページ 2 は制限 10、10
ページ 3 は制限 20、10

など... ...

統計関数は次のとおりです。 used

1. ユーザーの総数を知りたい場合はどうすればよいですか?

2. データテーブルで最も裕福な人は誰であるかを確認するにはどうすればよいですか?

3. ユーザーが費やした平均金額を知りたい場合はどうすればよいでしょうか?

4. 全ユーザーの合計金額を知りたい場合はどうすればよいですか?

最もよく使用される 4 つの統計関数があります:

QQ截图20161009155039.png

QQ截图20161009155132.png

mysql> select id,username, balance from money limit 0,3;
 +----+-----------+---------+
 | id | username | balance |
 +----+-----------+---------+
 | 1 | 李文凯 | 120.02 |
 | 2 | 范冰冰 | 260.23 |
 | 3 | 黄晓明 | 150.86 |
 +----+-----------+---------+
 3 rows in set (0.00 sec)

フィールドにエイリアスを付けることもできます。 as キーワードを使用します。

mysql> select id,username, balance from money limit 3,3;
 +----+-----------+---------+
 | id | username | balance |
 +----+-----------+---------+
 | 4 | 井柏然 | 810 |
 | 5 | 李冰冰 | 20.15 |
 | 6 | 成龙 | 313 |
 +----+-----------+---------+
 3 rows in set (0.00 sec)

平均金額を確認

mysql> select count(id) from money;
 +-----------+
 | count(id) |
 +-----------+
 | 12 |
 +-----------+
 1 row in set (0.00 sec)

合計金額を確認

mysql> select count(id) as zongshu from money;
 +---------+
 | zongshu |
 +---------+
 | 12 |
 +---------+
 1 row in set (0.00 sec)

最高金額を確認

mysql> select avg(balance) from money;
 +--------------------+
 | avg(balance) |
 +--------------------+
 | 498.24833393096924 |
 +--------------------+
 1 row in set (0.00 sec)

最低金額を確認

mysql> select sum(balance) from money;
 +-------------------+
 | sum(balance) |
 +-------------------+
 | 5978.980007171631 |
 +-------------------+
 1 row in set (0.00 sec)

グループ別

金額表ではデータを州ごとにグループ化しています。データをグループ化するとわかります。同じ県は削除されます。つまり、プロヴィンスはグループです。

QQ截图20161009155147.png

mysql> select max(balance) from money;
 +--------------+
 | max(balance) |
 +--------------+
 | 3456 |
 +--------------+
 1 row in set (0.00 sec)

統計グループ化(カテゴリ)合計:

mysql> select min(balance) from money;
 +--------------------+
 | min(balance) |
 +--------------------+
 | 20.149999618530273 |
 +--------------------+
 1 row in set (0.00 sec)

州の数を数えた後、グループ表示

mysql> select * from money group by province;
 +----+-----------+---------+-----------+-----+-----+
 | id | username | balance | province | age | sex |
 +----+-----------+---------+-----------+-----+-----+
 | 7 | 杨幂 | 123 | 北京 | 30 | 0 |
 | 12 | 郭德纲 | 212 | 天津 | 43 | 1 |
 | 2 | 范冰冰 | 260.23 | 山东 | 40 | 0 |
 | 1 | 李文凯 | 120.02 | 湖北 | 29 | 1 |
 | 9 | 柳岩 | 23.4 | 湖南 | 36 | 0 |
 | 4 | 井柏然 | 810 | 辽宁 | 27 | 1 |
 | 5 | 李冰冰 | 20.15 | 黑龙江 | 43 | 0 |
 +----+-----------+---------+-----------+-----+-----+

ロールアップを使用したグループ化

に基づく統計はほとんど使用されません。この知識ポイントは理解レベルに設定されています。

その主な機能は、グループ化されたデータをカウントし、合計カウントを実行することです。

QQ截图20161009155200.png

QQ截图20161009155215.png

上記の統計に基づいて合計数が計算されると、次の例の結果では最後に余分な 12 個の NULL が存在します。

mysql> select deptno, count(1) from emp group by deptno;
 +--------+----------+
 | deptno | count(1) |
 +--------+----------+
 | 1 | 1 |
 | 2 | 5 |
 | 3 | 1 |
 | 5 | 4 |
 +--------+----------+
 4 rows in set (0.04 sec)

結果はフィルタリングされます

having 句は where と似ていますが、どちらも条件を設定するステートメントです。

having はフィルタリング グループ、 はフィルタリング レコードです。

QQ截图20161009155232.png

mysql> select count(province),province from money group by province;
 +-----------------+-----------+
 | count(province) | province |
 +-----------------+-----------+
 | 3 | 北京 |
 | 1 | 天津 |
 | 3 | 山东 |
 | 1 | 湖北 |
 | 1 | 湖南 |
 | 2 | 辽宁 |
 | 1 | 黑龙江 |
 +-----------------+-----------+
 7 rows in set (0.00 sec)

SQL 全体を使用する

上記のステートメントでは、特定のステートメントを全体としてではなく、個別に使用しているだけです。

今度はステートメントを統合し、一度だけ一緒に使用します。 SQL ステートメント全体で使用される構文構造は次のとおりです。

SELECT
[フィールド 1 [エイリアス 1 として], [関数 (フィールド 2),]...フィールド n]
FROM テーブル名
[WHERE where 条件 ]
[GROUP BY フィールド]
[HAVING where_continition]
[順序条件]
[制限条件]

注: [] は、上記のステートメントのオプションを表すことができます。

最終的な構文は次のように要約されます:

QQ截图20161009155246.png

QQ截图20161009155305.png

全体的な使用を実行し、マネーテーブルのフィールドをクエリします: ID、ユーザー名、残高、州 ID>1 の残高が大きいことが必要です。 50 より大きい場合、その領域はグループ化に使用されます。ユーザーIDを降順に使用し、表示できる項目は3件のみです。

最後に次のように SQL ステートメントを作成すると、クエリの結果は次のようになります:

mysql> select count(province),province from money group by province with rollup;
 +-----------------+-----------+
 | count(province) | province |
 +-----------------+-----------+
 | 3 | 北京 |
 | 1 | 天津 |
 | 3 | 山东 |
 | 1 | 湖北 |
 | 1 | 湖南 |
 | 2 | 辽宁 |
 | 1 | 黑龙江 |
 | 12 | NULL |
 +-----------------+-----------+
 8 rows in set (0.00 sec)


学び続ける
||
<?php echo "Hello Mysql"; ?>
  • おすすめコース
  • コースウェアのダウンロード
現時点ではコースウェアはダウンロードできません。現在スタッフが整理中です。今後もこのコースにもっと注目してください〜