ホームページ > データベース > mysql チュートリアル > mysqlの一般的なデータベースクエリ

mysqlの一般的なデータベースクエリ

伊谢尔伦
リリース: 2016-11-23 13:27:24
オリジナル
914 人が閲覧しました

ここでは、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);
ログイン後にコピー

注: 最も高価なアイテムが複数ある場合 (たとえば、それぞれの価格は 19.95 です)、LIMIT ソリューションでは次の 1 つだけが表示されます。

3. 列の最大値: グループ別

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

ショップから記事、MAX(価格) AS 価格を選択

GROUP BY 記事


SELECT article, dealer, price
FROM shop
ORDER BY price DESC
LIMIT 1;
ログイン後にコピー

4. 特定のフィールドのグループ間で最大値を持つ行

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

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

+---------+-------+
| 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) 句を使用して列を定義するときに外部キーワードを使用できます。この句は実際には効果がなく、現在定義している列を思い出させるためのメモまたはコメントとしてのみ使用されます。テーブル内の別の A 列を指します。このステートメントを実行するときは、次のことを実装することが重要です:

· MySQL は、定義しているテーブル内の行に対するアクションに応じて行を削除するなど、テーブル tbl_name 内のアクションを実行しません。つまり、この構文は実行しません。 ON DELETE または ON UPDATE 動作を引き起こします (REFERENCES 句に ON DELETE 句または ON UPDATE 句を書いた場合、それは無視されます)。

· この構文は列を作成できますが、インデックスやキーワードは作成されません。

· この構文を使用して 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 |
+---------+--------+-------+
ログイン後にコピー

SELECT * FROM Shirt;



+----+---------+------ -- +-----+

| スタイル |

+----+-------+--------+--- -- --+
| 1 |
| ドレス 1 |
| | 赤 | 6 | 青 | 2 |
+--------+---- --+------+

SELECT s.* FROM 人物 p、シャツ s
WHERE p.name LIKE 'Lilliana%'
AND s.owner = p.id
AND s.color < ;> ; '白';
+-------+--------+

| スタイル | ----+------+--------+------+

| オレンジ 2 |
| | 6 | ドレス | 2 |
+----+------+------+-------+

句は SHOW CREATE TABLE または DESCRIBE の出力には表示されません:

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(&#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 UNSIGNED NOT NULL REFERENCES person(id),
    PRIMARY KEY (id)
);
INSERT INTO person VALUES (NULL, &#39;Antonio Paz&#39;);
SELECT @last := LAST_INSERT_ID();
INSERT INTO shirt VALUES
(NULL, &#39;polo&#39;, &#39;blue&#39;, @last),
(NULL, &#39;dress&#39;, &#39;white&#39;, @last),
(NULL, &#39;t-shirt&#39;, &#39;blue&#39;, @last);
INSERT INTO person VALUES (NULL, &#39;Lilliana Angelovska&#39;);
SELECT @last := LAST_INSERT_ID();
INSERT INTO shirt VALUES
(NULL, &#39;dress&#39;, &#39;orange&#39;, @last),
(NULL, &#39;polo&#39;, &#39;red&#39;, @last),
(NULL, &#39;dress&#39;, &#39;blue&#39;, @last),
(NULL, &#39;t-shirt&#39;, &#39;white&#39;, @last);

SELECT * FROM person;
+----+---------------------+
| id | name                |
+----+---------------------+
|  1 | Antonio Paz         |
|  2 | Lilliana Angelovska |
+----+---------------------+
ログイン後にコピー

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

7. 根据两个键搜索

可以充分利用使用单关键字的OR子句,如同AND的处理。

一个比较灵活的例子是寻找两个通过OR组合到一起的关键字:

SELECT field1_index, field2_index FROM test_table
WHERE field1_index = &#39;1&#39; OR  field2_index = &#39;1&#39;
ログイン後にコピー

该情形是已经优化过的。

还可以使用UNION将两个单独的SELECT语句的输出合成到一起来更有效地解决该问题。

每个SELECT只搜索一个关键字,可以进行优化:

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;;
ログイン後にコピー

8. 根据天计算访问量

下面的例子显示了如何使用位组函数来计算每个月中用户访问网页的天数。

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;
ログイン後にコピー

将返回:

+------+-------+------+
| year | month | days |
+------+-------+------+
| 2000 |    01 |    3 |
| 2000 |    02 |    2 |
+------+-------+------+
ログイン後にコピー

该查询计算了在表中按年/月组合的不同天数,可以自动去除重复的询问。

9. 使用AUTO_INCREMENT

可以通过AUTO_INCREMENT属性为新的行产生唯一的标识:

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;
ログイン後にコピー

将返回:

+----+---------+
| id | name    |
+----+---------+
|  1 | dog     |
|  2 | cat     |
|  3 | penguin |
|  4 | lax     |
|  5 | whale   |
|  6 | ostrich |
+----+---------+
ログイン後にコピー

你可以使用LAST_INSERT_ID()SQL函数或mysql_insert_id() C API函数来查询最新的AUTO_INCREMENT值。这些函数与具体连接有关,因此其返回值不会被其它执行插入功能的连接影响。

注释:对于多行插入,LAST_INSERT_ID()和mysql_insert_id()从插入的第一行实际返回AUTO_INCREMENT关键字。在复制设置中,通过该函数可以在其它服务器上正确复制多行插入。

对于MyISAM和BDB表,你可以在第二栏指定AUTO_INCREMENT以及多列索引。此时,AUTO_INCREMENT列生成的值的计算方法为:MAX(auto_increment_column) + 1 WHERE prefix=given-prefix。如果想要将数据放入到排序的组中可以使用该方法。

CREATE TABLE animals (
    grp ENUM(&#39;fish&#39;,&#39;mammal&#39;,&#39;bird&#39;) NOT NULL,
    id MEDIUMINT NOT NULL AUTO_INCREMENT,
    name CHAR(30) NOT NULL,
    PRIMARY KEY (grp,id)
);
INSERT INTO animals (grp,name) VALUES
    (&#39;mammal&#39;,&#39;dog&#39;),(&#39;mammal&#39;,&#39;cat&#39;),
    (&#39;bird&#39;,&#39;penguin&#39;),(&#39;fish&#39;,&#39;lax&#39;),(&#39;mammal&#39;,&#39;whale&#39;),
    (&#39;bird&#39;,&#39;ostrich&#39;);
SELECT * FROM animals ORDER BY grp,id;
ログイン後にコピー

将返回:

+--------+----+---------+
| 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;
ログイン後にコピー


関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート