ここでは、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 | +---------+--------+-------+
"最大の項目番号は何ですか?"
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;
この問題は、次のようなサブクエリで解決できます:
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. ユーザー変数の使用
たとえば、最高価格または最低価格のアイテムを見つける方法は次のとおりです:
SELECT article, dealer, price FROM shop s1 WHERE price=(SELECT MAX(s2.price) FROM shop s2 WHERE s1.article = s2.article);
6. 外部キーの使用
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;
+----+---------+--------+-------+| 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 'Lilliana%'AND s.owner = p.idAND s.color <> 'white'; +----+-------+--------+-------+| id | style | color | owner |+----+-------+--------+-------+| 4 | dress | orange | 2 || 5 | polo | red | 2 || 6 | dress | blue | 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('t-shirt','polo','dress') NOT NULL, `color` enum('red','blue','orange','white','black') NOT NULL, `owner` smallint(5) unsigned NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1
SELECT field1_index, field2_index FROM test_table WHERE field1_index = '1' OR field2_index = '1'
SELECT field1_index, field2_index FROM test_table WHERE field1_index = '1' UNION SELECT field1_index, field2_index FROM test_table WHERE field2_index = '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;
+------+-------+------+ | 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 ('dog'),('cat'),('penguin'), ('lax'),('whale'),('ostrich'); SELECT * FROM animals;
注:
複数行の挿入の場合、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)!