Mysql-quick-guide
MySQL-クイックガイド
MySQL-はじめに
データベースとは何ですか?
データベースは、データのコレクションを格納する別個のアプリケーションです。 各データベースには、保持するデータを作成、アクセス、管理、検索、複製するための1つ以上の個別のAPIがあります。
ファイルシステム上のファイルやメモリ内の大きなハッシュテーブルなど、他の種類のデータストアも使用できますが、これらのタイプのシステムではデータのフェッチと書き込みはそれほど高速で簡単ではありません。
現在、リレーショナルデータベース管理システム(RDBMS)を使用して、膨大な量のデータを保存および管理しています。 これは、すべてのデータが異なるテーブルに格納され、主キーまたは Foreign Keys と呼ばれる他のキーを使用して関係が確立されるため、リレーショナルデータベースと呼ばれます。
- リレーショナルデータベース管理システム(RDBMS)*はソフトウェアです-
- テーブル、列、インデックスを使用してデータベースを実装できます。
- さまざまなテーブルの行間の参照整合性を保証します。
- インデックスを自動的に更新します。
- SQLクエリを解釈し、さまざまなテーブルの情報を組み合わせます。
RDBMSの用語
MySQLデータベースシステムの説明に進む前に、データベースに関連するいくつかの定義を修正しましょう。
- データベース-データベースは、関連データを含むテーブルのコレクションです。
- 表-表はデータを含む行列です。 データベース内のテーブルは、単純なスプレッドシートのように見えます。
- 列-1つの列(データ要素)には、同じ種類のデータ(列の郵便番号など)が含まれます。
- 行-行(=タプル、エントリ、またはレコード)は、たとえば1つのサブスクリプションのデータなど、関連データのグループです。
- 冗長性-データを2回保存し、システムを高速化するために冗長的に保存します。
- プライマリキー-プライマリキーは一意です。 キー値は、1つのテーブルで2回発生することはできません。 キーを使用すると、1行しか見つけることができません。
- 外部キー-外部キーは、2つのテーブル間のリンクピンです。
- 複合キー-複合キー(複合キー)は、1つの列が十分に一意ではないため、複数の列で構成されるキーです。
- インデックス-データベース内のインデックスは、本の最後にあるインデックスに似ています。
- 参照整合性-参照整合性は、外部キー値が常に既存の行を指すようにします。
MySQLデータベース
MySQLは、多くの小規模および大企業で使用されている高速で使いやすいRDBMSです。 MySQLは、スウェーデンの企業であるMySQL ABによって開発、販売、サポートされています。 MySQLは、多くの正当な理由により非常に人気が高まっています-
- MySQLはオープンソースライセンスの下でリリースされています。 だから、あなたはそれを使うために支払うものは何もありません。
- MySQLはそれ自体非常に強力なプログラムです。 最も高価で強力なデータベースパッケージの機能の大部分を処理します。
- MySQLは、よく知られたSQLデータ言語の標準形式を使用します。
- MySQLは多くのオペレーティングシステムで動作し、PHP、PERL、C、C ++、JAVAなどの多くの言語で動作します。
- MySQLは非常に高速に動作し、大規模なデータセットでも良好に動作します。
- MySQLは、Web開発で最も高く評価されている言語であるPHPに非常に適しています。
- MySQLは、テーブルで最大5,000万行以上の大規模データベースをサポートします。 テーブルのデフォルトのファイルサイズ制限は4GBですが、これを(オペレーティングシステムで処理できる場合)理論上の制限である800万テラバイト(TB)まで増やすことができます。
- MySQLはカスタマイズ可能です。 オープンソースのGPLライセンスにより、プログラマーはMySQLソフトウェアを変更して自分の特定の環境に適合させることができます。
あなたが始める前に
このチュートリアルを始める前に、PHPおよびHTMLチュートリアルでカバーされている情報の基本的な知識が必要です。
このチュートリアルでは、PHP環境でのMySQLの使用に重点を置いています。 このチュートリアルで提供される多くの例は、PHPプログラマーにとって有用です。
参考としてリンク:/php/index [PHPチュートリアル]を確認することをお勧めします。
MySQL-インストール
MySQLのすべてのダウンロードは、https://www.mysql.com/downloads/[MySQLダウンロード]にあります。 実行するプラットフォームとともに必要な MySQL Community Server のバージョン番号を選択します。
Linux/UNIXにMySQLをインストールする
MySQLをLinuxシステムにインストールする推奨方法は、RPMを使用することです。 MySQL ABは、次のRPMをWebサイトからダウンロードできるようにします-
- MySQL -MySQLデータベースサーバーは、データベースとテーブルを管理し、ユーザーアクセスを制御し、SQLクエリを処理します。
- MySQL-client -サーバーへの接続とサーバーとの対話を可能にするMySQLクライアントプログラム。
- MySQL-devel -MySQLを使用する他のプログラムをコンパイルするときに便利なライブラリとヘッダーファイル。
- MySQL-shared -MySQLクライアント用の共有ライブラリ。
- MySQL-bench -MySQLデータベースサーバーのベンチマークおよびパフォーマンステストツール。
ここにリストされているMySQL RPMはすべて* SuSE Linuxシステム*上に構築されていますが、通常は他のLinuxバリアントでも問題なく動作します。
今、あなたはインストールを続行するために、以下に示す手順に従う必要があります-
- root ユーザーを使用してシステムにログインします。
- RPMを含むディレクトリに切り替えます。
- 次のコマンドを実行して、MySQLデータベースサーバーをインストールします。 イタリック体のファイル名をRPMのファイル名に置き換えてください。
[root@host]# rpm -i MySQL-5.0.9-0.i386.rpm
上記のコマンドは、MySQLサーバーのインストール、MySQLのユーザーの作成、必要な構成の作成、およびMySQLサーバーの自動起動を処理します。
MySQL関連のバイナリはすべて/usr/binおよび/usr/sbinにあります。 すべてのテーブルとデータベースは、/var/lib/mysqlディレクトリに作成されます。
次のコードボックスには、残りのRPMを同じ方法でインストールするためのオプションですが推奨される手順があります-
[root@host]# rpm -i MySQL-client-5.0.9-0.i386.rpm
[root@host]# rpm -i MySQL-devel-5.0.9-0.i386.rpm
[root@host]# rpm -i MySQL-shared-5.0.9-0.i386.rpm
[root@host]# rpm -i MySQL-bench-5.0.9-0.i386.rpm
WindowsにMySQLをインストールする
MySQLのインストーラーがきちんとパッケージ化されたため、Windowsのどのバージョンへのデフォルトのインストールも以前よりはるかに簡単になりました。 インストーラーパッケージをダウンロードし、どこでも解凍して、setup.exeファイルを実行するだけです。
デフォルトのインストーラーsetup.exeは簡単なプロセスを順を追って説明し、デフォルトではすべてをC:\ mysqlの下にインストールします。
最初にコマンドプロンプトから起動して、サーバーをテストします。 おそらくC:\ mysql \ binである* mysqldサーバー*の場所に移動し、次のように入力します-
mysqld.exe --console
注-NTを使用している場合、mysqld.exeの代わりにmysqld-nt.exeを使用する必要があります。
すべてうまくいった場合は、起動と InnoDB に関するメッセージが表示されます。 そうでない場合は、権限に問題がある可能性があります。 データベースプロセスを実行するユーザー(おそらくMySQL)がデータを保持するディレクトリにアクセスできることを確認してください。
MySQLはそれ自体をスタートメニューに追加しません。また、サーバーを停止するための特に良いGUIの方法もありません。 したがって、mysqld実行可能ファイルをダブルクリックしてサーバーを起動する場合は、mysqladmin、タスクリスト、タスクマネージャー、またはその他のWindows固有の手段を使用して、手動でプロセスを停止することを忘れないでください。
MySQLインストールの検証
MySQLが正常にインストールされた後、ベーステーブルが初期化され、サーバーが起動しました。いくつかの簡単なテストにより、すべてが正常に機能していることを確認できます。
mysqladminユーティリティを使用してサーバーステータスを取得する
*mysqladmin* バイナリを使用して、サーバーのバージョンを確認します。 このバイナリは、Linuxでは/usr/binに、WindowsではC:\ mysql \ binにあります。
[root@host]# mysqladmin --version
Linuxでは次の結果が生成されます。 それはあなたのインストールに応じて異なる場合があります-
mysqladmin Ver 8.23 Distrib 5.0.9-0, for redhat-linux-gnu on i386
そのようなメッセージが表示されない場合は、インストールに何らかの問題がある可能性があり、それを修正するには何らかの助けが必要です。
MySQLクライアントを使用して簡単なSQLコマンドを実行する
MySQLクライアントを介して、 mysql コマンドを使用して、MySQLサーバーに接続できます。 現時点では、デフォルトで空白に設定されているため、パスワードを指定する必要はありません。
あなただけの次のコマンドを使用することができます-
[root@host]# mysql
mysql>プロンプトが表示されます。 これで、MySQLサーバーに接続され、次のようにmysql>プロンプトですべてのSQLコマンドを実行できます-
mysql> SHOW DATABASES;
+----------+
| Database |
+----------+
| mysql |
| test |
+----------+
2 rows in set (0.13 sec)
インストール後の手順
MySQLには、ルートMySQLユーザーの空のパスワードが付属しています。 データベースとクライアントを正常にインストールしたらすぐに、次のコードブロックに示すようにルートパスワードを設定する必要があります-
[root@host]# mysqladmin -u root password "new_password";
MySQLサーバーへの接続を確立するには、次のコマンドを使用する必要があります-
[root@host]# mysql -u root -p
Enter password:*******
UNIXユーザーは、MySQLディレクトリをPATHに配置することも必要になるため、コマンドラインクライアントを使用するたびに完全なパスを入力する必要はありません。
bashの場合、次のようになります-
export PATH = $PATH:/usr/bin:/usr/sbin
ブート時にMySQLを実行する
起動時にMySQLサーバーを実行する場合は、/etc/rc.localファイルに次のエントリがあることを確認してください。
/etc/init.d/mysqld start
また、/etc/init.d/ディレクトリにmysqldバイナリが必要です。
MySQL-管理
MySQLサーバーの実行とシャットダウン
まず、MySQLサーバーが実行されているかどうかを確認します。 あなたはそれを確認するために次のコマンドを使用することができます-
ps -ef | grep mysqld
MySqlが実行されている場合、結果に mysqld プロセスがリストされます。 サーバーが実行されていない場合は、次のコマンドを使用して起動できます-
root@host# cd/usr/bin
./safe_mysqld &
今、すでに実行中のMySQLサーバーをシャットダウンしたい場合は、次のコマンドを使用してそれを行うことができます-
root@host# cd/usr/bin
./mysqladmin -u root -p shutdown
Enter password: ******
MySQLユーザーアカウントの設定
MySQLに新しいユーザーを追加するには、データベース mysql の user テーブルに新しいエントリを追加するだけです。
次のプログラムは、パスワード guest123; を持つSELECT、INSERT、およびUPDATE権限を持つ新しいユーザー guest を追加する例です。SQLクエリは-
root@host# mysql -u root -p
Enter password:*******
mysql> use mysql;
Database changed
mysql> INSERT INTO user
(host, user, password,
select_priv, insert_priv, update_priv)
VALUES ('localhost', 'guest',
PASSWORD('guest123'), 'Y', 'Y', 'Y');
Query OK, 1 row affected (0.20 sec)
mysql> FLUSH PRIVILEGES;
Query OK, 1 row affected (0.01 sec)
mysql> SELECT host, user, password FROM user WHERE user = 'guest';
+-----------+---------+------------------+
| host | user | password |
+-----------+---------+------------------+
| localhost | guest | 6f8c114b58f2ce9e |
+-----------+---------+------------------+
1 row in set (0.00 sec)
新しいユーザーを追加するときは、MySQLが提供するPASSWORD()関数を使用して新しいパスワードを暗号化することを忘れないでください。 上記の例でわかるように、パスワードmypassは6f8c114b58f2ce9eに暗号化されています。
FLUSH PRIVILEGESステートメントに注目してください。 これは、サーバーに許可テーブルを再ロードするように指示します。 使用しない場合、少なくともサーバーが再起動されるまで、新しいユーザーアカウントを使用してMySQLに接続することはできません。
また、INSERTクエリの実行時にユーザーテーブルの次の列の値を「Y」に設定することにより、新しいユーザーに他の特権を指定することも、UPDATEクエリを使用して後で更新することもできます。
- Select_priv
- Insert_priv
- Update_priv
- Delete_priv
- Create_priv
- Drop_priv
- Reload_priv
- Shutdown_priv
- Process_priv
- File_priv
- Grant_priv
- References_priv
- Index_priv
- Alter_priv
ユーザーアカウントを追加する別の方法は、GRANT SQLコマンドを使用することです。 次の例では、特定のデータベース( TUTORIALS )のパスワード zara123 でユーザー zara を追加します。
root@host# mysql -u root -p password;
Enter password:*******
mysql> use mysql;
Database changed
mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP
-> ON TUTORIALS.*
-> TO 'zara'@'localhost'
-> IDENTIFIED BY 'zara123';
これにより、 user と呼ばれるエントリがMySQLデータベーステーブルに作成されます。
注-MySQLは、SQLコマンドの最後にセミコロン(;)を指定するまでコマンドを終了しません。
====/etc/my.cnfファイルの構成
ほとんどの場合、このファイルには触れないでください。 デフォルトでは、次のエントリがあります-
[mysqld]
datadir =/var/lib/mysql
socket =/var/lib/mysql/mysql.sock
[mysql.server]
user = mysql
basedir =/var/lib
[safe_mysqld]
err-log =/var/log/mysqld.log
pid-file =/var/run/mysqld/mysqld.pid
ここで、エラーログに別のディレクトリを指定できます。指定しない場合、このテーブルのエントリを変更しないでください。
管理用MySQLコマンド
ここに重要なMySQLコマンドのリストがあります。MySQLデータベースを操作するために時々使用します-
- USE Databasename -これは、MySQLワークエリアでデータベースを選択するために使用されます。
- SHOW DATABASES -MySQL DBMSからアクセス可能なデータベースをリストします。
- SHOW TABLES -useコマンドでデータベースが選択されると、データベース内のテーブルを表示します。
- SHOW COLUMNS FROM tablename: テーブルの属性、属性のタイプ、キー情報、NULLが許可されているかどうか、デフォルト、およびその他の情報を表示します。
- SHOW INDEX FROM tablename -PRIMARY KEYを含む、テーブル上のすべてのインデックスの詳細を表示します。
- SHOW TABLE STATUS LIKE tablename \ G -MySQL DBMSのパフォーマンスと統計の詳細を報告します。
次の章では、MySQLでのPHP構文の使用方法について説明します。
MySQL-PHP構文
MySQLは、PERL、C、C ++、JAVA、PHPなどのさまざまなプログラミング言語の組み合わせで非常にうまく機能します。 これらの言語のうち、PHPはWebアプリケーション開発機能があるため、最も人気があります。
このチュートリアルでは、PHP環境でのMySQLの使用に重点を置いています。 MySQL with PERLに興味がある場合は、リンク:/perl/perl_database [PERL]チュートリアルを読むことを検討してください。
PHPは、MySQLデータベースにアクセスし、MySQLデータベース内のデータレコードを操作するためのさまざまな機能を提供します。 他のPHP関数を呼び出すのと同じ方法で、PHP関数を呼び出す必要があります。
MySQLで使用するPHP関数には、次の一般的な形式があります-
mysql_function(value,value,...);
関数名の2番目の部分は、その関数に固有のものであり、通常はその関数が行うことを説明する単語です。 以下は、チュートリアルで使用する2つの関数です-
mysqli_connect($connect);
mysqli_query($connect,"SQL statement");
次の例は、MySQL関数を呼び出すPHPの一般的な構文を示しています。
<html>
<head>
<title>PHP with MySQL</title>
</head>
<body>
<?php
$retval = mysql_function(value, [value,...]);
if( !$retval ) {
die ( "Error: a related error message" );
}
//Otherwise MySQL or PHP Statements
?>
</body>
</html>
次の章から始めて、PHPとともにすべての重要なMySQL機能を見ていきます。
MySQL-接続
MySQLバイナリを使用したMySQL接続
コマンドプロンプトで mysql バイナリを使用して、MySQLデータベースを確立できます。
例
コマンドプロンプトからMySQLサーバーに接続する簡単な例を次に示します-
[root@host]# mysql -u root -p
Enter password:******
これにより、mysql>コマンドプロンプトが表示され、SQLコマンドを実行できます。 以下は、上記のコマンドの結果です-
次のコードブロックは、上記のコードの結果を示しています-
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 2854760 to server version: 5.0.9
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
上記の例では、ユーザーとして root を使用しましたが、他のユーザーも使用できます。 すべてのユーザーは、そのユーザーに許可されているすべてのSQL操作を実行できます。
mysql>プロンプトで exit コマンドを使用すると、いつでもMySQLデータベースから切断できます。
mysql> exit
Bye
PHPスクリプトを使用したMySQL接続
PHPは、データベース接続を開くための* mysql_connect()*関数を提供します。 この関数は5つのパラメーターを取り、成功するとMySQLリンクIDを返し、失敗するとFALSEを返します。
構文
connection mysql_connect(server,user,passwd,new_link,client_flag);
Sr.No. | Parameter & Description |
---|---|
1 |
server オプション-データベースサーバーを実行しているホスト名。 指定しない場合、デフォルト値は localhost:3306 になります。 |
2 |
user オプション-データベースにアクセスするユーザー名。 指定しない場合、デフォルトはサーバープロセスを所有するユーザーの名前になります。 |
3 |
passwd オプション-データベースにアクセスするユーザーのパスワード。 指定しない場合、デフォルトは空のパスワードになります。 |
4 |
new_link オプション-同じ引数で2回目のmysql_connect()呼び出しが行われた場合、新しい接続は確立されません。代わりに、すでに開かれている接続の識別子が返されます。 |
5 |
client_flags オプション-次の定数の組み合わせ-
|
別のPHP関数* mysql_close()を使用して、いつでもMySQLデータベースから切断できます。 この関数は、 mysql_connect()*関数によって返される接続である単一のパラメーターを取ります。
構文
bool mysql_close ( resource $link_identifier );
リソースが指定されていない場合、最後に開かれたデータベースが閉じられます。 この関数は、接続を正常に閉じた場合はtrueを返し、そうでない場合はfalseを返します。
例
MySQLサーバーに接続するには、次の例を試してください-
<html>
<head>
<title>Connecting MySQL Server</title>
</head>
<body>
<?php
$dbhost = 'localhost:3306';
$dbuser = 'guest';
$dbpass = 'guest123';
$conn = mysql_connect($dbhost, $dbuser, $dbpass);
if(! $conn ) {
die('Could not connect: ' . mysql_error());
}
echo 'Connected successfully';
mysql_close($conn);
?>
</body>
</html>
MySQL-データベースの作成
mysqladminを使用してデータベースを作成する
MySQLデータベースを作成または削除するには、特別な権限が必要です。 したがって、rootユーザーにアクセスできると仮定すると、mysql mysqladmin バイナリを使用して任意のデータベースを作成できます。
例
以下に、 TUTORIALS というデータベースを作成する簡単な例を示します-
[root@host]# mysqladmin -u root -p create TUTORIALS
Enter password:******
これにより、TUTORIALSというMySQLデータベースが作成されます。
PHPスクリプトを使用してデータベースを作成する
PHPは mysql_query 関数を使用してMySQLデータベースを作成または削除します。 この関数は2つのパラメーターを取り、成功するとTRUEを、失敗するとFALSEを返します。
構文
bool mysql_query( sql, connection );
Sr.No. | Parameter & Description |
---|---|
1 |
sql 必須-MySQLデータベースを作成または削除するためのSQLクエリ |
2 |
connection オプション-指定しない場合、mysql_connectによって最後に開かれた接続が使用されます。 |
例
データベースを作成する次の例-
<html>
<head>
<title>Creating MySQL Database</title>
</head>
<body>
<?php
$dbhost = 'localhost:3036';
$dbuser = 'root';
$dbpass = 'rootpassword';
$conn = mysql_connect($dbhost, $dbuser, $dbpass);
if(! $conn ) {
die('Could not connect: ' . mysql_error());
}
echo 'Connected successfully<br/>';
$sql = 'CREATE DATABASE TUTORIALS';
$retval = mysql_query( $sql, $conn );
if(! $retval ) {
die('Could not create database: ' . mysql_error());
}
echo "Database TUTORIALS created successfully\n";
mysql_close($conn);
?>
</body>
</html>
MySQLデータベースの削除
mysqladminを使用してデータベースを削除する
MySQLデータベースを作成または削除するには、特別な権限が必要です。 したがって、rootユーザーにアクセスできると仮定すると、mysql mysqladmin バイナリを使用して任意のデータベースを作成できます。
データベースを削除するときは注意してください。データベースで使用可能なすべてのデータが失われるためです。
これは、前の章で作成されたデータベース(チュートリアル)を削除する例です-
[root@host]# mysqladmin -u root -p drop TUTORIALS
Enter password:******
これにより警告が表示され、このデータベースを本当に削除するかどうかが確認されます。
Dropping the database is potentially a very bad thing to do.
Any data stored in the database will be destroyed.
Do you really want to drop the 'TUTORIALS' database [y/N] y
Database "TUTORIALS" dropped
PHPスクリプトを使用したデータベースの削除
PHPは mysql_query 関数を使用してMySQLデータベースを作成または削除します。 この関数は2つのパラメーターを取り、成功するとTRUEを、失敗するとFALSEを返します。
構文
bool mysql_query( sql, connection );
Sr.No | Parameter & Description |
---|---|
1 |
sql 必須-MySQLデータベースを作成または削除するSQLクエリ |
2 |
connection オプション-指定しない場合、mysql_connectによって最後に開かれた接続が使用されます。 |
例
データベースを削除するには、次の例を試してください-
<html>
<head>
<title>Deleting MySQL Database</title>
</head>
<body>
<?php
$dbhost = 'localhost:3036';
$dbuser = 'root';
$dbpass = 'rootpassword';
$conn = mysql_connect($dbhost, $dbuser, $dbpass);
if(! $conn ) {
die('Could not connect: ' . mysql_error());
}
echo 'Connected successfully<br/>';
$sql = 'DROP DATABASE TUTORIALS';
$retval = mysql_query( $sql, $conn );
if(! $retval ) {
die('Could not delete database: ' . mysql_error());
}
echo "Database TUTORIALS deleted successfully\n";
mysql_close($conn);
?>
</body>
</html>
警告-PHPスクリプトを使用してデータベースを削除する際、確認を求めるプロンプトは表示されません。 したがって、MySQLデータベースを削除するときは注意してください。
MySQLデータベースの選択
MySQLサーバーに接続したら、使用するデータベースを選択する必要があります。 これは、MySQLサーバーで使用可能なデータベースが複数あるためです。
コマンドプロンプトからのMySQLデータベースの選択
mysql>プロンプトからデータベースを選択するのは非常に簡単です。 SQLコマンド use を使用して、データベースを選択できます。
例
以下に、 TUTORIALS というデータベースを選択する例を示します-
[root@host]# mysql -u root -p
Enter password:******
mysql> use TUTORIALS;
Database changed
mysql>
これで、TUTORIALsデータベースが選択され、以降のすべての操作がTUTORIALSデータベースで実行されます。
注-すべてのデータベース名、テーブル名、テーブルフィールド名は大文字と小文字が区別されます。 そのため、SQLコマンドを指定する際には適切な名前を使用する必要があります。
PHPスクリプトを使用してMySQLデータベースを選択する
PHPは、データベースを選択するための関数 mysql_select_db を提供します。 成功するとTRUEを、失敗するとFALSEを返します。
構文
bool mysql_select_db( db_name, connection );
Sr.No. | Parameter & Description |
---|---|
1 |
db_name 必須-選択するMySQLデータベース名 |
2 |
connection オプション-指定しない場合、mysql_connectによって最後に開かれた接続が使用されます。 |
例
データベースを選択する方法を示す例を次に示します。
<html>
<head>
<title>Selecting MySQL Database</title>
</head>
<body>
<?php
$dbhost = 'localhost:3036';
$dbuser = 'guest';
$dbpass = 'guest123';
$conn = mysql_connect($dbhost, $dbuser, $dbpass);
if(! $conn ) {
die('Could not connect: ' . mysql_error());
}
echo 'Connected successfully';
mysql_select_db( 'TUTORIALS' );
mysql_close($conn);
?>
</body>
</html>
MySQL-データ型
テーブルのフィールドを適切に定義することは、データベースの全体的な最適化にとって重要です。 本当に使用する必要があるフィールドのタイプとサイズのみを使用する必要があります。 たとえば、2文字しか使用しないことがわかっている場合は、10文字幅のフィールドを定義しないでください。 これらのタイプのフィールド(または列)は、それらのフィールドに格納する*データのタイプ*の後に、データタイプとも呼ばれます。
MySQLは3つのカテゴリに分類された多くの異なるデータ型を使用します-
- 数値
- 日時
- 文字列タイプ。
それらについて詳しく説明しましょう。
数値データ型
MySQLはすべての標準ANSI SQL数値データ型を使用するため、別のデータベースシステムからMySQLにアクセスする場合、これらの定義はおなじみのように見えます。
次のリストは、一般的な数値データ型とその説明を示しています-
- INT -符号付きまたは符号なしの通常サイズの整数。 署名されている場合、許容範囲は-2147483648〜2147483647です。 符号なしの場合、許容範囲は0〜4294967295です。 最大11桁の幅を指定できます。
- TINYINT -符号付きまたは符号なしの非常に小さな整数。 署名されている場合、許容範囲は-128〜127です。 符号なしの場合、許容範囲は0〜255です。 最大4桁の幅を指定できます。
- SMALLINT -符号付きまたは符号なしの小さな整数。 署名されている場合、許容範囲は-32768〜32767です。 符号なしの場合、許容範囲は0〜65535です。 最大5桁の幅を指定できます。
- MEDIUMINT -符号付きまたは符号なしの中間サイズの整数。 署名されている場合、許容範囲は-8388608〜8388607です。 符号なしの場合、許容範囲は0〜16777215です。 最大9桁の幅を指定できます。
- BIGINT -符号付きまたは符号なしの大きな整数。 署名されている場合、許容範囲は-9223372036854775808〜9223372036854775807です。 符号なしの場合、許容範囲は0〜18446744073709551615です。 最大20桁の幅を指定できます。
- * FLOAT(M、D)*-符号なしにできない浮動小数点数。 表示の長さ(M)と小数の数(D)を定義できます。 これは必須ではなく、デフォルトで10,2になります。2は小数の数、10は総桁数(小数を含む)です。 FLOATの場合、10進数の精度は24桁になります。
- * DOUBLE(M、D)*-符号なしにできない倍精度の浮動小数点数。 表示の長さ(M)と小数の数(D)を定義できます。 これは必須ではなく、デフォルトの16,4になります。4は小数の数です。 10進数の精度は、DOUBLEの場合は53桁になります。 REALはDOUBLEの同義語です。
- * DECIMAL(M、D)*-符号なしにできないパックされていない浮動小数点数。 パックされていない10進数では、各10進数は1バイトに対応します。 表示の長さ(M)と小数の数(D)を定義する必要があります。 NUMERICはDECIMALの同義語です。
日付と時刻のタイプ
MySQLの日付と時刻のデータ型は次のとおりです-
- DATE -1000-01-01から9999-12-31までのYYYY-MM-DD形式の日付。 たとえば、1973年12月30日^は、1973-12-30として保存されます。
- DATETIME -1000-01-01 00:00:00から9999-12-31 23:59:59までのYYYY-MM-DD HH:MM:SS形式の日付と時刻の組み合わせ。 たとえば、1973年12月30日の午後3時30分は、1973-12-30 15:30:00として保存されます。
- TIMESTAMP -1970年1月1日午前0時から2037年のいずれかの時点までのタイムスタンプ。 これは、数字の間にハイフンがない場合のみ、以前のDATETIME形式のように見えます。 1973年12月30日の午後3時30分は、19731230153000(YYYYMMDDHHMMSS)として保存されます。
- TIME -HH:MM:SS形式で時刻を保存します。
- * YEAR(M)*-年を2桁または4桁の形式で保存します。 長さが2として指定されている場合(たとえば、YEAR(2))、YEARは1970から2069(70から69)の間になります。 長さが4に指定されている場合、YEARは1901〜2155になります。 デフォルトの長さは4です。
文字列型
数値型と日付型は楽しいものですが、保存するほとんどのデータは文字列形式になります。 このリストは、MySQLの一般的な文字列データ型について説明しています。
- * CHAR(M)*-1〜255文字の固定長文字列(CHAR(5)など)。保存時に指定された長さまで右にスペースが埋め込まれます。 長さを定義する必要はありませんが、デフォルトは1です。
- * VARCHAR(M)*-長さが1〜255文字の可変長文字列。 たとえば、VARCHAR(25)。 VARCHARフィールドを作成するときは、長さを定義する必要があります。
- BLOBまたはTEXT -最大長が65535文字のフィールド。 BLOBは「バイナリラージオブジェクト」であり、画像やその他の種類のファイルなど、大量のバイナリデータを格納するために使用されます。 TEXTとして定義されたフィールドには、大量のデータも保持されます。 2つの違いは、格納されたデータの並べ替えと比較がBLOBでは*大文字と小文字を区別*し、TEXTフィールドでは*大文字と小文字を区別しない*ことです。 BLOBまたはTEXTでは長さを指定しません。
- TINYBLOBまたはTINYTEXT -最大255文字のBLOBまたはTEXT列。 TINYBLOBまたはTINYTEXTでは長さを指定しません。
- MEDIUMBLOBまたはMEDIUMTEXT -最大長16777215文字のBLOBまたはTEXT列。 MEDIUMBLOBまたはMEDIUMTEXTでは長さを指定しません。
- LONGBLOBまたはLONGTEXT -最大長が4294967295文字のBLOBまたはTEXT列。 LONGBLOBまたはLONGTEXTでは長さを指定しません。
- ENUM -リストの凝った用語である列挙。 ENUMを定義するときは、値を選択する必要がある(またはNULLにすることができる)アイテムのリストを作成しています。 たとえば、フィールドに「A」、「B」、または「C」を含める場合、ENUMをENUM(「A」、「B」、「C」)およびそれらの値(またはNULL)として定義しますそのフィールドにデータを入力できます。
次の章では、MySQLでテーブルを作成する方法について説明します。
MySQLテーブルを作成する
まず、テーブル作成コマンドには次の詳細が必要です-
- テーブルの名前
- フィールドの名前
- 各フィールドの定義
構文
これは、MySQLテーブルを作成する一般的なSQL構文です-
CREATE TABLE table_name (column_name column_type);
ここで、 TUTORIALS データベースに次のテーブルを作成します。
create table tutorials_tbl(
tutorial_id INT NOT NULL AUTO_INCREMENT,
tutorial_title VARCHAR(100) NOT NULL,
tutorial_author VARCHAR(40) NOT NULL,
submission_date DATE,
PRIMARY KEY ( tutorial_id )
);
ここでは、いくつかの項目に説明が必要です-
- このフィールドをNULLにしたくないため、フィールド属性 NOT NULL が使用されています。 したがって、ユーザーがNULL値を持つレコードを作成しようとすると、MySQLはエラーを発生させます。
- フィールド属性 AUTO_INCREMENT は、MySQLにidフィールドに次に利用可能な番号を追加するよう指示します。
- キーワード PRIMARY KEY は、列を主キーとして定義するために使用されます。 コンマで区切られた複数の列を使用して、主キーを定義できます。
コマンドプロンプトからのテーブルの作成
mysql>プロンプトからMySQLテーブルを簡単に作成できます。 SQLコマンド CREATE TABLE を使用して、テーブルを作成します。
例
*tutorials_tbl* を作成する例を次に示します-
root@host# mysql -u root -p
Enter password:*******
mysql> use TUTORIALS;
Database changed
mysql> CREATE TABLE tutorials_tbl(
-> tutorial_id INT NOT NULL AUTO_INCREMENT,
-> tutorial_title VARCHAR(100) NOT NULL,
-> tutorial_author VARCHAR(40) NOT NULL,
-> submission_date DATE,
-> PRIMARY KEY ( tutorial_id )
-> );
Query OK, 0 rows affected (0.16 sec)
mysql>
注-MySQLは、SQLコマンドの最後にセミコロン(;)を指定するまでコマンドを終了しません。
PHPスクリプトを使用したテーブルの作成
既存のデータベースに新しいテーブルを作成するには、PHP関数* mysql_query()*を使用する必要があります。 適切なSQLコマンドで2番目の引数を渡して、テーブルを作成します。
例
次のプログラムは、PHPスクリプトを使用してテーブルを作成する例です-
<html>
<head>
<title>Creating MySQL Tables</title>
</head>
<body>
<?php
$dbhost = 'localhost:3036';
$dbuser = 'root';
$dbpass = 'rootpassword';
$conn = mysql_connect($dbhost, $dbuser, $dbpass);
if(! $conn ) {
die('Could not connect: ' . mysql_error());
}
echo 'Connected successfully<br/>';
$sql = "CREATE TABLE tutorials_tbl( ".
"tutorial_id INT NOT NULL AUTO_INCREMENT, ".
"tutorial_title VARCHAR(100) NOT NULL, ".
"tutorial_author VARCHAR(40) NOT NULL, ".
"submission_date DATE, ".
"PRIMARY KEY ( tutorial_id )); ";
mysql_select_db( 'TUTORIALS' );
$retval = mysql_query( $sql, $conn );
if(! $retval ) {
die('Could not create table: ' . mysql_error());
}
echo "Table created successfully\n";
mysql_close($conn);
?>
</body>
</html>
MySQLテーブルの削除
既存のMySQLテーブルは簡単に削除できますが、既存のテーブルを削除すると、失われたデータは復元されないため、削除する際には十分に注意する必要があります。
構文
MySQLテーブルを削除する一般的なSQL構文を次に示します-
DROP TABLE table_name ;
コマンドプロンプトからのテーブルの削除
コマンドプロンプトからテーブルを削除するには、mysql>プロンプトでDROP TABLE SQLコマンドを実行する必要があります。
例
次のプログラムは、 tutorials_tbl を削除する例です-
root@host# mysql -u root -p
Enter password:*******
mysql> use TUTORIALS;
Database changed
mysql> DROP TABLE tutorials_tbl
Query OK, 0 rows affected (0.8 sec)
mysql>
PHPスクリプトを使用したテーブルの削除
データベースの既存のテーブルを削除するには、PHP関数* mysql_query()*を使用する必要があります。 適切なSQLコマンドで2番目の引数を渡して、テーブルを削除します。
例
<html>
<head>
<title>Creating MySQL Tables</title>
</head>
<body>
<?php
$dbhost = 'localhost:3036';
$dbuser = 'root';
$dbpass = 'rootpassword';
$conn = mysql_connect($dbhost, $dbuser, $dbpass);
if(! $conn ) {
die('Could not connect: ' . mysql_error());
}
echo 'Connected successfully<br/>';
$sql = "DROP TABLE tutorials_tbl";
mysql_select_db( 'TUTORIALS' );
$retval = mysql_query( $sql, $conn );
if(! $retval ) {
die('Could not delete table: ' . mysql_error());
}
echo "Table deleted successfully\n";
mysql_close($conn);
?>
</body>
</html>
MySQL-クエリの挿入
MySQLテーブルにデータを挿入するには、SQL INSERT INTO コマンドを使用する必要があります。 mysql>プロンプトを使用するか、PHPなどのスクリプトを使用して、MySQLテーブルにデータを挿入できます。
構文
MySQLテーブルにデータを挿入するINSERT INTOコマンドの一般的なSQL構文は次のとおりです-
INSERT INTO table_name ( field1, field2,...fieldN )
VALUES
( value1, value2,...valueN );
文字列データ型を挿入するには、すべての値を二重引用符または一重引用符で囲む必要があります。 たとえば、 "value" 。
コマンドプロンプトからのデータの挿入
コマンドプロンプトからデータを挿入するには、SQL INSERT INTOコマンドを使用して、MySQLテーブルtutorials_tblにデータを挿入します。
例
次の例では、 tutorials_tbl テーブルに3つのレコードが作成されます-
root@host# mysql -u root -p password;
Enter password:*******
mysql> use TUTORIALS;
Database changed
mysql> INSERT INTO tutorials_tbl
->(tutorial_title, tutorial_author, submission_date)
->VALUES
->("Learn PHP", "John Poul", NOW());
Query OK, 1 row affected (0.01 sec)
mysql> INSERT INTO tutorials_tbl
->(tutorial_title, tutorial_author, submission_date)
->VALUES
->("Learn MySQL", "Abdul S", NOW());
Query OK, 1 row affected (0.01 sec)
mysql> INSERT INTO tutorials_tbl
->(tutorial_title, tutorial_author, submission_date)
->VALUES
->("JAVA Tutorial", "Sanjay", '2007-05-06');
Query OK, 1 row affected (0.01 sec)
mysql>
注-すべての矢印記号(→)はSQLコマンドの一部ではないことに注意してください。 これらは新しい行を示しており、コマンドの各行の最後にセミコロンを付けずにEnterキーを押しながらMySQLプロンプトによって自動的に作成されます。
上記の例では、テーブルの作成時にこのフィールドにAUTO_INCREMENTオプションを指定したため、tutorial_idを提供していません。 したがって、MySQLはこれらのIDを自動的に挿入します。 ここで、* NOW()*はMySQL関数であり、現在の日付と時刻を返します。
PHPスクリプトを使用したデータの挿入
同じSQL INSERT INTOコマンドをPHP関数* mysql_query()*に使用して、MySQLテーブルにデータを挿入できます。
例
この例では、ユーザーから3つのパラメーターを取得し、MySQLテーブルに挿入します-
<html>
<head>
<title>Add New Record in MySQL Database</title>
</head>
<body>
<?php
if(isset($_POST['add'])) {
$dbhost = 'localhost:3036';
$dbuser = 'root';
$dbpass = 'rootpassword';
$conn = mysql_connect($dbhost, $dbuser, $dbpass);
if(! $conn ) {
die('Could not connect: ' . mysql_error());
}
if(! get_magic_quotes_gpc() ) {
$tutorial_title = addslashes ($_POST['tutorial_title']);
$tutorial_author = addslashes ($_POST['tutorial_author']);
} else {
$tutorial_title = $_POST['tutorial_title'];
$tutorial_author = $_POST['tutorial_author'];
}
$submission_date = $_POST['submission_date'];
$sql = "INSERT INTO tutorials_tbl ".
"(tutorial_title,tutorial_author, submission_date) "."VALUES ".
"('$tutorial_title','$tutorial_author','$submission_date')";
mysql_select_db('TUTORIALS');
$retval = mysql_query( $sql, $conn );
if(! $retval ) {
die('Could not enter data: ' . mysql_error());
}
echo "Entered data successfully\n";
mysql_close($conn);
} else {
?>
<form method = "post" action = "<?php $_PHP_SELF ?>">
<table width = "600" border = "0" cellspacing = "1" cellpadding = "2">
<tr>
<td width = "250">Tutorial Title</td>
<td>
<input name = "tutorial_title" type = "text" id = "tutorial_title">
</td>
</tr>
<tr>
<td width = "250">Tutorial Author</td>
<td>
<input name = "tutorial_author" type = "text" id = "tutorial_author">
</td>
</tr>
<tr>
<td width = "250">Submission Date [ yyyy-mm-dd ]</td>
<td>
<input name = "submission_date" type = "text" id = "submission_date">
</td>
</tr>
<tr>
<td width = "250"> </td>
<td> </td>
</tr>
<tr>
<td width = "250"> </td>
<td>
<input name = "add" type = "submit" id = "add" value = "Add Tutorial">
</td>
</tr>
</table>
</form>
<?php
}
?>
</body>
</html>
データ挿入の実行中は、関数* get_magic_quotes_gpc()を使用して、マジッククォートの現在の構成が設定されているかどうかを確認することをお勧めします。 この関数がfalseを返す場合、関数 addslashes()*を使用して、引用符の前にスラッシュを追加します。
入力したデータが正しいかどうかを確認するために多くの検証を配置し、適切なアクションを実行できます。
MySQL-選択クエリ
SQL SELECT コマンドは、MySQLデータベースからデータを取得するために使用されます。 このコマンドは、mysql>プロンプトだけでなく、PHPなどのスクリプトでも使用できます。
構文
MySQLテーブルからデータを取得するSELECTコマンドの一般的なSQL構文は次のとおりです-
SELECT field1, field2,...fieldN
FROM table_name1, table_name2...
[WHERE Clause]
[OFFSET M ][LIMIT N]
- コンマで区切られた1つ以上のテーブルを使用して、WHERE句を使用してさまざまな条件を含めることができますが、WHERE句はSELECTコマンドのオプション部分です。
- 1つのSELECTコマンドで1つ以上のフィールドをフェッチできます。
- フィールドの代わりに星印(*)を指定できます。 この場合、SELECTはすべてのフィールドを返します。
- WHERE句を使用して、任意の条件を指定できます。
- SELECTがレコードを返し始める OFFSET を使用してオフセットを指定できます。 デフォルトでは、オフセットはゼロから始まります。
- LIMIT 属性を使用して、返品の数を制限できます。
コマンドプロンプトからのデータの取得
これは、SQL SELECTコマンドを使用して、MySQLテーブル tutorials_tbl からデータをフェッチします。
例
次の例は、 tutorials_tbl テーブルからすべてのレコードを返します-
root@host# mysql -u root -p password;
Enter password:*******
mysql> use TUTORIALS;
Database changed
mysql> SELECT * from tutorials_tbl
+-------------+----------------+-----------------+-----------------+
| tutorial_id | tutorial_title | tutorial_author | submission_date |
+-------------+----------------+-----------------+-----------------+
| 1 | Learn PHP | John Poul | 2007-05-21 |
| 2 | Learn MySQL | Abdul S | 2007-05-21 |
| 3 | JAVA Tutorial | Sanjay | 2007-05-21 |
+-------------+----------------+-----------------+-----------------+
3 rows in set (0.01 sec)
mysql>
PHPスクリプトを使用したデータの取得
同じSQL SELECTコマンドをPHP関数* mysql_query()に使用できます。 この関数を使用してSQLコマンドを実行し、後で別のPHP関数 mysql_fetch_array()*を使用して、選択したすべてのデータをフェッチできます。 この関数は、連想配列、数値配列、またはその両方として行を返します。 行がもうない場合、この関数はFALSEを返します。
次のプログラムは、 tutorials_tbl テーブルからレコードを取得/表示する方法を示す簡単な例です。
例
次のコードブロックは、tutorials_tblテーブルのすべてのレコードを表示します。
<?php
$dbhost = 'localhost:3036';
$dbuser = 'root';
$dbpass = 'rootpassword';
$conn = mysql_connect($dbhost, $dbuser, $dbpass);
if(! $conn ) {
die('Could not connect: ' . mysql_error());
}
$sql = 'SELECT tutorial_id, tutorial_title, tutorial_author, submission_date FROM tutorials_tbl';
mysql_select_db('TUTORIALS');
$retval = mysql_query( $sql, $conn );
if(! $retval ) {
die('Could not get data: ' . mysql_error());
}
while($row = mysql_fetch_array($retval, MYSQL_ASSOC)) {
echo "Tutorial ID :{$row['tutorial_id']} <br> ".
"Title: {$row['tutorial_title']} <br> ".
"Author: {$row['tutorial_author']} <br> ".
"Submission Date : {$row['submission_date']} <br> ".
"--------------------------------<br>";
}
echo "Fetched data successfully\n";
mysql_close($conn);
?>
行の内容は変数$ rowに割り当てられ、その行の値が出力されます。
注-配列値を文字列に直接挿入する場合は、必ず中括弧を忘れないでください。
上記の例では、定数 MYSQL_ASSOC がPHP関数* mysql_fetch_array()*の2番目の引数として使用されているため、行は連想配列として返されます。 連想配列を使用すると、インデックスを使用する代わりに名前を使用してフィールドにアクセスできます。
PHPは、* mysql_fetch_assoc()*と呼ばれる別の関数を提供します。これは、行を連想配列として返します。
例
mysql_fetch_assoc()関数を使用して、tutorial_tblテーブルのすべてのレコードを表示する次の例。
<?php
$dbhost = 'localhost:3036';
$dbuser = 'root';
$dbpass = 'rootpassword';
$conn = mysql_connect($dbhost, $dbuser, $dbpass);
if(! $conn ) {
die('Could not connect: ' . mysql_error());
}
$sql = 'SELECT tutorial_id, tutorial_title, tutorial_author, submission_date
FROM tutorials_tbl';
mysql_select_db('TUTORIALS');
$retval = mysql_query( $sql, $conn );
if(! $retval ) {
die('Could not get data: ' . mysql_error());
}
while($row = mysql_fetch_assoc($retval)) {
echo "Tutorial ID :{$row['tutorial_id']} <br> ".
"Title: {$row['tutorial_title']} <br> ".
"Author: {$row['tutorial_author']} <br> ".
"Submission Date : {$row['submission_date']} <br> ".
"--------------------------------<br>";
}
echo "Fetched data successfully\n";
mysql_close($conn);
?>
PHP関数mysql_fetch_array()の2番目の引数として、定数 MYSQL_NUM を使用することもできます。 これにより、関数は数値インデックスを持つ配列を返します。
例
次の例を試して、MYSQL_NUM引数を使用して、tutorials_tblテーブルのすべてのレコードを表示します。
<?php
$dbhost = 'localhost:3036';
$dbuser = 'root';
$dbpass = 'rootpassword';
$conn = mysql_connect($dbhost, $dbuser, $dbpass);
if(! $conn ) {
die('Could not connect: ' . mysql_error());
}
$sql = 'SELECT tutorial_id, tutorial_title, tutorial_author, submission_date
FROM tutorials_tbl';
mysql_select_db('TUTORIALS');
$retval = mysql_query( $sql, $conn );
if(! $retval ) {
die('Could not get data: ' . mysql_error());
}
while($row = mysql_fetch_array($retval, MYSQL_NUM)) {
echo "Tutorial ID :{$row[0]} <br> ".
"Title: {$row[1]} <br> ".
"Author: {$row[2]} <br> ".
"Submission Date : {$row[3]} <br> ".
"--------------------------------<br>";
}
echo "Fetched data successfully\n";
mysql_close($conn);
?>
上記の3つの例はすべて同じ結果になります。
メモリを解放する
各SELECTステートメントの最後にカーソルメモリを解放することをお勧めします。 これは、PHP関数* mysql_free_result()*を使用して実行できます。 次のプログラムは、使用方法を示す例です。
例
次の例を試してください-
<?php
$dbhost = 'localhost:3036';
$dbuser = 'root';
$dbpass = 'rootpassword';
$conn = mysql_connect($dbhost, $dbuser, $dbpass);
if(! $conn ) {
die('Could not connect: ' . mysql_error());
}
$sql = 'SELECT tutorial_id, tutorial_title, tutorial_author, submission_date
FROM tutorials_tbl';
mysql_select_db('TUTORIALS');
$retval = mysql_query( $sql, $conn );
if(! $retval ) {
die('Could not get data: ' . mysql_error());
}
while($row = mysql_fetch_array($retval, MYSQL_NUM)) {
echo "Tutorial ID :{$row[0]} <br> ".
"Title: {$row[1]} <br> ".
"Author: {$row[2]} <br> ".
"Submission Date : {$row[3]} <br> ".
"--------------------------------<br>";
}
mysql_free_result($retval);
echo "Fetched data successfully\n";
mysql_close($conn);
?>
データをフェッチしている間、好きなだけ複雑なコードを書くことができますが、手順は上記と同じままです。
MySQL-WHERE句
MySQLテーブルからデータを取得するSQL SELECT コマンドを見てきました。 WHERE Clause と呼ばれる条件句を使用して、結果を除外できます。 このWHERE句を使用して、選択条件を指定して、テーブルから必要なレコードを選択できます。
構文
次のコードブロックには、MySQLテーブルからデータを取得するためのWHERE句を含むSELECTコマンドの一般的なSQL構文があります-
SELECT field1, field2,...fieldN table_name1, table_name2...
[WHERE condition1 [AND [OR]] condition2.....
コンマで区切られた1つ以上のテーブルを使用して、WHERE句を使用してさまざまな条件を含めることができますが、WHERE句はSELECTコマンドのオプション部分です。
WHERE句を使用して、任意の条件を指定できます。
AND または OR 演算子を使用して、複数の条件を指定できます。
WHERE句をDELETEまたはUPDATE SQLコマンドとともに使用して、条件を指定することもできます。
*WHERE* 句は、プログラミング言語の* if条件*のように機能します。 この句は、指定された値をMySQLテーブルで使用可能なフィールド値と比較するために使用されます。 外部から与えられた値がMySQLテーブルで利用可能なフィールド値と等しい場合、その行を返します。
以下に、 WHERE 句で使用できる演算子のリストを示します。
フィールドAが10を保持し、フィールドBが20を保持すると仮定します-
Operator | Description | Example |
---|---|---|
= | Checks if the values of the two operands are equal or not, if yes, then the condition becomes true. | (A = B) is not true. |
!= | Checks if the values of the two operands are equal or not, if the values are not equal then the condition becomes true. | (A != B) is true. |
> | Checks if the value of the left operand is greater than the value of the right operand, if yes, then the condition becomes true. | (A > B) is not true. |
< | Checks if the value of the left operand is less than the value of the right operand, if yes then the condition becomes true. | (A < B) is true. |
>= | Checks if the value of the left operand is greater than or equal to the value of the right operand, if yes, then the condition becomes true. | (A >= B) is not true. |
⇐ | Checks if the value of the left operand is less than or equal to the value of the right operand, if yes, then the condition becomes true. | (A ⇐ B) is true. |
WHERE句は、特に MySQL Join を使用する場合に、テーブルから選択した行をフェッチする場合に非常に役立ちます。 結合については、別の章で説明します。
*Primary Key* を使用してレコードを検索するのが一般的な方法で、検索を高速化します。
指定された条件がテーブル内のどのレコードとも一致しない場合、クエリは行を返しません。
コマンドプロンプトからのデータの取得
これは、SQL SELECTコマンドとWHERE句を使用して、選択したデータをMySQLテーブル( tutorials_tbl )からフェッチします。
例
次の例では、作成者名が Sanjay である tutorials_tbl テーブルからすべてのレコードを返します。
root@host# mysql -u root -p password;
Enter password:*******
mysql> use TUTORIALS;
Database changed
mysql> SELECT * from tutorials_tbl WHERE tutorial_author = 'Sanjay';
+-------------+----------------+-----------------+-----------------+
| tutorial_id | tutorial_title | tutorial_author | submission_date |
+-------------+----------------+-----------------+-----------------+
| 3 | JAVA Tutorial | Sanjay | 2007-05-21 |
+-------------+----------------+-----------------+-----------------+
1 rows in set (0.01 sec)
mysql>
文字列で LIKE 比較を実行しない限り、比較では大文字と小文字が区別されません。 次のように BINARY キーワードを使用して、検索で大文字と小文字を区別できます-
root@host# mysql -u root -p password;
Enter password:*******
mysql> use TUTORIALS;
Database changed
mysql> SELECT * from tutorials_tbl \
WHERE BINARY tutorial_author = 'sanjay';
Empty set (0.02 sec)
mysql>
PHPスクリプトを使用したデータの取得
PHP関数* mysql_query()のWHERE CLAUSEで同じSQL SELECTコマンドを使用できます。 この関数は、SQLコマンドの実行に使用され、後で別のPHP関数 mysql_fetch_array()*を使用して、選択したすべてのデータをフェッチできます。 この関数は、連想配列、数値配列、またはその両方として行を返します。 行がもうない場合、この関数はFALSEを返します。
例
次の例は、著者名が Sanjay である tutorials_tbl テーブルからすべてのレコードを返します-
<?php
$dbhost = 'localhost:3036';
$dbuser = 'root';
$dbpass = 'rootpassword';
$conn = mysql_connect($dbhost, $dbuser, $dbpass);
if(! $conn ) {
die('Could not connect: ' . mysql_error());
}
$sql = 'SELECT tutorial_id, tutorial_title,
tutorial_author, submission_date
FROM tutorials_tbl
WHERE tutorial_author = "Sanjay"';
mysql_select_db('TUTORIALS');
$retval = mysql_query( $sql, $conn );
if(! $retval ) {
die('Could not get data: ' . mysql_error());
}
while($row = mysql_fetch_array($retval, MYSQL_ASSOC)) {
echo "Tutorial ID :{$row['tutorial_id']} <br> ".
"Title: {$row['tutorial_title']} <br> ".
"Author: {$row['tutorial_author']} <br> ".
"Submission Date : {$row['submission_date']} <br> ".
"--------------------------------<br>";
}
echo "Fetched data successfully\n";
mysql_close($conn);
?>
MySQL-更新クエリ
MySQLテーブル内の既存のデータを変更する必要がある場合があります。 これを行うには、SQL UPDATE コマンドを使用します。 これにより、MySQLテーブルのフィールド値が変更されます。
構文
次のコードブロックには、MySQLテーブルのデータを変更するUPDATEコマンドの一般的なSQL構文があります-
UPDATE table_name SET field1 = new-value1, field2 = new-value2
[WHERE Clause]
- 1つ以上のフィールドをすべて更新できます。
- WHERE句を使用して、任意の条件を指定できます。
- 一度に1つのテーブルの値を更新できます。
WHERE句は、テーブル内の選択した行を更新する場合に非常に便利です。
コマンドプロンプトからのデータの更新
これは、SQL UPDATEコマンドとWHERE句を使用して、MySQLテーブル tutorials_tbl で選択されたデータを更新します。
例
次の例では、tutorial_idが3のレコードの tutorial_title フィールドを更新します。
root@host# mysql -u root -p password;
Enter password:*******
mysql> use TUTORIALS;
Database changed
mysql> UPDATE tutorials_tbl
-> SET tutorial_title = 'Learning JAVA'
-> WHERE tutorial_id = 3;
Query OK, 1 row affected (0.04 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql>
PHPスクリプトを使用したデータの更新
PHP関数のWHERE CLAUSEの有無にかかわらず、SQL UPDATEコマンドを使用できます-* mysql_query()*。 この関数は、mysql>プロンプトで実行されるのと同様の方法でSQLコマンドを実行します。
例
次の例は、tutorial_idが3のレコードの tutorial_title フィールドを更新します。
<?php
$dbhost = 'localhost:3036';
$dbuser = 'root';
$dbpass = 'rootpassword';
$conn = mysql_connect($dbhost, $dbuser, $dbpass);
if(! $conn ) {
die('Could not connect: ' . mysql_error());
}
$sql = 'UPDATE tutorials_tbl
SET tutorial_title="Learning JAVA"
WHERE tutorial_id=3';
mysql_select_db('TUTORIALS');
$retval = mysql_query( $sql, $conn );
if(! $retval ) {
die('Could not update data: ' . mysql_error());
}
echo "Updated data successfully\n";
mysql_close($conn);
?>
MySQL-クエリの削除
MySQLテーブルからレコードを削除する場合は、SQLコマンド DELETE FROM を使用できます。 このコマンドは、mysql>プロンプトおよびPHPなどのスクリプトで使用できます。
構文
次のコードブロックには、MySQLテーブルからデータを削除するDELETEコマンドの一般的なSQL構文が含まれています。
DELETE FROM table_name [WHERE Clause]
- WHERE句が指定されていない場合、指定されたMySQLテーブルからすべてのレコードが削除されます。
- WHERE句を使用して、任意の条件を指定できます。
- 一度に1つのテーブルのレコードを削除できます。
WHERE句は、テーブル内の選択した行を削除する場合に非常に便利です。
コマンドプロンプトからのデータの削除
これは、SQL DELETEコマンドとWHERE句を使用して、選択したデータをMySQLテーブル( tutorials_tbl )に削除します。
例
次の例では、tutorial_idが3のtutorial_tblからレコードを削除します。
root@host# mysql -u root -p password;
Enter password:*******
mysql> use TUTORIALS;
Database changed
mysql> DELETE FROM tutorials_tbl WHERE tutorial_id=3;
Query OK, 1 row affected (0.23 sec)
mysql>
PHPスクリプトを使用したデータの削除
PHPの関数であるWHERE CLAUSEの有無にかかわらず、SQL DELETEコマンド– * mysql_query()*を使用できます。 この関数は、mysql>プロンプトで実行されるのと同じ方法でSQLコマンドを実行します。
例
次の例を試して、tutorial_idが3のtutorial_tblからレコードを削除してください。
<?php
$dbhost = 'localhost:3036';
$dbuser = 'root';
$dbpass = 'rootpassword';
$conn = mysql_connect($dbhost, $dbuser, $dbpass);
if(! $conn ) {
die('Could not connect: ' . mysql_error());
}
$sql = 'DELETE FROM tutorials_tbl WHERE tutorial_id = 3';
mysql_select_db('TUTORIALS');
$retval = mysql_query( $sql, $conn );
if(! $retval ) {
die('Could not delete data: ' . mysql_error());
}
echo "Deleted data successfully\n";
mysql_close($conn);
?>
MySQL-LIKE句
MySQLテーブルからデータを取得するSQL SELECT コマンドを見てきました。 WHERE 句と呼ばれる条件句を使用して、必要なレコードを選択することもできます。
「等しい」記号(=)を含むWHERE句は、完全一致を実行する場合に正常に機能します。 「tutorial_author = 'Sanjay'」の場合のように。 ただし、tutorial_authorの名前に「jay」が含まれるすべての結果を除外する必要がある場合があります。 これは、* SQL LIKE句*とWHERE句を使用して処理できます。
SQL LIKE句を%文字とともに使用すると、UNIXの場合のようにメタ文字(*)のように機能しますが、コマンドプロンプトですべてのファイルまたはディレクトリを一覧表示します。 %文字がない場合、LIKE句は、WHERE句とともに*等号*記号と非常に同じです。
構文
次のコードブロックには、MySQLテーブルからデータをフェッチするためのLIKE句とともにSELECTコマンドの一般的なSQL構文が含まれています。
SELECT field1, field2,...fieldN table_name1, table_name2...
WHERE field1 LIKE condition1 [AND [OR]] filed2 = 'somevalue'
- WHERE句を使用して、任意の条件を指定できます。
- WHERE句とともにLIKE句を使用できます。
- *等号*記号の代わりにLIKE句を使用できます。
- LIKEを%記号と共に使用すると、メタ文字検索のように機能します。
- AND または OR 演算子を使用して、複数の条件を指定できます。
- WHERE … LIKE句をDELETEまたはUPDATE SQLコマンドとともに使用して、条件を指定することもできます。
コマンドプロンプトでのLIKE句の使用
これは、SQL SELECTコマンドとWHERE … LIKE句を使用して、選択したデータをMySQLテーブル( tutorials_tbl )からフェッチします。
例
次の例は、著者名が jay で終わる tutorials_tbl テーブルからすべてのレコードを返します-
root@host# mysql -u root -p password;
Enter password:*******
mysql> use TUTORIALS;
Database changed
mysql> SELECT * from tutorials_tbl
-> WHERE tutorial_author LIKE '%jay';
+-------------+----------------+-----------------+-----------------+
| tutorial_id | tutorial_title | tutorial_author | submission_date |
+-------------+----------------+-----------------+-----------------+
| 3 | JAVA Tutorial | Sanjay | 2007-05-21 |
+-------------+----------------+-----------------+-----------------+
1 rows in set (0.01 sec)
mysql>
PHPスクリプト内でLIKE句を使用する
PHP関数であるWHERE … LIKE句の同様の構文(* mysql_query())を使用できます。 この関数は、SQLコマンドを実行するために使用され、後で別のPHP関数-SELECTコマンドとともにWHERE … LIKE句が使用される場合、選択されたすべてのデータを取得するために mysql_fetch_array()*を使用できます。
しかし、WHERE … LIKE句がDELETEまたはUPDATEコマンドで使用されている場合、それ以上のPHP関数呼び出しは必要ありません。
例
著者名に jay が含まれる tutorials_tbl テーブルからすべてのレコードを返すには、次の例を試してください-
<?php
$dbhost = 'localhost:3036';
$dbuser = 'root';
$dbpass = 'rootpassword';
$conn = mysql_connect($dbhost, $dbuser, $dbpass);
if(! $conn ) {
die('Could not connect: ' . mysql_error());
}
$sql = 'SELECT tutorial_id, tutorial_title,
tutorial_author, submission_date
FROM tutorials_tbl
WHERE tutorial_author LIKE "%jay%"';
mysql_select_db('TUTORIALS');
$retval = mysql_query( $sql, $conn );
if(! $retval ) {
die('Could not get data: ' . mysql_error());
}
while($row = mysql_fetch_array($retval, MYSQL_ASSOC)) {
echo "Tutorial ID :{$row['tutorial_id']} <br> ".
"Title: {$row['tutorial_title']} <br> ".
"Author: {$row['tutorial_author']} <br> ".
"Submission Date : {$row['submission_date']} <br> ".
"--------------------------------<br>";
}
echo "Fetched data successfully\n";
mysql_close($conn);
?>
MySQL-結果のソート
MySQLテーブルからデータを取得するSQL SELECT コマンドを見てきました。 行を選択すると、結果をソートする方法を指定して指示しない限り、MySQLサーバーは任意の順序で自由に返すことができます。 ただし、並べ替える列に名前を付ける ORDER BY 句を追加して、結果セットを並べ替えます。
構文
次のコードブロックは、MySQLテーブルのデータをソートするためのORDER BY句を伴うSELECTコマンドの一般的なSQL構文です。
SELECT field1, field2,...fieldN table_name1, table_name2...
ORDER BY field1, [field2...] [ASC [DESC]]
- そのフィールドがリストされている場合、返された結果を任意のフィールドでソートできます。
- 結果を複数のフィールドでソートできます。
- キーワードASCまたはDESCを使用して、昇順または降順で結果を取得できます。 デフォルトでは、昇順です。
- WHERE … LIKE句を通常の方法で使用して条件を設定できます。
コマンドプロンプトでORDER BY句を使用する
これは、SQLのSELECTコマンドと ORDER BY 句を使用して、MySQLテーブル tutorials_tbl からデータをフェッチします。
例
結果を昇順で返す次の例を試してください。
root@host# mysql -u root -p password;
Enter password:*******
mysql> use TUTORIALS;
Database changed
mysql> SELECT * from tutorials_tbl ORDER BY tutorial_author ASC
+-------------+----------------+-----------------+-----------------+
| tutorial_id | tutorial_title | tutorial_author | submission_date |
+-------------+----------------+-----------------+-----------------+
| 2 | Learn MySQL | Abdul S | 2007-05-24 |
| 1 | Learn PHP | John Poul | 2007-05-24 |
| 3 | JAVA Tutorial | Sanjay | 2007-05-06 |
+-------------+----------------+-----------------+-----------------+
3 rows in set (0.42 sec)
mysql>
昇順でリストされているすべての著者名を確認します。
PHPスクリプト内でORDER BY句を使用する
ORDER BY句の同様の構文をPHP関数に使用できます-* mysql_query()。 この関数は、SQLコマンドの実行に使用され、後で別のPHP関数 mysql_fetch_array()*を使用して、選択したすべてのデータをフェッチできます。
例
次の例を試してください。チュートリアルの作成者の降順で結果が返されます。
<?php
$dbhost = 'localhost:3036';
$dbuser = 'root';
$dbpass = 'rootpassword';
$conn = mysql_connect($dbhost, $dbuser, $dbpass);
if(! $conn ) {
die('Could not connect: ' . mysql_error());
}
$sql = 'SELECT tutorial_id, tutorial_title,
tutorial_author, submission_date
FROM tutorials_tbl
ORDER BY tutorial_author DESC';
mysql_select_db('TUTORIALS');
$retval = mysql_query( $sql, $conn );
if(! $retval ) {
die('Could not get data: ' . mysql_error());
}
while($row = mysql_fetch_array($retval, MYSQL_ASSOC)) {
echo "Tutorial ID :{$row['tutorial_id']} <br> ".
"Title: {$row['tutorial_title']} <br> ".
"Author: {$row['tutorial_author']} <br> ".
"Submission Date : {$row['submission_date']} <br> ".
"--------------------------------<br>";
}
echo "Fetched data successfully\n";
mysql_close($conn);
?>
MySQl結合の使用
前の章では、一度に1つのテーブルからデータを取得していました。 これは単純なテイクには十分ですが、実際のMySQLの使用のほとんどでは、多くの場合、1つのクエリで複数のテーブルからデータを取得する必要があります。
単一のSQLクエリで複数のテーブルを使用できます。 MySQLに参加するという行為は、2つ以上のテーブルを1つのテーブルに粉砕することを指します。
SELECT、UPDATE、およびDELETEステートメントでJOINSを使用して、MySQLテーブルを結合できます。 単純なMySQL JOINとは異なるLEFT JOINの例もあります。
コマンドプロンプトでの結合の使用
チュートリアルに2つのテーブル tcount_tbl と tutorials_tbl があると仮定します。 今、以下に示す例を見てみましょう-
例
次の例-
root@host# mysql -u root -p password;
Enter password:*******
mysql> use TUTORIALS;
Database changed
mysql> SELECT *FROM tcount_tbl;
+-----------------+----------------+
| tutorial_author | tutorial_count |
+-----------------+----------------+
| mahran | 20 |
| mahnaz | NULL |
| Jen | NULL |
| Gill | 20 |
| John Poul | 1 |
| Sanjay | 1 |
+-----------------+----------------+
6 rows in set (0.01 sec)
mysql> SELECT* from tutorials_tbl;
+-------------+----------------+-----------------+-----------------+
| tutorial_id | tutorial_title | tutorial_author | submission_date |
+-------------+----------------+-----------------+-----------------+
| 1 | Learn PHP | John Poul | 2007-05-24 |
| 2 | Learn MySQL | Abdul S | 2007-05-24 |
| 3 | JAVA Tutorial | Sanjay | 2007-05-06 |
+-------------+----------------+-----------------+-----------------+
3 rows in set (0.00 sec)
mysql>
これで、これら2つのテーブルを結合するSQLクエリを作成できます。 このクエリは、テーブル tutorials_tbl からすべての著者を選択し、 tcount_tbl から対応する数のチュートリアルを取得します。
mysql> SELECT a.tutorial_id, a.tutorial_author, b.tutorial_count
-> FROM tutorials_tbl a, tcount_tbl b
-> WHERE a.tutorial_author = b.tutorial_author;
+-------------+-----------------+----------------+
| tutorial_id | tutorial_author | tutorial_count |
+-------------+-----------------+----------------+
| 1 | John Poul | 1 |
| 3 | Sanjay | 1 |
+-------------+-----------------+----------------+
2 rows in set (0.01 sec)
mysql>
PHPスクリプトでの結合の使用
PHPスクリプトでは、上記の任意のSQLクエリを使用できます。 SQLクエリをPHP関数* mysql_query()*に渡すだけで、通常の方法で結果を取得できます。
例
次の例-
<?php
$dbhost = 'localhost:3036';
$dbuser = 'root';
$dbpass = 'rootpassword';
$conn = mysql_connect($dbhost, $dbuser, $dbpass);
if(! $conn ) {
die('Could not connect: ' . mysql_error());
}
$sql = 'SELECT a.tutorial_id, a.tutorial_author, b.tutorial_count
FROM tutorials_tbl a, tcount_tbl b
WHERE a.tutorial_author = b.tutorial_author';
mysql_select_db('TUTORIALS');
$retval = mysql_query( $sql, $conn );
if(! $retval ) {
die('Could not get data: ' . mysql_error());
}
while($row = mysql_fetch_array($retval, MYSQL_ASSOC)) {
echo "Author:{$row['tutorial_author']} <br> ".
"Count: {$row['tutorial_count']} <br> ".
"Tutorial ID: {$row['tutorial_id']} <br> ".
"--------------------------------<br>";
}
echo "Fetched data successfully\n";
mysql_close($conn);
?>
MySQL LEFT JOIN
MySQLの左結合は、単純な結合とは異なります。 MySQL LEFT JOINは、左側のテーブルをさらに考慮します。
*LEFT JOIN* を実行すると、同じ方法で一致するすべてのレコードが取得され、IN ADDITIONで結合の左側のテーブルにある一致しない各レコードに対して追加のレコードが取得されます。言及を取得します。
例
LEFT JOINを理解するには、次の例を試してください。
root@host# mysql -u root -p password;
Enter password:*******
mysql> use TUTORIALS;
Database changed
mysql> SELECT a.tutorial_id, a.tutorial_author, b.tutorial_count
-> FROM tutorials_tbl a LEFT JOIN tcount_tbl b
-> ON a.tutorial_author = b.tutorial_author;
+-------------+-----------------+----------------+
| tutorial_id | tutorial_author | tutorial_count |
+-------------+-----------------+----------------+
| 1 | John Poul | 1 |
| 2 | Abdul S | NULL |
| 3 | Sanjay | 1 |
+-------------+-----------------+----------------+
3 rows in set (0.02 sec)
JOINSに慣れるには、さらに練習する必要があります。 これは、MySQL/SQLの少し複雑な概念であり、実際の例を実行するうちに、より明確になるでしょう。
MySQL NULL値の処理
MySQLテーブルからデータを取得するための WHERE 句と一緒にSQL SELECT コマンドを見ましたが、フィールドまたは列の値を NULL と比較する条件を指定しようとすると、機能しません。正しく。
このような状況を処理するために、MySQLは3つの演算子を提供します-
- IS NULL -列値がNULLの場合、この演算子はtrueを返します。
- IS NOT NULL -列値がNULLでない場合、この演算子はtrueを返します。
- <⇒ -この演算子は値を比較し、(=演算子とは異なり)2つのNULL値に対しても真です。
NULLを伴う条件は特別です。 = NULL または!= NULL を使用して列のNULL値を探すことはできません。 そのような比較は、それらが真であるかどうかを見分けることができないため、常に失敗します。 時々、NULL = NULLでも失敗します。
NULLの列またはNULLでない列を検索するには、 IS NULL または IS NOT NULL を使用します。
コマンドプロンプトでのNULL値の使用
TUTORIALSデータベースに tcount_tbl というテーブルがあり、 tutorial_author と tutorial_count という2つの列があり、NULL tutorial_countは値が不明であることを示していると仮定します。
例
次の例を試してください-
root@host# mysql -u root -p password;
Enter password:*******
mysql> use TUTORIALS;
Database changed
mysql> create table tcount_tbl
-> (
-> tutorial_author varchar(40) NOT NULL,
-> tutorial_count INT
-> );
Query OK, 0 rows affected (0.05 sec)
mysql> INSERT INTO tcount_tbl
-> (tutorial_author, tutorial_count) values ('mahran', 20);
mysql> INSERT INTO tcount_tbl
-> (tutorial_author, tutorial_count) values ('mahnaz', NULL);
mysql> INSERT INTO tcount_tbl
-> (tutorial_author, tutorial_count) values ('Jen', NULL);
mysql> INSERT INTO tcount_tbl
-> (tutorial_author, tutorial_count) values ('Gill', 20);
mysql> SELECT * from tcount_tbl;
+-----------------+----------------+
| tutorial_author | tutorial_count |
+-----------------+----------------+
| mahran | 20 |
| mahnaz | NULL |
| Jen | NULL |
| Gill | 20 |
+-----------------+----------------+
4 rows in set (0.00 sec)
mysql>
あなたは=と*!= *が次のようにNULL値で動作しないことがわかります-
mysql> SELECT *FROM tcount_tbl WHERE tutorial_count = NULL;
Empty set (0.00 sec)
mysql> SELECT* FROM tcount_tbl WHERE tutorial_count != NULL;
Empty set (0.01 sec)
tutorial_count列がNULLであるか、NULLでないレコードを見つけるには、次のプログラムに示すようにクエリを記述する必要があります。
mysql> SELECT *FROM tcount_tbl
-> WHERE tutorial_count IS NULL;
+-----------------+----------------+
| tutorial_author | tutorial_count |
+-----------------+----------------+
| mahnaz | NULL |
| Jen | NULL |
+-----------------+----------------+
2 rows in set (0.00 sec)
mysql> SELECT* from tcount_tbl
-> WHERE tutorial_count IS NOT NULL;
+-----------------+----------------+
| tutorial_author | tutorial_count |
+-----------------+----------------+
| mahran | 20 |
| Gill | 20 |
+-----------------+----------------+
2 rows in set (0.00 sec)
PHPスクリプトでのNULL値の処理
*if ... else* 条件を使用して、NULL値に基づいてクエリを準備できます。
例
次の例では、外部から tutorial_count を取得し、テーブルで使用可能な値と比較します。
<?php
$dbhost = 'localhost:3036';
$dbuser = 'root';
$dbpass = 'rootpassword';
$conn = mysql_connect($dbhost, $dbuser, $dbpass);
if(! $conn ) {
die('Could not connect: ' . mysql_error());
}
if( isset($tutorial_count )) {
$sql = 'SELECT tutorial_author, tutorial_count
FROM tcount_tbl
WHERE tutorial_count = $tutorial_count';
} else {
$sql = 'SELECT tutorial_author, tutorial_count
FROM tcount_tbl
WHERE tutorial_count IS $tutorial_count';
}
mysql_select_db('TUTORIALS');
$retval = mysql_query( $sql, $conn );
if(! $retval ) {
die('Could not get data: ' . mysql_error());
}
while($row = mysql_fetch_array($retval, MYSQL_ASSOC)) {
echo "Author:{$row['tutorial_author']} <br> ".
"Count: {$row['tutorial_count']} <br> ".
"--------------------------------<br>";
}
echo "Fetched data successfully\n";
mysql_close($conn);
?>
MySQL-正規表現
- LIKE …%を使用したMySQLパターンマッチングを見ました。 MySQLは、正規表現と *REGEXP 演算子に基づく別のタイプのパターンマッチング操作をサポートしています。 PHPまたはPERLを知っている場合、このマッチングは正規表現のスクリプト作成と同じであるため、理解するのは非常に簡単です。
以下は、 REGEXP 演算子と共に使用できるパターンの表です。
Pattern | What the pattern matches |
---|---|
^ | Beginning of string |
$ | End of string |
. | Any single character |
[…] | Any character listed between the square brackets |
[^…] | Any character not listed between the square brackets |
p1 | p2 |
p3 | Alternation; matches any of the patterns p1, p2, or p3 |
* | Zero or more instances of preceding element |
+ | One or more instances of preceding element |
{n} | n instances of preceding element |
\{m,n} | m through n instances of preceding element |
例
上記の表に基づいて、要件を満たすためにさまざまなタイプのSQLクエリを作成できます。 ここに、あなたの理解のためにいくつかをリストしています。
*person_tbl* というテーブルがあり、 *name* というフィールドがあるとします-
*'st'* で始まるすべての名前を検索するクエリ-
mysql> SELECT name FROM person_tbl WHERE name REGEXP '^st';
*'ok'* で終わるすべての名前を検索するクエリ-
mysql> SELECT name FROM person_tbl WHERE name REGEXP 'ok$';
*'mar'* を含むすべての名前を検索するクエリ-
mysql> SELECT name FROM person_tbl WHERE name REGEXP 'mar';
母音で始まり 'ok' で終わるすべての名前を検索するクエリ-
mysql> SELECT FirstName FROM intque.person_tbl WHERE FirstName REGEXP '^[aeiou].*ok$';
MySQL-トランザクション
トランザクションは、データベース操作操作の連続したグループであり、1つの作業単位であるかのように実行されます。 つまり、グループ内の個々の操作が成功しない限り、トランザクションは決して完了しません。 トランザクション内のいずれかの操作が失敗すると、トランザクション全体が失敗します。
実際には、多くのSQLクエリを1つのグループにまとめ、トランザクションの一部としてそれらすべてをまとめて実行します。
トランザクションのプロパティ
トランザクションには、通常、頭字語 ACID で参照される次の4つの標準プロパティがあります-
- *アトミック性-これにより、ワークユニット内のすべての操作が正常に完了します。そうでない場合、トランザクションは失敗した時点で中止され、以前の操作は以前の状態にロールバックされます。
- 一貫性-これにより、データベースが正常にコミットされたトランザクションの状態を適切に変更します。
- 分離-これにより、トランザクションが互いに独立して透過的に動作できるようになります。
- 耐久性-これにより、システム障害が発生した場合でも、コミットされたトランザクションの結果または効果が持続します。
MySQLでは、トランザクションは BEGIN WORK ステートメントで始まり、 COMMIT または ROLLBACK ステートメントで終わります。 開始ステートメントと終了ステートメントの間のSQLコマンドは、トランザクションの大部分を形成します。
コミットとロールバック
これらの2つのキーワード Commit および Rollback は、主にMySQLトランザクションに使用されます。
トランザクションが正常に完了したら、COMMITコマンドを発行して、関連するすべてのテーブルへの変更を有効にします。
障害が発生した場合、ROLLBACKコマンドを発行して、トランザクションで参照されているすべてのテーブルを以前の状態に戻す必要があります。
*AUTOCOMMIT* というセッション変数を設定することにより、トランザクションの動作を制御できます。 AUTOCOMMITが1(デフォルト)に設定されている場合、各SQLステートメント(トランザクション内または非トランザクション)は完全なトランザクションと見なされ、終了時にデフォルトでコミットされます。
AUTOCOMMITが0に設定されている場合、 SET AUTOCOMMIT = 0 コマンドを発行すると、後続の一連のステートメントはトランザクションのように動作し、明示的なCOMMITステートメントが発行されるまでアクティビティはコミットされません。
- mysql_query()*関数を使用して、PHPでこれらのSQLコマンドを実行できます。
トランザクションの一般的な例
この一連のイベントは、使用されるプログラミング言語に依存しません。 論理パスは、アプリケーションの作成に使用する言語で作成できます。
- mysql_query()*関数を使用して、PHPでこれらのSQLコマンドを実行できます。
- SQLコマンド BEGIN WORK を発行して、トランザクションを開始します。
- SELECT、INSERT、UPDATE、DELETEなどの1つ以上のSQLコマンドを発行します。
- エラーがなく、すべてが要件に従っているかどうかを確認します。
- エラーがある場合はROLLBACKコマンドを発行し、そうでない場合はCOMMITコマンドを発行します。
MySQLのトランザクションセーフテーブルタイプ
トランザクションを直接使用することはできませんが、特定の例外については使用できます。 ただし、これらは安全ではなく、保証されていません。 MySQLプログラミングでトランザクションを使用する場合は、特別な方法でテーブルを作成する必要があります。 トランザクションをサポートするテーブルには多くの種類がありますが、最も一般的なものは InnoDB です。
InnoDBテーブルのサポートには、ソースからMySQLをコンパイルするときに特定のコンパイルパラメーターが必要です。 MySQLバージョンにInnoDBのサポートがない場合は、インターネットサービスプロバイダーにInnoDBテーブルタイプをサポートするMySQLのバージョンを構築するか、WindowsまたはLinux/UNIX用の MySQL-Max Binary Distribution をダウンロードしてインストールし、テーブルを操作するよう依頼してください開発環境に入力します。
MySQLインストールがInnoDBテーブルをサポートしている場合、 TYPE = InnoDB 定義をテーブル作成ステートメントに追加するだけです。
たとえば、次のコードは tcount_tbl というInnoDBテーブルを作成します-
root@host# mysql -u root -p password;
Enter password:*******
mysql> use TUTORIALS;
Database changed
mysql> create table tcount_tbl
-> (
-> tutorial_author varchar(40) NOT NULL,
-> tutorial_count INT
-> ) TYPE = InnoDB;
Query OK, 0 rows affected (0.05 sec)
InnoDBの詳細については、次のリンクをクリックしてください-http://www.mysql.com/doc/I/n/InnoDBl [InnoDB]
*GEMINI* や *BDB* などの他のテーブルタイプを使用できますが、これらの2つのテーブルタイプをサポートするかどうかはインストールによって異なります。
MySQL-ALTERコマンド
MySQLの ALTER コマンドは、テーブルの名前やテーブルフィールドを変更する場合、またはテーブルの既存の列を追加または削除する場合に非常に便利です。
*testalter_tbl* というテーブルの作成から始めましょう。
root@host# mysql -u root -p password;
Enter password:*******
mysql> use TUTORIALS;
Database changed
mysql> create table testalter_tbl
-> (
-> i INT,
-> c CHAR(1)
-> );
Query OK, 0 rows affected (0.05 sec)
mysql> SHOW COLUMNS FROM testalter_tbl;
+-------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| i | int(11) | YES | | NULL | |
| c | char(1) | YES | | NULL | |
+-------+---------+------+-----+---------+-------+
2 rows in set (0.00 sec)
列のドロップ、追加、または再配置
上記のMySQLテーブルから既存の列iを削除する場合は、以下に示すように ALTER コマンドとともに DROP 句を使用します-
mysql> ALTER TABLE testalter_tbl DROP i;
列がテーブルに残っている場合、 DROP 句は機能しません。
列を追加するには、ADDを使用して列定義を指定します。 次のステートメントは、 i 列をtestalter_tblに復元します-
mysql> ALTER TABLE testalter_tbl ADD i INT;
このステートメントを発行すると、testalterには、最初にテーブルを作成したときと同じ2つの列が含まれますが、同じ構造にはなりません。 これは、デフォルトでテーブルの最後に追加される新しい列があるためです。 したがって、 i は元々mytblの最初の列でしたが、現在は最後の列です。
mysql> SHOW COLUMNS FROM testalter_tbl;
+-------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| c | char(1) | YES | | NULL | |
| i | int(11) | YES | | NULL | |
+-------+---------+------+-----+---------+-------+
2 rows in set (0.00 sec)
テーブル内の特定の位置に列が必要であることを示すには、FIRSTを使用して最初の列にするか、 AFTER col_name を使用して、新しい列をcol_nameの後に配置することを示します。
次の ALTER TABLE ステートメントを試し、各ステートメントの後に SHOW COLUMNS を使用して、それぞれの効果を確認します-
ALTER TABLE testalter_tbl DROP i;
ALTER TABLE testalter_tbl ADD i INT FIRST;
ALTER TABLE testalter_tbl DROP i;
ALTER TABLE testalter_tbl ADD i INT AFTER c;
FIRSTおよびAFTER指定子は、ADD句でのみ機能します。 つまり、テーブル内の既存の列の位置を変更する場合は、最初に DROP してから、新しい位置に ADD する必要があります。
列定義または名前の変更(変更)
列の定義を変更するには、ALTERコマンドとともに MODIFY または CHANGE 句を使用します。
たとえば、列 c をCHAR(1)からCHAR(10)に変更するには、次のコマンドを使用できます-
mysql> ALTER TABLE testalter_tbl MODIFY c CHAR(10);
*CHANGE* では、構文が少し異なります。 CHANGEキーワードの後に、変更する列に名前を付けてから、新しい名前を含む新しい定義を指定します。
次の例を試してください-
mysql> ALTER TABLE testalter_tbl CHANGE i j BIGINT;
CHANGEを使用して、 J を BIGINT から INT に変換し、列名を変更しない場合、ステートメントは以下のようになります-
mysql> ALTER TABLE testalter_tbl CHANGE j j INT;
- NULLおよびデフォルト値の属性に対するALTER TABLEの効果*-列を変更または変更するとき、列にNULL値を含めることができるかどうか、およびそのデフォルト値を指定することもできます。 実際、これを行わないと、MySQLはこれらの属性の値を自動的に割り当てます。
次のコードブロックの例は、 NOT NULL 列の値がデフォルトで100になっています。
mysql> ALTER TABLE testalter_tbl
-> MODIFY j BIGINT NOT NULL DEFAULT 100;
上記のコマンドを使用しない場合、MySQLはすべての列のNULL値を埋めます。
列のデフォルト値の変更(変更)
*ALTER* コマンドを使用して、任意の列のデフォルト値を変更できます。
次の例を試してください。
mysql> ALTER TABLE testalter_tbl ALTER i SET DEFAULT 1000;
mysql> SHOW COLUMNS FROM testalter_tbl;
+-------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| c | char(1) | YES | | NULL | |
| i | int(11) | YES | | 1000 | |
+-------+---------+------+-----+---------+-------+
2 rows in set (0.00 sec)
*ALTER* コマンドとともにDROP句を使用すると、任意の列からデフォルトの制約を削除できます。
mysql> ALTER TABLE testalter_tbl ALTER i DROP DEFAULT;
mysql> SHOW COLUMNS FROM testalter_tbl;
+-------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| c | char(1) | YES | | NULL | |
| i | int(11) | YES | | NULL | |
+-------+---------+------+-----+---------+-------+
2 rows in set (0.00 sec)
テーブルタイプの変更(変更)
ALTERコマンドとともに TYPE 句を使用すると、テーブルタイプを使用できます。 次の例を試して、 testalter_tbl を MYISAM テーブルタイプに変更してください。
テーブルの現在のタイプを調べるには、 SHOW TABLE STATUS ステートメントを使用します。
mysql> ALTER TABLE testalter_tbl TYPE = MYISAM;
mysql> SHOW TABLE STATUS LIKE 'testalter_tbl'\G
************************** *1. row* ***************
Name: testalter_tbl
Type: MyISAM
Row_format: Fixed
Rows: 0
Avg_row_length: 0
Data_length: 0
Max_data_length: 25769803775
Index_length: 1024
Data_free: 0
Auto_increment: NULL
Create_time: 2007-06-03 08:04:36
Update_time: 2007-06-03 08:04:36
Check_time: NULL
Create_options:
Comment:
1 row in set (0.00 sec)
テーブルの名前変更(変更)
テーブルの名前を変更するには、 ALTER TABLE ステートメントの RENAME オプションを使用します。
次の例を試して、 testalter_tbl の名前を alter_tbl に変更してください。
mysql> ALTER TABLE testalter_tbl RENAME TO alter_tbl;
ALTERコマンドを使用して、MySQLファイルでINDEXコマンドを作成およびドロップできます。 このコマンドについては、次の章で詳しく説明します。
MySQL-インデックス
データベースインデックスは、テーブル内の操作の速度を向上させるデータ構造です。 インデックスは、1つ以上の列を使用して作成でき、迅速なランダム検索とレコードへのアクセスの効率的な順序付けの両方の基礎を提供します。
インデックスを作成する際、SQLクエリを作成し、それらの列に1つ以上のインデックスを作成するために使用されるすべての列を考慮する必要があります。
実際には、インデックスはテーブルの一種でもあり、プライマリキーまたはインデックスフィールドと各レコードへのポインタを実際のテーブルに保持します。
ユーザーはインデックスを見ることができず、クエリを高速化するためだけに使用され、データベース検索エンジンによってレコードを非常に高速に検索するために使用されます。
INSERTおよびUPDATEステートメントはインデックスを持つテーブルではより時間がかかりますが、SELECTステートメントはこれらのテーブルで高速になります。 その理由は、挿入または更新を行っている間、データベースもインデックス値を挿入または更新する必要があるためです。
シンプルでユニークなインデックス
テーブルに一意のインデックスを作成できます。 一意のインデックスは、2つの行が同じインデックス値を持つことはできないことを意味します。 以下は、テーブルにインデックスを作成する構文です。
CREATE UNIQUE INDEX index_name ON table_name ( column1, column2,...);
1つ以上の列を使用して、インデックスを作成できます。
たとえば、 tutorial_author を使用して tutorials_tbl にインデックスを作成できます。
CREATE UNIQUE INDEX AUTHOR_INDEX ON tutorials_tbl (tutorial_author)
テーブルに単純なインデックスを作成できます。 クエリから UNIQUE キーワードを省略して、単純なインデックスを作成します。 シンプルインデックスは、テーブル内の重複値を許可します。
列の値を降順でインデックス付けする場合は、列名の後に予約語DESCを追加できます。
mysql> CREATE UNIQUE INDEX AUTHOR_INDEX ON tutorials_tbl (tutorial_author DESC)
INDEXを追加および削除するALTERコマンド
テーブルにインデックスを追加するためのステートメントの4種類があります-
- * ALTER TABLE tbl_name ADD PRIMARY KEY(column_list)-このステートメントは、 *PRIMARY KEY を追加します。これは、インデックス値が一意でなければならず、NULLであってはならないことを意味します。
- * ALTER TABLE tbl_name ADD UNIQUE index_name(column_list)*-このステートメントは、値が一意でなければならないインデックスを作成します(複数回出現する可能性があるNULL値を除く)。
- * ALTER TABLE tbl_name ADD INDEX index_name(column_list)*-これは、任意の値が複数回現れる可能性がある通常のインデックスを追加します。
- * ALTER TABLE tbl_name ADD FULLTEXT index_name(column_list)*-これは、テキスト検索に使用される特別なFULLTEXTインデックスを作成します。
次のコードブロックは、既存のテーブルにインデックスを追加する例です。
mysql> ALTER TABLE testalter_tbl ADD INDEX (c);
ALTERコマンドと一緒に DROP 句を使用して、任意のINDEXを削除できます。
上記のインデックスを削除するには、次の例を試してください。
mysql> ALTER TABLE testalter_tbl DROP INDEX (c);
ALTERコマンドとともにDROP句を使用して、任意のINDEXを削除できます。
プライマリキーを追加および削除するALTERコマンド
同じ方法で主キーを追加することもできます。 ただし、主キーがNULL以外の列で機能することを確認してください。
次のコードブロックは、既存のテーブルに主キーを追加する例です。 これにより、最初に列がNOT NULLになり、次に主キーとして追加されます。
mysql> ALTER TABLE testalter_tbl MODIFY i INT NOT NULL;
mysql> ALTER TABLE testalter_tbl ADD PRIMARY KEY (i);
次のようにALTERコマンドを使用して主キーを削除できます-
mysql> ALTER TABLE testalter_tbl DROP PRIMARY KEY;
PRIMARY KEYではないインデックスを削除するには、インデックス名を指定する必要があります。
INDEX情報の表示
*SHOW INDEX* コマンドを使用して、テーブルに関連付けられているすべてのインデックスをリストできます。 長い行の折り返しを避けるために、垂直形式の出力(\ Gで指定)がこのステートメントで役立つことがよくあります-
次の例を試してください-
mysql> SHOW INDEX FROM table_name\G
........
MySQL-一時テーブル
一時テーブルは、一時データを保持するのに非常に役立つ場合があります。 一時テーブルについて知っておくべき最も重要なことは、現在のクライアントセッションが終了すると削除されることです。
一時テーブルとは何ですか?
一時テーブルはMySQLバージョン3.23で追加されました。 3.23より古いバージョンのMySQLを使用する場合、一時テーブルは使用できませんが、*ヒープテーブル*は使用できます。
前述したように、一時テーブルはセッションが生きている間のみ持続します。 PHPスクリプトでコードを実行する場合、スクリプトの実行が終了すると、一時テーブルは自動的に破棄されます。 MySQLクライアントプログラムを介してMySQLデータベースサーバーに接続している場合、クライアントを閉じるか手動でテーブルを破棄するまで、一時テーブルが存在します。
例
次のプログラムは、一時テーブルの使用法を示す例です。 同じコードを* mysql_query()*関数を使用してPHPスクリプトで使用できます。
mysql> CREATE TEMPORARY TABLE SalesSummary (
-> product_name VARCHAR(50) NOT NULL
-> , total_sales DECIMAL(12,2) NOT NULL DEFAULT 0.00
-> , avg_unit_price DECIMAL(7,2) NOT NULL DEFAULT 0.00
-> , total_units_sold INT UNSIGNED NOT NULL DEFAULT 0
);
Query OK, 0 rows affected (0.00 sec)
mysql> INSERT INTO SalesSummary
-> (product_name, total_sales, avg_unit_price, total_units_sold)
-> VALUES
-> ('cucumber', 100.25, 90, 2);
mysql> SELECT * FROM SalesSummary;
+--------------+-------------+----------------+------------------+
| product_name | total_sales | avg_unit_price | total_units_sold |
+--------------+-------------+----------------+------------------+
| cucumber | 100.25 | 90.00 | 2 |
+--------------+-------------+----------------+------------------+
1 row in set (0.00 sec)
*SHOW TABLES* コマンドを発行すると、一時テーブルはリストに表示されません。 ここで、MySQLセッションからログアウトし、 *SELECT* コマンドを発行すると、データベースに利用可能なデータが見つかりません。 一時テーブルも存在しません。
一時テーブルの削除
デフォルトでは、データベース接続が終了すると、すべての一時テーブルはMySQLによって削除されます。 それでもそれらを削除したい場合は、 DROP TABLE コマンドを発行して削除します。
次のプログラムは、一時テーブルを削除する例です-
mysql> CREATE TEMPORARY TABLE SalesSummary (
-> product_name VARCHAR(50) NOT NULL
-> , total_sales DECIMAL(12,2) NOT NULL DEFAULT 0.00
-> , avg_unit_price DECIMAL(7,2) NOT NULL DEFAULT 0.00
-> , total_units_sold INT UNSIGNED NOT NULL DEFAULT 0
);
Query OK, 0 rows affected (0.00 sec)
mysql> INSERT INTO SalesSummary
-> (product_name, total_sales, avg_unit_price, total_units_sold)
-> VALUES
-> ('cucumber', 100.25, 90, 2);
mysql> SELECT *FROM SalesSummary;
+--------------+-------------+----------------+------------------+
| product_name | total_sales | avg_unit_price | total_units_sold |
+--------------+-------------+----------------+------------------+
| cucumber | 100.25 | 90.00 | 2 |
+--------------+-------------+----------------+------------------+
1 row in set (0.00 sec)
mysql> DROP TABLE SalesSummary;
mysql> SELECT* FROM SalesSummary;
ERROR 1146: Table 'TUTORIALS.SalesSummary' doesn't exist
MySQL-テーブルのクローン
テーブルと CREATE TABLEの正確なコピーが必要な場合があります… コピーには同じインデックス、デフォルト値などを含める必要があるため、SELECT は目的に合いません。
以下に示す手順に従うことで、この状況に対処できます-
- SHOW CREATE TABLEを使用して、ソーステーブルの構造、インデックス、およびすべてを指定するCREATE TABLEステートメントを取得します。
- ステートメントを変更して、テーブル名をクローンテーブルの名前に変更し、ステートメントを実行します。 これにより、正確なクローンテーブルが作成されます。
- オプションで、テーブルの内容もコピーする必要がある場合は、INSERT INTO … SELECTステートメントも。
例
次の例を試して、 tutorials_tbl のクローンテーブルを作成してください。
- ステップ1 *-テーブルに関する完全な構造を取得します。
mysql> SHOW CREATE TABLE tutorials_tbl \G;
************************** *1. row* **************************
Table: tutorials_tbl
Create Table: CREATE TABLE `tutorials_tbl` (
`tutorial_id` int(11) NOT NULL auto_increment,
`tutorial_title` varchar(100) NOT NULL default '',
`tutorial_author` varchar(40) NOT NULL default '',
`submission_date` date default NULL,
PRIMARY KEY (`tutorial_id`),
UNIQUE KEY `AUTHOR_INDEX` (`tutorial_author`)
) TYPE = MyISAM
1 row in set (0.00 sec)
ERROR:
No query specified
- ステップ2 *-このテーブルの名前を変更し、別のテーブルを作成します。
mysql> CREATE TABLE clone_tbl (
-> tutorial_id int(11) NOT NULL auto_increment,
-> tutorial_title varchar(100) NOT NULL default '',
-> tutorial_author varchar(40) NOT NULL default '',
-> submission_date date default NULL,
-> PRIMARY KEY (tutorial_id),
-> UNIQUE KEY AUTHOR_INDEX (tutorial_author)
-> ) TYPE = MyISAM;
Query OK, 0 rows affected (1.80 sec)
- ステップ3 *-ステップ2を実行した後、データベースにクローンテーブルを作成します。 古いテーブルからデータをコピーしたい場合は、INSERT INTO … SELECTステートメント
mysql> INSERT INTO clone_tbl (tutorial_id,
-> tutorial_title,
-> tutorial_author,
-> submission_date)
-> SELECT tutorial_id,tutorial_title,
-> tutorial_author,submission_date
-> FROM tutorials_tbl;
Query OK, 3 rows affected (0.07 sec)
Records: 3 Duplicates: 0 Warnings: 0
最後に、必要に応じて正確なクローンテーブルを作成します。
MySQL-データベース情報
MySQLメタデータの取得と使用
MySQLから取得したい3種類の情報があります。
- クエリの結果に関する情報-これには、SELECT、UPDATE、またはDELETEステートメントの影響を受けるレコードの数が含まれます。
- テーブルとデータベースに関する情報-これには、テーブルとデータベースの構造に関する情報が含まれます。
- * MySQLサーバーに関する情報*-これには、データベースサーバーのステータス、バージョン番号などが含まれます。
MySQLプロンプトでこれらの情報をすべて取得するのは非常に簡単ですが、PERLまたはPHP APIを使用しているときに、さまざまなAPIを明示的に呼び出してこの情報をすべて取得する必要があります。
クエリの影響を受ける行数の取得
この情報を取得する方法を見てみましょう。
PERLの例
DBIスクリプトでは、クエリの実行方法に応じて、* do()コマンドまたは execute()*コマンドによって、影響を受ける行カウントが返されます。
# Method 1
# execute $query using do( )
my $count = $dbh->do ($query);
# report 0 rows if an error occurred
printf "%d rows were affected\n", (defined ($count) ? $count : 0);
# Method 2
# execute query using prepare( ) plus execute( )
my $sth = $dbh->prepare ($query);
my $count = $sth->execute ( );
printf "%d rows were affected\n", (defined ($count) ? $count : 0);
PHPの例
PHPでは、* mysql_affected_rows()*関数を呼び出して、クエリが変更された行数を調べます。
$result_id = mysql_query ($query, $conn_id);
# report 0 rows if the query failed
$count = ($result_id ? mysql_affected_rows ($conn_id) : 0);
print ("$count rows were affected\n");
テーブルとデータベースのリスト
データベースサーバーで使用可能なすべてのデータベースとテーブルをリストするのは非常に簡単です。 十分な権限がない場合、結果は null になる可能性があります。
次のコードブロックに示されているメソッドとは別に、 SHOW TABLES または SHOW DATABASES クエリを使用して、PHPまたはPERLでテーブルまたはデータベースのリストを取得できます。
PERLの例
# Get all the tables available in current database.
my @tables = $dbh->tables ( );
foreach $table (@tables ){
print "Table Name $table\n";
}
PHPの例
<?php
$con = mysql_connect("localhost", "userid", "password");
if (!$con) {
die('Could not connect: ' . mysql_error());
}
$db_list = mysql_list_dbs($con);
while ($db = mysql_fetch_object($db_list)) {
echo $db->Database . "<br/>";
}
mysql_close($con);
?>
サーバーメタデータの取得
MySQLにはいくつかの重要なコマンドがあり、MySQLプロンプトで実行するか、PHPなどのスクリプトを使用してデータベースサーバーに関するさまざまな重要な情報を取得できます。
Sr.No. | Command & Description |
---|---|
1 |
SELECT VERSION( ) サーバーのバージョン文字列 |
2 |
SELECT DATABASE( ) 現在のデータベース名(ない場合は空) |
3 |
SELECT USER( ) 現在のユーザー名 |
4 |
SHOW STATUS サーバーステータスインジケータ |
5 |
SHOW VARIABLES サーバー構成変数 |
MySQLシーケンスの使用
シーケンスは、整数1、2、3、…のセットです。 特定の要求に応じて順番に生成されます。 多くのアプリケーションではテーブルの各行に一意の値を含める必要があり、シーケンスを使用すると簡単に生成できるため、シーケンスはデータベースで頻繁に使用されます。
この章では、MySQLでシーケンスを使用する方法について説明します。
AUTO_INCREMENTカラムの使用
MySQLでシーケンスを使用する最も簡単な方法は、列を AUTO_INCREMENT として定義し、残りをMySQLに任せることです。
例
次の例を試してください。 これによりテーブルが作成され、その後、MySQLによって自動的にインクリメントされるためレコードIDを与える必要のないこのテーブルにいくつかの行が挿入されます。
mysql> CREATE TABLE insect
-> (
-> id INT UNSIGNED NOT NULL AUTO_INCREMENT,
-> PRIMARY KEY (id),
-> name VARCHAR(30) NOT NULL, # type of insect
-> date DATE NOT NULL, # date collected
-> origin VARCHAR(30) NOT NULL # where collected
);
Query OK, 0 rows affected (0.02 sec)
mysql> INSERT INTO insect (id,name,date,origin) VALUES
-> (NULL,'housefly','2001-09-10','kitchen'),
-> (NULL,'millipede','2001-09-10','driveway'),
-> (NULL,'grasshopper','2001-09-10','front yard');
Query OK, 3 rows affected (0.02 sec)
Records: 3 Duplicates: 0 Warnings: 0
mysql> SELECT * FROM insect ORDER BY id;
+----+-------------+------------+------------+
| id | name | date | origin |
+----+-------------+------------+------------+
| 1 | housefly | 2001-09-10 | kitchen |
| 2 | millipede | 2001-09-10 | driveway |
| 3 | grasshopper | 2001-09-10 | front yard |
+----+-------------+------------+------------+
3 rows in set (0.00 sec)
AUTO_INCREMENT値を取得
- LAST_INSERT_ID()*はSQL関数であるため、SQLステートメントの発行方法を理解している任意のクライアント内から使用できます。 それ以外の場合、PERLおよびPHPスクリプトは、最後のレコードの自動インクリメント値を取得するための排他的な関数を提供します。
PERLの例
*mysql_insertid* 属性を使用して、クエリによって生成された *AUTO_INCREMENT* 値を取得します。 この属性は、クエリの発行方法に応じて、データベースハンドルまたはステートメントハンドルを介してアクセスされます。
次の例では、データベースハンドルを介して参照しています。
$dbh->do ("INSERT INTO insect (name,date,origin)
VALUES('moth','2001-09-14','windowsill')");
my $seq = $dbh->{mysql_insertid};
PHPの例
AUTO_INCREMENT値を生成するクエリを発行した後、* mysql_insert_id()*コマンドを呼び出して値を取得します。
mysql_query ("INSERT INTO insect (name,date,origin)
VALUES('moth','2001-09-14','windowsill')", $conn_id);
$seq = mysql_insert_id ($conn_id);
既存のシーケンスの番号を付け直す
テーブルから多くのレコードを削除し、すべてのレコードの順序を変更したい場合があります。 これは簡単なトリックを使用して行うことができますが、テーブルが他のテーブルと結合している場合は、慎重に行う必要があります。
AUTO_INCREMENTカラムの順序変更が避けられないと判断した場合、それを行う方法はテーブルからカラムを削除してから再度追加することです。
次の例は、この手法を使用してテーブル内の* id値*の番号を変更する方法を示しています。
mysql> ALTER TABLE insect DROP id;
mysql> ALTER TABLE insect
-> ADD id INT UNSIGNED NOT NULL AUTO_INCREMENT FIRST,
-> ADD PRIMARY KEY (id);
特定の値でシーケンスを開始する
デフォルトでは、MySQLはシーケンスを1から開始しますが、テーブルの作成時に他の番号も指定できます。
次のプログラムは、MySQLが100からシーケンスを開始する方法を示す例です。
mysql> CREATE TABLE insect
-> (
-> id INT UNSIGNED NOT NULL AUTO_INCREMENT = 100,
-> PRIMARY KEY (id),
-> name VARCHAR(30) NOT NULL, # type of insect
-> date DATE NOT NULL, # date collected
-> origin VARCHAR(30) NOT NULL # where collected
);
または、テーブルを作成してから、 ALTER TABLE コマンドで初期シーケンス値を設定できます。
mysql> ALTER TABLE t AUTO_INCREMENT = 100;
MySQL-重複の処理
一般に、テーブルまたは結果セットには重複レコードが含まれることがあります。 ほとんどの場合許可されていますが、重複レコードの停止が必要になる場合があります。 重複レコードを識別し、それらをテーブルから削除する必要があります。 この章では、テーブル内の重複レコードの発生を防ぐ方法と、既存の重複レコードを削除する方法について説明します。
テーブル内での重複の防止
適切なフィールドを持つテーブルで PRIMARY KEY または UNIQUE インデックスを使用して、重複レコードを停止できます。
例を見てみましょう–次の表には、そのようなインデックスや主キーが含まれていないため、 first_name と last_name の重複レコードが許可されます。
CREATE TABLE person_tbl (
first_name CHAR(20),
last_name CHAR(20),
sex CHAR(10)
);
同じ姓名の値を持つ複数のレコードがこのテーブルに作成されないようにするには、 PRIMARY KEY をその定義に追加します。 これを行うと、 PRIMARY KEY では NULL 値が許可されないため、インデックス付き列を NOT NULL として宣言する必要もあります-
CREATE TABLE person_tbl (
first_name CHAR(20) NOT NULL,
last_name CHAR(20) NOT NULL,
sex CHAR(10),
PRIMARY KEY (last_name, first_name)
);
テーブルに一意のインデックスが存在すると、通常、インデックスを定義する列の既存のレコードを複製するテーブルにレコードを挿入すると、エラーが発生します。
*INSERT* コマンドではなく、 *INSERT IGNORE* コマンドを使用します。 レコードが既存のレコードを複製しない場合、MySQLは通常どおりレコードを挿入します。 レコードが重複している場合、 *IGNORE* キーワードは、エラーを生成せずにサイレントに破棄するようMySQLに指示します。
次の例ではエラーは発生せず、同時に重複レコードも挿入されません。
mysql> INSERT IGNORE INTO person_tbl (last_name, first_name)
-> VALUES( 'Jay', 'Thomas');
Query OK, 1 row affected (0.00 sec)
mysql> INSERT IGNORE INTO person_tbl (last_name, first_name)
-> VALUES( 'Jay', 'Thomas');
Query OK, 0 rows affected (0.00 sec)
INSERTコマンドではなく、 REPLACE コマンドを使用します。 レコードが新しい場合は、INSERTと同様に挿入されます。 重複している場合、新しいレコードが古いレコードを置き換えます。
mysql> REPLACE INTO person_tbl (last_name, first_name)
-> VALUES( 'Ajay', 'Kumar');
Query OK, 1 row affected (0.00 sec)
mysql> REPLACE INTO person_tbl (last_name, first_name)
-> VALUES( 'Ajay', 'Kumar');
Query OK, 2 rows affected (0.00 sec)
INSERT IGNOREおよびREPLACEコマンドは、実行する複製処理動作に従って選択する必要があります。 INSERT IGNOREコマンドは、複製されたレコードの最初のセットを保持し、残りを破棄します。 REPLACEコマンドは、重複の最後のセットを保持し、以前の重複を消去します。
一意性を強制する別の方法は、PRIMARY KEYではなく UNIQUE インデックスをテーブルに追加することです。
CREATE TABLE person_tbl (
first_name CHAR(20) NOT NULL,
last_name CHAR(20) NOT NULL,
sex CHAR(10)
UNIQUE (last_name, first_name)
);
重複のカウントと特定
以下は、テーブル内のfirst_nameとlast_nameを持つ重複レコードをカウントするクエリです。
mysql> SELECT COUNT(*) as repetitions, last_name, first_name
-> FROM person_tbl
-> GROUP BY last_name, first_name
-> HAVING repetitions > 1;
このクエリは、person_tblテーブル内のすべての重複レコードのリストを返します。 一般に、重複する値のセットを識別するには、以下の手順を実行します。
- 重複する可能性のある値が含まれている列を判別します。
- 列選択リストにそれらの列を* COUNT(*)*とともにリストします。
- GROUP BY 句の列もリストします。
- グループカウントを1より大きくする必要があるため、一意の値を削除する HAVING 句を追加します。
クエリ結果から重複を排除する
SELECTステートメントと一緒に DISTINCT コマンドを使用して、テーブルで使用可能な一意のレコードを見つけることができます。
mysql> SELECT DISTINCT last_name, first_name
-> FROM person_tbl
-> ORDER BY last_name;
DISTINCTコマンドの代わりに、選択する列に名前を付けるGROUP BY句を追加します。 これには、重複を削除し、指定された列の値の一意の組み合わせのみを選択するという効果があります。
mysql> SELECT last_name, first_name
-> FROM person_tbl
-> GROUP BY (last_name, first_name);
テーブル置換を使用した重複の削除
テーブルに重複するレコードがあり、そのテーブルからすべての重複するレコードを削除する場合は、次の手順に従います。
mysql> CREATE TABLE tmp SELECT last_name, first_name, sex
-> FROM person_tbl;
-> GROUP BY (last_name, first_name);
mysql> DROP TABLE person_tbl;
mysql> ALTER TABLE tmp RENAME TO person_tbl;
テーブルから重複レコードを削除する簡単な方法は、そのテーブルにINDEXまたはPRIMARY KEYを追加することです。 このテーブルが既に利用可能な場合でも、この手法を使用して重複レコードを削除でき、将来的にも安全です。
mysql> ALTER IGNORE TABLE person_tbl
-> ADD PRIMARY KEY (last_name, first_name);
MySQL-およびSQLインジェクション
Webページからユーザー入力を取得し、それをMySQLデータベースに挿入すると、* SQLインジェクション*として知られるセキュリティ問題が発生する可能性があります。 この章では、これを防ぎ、スクリプトとMySQLステートメントを保護する方法を説明します。
SQLインジェクションは通常、名前などの入力をユーザーに要求すると発生します。名前の代わりに、データベースで無意識に実行するMySQLステートメントを提供します。
ユーザーから提供されたデータを信頼しないでください。検証後にのみこのデータを処理してください。原則として、これはパターンマッチングによって行われます。 次の例では、ユーザー名は英数字とアンダースコアに制限され、8〜20文字の長さに制限されています。必要に応じてこれらのルールを変更します。
if (preg_match("/^\w{8,20}$/", $_GET['username'], $matches)) {
$result = mysql_query("SELECT *FROM users WHERE username = $matches[0]");
} else {
echo "username not accepted";
}
この問題を実証するには、次の抜粋を検討してください。
//supposed input
$name = "Qadir'; DELETE FROM users;";
mysql_query("SELECT* FROM users WHERE name = '{$name}'");
関数呼び出しは、usersテーブルからレコードを取得することになっています。name列は、ユーザーが指定した名前と一致します。 通常の状況では、$ nameには英数字とスペースのみが含まれます。 しかし、ここでは、完全に新しいクエリを $ name に追加することにより、データベースへの呼び出しが災害に変わります。 挿入されたDELETEクエリは、ユーザーからすべてのレコードを削除します。
幸いなことに、MySQLを使用している場合、* mysql_query()*関数は、単一の関数呼び出しでのクエリのスタックまたは複数のクエリの実行を許可しません。 クエリをスタックしようとすると、呼び出しは失敗します。
ただし、 SQLite や PostgreSQL などの他のPHPデータベース拡張機能は、スタッククエリを喜んで実行し、1つの文字列で提供されるすべてのクエリを実行し、深刻なセキュリティ問題を引き起こします。
SQLインジェクションの防止
PERLやPHPなどのスクリプト言語では、すべてのエスケープ文字をスマートに処理できます。 PHPのMySQL拡張機能は、MySQLに特殊な入力文字をエスケープする関数* mysql_real_escape_string()*を提供します。
if (get_magic_quotes_gpc()) {
$name = stripslashes($name);
}
$name = mysql_real_escape_string($name);
mysql_query("SELECT *FROM users WHERE name = '{$name}'");
LIKE Quandary
LIKEの難題に対処するには、カスタムエスケープメカニズムでユーザー指定の%および_文字をリテラルに変換する必要があります。* addcslashes()*を使用します。これは、エスケープする文字範囲を指定できる関数です。
$sub = addcslashes(mysql_real_escape_string("%something_"), "%_");
//$sub == \%something\_
mysql_query("SELECT * FROM messages WHERE subject LIKE '{$sub}%'");
MySQL-データベースのエクスポート
テーブルデータをテキストファイルにエクスポートする最も簡単な方法は、クエリ結果をサーバーホスト上のファイルに直接エクスポートする SELECT … INTO OUTFILE ステートメントを使用することです。
SELECTを使用したデータのエクスポート… INTO OUTFILEステートメント
このステートメントの構文は、通常の SELECT コマンドと INTO OUTFILE filename を最後に組み合わせます。 デフォルトの出力形式は、LOAD DATAコマンドの場合と同じです。 そのため、次のステートメントは tutorials_tbl テーブルを /tmp/tutorials.txt にタブ区切りの改行で終了したファイルとしてエクスポートします。
mysql> SELECT *FROM tutorials_tbl
-> INTO OUTFILE '/tmp/tutorials.txt';
さまざまなオプションを使用して出力形式を変更し、列とレコードを引用および区切る方法を指定できます。 CRLFで終了する行を含むCSV形式でtutorial_tblテーブルをエクスポートするには、次のコードを使用します。
mysql> SELECT* FROM passwd INTO OUTFILE '/tmp/tutorials.txt'
-> FIELDS TERMINATED BY ',' ENCLOSED BY '"'
-> LINES TERMINATED BY '\r\n';
*SELECT ... INTO OUTFILE* には次のプロパティがあります-
*出力ファイルはMySQLサーバーによって直接作成されるため、ファイル名はファイルをサーバーホスト上で書き込む場所を示す必要があります。* LOAD *の *LOCAL* バージョンに類似したステートメントのLOCALバージョンはありません。
* * SELECT ...を実行するには、 *MySQL FILE* 権限が必要です。 INTO *ステートメント。
* 出力ファイルが既に存在していてはなりません。 これにより、MySQLが重要なファイルを破壊するのを防ぎます。
* サーバーホストにログインアカウントを持っているか、そのホストからファイルを取得する何らかの方法が必要です。 それ以外の場合、 *SELECT ... INTO OUTFILE* コマンドは、ほとんどの場合価値がありません。
* UNIXでは、ファイルは*世界で読み取り可能*に作成され、MySQLサーバーが所有します。 つまり、ファイルを読み取ることはできますが、削除できない場合があります。
生データとしてのテーブルのエクスポート
*mysqldump* プログラムは、テーブルとデータベースのコピーまたはバックアップに使用されます。 テーブル出力を *Raw Datafile* として、またはテーブル内のレコードを再作成する *INSERT* ステートメントのセットとして書き込むことができます。
テーブルをデータファイルとしてダンプするには、MySQLサーバーがファイルを書き込むディレクトリを示す*-tab *オプションを指定する必要があります。
たとえば、 tutorials_tbl テーブルを TUTORIALS データベースから /tmp ディレクトリのファイルにダンプするには、以下に示すコマンドを使用します。
$ mysqldump -u root -p --no-create-info \
--tab=/tmp tutorials tutorials_tbl
password ******
テーブルの内容または定義をSQL形式でエクスポートする
テーブルをSQL形式でファイルにエクスポートするには、以下に示すコマンドを使用します。
$ mysqldump -u root -p TUTORIALS tutorials_tbl > dump.txt
password ******
これにより、次のようなコンテンツを持つファイルが作成されます。
-- MySQL dump 8.23
--
-- Host: localhost Database: TUTORIALS
---------------------------------------------------------
-- Server version 3.23.58
--
-- Table structure for table `tutorials_tbl`
--
CREATE TABLE tutorials_tbl (
tutorial_id int(11) NOT NULL auto_increment,
tutorial_title varchar(100) NOT NULL default '',
tutorial_author varchar(40) NOT NULL default '',
submission_date date default NULL,
PRIMARY KEY (tutorial_id),
UNIQUE KEY AUTHOR_INDEX (tutorial_author)
) TYPE = MyISAM;
--
-- Dumping data for table `tutorials_tbl`
--
INSERT INTO tutorials_tbl
VALUES (1,'Learn PHP','John Poul','2007-05-24');
INSERT INTO tutorials_tbl
VALUES (2,'Learn MySQL','Abdul S','2007-05-24');
INSERT INTO tutorials_tbl
VALUES (3,'JAVA Tutorial','Sanjay','2007-05-06');
複数のテーブルをダンプするには、それらすべてにデータベース名引数を続けて名前を付けます。 データベース全体をダンプするには、次のコードブロックに示すように、データベースにちなんでテーブルに名前を付けないでください。
$ mysqldump -u root -p TUTORIALS > database_dump.txt
password ******
ホストで使用可能なすべてのデータベースをバックアップするには、次のコードを使用します。
$ mysqldump -u root -p --all-databases > database_dump.txt
password ******
--all-databasesオプションは、MySQL 3.23.12バージョンで使用できます。 この方法は、データベースのバックアップ戦略を実装するために使用できます。
テーブルまたはデータベースを別のホストにコピーする
あるMySQLサーバーから別のMySQLサーバーにテーブルまたはデータベースをコピーする場合は、データベース名とテーブル名で mysqldump を使用します。
ソースホストで次のコマンドを実行します。 これにより、データベース全体が dump.txt ファイルにダンプされます。
$ mysqldump -u root -p database_name table_name > dump.txt
password *****
上記で説明したように、特定のテーブル名を使用せずにデータベース全体をコピーできます。
次に、別のホストでdump.txtファイルをftpし、次のコマンドを使用します。 このコマンドを実行する前に、宛先サーバーにdatabase_nameを作成したことを確認してください。
$ mysql -u root -p database_name < dump.txt
password *****
中間ファイルを使用せずにこれを達成する別の方法は、mysqldumpの出力をネットワーク経由でリモートMySQLサーバーに直接送信することです。 ソースデータベースが存在するホストから両方のサーバーに接続できる場合は、次のコマンドを使用します(両方のサーバーにアクセスできることを確認してください)。
$ mysqldump -u root -p database_name \
| mysql -h other-host.com database_name
mysqldumpでは、コマンドの半分がローカルサーバーに接続し、ダンプ出力をパイプに書き込みます。 コマンドの残りの半分は、other-host.com上のリモートMySQLサーバーに接続します。 入力用のパイプを読み取り、各ステートメントをother-host.comサーバーに送信します。
MySQL-データベースのインポート-復旧方法
MySQLには、以前にバックアップしたファイルからMySQLデータベースにデータをロードする2つの簡単な方法があります。
LOAD DATAを使用したデータのインポート
MySQLは、バルクデータローダーとして機能するLOAD DATAステートメントを提供します。 以下は、現在のディレクトリから dump.txt ファイルを読み取り、現在のデータベースの mytbl テーブルにロードするステートメントの例です。
mysql> LOAD DATA LOCAL INFILE 'dump.txt' INTO TABLE mytbl;
- LOCAL キーワードが存在しない場合、MySQLは、ファイルシステムのルートから始まるファイルの場所を完全に指定する* looking to absolute pathnameを使用して、サーバーホスト上でデータファイルを検索します。 MySQLは、指定された場所からファイルを読み取ります。
- デフォルトでは、 LOAD DATA は、データファイルに改行(改行)で終了する行が含まれ、行内のデータ値がタブで区切られていると想定しています。
- ファイル形式を明示的に指定するには、 FIELDS 句を使用して行内のフィールドの特性を記述し、 LINES 句を使用して行末シーケンスを指定します。 次の LOAD DATA ステートメントは、データファイルに、コロンで区切られた値と、改行と改行文字で終了する行が含まれることを指定します。
mysql> LOAD DATA LOCAL INFILE 'dump.txt' INTO TABLE mytbl
-> FIELDS TERMINATED BY ':'
-> LINES TERMINATED BY '\r\n';
- LOAD DATAコマンドは、データファイルの列の順序が表の列の順序と同じであることを前提としています。 それが当てはまらない場合は、リストを指定して、データファイル列をロードするテーブル列を指定できます。 テーブルに列a、b、およびcがあるが、データファイル内の連続する列が列b、c、およびaに対応するとします。
次のコードブロックに示すように、ファイルをロードできます。
mysql> LOAD DATA LOCAL INFILE 'dump.txt'
-> INTO TABLE mytbl (b, c, a);
mysqlimportを使用したデータのインポート
MySQLには、コマンドラインから入力ファイルを直接ロードできるように、LOAD DATAのラッパーとして機能する mysqlimport というユーティリティプログラムも含まれています。
*dump.txt* から *mytbl* にデータをロードするには、UNIXプロンプトで次のコマンドを使用します。
$ mysqlimport -u root -p --local database_name dump.txt
password *****
*mysqlimport* を使用する場合、コマンドラインオプションはフォーマット指定子を提供します。 前の2つの *LOAD DATA* ステートメントに対応する *mysqlimport* コマンドは、次のコードブロックに示すようになります。
$ mysqlimport -u root -p --local --fields-terminated-by = ":" \
--lines-terminated-by = "\r\n" database_name dump.txt
password *****
オプションを指定する順序は、mysqlimportでは重要ではありません。ただし、オプションはすべてデータベース名の前に置く必要があります。
*mysqlimport* ステートメントは*-columns *オプションを使用して列の順序を指定します-
$ mysqlimport -u root -p --local --columns=b,c,a \
database_name dump.txt
password *****
引用符と特殊文字の処理
FIELDS句では、 TERMINATED BY 以外の形式オプションを指定できます。 デフォルトでは、LOAD DATAは値が引用符で囲まれていないと想定し、バックスラッシュ(\)を特殊文字のエスケープ文字として解釈します。 値を引用する文字を明示的に示すには、 ENCLOSED BY コマンドを使用します。 MySQLは、入力処理中にデータ値の末尾からその文字を取り除きます。 デフォルトのエスケープ文字を変更するには、 ESCAPED BY を使用します。
ENCLOSED BYを指定して、引用文字をデータ値から削除することを示す場合、引用文字を二重にするか、エスケープ文字を前に付けることにより、引用文字をデータ値にそのまま含めることができます。
たとえば、引用符とエスケープ文字が "と\の場合、入力値*" a "" b \ "c" は *a "b" c として解釈されます。
*mysqlimport* の場合、引用符とエスケープ値を指定するための対応するコマンドラインオプションは、*-fields-enclosed-by *および*-fields-escaped-by *です。