MySQLのselect、distinct、limitの使い方
1. はじめに
このブログは、非常に基本的なものになり、もしあれば
MySQL
の経験をお持ちの方、このブログの理由は、初心者の方です。ここでは、selectを使って、指定したテーブルの単一列、複数列、全列を表示する方法について説明します。
まず、以下のような構造のテーブルを用意します。
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) NOT NULL COMMENT 'user name',
`age` int(11) NOT NULL COMMENT 'age',
`sex` smallint(6) NOT NULL COMMENT 'gender',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;
テーブルデータは以下のとおりです。
INSERT INTO `user` VALUES (1, '李子捌', 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);
SET FOREIGN_KEY_CHECKS = 1;
ただし
MySQL4.1
データベースキーワードは完全に大文字小文字を区別します。データベース名、テーブル名、カラム名はデフォルトで大文字小文字を区別しませんが、変更することも可能です(推奨しません)。
2. 選択
2.1 単一のカラムへのクエリ
まず
use
で、操作対象となるデータベースを指定します。
mysql> use liziba;
Database changed
次に
select
から
user
テーブル
name
カラムになります。
select
カラム名の直後には
from
の後にテーブル名が続きます。
select column_name from table_name;
mysql> select name from user;
+--------+
| name
+--------+
| LiZiHi |
| Zhang San |
| Li Si
|Wang Wu
|Six
|Tian Qi
+--------+
6 rows in set (0.00 sec)
2.2 複数カラムのクエリ
複数列の問い合わせと単一列の問い合わせの違いは、selectの直後に複数の列名をカンマで区切って指定することです。
select column_name1,column_name2,column_name3 from table_name;
mysql> select name,age from user;
+--------+-----+
| name | age |
+--------+-----+
| name | age | ++
| Zhang San | 22 |
| Li Si | 38 |
| | name
| The Sixth Pony | 13 |
| The following are the names of the following
+--------+-----+
6 rows in set (0.00 sec)
2.3 すべてのカラムを問い合わせる
すべてのカラムを問い合わせるには2つの方法があります。1つ目は、上記の2つから派生した方法で、すべてのカラム名をリストアップする方法です。
mysql> select id,name,age,sex 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 |
+ ----+--------+-----+-----+
6 rows in set (0.00 sec)
2つ目は、一部のプログラマが最もよく使う、次のような文です。
SQL
は、テーブルのすべてのカラムの代わりに *** ワイルドカード *** を使用します。
select * from table_name;
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 |
+ ----+--------+-----+-----+
6 rows in set (0.00 sec)
ヒント はプログラマにとって大きな禁忌です。もし、あるテーブルのすべてのカラムを取得する必要がなく、そのテーブルのカラム名が移植されている場合は、query all the dataを使うべきでなく、データベースカラムクエリを指定することで、クエリのパフォーマンスを向上させることができます。
3.区別する
カラムの値が重複していないデータを照会する必要がある場合は、次のようにします。
distinct
キーワードで重複を解除します。
上のテーブルに、新しいデータをデータで挿入します。
age
がプラムエイトと同じになると
sex
も同じです。
mysql> insert into user (name, age, sex) values('thank you', 18, 1);
Query OK, 1 row affected (0.01 sec)
この時点で、ageカラムの値が等しいことがわかります。
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)
この時点で
user
テーブルの中のユーザーの年齢を確認します。そのためには
distinct
キーワードを、重複を排除する必要があるカラムの前に適用します。
mysql> select distinct age from user;
+ -----+
| age |
+-----+
| 18 | | age
| 22 |
| The age of the child is not a factor.
| The following are some of the most important issues that need to be addressed
| The following are some examples of the types of information that can be found in the following tables
| The following table shows the number of students who have been trained in the field.
+-----+
6 rows in set (0.00 sec)
ここで注意すべきは、以下の問題です。
その
distinct
キーワード重複排除は、以下の場合、すべてのフィールドで機能します。
distinct
キーワードの後に複数のフィールドが続く場合、どのフィールドも同じ値でなければ重複していないとみなされます。
例えば
user
はテーブル内に存在しません。
age
,
name
が同時に重複していない場合。
distinct
キーワードが有効でないのではなく、存在そのものがないのです。
mysql> select distinct age,name from user;
+ -----+--------+
| age | name |
+-----+--------+
| 18 | LiZiHi |
| 22 | Zhang San |
| 38 | Li Si |
| 25 | Wang Wu
| 13 | Six Pocky
| 37 | Tian Qi
| 18 | Xie Li |
+-----+--------+
7 rows in set (0.00 sec)
もし
distinct
キーワードの後に、値が等しくないフィールドが続く場合、そのフィールドは
distinct
キーワードは重複を排除することができます。たとえば、Zixi Li と Xie Li の年齢と性別が等しい場合、キーワード
distinct
キーワードは、データの一部をフィルタリングします。
mysql> select distinct age,sex from user;
+ -----+-----+
| age | sex |
+-----+-----+
| 18 | 1 |
| 22 | 1 |
| 38 | 1 |
| 1 | 1 | 1
| 13 | 0 |
| 1 | 1 | 1
+-----+-----+
6 rows in set (0.00 sec)
4. 制限
先ほどのクエリは、条件を満たすすべての行を返しましたが、指定した行数だけ必要な場合は
limit
キーワードを使用して、返される行を制限します。このシナリオは、主にデータのページングに使用されます。
limit
は0以上の整数でなければなりません。負数や小数を渡すとエラーになります。
mysql> select * from user limit 0;
Empty set (0.00 sec)
mysql> select * from user limit 1;
+----+--------+-----+-----+
| id | name | age | sex |
+----+--------+-----+-----+
| 1 | li zi hai | 18 | 1 |
+----+--------+-----+-----+
1 row in set (0.00 sec)
もし
limit
がテーブルの行の値より大きい場合、すべてのデータが返される。例えば、もし
select count(1)
を渡して、7行のデータを持つuserテーブルの値を調べ、8を渡すと、エラーが返されません。
MySQL
は戻します。
user
テーブルの中にあるすべてのデータです。
mysql> select count(1) from user;
+----------+
|count(1) |
+----------+
| 7 | count(1)
+----------+
1 row in set (0.01 sec)
mysql> select * from user limit 8;
+----+--------+-----+-----+
| 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)
limit
の後には、開始値と終了値をそれぞれ指定する2つの引数と、(開始値と終了値を含む)閉区間を指定することができる。もし一つの引数が続くなら、終了値が示され、開始値はデフォルトで0になる。
MySQL
のデータは、インデックスの開始値が0である。
limit 2
4は、行番号2から4までのデータのうち、3番目から5番目までのデータを問い合わせることを意味します。
mysql> select * from user limit 2, 4;
+----+--------+-----+-----+
| id | name | age | sex |
+----+--------+-----+-----+
| 3 | Li Si | 38 | 1 |
| 4 | Wang Wu | 25 | 1 |
| 5 | Sixth Pony | 13 | 0 |
| 6 | Tian Qi | 37 | 1 |
+ ----+--------+-----+-----+
4 rows in set (0.00 sec)
MySQLのselect、distinct、limitの使い方についての記事です。MySQLのselect、distinct、limitの使い方については、Script Houseの過去記事を検索するか、引き続き以下の関連記事を参照してください。
関連
-
MySQL演算子(and, or, in, not)の具体的な使用方法
-
MySQLのNULLについて解説した記事
-
MySQL インタビューの質問 - ハッシュインデックスを設定する方法
-
面接では選択式で聞かれましたが......。.for updateはテーブルをロックするか、行をロックするか?
-
MySQLの悲観的ロックと楽観的ロックの実装スキーム
-
[解決済み] 親の行を削除または更新できない:外部キー制約が失敗する
-
[解決済み] ユニークなテーブル/エイリアスではない
-
[解決済み】SQLサーバーのテンポラリーテーブルで「すでに名前のついたオブジェクトがあります」エラーが発生する。
-
MySQLにおけるvarchar型とchar型の違い
-
群関数解の無効な使用
最新
-
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でインデックスに障害が発生する原因は何ですか?
-
SQL基本クエリステートメント
-
mysqlのデータ圧縮性能比較 詳細
-
MysqlからElasticsearchにデータを同期させる方法を説明します。
-
[解決済み】MySQLで「すべての派生テーブルは独自のエイリアスを持つ必要があります」というエラーは何ですか?
-
[解決済み】MySQL エラー 1093 - FROM 句で更新のターゲット テーブルを指定できません。
-
[解決済み] SQLエラー。ORA-01861:リテラルは、フォーマット文字列01861に一致しません。
-
'INSERT文はFOREIGN KEY制約「FK_TourismReservation_Users」と競合していました。その
-
MySQLでテーブルを削除します。親行が削除または更新できません: 外部キー制約に失敗しました。
-
mysql がエラーを報告します。不明な文字セットです。'utf8mb4'