【NodeでMySQL】Nodeでデータベースへ接続やSQL処理をしてみる

2022年11月12日Node

node.js

kamiです。
TwitterYoutubeもやってます。

みなさんnodeのデータベース知識はありますか?
この記事はnodeのデータベースについて聞いたことはあるけど、いまいちデータベースについてよく分かってない方や、
SELECTからINSERTなどの全く知識がない方へNodeのMySQLについての紹介です。

この記事でわかること

この記事を最後まで読めば「nodeでmysqlへのデータベースへの接続」から「SELECT」「 INSERT」などの理解が深まりますので、最後まで読んで「データベース」についてマスターしましょう。

それでは順に見ていきましょう。

Nodeでデータベースへ接続の全体の流れ

icon

結論から言うとnodeでデータベースへ接続を行うには次の流れになります。

  • mysqlモジュールのインストール
  • mysqlのモジュールの読み込み
  • createConnectionで接続情報の指定
  • データベースへ接続
  • 行いたいDB処理

MySQLモジュールのインストール

npm install mysql

コマンドプロンプトやターミナルでmysqlをインストールください。
package jsonに追加されていれば、okです。

スポンサードサーチ

mysqlのモジュールの読み込み

const mysql = require('mysql');

requireで package.jsonにdependenciesまたはdevDependenciesにモジュール名が表示されていれば、requireできます。

ependenciesとdevDependenciesの違いとは

dependenciesとdevDependenciesの違いは本番環境下開発環境です。

  • dependencies:本番環境
  • devDependencies:開発環境
        "dependencies": {
            "express": "^1.0.0",
			"mysql": "^1.0.0"
        },
        "devDependencies": {
			"eslint": "^1.0.0",
            "nodemon": "^1.0.0",
            "mysql": " ^1.0.0"
        },

Nodeでデータベースへの接続情報

Nodeでデータベースへの接続情報

// mysqlモジュール
const mysql = require('mysql');

// データベースの接続情報
const connection = mysql.createConnection({
  connectionLimit : 1,
  host: 'localhost',
  user: 'root',
  password: 'root',
  database: 'node_mysql_sample',
  charset: 'utf8mb4',
  timezone: 'jst'
})

データベースの接続の設定情報です。

  • connectionLimit:接続制限
  • host:ホスト名
  • user:ユーザー名
  • password:パスワード
  • database:データベース名
  • charset:文字コード
  • timezone:タイムゾーン

host, user, passwordがあればデータベースへ接続することができます。
その他はオプションだと思ってもらえれば大丈夫です。

スポンサードサーチ

Nodeでデータベースへ接続

Nodeでデータベースへ接続

// mysqlモジュール
const mysql = require('mysql');

// データベースの接続情報
const connection = mysql.createConnection({
  connectionLimit : 1,
  host: 'localhost',
  user: 'root',
  password: 'root',
  database: 'node_mysql_sample',
  charset: 'utf8mb4',
  timezone: 'jst'
})

// データベースへ接続
connection.connect();

データベースの接続情報をcreateConnectionした上で、
connection.connect()でデータベースの接続を行えます。

// mysqlモジュール
const mysql = require('mysql');

// データベースの接続情報
const connection = mysql.createConnection({
  connectionLimit : 1,
  host: 'localhost',
  user: 'root',
  password: 'root',
  database: 'node_mysql_sample',
  charset: 'utf8mb4',
  timezone: 'jst'
})

// データベースへ接続
connection.connect(function(error) {
  if (error) {
    console.error('connection error: ' + error);
    return;
  }
  console.error('connection success: ' + error);
});

データベースへ接続の補足

connection.connect内にエラー判定を取ればデータベースへ接続できているかどうかが分かります。

SELECT

icon

SELECTとはデータベースからデータを取得することです。

SELECT カラム名 FROM テーブル名;

SELECTする場合はFROMでテーブル名を指定して、SELECTするカラムを指定します。

usersテーブル

idnameage
1kami110
2kami220
3kami330
// mysqlモジュール
const mysql = require('mysql');

// データベースの接続情報
const connection = mysql.createConnection({
  connectionLimit : 1,
  host: 'localhost',
  user: 'root',
  password: 'root',
  database: 'node_mysql_sample',
  charset: 'utf8mb4',
 }

// データベースへ接続
connection.connect(function(error) {
  if (error) throw error;
  // sql
  const sql = "SELECT * FROM users" 
  // SELLECTクエリ
  connection.query(sql, function (error, result) {
    if (error) throw err;
    console.log(result);
  });
});

SELECTの結果

idnameage
1kami110
2kami220
3kami330

「*」は全てが該当します。
よって「*」は"SELECT * FROM usres"はusersテーブルの全て取り出します。

SELECTにカラムを選択した場合

// mysqlモジュール
const mysql = require('mysql');

// データベースの接続情報
const connection = mysql.createConnection({
  connectionLimit : 1,
  host: 'localhost',
  user: 'root',
  password: 'root',
  database: 'node_mysql_sample',
  charset: 'utf8mb4',
 }

// データベースへ接続
connection.connect(function(error) {
  if (error) throw error;
  // sql
  const sql = "SELECT name FROM users" 
  // SELLECTクエリ
  connection.query(sql, function (error, result) {
    if (error) throw err;
    console.log(result);
  });
});

SELECTの結果

name
kami1
kami2
kami3

SELECTでカラムをした場合、そのカラムを取得できます。

SELECTの補足

FROM任意のカラムを指定すると選択したカラムを取得できます。
アスタリスク(*)の場合は全て取得することができます。

スポンサードサーチ

INSERT

icon

INSERTとはテーブルに追加することです。

INSERT INTO テーブル名 (カラム名1, カラム名2, ...)
            VALUE(値1, 値2, ...),

INSERTする場合は テーブル名を指定してカラムと先に指定し終わった後に、VALUEを指定します。

// mysqlモジュール
const mysql = require('mysql');

// データベースの接続情報
const connection = mysql.createConnection({
  connectionLimit : 1,
  host: 'localhost',
  user: 'root',
  password: 'root',
  database: 'node_mysql_sample',
  charset: 'utf8mb4',
 }

// データベースへ接続
connection.connect(function(error) {
  if (error) throw error;
   // sql
   const sql = "INSERT INTO users(name, email)
                            VALUES('kami','kami@nodesample.com')"
   // INSERTクエリ
   connection.query(sql, function (error, result) {
    if (error) throw error;
    console.log('success:' + result)
  });
}); 

INSERTの結果

nameemail
kami1kami@nodesample.com

テーブル(カラム1, カラム2)に対してVALUES(結果1, 結果2)をINSERTできます。

INSERTの補足

  • users:テーブル名
  • name:usersテーブルのnameカラムにkamiをINSERT
  • email:usersテーブルのemailカラムにkami@nodesample.comをINSERT

WHERE

icon

WHERE句とはテーブルからINSERTやSELECTなどのクエリ実行時の条件の一つです。

SELECT * FROM テーブル WHERE 条件

WHERE句はSELECT 文でクエリする際に条件を指定してフィルターすることができます。
することができます。設定することができます。

// mysqlモジュール
const mysql = require('mysql');
 
// データベースの接続情報
const connection = mysql.createConnection({
  connectionLimit : 1,
  host: 'localhost',
  user: 'root',
  password: 'root',
  database: 'node_mysql_sample',
  charset: 'utf8mb4',
 }
 
// データベースへ接続
connection.connect(function(error) {
  if (error) throw err;
  // sql
  const sql =  "SELECT name FROM users WHERE id = 1"
  // WHEREクエリ
  connection.query(sql, function (error, result) {
    if (error) throw error;
    console.log(result);
  });
});

WHEREの補足

  • users:テーブル名
  • name:取り出したいカラム
  • id:idが1の場合、usersテーブルのnameを取り出す

ORDER BY

icon

ORDER BYはソートを行ってくれるます。

SELECT カラム FROM テーブル ORDER BY カラム 昇順 or 降順
  • ASC:昇順
  • DESC:降順

usersテーブル

idnameage
1kami110
2kami220
3kami330
// mysqlモジュール
const mysql = require('mysql');
 
// データベースの接続情報
const connection = mysql.createConnection({
  connectionLimit : 1,
  host: 'localhost',
  user: 'root',
  password: 'root',
  database: 'node_mysql_sample',
  charset: 'utf8mb4',
 }
 
// データベースへ接続
connection.connect(function(error) {
  if (error) throw error;
  // sql
  const sql = "SELECT * FROM users ORDER BY age DESC";
  // ORDER BYクエリ
  connection.query(sql, function (error, result) {
    if (error) throw error;
    console.log(result);
  });
});

ORDER BYの結果

idnameage
3kami130
2kami220
1kami310

ageを降順にしているため、ageを主軸に並び替えた結果が取得できます。

ORDER BYの補足

  • users:テーブル
  • *:取り出したいすべての値
  • age DESC:ageを降順で取り出す

LIMIT

icon

LIMITとは取り出したいデータ数です。

SELECT カラム FROM テーブル名 LIMIT データ数
// mysqlモジュール
const mysql = require('mysql');
 
// データベースの接続情報
const connection = mysql.createConnection({
  connectionLimit : 1,
  host: 'localhost',
  user: 'root',
  password: 'root',
  database: 'node_mysql_sample',
  charset: 'utf8mb4',
 }
 
// データベースへ接続
connection.connect(function(error) {
  if (error) throw error;
  // sql
  let sql = "SELECT id FROM users LIMIT 3";
  // LIMITクエリ
  connection.query(sql, function (error, result) {
    if (error) throw err;
    console.log(result);
  });
});

LIMITの補足

  • users:テーブル名
  • is:SELECTしたい値
  • 3:取り出したいデータ数

JOIN

icon

JOINとはテーブルの結合です。
JONは3複数あるので用途に合わせてしっかりと覚えましょう。

SELECT カラム FROM テーブル名 
       JOIN 内部結合するテーブル名 ON テーブル名.カラム = 内部結合するテーブル名.カラム;
  • INNER JOIN:内部結合 紐付いているレコードのみで新しいテーブルを表示する
  • OUTER JOIN:外部結合. 紐付いているレコード以外も含めて新しいテーブルを表示する。

INNER JOIN 内部結合

INNER JOINとは両方のテーブルに存在するデータを抽出する結合です。
例として二つのテーブルをINNER JOINします。

ON句とWERER句の使いわけ

  • ON:テーブル同士の結合
  • WHERE:条件

それではJOINしてみましょう。

userテーブル

idnameage
1kami110
2kami220
3kami330

groupテーブル

idgroup
1a
2b
4c
// mysqlモジュール
const mysql = require('mysql');
 
// データベースの接続情報
const connection = mysql.createConnection({
  connectionLimit : 1,
  host: 'localhost',
  user: 'root',
  password: 'root',
  database: 'node_mysql_sample',
  charset: 'utf8mb4',
 }

// データベースへ接続
connection.connect(function(error) {
  if (error) throw error;
  // sql
  const sql = "SELECT * FROM users 
               JOIN group ON users.id = group.id";
  // JOIN句
  connection.query(sql, function (error, result) {
    if (error) throw error;
    console.log(result);
  });
});

INNER JOINの結果

idnameage
1kami110
2kami220

INNER JOINによりuserテーブルのidとgroupテーブルのidが一致した場合にuserテーブルのnameを取り出しています。

ON句とWHERE句を使ってのJOIN

ON句とWHERE句を使ってのJOIN

SELECT カラム FROM テーブル名
JOIN 内部結合するテーブル名 ON テーブル名.カラム = 内部結合するテーブル名.カラム
WHERE 条件";
// mysqlモジュール
const mysql = require('mysql');
 
// データベースの接続情報
const connection = mysql.createConnection({
  connectionLimit : 1,
  host: 'localhost',
  user: 'root',
  password: 'root',
  database: 'node_mysql_sample',
  charset: 'utf8mb4',
 }

// データベースへ接続
connection.connect(function(error) {
  if (error) throw error;
  // sql
  const sql = "SELECT * FROM users 
               JOIN group ON users.id = group.id";
               WHERE users.id < 2; 
  // JOIN句
  connection.query(sql, function (error, result) {
    if (error) throw error;
    console.log(result);
  });
});

INNER JOINの結果

idnameage
1kami110

INNER JOINによりuserテーブルのidとgroupテーブルのidが一致した場合かつ、
userのidが2未満であればuserテーブルのnameを取り出しています。

OUTER JOIN 外部結合

OUTER JOINとは基準となるテーブルにデータが存在すれば抽出する結合です。
またOUTER JOINにはLEFT JOINとRIGHT JOINの二つがあります。

  • LEFT JOIN:LEFT OUTER JOINの略で左側にテーブルに結合を行います。
  • RIGHT RIGHT OUTER JOINの略で右側にテーブルに結合を行います。

LEFT JOIN 左外部結合

LEFT JOIN

左側のテーブルを基準にテーブルの外部結合を行うことをLEFT JOINと言います。

今回は以下のクエリでLEFT JOINを行い、
ユーザーテーブルを基準にuserテーブルのidとgroupテーブルのidを条件にLEFT JOINを行います。

"SELECT users.name AS name FROM users 
               LEFT JOIN group ON users.id = group.id";

userテーブル

idnameage
1kami110
2kami220
3kami330

groupテーブル

idgroup
1a
2b
4c
// mysqlモジュール
const mysql = require('mysql');
 
// データベースの接続情報
const connection = mysql.createConnection({
  connectionLimit : 1,
  host: 'localhost',
  user: 'root',
  password: 'root',
  database: 'node_mysql_sample',
  charset: 'utf8mb4',
 }

// データベースへ接続
connection.connect(function(error) {
  if (error) throw error;
  // sql
  const sql = "SELECT * FROM users 
               LEFT JOIN group ON users.id = group.id";
  // JOIN句
  connection.query(sql, function (error, result) {
    if (error) throw error;
    console.log(result);
  });
});

LEFT JOIN結果

idnameagegroup
1kami110a
2kami220b

userテーブルを基準に比較しているため、比較対象になったgroupテーブルのidはテーブルのは表示されません。
条件に当てはまったレコードがテーブルとして表示されます。

RIGHT JOIN 右外部結合

RIGHT JOIN

LEFT JOINの逆で右側のテーブルを基準にテーブルの外部結合を行うことをRIGHT JOINと言います。

以下のクエリでRIGHT JOINを行い、
ユーザーテーブルを基準にuserテーブルのidとgroupテーブルのidを条件にRIGHT JOINを行います。

// mysqlモジュール
const mysql = require('mysql');
 
// データベースの接続情報
const connection = mysql.createConnection({
  connectionLimit : 1,
  host: 'localhost',
  user: 'root',
  password: 'root',
  database: 'node_mysql_sample',
  charset: 'utf8mb4',
 }

// データベースへ接続
connection.connect(function(error) {
  if (error) throw error;
  // sql
  const sql = "SELECT * FROM users 
               RIGHT JOIN group ON users.id = group.id";
  // JOIN句
  connection.query(sql, function (error, result) {
    if (error) throw error;
    console.log(result);
  });
});

RIGHT JOIN結果

idnameagegroup
1kami110a
2kami220b

idはgroupテーブルのレコードです。
その上で条件一致したデータを表示できます。

JOINの補足

  • INNER JOIN
  • LEFT JOIN
  • RIGHT JOIN

UPDATE

icon

UPDATEとはデータベースの更新です。

UPDATE テーブル名 SET 列名 = 値 WHERE 条件
// mysqlモジュール
const mysql = require('mysql');
 
// データベースの接続情報
const connection = mysql.createConnection({
  connectionLimit : 1,
  host: 'localhost',
  user: 'root',
  password: 'root',
  database: 'node_mysql_sample',
  charset: 'utf8mb4',
 }
 
// データベースへ接続
connection.connect(function(error) {
  if (error) throw error;
  // sql
  const sql = "UPDATE users SET email 
            = 'kami2@nodesample.com' WHERE users.name = 'kami'";
  // JOIN句
  connection.query(sql, function (error, result) {
    if (error) throw error;
    // console.log(result.affectedRows + " record(s) updated");
  });
});

UPDATEの補足

  • users:テーブル名
  • SET:kami2@nodesample.comに更新
  • WHERE:usersテーブルのnameカラムの値がkami

DELETE

icon

DELETEとはレコードの削除を行います。

DELETE FROM テーブル WHERE カラム = 値
// mysqlモジュール
const mysql = require('mysql');
 
// データベースの接続情報
const connection = mysql.createConnection({
  connectionLimit : 1,
  host: 'localhost',
  user: 'root',
  password: 'root',
  database: 'node_mysql_sample',
  charset: 'utf8mb4',
 }
 
// データベースへ接続
connection.connect(function(error) {
  if (error) throw error;
  let sql = "DELETE FROM users WHERE name = 'kami'";
  // DELETE句
  connection.query(sql, function (error, result) {
    if (error) throw error;
  });
});

DELETEの補足

  • users:テーブル名
  • WHERE:nameがkamiだったら削除する

まとめ

  • SELECT:取得したいカラム
  • INSERT:テーブルへ追加
  • WHERE:クエリ実行の条件
  • ORDER BY:照準、降順の指定
  • LIMIT:取得したいデータ数
  • JOIN:テーブル結合
  • INNER JOIN 内部結合:
  • OUTER JOIN 外部結合:
  • LEFT JOIN 左外部結合:
  • RIGHT JOIN 右外部結合:
  • UPDATE:データベースの更新
  • DELETE:データベースの削除

実装やエラーが解決できない場合

プログラミングの実装やエラーでどうしてもわからない場合はメンターに相談するのが一番です。

考えている、見えている範囲が狭くなり、解決から遠くに行って何時間も、何日も経っていることなんてよくある話です。

そういう時は聞ける先輩や、メンターに相談することが大事です。

僕にも相談可能なので気軽に相談してください。

Twitterからの連絡だと確実ですよ。

オンラインスクールやプログラミングスクールといったプログラミングを学べる方法もあるので、そちらもぜひ活用してもいいと思います。

Web開発で分からない時

オンライン完結型スクール DMM WEBCAMP PRO

アプリ開発で分からない時

プログラミング×稼げる副業スキルはテックキャンプ

プログラミングについて分からない時

【コエテコ様限定】※ご案内を受けた以外のメディアが使用しても成果は承認されません。
ミニマリスト_カミ

僕への個人でもメンターでも、スクールでもお好きな方を活用ください。

NodeNode.js

Posted by kami