Mariadb-quick-guide
MariaDB-はじめに
データベースアプリケーションは、メインアプリケーションとは別に存在し、データコレクションを格納します。 すべてのデータベースは、含まれるデータの作成、アクセス、管理、検索、および複製のために1つまたは複数のAPIを採用しています。
データベースは、オブジェクトやファイルなどの非リレーショナルデータソースも使用します。 ただし、データベースは大規模なデータセットに最適なオプションであるため、他のデータソースでの取得や書き込みが遅くなります。
リレーショナルデータベース管理システム(RDBMS)は、さまざまなテーブルにデータを格納します。これらのテーブル間の関係は、主キーと外部キーを使用して確立されます。
RDBMSは次の機能を提供しています-
- これらを使用すると、テーブル、列、およびインデックスを使用してデータソースを実装できます。
- これらは、複数のテーブルの行にわたる参照の整合性を保証します。
- インデックスを自動的に更新します。
- これらは、テーブルからのデータの操作またはソースのSQLクエリと操作を解釈します。
RDBMSの用語
MariaDBの説明を始める前に、データベースに関連するいくつかの用語を確認しましょう。
- データベース-データベースは、関連データを保持するテーブルで構成されるデータソースです。
- テーブル-スプレッドシートを意味するテーブルは、データを含むマトリックスです。
- 列-データ要素を意味する列は、1つのタイプのデータを保持する構造です。たとえば、出荷日。
- 行-行は関連データをグループ化する構造です。たとえば、顧客のデータ。 タプル、エントリ、またはレコードとも呼ばれます。
- 冗長性-この用語は、システムを高速化するためにデータを2回保存することを指します。
- プライマリキー-これは一意の識別値を指します。 この値はテーブル内で2回使用することはできず、それに関連付けられている行は1つだけです。
- 外部キー-外部キーは、2つのテーブル間のリンクとして機能します。
- 複合キー-複合キー、または複合キーは、複数の列を参照するキーです。 列に固有の品質がないため、複数の列を指します。
- インデックス-インデックスは実質的に本のインデックスと同一です。
- 参照整合性-この用語は、すべての外部キー値が既存の行を指すようにすることを指します。
MariaDBデータベース
MariaDBは、MySQLのオリジナル開発者によって作成された、MySQLの人気のあるフォークです。 これは、MySQLのOracleによる買収に関する懸念から生まれました。 小規模なデータ処理タスクと企業のニーズの両方をサポートします。 これは、MySQLの簡単なアンインストールとMariaDBのインストールのみを必要とする、MySQLのドロップイン置換を目指しています。 MariaDBは、MySQLと同じ機能などを提供します。
MariaDBの主な機能
MariaDBの重要な機能は次のとおりです-
- MariaDBはすべて、GPL、LGPL、またはBSDの下にあります。
- MariaDBには、他のRDBMSデータソースと連携するための高性能ストレージエンジンを含む幅広いストレージエンジンが含まれています。
- MariaDBは、標準の一般的なクエリ言語を使用します。
- MariaDBは多くのオペレーティングシステムで実行され、さまざまなプログラミング言語をサポートしています。
- MariaDBは、最も人気のあるWeb開発言語の1つであるPHPをサポートしています。
- MariaDBはGaleraクラスターテクノロジーを提供しています。
- MariaDBは、MySQLで使用できない多くの操作とコマンドも提供し、パフォーマンスに悪影響を与える機能を排除/置換します。
入門
このチュートリアルを開始する前に、PHPとHTMLの基本的な知識、特にPHPとHTMLのチュートリアルで説明されている資料があることを確認してください。
このガイドでは、PHP環境でのMariaDBの使用に焦点を当てているため、この例はPHP開発者に最も役立ちます。
慣れていない場合や確認する必要がある場合は、PHPチュートリアルを確認することを強くお勧めします。
MariaDB-インストール
MariaDBのすべてのダウンロードは、MariaDB公式公式Webサイトのhttps://downloads.mariadb.org/[ダウンロード]セクションにあります。 希望するバージョンへのリンクをクリックすると、複数のオペレーティングシステム、アーキテクチャ、およびインストールファイルタイプのダウンロードのリストが表示されます。
LINUX/UNIXへのインストール
Linux/Unixシステムの詳細な知識がある場合は、ソースをダウンロードしてインストールをビルドしてください。 推奨されるインストール方法は、配布パッケージを利用することです。 MariaDBは、次のLinux/Unixディストリビューション用のパッケージを提供しています-
- RedHat/CentOS/Fedora
- Debian/Ubuntu
次のディストリビューションには、リポジトリにMariaDBパッケージが含まれています-
- openSUSE
- Arch Linux
- マゲイア
- Mint
- Slackware
Ubuntu環境にインストールするには、次の手順に従います-
- ステップ1 *-rootユーザーとしてログインします。
- ステップ2 *-MariaDBパッケージを含むディレクトリに移動します。
- ステップ3 *-次のコードでGnuPG署名キーをインポートします-
sudo apt-key adv --recv-keys --keyserver keyserver.ubuntu.com 0xcbcb082a1bb943db
ステップ4 *-MariaDBを *sources.list ファイルに追加します。 ファイルを開き、次のコードを追加します-
sudo add-apt-repository 'deb http://ftp.osuosl.org/pub/mariadb/repo/5.5/ubuntuprecise main'
- ステップ5 *-次を使用してシステムを更新します-
sudo apt-get update
- ステップ6 *-以下を使用してMariaDBをインストールします-
sudo apt-get install mariadb-server
Windowsへのインストール
自動インストールファイル(MSI)を見つけてダウンロードしたら、ファイルをダブルクリックしてインストールを開始します。 インストールウィザードは、インストールのすべてのステップと必要な設定をガイドします。
コマンドプロンプトからインストールを開始して、インストールをテストします。 通常はディレクトリ内のインストールの場所に移動し、プロンプトで次のように入力します-
mysqld.exe --console
インストールが成功すると、起動に関連するメッセージが表示されます。 これが表示されない場合は、許可の問題がある可能性があります。 ユーザーアカウントがアプリケーションにアクセスできることを確認します。 グラフィカルクライアントは、Windows環境でのMariaDB管理に使用できます。 コマンドラインが不快または扱いにくいと感じた場合は、必ず試してください。
インストールのテスト
MariaDBの機能とインストールを確認するために、いくつかの簡単なタスクを実行します。
管理ユーティリティを使用してサーバーステータスを取得
mysqladminバイナリでサーバーのバージョンを表示します。
[root@host]# mysqladmin --version
バージョン、ディストリビューション、オペレーティングシステム、およびアーキテクチャが表示されます。 そのタイプの出力が表示されない場合は、インストールの問題を調べてください。
クライアントで簡単なコマンドを実行
MariaDBのコマンドプロンプトを表示します。 これでMariaDBに接続され、コマンドの実行が許可されます。 次のように簡単なコマンドを入力してください-
mysql> SHOW DATABASES;
インストール後
MariaDBが正常にインストールされたら、rootパスワードを設定します。 新規インストールでは、パスワードが空白になります。 新しいパスワードを設定するには、次を入力してください-
mysqladmin -u root password "[enter your password here]";
以下を入力して、新しい資格情報でサーバーに接続します-
mysql -u root -p
Enter password:*******
Windowsでのアップグレード
MySQLが既にWindowsシステムにインストールされており、MariaDBにアップグレードする場合。 MySQLをアンインストールしてMariaDBをインストールしないでください。 これにより、既存のデータベースとの競合が発生します。 代わりにMariaDBをインストールしてから、Windowsインストールファイルでアップグレードウィザードを使用する必要があります。
MySQL my.cnfファイルのオプションはMariaDBで動作するはずです。 ただし、MariaDBには多くの機能があり、MySQLにはありません。
my.cnfファイルで次の競合を考慮してください-
- MariaDBは、デフォルトで一時ファイルにAriaストレージエンジンを使用します。 一時ファイルが多数ある場合、MyISAMテーブルを使用しない場合は、キーバッファーサイズを変更します。
- アプリケーションが頻繁に接続/切断する場合は、スレッドキャッシュサイズを変更します。
- 100を超える接続を使用する場合は、スレッドプールを使用します。
互換性
MySQLとMariaDBは本質的に同一です。 ただし、アップグレードで問題を作成するには十分な違いがあります。 MariaDBナレッジベースでこれらの重要な違いを確認してください。
MariaDB-管理
MariaDBを実行する前に、まず現在の状態(実行中またはシャットダウン)を確認します。 MariaDBの起動と停止には3つのオプションがあります-
- mysqld(MariaDBバイナリ)を実行します。
- mysqld_safe起動スクリプトを実行します。
- mysql.server起動スクリプトを実行します。
MariaDBを標準以外の場所にインストールした場合、スクリプトファイルの場所情報を編集する必要があります。 スクリプトに「停止」パラメーターを追加するだけで、MariaDBを停止します。
Linuxで自動的に起動する場合は、 init システムに起動スクリプトを追加します。 各ディストリビューションには異なる手順があります。 システムのマニュアルを参照してください。
ユーザーアカウントの作成
次のコードで新しいユーザーアカウントを作成します-
CREATE USER 'newusername'@'localhost' IDENTIFIED BY 'userpassword';
このコードは、特権なしでユーザーテーブルに行を追加します。 パスワードにハッシュ値を使用するオプションもあります。 次のコードでユーザー権限を付与します-
GRANT SELECT, INSERT, UPDATE, DELETE ON database1 TO 'newusername'@'localhost';
その他の特権には、MariaDBで可能なほぼすべてのコマンドまたは操作が含まれます。 ユーザーを作成したら、「FLUSH PRIVILEGES」コマンドを実行して、許可テーブルを更新します。 これにより、ユーザーアカウントを使用できます。
構成ファイル
Unix/Linuxでビルドした後、構成ファイル「/etc/mysql/my.cnf」を次のように編集する必要があります-
# Example mysql config file.
# You can copy this to one of:
#/etc/my.cnf to set global options,
#/mysql-data-dir/my.cnf to get server specific options or
# ~/my.cnf for user specific options.
#
# One can use all long options that the program supports.
# Run the program with --help to get a list of available options
# This will be passed to all mysql clients
[client]
#password = my_password
#port = 3306
#socket =/tmp/mysql.sock
# Here is entries for some specific programs
# The following values assume you have at least 32M ram
# The MySQL server
[mysqld]
#port = 3306
#socket =/tmp/mysql.sock
temp-pool
# The following three entries caused mysqld 10.0.1-MariaDB (and possibly other
versions) to abort...
# skip-locking
# set-variable = key_buffer = 16M
# set-variable = thread_cache = 4
loose-innodb_data_file_path = ibdata1:1000M
loose-mutex-deadlock-detector
gdb
######### Fix the two following paths
# Where you want to have your database
data =/path/to/data/dir
# Where you have your mysql/MariaDB source + sql/share/english
language =/path/to/src/dir/sql/share/english
[mysqldump]
quick
MariaDB
8
set-variable = max_allowed_packet=16M
[mysql]
no-auto-rehash
[myisamchk]
set-variable = key_buffer = 128M
「data =」と「language =」の行を環境に合わせて編集します。
ファイルの変更後、ソースディレクトリに移動し、次を実行します-
./scripts/mysql_install_db --srcdir = $PWD --datadir =/path/to/data/dir --
user = $LOGNAME
datadirを構成ファイルに追加した場合は、「$ PWD」変数を省略します。 MariaDBのバージョン10.0.1を実行する場合は、「$ LOGNAME」が使用されていることを確認してください。
管理コマンド
MariaDBで作業するときに定期的に使用する重要なコマンドの次のリストを確認します-
- USE [データベース名] -現在のデフォルトのデータベースを設定します。
- SHOW DATABASES -現在サーバー上にあるデータベースを一覧表示します。
- SHOW TABLES -すべての非一時テーブルを一覧表示します。
- SHOW COLUMNS FROM [テーブル名] -指定したテーブルに関する列情報を提供します。
- SHOW INDEX FROM TABLENAME [テーブル名] -指定したテーブルに関連するテーブルインデックス情報を提供します。
- SHOW TABLE STATUS LIKE [テーブル名] \ G – -非一時テーブルに関する情報をテーブルに提供し、LIKE句を使用してテーブル名を取得した後に表示されるパターン。
MariaDB-PHP構文
MariaDBは、PHP、C#、JavaScript、Ruby on Rails、Djangoなど、さまざまなプログラミング言語およびフレームワークと良好に連携しています。 PHPは、そのシンプルさと歴史的なフットプリントにより、利用可能なすべての言語の中で最も人気があります。 このガイドでは、MariaDBと提携しているPHPに焦点を当てます。
PHPは、MySQLデータベースを操作するための一連の関数を提供します。 これらの関数は、アクセスや操作の実行などのタスクを実行し、MariaDBと完全に互換性があります。 他のPHP関数を呼び出すように、これらの関数を呼び出すだけです。
MariaDBに使用するPHP関数は、次の形式に準拠しています-
mysql_function(value,value,...);
関数の2番目の部分は、アクションを指定します。 このガイドで使用される機能の2つは次のとおりです-
mysqli_connect($connect);
mysqli_query($connect,"SQL statement");
次の例は、MariaDB関数へのPHP呼び出しの一般的な構文を示しています-
<html>
<head>
<title>PHP and MariaDB</title>
</head>
<body>
<?php
$retval = mysql_function(value, [value,...]);
if( !$retval ) {
die ( "Error: Error message here" );
}
//MariaDB or PHP Statements
?>
</body>
</html>
次のセクションでは、PHP関数を使用して、重要なMariaDBタスクを調べます。
MariaDB-接続
MariaDBとの接続を確立する1つの方法は、コマンドプロンプトでmysqlバイナリを使用することです。
MYSQLバイナリ
以下の例を確認してください。
[root@host]# mysql -u root -p
Enter password:******
上記のコードはMariaDBに接続し、SQLコマンドを実行するためのコマンドプロンプトを提供します。 コードを入力すると、接続が成功したことを示すウェルカムメッセージが表示され、バージョン番号が表示されます。
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 122323232
Server version: 5.5.40-MariaDB-log
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
この例ではルートアクセスを使用していますが、特権を持つユーザーはもちろんMariaDBプロンプトにアクセスして操作を実行できます。
次のように exit コマンドを使用してMariaDBから切断します-
mysql> exit
PHP接続スクリプト
MariaDBに接続および切断する別の方法は、PHPスクリプトを使用することです。 PHPは、データベース接続を開くための* mysql_connect()関数を提供します。 5つのオプションパラメータを使用し、接続に成功するとMariaDBリンク識別子を返し、接続に失敗するとfalseを返します。 また、単一のパラメーターを使用するデータベース接続を閉じるための mysql_close()*関数も提供します。
構文
次のPHP接続スクリプトの構文を確認してください-
connection mysql_connect(server,user,passwd,new_link,client_flag);
パラメータの説明は以下のとおりです-
| Sr.No | Parameter & Description |
|---|---|
| 1 |
server このオプションのパラメーターは、データベースサーバーを実行しているホスト名を指定します。 デフォルト値は「localhost:.3036」です。 |
| 2 |
user このオプションのパラメーターは、データベースにアクセスするユーザー名を指定します。 デフォルト値はサーバーの所有者です。 |
| 3 |
passwd このオプションのパラメーターは、ユーザーのパスワードを指定します。 デフォルト値は空白です。 |
| 4 |
new_link このオプションのパラメーターは、新しい接続ではなく、同じ引数を使用した* mysql_connect()*の2回目の呼び出しで、現在の接続の識別子が返されることを指定します。 |
| 5 |
client flags このオプションのパラメータは、次の定数値の組み合わせを使用します-
|
以下に示すPHP切断スクリプトの構文を確認します-
bool mysql_close ( resource $link_identifier );
リソースを省略すると、最近開いたリソースが閉じます。 正常に終了するとtrue、またはfalseの値を返します。
MariaDBサーバーに接続するには、次のサンプルコードを試してください-
<html>
<head>
<title>Connect to MariaDB Server</title>
</head>
<body>
<?php
$dbhost = 'localhost:3036';
$dbuser = 'guest1';
$dbpass = 'guest1a';
$conn = mysql_connect($dbhost, $dbuser, $dbpass);
if(! $conn ) {
die('Could not connect: ' . mysql_error());
}
echo 'Connected successfully';
mysql_close($conn);
?>
</body>
</html>
接続に成功すると、次の出力が表示されます-
mysql> Connected successfully
MariaDB-データベースの作成
MariaDBでデータベースを作成または削除するには、通常、rootユーザーまたは管理者にのみ付与される特権が必要です。 これらのアカウントでは、データベースを作成するための2つのオプション、mysqladminバイナリとPHPスクリプトがあります。
mysqladminバイナリ
次の例は、 Products という名前のデータベースを作成する際のmysqladminバイナリの使用を示しています-
[root@host]# mysqladmin -u root -p create PRODUCTS
Enter password:******
PHPデータベース作成スクリプト
PHPは、MariaDBデータベースの作成に mysql_query 関数を使用します。 この関数は2つのパラメーターを使用し、1つはオプションで、成功した場合は「true」、そうでない場合は「false」の値を返します。
構文
以下の create database script 構文を確認してください-
bool mysql_query( sql, connection );
パラメータの説明は以下のとおりです-
| S.No | Parameter & Description |
|---|---|
| 1 |
sql この必須パラメーターは、操作の実行に必要なSQLクエリで構成されます。 |
| 2 |
connection 指定しない場合、このオプションのパラメーターは、使用された最新の接続を使用します。 |
データベースを作成するための次のサンプルコードを試してください-
<html>
<head>
<title>Create a MariaDB 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 PRODUCTS';
$retval = mysql_query( $sql, $conn );
if(! $retval ) {
die('Could not create database: ' . mysql_error());
}
echo "Database PRODUCTS created successfully\n";
mysql_close($conn);
?>
</body>
</html>
削除に成功すると、次の出力が表示されます-
mysql> Database PRODUCTS created successfully
mysql> SHOW DATABASES;
+-----------------------+
| Database |
+-----------------------+
| PRODUCTS |
+-----------------------+
MariaDB-データベースの削除
MariaDBでデータベースを作成または削除するには、通常、rootユーザーまたは管理者にのみ付与される特権が必要です。 これらのアカウントでは、データベースを削除するための2つのオプション、mysqladminバイナリとPHPスクリプトがあります。
削除されたデータベースは回復不能であるため、この操作の実行には注意が必要です。 さらに、削除に使用されるPHPスクリプトは、削除前に確認を求める* [。underline]#not#*プロンプトを表示します。
mysqladminバイナリ
次の例は、mysqladminバイナリを使用して既存のデータベースを削除する方法を示しています-
[root@host]# mysqladmin -u root -p drop PRODUCTS
Enter password:******
mysql> DROP PRODUCTS
ERROR 1008 (HY000): Can't drop database 'PRODUCTS'; database doesn't exist
PHPドロップデータベーススクリプト
PHPは、MariaDBデータベースの削除に mysql_query 関数を使用します。 この関数は2つのパラメーターを使用し、1つはオプションで、成功した場合は「true」、そうでない場合は「false」の値を返します。
構文
次のドロップデータベーススクリプトの構文を確認します-
bool mysql_query( sql, connection );
パラメータの説明は以下のとおりです-
| Sr.No | Parameter & Description |
|---|---|
| 1 |
sql この必須パラメーターは、操作の実行に必要なSQLクエリで構成されます。 |
| 2 |
connection 指定しない場合、このオプションのパラメーターは、使用された最新の接続を使用します。 |
データベースを削除するための次のサンプルコードを試してください-
<html>
<head>
<title>Delete a MariaDB 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 PRODUCTS';
$retval = mysql_query( $sql, $conn );
if(! $retval ){
die('Could not delete database: ' . mysql_error());
}
echo "Database PRODUCTS deleted successfully\n";
mysql_close($conn);
?>
</body>
</html>
削除に成功すると、次の出力が表示されます-
mysql> Database PRODUCTS deleted successfully
MariaDB-データベースの選択
MariaDBに接続した後、多くのデータベースが存在する可能性があるため、使用するデータベースを選択する必要があります。 このタスクを実行するには、コマンドプロンプトから、またはPHPスクリプトを使用して、2つの方法があります。
コマンドプロンプト
コマンドプロンプトでデータベースを選択する際には、単にSQLコマンド 'use' を利用します-
[root@host]# mysql -u root -p
Enter password:******
mysql> use PRODUCTS;
Database changed
mysql> SELECT database();
+-------------------------+
| Database |
+-------------------------+
| PRODUCTS |
+-------------------------+
データベースを選択すると、以降のすべてのコマンドは選択したデータベースで動作します。
注-すべての名前(データベース、テーブル、フィールドなど)は大文字と小文字が区別されます。 コマンドが適切なケースに準拠していることを確認してください。
PHP Selectデータベーススクリプト
PHPは、データベース選択のために mysql_select_db 関数を提供します。 この関数は2つのパラメーターを使用します。1つはオプションで、選択が成功すると「true」、失敗するとfalseの値を返します。
構文
次の選択データベーススクリプト構文を確認します。
bool mysql_select_db( db_name, connection );
パラメータの説明は以下のとおりです-
| S.No | Parameter & Description |
|---|---|
| 1 |
db_name この必須パラメーターは、使用するデータベースの名前を指定します。 |
| 2 |
connection 指定しない場合、このオプションのパラメーターは、使用された最新の接続を使用します。 |
データベースを選択するための次のサンプルコードを試してください-
<html>
<head>
<title>Select a MariaDB Database</title>
</head>
<body>
<?php
$dbhost = 'localhost:3036';
$dbuser = 'guest1';
$dbpass = 'guest1a';
$conn = mysql_connect($dbhost, $dbuser, $dbpass);
if(! $conn ) {
die('Could not connect: ' . mysql_error());
}
echo 'Connected successfully';
mysql_select_db( 'PRODUCTS' );
mysql_close($conn);
?>
</body>
</html>
選択が成功すると、次の出力が表示されます-
mysql> Connected successfully
MariaDB-データ型
データベースを最適化するには、適切なフィールド定義が不可欠です。 理想的なアプローチでは、必要なタイプとサイズのフィールドのみを使用する必要があります。 たとえば、5文字幅のフィールドのみを使用する場合は、20文字幅のフィールドを定義しないでください。 フィールド(または列)タイプは、フィールド内に格納されているデータタイプを考えると、データタイプとも呼ばれます。
MariaDBデータ型は、数値、日付と時刻、および文字列値として分類できます。
数値データ型
MariaDBがサポートする数値データ型は次のとおりです-
- TINYINT -このデータ型は、符号付き範囲-128〜127、および符号なし範囲0〜255に収まる小さな整数を表します。
- BOOLEAN -このデータ型は、値0を「false」に関連付け、値1を「true」に関連付けます。
- SMALLINT -このデータ型は、符号付き範囲-32768〜32768、および符号なし範囲0〜65535の整数を表します。
- MEDIUMINT -このデータ型は、-8388608〜8388607の符号付き範囲の整数、および0〜16777215の符号なし範囲を表します。
- * INT(INTEGER)*-このデータ型は通常サイズの整数を表します。 符号なしとしてマークされている場合、範囲は0〜4294967295になります。 署名されている場合(デフォルト設定)、範囲は-2147483648〜2147483647です。 列がZEROFILL(符号なし状態)に設定されている場合、すべての値の先頭にゼロが追加され、INT値にM桁が配置されます。
- BIGINT -このデータ型は、符号付き範囲9223372036854775808から9223372036854775807、および符号なし範囲0から18446744073709551615の整数を表します。
- DECIMAL (DEC、NUMERIC、FIXED)-このデータ型は正確な固定小数点数を表し、Mはその桁を指定し、Dは小数の後の桁を指定します。 M値は、「-」または小数点を追加しません。 Dが0に設定されている場合、小数部または小数部は表示されず、値はINSERTで最も近いDECIMALに丸められます。 許可される最大桁数は65で、小数部の最大数は30です。 省略時のMのデフォルト値は10、省略時のDのデフォルト値は0です。
- FLOAT -このデータ型は、値0または以下の範囲内の数値の小さい浮動小数点数を表します-
- -3.402823466E + 38から-1.175494351E-38
- 1.175494351E-38から3.402823466E + 38
- DOUBLE ( REAL および* DOUBLE PRECISION)*-このデータ型は、値0または以下の範囲内の通常サイズの浮動小数点数を表します-
- -1.7976931348623157E + 308から-2.2250738585072014E-308
- 2.2250738585072014E-308から1.7976931348623157E + 308
- BIT -このデータ型はビットフィールドを表し、Mは値ごとのビット数を指定します。 Mを省略すると、デフォルトは1です。 ビット値は、値が0と1のビット値を表す「b ’[value]’」で適用できます。 ゼロパディングは、完全に左から自動的に行われます。たとえば、「10」は「0010」になります。
日付と時刻のデータ型
MariaDBがサポートする日付と時刻のデータ型は次のとおりです-
- DATE -このデータ型は、「1000-01-01」から「9999-12-31」の日付範囲を表し、「YYYY-MM-DD」日付形式を使用します。
- TIME -このデータ型は、「-838:59:59.999999」から「838:59:59.999999」までの時間範囲を表します。
- DATETIME -このデータ型は、「1000-01-01 00:00:00.000000」から「9999-12-31 23:59:59.999999」の範囲を表します。「YYYY-MM-DD HH:MM:SS」を使用します" フォーマット。
- TIMESTAMP -このデータ型は、「YYYY-MM-DD HH:MM:DD」形式のタイムスタンプを表します。 主に、データベースの変更(挿入や更新など)の時間を詳細に説明する際に使用されます。
- YEAR -このデータ型は、4桁の形式で年を表します。 4桁の形式では、1901から2155、および0000の範囲の値を使用できます。
文字列データ型
MariaDBでサポートされている文字列型の値は次のとおりです-
- 文字列リテラル-このデータ型は、引用符で囲まれた文字シーケンスを表します。
- CHAR -このデータ型は、指定された長さのスペースを含む右詰めの固定長文字列を表します。 Mは、0〜255の範囲の文字の列の長さを表し、デフォルト値は1です。
- VARCHAR -このデータ型は、0〜65535のM範囲(最大列長)を持つ可変長文字列を表します。
- BINARY -このデータ型はバイナリバイト文字列を表し、Mはバイト単位の列長です。
- VARBINARY -このデータ型は可変長のバイナリバイト文字列を表し、Mは列の長さです。
- TINYBLOB -このデータ型は、最大長が255(28-1)バイトのblob列を表します。 ストレージでは、それぞれが値のバイト数を示す1バイトの長さのプレフィックスを使用します。
- BLOB -このデータ型は、最大長が65,535(216-1)バイトのblob列を表します。 ストレージでは、それぞれが値のバイト数を示す2バイトの長さのプレフィックスを使用します。
- MEDIUMBLOB -このデータ型は、最大長16,777,215(22 ^ 4 ^-1)バイトのblob列を表します。 ストレージでは、それぞれが値のバイト数を示す3バイトの長さのプレフィックスを使用します。
- LONGBLOB -このデータ型は、最大長が4,294,967,295(2 ^ 32 ^-1)バイトのblob列を表します。 ストレージでは、それぞれが値のバイト数を示す4バイトの長さのプレフィックスを使用します。
- TINYTEXT -このデータ型は、最大長255(2 ^ 8 ^-1)文字のテキスト列を表します。 ストレージでは、それぞれが値のバイト数を示す1バイトの長さのプレフィックスを使用します。
- TEXT -このデータ型は、最大長65,535(2 ^ 16 ^-1)文字のテキスト列を表します。 ストレージでは、それぞれが値のバイト数を示す2バイトの長さのプレフィックスを使用します。
- MEDIUMTEXT -このデータ型は、最大長16,777,215(2 ^ 24 ^-1)文字のテキスト列を表します。 ストレージでは、それぞれが値のバイト数を示す3バイトの長さのプレフィックスを使用します。
- LONGTEXT -このデータ型は、最大長が4,294,967,295または4GB(2 ^ 32 ^-1)文字のテキスト列を表します。 ストレージでは、それぞれが値のバイト数を示す4バイトの長さのプレフィックスを使用します。
- ENUM -このデータ型は、リストから単一の値のみを持つ文字列オブジェクトを表します。
- SET -このデータ型は、最大64のメンバーを持つ、リストから0個以上の値を持つ文字列オブジェクトを表します。 SET値は、整数値として内部に存在します。
MariaDB-テーブルの作成
この章では、テーブルの作成方法を学びます。 テーブルを作成する前に、まずその名前、フィールド名、およびフィールド定義を決定します。
以下は、テーブル作成の一般的な構文です-
CREATE TABLE table_name (column_name column_type);
PRODUCTSデータベースのテーブルの作成に適用されるコマンドを確認します-
databaseproducts_ tbl(
product_id INT NOT NULL AUTO_INCREMENT,
product_name VARCHAR(100) NOT NULL,
product_manufacturer VARCHAR(40) NOT NULL,
submission_date DATE,
PRIMARY KEY ( product_id )
);
上記の例では、フィールド値として「NOT NULL」を使用して、NULL値によるエラーを回避しています。 属性「AUTO_INCREMENT」は、次に利用可能な値をIDフィールドに追加するようMariaDBに指示します。 キーワードの主キーは、列を*主キー*として定義します。 コンマで区切られた複数の列で主キーを定義できます。
テーブルを作成する主な2つの方法は、コマンドプロンプトとPHPスクリプトを使用することです。
コマンドプロンプト
以下に示すように、CREATE TABLEコマンドを使用してタスクを実行します-
root@host# mysql -u root -p
Enter password:*******
mysql> use PRODUCTS;
Database changed
mysql> CREATE TABLE products_tbl(
-> product_id INT NOT NULL AUTO_INCREMENT,
-> product_name VARCHAR(100) NOT NULL,
-> product_manufacturer VARCHAR(40) NOT NULL,
-> submission_date DATE,
-> PRIMARY KEY ( product_id )
-> );
mysql> SHOW TABLES;
+------------------------+
| PRODUCTS |
+------------------------+
| products_tbl |
+------------------------+
すべてのコマンドがセミコロンで終了していることを確認してください。
PHPテーブル作成スクリプト
PHPは、テーブル作成用に* mysql_query()*を提供します。 その2番目の引数には、必要なSQLコマンドが含まれています-
<html>
<head>
<title>Create a MariaDB Table</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 products_tbl( ".
"product_id INT NOT NULL AUTO_INCREMENT, ".
"product_name VARCHAR(100) NOT NULL, ".
"product_manufacturer VARCHAR(40) NOT NULL, ".
"submission_date DATE, ".
"PRIMARY KEY ( product_id )); ";
mysql_select_db( 'PRODUCTS' );
$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> Table created successfully
MariaDB-テーブルの削除
この章では、テーブルを削除する方法を学びます。
テーブルの削除は非常に簡単ですが、削除されたテーブルはすべて回復不能であることを忘れないでください。 テーブル削除の一般的な構文は次のとおりです-
DROP TABLE table_name ;
テーブルドロップを実行するには、コマンドプロンプトまたはPHPスクリプトを使用する2つのオプションがあります。
コマンドプロンプト
コマンドプロンプトで、単に DROP TABLE SQLコマンドを使用します-
root@host# mysql -u root -p
Enter password:*******
mysql> use PRODUCTS;
Database changed
mysql> DROP TABLE products_tbl
mysql> SELECT * from products_tbl
ERROR 1146 (42S02): Table 'products_tbl' doesn't exist
PHPドロップテーブルスクリプト
PHPは、テーブルを削除するための* mysql_query()*を提供します。 2番目の引数に適切なSQLコマンドを渡すだけです-
<html>
<head>
<title>Create a MariaDB Table</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 products_tbl";
mysql_select_db( 'PRODUCTS' );
$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> Table deleted successfully
MariaDB-クエリの挿入
この章では、テーブルにデータを挿入する方法を学びます。
テーブルにデータを挿入するには、INSERTコマンドが必要です。 コマンドの一般的な構文は、INSERTの後にテーブル名、フィールド、および値が続きます。
以下に示す一般的な構文を確認します-
INSERT INTO tablename (field,field2,...) VALUES (value, value2,...);
このステートメントでは、ストリング値に単一引用符または二重引用符を使用する必要があります。 ステートメントの他のオプションには、「INSERT … SET」ステートメント、「INSERT … SELECT」ステートメント、および他のいくつかのオプションが含まれます。
注-ステートメント内に表示されるVALUES()関数は、INSERTステートメントにのみ適用され、他の場所で使用された場合はNULLを返します。
操作を実行するための2つのオプションがあります。コマンドラインを使用するか、PHPスクリプトを使用します。
コマンドプロンプト
プロンプトで、選択操作を実行する多くの方法があります。 標準的なステートメントは以下のとおりです-
belowmysql>
INSERT INTO products_tbl (ID_number, Nomenclature) VALUES (12345,“Orbitron 4000”);
mysql> SHOW COLUMNS FROM products_tbl;
+-------------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------------+-------------+------+-----+---------+-------+
| ID_number | int(5) | | | | |
| Nomenclature| char(13) | | | | |
+-------------+-------------+------+-----+---------+-------+
あなたは複数の行を挿入することができます-
INSERT INTO products VALUES (1, “first row”), (2, “second row”);
また、SET句を採用することができます-
INSERT INTO products SELECT * FROM inventory WHERE status = 'available';
PHP挿入スクリプト
PHP関数内で同じ「INSERT INTO …」ステートメントを使用して、操作を実行します。 もう一度* mysql_query()*関数を使用します。
以下に示す例を確認します-
<?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() ) {
$product_name = addslashes ($_POST['product_name']);
$product_manufacturer = addslashes ($_POST['product_name']);
} else {
$product_name = $_POST['product_name'];
$product_manufacturer = $_POST['product_manufacturer'];
}
$ship_date = $_POST['ship_date'];
$sql = "INSERT INTO products_tbl ".
"(product_name,product_manufacturer, ship_date) ".
"VALUES"."('$product_name','$product_manufacturer','$ship_date')";
mysql_select_db('PRODUCTS');
$retval = mysql_query( $sql, $conn );
if(! $retval ) {
die('Could not enter data: ' . mysql_error());
}
echo "Entered data successfully\n";
mysql_close($conn);
}
?>
データの挿入が成功すると、次の出力が表示されます-
mysql> Entered data successfully
また、正しいデータ入力を確認するためのチェックなどの挿入ステートメントと検証ステートメントを連携させます。 MariaDBには、この目的のための多数のオプションが含まれており、その一部は自動化されています。
MariaDB-選択クエリ
この章では、テーブルからデータを選択する方法を学びます。
SELECTステートメントは、選択された行を取得します。 UNIONステートメント、順序句、LIMIT句、WHERE句、GROUP BY … HAVING句、およびサブクエリを含めることができます。
次の一般的な構文を確認します-
SELECT field, field2,... FROM table_name, table_name2,... WHERE...
SELECTステートメントは、使用するテーブルを指定するための複数のオプションを提供します-
- database_name.table_name
- table_name.column_name
- database_name.table_name.column_name
すべての選択ステートメントには、1つ以上の*選択式*が含まれている必要があります。 選択式は、次のオプションのいずれかで構成されています-
- 列名
- 演算子と関数を使用する式。
- 指定されたテーブル内のすべての列を選択するための指定「table_name。*」。
- FROM句で指定されたすべてのテーブルからすべての列を選択する文字「*」。
selectステートメントの実行には、コマンドプロンプトまたはPHPスクリプトを使用できます。
コマンドプロンプト
コマンドプロンプトで、次のようにステートメントを実行します-
root@host# mysql -u root -p password;
Enter password:*******
mysql> use PRODUCTS;
Database changed
mysql> SELECT * from products_tbl
+-------------+---------------+
| ID_number | Nomenclature |
+-------------+---------------+
| 12345 | Orbitron 4000 |
+-------------+---------------+
PHP Selectスクリプト
PHP関数内で同じSELECTステートメントを使用して、操作を実行します。 もう一度* 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 product_id, product_name,product_manufacturer, ship_date FROM products_tbl';
mysql_select_db('PRODUCTS');
$retval = mysql_query( $sql, $conn );
if(! $retval ) {
die('Could not get data: ' . mysql_error());
}
while($row = mysql_fetch_array($retval, MYSQL_ASSOC)) {
echo "Product ID :{$row['product_id']} <br> ".
"Name: {$row['product_name']} <br> ".
"Manufacturer: {$row['product_manufacturer']} <br> ".
"Ship Date : {$row['ship_date']} <br>".
"--------------------------------<br>";
}
echo "Fetched data successfully\n";
mysql_close($conn);
?>
データの取得に成功すると、次の出力が表示されます-
Product ID: 12345
Nomenclature: Orbitron 4000
Manufacturer: XYZ Corp
Ship Date: 01/01/17
----------------------------------------------
Product ID: 12346
Nomenclature: Orbitron 3000
Manufacturer: XYZ Corp
Ship Date: 01/02/17
----------------------------------------------
mysql> Fetched data successfully
ベストプラクティスでは、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 product_id, product_name, product_manufacturer, ship_date FROM products_tbl';
mysql_select_db('PRODUCTS');
$retval = mysql_query( $sql, $conn );
if(! $retval ) {
die('Could not get data: ' . mysql_error());
}
while($row = mysql_fetch_array($retval, MYSQL_NUM)) {
echo "Product ID :{$row[0]} <br> ".
"Name: {$row[1]} <br> ".
"Manufacturer: {$row[2]} <br> ".
"Ship Date : {$row[3]} <br> ".
"--------------------------------<br>";
}
mysql_free_result($retval);
echo "Fetched data successfully\n";
mysql_close($conn);
?>
MariaDB-Where Clause
*WHERE* 句は、SELECT、UPDATE、DELETE、INSERTなどのさまざまなステートメントをフィルタリングします。 アクションを指定するために使用される基準を提示します。 通常、ステートメント内のテーブル名の後に表示され、その条件が続きます。 WHERE句は、基本的にifステートメントのように機能します。
以下に示すWHERE句の一般的な構文を確認します-
[COMMAND] field,field2,... FROM table_name,table_name2,... WHERE [CONDITION]
WHERE句の次の品質に注意してください-
- オプションです。
- 任意の条件を指定できます。
- ANDまたはOR演算子を使用して、複数の条件を指定できます。
- 大文字と小文字の区別は、LIKE比較を使用するステートメントにのみ適用されます。
WHERE句は、次の演算子の使用を許可します-
| Operator | = != | > < | >= ⇐ |
|---|
WHERE句は、コマンドプロンプトまたはPHPスクリプト内で使用できます。
コマンドプロンプト
コマンドプロンプトで、単に標準コマンドを使用します-
root@host# mysql -u root -p password;
Enter password:*******
mysql> use PRODUCTS;
Database changed
mysql> SELECT * from products_tbl WHERE product_manufacturer = 'XYZ Corp';
+-------------+----------------+----------------------+
| ID_number | Nomenclature | product_manufacturer |
+-------------+----------------+----------------------+
| 12345 | Orbitron 4000 | XYZ Corp |
+-------------+----------------+----------------------+
| 12346 | Orbitron 3000 | XYZ Corp |
+-------------+----------------+----------------------+
| 12347 | Orbitron 1000 | XYZ Corp |
+-------------+----------------+----------------------+
*AND* 条件を使用して例を確認します-
SELECT *
FROM products_tbl
WHERE product_name = 'Bun Janshu 3000';
AND product_id <= 344;
この例では、AND条件とOR条件の両方を組み合わせています
SELECT *
FROM products_tbl
WHERE (product_name = 'Bun Janshu 3000' AND product_id < 344)
OR (product_name = 'Bun Janshu 3000');
Where句を使用したPHPスクリプト
WHERE句を使用する操作で* 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 product_id, product_name, product_manufacturer, ship_date
FROM products_tbl
WHERE product_manufacturer = "XYZ Corp"';
mysql_select_db('PRODUCTS');
$retval = mysql_query( $sql, $conn );
if(! $retval ) {
die('Could not get data: ' . mysql_error());
}
while($row = mysql_fetch_array($retval, MYSQL_ASSOC)) {
echo "Product ID :{$row['product_id']} <br> ".
"Name: {$row['product_name']} <br> ".
"Manufacturer: {$row['product_manufacturer']} <br> ".
"Ship Date: {$row['ship_date']} <br> ".
"--------------------------------<br>";
}
echo "Fetched data successfully\n";
mysql_close($conn);
?>
データの取得に成功すると、次の出力が表示されます-
Product ID: 12345
Nomenclature: Orbitron 4000
Manufacturer: XYZ Corp
Ship Date: 01/01/17
----------------------------------------------
Product ID: 12346
Nomenclature: Orbitron 3000
Manufacturer: XYZ Corp
Ship Date: 01/02/17
----------------------------------------------
Product ID: 12347
Nomenclature: Orbitron 1000
Manufacturer: XYZ Corp
Ship Date: 01/02/17
----------------------------------------------
mysql> Fetched data successfully
MariaDB-クエリの更新
*UPDATE* コマンドは、値を変更して既存のフィールドを変更します。 SET句を使用して、変更する列を指定し、割り当てられた新しい値を指定します。 これらの値は、式またはフィールドのデフォルト値のいずれかです。 デフォルト値を設定するには、DEFAULTキーワードを使用する必要があります。 このコマンドは、WHERE句を使用して更新の条件を指定したり、ORDER BY句を使用して特定の順序で更新したりすることもできます。
次の一般的な構文を確認します-
UPDATE table_name SET field=new_value, field2=new_value2,...
[WHERE ...]
コマンドプロンプトから、またはPHPスクリプトを使用して、UPDATEコマンドを実行します。
コマンドプロンプト
コマンドプロンプトで、単に標準のコマンドルートを使用します-
root@host# mysql -u root -p password;
Enter password:*******
mysql> use PRODUCTS;
Database changed
mysql> UPDATE products_tbl
SET nomenclature = 'Fiber Blaster 300Z' WHERE ID_number = 112;
mysql> SELECT * from products_tbl WHERE ID_number='112';
+-------------+---------------------+----------------------+
| ID_number | Nomenclature | product_manufacturer |
+-------------+---------------------+----------------------+
| 112 | Fiber Blaster 300Z | XYZ Corp |
+-------------+---------------------+----------------------+
PHP更新クエリスクリプト
UPDATEコマンドステートメントで* 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 = ‘UPDATE products_tbl
SET product_name = ”Fiber Blaster 300z”
WHERE product_id = 112’;
mysql_select_db(‘PRODUCTS’);
$retval = mysql_query( $sql, $conn );
if(! $retval ) {
die(‘Could not update data: ‘ . mysql_error());
}
echo “Updated data successfully\n”;
mysql_close($conn);
?>
データの更新が成功すると、次の出力が表示されます-
mysql> Updated data successfully
MariaDB-クエリの削除
DELETEコマンドは、指定されたテーブルからテーブル行を削除し、削除された数量を返します。 ROW_COUNT()関数を使用して、削除された数量にアクセスします。 WHERE句は行を指定し、存在しない場合はすべての行が削除されます。 LIMIT句は、削除される行の数を制御します。
複数の行に対するDELETEステートメントでは、条件を満たす行のみを削除します。 LIMITおよびWHERE句は許可されていません。 DELETEステートメントでは、異なるデータベースのテーブルから行を削除できますが、テーブルから削除してからサブクエリ内の同じテーブルから選択することはできません。
次のDELETE構文を確認します-
DELETE FROM table_name [WHERE …]
コマンドプロンプトから、またはPHPスクリプトを使用して、DELETEコマンドを実行します。
コマンドプロンプト
コマンドプロンプトで、単に標準コマンドを使用します-
root@host# mysql –u root –p password;
Enter password:*******
mysql> use PRODUCTS;
Database changed
mysql> DELETE FROM products_tbl WHERE product_id=133;
mysql> SELECT * from products_tbl WHERE ID_number='133';
ERROR 1032 (HY000): Can't find record in 'products_tbl'
PHP削除クエリスクリプト
DELETEコマンドステートメントで* 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 = 'DELETE FROM products_tbl WHERE product_id = 261';
mysql_select_db('PRODUCTS');
$retval = mysql_query( $sql, $conn );
if(! $retval ) {
die('Could not delete data: ' . mysql_error());
}
echo "Deleted data successfully\n";
mysql_close($conn);
?>
データの削除に成功すると、次の出力が表示されます-
mysql> Deleted data successfully
mysql> SELECT * from products_tbl WHERE ID_number='261';
ERROR 1032 (HY000): Can't find record in 'products_tbl'
MariaDB-Like句
WHERE句は、操作が完全一致を使用するときにデータを取得する方法を提供します。 共通の特性を持つ複数の結果が必要な状況では、 LIKE 句は広範なパターンマッチングに対応します。
LIKE句は、パターンマッチをテストし、trueまたはfalseを返します。 比較に使用されるパターンは、次のワイルドカード文字を受け入れます。「%」は文字数(0以上)と一致します。 「」は単一の文字に一致します。 「」ワイルドカード文字は、そのセット内の文字にのみ一致します。つまり、別のセットを使用する場合、ラテン文字は無視されます。 一致はデフォルトで大文字と小文字を区別しません。大文字と小文字を区別するための追加設定が必要です。
NOT LIKE句を使用すると、 not 演算子と同様に、反対の条件をテストできます。
ステートメント式またはパターンがNULLと評価される場合、結果はNULLです。
以下に示す一般的なLIKE句の構文を確認します-
SELECT field, field2,... FROM table_name, table_name2,...
WHERE field LIKE condition
コマンドプロンプトまたはPHPスクリプト内でLIKE句を使用します。
コマンドプロンプト
コマンドプロンプトで、単に標準コマンドを使用します-
root@host# mysql -u root -p password;
Enter password:*******
mysql> use TUTORIALS;
Database changed
mysql> SELECT * from products_tbl
WHERE product_manufacturer LIKE 'XYZ%';
+-------------+----------------+----------------------+
| ID_number | Nomenclature | product_manufacturer |
+-------------+----------------+----------------------+
| 12345 | Orbitron 4000 | XYZ Corp |
+-------------+----------------+----------------------+
| 12346 | Orbitron 3000 | XYZ Corp |
+-------------+----------------+----------------------+
| 12347 | Orbitron 1000 | XYZ Corp |
+-------------+----------------+----------------------+
Like節を使用したPHPスクリプト
LIKE句を使用するステートメントで* 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 product_id, product_name, product_manufacturer, ship_date
FROM products_tbl WHERE product_manufacturer LIKE "xyz%"';
mysql_select_db('PRODUCTS');
$retval = mysql_query( $sql, $conn );
if(! $retval ) {
die('Could not get data: ' . mysql_error());
}
while($row = mysql_fetch_array($retval, MYSQL_ASSOC)) {
echo "Product ID:{$row['product_id']} <br> ".
"Name: {$row['product_name']} <br> ".
"Manufacturer: {$row['product_manufacturer']} <br> ".
"Ship Date: {$row['ship_date']} <br> ".
"--------------------------------<br>";
}
echo "Fetched data successfully\n";
mysql_close($conn);
?>
データの取得に成功すると、次の出力が表示されます-
Product ID: 12345
Nomenclature: Orbitron 4000
Manufacturer: XYZ Corp
Ship Date: 01/01/17
----------------------------------------------
Product ID: 12346
Nomenclature: Orbitron 3000
Manufacturer: XYZ Corp
Ship Date: 01/02/17
----------------------------------------------
Product ID: 12347
Nomenclature: Orbitron 1000
Manufacturer: XYZ Corp
Ship Date: 01/02/17
----------------------------------------------
mysql> Fetched data successfully
MariaDB-句による順序
前の説明で述べたように、 ORDER BY 句はステートメントの結果をソートします。 操作対象のデータの順序を指定し、昇順(ASC)または降順(DESC)でソートするオプションが含まれます。 順序指定を省略すると、デフォルトの順序は昇順です。
ORDER BY句は、DELETEやUPDATEなどのさまざまなステートメントに表示されます。 最終結果のテーブルを操作するため、サブクエリ内またはset関数の前ではなく、常にステートメントの最後に表示されます。 また、整数を使用して列を識別することもできません。
以下に示すORDER BY句の一般的な構文を確認してください-
SELECT field, field2,... [or column] FROM table_name, table_name2,...
ORDER BY field, field2,... ASC[or DESC]
コマンドプロンプトまたはPHPスクリプト内でORDER BY句を使用します。
コマンドプロンプト
コマンドプロンプトで、単に標準コマンドを使用します-
root@ host# mysql -u root -p password;
Enter password:*******
mysql> use PRODUCTS;
Database changed
mysql> SELECT * from products_tbl ORDER BY product_manufacturer ASC
+-------------+----------------+----------------------+
| ID_number | Nomenclature | product_manufacturer |
+-------------+----------------+----------------------+
| 56789 | SuperBlast 400 | LMN Corp |
+-------------+----------------+----------------------+
| 67891 | Zoomzoom 5000 | QFT Corp |
+-------------+----------------+----------------------+
| 12347 | Orbitron 1000 | XYZ Corp |
+-------------+----------------+----------------------+
Order By句を使用したPHPスクリプト
ORDER BY句を使用するステートメントで、もう一度* 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 product_id, product_name, product_manufacturer, ship_date
FROM products_tbl ORDER BY product_manufacturer DESC';
mysql_select_db('PRODUCTS');
$retval = mysql_query( $sql, $conn );
if(! $retval ) {
die('Could not get data: ' . mysql_error());
}
while($row = mysql_fetch_array($retval, MYSQL_ASSOC)) {
echo "Product ID :{$row['product_id']} <br> ".
"Name: {$row['product_name']} <br> ".
"Manufacturer: {$row['product_manufacturer']} <br> ".
"Ship Date : {$row['ship_date']} <br> ".
"--------------------------------<br>";
}
echo "Fetched data successfully\n";
mysql_close($conn);
?>
データの取得に成功すると、次の出力が表示されます-
Product ID: 12347
Nomenclature: Orbitron 1000
Manufacturer: XYZ Corp
Ship Date: 01/01/17
----------------------------------------------
Product ID: 67891
Nomenclature: Zoomzoom 5000
Manufacturer: QFT Corp
Ship Date: 01/01/17
----------------------------------------------
Product ID: 56789
Nomenclature: SuperBlast 400
Manufacturer: LMN Corp
Ship Date: 01/04/17
----------------------------------------------
mysql> Fetched data successfully
MariaDB-参加
前の議論と例では、単一のテーブルからの取得、または複数のソースからの複数の値の取得について検討しました。 ほとんどの実際のデータ操作ははるかに複雑で、集約、比較、および複数のテーブルからの取得が必要です。
*JOIN* を使用すると、2つ以上のテーブルを1つのオブジェクトにマージできます。 これらは、SELECT、UPDATE、およびDELETEステートメントを通じて使用されます。
以下に示すように、JOINを使用するステートメントの一般的な構文を確認します-
SELECT column
FROM table_name1
INNER JOIN table_name2
ON table_name1.column = table_name2.column;
JOINSの古い構文では暗黙的な結合が使用され、キーワードは使用されていません。 WHERE句を使用して結合を実現することは可能ですが、キーワードは読みやすさ、保守、およびベストプラクティスに最適です。
JOINには、左結合、右結合、内部結合など、多くの形式があります。 さまざまな結合タイプは、共有値または特性に基づいてさまざまなタイプの集約を提供します。
コマンドプロンプトまたはPHPスクリプトでJOINを使用します。
コマンドプロンプト
コマンドプロンプトで、単に標準的なステートメントを使用します-
root@host# mysql -u root -p password;
Enter password:*******
mysql> use PRODUCTS;
Database changed
mysql> SELECT products.ID_number, products.Nomenclature, inventory.inventory_ct
FROM products
INNER JOIN inventory
ON products.ID_numbeer = inventory.ID_number;
+-------------+----------------+-----------------+
| ID_number | Nomenclature | Inventory Count |
+-------------+----------------+-----------------+
| 12345 | Orbitron 4000 | 150 |
+-------------+----------------+-----------------+
| 12346 | Orbitron 3000 | 200 |
+-------------+----------------+-----------------+
| 12347 | Orbitron 1000 | 0 |
+-------------+----------------+-----------------+
JOINを使用した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.product_id, a.product_manufacturer, b.product_count
FROM products_tbl a, pcount_tbl b
WHERE a.product_manufacturer = b.product_manufacturer';
mysql_select_db('PRODUCTS');
$retval = mysql_query( $sql, $conn );
if(! $retval ) {
die('Could not get data: ' . mysql_error());
}
while($row = mysql_fetch_array($retval, MYSQL_ASSOC)) {
echo "Manufacturer:{$row['product_manufacturer']} <br> ".
"Count: {$row['product_count']} <br> ".
"Product ID: {$row['product_id']} <br> ".
"--------------------------------<br>";
}
echo "Fetched data successfully\n";
mysql_close($conn);
?>
データの取得に成功すると、次の出力が表示されます-
ID Number: 12345
Nomenclature: Orbitron 4000
Inventory Count: 150
--------------------------------------
ID Number: 12346
Nomenclature: Orbitron 3000
Inventory Count: 200
--------------------------------------
ID Number: 12347
Nomenclature: Orbitron 1000
Inventory Count: 0
--------------------------------------
mysql> Fetched data successfully
MariaDB-ヌル値
NULL値を使用する場合、値が不明であることを忘れないでください。 有効な値である空の文字列またはゼロではありません。 テーブルの作成では、列の指定により、NULL値を受け入れるか拒否するかを設定できます。 NULLまたはNOT NULL句を使用するだけです。 これには、ID番号などのレコード情報が欠落している場合のアプリケーションがあります。
ユーザー定義変数の値は、明示的に割り当てられるまでNULLです。 ルーチンパラメータとローカル変数を保存すると、NULLの値を設定できます。 ローカル変数にデフォルト値がない場合、値はNULLです。
NULLは大文字と小文字を区別せず、次のエイリアスがあります-
- UNKNOWN(ブール値)
- \N
NULL演算子
NULL値を使用したすべての比較はtrueまたはfalseではなくNULLを返すため、標準の比較演算子をNULL(=、>、> =、⇐、<、または!=など)と一緒に使用することはできません。 NULLとの比較、またはNULLを含む可能性がある場合は、「<⇒」(NULL-SAFE)演算子を使用する必要があります。
他の利用可能な演算子は-
- IS NULL-NULL値をテストします。
- IS NOT NULL-NULL値がないことを確認します。
- ISNULL-NULL値を検出すると値1を返し、値がない場合は0を返します。
- COALESCE-リストの最初の非NULL値を返すか、リストがない場合はNULL値を返します。
NULL値の並べ替え
並べ替え操作では、NULL値の値が最も低いため、DESCの順序の結果、下部にNULL値が表示されます。 MariaDBでは、NULL値に高い値を設定できます。
以下に示すように、これを行うには2つの方法があります-
SELECT column1 FROM product_tbl ORDER BY ISNULL(column1), column1;
他の方法-
SELECT column1 FROM product_tbl ORDER BY IF(column1 IS NULL, 0, 1), column1 DESC;
NULL関数
関数は、通常、パラメーターがNULLの場合にNULLを出力します。 ただし、NULL値を管理するために特別に設計された関数があります。 彼らは-
- * IFNULL()*-最初の式がNULLでない場合、それを返します。 NULLと評価されると、2番目の式を返します。
- * NULLIF()*-比較された式が等しい場合はNULLを返し、等しくない場合は最初の式を返します。
SUMやAVGなどの関数はNULL値を無視します。
NULL値の挿入
NOT NULLと宣言された列にNULL値を挿入すると、エラーが発生します。 デフォルトのSQLモードでは、データ型に基づいてNOT NULL列が代わりにデフォルト値を挿入します。
フィールドがTIMESTAMP、AUTO_INCREMENT、または仮想列の場合、MariaDBはNULL値を異なる方法で管理します。 AUTO_INCREMENTカラムに挿入すると、シーケンス内の次の番号がその場所に挿入されます。 TIMESTAMPフィールドでは、MariaDBは代わりに現在のタイムスタンプを割り当てます。 このチュートリアルで後述するトピックである仮想列では、デフォルト値が割り当てられます。
UNIQUEインデックスは多くのNULL値を保持できますが、主キーをNULLにすることはできません。
NULL値と変更コマンド
ALTERコマンドを使用して列を変更すると、NULL指定がない場合、MariaDBは自動的に値を割り当てます。
MariaDB-正規表現
LIKE句から利用できるパターンマッチングを超えて、MariaDBはREGEXP演算子を使用した正規表現ベースのマッチングを提供します。 演算子は、指定されたパターンに基づいて文字列式のパターンマッチングを実行します。
MariaDB 10.0.5はPCRE正規表現を導入しました。これにより、再帰パターン、先読みアサーションなどの領域へのマッチングの範囲が劇的に増加します。
以下に示す標準のREGEXP演算子構文の使用を確認します-
SELECT column FROM table_name WHERE column REGEXP '[PATTERN]';
REGEXPは、パターンマッチの場合は1を返し、パターンマッチがない場合は0を返します。
反対のオプションは、NOT REGEXPの形式で存在します。 MariaDBは、互換性のために作成されたREGEXPとNOT REGEXP、RLIKEおよびNOT RLIKEの同義語も提供します。
比較されるパターンは、リテラル文字列またはテーブル列などのその他のものです。 文字列では、Cエスケープ構文を使用するため、「\」文字を2倍にします。 REGEXPは、バイナリ文字列を除き、大文字と小文字を区別しません。
使用できる可能なパターンの表は以下に示されています-
| Sr.No | Pattern & Description |
|---|---|
| 1 |
^ 文字列の先頭に一致します。 |
| 2 |
$ 文字列の末尾に一致します。 |
| 3 |
. 単一の文字に一致します。 |
| 4 |
[…] 大括弧内の任意の文字に一致します。 |
| 5 |
[^…] 大括弧にリストされていない任意の文字と一致します。 |
| 6 | *p1 |
| p2 |
p3* いずれかのパターンに一致します。 |
| 7 | 前の要素の0個以上のインスタンスに一致します。 |
| 8 |
+ 前の要素の1つ以上のインスタンスに一致します。 |
| 9 |
{n} 前の要素のn個のインスタンスに一致します。 |
| 10 |
\{m,n} 前の要素のm〜n個のインスタンスに一致します。 |
以下に示すパターンマッチングの例を確認します-
「pr」で始まる製品-
SELECT name FROM product_tbl WHERE name REGEXP '^pr';
「na」で終わる製品-
SELECT name FROM product_tbl WHERE name REGEXP 'na$';
母音で始まる製品-
SELECT name FROM product_tbl WHERE name REGEXP '^[aeiou]';
MariaDB-トランザクション
トランザクションは、順次グループ操作です。 これらは単一のユニットとして機能し、グループ内のすべての操作が正常に実行されるまで終了しません。 グループ内の単一障害により、トランザクション全体が失敗し、データベースに影響を与えません。
トランザクションはACID(原子性、一貫性、分離、および耐久性)に準拠しています-
- Atomicity -失敗時に中止し、変更をロールバックすることにより、すべての操作の成功を保証します。
- 一貫性-データベースが正常なトランザクションに変更を適用することを保証します。
- 分離-トランザクションの独立したトランザクション操作を可能にします。
- 耐久性-システム障害が発生した場合に成功したトランザクションの永続性を保証します。
トランザクション文の先頭には、START TRANSACTION文とそれに続くCOMMITおよびROLLBACK文があります-
- START TRANSACTIONはトランザクションを開始します。
- COMMITは、データへの変更を保存します。
- ROLLBACKはトランザクションを終了し、変更を破棄します。
トランザクションが成功すると、COMMITが機能します。 失敗すると、ROLLBACKが機能します。
注-一部のステートメントは暗黙的なコミットを引き起こし、トランザクション内で使用するとエラーを引き起こします。 このようなステートメントの例には、CREATE、ALTER、およびDROPが含まれますが、これらに限定されません。
MariaDBトランザクションには、SAVEPOINTやLOCK TABLESなどのオプションも含まれます。 SAVEPOINTは、ROLLBACKで使用する復元ポイントを設定します。 LOCK TABLESを使用すると、セッション中にテーブルへのアクセスを制御して、特定の期間中の変更を防ぐことができます。
AUTOCOMMIT変数は、トランザクションを制御します。 1を設定すると、すべての操作が成功したトランザクションと見なされ、0を設定すると、明示的なCOMMITステートメントでのみ変更の永続性が発生します。
トランザクションの構造
トランザクションステートメントの一般的な構造は、START TRANSACTIONで始まることで構成されます。 次のステップは、1つ以上のコマンド/操作の挿入、エラーをチェックするステートメントの挿入、検出されたエラーを管理するROLLBACKステートメントの挿入、最後に成功した操作に変更を適用するCOMMITステートメントの挿入です。
以下に示す例を確認します-
START TRANSACTION;
SELECT name FROM products WHERE manufacturer = 'XYZ Corp';
UPDATE spring_products SET item = name;
COMMIT;
MariaDB-変更コマンド
ALTERコマンドは、既存のテーブルの構造を変更する方法を提供します。つまり、列の削除または追加、インデックスの変更、データ型の変更、名前の変更などの変更を意味します。 ALTERは、メタデータロックがアクティブなときに変更の適用も待機します。
ALTERを使用して列を変更する
ALTERとDROPを組み合わせて、既存の列を削除します。 ただし、列が唯一の残りの列である場合は失敗します。
以下に示す例を確認します-
mysql> ALTER TABLE products_tbl DROP version_num;
ALTER … ADDステートメントを使用して列を追加します-
mysql> ALTER TABLE products_tbl ADD discontinued CHAR(1);
キーワードFIRSTとAFTERを使用して、列の配置を指定します-
ALTER TABLE products_tbl ADD discontinued CHAR(1) FIRST;
ALTER TABLE products_tbl ADD discontinued CHAR(1) AFTER quantity;
FIRSTおよびAFTERキーワードは、ALTER … ADDステートメントにのみ適用されることに注意してください。 さらに、テーブルの位置を変更するには、テーブルを削除してから追加する必要があります。
ALTERステートメントでMODIFYまたはCHANGE句を使用して、列の定義または名前を変更します。 句には同様の効果がありますが、実質的に異なる構文を使用します。
以下に示すCHANGEの例を確認します-
mysql> ALTER TABLE products_tbl CHANGE discontinued status CHAR(4);
CHANGEを使用するステートメントで、元の列を指定してから、それを置き換える新しい列を指定します。 以下のMODIFYの例を確認してください-
mysql> ALTER TABLE products_tbl MODIFY discontinued CHAR(4);
ALTERコマンドでは、デフォルト値を変更することもできます。 例を見直す-
mysql> ALTER TABLE products_tbl ALTER discontinued SET DEFAULT N;
また、DROP句と組み合わせることでデフォルトの制約を削除するために使用することができます-
mysql> ALTER TABLE products_tbl ALTER discontinued DROP DEFAULT;
ALTERを使用してテーブルを変更する
TYPE句を使用してテーブルタイプを変更する-
mysql> ALTER TABLE products_tbl TYPE = INNODB;
RENAMEキーワードでテーブルの名前を変更します-
mysql> ALTER TABLE products_tbl RENAME TO products2016_tbl;
MariaDB-インデックスと統計テーブル
インデックスは、レコードの取得を加速するためのツールです。 インデックスは、インデックス列内の各値のエントリを生成します。
インデックスには4種類あります-
- プライマリ(1つのレコードはすべてのレコードを表します)
- ユニーク(1つのレコードは複数のレコードを表します)
- 平野
- フルテキスト(テキスト検索で多くのオプションを許可します)。
「キー」と「インデックス」という用語は、この使用法では同じです。
インデックスは1つ以上の列に関連付けられ、迅速な検索と効率的なレコード編成をサポートします。 インデックスを作成するときは、クエリで頻繁に使用される列を検討してください。 次に、それらに1つまたは複数のインデックスを作成します。 さらに、インデックスを基本的に主キーのテーブルとして表示します。
インデックスは検索やSELECTステートメントを高速化しますが、テーブルとインデックスの両方で操作を実行するため、挿入と更新のドラッグを行います。
インデックスを作成する
CREATE TABLE … INDEXステートメントまたはCREATE INDEXステートメントを使用して、インデックスを作成できます。 読みやすさ、保守、およびベストプラクティスをサポートする最適なオプションは、CREATE INDEXです。
以下に示すインデックスの一般的な構文を確認します-
CREATE [UNIQUE or FULLTEXT or...] INDEX index_name ON table_name column;
その使用例を確認します-
CREATE UNIQUE INDEX top_sellers ON products_tbl product;
インデックスを削除する
DROP INDEXまたはALTER TABLE … DROPを使用してインデックスを削除できます。 読みやすさ、メンテナンス、およびベストプラクティスをサポートする最適なオプションは、DROP INDEXです。
以下に示すドロップインデックスの一般的な構文を確認します-
DROP INDEX index_name ON table_name;
その使用例を確認します-
DROP INDEX top_sellers ON product_tbl;
インデックスの名前を変更する
ALTER TABLEステートメントでインデックスの名前を変更します。 以下に示す一般的な構文を確認します-
ALTER TABLE table_name DROP INDEX index_name, ADD INDEX new_index_name;
その使用例を確認します-
ALTER TABLE products_tbl DROP INDEX top_sellers, ADD INDEX top_2016sellers;
インデックスの管理
すべてのインデックスを調べて追跡する必要があります。 SHOW INDEXを使用して、特定のテーブルに関連付けられている既存のインデックスをすべてリストします。 表示されるコンテンツの形式は、垂直形式を指定する「\ G」などのオプションを使用して設定できます。
次の例を確認します-
mysql > SHOW INDEX FROM products_tbl\G
テーブル統計
インデックスは、レコードへの高速アクセスと提供される統計を考慮して、クエリを最適化するために頻繁に使用されます。 ただし、多くのユーザーはインデックスの保守が面倒だと感じています。 MariaDB 10.0は、ストレージエンジンに依存しない統計テーブルを利用可能にしました。これにより、すべてのストレージエンジンのすべてのテーブルのデータ統計、およびインデックスが付けられていない列の統計も計算されます。
MariaDB-一時テーブル
一部の操作は、データの速度または使い捨てのために一時テーブルの恩恵を受けることができます。 一時テーブルは、コマンドプロンプト、PHPスクリプト、クライアントプログラムのいずれから使用しても、セッションの終了時に終了します。 また、通常の方法ではシステムに表示されません。 SHOW TABLESコマンドは、一時テーブルを含むリストを表示しません。
一時テーブルを作成する
CREATE TABLEステートメント内のTEMPORARYキーワードは、一時テーブルを生成します。 以下に示す例を確認します-
mysql>CREATE TEMPORARY TABLE order (
item_name VARCHAR(50) NOT NULL
, price DECIMAL(7,2) NOT NULL DEFAULT 0.00
, quantity INT UNSIGNED NOT NULL DEFAULT 0
);
一時テーブルを作成する際、LIKE句を使用して、既存のテーブルのクローンを作成できます。つまり、それらのすべての一般的な特性を意味します。 一時テーブルの生成に使用されるCREATE TABLEステートメントは、TEMPORARYキーワードの結果としてトランザクションをコミットしません。
一時的なテーブルは一時的でないものとは区別され、セッションの終了時にドロップしますが、特定の競合が発生する場合があります-
- 期限切れセッションのゴースト一時テーブルと競合する場合があります。
- 一時テーブル以外のシャドウ名と競合する場合があります。
注-一時テーブルは、MariaDBが差分参照と見なすため、既存の非一時テーブルと同じ名前を持つことができます。
管理
MariaDBでは、一時テーブルを作成するためにユーザーに特権を付与する必要があります。 GRANTステートメントを使用して、管理者以外のユーザーにこの特権を付与します。
GRANT CREATE TEMPORARY TABLES ON orders TO 'machine122'@'localhost';
一時テーブルを削除する
一時テーブルはセッションの終了時に本質的に削除されますが、それらを削除するオプションがあります。 一時テーブルを削除するには、TEMPORARYキーワードを使用する必要があります。ベストプラクティスでは、一時テーブルを一時テーブルの前に削除することをお勧めします。
mysql> DROP TABLE order;
MariaDB-テーブルのクローン作成
状況によっては、既存のテーブルの正確なコピーを作成する必要があります。 CREATE … SELECTステートメントは、インデックスやデフォルト値などを無視するため、この出力を生成できません。
テーブルを複製するための手順は次のとおりです-
- SHOW CREATE TABLEを使用して、ソーステーブルの構造全体を詳述するCREATE TABLEステートメントを作成します。
- ステートメントを編集して、テーブルに新しい名前を付けて実行します。 *テーブルデータもコピーする必要がある場合は、INSERT INTO … SELECTステートメントを使用します。
mysql> INSERT INTO inventory_copy_tbl (
product_id,product_name,product_manufacturer,ship_date)
SELECT product_id,product_name,product_manufacturer,ship_date,
FROM inventory_tbl;
複製を作成する別の方法では、CREATE TABLE ASステートメントを使用します。 この文は、すべての列、列定義をコピーし、コピーにソース表のデータを移入します。
以下の構文を確認します-
CREATE TABLE clone_tbl AS
SELECT columns
FROM original_tbl
WHERE conditions];
以下の使用例を確認してください-
CREATE TABLE products_copy_tbl AS
SELECT*
FROM products_tbl;
MariaDB-シーケンス
バージョン10.0.3では、MariaDBはシーケンスと呼ばれるストレージエンジンを導入しました。 そのアドホックは、操作用の整数シーケンスを生成し、その後終了します。 シーケンスには、降順または昇順の正の整数が含まれ、開始値、終了値、および増分値が使用されます。
仮想(ディスクに書き込まれない)の性質のため、元のクエリでのみ複数のクエリで使用できません。 ただし、ALTERコマンドを使用して、シーケンステーブルを標準テーブルに変換できます。 変換されたテーブルが削除された場合、シーケンステーブルはまだ存在します。 シーケンスは、負の数を生成したり、最小/最大で回転することもできません。
シーケンスエンジンのインストール
シーケンスを使用するには、MariaDBがバイナリではなくプラグインとして配布するシーケンスエンジンをインストールする必要があります。 次のコマンドでインストールします-
INSTALL SONAME "ha_sequence";
インストール後、それを確認します-
SHOW ENGINES\G
エンジンのインストール後、シーケンス構文を使用する名前で標準テーブルを作成することはできませんが、シーケンス構文名で一時テーブルを作成できることに注意してください。
シーケンスを作成する
シーケンス作成には2つの方法があります-
- テーブルを作成し、AUTO_INCREMENT属性を使用して、列を自動インクリメントとして定義します。 *既存のデータベースを使用し、シーケンスSELECTクエリを使用してシーケンスを作成します。 クエリは、seq_ [FROM] to [TO]またはseq_ [FROM] to [TO] _step_STEP構文を使用します。
ベストプラクティスは、2番目の方法の使用を好みます。 以下に示すシーケンス作成の例を確認します-
SELECT* FROM seq_77_to_99;
シーケンスには多くの用途があります-
- 操作内の関連する問題から保護するために、列内の欠損値を見つけます-
SELECT myseq.seq FROM seq_22_to_28 myseq LEFT JOIN table1 t ON myseq.seq
= x.y WHERE x.y IS NULL;
- 値の組み合わせを構築します-
SELECT x1.seq, x2.seq FROM seq_5_to_9 x1 JOIN seq_5_to_9 x2 ORDER BY 5, 6;
- 数の倍数を見つける-
SELECT seq FROM seq_3_to_100_step_4;
- 予約システムなどのアプリケーションで使用する日付シーケンスを作成します。
- 時系列を構築します。
MariaDB-重複の管理
MariaDBは、以前のレッスンで説明したように、状況によってはレコードとテーブルの重複を許可します。 これらの重複の一部は、個別のデータまたはオブジェクトタイプのため、または操作オブジェクトの一意の寿命またはストレージの結果として、実際には重複ではありません。 これらの複製も通常は問題ありません。
状況によっては、重複が問題を引き起こし、暗黙のアクションまたはMariaDBコマンドの緩やかなポリシーが原因で表示されることがよくあります。 この問題を制御し、重複を見つけ、重複を削除し、重複の作成を防ぐ方法があります。
戦略とツール
重複を管理する4つの重要な方法があります-
- JOINで魚を捕まえ、一時テーブルでそれらを削除します。
- INSERT … ON DUPLICATE KEY UPDATEを使用して、重複の検出時に更新します。
- DISTINCTを使用して、SELECTステートメントの結果を整理し、重複を削除します。
- INSERT IGNOREを使用して、重複の挿入を停止します。
一時テーブルでの結合の使用
内部結合のような半結合を実行し、一時テーブルで見つかった重複を削除します。
INSERTを使用する
INSERT … ON DUPLICATE KEY UPDATEが重複する一意キーまたは主キーを検出すると、更新を実行します。 複数の一意のキーが検出されると、最初のキーのみが更新されます。 したがって、複数の一意のインデックスを持つテーブルでは使用しないでください。
次の例を確認します。これは、入力されたフィールドへの挿入時にインデックス値を含むテーブルで何が起こるかを明らかにします-
INSERT INTO add_dupl VALUES (1,'Apple');
ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'
注意-キーが見つからない場合、INSERT … ON DUPLICATE KEY UPDATEステートメントは通常の挿入ステートメントと同様に実行されます。
DISTINCTを使用する
DISTINCT句は、結果から重複を削除します。 DISTINCT句の一般的な構文は次のとおりです-
SELECT DISTINCT fields
FROM table
[WHERE conditions];
注-DISTINCT句を含むステートメントの結果-
- 1つの式を使用すると、一意の値が返されます。
- 複数の式を使用すると、一意の組み合わせが返されます。
- NULL値は無視されません。したがって、結果には一意の値としてNULLも含まれます。
単一の式のDISTINCT句を使用して、次のステートメントを確認します-
SELECT DISTINCT product_id
FROM products
WHERE product_name = 'DustBlaster 5000';
複数の式を使用して次の例を確認します-
SELECT DISTINCT product_name, product_id
FROM products
WHERE product_id < 30
INSERT IGNOREの使用
INSERT IGNOREステートメントは、重複レコードの検出時に挿入をキャンセルするようMariaDBに指示します。 以下に指定されたその使用例を確認します-
mysql> INSERT IGNORE INTO customer_tbl (LN, FN)
VALUES( 'Lex', 'Luther');
また、重複の背後にあるロジックに注意してください。 一部のテーブルでは、そのテーブルデータの性質に基づいて複製が必要です。 重複レコードを管理するための戦略にそのニーズに対応します。
MariaDB-SQLインジェクション保護
ユーザー入力を受け入れるという単純な行為は、悪用の扉を開きます。 この問題は主にデータの論理管理に起因しますが、幸いなことに、これらの主要な欠陥を回避することはかなり簡単です。
SQLインジェクションの機会は通常、ユーザーが名前などのデータを入力するときに発生し、コードロジックはこの入力の分析に失敗します。 コードではなく、攻撃者がデータベースで実行されるMariaDBステートメントを挿入できるようにします。
ユーザーが入力したデータを常に考慮し、疑わしく、処理の前に強力な検証が必要です。 パターン検証を通じてこの検証を実行します。 たとえば、予想される入力がユーザー名の場合、入力する文字を英数字とアンダースコアに制限し、特定の長さにします。 以下に示す例を確認します-
if(check_match("/^\w{8,20}$/", $_GET['user_name'], $matches)) {
$result = mysql_query("SELECT * FROM system_users WHERE user_name = $matches[0]");
} else {
echo "Invalid username";
}
また、入力制約の作成には、REGEXP演算子とLIKE句を使用します。
などの入力の必要な明示的な制御のすべてのタイプを考慮します-
- 使用するエスケープ文字を制御します。
- 入力用の特定の適切なデータ型を制御します。 入力を必要なデータ型とサイズに制限します。
- 入力データの構文を制御します。 必要なパターン以外は許可しないでください。
- 許可される条件を管理します。 ブラックリストSQLキーワード。
インジェクション攻撃の危険性を知らない場合や、取るに足らないものとみなす場合もありますが、セキュリティ上の懸念のリストの上位にあります。 さらに、これらの2つのエントリの効果を考慮してください-
1=1
-or-
*
これらのいずれかを正しいコマンドと一緒に入力できるコードは、データベース上のすべてのユーザーデータを明らかにしたり、データベース上のすべてのデータを削除したりする可能性があります。 場合によっては、攻撃者は穴の調査に時間を費やすことさえしません。単純な入力でブラインド攻撃を実行します。
また、MariaDBと組み合わせたプログラミング/スクリプト言語によって提供されるパターンマッチングおよび正規表現ツールを検討してください。これらのツールは、より多くの制御を提供し、時にはより良い制御を提供します。
MariaDB-バックアップ方法
データはビジネスと運用の基盤として機能し、さまざまな脅威(攻撃者、システム障害、不適切なアップグレード、メンテナンスエラーなど)が存在するため、バックアップは引き続き重要です。 これらのバックアップには多くの形式があり、それらのプロセス内でさらに幅広いオプションセットを使用して作成するための多くのオプションがあります。 覚えておくべき重要なことは、データベースの種類、重要な情報、および関係する構造です。 この情報により、最適なオプションが決まります。
オプション
バックアップの主なオプションには、論理バックアップと物理バックアップが含まれます。 論理バックアップは、データを復元するためのSQLステートメントを保持します。 物理バックアップにはデータのコピーが含まれます。
- *論理バックアップ*は、同じマシンとデータベースの種類に制限されることが多い物理バックアップとは対照的に、異なる構成の別のマシンでデータを復元する柔軟性を提供します。 論理バックアップはデータベースおよびテーブルレベルで行われ、物理バックアップはディレクトリおよびファイルレベルで行われます。
- *物理バックアップ*は、論理バックアップよりもサイズが小さく、実行および復元にかかる時間が短縮されます。 物理バックアップにはログおよび構成ファイルも含まれますが、論理バックアップには含まれません。
バックアップツール
MariaDBバックアップに使用される主なツールは mysqldump です。 論理的なバックアップと柔軟性を提供します。 また、小規模なデータベースに最適なオプションでもあります。 Mysqldump は、データをSQL、CSV、XML、および他の多くの形式にダンプします。 その出力は、明示的な指示なしにストアドプロシージャ、ビュー、およびイベントを保持しません。
*mysqldump* バックアップには3つのオプションがあります-
- Raw data -ファイルの宛先も指定する—tabオプションを使用して、テーブルを生データファイルとしてダンプします-
$ mysqldump -u root -p --no-create-info \
--tab=/tmp PRODUCTS products_tbl
- データ/定義のエクスポート-このオプションを使用すると、単一または複数のテーブルをファイルにエクスポートでき、ホストマシン上のすべての既存データベースのバックアップがサポートされます。 コンテンツまたは定義をファイルにエクスポートする例を調べる
$ mysqldump -u root -p PRODUCTS products_tbl > export_file.txt
- 転送-データベースとテーブルを別のホストに出力することもできます
$ mysqldump -u root -p database_name \
| mysql -h other-host.com database_name
SELECT … INTO OUTFILEステートメントの使用
データをエクスポートする別のオプションでは、SELECT … INTO OUTFILEステートメントを使用します。 この単純なオプションは、テーブルを単純な書式付きテキストファイルに出力します-
mysql> SELECT * FROM products_tbl
-> INTO OUTFILE '/tmp/products.txt';
その属性により、ファイルを好みの仕様にフォーマットできます。
この声明の次の品質に注意してください-
- ファイル名は、出力の目的の場所を指定する必要があります。
- ステートメントを実行するには、MariaDBファイル権限が必要です。
- 出力ファイル名は一意である必要があります。
- ホストでログイン資格情報が必要です。
- UNIX環境では、出力ファイルは誰でも読み取り可能ですが、そのサーバー所有権は削除する機能に影響します。 特権があることを確認してください。
バックアップでのCONNECTの使用
CONNECTハンドラーは、データのエクスポートを許可します。 これは、主にSELECT … INTO OUTFILE操作でファイル形式がサポートされていない状況で役立ちます。
次の例を確認します-
create table products
engine = CONNECT table_type = XML file_name = 'products' header = yes
option_list = 'name = TABLE,coltype = HTML,attribute = border = 1;cellpadding = 5'
select plugin_name handler, plugin_version version, plugin_author
author, plugin_description description, plugin_maturity maturity
from information_schema.plugins where plugin_type = 'STORAGE ENGINE';
その他の道具
バックアップの他のオプションは次のとおりです-
- XtraBackup -このオプションはXtraDB/InnoDBデータベースを対象とし、任意のストレージエンジンで動作します。 このツールの詳細については、Perconaの公式サイトをご覧ください。
- スナップショット-いくつかのファイルシステムはスナップショットを許可します。 このプロセスは、読み取りロックでテーブルをフラッシュし、スナップショットをマウントし、テーブルのロックを解除し、スナップショットをコピーしてから、スナップショットをアンマウントすることで構成されます。
- LVM -この一般的な方法では、Perlスクリプトを使用します。 すべてのテーブルで読み取りロックを取得し、キャッシュをディスクにフラッシュします。 次に、スナップショットを取得し、テーブルのロックを解除します。 詳細については、公式の mylvmbackup Webサイトを参照してください。
- TokuBackup -Perconaが提供するこのソリューションは、InnoDBバックアップオプションの問題と制限を考慮したホットバックアップを提供します。 アプリケーションがファイルを操作し続ける間、ファイルのトランザクションサウンドコピーを生成します。詳細については、Percona Webサイトを参照してください。
INNODBに関する考慮事項
InnoDBはパフォーマンス向上のためにバッファープールを使用します。 通常、論理バックアップはテーブル全体のスキャンを実行するため、バックアップでは、InnoDBを構成してテーブル全体をバッファープールにコピーしないようにします。
MariaDB-バックアップの読み込み方法
この章では、さまざまなバックアップの読み込み方法について学習します。 バックアップからデータベースを復元するのは簡単で、時には非常に長いプロセスです。
データのロードには、LOAD DATAステートメント、mysqlimport、および単純なmysqldumpリストアの3つのオプションがあります。
LOAD DATAの使用
LOAD DATAステートメントは、バルクローダーとして機能します。 テキストファイルをロードするその使用例を確認します-
mysql> LOAD DATA LOCAL INFILE 'products_copy.txt' INTO TABLE empty_tbl;
LOAD DATA文の次の品質に注意してください-
- LOCALキーワードを使用して、MariaDBがホストの詳細検索を実行しないようにし、非常に具体的なパスを使用します。
- このステートメントは、改行(改行)で終了する行と、タブで区切られたデータ値で構成される形式を想定しています。
- FIELDS句を使用して、行のフィールドのフォーマットを明示的に指定します。 LINES句を使用して、行末を指定します。 以下の例を確認してください。
mysql> LOAD DATA LOCAL INFILE 'products_copy.txt' INTO TABLE empty_tbl
FIELDS TERMINATED BY '|'
LINES TERMINATED BY '\n';
- このステートメントは、データファイル内の列がテーブルの同じ順序を使用することを前提としています。 別の順序を設定する必要がある場合は、次のようにファイルをロードできます-
mysql> LOAD DATA LOCAL INFILE 'products_copy.txt' INTO TABLE empty_tbl (c, b, a);
MYSQLIMPORTの使用
mysqlimportツールはLOAD DATAラッパーとして機能し、コマンドラインから同じ操作を実行できます。
次のようにデータをロードします-
$ mysqlimport -u root -p --local database_name source_file.txt
次のようにフォーマットを指定します-
$ mysqlimport -u root -p --local --fields-terminated-by="|" \
--lines-terminated-by="\n" database_name source_file.txt
- columns オプションを使用して列の順序を指定します-
$ mysqlimport -u root -p --local --columns=c,b,a \
database_name source_file.txt
MYSQLDUMPの使用
*mysqldump* で復元するには、ダンプファイルをホストにロードするためのこの簡単なステートメントが必要です-
shell> mysql database_name < source_file.sql
特別な文字と引用
LOAD DATAステートメントでは、引用符と特殊文字が正しく解釈されない場合があります。 このステートメントは、引用符で囲まれていない値を想定し、バックスラッシュをエスケープ文字として扱います。 FIELDS句を使用してフォーマットを指定します。 「ENCLOSED BY」で引用符を指すと、データ値から引用符が削除されます。 「エスケープ」でエスケープを変更します。
MariaDB-便利な機能
この章には、最も頻繁に使用される機能、定義、説明、および例が記載されています。
MariaDB集約関数
最も頻繁に使用される集約関数は以下のとおりです-
| Sr.No | Name & Description |
|---|---|
| 1 |
COUNT レコードの数をカウントします。 例-SELECT COUNT(*)FROM customer_table; |
| 2 |
MIN 一連のレコードの最小値を明らかにします。 例-SELECT組織、MIN(アカウント)FROM契約GROUP BY組織; |
| 3 |
MAX 一連のレコードの最大値を明らかにします。 例-SELECT組織、MAX(account_size)FROMコントラクトGROUP BY組織。 |
| 4 |
AVG 一連のレコードの平均値を計算します。 例-SELECT AVG(account_size)FROM contracts; |
| 5 |
SUM レコードのセットの合計を計算します。 例-SELECT SUM(account_size)FROM contracts; |
MariaDB年齢計算
*TIMESTAMPDIFF* 関数は、年齢を計算する方法を提供します-
SELECT CURDATE() AS today;
SELECT ID, DOB, TIMESTAMPDIFF(YEAR,DOB,'2015-07-01') AS age FROM officer_info;
MariaDB文字列連結
*CONCAT* 関数は、連結操作後に結果の文字列を返します。 1つ以上の引数を使用できます。 以下の構文を確認します-
SELECT CONCAT(item, item,...);
次の例を確認します-
SELECT CONCAT('Ram', 'bu', 'tan');
Output:Rambutan
MariaDBの日付/時刻関数
以下は重要な日付関数です-
| Sr.No | Name & Description |
|---|---|
| 1 |
CURDATE() yyyy-mm-ddまたはyyyymmdd形式で日付を返します。 例-SELECT CURDATE(); |
| 2 |
DATE() 複数の形式で日付を返します。
|
| 3 |
HH:MM:SSまたはHHMMSS.uuuuuu形式で時刻を返します。 例-SELECT CURTIME(); |
| 4 |
DATE_SUB() 指定した日付から日数を加算または減算します。 例-SELECT DATE_SUB( '2016-02-08'、INTERVAL 60 DAY); |
| 5 |
DATEDIFF() 2つの日付の間の日を決定します。 例-SELECT DATEDIFF( '2016-01-01 23:59:59'、 '2016-01-03'); |
| 6 |
DATE ADD() 日付と時刻に時間単位を加算または減算します。 例-SELECT DATE_ADD( '2016-01-04 23:59:59'、INTERVAL 22 SECOND); |
| 7 |
EXTRACT() 日付から単位を抽出します。 例-SELECT EXTRACT(YEAR FROM '2016-01-08'); |
| 8 |
NOW() 現在の日付と時刻をyyyy-mm-dd hh:mm:ssまたはyyyymmddhhmmss.uuuuuu形式で返します。 例-SELECT NOW(); |
| 9 |
DATE FORMAT() 指定されたフォーマット文字列に従って日付をフォーマットします。 例-SELECT DATE_FORMAT( '2016-01-09 20:20:00'、 '%W%M%Y'); |
以下はいくつかの重要な時間関数です-
| Sr.No | Name & Description |
|---|---|
| 1 |
HOUR() 時間、または経過時間を返します。 例-SELECT HOUR('19:17:09 '); |
| 2 |
LOCALTIME() NOW()とまったく同じように機能します。 |
| 3 |
MICROSECOND() 時間のマイクロ秒を返します。 例-SELECT MICROSECOND('16:30:00.543876 '); |
| 4 |
MINUTE() 時間の分を返します。 例-SELECT MINUTE( '2016-05-22 17:22:01'); |
| 5 |
SECOND() 日付の秒を返します。 例-SELECT SECOND( '2016-03-12 16:30:04.000001'); |
| 6 |
TIME_FORMAT() 指定されたフォーマット文字列に従って時刻をフォーマットします。 例-SELECT TIME_FORMAT('22:02:20 '、'%H%k%h%I%l '); |
| 7 |
TIMESTAMP() アクティビティのタイムスタンプをyyyy-mm-dd hh:mm:ddの形式で提供します。 例-CREATE TABLE orders_(ID INT、tmst TIMESTAMP); |
MariaDB数値関数
以下にMariaDBの重要な数値関数を示します-
| Sr.No | Name & Description |
|---|---|
| 1 |
TRUNCATE() 切り捨てられた数値を小数点以下の桁まで指定します。 例-SELECT TRUNCATE(101.222、1); |
| 2 |
COS() xラジアンのコサインを返します。 例-SELECT COS(PI()); |
| 3 |
CEILING() x未満ではない最小の整数を返します。 例-SELECT CEILING(2.11); |
| 4 |
DEGREES() ラジアンを度に変換します。 例-SELECT DEGREES(PI()); |
| 5 |
DIV() 整数除算を実行します。 例-SELECT 100 DIV 4; |
| 6 |
EXP() eのx乗を返します。 例-SELECT EXP(2); |
| 7 |
FLOOR() xを超えない最大の整数を返します。 例-SELECT FLOOR(2.01); |
| 8 |
LN() xの自然対数を返します。 例-SELECT LN(3); |
| 9 |
LOG() 自然対数または特定の底の対数を返します。 例-SELECT LOG(3); |
| 10 |
SQRT() 平方根を返します。 例-SELECT SQRT(16); |
MariaDB文字列関数
重要な文字列関数は以下のとおりです-
| Sr.No | Name & Description |
|---|---|
| 1 |
INSTR() 部分文字列の最初のインスタンスの位置を返します。 例-SELECT INSTR( 'rambutan'、 'tan'); |
| 2 |
RIGHT() 右端の文字列文字を返します。 例-SELECT RIGHT( 'rambutan'、3); |
| 3 |
LENGTH() 文字列のバイト長を返します。 例-SELECT LENGTH( 'rambutan'); |
| 4 |
LOCATE() 部分文字列の最初のインスタンスの位置を返します。 例-SELECT LOCATE( 'tan'、 'rambutan'); |
| 5 |
INSERT() 変更された特定の位置に指定された部分文字列を持つ文字列を返します。 例-SELECT INSERT( 'ramputan'、4、1、 'b'); |
| 6 |
LEFT() 左端の文字を返します。 例-SELECT LEFT( 'rambutan'、3); |
| 7 |
UPPER() 文字を大文字に変更します。 例-SELECT UPPER(lastname); |
| 8 |
LOWER() 文字を小文字に変更します。 例-SELECT LOWER(lastname); |
| 9 |
STRCMP() 文字列を比較し、等しい場合は0を返します。 例-SELECT STRCMP( 'egg'、 'cheese'); |
| 10 |
REPLACE() 文字を置換した後、文字列を返します。 例-SELECT REPLACE( 'sully'、 'l'、 'n'); |
| 11 |
REVERSE() 文字列内の文字を反転します。 例-SELECT REVERSE( 'racecar'); |
| 12 |
REPEAT() 指定された文字をx回繰り返す文字列を返します。 例-SELECT REPEAT( 'ha'、10); |
| 13 |
SUBSTRING() 位置xから始まる文字列から部分文字列を返します。 例-SELECT SUBSTRING( 'rambutan'、3); |
| 14 |
TRIM() 文字列から末尾/先頭の文字を削除します。 例-SELECT TRIM(LEADING '_' FROM '_rambutan'); |