MariaDB-クイックガイド
データベースアプリケーションはメインアプリケーションとは別に存在し、データコレクションを格納します。すべてのデータベースは、データベースに含まれるデータの作成、アクセス、管理、検索、およびレプリケーションに1つまたは複数のAPIを採用しています。
データベースは、オブジェクトやファイルなどの非リレーショナルデータソースも使用します。ただし、データベースは、他のデータソースでの取得と書き込みが遅いという大きなデータセットに最適なオプションです。
リレーショナルデータベース管理システム(RDBMS)は、さまざまなテーブルにデータを格納します。これらのテーブル間の関係は、主キーと外部キーを使用して確立されます。
RDBMSは次の機能を提供します-
これらを使用すると、テーブル、列、およびインデックスを使用してデータソースを実装できます。
これらは、複数のテーブルの行にわたる参照の整合性を保証します。
それらは自動的にインデックスを更新します。
これらは、テーブルからデータを操作または取得する際のSQLクエリと操作を解釈します。
RDBMSの用語
MariaDBの説明を始める前に、データベースに関連するいくつかの用語を確認しましょう。
Database −データベースは、関連データを保持するテーブルで構成されるデータソースです。
Table −スプレッドシートを意味するテーブルは、データを含むマトリックスです。
Column−データ要素を意味する列は、1つのタイプのデータを保持する構造です。たとえば、出荷日。
Row−行は、関連データをグループ化する構造です。たとえば、顧客のデータ。タプル、エントリ、またはレコードとも呼ばれます。
Redundancy −この用語は、システムを高速化するためにデータを2回保存することを指します。
Primary Key−これは、一意の識別値を指します。この値はテーブル内に2回表示することはできず、関連付けられている行は1つだけです。
Foreign Key −外部キーは、2つのテーブル間のリンクとして機能します。
Compound Key−複合キー、または複合キーは、複数の列を参照するキーです。独自の品質がない列のため、複数の列を指します。
Index −索引は、本の索引と実質的に同じです。
Referential Integrity −この用語は、すべての外部キー値が既存の行を指すようにすることを意味します。
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 Foundationの公式Webサイトのダウンロードセクションにあります。ご希望のバージョンへのリンクをクリックすると、複数のオペレーティングシステム、アーキテクチャ、およびインストールファイルタイプのダウンロードのリストが表示されます。
LINUX / UNIXへのインストール
Linux / Unixシステムに関する深い知識がある場合は、ソースをダウンロードしてインストールをビルドしてください。推奨されるインストール方法は、配布パッケージを利用することです。MariaDBは、次のLinux / Unixディストリビューション用のパッケージを提供しています-
- RedHat/CentOS/Fedora
- Debian/Ubuntu
次のディストリビューションには、リポジトリにMariaDBパッケージが含まれています-
- openSUSE
- Arch Linux
- Mageia
- Mint
- Slackware
次の手順に従って、Ubuntu環境にインストールします-
Step 1 −rootユーザーとしてログインします。
Step 2 −MariaDBパッケージを含むディレクトリに移動します。
Step 3 −次のコードでGnuPG署名キーをインポートします−
sudo apt-key adv --recv-keys --keyserver keyserver.ubuntu.com 0xcbcb082a1bb943db
Step 4 −MariaDBをに追加します sources.listファイル。ファイルを開き、次のコードを追加します-
sudo add-apt-repository 'deb http://ftp.osuosl.org/pub/mariadb/repo/5.5/ubuntuprecise main'
Step 5 −次のようにシステムを更新します−
sudo apt-get update
Step 6 −以下を使用してMariaDBをインストールします−
sudo apt-get install mariadb-server
Windowsへのインストール
自動インストールファイル(MSI)を見つけてダウンロードしたら、ファイルをダブルクリックしてインストールを開始します。インストールウィザードは、インストールのすべてのステップと必要な設定を案内します。
コマンドプロンプトからインストールを開始して、インストールをテストします。インストールの場所(通常はディレクトリ内)に移動し、プロンプトで次のように入力します-
mysqld.exe --console
インストールが成功すると、起動に関連するメッセージが表示されます。これが表示されない場合は、権限に問題がある可能性があります。ユーザーアカウントがアプリケーションにアクセスできることを確認してください。グラフィカルクライアントは、Windows環境でのMariaDB管理に使用できます。コマンドラインが不快または面倒な場合は、必ず試してみてください。
インストールのテスト
いくつかの簡単なタスクを実行して、MariaDBの機能とインストールを確認します。
Use the Admin Utility to Get Server Status
mysqladminバイナリを使用してサーバーのバージョンを表示します。
[root@host]# mysqladmin --version
バージョン、ディストリビューション、オペレーティングシステム、およびアーキテクチャが表示されます。そのタイプの出力が表示されない場合は、インストールで問題がないか調べてください。
Execute Simple Commands with a Client
MariaDBのコマンドプロンプトを表示します。これにより、MariaDBに接続し、コマンドの実行が可能になります。次のように簡単なコマンドを入力します-
mysql> SHOW DATABASES;
インストール後
MariaDBが正常にインストールされたら、rootパスワードを設定します。新規インストールでは、パスワードが空白になります。次のように入力して、新しいパスワードを設定します-
mysqladmin -u root password "[enter your password here]";
次のように入力して、新しい資格情報でサーバーに接続します-
mysql -u root -p
Enter password:*******
Windowsでのアップグレード
WindowsシステムにMySQLがすでにインストールされていて、MariaDBにアップグレードしたい場合。MySQLをアンインストールしてMariaDBをインストールしないでください。これにより、既存のデータベースとの競合が発生します。代わりに、MariaDBをインストールしてから、Windowsインストールファイルでアップグレードウィザードを使用する必要があります。
MySQLmy.cnfファイルのオプションはMariaDBで機能するはずです。ただし、MariaDBには、MySQLにはない多くの機能があります。
my.cnfファイルで次の競合を考慮してください-
MariaDBは、一時ファイルにデフォルトでAriaストレージエンジンを使用します。一時ファイルがたくさんある場合、MyISAMテーブルを使用しない場合は、キーバッファサイズを変更します。
アプリケーションが頻繁に接続/切断する場合は、スレッドキャッシュサイズを変更してください。
100を超える接続を使用する場合は、スレッドプールを使用してください。
互換性
MySQLとMariaDBは基本的に同じです。ただし、アップグレードで問題が発生するのに十分な違いがあります。MariaDBナレッジベースでこれらの重要な違いの詳細を確認してください。
MariaDBを実行する前に、まず現在の状態、実行中、またはシャットダウンを確認してください。MariaDBを開始および停止するための3つのオプションがあります-
- mysqld(MariaDBバイナリ)を実行します。
- mysqld_safe起動スクリプトを実行します。
- mysql.server起動スクリプトを実行します。
MariaDBを非標準の場所にインストールした場合は、スクリプトファイルの場所情報を編集する必要がある場合があります。スクリプトに「stop」パラメーターを追加するだけで、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
「$PWD” variable if you added datadir to the configuration file. Ensure “$「LOGNAME」は、MariaDBのバージョン10.0.1を実行するときに使用されます。
管理コマンド
MariaDBを使用するときに定期的に使用する重要なコマンドの次のリストを確認してください-
USE [database name] −現在のデフォルトデータベースを設定します。
SHOW DATABASES −現在サーバー上にあるデータベースを一覧表示します。
SHOW TABLES −すべての非一時テーブルを一覧表示します。
SHOW COLUMNS FROM [table name] −指定されたテーブルに関連する列情報を提供します。
SHOW INDEX FROM TABLENAME [table name] −指定されたテーブルに関連するテーブルインデックス情報を提供します。
SHOW TABLE STATUS LIKE [table name]\G – −テーブルに非一時テーブルに関する情報を提供し、LIKE句の後に表示されるパターンを使用してテーブル名をフェッチします。
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との接続を確立する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>
この例ではrootアクセスを使用していますが、特権を持つすべてのユーザーはもちろんMariaDBプロンプトにアクセスして操作を実行できます。
を介してMariaDBから切断します exit 次のようにコマンド-
mysql> exit
PHP接続スクリプト
MariaDBに接続および切断する別の方法は、PHPスクリプトを使用することです。PHPはmysql_connect()データベース接続を開くための関数。5つのオプションのパラメーターを使用し、接続が成功した場合はMariaDBリンク識別子を返し、接続が失敗した場合はfalseを返します。また、mysql_close() 単一のパラメーターを使用するデータベース接続を閉じるための関数。
構文
次のPHP接続スクリプトの構文を確認します-
connection mysql_connect(server,user,passwd,new_link,client_flag);
パラメータの説明を以下に示します-
シニア番号 | パラメータと説明 |
---|---|
1 | server このオプションのパラメーターは、データベースサーバーを実行しているホスト名を指定します。デフォルト値は「localhost:.3036」です。 |
2 | user このオプションのパラメーターは、データベースにアクセスするユーザー名を指定します。デフォルト値はサーバーの所有者です。 |
3 | passwd このオプションのパラメーターは、ユーザーのパスワードを指定します。デフォルト値は空白です。 |
4 | new_link このオプションのパラメータは、2回目の呼び出しで mysql_connect() 新しい接続ではなく、同一の引数を使用すると、現在の接続の識別子が返されます。 |
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でデータベースを作成または削除するには、通常、rootユーザーまたは管理者にのみ付与される特権が必要です。これらのアカウントでは、データベースを作成するための2つのオプションがあります。mysqladminバイナリとPHPスクリプトです。
mysqladminバイナリ
次の例は、次の名前のデータベースを作成する際のmysqladminバイナリの使用法を示しています。 Products −
[root@host]# mysqladmin -u root -p create PRODUCTS
Enter password:******
PHPデータベーススクリプトの作成
PHPは mysql_queryMariaDBデータベースを作成する機能。この関数は2つのパラメーターを使用します。1つはオプションで、成功した場合は「true」の値を返し、失敗した場合は「false」の値を返します。
構文
以下を確認してください create database script 構文-
bool mysql_query( sql, connection );
パラメータの説明を以下に示します-
S.No | パラメータと説明 |
---|---|
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でデータベースを作成または削除するには、通常、rootユーザーまたは管理者にのみ付与される特権が必要です。これらのアカウントでは、データベースを削除するための2つのオプションがあります。mysqladminバイナリとPHPスクリプトです。
削除されたデータベースは回復不能であるため、この操作の実行には注意が必要です。さらに、削除に使用されるPHPスクリプトは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は mysql_queryMariaDBデータベースを削除する機能。この関数は2つのパラメーターを使用します。1つはオプションで、成功した場合は「true」の値を返し、失敗した場合は「false」の値を返します。
構文
次のドロップデータベーススクリプトの構文を確認します-
bool mysql_query( sql, connection );
パラメータの説明を以下に示します-
シニア番号 | パラメータと説明 |
---|---|
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に接続した後、多くのデータベースが存在する可能性があるため、使用するデータベースを選択する必要があります。このタスクを実行するには、コマンドプロンプトから、またはPHPスクリプトを使用する2つの方法があります。
コマンドプロンプト
コマンドプロンプトでデータベースを選択するには、SQLコマンドを使用するだけです。 ‘use’ −
[root@host]# mysql -u root -p
Enter password:******
mysql> use PRODUCTS;
Database changed
mysql> SELECT database();
+-------------------------+
| Database |
+-------------------------+
| PRODUCTS |
+-------------------------+
データベースを選択すると、以降のすべてのコマンドは選択したデータベースで動作します。
Note−すべての名前(データベース、テーブル、フィールドなど)では大文字と小文字が区別されます。コマンドが適切なケースに準拠していることを確認してください。
PHPSelectデータベーススクリプト
PHPは mysql_select_dbデータベース選択のための関数。この関数は2つのパラメーターを使用します。1つはオプションで、選択が成功すると「true」の値を返し、失敗するとfalseの値を返します。
構文
次のselectデータベーススクリプトの構文を確認してください。
bool mysql_select_db( db_name, connection );
パラメータの説明を以下に示します-
S.No | パラメータと説明 |
---|---|
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
データベースを最適化するには、適切なフィールド定義が不可欠です。理想的なアプローチでは、必要なタイプとサイズのフィールドのみを使用する必要があります。たとえば、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(also 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です。ビット値は「b '[value]'」で適用できます。値は0と1のビット値を表します。ゼロパディングは、全長にわたって左から自動的に行われます。たとえば、「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-3123:59:59.999999」の範囲を表します。「YYYY-MM-DDHH:MM:SS」形式を使用します。
TIMESTAMP−このデータ型は、「YYYY-MM-DD HH:MM:DD」形式のタイムスタンプを表します。これは主に、挿入や更新などのデータベースの変更時刻の詳細に使用されます。
YEAR−このデータ型は、4桁の形式で年を表します。4桁の形式では、1901〜2155、および0000の範囲の値を使用できます。
文字列データ型
MariaDBでサポートされている文字列型の値は次のとおりです-
String literals −このデータ型は、引用符で囲まれた文字シーケンスを表します。
CHAR−このデータ型は、指定された長さのスペースを含む、右に埋め込まれた固定長の文字列を表します。Mは、0から255の範囲の文字の列長を表します。デフォルト値は1です。
VARCHAR −このデータ型は、M範囲(最大列長)が0〜65535の可変長文字列を表します。
BINARY −このデータ型はバイナリバイト文字列を表し、Mはバイト単位の列長です。
VARBINARY −このデータ型は、列長がMの可変長のバイナリバイト文字列を表します。
TINYBLOB−このデータ型は、最大長が255(28-1)バイトのblob列を表します。ストレージでは、それぞれが値のバイト数を示す1バイトの長さのプレフィックスを使用します。
BLOB−このデータ型は、最大長が65,535(216-1)バイトのblob列を表します。ストレージでは、それぞれが値のバイト数を示す2バイトの長さのプレフィックスを使用します。
MEDIUMBLOB-このデータ型は16,777,215(2の最大の長さBLOB列表す24バイト- 1)。ストレージでは、それぞれが値のバイト数を示す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 −このデータ型は、リストからの値が1つしかない文字列オブジェクトを表します。
SET−このデータ型は、リストからの値が0個以上で、最大64個のメンバーを持つ文字列オブジェクトを表します。SET値は、整数値として内部的に存在します。
この章では、テーブルの作成方法を学習します。テーブルを作成する前に、まずその名前、フィールド名、およびフィールド定義を決定します。
以下は、テーブル作成の一般的な構文です。
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に指示します。キーワード主キーは、列を次のように定義します。primary key。コンマで区切られた複数の列で主キーを定義できます。
テーブルを作成するための2つの主な方法は、コマンドプロンプトとPHPスクリプトを使用することです。
コマンドプロンプト
以下に示すように、CREATETABLEコマンドを使用してタスクを実行します。
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
この章では、テーブルの削除について学習します。
テーブルの削除は非常に簡単ですが、削除されたすべてのテーブルは回復不能であることを忘れないでください。テーブル削除の一般的な構文は次のとおりです。
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
この章では、テーブルにデータを挿入する方法を学習します。
テーブルにデータを挿入するには、INSERTコマンドが必要です。コマンドの一般的な構文は、INSERTの後にテーブル名、フィールド、および値が続きます。
以下に示す一般的な構文を確認してください-
INSERT INTO tablename (field,field2,...) VALUES (value, value2,...);
このステートメントでは、文字列値に一重引用符または二重引用符を使用する必要があります。ステートメントのその他のオプションには、「INSERT ... SET」ステートメント、「INSERT ... SELECT」ステートメント、およびその他のいくつかのオプションが含まれます。
Note −ステートメント内に表示されるVALUES()関数は、INSERTステートメントにのみ適用され、他の場所で使用された場合はNULLを返します。
操作を実行するには、コマンドラインを使用するかPHPスクリプトを使用するかの2つのオプションがあります。
コマンドプロンプト
プロンプトで、選択操作を実行する方法はたくさんあります。標準的なステートメントを以下に示します-
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関数内で同じ「INSERTINTO ...」ステートメントを使用して、操作を実行します。を使用します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には、この目的のためにいくつかのオプションが含まれており、そのうちのいくつかは自動です。
この章では、テーブルからデータを選択する方法を学習します。
SELECTステートメントは、選択された行を取得します。それらには、UNIONステートメント、ordering句、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
すべてのselectステートメントには1つ以上が含まれている必要があります select expressions。選択式は、次のいずれかのオプションで構成されます-
列名。
演算子と関数を使用する式。
指定されたテーブル内のすべての列を選択するための仕様「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選択スクリプト
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);
?>
WHERE句は、SELECT、UPDATE、DELETE、INSERTなどのさまざまなステートメントをフィルタリングします。それらは、アクションを指定するために使用される基準を提示します。これらは通常、ステートメント内のテーブル名の後に表示され、その条件は次のとおりです。WHERE句は、基本的にifステートメントのように機能します。
以下に示すWHERE句の一般的な構文を確認してください-
[COMMAND] field,field2,... FROM table_name,table_name2,... WHERE [CONDITION]
WHERE句の次の品質に注意してください-
オプションです。
任意の条件を指定できます。
ANDまたはOR演算子を使用して、複数の条件を指定できます。
大文字と小文字の区別は、LIKE比較を使用するステートメントにのみ適用されます。
WHERE句では、次の演算子の使用が許可されています-
オペレーター |
---|
=!= |
> < |
> = <= |
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スクリプト
を採用する mysql_query() WHERE句を使用した操作での関数-
<?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
ザ・ UPDATEコマンドは、値を変更することによって既存のフィールドを変更します。SET句を使用して、変更する列を指定し、割り当てられる新しい値を指定します。これらの値は、式またはフィールドのデフォルト値のいずれかです。デフォルト値を設定するには、DEFAULTキーワードを使用する必要があります。このコマンドでは、WHERE句を使用して更新の条件を指定したり、ORDERBY句を使用して特定の順序で更新したりすることもできます。
次の一般的な構文を確認します-
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更新クエリスクリプト
を採用する mysql_query() UPDATEコマンドステートメントの関数-
<?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
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削除クエリスクリプト
使用 mysql_query() DELETEコマンドステートメントの関数-
<?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'
WHERE句は、操作で完全一致が使用されたときにデータを取得する方法を提供します。共通の特性を持つ複数の結果が必要な状況では、LIKE 句は、幅広いパターンマッチングに対応します。
LIKE句はパターンの一致をテストし、trueまたはfalseを返します。比較に使用されるパターンは、次のワイルドカード文字を受け入れます。「%」。文字数(0以上)に一致します。および「_」は、1文字に一致します。「_」ワイルドカード文字は、そのセット内の文字にのみ一致します。つまり、別のセットを使用する場合、ラテン文字は無視されます。一致はデフォルトで大文字と小文字を区別せず、大文字と小文字を区別するための追加設定が必要です。
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スクリプト
使用 mysql_query() LIKE句を使用するステートメントの関数
<?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
ザ・ ORDER BY前の説明で述べたように、句はステートメントの結果をソートします。操作されるデータの順序を指定し、昇順(ASC)または降順(DESC)でソートするオプションが含まれています。注文指定を省略すると、デフォルトの注文は昇順になります。
ORDER BY句は、DELETEやUPDATEなどのさまざまなステートメントに表示されます。これらは、最終結果のテーブルを操作するため、サブクエリ内や集合関数の前ではなく、常にステートメントの最後に表示されます。また、整数を使用して列を識別することはできません。
以下に示すORDERBY句の一般的な構文を確認してください-
SELECT field, field2,... [or column] FROM table_name, table_name2,...
ORDER BY field, field2,... ASC[or DESC]
コマンドプロンプトまたはPHPスクリプト内でORDERBY句を使用します。
コマンドプロンプト
コマンドプロンプトで、標準コマンドを使用するだけです-
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 |
+-------------+----------------+----------------------+
OrderBy句を使用したPHPスクリプト
を活用する mysql_query() もう一度、ORDERBY句を使用するステートメントの関数-
<?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
以前の説明と例では、単一のテーブルからの取得、または複数のソースからの複数の値の取得について検討しました。ほとんどの実際のデータ操作ははるかに複雑であり、集計、比較、および複数のテーブルからの取得が必要です。
JOINs2つ以上のテーブルを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
NULL値を操作するときは、それらが不明な値であることを忘れないでください。それらは、有効な値である空の文字列またはゼロではありません。テーブルの作成では、列の仕様により、null値を受け入れるか拒否するかを設定できます。NULLまたはNOTNULL句を使用するだけです。これは、ID番号などのレコード情報が欠落している場合に適用されます。
ユーザー定義変数は、明示的に割り当てられるまで値がNULLになります。保存されたルーチンパラメータとローカル変数により、NULLの値を設定できます。ローカル変数にデフォルト値がない場合、その値はNULLになります。
NULLは大文字と小文字を区別せず、次のエイリアスがあります-
- UNKNOWN(ブール値)
- \N
NULL演算子
NULL値を使用したすべての比較は、trueまたはfalseではなくNULLを返すため、標準の比較演算子をNULL(=、>、> =、<=、<、または!=など)で使用することはできません。NULLとの比較、またはNULLを含む可能性のある比較では、「<=>」(NULL-SAFE)演算子を使用する必要があります。
他の利用可能な演算子は-
ISNULL-NULL値をテストします。
IS NOTNULL-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モードでは、NOTNULL列は代わりにデータ型に基づいてデフォルト値を挿入します。
フィールドがTIMESTAMP、AUTO_INCREMENT、または仮想列の場合、MariaDBはNULL値を異なる方法で管理します。AUTO_INCREMENT列に挿入すると、シーケンス内の次の番号がその場所に挿入されます。TIMESTAMPフィールドでは、MariaDBが代わりに現在のタイムスタンプを割り当てます。このチュートリアルの後半で説明するトピックである仮想列では、デフォルト値が割り当てられます。
UNIQUEインデックスは多くのNULL値を保持できますが、主キーをNULLにすることはできません。
NULL値とAlterコマンド
ALTERコマンドを使用して列を変更すると、NULLが指定されていない場合、MariaDBは自動的に値を割り当てます。
MariaDBは、LIKE句から利用できるパターンマッチングに加えて、REGEXP演算子を介した正規表現ベースのマッチングを提供します。演算子は、指定されたパターンに基づいて文字列式のパターンマッチングを実行します。
MariaDB 10.0.5では、PCRE正規表現が導入されました。これにより、再帰パターン、先読みアサーションなどの領域へのマッチングの範囲が劇的に拡大します。
以下に示す標準のREGEXP演算子構文の使用を確認してください-
SELECT column FROM table_name WHERE column REGEXP '[PATTERN]';
REGEXPは、パターン一致の場合は1を返し、パターン一致がない場合は0を返します。
反対のオプションは、NOTREGEXPの形式で存在します。MariaDBは、互換性の理由で作成されたREGEXPとNOT REGEXP、RLIKEとNOTRLIKEの同義語も提供します。
比較されるパターンは、リテラル文字列またはテーブル列などの他のものにすることができます。文字列では、Cエスケープ構文を使用するため、「\」文字を2倍にします。REGEXPも、バイナリ文字列を除いて、大文字と小文字を区別しません。
使用できる可能なパターンの表を以下に示します。
シニア番号 | パターンと説明 |
---|---|
1 | ^ 文字列の先頭と一致します。 |
2 | $ 文字列の終わりに一致します。 |
3 | . 1文字に一致します。 |
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]';
トランザクションは、順次グループ操作です。これらは単一のユニットとして機能し、グループ内のすべての操作が正常に実行されるまで終了しません。グループ内の単一障害により、トランザクション全体が失敗し、データベースに影響を与えません。
トランザクションはACID(原子性、一貫性、分離、および耐久性)に準拠しています-
Atomicity −失敗時に中止し、変更をロールバックすることにより、すべての操作の成功を保証します。
Consistency −データベースがトランザクションの成功に変更を適用することを保証します。
Isolation −トランザクションの独立したトランザクション操作を可能にします。
Durability −システム障害が発生した場合でも、成功したトランザクションの永続性を保証します。
トランザクションステートメントの先頭には、START TRANSACTIONステートメントがあり、その後にCOMMITステートメントとROLLBACKステートメントが続きます-
STARTTRANSACTIONはトランザクションを開始します。
COMMITは、データへの変更を保存します。
ROLLBACKはトランザクションを終了し、変更を破棄します。
トランザクションが成功すると、COMMITが機能します。失敗すると、ROLLBACKが機能します。
Note−一部のステートメントは暗黙的なコミットを引き起こし、トランザクション内で使用するとエラーも引き起こします。このようなステートメントの例には、CREATE、ALTER、およびDROPが含まれますが、これらに限定されません。
MariaDBトランザクションには、SAVEPOINTやLOCKTABLESなどのオプションも含まれています。SAVEPOINTは、ROLLBACKで使用する復元ポイントを設定します。LOCK TABLESを使用すると、セッション中のテーブルへのアクセスを制御して、特定の期間中の変更を防ぐことができます。
AUTOCOMMIT変数は、トランザクションの制御を提供します。1に設定すると、すべての操作が成功したトランザクションと見なされ、0に設定すると、変更の永続性が明示的なCOMMITステートメントでのみ発生します。
トランザクションの構造
トランザクションステートメントの一般的な構造は、STARTTRANSACTIONで始まります。次のステップは、1つ以上のコマンド/操作の挿入、エラーをチェックするステートメントの挿入、検出されたエラーを管理するためのROLLBACKステートメントの挿入、最後に成功した操作に変更を適用するためのCOMMITステートメントの挿入です。
以下の例を確認してください-
START TRANSACTION;
SELECT name FROM products WHERE manufacturer = 'XYZ Corp';
UPDATE spring_products SET item = name;
COMMIT;
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;
インデックスは、レコードの取得を高速化するためのツールです。インデックスは、インデックス付きの列内の各値のエントリを生成します。
インデックスには4つのタイプがあります-
Primary (1つのレコードはすべてのレコードを表します)
Unique (1つのレコードは複数のレコードを表します)
Plain
Full-Text (テキスト検索で多くのオプションを許可します)。
この使用法では、「キー」と「インデックス」という用語は同じです。
インデックスは1つ以上の列に関連付けられ、迅速な検索と効率的なレコード編成をサポートします。インデックスを作成するときは、クエリで頻繁に使用される列を考慮してください。次に、それらに1つまたは複数のインデックスを作成します。さらに、インデックスを基本的に主キーのテーブルとして表示します。
インデックスは検索またはSELECTステートメントを高速化しますが、テーブルとインデックスの両方で操作を実行するため、挿入と更新のドラッグを行います。
インデックスを作成する
CREATE TABLE ... INDEXステートメントまたはCREATEINDEXステートメントを使用してインデックスを作成できます。読みやすさ、メンテナンス、およびベストプラクティスをサポートする最良のオプションは、CREATEINDEXです。
以下に示すインデックスの一般的な構文を確認してください-
CREATE [UNIQUE or FULLTEXT or...] INDEX index_name ON table_name column;
その使用例を確認する-
CREATE UNIQUE INDEX top_sellers ON products_tbl product;
インデックスを削除する
DROPINDEXまたはALTERTABLE ... DROPを使用してインデックスを削除できます。読みやすさ、メンテナンス、およびベストプラクティスをサポートする最良のオプションは、DROPINDEXです。
以下に示すドロップインデックスの一般的な構文を確認してください-
DROP INDEX index_name ON table_name;
その使用例を確認する-
DROP INDEX top_sellers ON product_tbl;
インデックスの名前を変更する
ALTERTABLEステートメントを使用してインデックスの名前を変更します。以下に示す一般的な構文を確認してください-
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は、ストレージエンジンに依存しない統計テーブルを利用できるようにしました。これは、すべてのストレージエンジンのすべてのテーブルのデータ統計、さらにはインデックス付けされていない列の統計を計算します。
一部の操作は、速度または使い捨てデータのために一時テーブルの恩恵を受けることができます。一時テーブルの有効期間は、コマンドプロンプトから、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句を使用して、既存のテーブル、つまりすべての一般的な特性を複製できます。一時テーブルの生成に使用されるCREATETABLEステートメントは、TEMPORARYキーワードの結果としてトランザクションをコミットしません。
一時テーブルは非一時テーブルとは異なり、セッションの終了時に削除されますが、特定の競合が発生する可能性があります-
期限切れのセッションからのゴースト一時テーブルと競合することがあります。
非一時テーブルのシャドウ名と競合する場合があります。
Note −一時テーブルは、MariaDBが差分参照と見なすため、既存の非一時テーブルと同じ名前を持つことができます。
管理
MariaDBでは、一時テーブルを作成するための権限をユーザーに付与する必要があります。GRANTステートメントを使用して、管理者以外のユーザーにこの特権を付与します。
GRANT CREATE TEMPORARY TABLES ON orders TO 'machine122'@'localhost';
一時テーブルを削除する
一時テーブルは基本的にセッションの終了時に削除されますが、それらを削除するオプションがあります。一時テーブルを削除するには、TEMPORARYキーワードを使用する必要があります。ベストプラクティスでは、一時テーブルを非一時テーブルの前に削除することをお勧めします。
mysql> DROP TABLE order;
状況によっては、既存のテーブルの正確なコピーを作成する必要があります。CREATE ... SELECTステートメントは、インデックスやデフォルト値などを無視するため、この出力を生成できません。
テーブルを複製する手順は次のとおりです。
SHOW CREATE TABLEを利用して、ソーステーブルの構造全体を詳細に示すCREATETABLEステートメントを生成します。
ステートメントを編集してテーブルに新しい名前を付け、実行します。
テーブルデータもコピーする必要がある場合は、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 TABLEASステートメントを使用します。このステートメントは、すべての列と列定義をコピーし、そのコピーにソーステーブルのデータを入力します。
以下に示す構文を確認してください-
CREATE TABLE clone_tbl AS
SELECT columns
FROM original_tbl
WHERE conditions];
以下の使用例を確認してください-
CREATE TABLE products_copy_tbl AS
SELECT *
FROM products_tbl;
バージョン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コマンドの寛大なポリシーが原因で発生することがよくあります。この問題を制御し、重複を見つけ、重複を削除し、重複の作成を防ぐ方法があります。
戦略とツール
重複を管理するための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'
Note −キーが見つからない場合、INSERT ... ON DUPLICATE KEYUPDATEステートメントは通常の挿入ステートメントと同じように実行されます。
DISTINCTの使用
DISTINCT句は、結果から重複を削除します。DISTINCT句の一般的な構文は次のとおりです-
SELECT DISTINCT fields
FROM table
[WHERE conditions];
Note − 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
INSERTIGNOREの使用
INSERT IGNOREステートメントは、重複レコードの検出時に挿入をキャンセルするようにMariaDBに指示します。以下に示すその使用例を確認してください-
mysql> INSERT IGNORE INTO customer_tbl (LN, FN)
VALUES( 'Lex', 'Luther');
また、重複の背後にあるロジックにも注意してください。一部のテーブルでは、そのテーブルデータの性質に基づいて複製が必要です。重複レコードを管理するための戦略でそのニーズに対応します。
ユーザー入力を受け入れるという単純な行為は、エクスプロイトへの扉を開きます。問題は主にデータの論理管理に起因しますが、幸いなことに、これらの主要な欠陥を回避するのはかなり簡単です。
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と組み合わせたプログラミング/スクリプト言語によって提供されるパターンマッチングおよび正規表現ツールを検討してください。これらのツールは、より多くの制御を提供し、場合によってはより優れた制御を提供します。
データはビジネスと運用の基盤として機能し、さまざまな脅威(攻撃者、システム障害、不適切なアップグレード、メンテナンスエラーなど)が発生する可能性があるため、バックアップは依然として重要です。これらのバックアップにはさまざまな形式があり、これらのプロセス内でさらに幅広いオプションのセットを使用してバックアップを作成するための多くのオプションが存在します。覚えておくべき重要なことは、データベースの種類、重要な情報、および関連する構造です。この情報はあなたの最良の選択肢を決定します。
オプション
バックアップの主なオプションには、論理バックアップと物理バックアップがあります。論理バックアップは、データを復元するためのSQLステートメントを保持します。物理バックアップには、データのコピーが含まれています。
Logical backups同じマシンとデータベースタイプに制限されることが多い物理バックアップとは対照的に、異なる構成の別のマシンでデータを復元する柔軟性を提供します。論理バックアップはデータベースおよびテーブルレベルで発生し、物理バックアップはディレクトリおよびファイルレベルで発生します。
Physical backups論理よりもサイズが小さく、実行と復元にかかる時間も短くなります。物理バックアップにはログファイルと構成ファイルも含まれますが、論理バックアップには含まれません。
バックアップツール
MariaDBバックアップに使用される主なツールは mysqldump。論理バックアップと柔軟性を提供します。また、小規模なデータベースに最適なオプションでもあります。MysqldumpデータをSQL、CSV、XML、およびその他の多くの形式にダンプします。その出力は、明示的な指示がない限り、ストアドプロシージャ、ビュー、およびイベントを保持しません。
の3つのオプションがあります mysqldump バックアップ-
Raw data −ファイルの宛先も指定する--tabオプションを使用して、テーブルを生データファイルとしてダンプします。
$ mysqldump -u root -p --no-create-info \
--tab=/tmp PRODUCTS products_tbl
Data/Definitions export−このオプションを使用すると、単一または複数のテーブルをファイルにエクスポートでき、ホストマシン上の既存のすべてのデータベースのバックアップをサポートします。コンテンツまたは定義をファイルにエクスポートする例を調べます
$ mysqldump -u root -p PRODUCTS products_tbl > export_file.txt
Transfer −データベースとテーブルを別のホストに出力することもできます
$ mysqldump -u root -p database_name \
| mysql -h other-host.com database_name
SELECT ... INTOOUTFILEステートメントの使用
データをエクスポートするための別のオプションは、SELECT ... INTOOUTFILEステートメントを使用します。この単純なオプションは、テーブルを単純なフォーマットのテキストファイルに出力します-
mysql> SELECT * FROM products_tbl
-> INTO OUTFILE '/tmp/products.txt';
その属性により、ファイルを好みの仕様にフォーマットできます。
このステートメントの次の性質に注意してください-
ファイル名は、出力の目的の場所を指定する必要があります。
ステートメントを実行するには、MariaDBファイルの権限が必要です。
出力ファイル名は一意である必要があります。
ホストにログイン資格情報が必要です。
UNIX環境では、出力ファイルは誰でも読み取り可能ですが、そのサーバーの所有権はファイルを削除する機能に影響します。特権があることを確認してください。
バックアップでのCONNECTの使用
CONNECTハンドラーを使用すると、データをエクスポートできます。これは主に、SELECT ... INTOOUTFILE操作がファイル形式をサポートしていない状況で役立ちます。
次の例を確認してください-
create table products
engine = CONNECT table_type = XML file_name = 'products.htm' 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の公式サイトをご覧ください。
Snapshots−一部のファイルシステムではスナップショットが許可されています。このプロセスは、読み取りロックを使用したテーブルのフラッシュ、スナップショットのマウント、テーブルのロック解除、スナップショットのコピー、およびスナップショットのアンマウントで構成されます。
LVM−この一般的な方法は、Perlスクリプトを採用しています。すべてのテーブルで読み取りロックを取得し、キャッシュをディスクにフラッシュします。次に、スナップショットを取得し、テーブルのロックを解除します。関係者に相談するmylvmbackup 詳細については、Webサイトを参照してください。
TokuBackup− Perconaが提供するこのソリューションは、InnoDBバックアップオプションの問題と制限を考慮したホットバックアップを提供します。アプリケーションがファイルを操作し続けている間、ファイルのトランザクションサウンドコピーを生成します。詳細については、PerconaのWebサイトを参照してください。
INNODBの考慮事項
InnoDBは、パフォーマンスを向上させるためにバッファープールを使用します。バックアップでは、論理バックアップは通常全表スキャンを実行するため、テーブル全体がバッファープールにコピーされないようにInnoDBを構成します。
この章では、さまざまなバックアップの読み込み方法について学習します。バックアップからデータベースを復元するのは簡単で、場合によっては非常に長いプロセスです。
データのロードには、LOAD DATAステートメント、mysqlimport、および単純なmysqldump復元の3つのオプションがあります。
LOADDATAの使用
LOAD DATAステートメントは、バルクローダーとして機能します。テキストファイルをロードする使用例を確認します-
mysql> LOAD DATA LOCAL INFILE 'products_copy.txt' INTO TABLE empty_tbl;
LOADDATAステートメントの次の品質に注意してください-
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ツールはLOADDATAラッパーとして機能し、コマンドラインから同じ操作を実行できます。
次のようにデータをロードします-
$ 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句を使用してフォーマットを指定します。「ENCLOSEDBY」で引用符をポイントします。これにより、データ値から引用符が削除されます。「ESCAPEDBY」でエスケープを変更します。
この章には、最も頻繁に使用される関数のリストが含まれており、定義、説明、および例が提供されています。
MariaDB集計関数
最も頻繁に使用される集計関数を以下に示します-
シニア番号 | 名前と説明 |
---|---|
1 | COUNT レコード数をカウントします。 Example − SELECT COUNT(*)FROM customer_table; |
2 | MIN これは、一連のレコードの最小値を明らかにします。 Example − SELECT組織、MIN(アカウント)FROM契約GROUPBY組織; |
3 | MAX これは、一連のレコードの最大値を明らかにします。 Example − SELECT組織、MAX(account_size)FROM契約GROUPBY組織。 |
4 | AVG 一連のレコードの平均値を計算します。 Example − SELECT AVG(account_size)FROM契約; |
5 | SUM 一連のレコードの合計を計算します。 Example − SELECT SUM(account_size)FROMコントラクト。 |
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の日付/時刻関数
以下に重要な日付関数を示します-
シニア番号 | 名前と説明 |
---|---|
1 | CURDATE() 日付をyyyy-mm-ddまたはyyyymmdd形式で返します。 Example − SELECT CURDATE(); |
2 | DATE() 日付を複数の形式で返します。 Example −CREATE TABLE product_release_tbl(x DATE); |
3 | CURTIME() 時刻をHH:MM:SSまたはHHMMSS.uuuuuu形式で返します。 Example − SELECT CURTIME(); |
4 | DATE_SUB() 指定された日付から日数を加算または減算します。 Example − SELECT DATE_SUB( '2016-02-08'、INTERVAL 60 DAY); |
5 | DATEDIFF() 2つの日付の間の日を決定します。 Example − SELECT DATEDIFF( '2016-01-01 23:59:59'、 '2016-01-03'); |
6 | DATE ADD() 日付と時刻に時間の単位を加算または減算します。 Example − SELECT DATE_ADD( '2016-01-04 23:59:59'、INTERVAL 22 SECOND); |
7 | EXTRACT() 日付から単位を抽出します。 Example − SELECT EXTRACT(YEAR FROM '2016-01-08'); |
8 | NOW() 現在の日付と時刻をyyyy-mm-ddhh:mm:ssまたはyyyymmddhhmmss.uuuuuu形式で返します。 Example − SELECT NOW(); |
9 | DATE FORMAT() 指定されたフォーマット文字列に従って日付をフォーマットします。 Example − SELECT DATE_FORMAT( '2016-01-09 20:20:00'、 '%W%M%Y'); |
以下はいくつかの重要な時間関数です-
シニア番号 | 名前と説明 |
---|---|
1 | HOUR() 時間の時間、または経過した時間を返します。 Example − SELECT HOUR('19:17:09 '); |
2 | LOCALTIME() NOW()とまったく同じように機能します。 |
3 | MICROSECOND() 時間のマイクロ秒を返します。 Example − SELECT MICROSECOND('16:30:00.543876 '); |
4 | MINUTE() 時間の分を返します。 Example − SELECT MINUTE( '2016-05-22 17:22:01'); |
5 | SECOND() 日付の秒を返します。 Example − SELECT SECOND( '2016-03-12 16:30:04.000001'); |
6 | TIME_FORMAT() 指定されたフォーマット文字列に従って時刻をフォーマットします。 Example − SELECT TIME_FORMAT('22:02:20 '、'%H%k%h%I%l '); |
7 | TIMESTAMP() アクティビティのタイムスタンプをyyyy-mm-ddhh:mm:ddの形式で提供します。 Example − CREATE TABLEorders_(ID INT、tmst TIMESTAMP); |
MariaDB数値関数
以下に、MariaDBのいくつかの重要な数値関数を示します。
シニア番号 | 名前と説明 |
---|---|
1 | TRUNCATE() 切り捨てられた数値を小数点以下の桁数の指定で返します。 Example − SELECT TRUNCATE(101.222、1); |
2 | COS() xラジアンのコサインを返します。 Example − SELECT COS(PI()); |
3 | CEILING() xを下回らない最小の整数を返します。 Example − SELECT CEILING(2.11); |
4 | DEGREES() ラジアンを度に変換します。 Example − SELECT DEGREES(PI()); |
5 | DIV() 整数除算を行います。 Example − SELECT 100 DIV 4; |
6 | EXP() eをxの累乗に戻します。 Example − SELECT EXP(2); |
7 | FLOOR() xを超えない最大の整数を返します。 Example − SELECT FLOOR(2.01); |
8 | LN() xの自然対数を返します。 Example − SELECT LN(3); |
9 | LOG() 自然対数または対数を指定された底に返します。 Example − SELECT LOG(3); |
10 | SQRT() 平方根を返します。 Example − SELECT SQRT(16); |
MariaDB文字列関数
重要な文字列関数を以下に示します-
シニア番号 | 名前と説明 |
---|---|
1 | INSTR() 部分文字列の最初のインスタンスの位置を返します。 Example − SELECT INSTR( 'rambutan'、 'tan'); |
2 | RIGHT() 右端の文字列文字を返します。 Example − SELECT RIGHT( 'rambutan'、3); |
3 | LENGTH() 文字列のバイト長を返します。 Example − SELECT LENGTH( 'rambutan'); |
4 | LOCATE() 部分文字列の最初のインスタンスの位置を返します。 Example − SELECT LOCATE( 'tan'、 'rambutan'); |
5 | INSERT() 変更された、特定の位置に指定された部分文字列を持つ文字列を返します。 Example − SELECT INSERT( 'ramputan'、4、1、 'b'); |
6 | LEFT() 左端の文字を返します。 Example − SELECT LEFT( 'rambutan'、3); |
7 | UPPER() 文字を大文字に変更します。 Example − SELECT UPPER(lastname); |
8 | LOWER() 文字を小文字に変更します。 Example − SELECT LOWER(lastname); |
9 | STRCMP() 文字列を比較し、等しい場合は0を返します。 Example − SELECT STRCMP( 'egg'、 'cheese'); |
10 | REPLACE() 文字を置き換えた後、文字列を返します。 Example − SELECT REPLACE( 'sully'、 'l'、 'n'); |
11 | REVERSE() 文字列内の文字を反転します。 Example − SELECT REVERSE( 'racecar'); |
12 | REPEAT() 指定された文字をx回繰り返す文字列を返します。 Example − SELECT REPEAT( 'ha'、10); |
13 | SUBSTRING() 位置xから始まる文字列から部分文字列を返します。 Example − SELECT SUBSTRING( 'rambutan'、3); |
14 | TRIM() 文字列から末尾/先頭の文字を削除します。 Example − SELECT TRIM(LEADING'_ 'FROM'_rambutan'); |