NodeJS 速習チュートリアル

Node.js MySQL WHERE句

1. フィルタリングを用いたデータ抽出

テーブルからレコードを選択する際、WHERE ステートメントを使用することで、抽出条件を指定するフィルタリング(Filtering)が可能になります。

1.1 実装例

以下は、address(住所)が「Park Lane 38」であるレコードのみを選択するコードです。

let mysql = require('mysql');

let con = mysql.createConnection({
  host: "localhost",
  user: "yourusername",
  password: "yourpassword",
  database: "mydb"
});

con.connect(function(err) {
  if (err) throw err;
  console.log("接続完了!");
  // addressが一致するレコードのみをセレクト
  con.query("SELECT * FROM customers WHERE address = 'Park Lane 38'", function (err, result) {
    if (err) throw err;
    console.log(result);
  });
});

上記の内容を demo_db_where.js というファイル名で保存し、実行してください。

demo_db_where.js の実行

C:\Users\Your Name>node demo_db_where.js

結果として、以下のレコードが出力されます。

[
  { id: 11, name: 'Ben', address: 'Park Lane 38'}
]

2. ワイルドカードの使用

特定の文字やフレーズで始まる、含まれる、あるいは終わるレコードを選択することも可能です。
0文字以上の任意の文字列を表すワイルドカード(Wildcard Characters)として % を使用します。

2.1 実装例:前方一致検索

以下は、address が「S」で始まるレコードを抽出する例です。

let mysql = require('mysql');

let con = mysql.createConnection({
  host: "localhost",
  user: "yourusername",
  password: "yourpassword",
  database: "mydb"
});

con.connect(function(err) {
  if (err) throw err;
  // LIKE演算子と%ワイルドカードを使用
  con.query("SELECT * FROM customers WHERE address LIKE 'S%'", function (err, result) {
    if (err) throw err;
    console.log(result);
  });
});

demo_db_where_s.js の実行

C:\Users\Your Name>node demo_db_where_s.js

実行結果は以下の通りです。

[
  { id: 8, name: 'Richard', address: 'Sky st 331'},
  { id: 14, name: 'Viola', address: 'Sideway 1633'}
]

3. クエリ値のエスケープとセキュリティ

クエリ(Query)に使用する値がユーザーから提供されるバリアブル(Variable)である場合、その値を必ずエスケープ(Escape)処理する必要があります。

これは、データベースの破壊や悪用を目的とした一般的なウェブハッキング手法である SQLインジェクション(SQL Injection) を防止するためです。

MySQLモジュールには、これらの値を安全に処理するためのメソッドが用意されています。

3.1 mysql.escape() メソッドの使用例

mysql.escape() メソッドを使用して値をエスケープします。

let adr = 'Mountain 21';
// 値をエスケープしてSQL文に連結
let sql = 'SELECT * FROM customers WHERE address = ' + mysql.escape(adr);

con.query(sql, function (err, result) {
  if (err) throw err;
  console.log(result);
});

3.2 プレースホルダ(?)の使用例

エスケープしたい値の代わりに、プレースホルダ(Placeholder)として ? を使用することもできます。
この場合、バリアブルは query() メソッドの第2引数としてアレイ(配列)形式で渡されます。

let adr = 'Mountain 21';
let sql = 'SELECT * FROM customers WHERE address = ?';

// 第2引数にバリアブルを渡す
con.query(sql, [adr], function (err, result) {
  if (err) throw err;
  console.log(result);
});

3.3 複数のプレースホルダを使用する場合

複数のプレースホルダを使用する場合、アレイの中に対応する値を順番に格納します。

let name = 'Amy';
let adr = 'Mountain 21';
let sql = 'SELECT * FROM customers WHERE name = ? OR address = ?';

// 指定した順番通りにアレイへ格納
con.query(sql, [name, adr], function (err, result) {
  if (err) throw err;
  console.log(result);
});