1. ホーム
  2. データベース
  3. マイサク

MySQLのselect、distinct、limitの使い方

2022-01-18 03:52:59

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の過去記事を検索するか、引き続き以下の関連記事を参照してください。