レコードをクエリする
クエリレコード
クエリを説明する前に、皆さんのためにデータテーブルを用意しました。このテーブルには、銀行の殘高とユーザーに関する基本情報(bào)が保存されます。
money という名前のテーブル構(gòu)造を定義しました。
テーブルを作成するステートメントは次のとおりです:
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;
テーブルの構(gòu)造とデータは次のように表示されます:
注:
殘高は殘高を指します
州は州を指します
基本クエリ
注: "*" は正規(guī)表現(xiàn)であり、すべてに一致することを意味します。上記のクエリ ステートメントは次と同等です。重複レコードのないフィールド 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 | 劉詩(shī)詩(shī) | 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)

條件付きクエリ where
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 | 劉詩(shī)詩(shī) | 456 |
| 9 | 柳巖 | 23.4 |
| 10 | 趙本山 | 3456 |
| 11 | 汪峰 | 34.32 |
| 12 | 郭德綱 | 212 |
+----+-----------+---------+
12 rows in set (0.00 sec)
where比較演算子が後に続く條件は、結(jié)果セット內(nèi)の條件を満たすレコードをリストします。上の例では、where の後に追加されるのはフィールドの「=」です。
さらに、>、<、>=、<=、!=;などの比較演算子も使用できます
論理演算子
mysql> select distinct age deptno from money;
+--------+
| deptno |
+--------+
| 29 |
| 40 |
| 27 |
| 43 |
| 63 |
| 30 |
| 36 |
| 44 |
+--------+
8 rows in set (0.00 sec)
select が出た後で結(jié)果セットを並べ替えるには、order by を使用します。ここで、desc と asc が含まれています。並べ替え順序のキーワード。 desc はフィールドごとに降順でソートすることを意味し、asc は昇順でソートすることを意味します。キーワードが記述されていない場(chǎng)合、デフォルトは昇順でソートします。 mysql> select * from money where age = 29;
+----+-----------+---------+----------+-----+-----+
| id | username | balance | province | age | sex |
+----+-----------+---------+----------+-----+-----+
| 1 | 李文凱 | 120.02 | 湖北 | 29 | 1 |
| 8 | 劉詩(shī)詩(shī) | 456 | 北京 | 29 | 1 |
+----+-----------+---------+----------+-----+-----+
2 rows in set (0.00 sec)
複數(shù)フィールドの並べ替え
order by の後に複數(shù)の異なるフィールドを並べ替えることができます。並べ替えフィールドの値が同じ場(chǎng)合、同じ?jìng)帳虺证磨榨)`ルドの順序も異なります。 2 番目の並べ替えフィールドに従って並べ替えられます。
* 注: 最初のフィールドにすでに結(jié)果が配置されている場(chǎng)合。 2 番目のフィールドの並べ替えフィールドは有効になりません。この場(chǎng)合、2 番目のフィールドは無(wú)効です。 *
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)
結(jié)果セットの制限
クエリまたは並べ替えられた結(jié)果セットについて、すべてではなく一部のみを表示したい場(chǎng)合は、limit キーワードを使用して結(jié)果セットの數(shù)を制限します。
mysql> select id,username, balance from money order by balance desc; +----+-----------+---------+ | id | username | balance | +----+-----------+---------+ | 10 | 趙本山 | 3456 | | 4 | 井柏然 | 810 | | 8 | 劉詩(shī)詩(shī) | 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)
結(jié)果セットを制限して並べ替える
mysql> select id,username, balance from money order by balance desc,age asc; +----+-----------+---------+ | id | username | balance | +----+-----------+---------+ | 10 | 趙本山 | 3456 | | 4 | 井柏然 | 810 | | 8 | 劉詩(shī)詩(shī) | 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)
結(jié)果セットの間隔選択
0番目のレコードから始めて3つのレコードを取るとします。 3 番目から始まるさらに 3 つのレコードを取得したいと考えています。 6番目から4件のレコードを取得したい場(chǎng)合はどうすればよいですか?
現(xiàn)時(shí)點(diǎn)では、結(jié)果セット間隔の選択を使用する必要があります。
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 | 劉詩(shī)詩(shī) | 456 | | 6 | 成龍 | 313 | | 2 | 范冰冰 | 260.23 | +----+-----------+---------+ 5 rows in set (0.00 sec)
以上の考え方により、表示はページングを完了します。
各ページには 10 件のレコードが表示されます:
ページ 1 は制限 0、10
ページ 2 は制限 10、10
ページ 3 は制限 20、10
など... ...
統(tǒng)計(jì)関數(shù)は次のとおりです。 used
1. ユーザーの総數(shù)を知りたい場(chǎng)合はどうすればよいですか?
2. データテーブルで最も裕福な人は誰(shuí)であるかを確認(rèn)するにはどうすればよいですか?
3. ユーザーが費(fèi)やした平均金額を知りたい場(chǎng)合はどうすればよいでしょうか?
4. 全ユーザーの合計(jì)金額を知りたい場(chǎng)合はどうすればよいですか?
最もよく使用される 4 つの統(tǒng)計(jì)関數(shù)があります:
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)
平均金額を確認(rèn)
mysql> select count(id) from money; +-----------+ | count(id) | +-----------+ | 12 | +-----------+ 1 row in set (0.00 sec)
合計(jì)金額を確認(rèn)
mysql> select count(id) as zongshu from money; +---------+ | zongshu | +---------+ | 12 | +---------+ 1 row in set (0.00 sec)
最高金額を確認(rèn)
mysql> select avg(balance) from money; +--------------------+ | avg(balance) | +--------------------+ | 498.24833393096924 | +--------------------+ 1 row in set (0.00 sec)
最低金額を確認(rèn)
mysql> select sum(balance) from money; +-------------------+ | sum(balance) | +-------------------+ | 5978.980007171631 | +-------------------+ 1 row in set (0.00 sec)
グループ別
金額表ではデータを州ごとにグループ化しています。データをグループ化するとわかります。同じ県は削除されます。つまり、プロヴィンスはグループです。
mysql> select max(balance) from money; +--------------+ | max(balance) | +--------------+ | 3456 | +--------------+ 1 row in set (0.00 sec)
統(tǒng)計(jì)グループ化(カテゴリ)合計(jì):
mysql> select min(balance) from money; +--------------------+ | min(balance) | +--------------------+ | 20.149999618530273 | +--------------------+ 1 row in set (0.00 sec)
州の數(shù)を數(shù)えた後、グループ表示
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 | +----+-----------+---------+-----------+-----+-----+
ロールアップを使用したグループ化
に基づく統(tǒng)計(jì)はほとんど使用されません。この知識(shí)ポイントは理解レベルに設(shè)定されています。
その主な機(jī)能は、グループ化されたデータをカウントし、合計(jì)カウントを?qū)g行することです。
上記の統(tǒng)計(jì)に基づいて合計(jì)數(shù)が計(jì)算されると、次の例の結(jié)果では最後に余分な 12 個(gè)の 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)
結(jié)果はフィルタリングされます
having 句は where と似ていますが、どちらも條件を設(shè)定するステートメントです。
having はフィルタリング グループ、 はフィルタリング レコードです。
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 全體を使用する
上記のステートメントでは、特定のステートメントを全體としてではなく、個(gè)別に使用しているだけです。
今度はステートメントを統(tǒng)合し、一度だけ一緒に使用します。 SQL ステートメント全體で使用される構(gòu)文構(gòu)造は次のとおりです。
SELECT
[フィールド 1 [エイリアス 1 として], [関數(shù) (フィールド 2),]...フィールド n]
FROM テーブル名
[WHERE where 條件 ]
[GROUP BY フィールド]
[HAVING where_continition]
[順序條件]
[制限條件]
注: [] は、上記のステートメントのオプションを表すことができます。
最終的な構(gòu)文は次のように要約されます:
全體的な使用を?qū)g行し、マネーテーブルのフィールドをクエリします: ID、ユーザー名、殘高、州 ID>1 の殘高が大きいことが必要です。 50 より大きい場(chǎng)合、その領(lǐng)域はグループ化に使用されます。ユーザーIDを降順に使用し、表示できる項(xiàng)目は3件のみです。
最後に次のように SQL ステートメントを作成すると、クエリの結(jié)果は次のようになります:
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)