MySQLi-クイックガイド
データベースとは何ですか?
データベースは、データのコレクションを格納する別個のアプリケーションです。各データベースには、保持するデータを作成、アクセス、管理、検索、および複製するための1つ以上の個別のAPIがあります。
ファイルシステム上のファイルやメモリ内の大きなハッシュテーブルなど、他の種類のデータストアを使用することもできますが、これらのタイプのシステムでは、データのフェッチと書き込みはそれほど高速で簡単ではありません。
そのため、今日では、リレーショナルデータベース管理システム(RDBMS)を使用して、大量のデータを格納および管理しています。これは、すべてのデータが異なるテーブルに格納され、主キーまたは外部キーと呼ばれる他のキーを使用して関係が確立されるため、リレーショナルデータベースと呼ばれます。
A Relational DataBase Management System (RDBMS) はソフトウェアです-
テーブル、列、およびインデックスを使用してデータベースを実装できます。
さまざまなテーブルの行間の参照整合性を保証します。
インデックスを自動的に更新します。
SQLクエリを解釈し、さまざまなテーブルの情報を組み合わせます。
RDBMSの用語
MySQLiデータベースシステムの説明に進む前に、データベースに関連するいくつかの定義を修正しましょう。
Database −データベースは、関連データを含むテーブルのコレクションです。
Table−テーブルはデータを含む行列です。データベース内のテーブルは、単純なスプレッドシートのように見えます。
Column − 1つの列(データ要素)には、同じ種類のデータ(たとえば、列の郵便番号)が含まれます。
Row −行(=タプル、エントリー、またはレコード)は、関連データのグループです。たとえば、1つのサブスクリプションのデータです。
Redundancy −システムを高速化するために、データを2回冗長に保存します。
Primary Key−主キーは一意です。キー値は、1つのテーブルで2回出現することはできません。キーを使用すると、最大で1つの行を見つけることができます。
Foreign Key −外部キーは、2つのテーブル間のリンクピンです。
Compound Key −複合キー(複合キー)は、1つの列が十分に一意ではないため、複数の列で構成されるキーです。
Index −データベース内のインデックスは、本の裏にあるインデックスに似ています。
Referential Integrity −参照整合性は、外部キー値が常に既存の行を指すようにします。
MySQLiデータベース
MySQLiは、多くの中小企業で使用されている高速で使いやすいRDBMSです。MySQLi Extensionは、MySQLによって開発、販売、およびサポートされています。MySQLは、多くの正当な理由により非常に人気が高まっています-
MySQLiはオープンソースライセンスの下でリリースされています。したがって、それを使用するために支払うものは何もありません。
MySQLiはそれ自体が非常に強力なプログラムです。これは、最も高価で強力なデータベースパッケージの機能の大部分を処理します。
MySQLiは、よく知られているSQLデータ言語の標準形式を使用します。
MySQLiは、多くのオペレーティングシステムで動作し、PHP、PERL、C、C ++、JAVAなどの多くの言語で動作します。
MySQLiは非常に高速に動作し、大きなデータセットでも正常に動作します。
MySQLiは、Web開発で最も高く評価されている言語であるPHPに非常に適しています。
MySQLiは、テーブル内で最大5,000万行以上の大規模なデータベースをサポートします。テーブルのデフォルトのファイルサイズ制限は4GBですが、これを(オペレーティングシステムが処理できる場合)理論上の制限である800万テラバイト(TB)まで増やすことができます。
MySQLiはカスタマイズ可能です。オープンソースのGPLライセンスにより、プログラマーはMySQLソフトウェアを自分の特定の環境に合うように変更できます。
あなたが始める前に
このチュートリアルを開始する前に、PHPおよびHTMLチュートリアルでカバーされている情報の基本的な知識を持っている必要があります。
このチュートリアルでは、PHP環境でのMySQLiの使用に重点を置いています。このチュートリアルに記載されている多くの例は、PHPプログラマーに役立ちます。
参考までに、PHPチュートリアルを確認することをお勧めします。
MySQLのダウンロード
MySQLi拡張機能は、MySQLバージョン4.1.13以降で動作するように設計されているため、MySQLをダウンロードする必要があります。MySQLのすべてのダウンロードは、MySQLDownloadsにあります。必要なMySQLCommunity Serverの最新バージョン番号と、可能な限り正確に、必要なプラットフォームを選択します。
Linux / UNIXへのMySQLのインストール
LinuxシステムにMySQLをインストールするための推奨される方法は、RPMを使用することです。MySQL ABは、次のRPMをWebサイトからダウンロードできるようにします-
MySQL −データベースとテーブルを管理し、ユーザーアクセスを制御し、SQLクエリを処理するMySQLデータベースサーバー。
MySQL-client −サーバーへの接続とサーバーとの対話を可能にするMySQLクライアントプログラム。
MySQL-devel −MySQLを使用する他のプログラムをコンパイルするときに便利なライブラリとヘッダーファイル。
MySQL-shared −MySQLクライアントの共有ライブラリ。
MySQL-bench −MySQLデータベースサーバーのベンチマークおよびパフォーマンステストツール。
ここにリストされているMySQLRPMはすべてSuSELinuxシステム上に構築されていますが、通常は他のLinuxバリアントでも問題なく動作します。
次に、次の手順に従ってインストールを続行します-
を使用してシステムにログインします root ユーザー。
RPMを含むディレクトリに切り替えます-
次のコマンドを実行して、MySQLデータベースサーバーをインストールします。イタリック体のファイル名をRPMのファイル名に置き換えることを忘れないでください。
[root@host]# rpm -i MySQL-5.0.9-0.i386.rpm
これはオプションですが、残りのRPMを同じ方法でインストールするための推奨手順です。
上記のコマンドは、MySQLサーバーのインストール、MySQLのユーザーの作成、必要な構成の作成、およびMySQLサーバーの自動起動を処理します。
MySQL関連のすべてのバイナリは/ usr / binおよび/ usr / sbinにあります。すべてのテーブルとデータベースは/ var / lib / mysqlディレクトリに作成されます。
[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
NOTE − 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バイナリが必要です。
MySQLiサーバーの実行とシャットダウン
MySQLiは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: ******
MySQLiユーザーアカウントの設定
MySQLの改良版であるMySQLiに新しいユーザーを追加するには、に新しいエントリを追加する必要があります。 user データベース内のテーブル mysql。
以下は、新しいユーザーを追加する例です guest SELECT、INSERT、およびUPDATE権限とパスワード guest123; 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に暗号化されています。
FLUSHPRIVILEGESステートメントに注意してください。これは、許可テーブルを再ロードするようにサーバーに指示します。これを使用しない場合、少なくともサーバーが再起動されるまで、新しいユーザーアカウントを使用して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
ユーザーアカウントを追加する別の方法は、GRANTSQLコマンドを使用することです。次の例では、ユーザーを追加しますzara パスワード付き zara123 と呼ばれる特定のデータベースの場合 TUTORIALS。
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';
これにより、mysqlデータベーステーブルに次のようなエントリも作成されます。 user。
NOTE − SQLコマンドの最後にセミコロン(;)を指定するまで、MySQLはコマンドを終了しません。
/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
ここで、エラーログ用に別のディレクトリを指定できます。それ以外の場合は、このテーブルのエントリを変更しないでください。
管理MySQLiコマンド
これが重要なMySQLiコマンドのリストです。MySQLデータベースを操作するために時々使用します-
USE Databasename −これは、MySQLiワークエリア内の特定のデータベースを選択するために使用されます。
SHOW DATABASES − MySQLiDBMSがアクセスできるデータベースを一覧表示します。
SHOW TABLES − useコマンドでデータベースが選択されると、データベース内のテーブルが表示されます。
SHOW COLUMNS FROM tablename −テーブルの属性、属性のタイプ、キー情報、NULLが許可されているかどうか、デフォルト、およびその他の情報を表示します。
SHOW INDEX FROM tablename − PRIMARY KEYを含む、テーブル上のすべてのインデックスの詳細を表示します。
SHOW TABLE STATUS LIKE tablename\G − MySQLiDBMSのパフォーマンスと統計の詳細を報告します。
MySQLiは、PERL、C、C ++、JAVA、PHPなどのさまざまなプログラミング言語の組み合わせで非常にうまく機能します。これらの言語の中で、PHPはそのWebアプリケーション開発機能のために最も人気のある言語です。
このチュートリアルでは、PHP環境でのMySQLiの使用に重点を置いています。PHPは、MySQLiデータベースにアクセスし、MySQLiデータベース内のデータレコードを操作するためのさまざまな関数を提供します。他のPHP関数を呼び出すのと同じ方法でPHP関数を呼び出す必要があります。
MySQLiで使用するPHP関数の一般的な形式は次のとおりです。
mysqli_function(value,value,...);
関数名の2番目の部分は関数に固有であり、通常は関数の機能を説明する単語です。以下は、チュートリアルで使用する2つの関数です。
mysqli_connect($connect);
mysqli_query($connect,"SQL statement");
次の例は、MySQLi関数を呼び出すためのPHPの一般的な構文を示しています。
<html>
<head>
<title>PHP with MySQLi</title>
</head>
<body>
<?php
$retval = mysqli_function(value, [value,...]);
if( !$retval ){
die ( "Error: a related error message" );
}
// Otherwise MySQLi or PHP Statements
?>
</body>
</html>
次の章から、PHPとともにすべての重要なMySQLi機能を見ていきます。
mysqlバイナリを使用したMySQLi接続
を使用してMySQLiデータベースを確立できます mysql コマンドプロンプトでバイナリ。
例
これは、MySQLサーバーに接続してコマンドプロンプトからmysqliデータベースを確立する簡単な例です-
[root@host]# mysql -u root -p
Enter password:******
これにより、任意のSQLコマンドを実行できるmysql>コマンドプロンプトが表示されます。以下は上記のコマンドの結果です-
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スクリプトを使用したMySQLi接続
PHPは提供します mysqli_connect()データベース接続を開く関数。この関数は5つのパラメーターを受け取り、成功した場合はMySQLiリンク識別子を返し、失敗した場合はFALSEを返します。
構文
connection mysqli_connect(server,user,passwd,new_link,client_flag);
シニア番号 | パラメータと説明 |
---|---|
1 | server オプション-データベースサーバーを実行しているホスト名。指定しない場合、デフォルト値はlocalhost:3306。 |
2 | user オプション-データベースにアクセスするユーザー名。指定しない場合、デフォルトはサーバープロセスを所有するユーザーの名前です。 |
3 | passwd オプション-データベースにアクセスするユーザーのパスワード。指定しない場合、デフォルトは空のパスワードです。 |
4 | new_link オプション-同じ引数を使用してmysqli_connect()が2回呼び出された場合、新しい接続は確立されません。代わりに、すでに開かれている接続の識別子が返されます。 |
5 | client_flags オプション-次の定数の組み合わせ-
|
別のPHP関数を使用していつでもMySQLiデータベースから切断できます mysqli_close()。この関数は、によって返される接続である単一のパラメーターを取りますmysqli_connect() 関数。
構文
bool mysqli_close ( resource $link_identifier );
リソースが指定されていない場合、最後に開かれたデータベースは閉じられます。この関数は、接続を正常に閉じるとtrueを返し、それ以外の場合はfalseを返します。
例
次の例を試して、MySQLサーバーに接続してください-
<html>
<head>
<title>Connecting MySQLi Server</title>
</head>
<body>
<?php
$dbhost = 'localhost:3306'; $dbuser = 'guest';
$dbpass = 'guest123'; $conn = mysqli_connect($dbhost, $dbuser, $dbpass); if(! $conn ){
die('Could not connect: ' . mysqli_error());
}
echo 'Connected successfully';
mysqli_close($conn);
?>
</body>
</html>
上記の例がMySQLiに接続されている場合、ブラウザでの出力は次のようになります-
Connected successfully
mysqladminを使用してデータベースを作成する
MySQLiデータベースを作成または削除するには、特別な権限が必要になります。したがって、rootユーザーにアクセスできると仮定すると、mysqlを使用して任意のデータベースを作成できます。mysqladmin バイナリ。
例
これは、というデータベースを作成する簡単な例です。 TUTORIALS −
[root@host]# mysqladmin -u root -p create TUTORIALS
Enter password:******
これにより、MySQLiデータベースのチュートリアルが作成されます。
PHPスクリプトを使用してデータベースを作成する
PHPは mysqli_queryMySQLiデータベースを作成または削除する関数。この関数は2つのパラメーターを取り、成功した場合はTRUEを返し、失敗した場合はFALSEを返します。
例
次の例を試してデータベースを作成してください-
<html>
<head>
<title>Connecting MySQLi Server</title>
</head>
<body>
<?php
$dbhost = 'localhost:3306';
$dbuser = 'root'; $dbpass = '<password here>';
$conn = mysqli_connect($dbhost, $dbuser, $dbpass);
if(! $conn ){ echo 'Connected failure<br>'; } echo 'Connected successfully<br>'; $sql = "CREATE DATABASE TUTORIALS";
if (mysqli_query($conn, $sql)) {
echo "Database created successfully";
} else {
echo "Error creating database: " . mysqli_error($conn); } mysqli_close($conn);
?>
</body>
</html>
接続してデータベースを正常に作成した場合、サンプル出力は次のようになります。
Connected successfully
Database created successfully
mysqladminを使用してデータベースを削除します
MySQLiデータベースを作成または削除するには、特別な権限が必要になります。したがって、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は queryMySQLiデータベースを作成または削除する関数。この関数は2つのパラメーターを取り、成功した場合はTRUEを返し、失敗した場合はFALSEを返します。
例
次の例を試して、データベースを削除してください-
<html>
<head>
<title>Connecting MySQLi Server>/title>
</head>
<body>
<?php
$dbhost = 'localhost:3306'; $dbuser = 'root';
$dbpass = '<Password Here>'; $conn = mysqli_connect($dbhost, $dbuser, $dbpass); if(! $conn ){
echo 'Connected failure<br>';
}
echo 'Connected successfully<br>';
$sql = "DROP DATABASE TUTORIALS"; if (mysqli_query($conn, $sql)) { echo "Record deleted successfully"; } else { echo "Error deleting record: " . mysqli_error($conn);
}
mysqli_close($conn);
?>
</body>
</html>
WARNING− PHPスクリプトを使用してデータベースを削除している間、確認を求めるプロンプトは表示されません。したがって、MySQLiデータベースを削除するときは注意してください。
データベースが正常に接続および削除された場合、サンプル出力は次のようになります。
Connected successfully
Database deleted successfully
MySQLiサーバーに接続したら、使用する特定のデータベースを選択する必要があります。これは、MySQLiサーバーで使用できるデータベースが複数ある可能性があるためです。
構文
bool mysqli_select_db( db_name, connection );
シニア番号 | パラメータと説明 |
---|---|
1 | db_name 必須-選択するMySQLiデータベース名 |
2 | connection オプション-指定されていない場合、mysqli_connectによって最後に開かれた接続が使用されます。 |
例
これは、データベースを選択する方法を示す例です。
<html>
<head>
<title>Connecting MySQLi Server</title>
</head>
<body>
<?php
$dbhost = 'localhost:3306';
$dbuser = 'root'; $dbpass = '<Password Here>';
$conn = mysqli_connect($dbhost, $dbuser, $dbpass);
if(! $conn ) { echo 'Connected failure<br>'; } echo 'Connected successfully<br>'; mysqli_select_db( 'TUTORIALS' ); //Write some code here mysqli_close($conn);
?>
</body>
</html>
データベースが正常に接続され、選択されている場合、サンプル出力は次のようになります。
Connected successfully
テーブル内のフィールドを適切に定義することは、データベースの全体的な最適化にとって重要です。実際に使用する必要があるフィールドのタイプとサイズのみを使用する必要があります。2文字しか使用しないことがわかっている場合は、フィールドを10文字幅として定義しないでください。これらのタイプのフィールド(または列)は、データ型の後にデータ型とも呼ばれます。type of data これらのフィールドに保存します。
MySQLiは、数値、日付と時刻、および文字列タイプの3つのカテゴリに分類される多くの異なるデータ型を使用します。
数値データ型
MySQLiはすべての標準ANSISQL数値データ型を使用するため、別のデータベースシステムからMySQLiを使用する場合、これらの定義は見覚えがあるでしょう。次のリストは、一般的な数値データ型とその説明を示しています-
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) −符号なしにできない、パックされていない浮動小数点数。パックされていない小数では、各小数は1バイトに対応します。表示長(M)と小数点以下の桁数(D)を定義する必要があります。NUMERICはDECIMALの同義語です。
日付と時刻のタイプ
MySQLの日付と時刻のデータ型は次のとおりです。
DATE− YYYY-MM-DD形式の日付、1000-01-01から9999-12-31の間。たとえば、1973年12月30日は1973-12-30として保存されます。
DATETIME− YYYY-MM-DD HH:MM:SS形式の日付と時刻の組み合わせ。1000-01-0100:00:00から9999-12-3123:59:59まで。たとえば、1973年12月30日の午後3時30分は、1973-12-3015: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です。
文字列タイプ
数値と日付のタイプは楽しいですが、保存するほとんどのデータは文字列形式になります。このリストでは、MySQLiの一般的な文字列データ型について説明します。
CHAR(M)− 1〜255文字の長さの固定長文字列(たとえば、CHAR(5))。格納時に指定された長さまでスペースが右に埋め込まれます。長さを定義する必要はありませんが、デフォルトは1です。
VARCHAR(M)−長さが1〜255文字の可変長ストリング。たとえば、VARCHAR(25)。VARCHARフィールドを作成するときに長さを定義する必要があります。
BLOB or TEXT−最大長65535文字のフィールド。BLOBは「バイナリラージオブジェクト」であり、画像やその他の種類のファイルなど、大量のバイナリデータを格納するために使用されます。TEXTとして定義されたフィールドも、大量のデータを保持します。2つの違いは、保存されたデータの並べ替えと比較では、BLOBでは大文字と小文字が区別され、TEXTフィールドでは大文字と小文字が区別されないことです。BLOBまたはTEXTで長さを指定しないでください。
TINYBLOB or TINYTEXT−最大長が255文字のBLOBまたはTEXT列。TINYBLOBまたはTINYTEXTで長さを指定しないでください。
MEDIUMBLOB or MEDIUMTEXT−最大長が16777215文字のBLOBまたはTEXT列。MEDIUMBLOBまたはMEDIUMTEXTでは長さを指定しません。
LONGBLOB or LONGTEXT−最大長が4294967295文字のBLOBまたはTEXT列。LONGBLOBまたはLONGTEXTで長さを指定しないでください。
ENUM −列挙型。これはリストの派手な用語です。ENUMを定義するときは、値を選択する必要がある(またはNULLにすることができる)項目のリストを作成します。たとえば、フィールドに「A」、「B」、または「C」を含める場合は、ENUMをENUM( 'A'、 'B'、 'C')として定義し、それらの値(またはNULL)のみを定義します。そのフィールドにデータを入力できます。
テーブル作成コマンドには-が必要です
- テーブルの名前
- フィールドの名前
- 各フィールドの定義
構文
これがMySQLiテーブルを作成するための一般的なSQL構文です-
CREATE TABLE table_name (column_name column_type);
ここで、次のテーブルを作成します。 TUTORIALS データベース。
CREATE TABLE tutorials_inf(
id INT AUTO_INCREMENT,
name VARCHAR(20) NOT NULL,
primary key (id),
);
ここで説明が必要な項目はほとんどありません-
フィールド属性 NOT NULLこのフィールドをNULLにしたくないため、が使用されています。したがって、ユーザーがNULL値でレコードを作成しようとすると、MySQLiはエラーを発生させます。
フィールド属性 AUTO_INCREMENT MySQLiに先に進み、次に使用可能な番号をidフィールドに追加するように指示します。
キーワード PRIMARY KEY列を主キーとして定義するために使用されます。コンマで区切られた複数の列を使用して、主キーを定義できます。
コマンドプロンプトからのテーブルの作成
これは、mysql>プロンプトからMySQLiテーブルを作成するのは簡単です。SQLコマンドを使用しますCREATE TABLE テーブルを作成します。
例
これが作成する例です tutorials_tbl −
root@host# mysql -u root -p
Enter password:*******
mysql> use TUTORIALS;
Database changed
mysql> CREATE TABLE tutorials_inf(
id INT AUTO_INCREMENT,name VARCHAR(20) NOT NULL,primary key (id));
Query OK, 0 rows affected (0.16 sec)
mysql>
NOTE − MySQLiは、SQLコマンドの最後にセミコロン(;)を指定するまで、コマンドを終了しません。
PHPスクリプトを使用したテーブルの作成
既存のデータベースに新しいテーブルを作成するには、PHP関数を使用する必要があります mysqli_query()。2番目の引数を適切なSQLコマンドで渡して、テーブルを作成します。
例
PHPスクリプトを使用してテーブルを作成する例を次に示します-
<html>
<head>
<title>Creating MySQLi Tables</title>
</head>
<body>
<?php
$host = 'localhost:3306'; $user = 'root';
$pass = '<Password Here>'; $dbname = 'TUTORIALS';
$conn = mysqli_connect($host, $user, $pass,$dbname); if(!$conn){
die('Could not connect: '.mysqli_connect_error());
}
echo 'Connected successfully<br/>';
$sql = "create table tutorials_inf( id INT AUTO_INCREMENT,name VARCHAR(20) NOT NULL,primary key (id))"; if(mysqli_query($conn, $sql)){ echo "Table created successfully"; } else { echo "Table is not created successfully "; } mysqli_close($conn);
?>
</body>
</html>
サンプル出力は次のようになります-
Connected successfully
Table created successfully
既存のMySQLiテーブルを削除するのは非常に簡単ですが、失われたデータはテーブルの削除後に回復されないため、既存のテーブルを削除するときは十分に注意する必要があります。
構文
これがMySQLiテーブルを削除するための一般的なSQL構文です-
DROP TABLE table_name ;
コマンドプロンプトからテーブルを削除する
これは実行する必要があります DROP TABLE mysql>プロンプトでのSQLコマンド。
例
これは削除する例です tutorials_inf −
root@host# mysql -u root -p
Enter password:*******
mysql> use TUTORIALS;
Database changed
mysql> DROP TABLE tutorials_inf
Query OK, 0 rows affected (0.8 sec)
mysql>
PHPスクリプトを使用したテーブルの削除
データベースに既存のテーブルを削除するには、PHP関数を使用する必要があります mysqli_query()。テーブルを削除するには、適切なSQLコマンドを使用して2番目の引数を渡します。
例
<html>
<head>
<title>Dropping MySQLi Tables</title>
</head>
<body>
<?php
$host = 'localhost:3306'; $user = 'root';
$pass = ''; $dbname = 'TUTORIALS';
$conn = mysqli_connect($host, $user, $pass,$dbname); if(!$conn) {
die('Could not connect: '.mysqli_connect_error());
}
echo 'Connected successfully<br/>';
$sql = "DROP TABLE tutorials_inf"; if(mysqli_query($conn, $sql)) { echo "Table is deleted successfully"; } else { echo "Table is not deleted successfully\n"; } mysqli_close($conn);
?>
</body>
</html>
サンプル出力は次のようになります-
Connected successfully
Table is deleted successfully
MySQLiテーブルにデータを挿入するには、SQLを使用する必要があります INSERT INTOコマンド。mysql>プロンプトを使用するか、PHPなどのスクリプトを使用して、MySQLiテーブルにデータを挿入できます。
構文
MySQLiテーブルにデータを挿入するためのINSERTINTOコマンドの一般的なSQL構文は次のとおりです。
INSERT INTO table_name
( field1, field2,...fieldN )
VALUES
( value1, value2,...valueN );
文字列データ型を挿入するには、すべての値を二重引用符または一重引用符で囲む必要があります。次に例を示します。 "value"。
コマンドプロンプトからのデータの挿入
これは、SQL INSERT INTOコマンドを使用して、MySQLiテーブルtutorials_infにデータを挿入します。
例
次の例では、3つのレコードを作成します tutorials_tbl テーブル-
root@host# mysql -u root -p password;
Enter password:*******
mysql> use TUTORIALS;
Database changed
mysql> INSERT INTO tutorials_inf
->(id, name)
->VALUES
->(10, "John Poul");
Query OK, 1 row affected (0.01 sec)
NOTE−すべての矢印記号(->)はSQLコマンドの一部ではないことに注意してください。これらは新しい行を示しており、コマンドの各行の終わりにセミコロンを付けずにEnterキーを押している間、MySQLプロンプトによって自動的に作成されます。
PHPスクリプトを使用したデータの挿入
同じSQLINSERTINTOコマンドをPHP関数に使用できます mysqli_query() MySQLiテーブルにデータを挿入します。
例
この例では、ユーザーから3つのパラメーターを取得し、それらをMySQLiテーブルに挿入します-
<html>
<head>
<title>Add New Record in MySQLi Database</title>
<link rel = "stylesheet" type = "text/css" href = "style.css">
</head>
<body>
<div id = "main">
<form action = "" method = "post">
<label>Name :</label>
<input type = "text" name = "name" id = "name" />
<br />
<br />
<input type = "submit" value ="Submit" name = "submit"/>
<br />
</form>
</div>
<?php
if(isset($_POST["submit"])){ $servername = "localhost:3306";
$username = "root"; $password = "<Password here>";
$dbname = "TUTORIALS"; // Create connection $conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) { die("Connection failed: " . $conn->connect_error);
}
$sql = "INSERT INTO tutorials_inf(name)VALUES ('".$_POST["name"]."')";
if (mysqli_query($conn, $sql)) {
echo "New record created successfully";
} else {
echo "Error: " . $sql . "" . mysqli_error($conn);
}
$conn->close();
}
?>
</body>
</html>
サンプル出力は次のようになります-
New record created successfully
SQL SELECTコマンドは、MySQLiデータベースからデータをフェッチするために使用されます。このコマンドは、mysql>プロンプト、およびPHPなどの任意のスクリプトで使用できます。
構文
これは、MySQLiテーブルからデータをフェッチするためのSELECTコマンドの一般的なSQL構文です。
SELECT field1, field2,...fieldN table_name1, table_name2...
[WHERE Clause]
[OFFSET M ][LIMIT N]
カンマで区切られた1つ以上のテーブルを使用して、WHERE句を使用してさまざまな条件を含めることができますが、WHERE句はSELECTコマンドのオプション部分です。
1つのSELECTコマンドで1つ以上のフィールドをフェッチできます。
フィールドの代わりにスター(*)を指定できます。この場合、SELECTはすべてのフィールドを返します。
WHERE句を使用して任意の条件を指定できます。
を使用してオフセットを指定できます OFFSETSELECTがレコードの返送を開始する場所から。デフォルトでは、オフセットはゼロです。
を使用して返品の数を制限できます LIMIT 属性。
コマンドプロンプトからのデータのフェッチ-
これはSQLSELECTコマンドを使用してMySQLiテーブルtutorials_tblからデータをフェッチします
例
次の例では、からのすべてのレコードが返されます tutorials_inf テーブル-
root@host# mysql -u root -p password;
Enter password:*******
mysql> use TUTORIALS;
Database changed
mysql> SELECT * from tutorials_inf;
+----+------+
| id | name |
+----+------+
| 1 | sai |
| 2 | kit |
| 3 | ram |
+----+------+
3 rows in set (0.00 sec)
mysql>
PHPスクリプトを使用したデータの取得
同じSQLSELECTコマンドをPHP関数に使用できます mysqli_query()。この関数は、SQLコマンドと後で別のPHP関数を実行するために使用されますmysqli_fetch_assoc()選択したすべてのデータをフェッチするために使用できます。この関数は、行を連想配列、数値配列、またはその両方として返します。行がなくなると、この関数はFALSEを返します。
以下は、レコードをフェッチする簡単な例です。 tutorials_inf テーブル。
例
次の例を試して、tutorials_infテーブルのすべてのレコードを表示します。
<html>
<head>
<title>Selecting Table in MySQLi Server</title>
</head>
<body>
<?php
$dbhost = 'localhost:3306';
$dbuser = 'root'; $dbpass = '';
$dbname = 'TUTORIALS'; $conn = mysqli_connect($dbhost, $dbuser, $dbpass,$dbname);
if(! $conn ) { die('Could not connect: ' . mysqli_error()); } echo 'Connected successfully<br>'; $sql = 'SELECT name FROM tutorials_inf';
$result = mysqli_query($conn, $sql); if (mysqli_num_rows($result) > 0) {
while($row = mysqli_fetch_assoc($result)) {
echo "Name: " . $row["name"]. "<br>"; } } else { echo "0 results"; } mysqli_close($conn);
?>
</body>
</html>
行の内容が変数$ rowに割り当てられ、行の値が出力されます。
NOTE −配列値を文字列に直接挿入する場合は、必ず中括弧を付けるようにしてください。
サンプル出力は次のようになります-
Connected successfully
Name: ram
Name: kit
Name: abc
SQLを見てきました SELECTMySQLiテーブルからデータをフェッチするコマンド。と呼ばれる条件節を使用できますWHERE結果を除外する句。WHERE句を使用すると、選択基準を指定して、テーブルから必要なレコードを選択できます。
構文
これは、MySQLiテーブルからデータをフェッチするための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またはUPDATESQLコマンドと一緒に使用して、条件を指定することもできます。
ザ・ WHERE句は、任意のプログラミング言語のif条件のように機能します。この句は、指定された値をMySQLiテーブルで使用可能なフィールド値と比較するために使用されます。外部からの指定された値がMySQLiテーブルで使用可能なフィールド値と等しい場合、その行を返します。
これは、で使用できる演算子のリストです。 WHERE 句。
フィールドAが10を保持し、フィールドBが20を保持すると仮定すると、-
オペレーター | 説明 | 例 |
---|---|---|
= | 2つのオペランドの値が等しいかどうかをチェックし、等しい場合は条件が真になります。 | (A = B)は真ではありません。 |
!= | 2つのオペランドの値が等しいかどうかをチェックし、値が等しくない場合は条件が真になります。 | (A!= B)は真です。 |
>> | 左のオペランドの値が右のオペランドの値より大きいかどうかを確認します。大きい場合は、条件が真になります。 | (A> B)は正しくありません。 |
< | 左のオペランドの値が右のオペランドの値よりも小さいかどうかを確認します。小さい場合は、条件が真になります。 | (A <B)は真です。 |
> = | 左のオペランドの値が右のオペランドの値以上であるかどうかをチェックします。はいの場合、条件は真になります。 | (A> = B)は正しくありません。 |
<= | 左のオペランドの値が右のオペランドの値以下であるかどうかをチェックします。はいの場合、条件は真になります。 | (A <= B)は真です。 |
WHERE句は、テーブルから選択した行をフェッチする場合、特にを使用する場合に非常に便利です。 MySQLi Join。結合については、別の章で説明します。
を使用してレコードを検索するのが一般的な方法です。 Primary Key 検索を高速化します。
指定された条件がテーブル内のどのレコードとも一致しない場合、クエリは行を返しません。
コマンドプロンプトからデータを取得する
これは、WHERE句を指定したSQL SELECTコマンドを使用して、MySQLiテーブルtutorials_infから選択したデータをフェッチします。
例
次の例では、からのすべてのレコードが返されます tutorials_inf 名前が sai −
root@host# mysql -u root -p password;
Enter password:*******
mysql> use TUTORIALS;
Database changed
mysql>SELECT * from tutorials_inf where name = 'sai';
+----+------+
| id | name |
+----+------+
| 1 | SAI |
+----+------+
1 row in set (0.00 sec)
mysql>
実行しない限り LIKE文字列での比較では、大文字と小文字は区別されません。を使用して、検索で大文字と小文字を区別することができますBINARY 次のようなキーワード-
root@host# mysql -u root -p password;
Enter password:*******
mysql> use TUTORIALS;
Database changed
mysql> SELECT * from tutorials_inf \WHERE BINARY name = 'sai';
Empty set (0.02 sec)
mysql>
PHPスクリプトを使用したデータのフェッチ:
同じSQLSELECTコマンドをWHERECLAUSEでPHP関数に使用できます mysqli_query()。
例
次の例では、からのすべてのレコードが返されます tutorials_inf 名前が sai −
<?php
$dbhost = 'localhost:3306';
$dbuser = 'root'; $dbpass = '';
$dbname = 'TUTORIALS'; $conn = mysqli_connect($dbhost, $dbuser, $dbpass,$dbname);
if(! $conn ) { die('Could not connect: ' . mysqli_error()); } echo 'Connected successfully<br>'; $sql = 'SELECT * from tutorials_inf where name="sai"';
$result = mysqli_query($conn, $sql); if (mysqli_num_rows($result) > 0) {
while($row = mysqli_fetch_assoc($result)) {
echo "Name: " . $row["name"]. "<br>"; } } else { echo "0 results"; } mysqli_close($conn);
?>
サンプル出力は次のようになります-
Connected successfully
Name: SAI
MySQLiテーブルの既存のデータを変更する必要がある場合があります。SQLを使用してこれを行うことができますUPDATEコマンド。これにより、MySQLiテーブルのフィールド値が変更されます。
構文
データをMySQLiテーブルに変更するUPDATEコマンドの一般的なSQL構文は次のとおりです。
UPDATE table_name SET field1 = new-value1, field2 = new-value2 [WHERE Clause]
1つ以上のフィールドを完全に更新できます。
WHERE句を使用して任意の条件を指定できます。
一度に1つのテーブルの値を更新できます。
WHERE句は、テーブル内の選択した行を更新する場合に非常に役立ちます。
コマンドプロンプトからのデータの更新
これは、WHERE句を指定したSQL UPDATEコマンドを使用して、選択したデータをMySQLiテーブルtutorials_infに更新します。
例
次の例は更新されます name tutorial_infを持つレコードのフィールド。
root@host# mysql -u root -p password;
Enter password:*******
mysql> use TUTORIALS;
Database changed
mysql> UPDATE tutorials_inf
-> SET name = 'johar'
-> WHERE name = 'sai';
Query OK, 1 row affected (0.04 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql>
PHPスクリプトを使用したデータの更新
PHP関数へのWHERECLAUSEの有無にかかわらず、SQLUPDATEコマンドを使用できます。 mysqli_query()。この関数は、mysql>プロンプトで実行されるのと同様の方法でSQLコマンドを実行します。
例
次の例を試して更新してください name レコードのフィールド。
<?php
$dbhost = 'localhost:3306'; $dbuser = 'root';
$dbpass = ''; $dbname = 'TUTORIALS';
$conn = mysqli_connect($dbhost, $dbuser, $dbpass,$dbname); if(! $conn ) {
die('Could not connect: ' . mysqli_error());
}
echo 'Connected successfully<br>';
$sql = ' UPDATE tutorials_inf SET name="althamas" WHERE name="ram"'; if (mysqli_query($conn, $sql)) { echo "Record updated successfully"; } else { echo "Error updating record: " . mysqli_error($conn);
}
mysqli_close($conn);
?>
サンプル出力は次のようになります-
Connected successfully
Record updated successfully
MySQLiテーブルからレコードを削除する場合は、SQLコマンドを使用できます。 DELETE FROM。このコマンドは、mysql>プロンプト、およびPHPなどの任意のスクリプトで使用できます。
構文
これは、MySQLiテーブルからデータを削除するためのDELETEコマンドの一般的なSQL構文です。
DELETE FROM table_name [WHERE Clause]
WHERE句が指定されていない場合、すべてのレコードが指定されたMySQLiテーブルから削除されます。
WHERE句を使用して任意の条件を指定できます。
一度に1つのテーブルのレコードを削除できます。
WHERE句は、テーブル内の選択した行を削除する場合に非常に便利です。
コマンドプロンプトからのデータの削除
これは、WHERE句を指定したSQL DELETEコマンドを使用して、選択したデータをMySQLiテーブルtutorials_infに削除します。
例
次の例では、joharという名前のtutorial_infのレコードを削除します。
root@host# mysql -u root -p password;
Enter password:*******
mysql> use TUTORIALS;
Database changed
mysql> DELETE FROM tutorials_inf where name = 'johar';
Query OK, 1 row affected (0.23 sec)
mysql>
PHPスクリプトを使用したデータの削除
PHP関数へのWHERECLAUSEの有無にかかわらず、SQLDELETEコマンドを使用できます。 mysqli_query()。この関数は、mysql>プロンプトで実行されるのと同様の方法でSQLコマンドを実行します。
例
次の例を試して、althamasという名前のtutorial_infからレコードを削除してください。
<?php
$dbhost = 'localhost:3306';
$dbuser = 'root'; $dbpass = '';
$dbname = 'TUTORIALS'; $conn = mysqli_connect($dbhost, $dbuser, $dbpass,$dbname);
if(! $conn ) { die('Could not connect: ' . mysqli_error()); } echo 'Connected successfully<br>'; $sql = ' DELETE FROM tutorials_inf WHERE name = "althamas"';
if (mysqli_query($conn, $sql)) {
echo "Record deleted successfully";
} else {
echo "Error deleting record: " . mysqli_error($conn); } mysqli_close($conn);
?>
サンプル出力は次のようになります-
Connected successfully
Record deleted successfully
SQLを見てきました SELECTMySQLiテーブルからデータをフェッチするコマンド。と呼ばれる条件節を使用することもできますWHERE 必要なレコードを選択する句。
等号(=)を含むWHERE句は、完全に一致させたい場合に正常に機能します。「name = 'sai'」のように。ただし、名前に「johar」を含める必要があるすべての結果を除外する必要がある場合があります。これはSQLを使用して処理できますLIKE WHERE句と一緒に句。
SQL LIKE句を%文字とともに使用すると、UNIXではメタ文字(*)のように機能し、コマンドプロンプトですべてのファイルまたはディレクトリを一覧表示します。
%文字がない場合、LIKE句はWHERE句とともに等号に非常に似ています。
構文
これは、MySQLiテーブルからデータをフェッチするためのSELECTコマンドの一般的なSQL構文とLIKE句です。
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またはUPDATESQLコマンドと一緒に使用して、条件を指定することもできます。
コマンドプロンプトでLIKE句を使用する
これは、WHERE ... LIKE句を指定したSQLSELECTコマンドを使用して、MySQLiテーブルtutorials_infから選択したデータをフェッチします。
例
次の例では、からのすべてのレコードが返されます tutorials_inf 著者名がで終わるテーブル johar −
root@host# mysql -u root -p password;
Enter password:*******
mysql> use TUTORIALS;
Database changed
mysql> SELECT * from tutorials_inf
-> WHERE name LIKE '%johar';
+----+-------+
| id | name |
+----+-------+
| 2 | johar |
+----+-------+
1 row in set (0.00 sec)
mysql>
PHPスクリプト内でのLIKE句の使用
WHERE ... LIKE句と同様の構文をPHP関数に使用できます mysqli_query()。この関数は、SQLコマンドと後で別のPHP関数を実行するために使用されますmysqli_fetch_array() WHERE ... LIKE句をSELECTコマンドと一緒に使用すると、選択したすべてのデータをフェッチするために使用できます。
ただし、WHERE ... LIKE句がDELETEまたはUPDATEコマンドで使用されている場合は、それ以上のPHP関数呼び出しは必要ありません。
例
次の例を試して、からすべてのレコードを返します tutorials_inf 名前に含まれるテーブル johar −
<?php
$dbhost = 'localhost:3306'; $dbuser = 'root';
$dbpass = ''; $dbname = 'TUTORIALS';
$conn = mysqli_connect($dbhost, $dbuser, $dbpass,$dbname); if(! $conn ) {
die('Could not connect: ' . mysqli_error());
}
echo 'Connected successfully<br>';
$sql = 'SELECT * FROM tutorials_inf WHERE name LIKE "%johar%"'; $result = mysqli_query($conn, $sql);
$row = mysqli_fetch_array($result,MYSQLI_ASSOC);
printf ("%s \n",$row["name"]); mysqli_free_result($result);
mysqli_close($conn);
?>
サンプル出力は次のようになります-
Connected successfully
johar
SQLを見てきました SELECTMySQLiテーブルからデータをフェッチするコマンド。行を選択すると、結果の並べ替え方法を指示しない限り、MySQLiサーバーは任意の順序で行を自由に返すことができます。ただし、並べ替える1つまたは複数の列に名前を付けるORDER BY句を追加して、結果セットを並べ替えます。
構文
これは、MySQLテーブルからデータをソートするためのORDERBY句とともにSELECTコマンドの一般的なSQL構文です。
SELECT field1, field2,...fieldN table_name1, table_name2...
ORDER BY field1, [field2...] [ASC [DESC]]
filedがリストされている場合は、返された結果を任意のフィールドで並べ替えることができます。
結果は複数のフィールドで並べ替えることができます。
キーワードASCまたはDESCを使用して、結果を昇順または降順で取得できます。デフォルトでは、昇順です。
通常の方法でWHERE ... LIKE句を使用して条件を設定できます。
コマンドプロンプトでのORDERBY句の使用
これは、SQLSELECTコマンドとORDERBY句を使用して、MySQLiテーブルtutorials_infからデータをフェッチします。
例
次の例を試してください。この例では、結果が降順で返されます。
root@host# mysql -u root -p password;
Enter password:*******
mysql> use TUTORIALS;
Database changed
mysql> SELECT * from tutorials_inf ORDER BY id desc;
+----+-------+
| id | name |
+----+-------+
| 4 | ram |
| 3 | raghu |
| 2 | johar |
| 1 | sai |
+----+-------+
4 rows in set (0.00 sec)
mysql>
すべてのIDが降順でリストされていることを確認します。
PHPスクリプト内でのORDERBY句の使用
ORDERBY句と同様の構文をPHP関数に使用できます mysqli_query()。この関数は、SQLコマンドと後で別のPHP関数を実行するために使用されますmysqli_fetch_array() 選択したすべてのデータをフェッチするために使用できます。
例
次の例を試してください。チュートリアルの作成者の降順で結果が返されます。
<?php
$dbhost = 'localhost:3306';
$dbuser = 'root'; $dbpass = '';
$dbname = 'TUTORIALS'; $conn = mysqli_connect($dbhost, $dbuser, $dbpass,$dbname);
if(! $conn ) { die('Could not connect: ' . mysqli_error()); } echo 'Connected successfully</br>'; $sql = 'SELECT * from tutorials_inf ORDER BY id desc';
if($result = mysqli_query($conn, $sql)){ if(mysqli_num_rows($result) > 0){
echo "<table>";
echo "<tr>";
echo "<th>id</th>";
echo "<th>name</th>";
echo "</tr>";
while($row = mysqli_fetch_array($result)){
echo "<tr>";
echo "<td>" . $row['id'] . "</td>"; echo "<td>" . $row['name'] . "</td>";
echo "</tr>";
}
echo "</table>";
mysqli_free_result($result); } else { echo "No records matching your query were found."; } } else { echo "ERROR: Could not able to execute $sql. " . mysqli_error($conn); } mysqli_close($conn);
?>
サンプル出力は次のようになります-
Connected successfully
id name
4 ram
3 raghu
2 johar
1 sai
これまで、一度に1つのテーブルからのみデータを取得してきました。これは単純なテイクには問題ありませんが、ほとんどの実際のMySQLの使用法では、1つのクエリで複数のテーブルからデータを取得する必要があることがよくあります。
1つのSQLクエリで複数のテーブルを使用できます。MySQLiに参加するという行為は、2つ以上のテーブルを1つのテーブルに粉砕することを指します。
SELECT、UPDATE、およびDELETEステートメントでJOINSを使用して、MySQLiテーブルを結合できます。単純なMySQLiJOINとは異なるLEFTJOINの例も示します。
コマンドプロンプトでの結合の使用
2つのテーブルがあるとします tutorials_bks そして tutorials_inf、チュートリアルで。完全なリストを以下に示します-
例
次の例を試してください-
root@host# mysql -u root -p password;
Enter password:*******
mysql> use TUTORIALS;
Database changed
mysql> SELECT * FROM tcount_bks;
+----+---------+
| id | book |
+----+---------+
| 1 | java |
| 2 | java |
| 3 | html |
| 4 | c++ |
| 5 | Android |
+----+---------+
5 rows in set (0.00 sec)
mysql> SELECT * from tutorials_inf;
+----+-------+
| id | name |
+----+-------+
| 1 | sai |
| 2 | johar |
| 3 | raghu |
| 4 | ram |
+----+-------+
4 rows in set (0.00 sec)
mysql>
これで、これら2つのテーブルを結合するSQLクエリを記述できます。このクエリは、テーブルからすべての名前を選択しますtutorials_inf から対応する数のチュートリアルをピックアップしますtutorials_bks。
mysql> SELECT a.id, a.name,b.id FROM tutorials_inf a,tutorials_bks b WHERE a.id = b.id;
+----+-------+----+
| id | name | id |
+----+-------+----+
| 1 | sai | 1 |
| 2 | johar | 2 |
| 3 | raghu | 3 |
| 4 | ram | 4 |
+----+-------+----+
4 rows in set (0.00 sec)
mysql>
tutorials_bksテーブルには5つのレコードがありますが、上記の例では、クエリごとに4つのidレコードのみをフィルタリングして提供します。
PHPスクリプトでの結合の使用
PHPスクリプトでは、上記のSQLクエリのいずれかを使用できます。SQLクエリをPHP関数に渡すだけです。mysqli_query() 次に、通常の方法で結果をフェッチします。
例
次の例を試してください-
<?php
$dbhost = 'localhost:3306'; $dbuser = 'root';
$dbpass = ''; $dbname = 'TUTORIALS';
$conn = mysqli_connect($dbhost, $dbuser, $dbpass,$dbname); if(! $conn ) {
die('Could not connect: ' . mysqli_error());
}
echo 'Connected successfully</br>';
$sql = 'SELECT a.id, a.name,b.id FROM tutorials_inf a,tutorials_bks b WHERE a.id = b.id'; if($result = mysqli_query($conn, $sql)) {
if(mysqli_num_rows($result) > 0) { echo "<table>"; echo "<tr>"; echo "<th>id</th>"; echo "<th>name</th>"; echo "<th>id</th>"; echo "</tr>"; while($row = mysqli_fetch_array($result)){ echo "<tr>"; echo "<td>" . $row['id'] . "</td>";
echo "<td>" . $row['name'] . "</td>"; echo "<td>" . $row['id'] . "</td>";
echo "</tr>";
}
echo "</table>";
mysqli_free_result($result); } else { echo "No records matching your query were found."; } } else { echo "ERROR: Could not able to execute $sql. " . mysqli_error($conn); } mysqli_close($conn);
?>
サンプル出力は次のようになります-
Connected successfully
id name id
1 sai 1
2 johar 2
3 raghu 3
4 ram 4
MySQL LEFT JOIN
MySQLiの左結合は、単純結合とは異なります。MySQLi LEFT JOINは、左側のテーブルに特別な考慮を払っています。
LEFT JOINを実行すると、同じ方法で一致するすべてのレコードが取得され、さらに、結合の左側のテーブルで一致しないレコードごとに追加のレコードが取得されます。したがって、(私の例では)すべての名前が言及-
例
次の例を試して、LEFT JOIN −を理解してください。
root@host# mysql -u root -p password;
Enter password:*******
mysql> use TUTORIALS;
Database changed
mysql>SELECT a.id, a.name,b.id FROM tutorials_inf a LEFT JOIN tutorials_bks b ON a.id = b.id;
JOINSに慣れるには、さらに練習する必要があります。これはMySQL / SQLの少し複雑な概念であり、実際の例を実行することでより明確になります。
SQLを見てきました SELECT と一緒にコマンド WHERE MySQLiテーブルからデータをフェッチする句ですが、フィールドまたは列の値を比較する条件を与えようとすると NULL、正しく動作しません。
このような状況を処理するために、MySQLiは3つの演算子を提供します
IS NULL −列の値がNULLの場合、演算子はtrueを返します。
IS NOT NULL −列の値がNULLでない場合、演算子はtrueを返します。
<=> −演算子は値を比較します。これは(=演算子とは異なり)2つのNULL値に対しても当てはまります。
NULLを含む条件は特別です。= NULLまたは!= NULLを使用して、列内のNULL値を検索することはできません。そのような比較は、それらが真であるかどうかを判断することが不可能であるため、常に失敗します。NULL = NULLでも失敗します。
NULLである、またはNULLでない列を検索するには、ISNULLまたはISNOTNULLを使用します。
コマンドプロンプトでNULL値を使用する
テーブルを想定します tutorials_bks チュートリアルデータベースにあり、2つの列が含まれています id そして name、ここでNULL名は、値が不明であることを示します-
例
次の例を試してください-
root@host# mysql -u root -p password;
Enter password:*******
mysql> use TUTORIALS;
Database changed
mysql> INSERT INTO tutorials_bks (book) values('');
Query OK, 1 row affected (0.08 sec)
mysql> INSERT INTO tutorials_bks (book) values('');
Query OK, 1 row affected (0.08 sec)
mysql> INSERT INTO tutorials_bks (book) values('');
Query OK, 1 row affected (0.08 sec)
mysql> INSERT INTO tutorials_bks (book) values('NULL');
Query OK, 1 row affected (0.08 sec)
mysql> INSERT INTO tutorials_bks (book) values('NULL');
Query OK, 1 row affected (0.08 sec)
mysql> INSERT INTO tutorials_bks (book) values('NULL');
Query OK, 1 row affected (0.08 sec)
+----+---------+
| id | book |
+----+---------+
| 1 | java |
| 2 | java |
| 3 | html |
| 4 | c++ |
| 5 | Android |
| 6 | |
| 7 | |
| 8 | |
| 9 | NULL |
| 10 | NULL |
| 11 | NULL |
+----+---------+
11 rows in set (0.00 sec)
mysql>
名前列がNULLであるかどうかに関係なくレコードを検索するには、クエリを次のように記述する必要があります。
mysql> SELECT * FROM tutorials_bks WHERE book = "null";
+----+------+
| id | book |
+----+------+
| 9 | NULL |
| 10 | NULL |
| 11 | NULL |
+----+------+
3 rows in set (0.00 sec)
mysql> SELECT * FROM tutorials_bks WHERE book ! = "null";
+----+---------+
| id | book |
+----+---------+
| 1 | java |
| 2 | java |
| 3 | html |
| 4 | c++ |
| 5 | Android |
| 6 | |
| 7 | |
| 8 | |
+----+---------+
8 rows in set (0.00 sec)
mysql> SELECT * FROM tutorials_bks WHERE book = "";
+----+------+
| id | book |
+----+------+
| 6 | |
| 7 | |
| 8 | |
+----+------+
3 rows in set (0.01 sec)
PHPスクリプトでのNULL値の処理
あなたは使用することができた場合... 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);
?>
MySQLiのパターンマッチングを見てきました LIKE ...%。MySQLiは、正規表現に基づく別のタイプのパターンマッチング操作をサポートしています。REGEXPオペレーター。PHPまたはPERLを知っている場合、このマッチングはスクリプトの正規表現と非常に似ているため、理解するのは非常に簡単です。
以下は、一緒に使用できるパターンの表です REGEXP オペレーター。
パターン | パターンが一致するもの |
---|---|
^ | 文字列の始まり |
$ | 文字列の終わり |
。 | 任意の1文字 |
[...] | 角括弧の間にリストされている文字 |
[^ ...] | 角括弧の間にリストされていない文字 |
p1 | p2 | p3 | 交替; パターンp1、p2、またはp3のいずれかに一致します |
* | 先行する要素の0個以上のインスタンス |
+ | 前の要素の1つ以上のインスタンス |
{n} | 前の要素のn個のインスタンス |
{m、n} | 前の要素のmからn個のインスタンス |
例
上記の表に基づいて、要件を満たすためにさまざまなタイプのSQLクエリをデバイス化できます。ここでは、理解のためにいくつかリストします。tutorials_infというテーブルがあり、name −というフィールドがあるとします。
'sa'で始まるすべての名前を検索するためのクエリ
mysql> SELECT * FROM tutorials_inf WHERE name REGEXP '^sa';
サンプル出力は次のようになります-
+----+------+
| id | name |
+----+------+
| 1 | sai |
+----+------+
1 row in set (0.00 sec)
'ai'で終わるすべての名前を検索するためのクエリ
mysql> SELECT * FROM tutorials_inf WHERE name REGEXP 'ai$';
サンプル出力は次のようになります-
+----+------+
| id | name |
+----+------+
| 1 | sai |
+----+------+
1 row in set (0.00 sec)
'a'を含むすべての名前を検索するためのクエリ
mysql> SELECT * FROM tutorials_inf WHERE name REGEXP 'a';
サンプル出力は次のようになります-
+----+-------+
| id | name |
+----+-------+
| 1 | sai |
| 3 | ram |
| 4 | johar |
+----+-------+
3 rows in set (0.00 sec)
母音で始まるすべての名前を見つけるためにクエリを実行します
mysql> SELECT * FROM tutorials_inf WHERE name REGEXP '^[aeiou]';
トランザクションは、データベース操作操作の順次グループであり、単一の作業単位であるかのように実行されます。つまり、グループ内の個々の操作が成功しない限り、トランザクションは完了しません。トランザクション内のいずれかの操作が失敗すると、トランザクション全体が失敗します。
実際には、多くのSQLクエリをグループにまとめ、トランザクションの一部としてそれらすべてを一緒に実行します。
トランザクションのプロパティ
トランザクションには次の4つの標準プロパティがあり、通常は頭字語ACID-と呼ばれます。
Atomicity−ワークユニット内のすべての操作が正常に完了することを保証します。それ以外の場合、トランザクションは失敗した時点で中止され、以前の操作は以前の状態にロールバックされます。
Consistency −トランザクションが正常にコミットされると、データベースの状態が適切に変更されるようにします。
Isolation −トランザクションが互いに独立して透過的に動作できるようにします。
Durability −システム障害が発生した場合でも、コミットされたトランザクションの結果または効果が持続することを保証します。
MySQLでは、トランザクションはステートメントBEGIN WORKで始まり、COMMITまたはROLLBACKステートメントで終わります。開始ステートメントと終了ステートメントの間のSQLiコマンドは、トランザクションの大部分を形成します。
コミットとロールバック
これらの2つのキーワード Commit そして Rollback 主にMySQLトランザクションに使用されます。
トランザクションが正常に完了したら、COMMITコマンドを発行して、関連するすべてのテーブルへの変更を有効にする必要があります。
障害が発生した場合は、ROLLBACKコマンドを発行して、トランザクションで参照されているすべてのテーブルを以前の状態に戻す必要があります。
と呼ばれるセッション変数を設定することにより、トランザクションの動作を制御できます。 AUTOCOMMIT。AUTOCOMMITが1(デフォルト)に設定されている場合、各SQLステートメント(トランザクション内かどうかに関係なく)は完全なトランザクションと見なされ、終了時にデフォルトでコミットされます。AUTOCOMMITが0に設定されている場合、SET AUTOCOMMIT = 0コマンドを発行すると、後続の一連のステートメントはトランザクションのように機能し、明示的なCOMMITステートメントが発行されるまでアクティビティはコミットされません。
これらのSQLコマンドは、次を使用してPHPで実行できます。 mysqli_query() 関数。
トランザクションの一般的な例
この一連のイベントは、使用されるプログラミング言語とは無関係です。論理パスは、アプリケーションの作成に使用する言語で作成できます。
これらのSQLコマンドは、次を使用してPHPで実行できます。 mysqli_query() 関数。
SQLコマンドを発行してトランザクションを開始します BEGIN WORK.
SELECT、INSERT、UPDATE、DELETEなどの1つ以上のSQLコマンドを発行します。
エラーがなく、すべてが要件に従っているかどうかを確認します。
エラーがある場合は、ROLLBACKコマンドを発行します。それ以外の場合は、COMMITコマンドを発行します。
MySQLiのトランザクションセーフなテーブルタイプ
トランザクションを直接使用することはできませんが、安全で保証されているわけではありません。MySQLiプログラミングでトランザクションを使用する場合は、特別な方法でテーブルを作成する必要があります。トランザクションをサポートするテーブルには多くの種類がありますが、最も人気のあるものはInnoDB。
InnoDBテーブルのサポートには、MySQLiをソースからコンパイルするときに特定のコンパイルパラメーターが必要です。MySQLiバージョンがInnoDBをサポートしていない場合は、インターネットサービスプロバイダーに、InnoDBテーブルタイプをサポートするMySQLiのバージョンを構築するか、WindowsまたはLinux / UNIX用のMySQL-Maxバイナリディストリビューションをダウンロードしてインストールし、でテーブルタイプを操作するように依頼してください。開発環境。
MySQLiインストールがInnoDBテーブルをサポートしている場合は、単に TYPE = InnoDBテーブル作成ステートメントの定義。たとえば、次のコードは、tutorials_innodbという名前のInnoDBテーブルを作成します。
root@host# mysql -u root -p;
Enter password:*******
mysql> use TUTORIALS;
Database changed
mysql> create table tutorials_innodb
-> (
-> tutorial_author varchar(40) NOT NULL,
-> tutorial_count INT
-> ) TYPE = InnoDB;
Query OK, 0 rows affected (0.02 sec)
− InnoDBの詳細については、次のリンクを確認してください
次のような他のテーブルタイプを使用できます GEMINI または BDB、ただし、これら2つのタイプをサポートするかどうかは、インストールによって異なります。
MySQLi ALTER このコマンドは、テーブルの名前やテーブルフィールドを変更する場合、またはテーブルの既存の列を追加または削除する場合に非常に便利です。
と呼ばれるテーブルの作成から始めましょう tutorials_alter。
root@host# mysql -u root -p password;
Enter password:*******
mysql> use TUTORIALS;
Database changed
mysql> create table tutorials_alter
-> (
-> i INT,
-> c CHAR(1)
-> );
Query OK, 0 rows affected (0.27 sec)
mysql> SHOW COLUMNS FROM tutorials_alter;
+-------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| i | int(11) | YES | | NULL | |
| c | char(1) | YES | | NULL | |
+-------+---------+------+-----+---------+-------+
2 rows in set (0.02 sec)
列の削除、追加、または再配置
既存の列を削除するとします i 上記のMySQLiテーブルから、 DROP と一緒に節 ALTER 次のようにコマンド-
mysql> ALTER TABLE tutorials_alter DROP i;
A DROP 列がテーブルに残っている唯一の列である場合は機能しません。
列を追加するには、ADDを使用して列定義を指定します。次のステートメントは、i tutorials_alterへの列-
mysql> ALTER TABLE tutorials_alter ADD i INT;
このステートメントを発行した後、testalterには、最初にテーブルを作成したときと同じ2つの列が含まれますが、構造はまったく同じではありません。これは、デフォルトで新しい列がテーブルの最後に追加されるためです。だからi 元々はmytblの最初の列でしたが、現在は最後の列です。
mysql> SHOW COLUMNS FROM tutorials_alter;
+-------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| c | char(1) | YES | | NULL | |
| i | int(11) | YES | | NULL | |
+-------+---------+------+-----+---------+-------+
2 rows in set (0.01 sec)
テーブル内の特定の位置に列が必要であることを示すには、FIRSTを使用して最初の列にするか、AFTERcol_nameを使用して新しい列をcol_nameの後に配置する必要があることを示します。次のALTERTABLEステートメントを試してください。各ステートメントの後にSHOWCOLUMNSを使用して、それぞれがどのような効果をもたらすかを確認してください。
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句でのみ機能します。つまり、テーブル内の既存の列を再配置する場合は、最初に列を削除してから、新しい位置に追加する必要があります。
列の定義または名前の変更
列の定義を変更するには、 MODIFY または CHANGEALTERコマンドとともに句。たとえば、列を変更するにはc CHAR(1)からCHAR(10)まで、これを実行します-
mysql> ALTER TABLE tutorials_alter MODIFY c CHAR(10);
CHANGEを使用すると、構文が少し異なります。CHANGEキーワードの後に、変更する列に名前を付けてから、新しい名前を含む新しい定義を指定します。次の例を試してください。
mysql> ALTER TABLE tutorials_alter CHANGE i j BIGINT;
ここで、CHANGEを使用して、列名を変更せずにjをBIGINTからINTに変換し直すと、ステートメントは期待どおりになります-
mysql> ALTER TABLE tutorials_alter CHANGE j j INT;
ヌルおよびデフォルト値属性に対するALTERTABLEの影響-
列を変更または変更するときに、列にNULL値を含めることができるかどうか、およびそのデフォルト値を指定することもできます。実際、これを行わないと、MySQLiはこれらの属性に値を自動的に割り当てます。
これが例です。NOTNULL列のデフォルト値は100です。
mysql> ALTER TABLE tutorials_alter
-> MODIFY j BIGINT NOT NULL DEFAULT 100;
上記のコマンドを使用しない場合、MySQLiはすべての列にNULL値を入力します。
列のデフォルト値の変更
ALTERコマンドを使用して、任意の列のデフォルト値を変更できます。次の例を試してください。
mysql> ALTER TABLE tutorials_alter ALTER j SET DEFAULT 1000;
mysql> SHOW COLUMNS FROM tutorials_alter;
+-------+------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------------+------+-----+---------+-------+
| c | char(10) | YES | | NULL | |
| j | bigint(20) | NO | | 1000 | |
+-------+------------+------+-----+---------+-------+
2 rows in set (0.02 sec)
ALTERコマンドとともにDROP句を使用すると、任意の列からデフォルトの制約を削除できます。
mysql> ALTER TABLE tutorials_alter ALTER j DROP DEFAULT;
mysql> SHOW COLUMNS FROM tutorials_alter;
+-------+------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------------+------+-----+---------+-------+
| c | char(10) | YES | | NULL | |
| j | bigint(20) | NO | | NULL | |
+-------+------------+------+-----+---------+-------+
2 rows in set (0.02 sec)
テーブルタイプの変更
を使用してテーブルタイプを使用できます TYPE ALTERコマンドとともに句。
テーブルの現在のタイプを確認するには、SHOW TABLESTATUSステートメントを使用します。
mysql> SHOW TABLE STATUS LIKE 'tutorials_alter'\G
*************************** 1. row ***************************
Name: tutorials_alter
Engine: InnoDB
Version: 10
Row_format: Compact
Rows: 0
Avg_row_length: 0
Data_length: 16384
Max_data_length: 0
Index_length: 0
Data_free: 0
Auto_increment: NULL
Create_time: 2017-02-17 11:30:29
Update_time: NULL
Check_time: NULL
Collation: latin1_swedish_ci
Checksum: NULL
Create_options:
Comment:
1 row in set (0.00 sec)
テーブルの名前を変更する
テーブルの名前を変更するには、 RENAMEALTERTABLEステートメントのオプション。次の例を試して、tutorials_alterの名前をtutorials_bksに変更してください。
mysql> ALTER TABLE tutorials_alter RENAME TO tutorials_bks;
ALTERコマンドを使用して、MySQLファイルにINDEXを作成およびドロップできます。この機能については、次の章で説明します。
データベースインデックスは、テーブル内の操作の速度を向上させるデータ構造です。インデックスは1つ以上の列を使用して作成でき、迅速なランダムルックアップとレコードへのアクセスの効率的な順序付けの両方の基礎を提供します。
インデックスを作成するときは、SQLクエリを作成し、それらの列に1つ以上のインデックスを作成するために使用される列は何かを考慮する必要があります。
実際には、インデックスはテーブルのタイプでもあり、主キーまたはインデックスフィールドと、各レコードへのポインタを実際のテーブルに保持します。
ユーザーはインデックスを表示できません。インデックスはクエリを高速化するために使用され、データベース検索エンジンによってレコードを非常に高速に検索するために使用されます。
INSERTステートメントとUPDATEステートメントは、インデックスを持つテーブルでは時間がかかりますが、SELECTステートメントはそれらのテーブルで高速になります。その理由は、挿入または更新を実行している間、データベースはインデックス値も挿入または更新する必要があるためです。
シンプルでユニークなインデックス
テーブルに一意のインデックスを作成できます。一意のインデックスは、2つの行が同じインデックス値を持つことができないことを意味します。テーブルにインデックスを作成するための構文は次のとおりです。
CREATE UNIQUE INDEX index_name ON table_name ( column1, column2,...);
1つ以上の列を使用してインデックスを作成できます。たとえば、NAME_INDEXを使用してtutorials_infにインデックスを作成できます。
CREATE UNIQUE INDEX NAME_INDEX ON tutorials_inf(name);
テーブルに簡単なインデックスを作成できます。クエリからUNIQUEキーワードを省略するだけで、単純なインデックスが作成されます。単純なインデックスでは、テーブル内の値を重複させることができます。
列の値に降順で索引を付ける場合は、列名の後に予約語DESCを追加できます。
mysql> CREATE UNIQUE INDEX NAME_INDEX ON tutorials_inf (name 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 tutorials_inf ADD INDEX (id);
ALTERコマンドとともにDROP句を使用すると、任意のINDEXを削除できます。次の例を試して、上記で作成したインデックスを削除してください。
mysql> ALTER TABLE tutorials_inf DROP INDEX (c);
ALTERコマンドとともにDROP句を使用すると、任意のINDEXを削除できます。次の例を試して、上記で作成したインデックスを削除してください。
PRIMARYKEYを追加および削除するALTERコマンド
同じ方法で主キーを追加することもできます。ただし、主キーがNULLではない列で機能することを確認してください。
これは、既存のテーブルに主キーを追加する例です。これにより、最初に列がNOT NULLになり、次に主キーとして追加されます。
mysql> ALTER TABLE tutorials_inf MODIFY id INT NOT NULL;
mysql> ALTER TABLE tutorials_inf ADD PRIMARY KEY (id);
次のように、ALTERコマンドを使用して主キーを削除できます。
mysql> ALTER TABLE tutorials_inf DROP PRIMARY KEY;
PRIMARY KEY以外のインデックスを削除するには、インデックス名を指定する必要があります。
INDEX情報の表示
SHOW INDEXコマンドを使用して、テーブルに関連付けられているすべてのインデックスを一覧表示できます。垂直形式の出力(\ Gで指定)は、長い行の折り返しを回避するために、このステートメントで役立つことがよくあります。
次の例を試してください
mysql> SHOW INDEX FROM table_name\G
........
一時テーブルは、一時データを保持するのに非常に役立つ場合があります。一時テーブルについて知っておくべき最も重要なことは、現在のクライアントセッションが終了するとテーブルが削除されることです。
前に述べたように、一時テーブルはセッションが存続している間だけ存続します。PHPスクリプトでコードを実行する場合、スクリプトの実行が終了すると、一時テーブルは自動的に破棄されます。MySQLiクライアントプログラムを介してMySQLデータベースサーバーに接続している場合、クライアントを閉じるか手動でテーブルを破棄するまで、一時テーブルは存在します。
例
これは、一時テーブルの使用法を示す例です。同じコードを使用してPHPスクリプトで使用できますmysqli_query() 関数。
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コマンドを発行すると、一時テーブルはリストにリストされません。ここで、MySQLiセッションからログアウトしてからSELECTコマンドを発行すると、データベースに使用可能なデータが見つかりません。一時テーブルも存在しません。
一時テーブルの削除
デフォルトでは、データベース接続が終了すると、MySQLiによってすべての一時テーブルが削除されます。それでも、間にそれらを削除したい場合は、DROPTABLEコマンドを発行して削除します。
以下は、一時テーブルを削除する例です。
mysql> DROP TABLE SalesSummary;
mysql> SELECT * FROM SalesSummary;
ERROR 1146: Table 'TUTORIALS.SalesSummary' doesn't exist
テーブルの正確なコピーが必要で、CREATE TABLE ... SELECTは、コピーに同じインデックスやデフォルト値などを含める必要があるため、目的に合わない場合があります。
次の手順でこの状況に対処できます-
SHOW CREATE TABLEを使用して、ソーステーブルの構造、インデックス、およびすべてを指定するCREATETABLEステートメントを取得します。
ステートメントを変更して、テーブル名をクローンテーブルの名前に変更し、ステートメントを実行します。このようにして、正確なクローンテーブルが作成されます。
オプションで、テーブルの内容もコピーする必要がある場合は、INSERT INTO ... SELECTステートメントも発行します。
例
次の例を試して、のクローンテーブルを作成してください tutorials_inf。
ステップ1
テーブルに関する完全な構造を取得します。
mysql> SHOW CREATE TABLE tutorials_inf \G;
*************************** 1. row ***************************
Table: tutorials_inf
Create Table: CREATE TABLE `tutorials_inf` (
`id` int(11) NOT NULL,
`name` varchar(20) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `AUTHOR_INDEX` (`name`),
UNIQUE KEY `NAME_INDEX` (`name`),
KEY `id` (`id`)
) ENGINE = InnoDB DEFAULT CHARSET = latin1
1 row in set (0.05 sec)
ERROR: No query specified
ステップ2
このテーブルの名前を変更して、別のテーブルを作成します。
mysql> CREATE TABLE tutorials_clone(
-> id int(11) NOT NULL,
-> name varchar(20) NOT NULL,
-> PRIMARY KEY (id),
> UNIQUE KEY AUTHOR_INDEX (name),
-> UNIQUE KEY NAME_INDEX (name),
-> KEY id (id));
Query OK, 0 rows affected (1.80 sec)
ステップ3
手順2を実行した後、データベースにクローンテーブルを作成します。古いテーブルからデータをコピーする場合は、INSERT INTO ... SELECTステートメントを使用してコピーできます。
mysql> INSERT INTO tutorials_clone(id,name) SELECT id,name from tutorials_inf;
Query OK, 4 rows affected (0.19 sec)
Records: 4 Duplicates: 0 Warnings: 0
最後に、必要に応じて正確なクローンテーブルを作成します。
MySQLiから入手したい情報が3つあります。
Information about the result of queries −これには、SELECT、UPDATE、またはDELETEステートメントの影響を受けるレコードの数が含まれます。
Information about tables and databases −これには、テーブルとデータベースの構造に関する情報が含まれます。
Information about the MySQLi server −これには、データベースサーバーの現在のステータス、バージョン番号などが含まれます。
mysqliプロンプトでこれらすべての情報を取得するのは非常に簡単ですが、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では、mysqli_affected_rows()関数を呼び出して、クエリが変更した行数を確認します-
$result_id = mysqli_query ($query, $conn_id);
# report 0 rows if the query failed
$count = ($result_id ? mysqli_affected_rows ($conn_id) : 0); print ("$count rows were affected\n");
テーブルとデータベースの一覧表示
これは、データベースサーバーで使用可能なすべてのデータベースとテーブルを一覧表示するのが非常に簡単です。十分な特権がない場合、結果はnullになる可能性があります。
以下で説明する方法とは別に、SHOWTABLESまたはSHOWDATABASESクエリを使用して、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
$servername = "localhost:3306";
$username = "root"; $password = "";
$dbname = "TUTORIALS"; $conn = new mysqli($servername, $username, $password, $dbname);
if ($conn->connect_error) { die("Connection failed: " . $conn->connect_error);
}
echo"Database connected";
$sql="SHOW DATABASES"; if (!($result = mysqli_query($conn,$sql))) {
printf("Error: %s\n", mysqli_error($conn)); } while( $row = mysqli_fetch_row( $result ) ){ if (($row[0]!="information_schema") && ($row[0]!="mysql")) { echo $row[0]."\r\n";
}
}
$conn->close();
?>
サーバーメタデータの取得
MySQLには次のコマンドがあり、mysqlプロンプトで実行するか、PHPなどのスクリプトを使用してデータベースサーバーに関するさまざまな重要な情報を取得できます。
シニア番号 | コマンドと説明 |
---|---|
1 | SELECT VERSION( ) サーバーバージョン文字列 |
2 | SELECT DATABASE( ) 現在のデータベース名(ない場合は空) |
3 | SELECT USER( ) 現在のユーザー名 |
4 | SHOW STATUS サーバーステータスインジケーター |
5 | SHOW VARIABLES サーバー構成変数 |
シーケンスは、オンデマンドで順番に生成される整数1、2、3、...のセットです。多くのアプリケーションではテーブルの各行に一意の値を含める必要があり、シーケンスを使用するとシーケンスを簡単に生成できるため、シーケンスはデータベースで頻繁に使用されます。この章では、MySQLiでシーケンスを使用する方法について説明します。
AUTO_INCREMENT列の使用
MySQLiでシーケンスを使用する最も簡単な方法は、列をAUTO_INCREMENTとして定義し、残りのことはMySQLiに任せることです。
例
次の例を試してください。これによりテーブルが作成され、その後、MySQLiによって自動インクリメントされるため、レコードIDを指定する必要がないこのテーブルにいくつかの行が挿入されます。
mysql>CREATE TABLE tutorials_auto(
id INT UNSIGNED NOT NULL AUTO_INCREMENT, name VARCHAR(30) NOT NULL,PRIMARY KEY(id));
Query OK, 0 rows affected (0.28 sec)
mysql>INSERT INTO tutorials_auto(id,name) VALUES(NULL,'sai'),(NULL,'ram');
Query OK, 2 rows affected (0.12 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> SELECT * FROM insect ORDER BY id;
+----+------+
| id | name |
+----+------+
| 1 | sai |
| 2 | ram |
+----+------+
2 rows in set (0.05 sec)
AUTO_INCREMENT値を取得する
LAST_INSERT_ID()はSQL関数であるため、SQLステートメントの発行方法を理解している任意のクライアント内から使用できます。それ以外の場合、PERLおよびPHPスクリプトは、最後のレコードの自動インクリメント値を取得するための排他的な関数を提供します。
PERLの例
mysql_insertid属性を使用して、クエリによって生成されたAUTO_INCREMENT値を取得します。この属性には、クエリの発行方法に応じて、データベースハンドルまたはステートメントハンドルのいずれかを介してアクセスします。次の例では、データベースハンドルを介してそれを参照しています。
$dbh->do ("INSERT INTO tutorials_auto (name,date,origin)
VALUES('moth','2001-09-14','windowsill')");
my $seq = $dbh->{mysqli_insertid};
PHPの例
AUTO_INCREMENT値を生成するクエリを発行した後、mysql_insert_id()−を呼び出して値を取得します。
mysql_query ("INSERT INTO tutorials_auto (name,date,origin)
VALUES('moth','2001-09-14','windowsill')", $conn_id); $seq = mysqli_insert_id ($conn_id);
既存のシーケンスの番号を付け直す
テーブルから多くのレコードを削除し、すべてのレコードを再シーケンスしたい場合があります。これは簡単なトリックを使用して実行できますが、テーブルが他のテーブルと結合している場合は、慎重に行う必要があります。
AUTO_INCREMENT列の再シーケンスが避けられないと判断した場合、その方法は、テーブルから列を削除してから、再度追加することです。次の例は、この手法を使用して昆虫テーブルのid値に番号を付け直す方法を示しています。
mysql> ALTER TABLE tutorials_auto DROP id;
mysql> ALTER TABLE tutorials_auto
-> ADD id INT UNSIGNED NOT NULL AUTO_INCREMENT FIRST,
-> ADD PRIMARY KEY (id);
特定の値でシーケンスを開始する
デフォルトでは、MySQLiは1からシーケンスを開始しますが、テーブルの作成時に他の番号を指定することもできます。以下は、MySQLiが100からシーケンスを開始する例です。
mysql> CREATE TABLE tutorials_auto
-> (
-> id INT UNSIGNED NOT NULL AUTO_INCREMENT = 100,
-> PRIMARY KEY (id),
-> name VARCHAR(30) NOT NULL,
-> );
または、テーブルを作成してから、ALTERTABLEを使用して初期シーケンス値を設定することもできます。
mysql> ALTER TABLE tutorials_auto AUTO_INCREMENT = 100;
テーブルまたは結果セットに重複レコードが含まれる場合があります。許可される場合もありますが、重複レコードを停止する必要がある場合もあります。場合によっては、重複するレコードを識別してテーブルから削除する必要があります。この章では、テーブルで重複レコードが発生しないようにする方法と、既存の重複レコードを削除する方法について説明します。
テーブル内での重複の発生の防止
あなたは使用することができます PRIMARY KEY または UNIQUE重複レコードを停止するための適切なフィールドを持つテーブルのインデックス。1つの例を見てみましょう。次の表にはそのようなインデックスまたは主キーが含まれていないため、first_nameとlast_nameのレコードが重複する可能性があります。
CREATE TABLE person_tbl (
first_name CHAR(20),
last_name CHAR(20),
sex CHAR(10)
);
同じ姓名の値を持つ複数のレコードがこのテーブルに作成されないようにするには、その定義にPRIMARYKEYを追加します。これを行うとき、PRIMARY KEYはNULL値を許可しないため、インデックス付き列をNOTNULLとして宣言する必要もあります-
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)
);
通常、テーブルに一意のインデックスが存在すると、インデックスを定義する1つまたは複数の列の既存のレコードと重複するレコードをテーブルに挿入すると、エラーが発生します。
使用する INSERT IGNORE のではなく INSERT。レコードが既存のレコードと重複しない場合、MySQLiは通常どおりそのレコードを挿入します。レコードが重複している場合、IGNOREキーワードは、エラーを生成せずにサイレントにレコードを破棄するようにMySQLiに指示します。
次の例ではエラーが発生せず、同時に重複レコードが挿入されません。
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)
使用する REPLACEINSERTではなく。レコードが新しい場合は、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は、一連の重複の最後を保持し、以前の重複を消去します。
一意性を強制する別の方法は、PRIMARYKEYではなく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(*)とともに列選択リストにリストします。
GROUPBY句の列もリストします。
グループ数を1より大きくすることを要求することにより、一意の値を削除するHAVING句を追加します。
クエリ結果からの重複の排除:
使用できます DISTINCT SELECTステートメントとともに、テーブルで使用可能な一意のレコードを検索します。
mysql> SELECT DISTINCT last_name, first_name
-> FROM person_tbl
-> ORDER BY last_name;
DISTINCTの代わりに、選択している列に名前を付けるGROUPBY句を追加することもできます。これには、重複を削除し、指定された列の値の一意の組み合わせのみを選択する効果があります-
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またはPRIMAYKEYを追加することです。このテーブルがすでに利用可能である場合でも、この手法を使用して重複レコードを削除でき、将来的にも安全になります。
mysql> ALTER IGNORE TABLE person_tbl
-> ADD PRIMARY KEY (last_name, first_name);