ホームページ  >  記事  >  データベース  >  MySQL 入門チュートリアル 7 - 一般的なデータベース クエリの例

MySQL 入門チュートリアル 7 - 一般的なデータベース クエリの例

黄舟
黄舟オリジナル
2017-02-23 11:44:511143ブラウズ

ここでは、MySQL に関するいくつかの一般的な問題を解決する方法を学ぶためのいくつかの例を示します。

いくつかの例では、データベース テーブル「shop」は、特定の販売者 (ディーラー) の各商品 (商品番号) の価格を保存するために使用されます。各販売者が各品目に固定価格を持っていると仮定すると、(品目、販売者) がレコードの主キーになります。

コマンドラインツールmysqlを起動し、データベース

shell> mysql your-database-name

を選択します(ほとんどのMySQLでは、テストデータベースを使用できます)。

次のステートメントを使用してサンプル テーブルを作成できます:

mysql> CREATE TABLE shop (     -> article INT(4) UNSIGNED ZEROFILL DEFAULT '0000' NOT NULL,     -> dealer  CHAR(20)                 DEFAULT ''     NOT NULL,     -> price   DOUBLE(16,2)             DEFAULT '0.00' NOT NULL,     -> PRIMARY KEY(article, dealer)); mysql> INSERT INTO shop VALUES     -> (1,'A',3.45),(1,'B',3.99),(2,'A',10.99),(3,'B',1.45),     -> (3,'C',1.69),(3,'D',1.25),(4,'D',19.95);

ステートメントを実行すると、テーブルには次の内容が含まれます:

mysql> SELECT * FROM shop; +---------+--------+-------+
| article | dealer | price |
+---------+--------+-------+
|    0001 | A      |  3.45 |
|    0001 | B      |  3.99 |
|    0002 | A      | 10.99 |
|    0003 | B      |  1.45 |
|    0003 | C      |  1.69 |
|    0003 | D      |  1.25 |
|    0004 | D      | 19.95 |
+---------+--------+-------+

1. 列の最大値

"最大の項目番号は何ですか?"

2. 所有済み 特定の列の最大値を持つ行

タスク: 最も高価なアイテムの番号、販売者、および価格を見つけます。 これはサブクエリを使用すると簡単に実行できます:

SELECT MAX(article) AS article FROM shop;

+---------+
| article |
+---------+
|       4 |
+---------+

別の解決策は、すべての行を価格で降順に並べ替え、

MySQL固有の LIMIT 句を使用して最初の行のみを取得することです:

SELECT article, dealer, price
FROM   shop
WHERE  price=(SELECT MAX(price) FROM shop);

注: 複数の行がある場合items 最も高価なアイテム (例: それぞれの価格 19.95)、LIMIT ソリューションではそのうちの 1 つだけが表示されます。 3. 列の最大値: グループ別

タスク: 各アイテムの最大価格はいくらですか?

SELECT article, dealer, price
FROM shop
ORDER BY price DESC
LIMIT 1;
4. グループ間の特定のフィールドの最大値を持つ行

タスク: 各アイテムについて、最も高価なアイテムのディーラーを見つけます。

この問題は、次のようなサブクエリで解決できます:

SELECT article, MAX(price) AS price
FROM   shop
GROUP BY article

+---------+-------+
| article | price |
+---------+-------+
|    0001 |  3.99 |
|    0002 | 10.99 |
|    0003 |  1.69 |
|    0004 | 19.95 |
+---------+-------+

5. ユーザー変数の使用

MySQL ユーザー変数をクリアして、クライアント側の一時変数に保存せずに結果を記録できます。

たとえば、最高価格または最低価格のアイテムを見つける方法は次のとおりです:

SELECT article, dealer, price
FROM   shop s1
WHERE  price=(SELECT MAX(s2.price)
              FROM shop s2
              WHERE s1.article = s2.article);

6. 外部キーの使用

MySQL では、InnoDB テーブルは外部キーワード制約のチェックをサポートしています。

2 つのテーブルを結合する場合のみ、外部キーワードは必要ありません。 InnoDB タイプ以外のテーブルの場合、REFERENCES

tbl_name

(col_name) 句を使用して列を定義するときに外部キーワードを使用できます。この句は、そのことを思い出させるためのメモまたはコメントとしてのみ使用されます。現在定義中 この列は別のテーブルの列を指しています。 このステートメントを実行するときは、次のことを実装することが重要です: · MySQL は、定義しているテーブル内の行に対するアクションに応じて行を削除するなど、テーブル tbl_name

内のアクションを実行しません。この構文は ON DELETE または ON UPDATE 動作を引き起こしません (REFERENCES 句に ON DELETE 句または ON UPDATE 句を書いた場合、それは無視されます)。

· この構文は column

を作成しますが、インデックスやキーワードは作成されません。

· この構文を使用して InnoDB テーブルを定義すると、エラーが発生します。

次のように結合列として作成された列を使用できます:

mysql> SELECT @min_price:=MIN(price),@max_price:=MAX(price) FROM shop; mysql> SELECT * FROM shop WHERE price=@min_price OR price=@max_price; +---------+--------+-------+
| article | dealer | price |
+---------+--------+-------+
|    0003 | D      |  1.25 |
|    0004 | D      | 19.95 |
+---------+--------+-------+
CREATE TABLE person (
    id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
    name CHAR(60) NOT NULL,
    PRIMARY KEY (id)
);

CREATE TABLE shirt (
    id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
    style ENUM('t-shirt', 'polo', 'dress') NOT NULL,
    color ENUM('red', 'blue', 'orange', 'white', 'black') NOT NULL,
    owner SMALLINT UNSIGNED NOT NULL REFERENCES person(id),
    PRIMARY KEY (id)
);

INSERT INTO person VALUES (NULL, 'Antonio Paz');

SELECT @last := LAST_INSERT_ID();

INSERT INTO shirt VALUES
(NULL, 'polo', 'blue', @last),
(NULL, 'dress', 'white', @last),
(NULL, 't-shirt', 'blue', @last);

INSERT INTO person VALUES (NULL, 'Lilliana Angelovska');

SELECT @last := LAST_INSERT_ID();

INSERT INTO shirt VALUES
(NULL, 'dress', 'orange', @last),
(NULL, 'polo', 'red', @last),
(NULL, 'dress', 'blue', @last),
(NULL, 't-shirt', 'white', @last);

SELECT * FROM person;
+----+---------------------+
| id | name                |
+----+---------------------+
|  1 | Antonio Paz         |
|  2 | Lilliana Angelovska |
+----+---------------------+

SELECT * FROM shirt;

この方法で使用すると、REFERENCES 句は SHOW CREATE TABLE または DESCRIBE の出力に表示されません:

+----+---------+--------+-------+| id | style   | color  | owner |+----+---------+--------+-------+|  1 | polo    | blue   |     1 ||  2 | dress   | white  |     1 ||  3 | t-shirt | blue   |     1 ||  4 | dress   | orange |     2 ||  5 | polo    | red    |     2 ||  6 | dress   | blue   |     2 ||  7 | t-shirt | white  |     2 |+----+---------+--------+-------+
SELECT s.* FROM person p, shirt sWHERE p.name LIKE &#39;Lilliana%&#39;AND s.owner = p.idAND s.color <> &#39;white&#39;;
+----+-------+--------+-------+| id | style | color  | owner |+----+-------+--------+-------+|  4 | dress | orange |     2 ||  5 | polo  | red    |     2 ||  6 | dress | blue   |     2 |+----+-------+--------+-------+

列の定義で、この使用方法を押します。コメントまたは「ヒント」としての REFERENCES は、テーブル MyISAM および BerkeleyDB に対して機能します。

7. 2 つのキーに基づく検索

では、AND と同様に、単一のキーワードを使用して OR 句を最大限に活用できます。

より柔軟な例は、OR で結合された 2 つのキーワードを見つけることです:

SHOW CREATE TABLE shirt\G
*************************** 1. row ***************************
Table: shirt
Create Table: CREATE TABLE `shirt` (
`id` smallint(5) unsigned NOT NULL auto_increment,
`style` enum(&#39;t-shirt&#39;,&#39;polo&#39;,&#39;dress&#39;) NOT NULL,
`color` enum(&#39;red&#39;,&#39;blue&#39;,&#39;orange&#39;,&#39;white&#39;,&#39;black&#39;) NOT NULL,
`owner` smallint(5) unsigned NOT NULL,
PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1

この状況は最適化されています。

この問題をより効果的に解決するために、UNION を使用して 2 つの別々の SELECT ステートメントの出力を結合することもできます。

各 SELECT は 1 つのキーワードのみを検索し、最適化できます:

SELECT field1_index, field2_index FROM test_table
WHERE field1_index = &#39;1&#39; OR  field2_index = &#39;1&#39;

8. 日数に基づいて訪問数を計算する

次の例は、ビット配列関数を使用して、ユーザーが各月に訪問した日数を計算する方法を示しています。ウェブページ。

SELECT field1_index, field2_index
    FROM test_table WHERE field1_index = &#39;1&#39;
UNION
SELECT field1_index, field2_index
    FROM test_table WHERE field2_index = &#39;1&#39;;

このテーブルの例には、ユーザーの Web ページへの訪問を表す年、月、日の値が含まれています。次のクエリを使用して、1 か月あたりの訪問日数を決定できます:

CREATE TABLE t1 (year YEAR(4), month INT(2) UNSIGNED ZEROFILL,
             day INT(2) UNSIGNED ZEROFILL);
INSERT INTO t1 VALUES(2000,1,1),(2000,1,20),(2000,1,30),(2000,2,2),
            (2000,2,23),(2000,2,23);

は次の結果を返します:

SELECT year,month,BIT_COUNT(BIT_OR(1<<day)) AS days FROM t1
       GROUP BY year,month;

このクエリは、テーブル内の年/月ごとに結合された個別の日数をカウントし、重複したクエリを自動的に削除できます。

9. AUTO_INCREMENT

を使用すると、AUTO_INCREMENT 属性を通じて新しい行の一意の識別子を生成できます:

+------+-------+------+
| year | month | days |
+------+-------+------+
| 2000 |    01 |    3 |
| 2000 |    02 |    2 |
+------+-------+------+

は以下を返します:

CREATE TABLE animals (
     id MEDIUMINT NOT NULL AUTO_INCREMENT,
     name CHAR(30) NOT NULL,
     PRIMARY KEY (id)
 );

INSERT INTO animals (name) VALUES
    (&#39;dog&#39;),(&#39;cat&#39;),(&#39;penguin&#39;),
    (&#39;lax&#39;),(&#39;whale&#39;),(&#39;ostrich&#39;);

SELECT * FROM animals;

LAST_INSERT_ID() SQL 関数または mysql_insert_id() C API 関数を使用してクエリを実行できます。最新の AUTO_INCREMENT 値。これらの関数は接続固有であるため、その戻り値は挿入関数を実行する他の接続の影響を受けません。

注:

複数行の挿入の場合、LAST_INSERT_ID() と mysql_insert_id() は実際には、挿入された最初の行から AUTO_INCREMENT キーワードを返します。レプリケーション設定では、この機能を使用すると、複数行の挿入を他のサーバーに正しくレプリケートできます。

MyISAM テーブルと BDB テーブルの場合、2 番目の列に AUTO_INCREMENT と複数列インデックスを指定できます。このとき、AUTO_INCREMENTカラムで生成される値の計算方法は、MAX(auto_increment_column

) + 1 WHERE prefix=

given-prefixとなります。データを並べ替えたグループに入れる場合は、この方法を使用します。

+----+---------+
| id | name    |
+----+---------+
|  1 | dog     |
|  2 | cat     |
|  3 | penguin |
|  4 | lax     |
|  5 | whale   |
|  6 | ostrich |
+----+---------+
が返されます:
+--------+----+---------+
| grp    | id | name    |
+--------+----+---------+
| fish   |  1 | lax     |
| mammal |  1 | dog     |
| mammal |  2 | cat     |
| mammal |  3 | whale   |
| bird   |  1 | penguin |
| bird   |  2 | ostrich |
+--------+----+---------+

请注意在这种情况下(AUTO_INCREMENT列是多列索引的一部分),如果你在任何组中删除有最大AUTO_INCREMENT值的行,将会重新用到AUTO_INCREMENT值。对于MyISAM表也如此,对于该表一般不重复使用AUTO_INCREMENT值。

如果AUTO_INCREMENT列是多索引的一部分,MySQL将使用该索引生成以AUTO_INCREMENT列开始的序列值。。例如,如果animals表含有索引PRIMARY KEY (grp, id)和INDEX(id),MySQL生成序列值时将忽略PRIMARY KEY。结果是,该表包含一个单个的序列,而不是符合grp值的序列。

要想以AUTO_INCREMENT值开始而不是1,你可以通过CREATE TABLE或ALTER TABLE来设置该值,如下所示:

mysql> ALTER TABLE tbl AUTO_INCREMENT = 100;

 以上就是MySQL入门教程7 —— 常用数据库查询的示例的内容,更多相关内容请关注PHP中文网(www.php.cn)! 




声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。