【NodeでMySQL】Nodeでデータベースへ接続やSQL処理をしてみる
みなさんnodeのデータベース知識はありますか?
この記事はnodeのデータベースについて聞いたことはあるけど、いまいちデータベースについてよく分かってない方や、
SELECTからINSERTなどの全く知識がない方へNodeのMySQLについての紹介です。
この記事でわかること
- 1. Nodeでデータベースへ接続の全体の流れ
- 2. MySQLモジュールのインストール
- 3. mysqlのモジュールの読み込み
- 4. Nodeでデータベースへの接続情報
- 5. Nodeでデータベースへ接続
- 6. SELECT
- 7. INSERT
- 8. WHERE
- 9. ORDER BY
- 10. LIMIT
- 11. JOIN
- 11.1. INNER JOIN 内部結合
- 11.2. ON句とWHERE句を使ってのJOIN
- 11.3. OUTER JOIN 外部結合
- 11.4. LEFT JOIN 左外部結合
- 11.5. RIGHT JOIN 右外部結合
- 12. UPDATE
- 13. DELETE
この記事を最後まで読めば「nodeでmysqlへのデータベースへの接続」から「SELECT」や「 INSERT」などの理解が深まりますので、最後まで読んで「データベース」についてマスターしましょう。
それでは順に見ていきましょう。
Nodeでデータベースへ接続の全体の流れ
結論から言うと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
SELECTとはデータベースからデータを取得することです。
SELECT カラム名 FROM テーブル名;
SELECTする場合はFROMでテーブル名を指定して、SELECTするカラムを指定します。
usersテーブル
id | name | age |
---|---|---|
1 | kami1 | 10 |
2 | kami2 | 20 |
3 | kami3 | 30 |
// 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の結果
id | name | age |
---|---|---|
1 | kami1 | 10 |
2 | kami2 | 20 |
3 | kami3 | 30 |
「*」は全てが該当します。
よって「*」は"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
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の結果
name | |
---|---|
kami1 | kami@nodesample.com |
テーブル(カラム1, カラム2)に対してVALUES(結果1, 結果2)をINSERTできます。
INSERTの補足
- users:テーブル名
- name:usersテーブルのnameカラムにkamiをINSERT
- email:usersテーブルのemailカラムにkami@nodesample.comをINSERT
WHERE
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
ORDER BYはソートを行ってくれるます。
SELECT カラム FROM テーブル ORDER BY カラム 昇順 or 降順
- ASC:昇順
- DESC:降順
usersテーブル
id | name | age |
---|---|---|
1 | kami1 | 10 |
2 | kami2 | 20 |
3 | kami3 | 30 |
// 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の結果
id | name | age |
---|---|---|
3 | kami1 | 30 |
2 | kami2 | 20 |
1 | kami3 | 10 |
ageを降順にしているため、ageを主軸に並び替えた結果が取得できます。
ORDER BYの補足
- users:テーブル
- *:取り出したいすべての値
- age DESC:ageを降順で取り出す
LIMIT
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
JOINとはテーブルの結合です。
JONは3複数あるので用途に合わせてしっかりと覚えましょう。
SELECT カラム FROM テーブル名
JOIN 内部結合するテーブル名 ON テーブル名.カラム = 内部結合するテーブル名.カラム;
- INNER JOIN:内部結合 紐付いているレコードのみで新しいテーブルを表示する
- OUTER JOIN:外部結合. 紐付いているレコード以外も含めて新しいテーブルを表示する。
INNER JOIN 内部結合
INNER JOINとは両方のテーブルに存在するデータを抽出する結合です。
例として二つのテーブルをINNER JOINします。
ON句とWERER句の使いわけ
- ON:テーブル同士の結合
- WHERE:条件
それではJOINしてみましょう。
userテーブル
id | name | age |
---|---|---|
1 | kami1 | 10 |
2 | kami2 | 20 |
3 | kami3 | 30 |
groupテーブル
id | group |
---|---|
1 | a |
2 | b |
4 | c |
// 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の結果
id | name | age |
---|---|---|
1 | kami1 | 10 |
2 | kami2 | 20 |
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の結果
id | name | age |
---|---|---|
1 | kami1 | 10 |
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テーブル
id | name | age |
---|---|---|
1 | kami1 | 10 |
2 | kami2 | 20 |
3 | kami3 | 30 |
groupテーブル
id | group |
---|---|
1 | a |
2 | b |
4 | c |
// 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結果
id | name | age | group |
---|---|---|---|
1 | kami1 | 10 | a |
2 | kami2 | 20 | b |
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結果
id | name | age | group |
---|---|---|---|
1 | kami1 | 10 | a |
2 | kami2 | 20 | b |
idはgroupテーブルのレコードです。
その上で条件一致したデータを表示できます。
JOINの補足
- INNER JOIN
- LEFT JOIN
- RIGHT JOIN
UPDATE
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
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アプリ開発で分からない時
プログラミング×稼げる副業スキルはテックキャンププログラミングについて分からない時
【コエテコ様限定】※ご案内を受けた以外のメディアが使用しても成果は承認されません。僕への個人でもメンターでも、スクールでもお好きな方を活用ください。