20200228のMySQLに関する記事は15件です。

INNER JOIN、LEFT JOIN、RIGHT JOINの違い

はじめに

今回はSQLを学び始めた人のためにJOINについて解説いたします。

JOINとは?

テーブル同士を結合することです。データベースからレコードを取得する際、〇〇テーブルとXXテーブルのレコードを同時に取得したいなぁ...と思う時や、1つのテーブルだけでは情報が足りないから他のテーブルからも情報を引っ張ってこよう!と思うことがあります。そんな時に使うのがJOINです。こんな感じに書きます↓

SELECT カラム名 FROM テーブル1 JOIN テーブル2 ON テーブル1.カラム名1 = テーブル名2.カラム名

実例を交えて見ていきましょう!

JOIN(結合)にもいろいろある

テーブルの結合は大きく分けると内部結合と外部結合に分かれています。どのようにテーブルを結合するかによって、SQLでの記載方法が異なるわけです。また、下記の表のように省略形で記載することもできます。

結合方法 SQLでの記載方法 省略形
内部結合 INNER JOIN JOIN
外部結合 LEFT OUTER JOIN
または RIGHT OUTER JOIN
LEFT JOIN
RIGHT JOIN

INNER JOIN(内部結合)

テーブル同士を内部結合した場合、指定した条件に合致したレコードのみを取り出します。これだけではよくわからないと思うので実例を示します。以下の2つのテーブルに対して、内部結合でレコードを取得してみましょう。

・usersテーブル

userid name typeid
1 キン肉マン 1
2 悪魔将軍 2
3 ザ・マン 3
4 バッファローマン 5

・typeテーブル

id type
1 正義超人
2 悪魔超人
3 完璧超人
4 残虐超人

・実行するSQL

SELECT users.userid, users.name, type.type FROM users JOIN type ON users.typeid = type.id

・実行結果

userid name type
1 キン肉マン 正義超人
2 悪魔将軍 悪魔超人
3 ザ・マン 完璧超人

userテーブル.typeid と typeテーブル.idで内部結合すると、typeテーブル.idに4が存在しないため実行結果にバッファローマンは表示されません。このように、結合可能なレコードが存在しない場合はレコードを取得しないのが内部結合です。

左外部結合

続いて左外部結合をみていきましょう。左外部結合をする上で、まず思い浮かぶのは「左って何?」だと思います。これはSQL文でJOINの左側にあるテーブルを指しています。下記の例ではテーブル1ですね。同様に、右外部結合だとJOINの右側にあるテーブルなのでテーブル2を指しています。

SELECT カラム名 FROM テーブル1 LEFT JOIN テーブル2 ON テーブル1.カラム名1 = テーブル名2.カラム名

それでは先程と同じテーブルを使って左外部結合をしてみましょう。
・実行するSQL

SELECT users.userid, users.name, type.type FROM users LEFT JOIN type ON users.typeid = type.id

・実行結果

userid name type
1 キン肉マン 正義超人
2 悪魔将軍 悪魔超人
3 ザ・マン 完璧超人
4 バッファローマン NULL

今回はバッファローマンのレコードが取得できましたね!バッファローマンのtypeidはtypeテーブルのidに存在しませんが、とりあえず取得しちゃうわけです。これが左外部結合です。

右外部結合

最後に右外部結合をやってみましょう。左外部結合が分かれば簡単です。
・実行するSQL

SELECT users.userid, users.name, type.type FROM users RIGHT JOIN type ON users.typeid = type.id

・実行結果

userid name type
1 キン肉マン 正義超人
2 悪魔将軍 悪魔超人
3 ザ・マン 完璧超人
NULL NULL 残虐超人

右外部結合だと、typeテーブルから残虐超人のレコードが取得できましたね!残虐超人のidはusersテーブルのtypeidに存在しませんが、左外部結合と同様にとりあえず取得しちゃうわけです。これが右外部結合です。

まとめ

キン肉マンを読んだことがある人はわかると思いますが、バッファローマンは初登場時は悪魔超人でした。その後改心して正義超人になりましたが、完璧超人始祖編で再び悪魔超人となっています。そしてキン肉マン2世ではなぜか正義超人に戻っていました。そんな背景があり、今回の記事ではバッファローマンの所属する勢力がtypeテーブル上に存在しないことにしたわけです!

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

はじめてのクエリチューニング(MySQL)vol.5 インデックスのカラム値の長さを指定する

インデックスのカラム値の長さを指定する

先頭の値のみ(プリフィクス)でインデックスを作成することができます

ALTER TABLE テーブル名 ADD INDEX インデックス名(カラム名(長さ));

長さには指定したい先頭の文字数をバイトで記述します

メリット

  1. インデックスファイルをはるかに小さくできるため、ディスク領域が節約される

  2. オーバーヘッドが必要なINSERTやUPDATE処理が高速化される

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

XAMPPのMySQLが起動しなかった

状況

XAMPPを入れた後の初回起動時に、MySQLをStartさせることができなかった

解決方法

  1. xamppの右上にあるNetstatボタンを押して、MySQLのPort番号を探す。自分の場合はデフォルトの3306。
  2. 3306のプロセスをtaskkill /pid PID番号 /Fでキルする。

これでできた

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

deviseの関連ファイルが作られず、コマンドが適用されなくなった時の対処法

deviseをインストールしているとconfig/initializers/devise.rb
config/locales/devise.en.ymlファイルが生成されておらず、、さらにrails g devise userrails db:migrate:statusしても

NoMethodError: undefined method `devise' for Install (call 'Install.connection' to establish a connection):Class

というエラーが出ました。すでにuserモデル以外のデータべースは作ってあるのでrails db:migrate:statusが出来ないということはコマンドが適用されていないということだと思います。
同じ状態でbundle installからやり直しても解決出来ませんでした。

考えた仮説

このときGemfileにはちゃんとgem 'devise'と記述されていました。ターミナル履歴は以下の通りです。

#ターミナル履歴
bundle install
rails g devise:install
rails g devise user
rails db:migrate

ターミナル履歴におかしいところはない。
しかしconfig/initializers/devise.rb
config/locales/devise.en.ymlファイルがインストールがされていないので、rails g devise installに問題があるのではないか?
gemはローカルサーバーの再起動をしないと反映されないので、rails g devise installの前に再起動をしていなかったのではないか?

解決方法

調べると、rails g devise installが反映されていないとrails srails g devise userrails db:migrate:statusなど他のコマンドが競合してしまい、コマンドが反映されなくなってしまうようです。
参考記事 : https://qiita.com/ryouzi/items/9c5324ba567109ab2a22

具体的な対処法
1. もう一度bundle install
2. routes.rbにあるdevise_for :installもしくはdevise_for :usersというコードを削除する
3. 2でrailsコマンドが適用されるようになったのでrails db:rollbackでマイグレーションファイルをロールバックする。
4. rails db:migrate:statusでステータス確認
5. userテーブルやモデルが作られている場合はrails d model userで削除
6. rails g devise:install
7. rails g devise user
8. rails db:migrate

最後に

プログラミングを始めて4週間の初心者なので、その目線でわかりやすく書くことを心がけました。
わかりにくい記述、間違っているところがあればご指摘ください。
最後まで見ていただきありがとうございました。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【MySQL】「Unknown command '\''.」のエラー対処法

経緯

DBをmysqldumpにてダンプ後、ローカルDBへインポートしようとした際に発生。

mysql -uroot database < dump.sql
ERROR at line 1 : Unknown command '\''.

対処方法

MySQLコマンド実行時に、文字コードに「UTF-8」を指定する。

mysql -uroot --default-character-set=utf8 database < dump.sql

補足

・Shift_JISを指定すると変わらずエラーが発生

mysql -uroot --default-character-set=sjis database < dump.sql
ERROR at line 1 : Unknown command '\''.
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

メモ⑦-テーブルへのDDL処理(DROPとALTER)-

【DROP】
テーブルを削除するコマンド。
⑥で作成した「tbl_employee4」を、以下のように入力して削除する↓
MariaDB [company]> DROP TABLE tbl_employee4;
Query OK, 0 rows affected (0.010 sec)

確認すると。
MariaDB [company]> show tables;
+-------------------+
| Tables_in_company |
+-------------------+
| tbl_customer |
| tbl_customerm |
| tbl_department |
| tbl_employee |
| tbl_employee2 |
| tbl_employee3 |
| tbl_post |←tbl_employee4が消えている
| tbl_supplier |
+-------------------+
8 rows in set (0.001 sec)

【ALTER】
フィールドの追加や削除など、テーブルの内容を編集するときは、
ALTER TABLEコマンドを使用する。

tbl_employee3テーブルに血液型のフィールドを追加する↓
MariaDB [company]> ALTER TABLE tbl_employee3
-> ADD blood VARCHAR(2);
Query OK, 0 rows affected (0.006 sec)
Records: 0 Duplicates: 0 Warnings: 0

確認すると…
MariaDB [company]> desc tbl_employee3;
+-----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------+-------------+------+-----+---------+-------+
| code | int(11) | NO | | NULL | |
| name | varchar(40) | NO | | NULL | |
| birthday | datetime | YES | | NULL | |
| dpt_code | int(11) | YES | | NULL | |
| post_code | int(11) | YES | | NULL | |
| manager | int(11) | YES | | NULL | |
| blood | varchar(2) | YES | | NULL | |←初期値では、フィールドの最後に追加される。
+-----------+-------------+------+-----+---------+-------+
7 rows in set (0.011 sec)

※先頭に追加したい場合は
MariaDB [company]> ALTER TABLE tbl_employee3
-> ADD blood VARCHAR(2) FIRST;

※任意の場所に追加したい場合は、「〇〇の後」と追記する
MariaDB [company]> ALTER TABLE tbl_employee3
-> ADD blood VARCHAR(2) AFTER name;

また、追加したフィールドを削除するには、
「DROP COLUMN」を使用する。
MariaDB [company]> ALTER TABLE tbl_employee3
-> DROP COLUMN blood;
Query OK, 0 rows affected (0.009 sec)
Records: 0 Duplicates: 0 Warnings: 0

確認すると…
MariaDB [company]> desc tbl_employee3;
+-----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------+-------------+------+-----+---------+-------+
| code | int(11) | NO | | NULL | |
| name | varchar(40) | NO | | NULL | |
| gender | varchar(1) | YES | | NULL | |
| birthday | datetime | YES | | NULL | |
| dpt_code | int(11) | YES | | NULL | |
| post_code | int(11) | YES | | NULL | |
| manager | int(11) | YES | | NULL | |←「blood」フィールドが消えている
+-----------+-------------+------+-----+---------+-------+
7 rows in set (0.011 sec)

・・・⑧へ続く

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

メモ⑥-テーブルへのDDL処理(CREATE)-

~テーブルへの処理
【CREATE】
以下のように入力し、テーブルを生成する。

テーブルを追加したいDBに切り替えておく↓
MariaDB [world]> use company;
Database changed

テーブル内の情報を入力していく↓
MariaDB [company]> CREATE TABLE tbl_employee2(
-> code INTEGER, ←フィールド名と変数を指定している
-> name VARCHAR(40),
-> birthday DATETIME,
-> dpt_code INTEGER,
-> post_code INTEGER,
-> manager INTEGER
-> )
-> ;
Query OK, 0 rows affected (0.015 sec)

確認すると…
MariaDB [company]> DESC TBL_EMPLOYEE2;
+-----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------+-------------+------+-----+---------+-------+
| code | int(11) | YES | | NULL | |←テーブルが生成されている
| name | varchar(40) | YES | | NULL | | (ただしキーやNullの指定はまだできていない)
| birthday | datetime | YES | | NULL | |
| dpt_code | int(11) | YES | | NULL | |
| post_code | int(11) | YES | | NULL | |
| manager | int(11) | YES | | NULL | |
+-----------+-------------+------+-----+---------+-------+
6 rows in set (0.014 sec)

また、Nullを許さない(文字の空白を認めない)項目を設定したい場合、
以下のような形で入力する。

MariaDB [company]> CREATE TABLE tbl_employee3(
-> code INTEGER NOT NULL, ←変数名の直後に、「NOT NULL」と
-> name VARCHAR(40) NOT NULL, ←追記することで設定ができる。
-> birthday DATETIME,
-> dpt_code INTEGER,
-> post_code INTEGER,
-> manager INTEGER)
-> ;
Query OK, 0 rows affected (0.015 sec)

この形で生成したテーブルを確認すると…
MariaDB [company]> desc tbl_employee3;
+-----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------+-------------+------+-----+---------+-------+
| code | int(11) | NO | | NULL | |←Nullの項目が
| name | varchar(40) | NO | | NULL | |←NOになっている
| birthday | datetime | YES | | NULL | |
| dpt_code | int(11) | YES | | NULL | |
| post_code | int(11) | YES | | NULL | |
| manager | int(11) | YES | | NULL | |
+-----------+-------------+------+-----+---------+-------+
6 rows in set (0.023 sec)

次に、初期値(Default)の異なるテーブルを生成したい場合、
以下のような形で入力する。↓
MariaDB [company]> CREATE TABLE tbl_employee4(
-> code INTEGER NOT NULL DEFAULT 101, ←上記に加えて
-> name VARCHAR(40) NOT NULL DEFAULT "伊藤英樹",  デフォルト値を追記している。
-> birthday DATETIME DEFAULT "1972-02-01",
-> dpt_code INTEGER DEFAULT 10,
-> post_code INTEGER DEFAULT 1,
-> manager INTEGER)
-> ;
Query OK, 0 rows affected (0.015 sec)

MariaDB [company]> desc tbl_employee4;
+-----------+-------------+------+-----+---------------------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------+-------------+------+-----+---------------------+-------+
| code | int(11) | NO | | 101 | |
| name | varchar(40) | NO | | 伊藤英樹 | |
| birthday | datetime | YES | | 1972-02-01 00:00:00 | |
| dpt_code | int(11) | YES | | 10 | |
| post_code | int(11) | YES | | 1 | |
| manager | int(11) | YES | | NULL | |
+-----------+-------------+------+-----+---------------------+-------+
6 rows in set (0.011 sec) ↑デフォルト値が設定された

試しに、データを一人分入力し、
確認してみる。↓
MariaDB [company]> INSERT INTO tbl_employee4 (manager) VALUES (1);
Query OK, 1 row affected (0.002 sec)

確認すると…
MariaDB [company]> SELECT * FROM tbl_employee4;
+------+----------+---------------------+----------+-----------+---------+
| code | name | birthday | dpt_code | post_code | manager |
+------+----------+---------------------+----------+-----------+---------+
| 101 | 伊藤英樹 | 1972-02-01 00:00:00 | 10 | 1 | 1 |←初期値の状態で一人分
+------+----------+---------------------+----------+-----------+---------+ データが追加されている。
1 row in set (0.000 sec)

・・・メモ⑦へ続く

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

メモ⑤-データベースへのDDL処理-

DDLとは
データベースや、テーブルそのものに処理を加える指示。
生成(=CREATE)・削除(=DROP)・変更(=ALTER)などがある。

~データベースへの処理
【CREATE】
「sample」というデータベースを新しく生成する。

書き方は以下の通り。↓
MariaDB [world]> create database sample;
Query OK, 1 row affected (0.003 sec)

確認すると…
MariaDB [world]> show databases;
+--------------------+
| Database |
+--------------------+
| company |
| information_schema |
| mysql |
| performance_schema |
| sample |←「sample」データベースが追加されている。
| test |
| world |
+--------------------+
7 rows in set (0.001 sec)

【DROP】
データベースを削除するコマンド。

上で生成したsampleデータベースを削除してみる。↓
MariaDB [world]> DROP DATABASE sample;
Query OK, 0 rows affected (0.002 sec)

確認すると…
MariaDB [world]> show databases;
+--------------------+
| Database |
+--------------------+
| company |
| information_schema |
| mysql |
| performance_schema |
| test |←「sample」データベースが消えている。
| world |
+--------------------+
6 rows in set (0.001 sec)

・・・⑥へ続く

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

メモ③-関数を用いたSELECT文ほか-

SELECT文いろいろ

①給与平均を求める

データベースをcompanyに切り替え…
MariaDB [world]> use company;
Database changed

以下の形で入力する
MariaDB [company]> SELECT
-> AVG(basic_salary)
-> AS "給与平均"
-> FROM tbl_employee;
+-------------+
| 給与平均 |
+-------------+
| 239800.0000 |
+-------------+
1 row in set (0.003 sec)

②人件費の合計を求める
MariaDB [company]> SELECT SUM(basic_salary) FROM tbl_employee;
+-------------------+
| SUM(basic_salary) |
+-------------------+
| 1199000 |
+-------------------+
1 row in set (0.000 sec)

③最小値を求める
MariaDB [company]> SELECT MIN(basic_salary) FROM tbl_employee;
+-------------------+
| MIN(basic_salary) |
+-------------------+
| 200000 |
+-------------------+
1 row in set (0.001 sec)

④収録されているデータの数(行数)を数える
MariaDB [company]> SELECT COUNT() FROM tbl_employee;
+----------+
| COUNT(
) |
+----------+
| 5 |
+----------+
1 row in set (0.000 sec)

⑤④では、NULL値が入ったデータ(post_codeの中にNULLがある)を含んでいるので、それを除外するには、
MariaDB [company]> SELECT COUNT(post_code) FROM tbl_employee;
+------------------+
| COUNT(post_code) |
+------------------+
| 3 |
+------------------+
1 row in set (0.000 sec)

⑥ようわからん例文
MariaDB [company]> SELECT name,basic_salary,MAX(basic_salary)-basic_salary FROM tbl_employee;
+----------+--------------+--------------------------------+
| name | basic_salary | MAX(basic_salary)-basic_salary |
+----------+--------------+--------------------------------+
| 伊藤英樹 | 200000 | 90000 |
+----------+--------------+--------------------------------+
1 row in set (0.001 sec)

<データやテーブルとは全く関係のない情報を参照する>
①円周率
MariaDB [company]> SELECT PI();
+----------+
| PI() |
+----------+
| 3.141593 |
+----------+
1 row in set (0.001 sec)

②SQLサーバーのバージョンを表示
MariaDB [company]> SELECT VERSION();
+----------------+
| VERSION() |
+----------------+
| 10.5.0-MariaDB |
+----------------+
1 row in set (0.000 sec)

③現在使用しているDBの表示
MariaDB [company]> SELECT DATABASE();
+------------+
| DATABASE() |
+------------+
| company |
+------------+
1 row in set (0.000 sec)

④現在ログインしているユーザーの表示
MariaDB [company]> SELECT USER();
+----------------+
| USER() |
+----------------+
| root@localhost |
+----------------+
1 row in set (0.001 sec)

⑤()内に入力した文字は何の文字コードを使っているのか検索・表示できる
MariaDB [company]> SELECT CHARSET("もじもじ");
+---------------------+
| CHARSET("もじもじ") |
+---------------------+
| cp932 |←cp932はSHIFT-JISを表す
+---------------------+
1 row in set (0.001 sec)

<文字列に関する関数>
①2つの項目を結合し、同じ枠内に表示する
MariaDB [company]> SELECT CONCAT(name, blood) FROM tbl_employee;
+---------------------+
| CONCAT(name, blood) |
+---------------------+
| 伊藤英樹A |
| 山本大樹AB |
| 中村千佳B |
| 小林谷雄O |
| 斎藤美緒A |
+---------------------+
5 rows in set (0.001 sec)

②右から何番目の文字までを表示する
MariaDB [company]> SELECT RIGHT(name,3) FROM tbl_employee;
+---------------+
| RIGHT(name,3) |←右から3番目を指定している
+---------------+
| 藤英樹 |
| 本大樹 |
| 村千佳 |
| 林谷雄 |
| 藤美緒 |
+---------------+
5 rows in set (0.001 sec)

③左から何番目の文字までを表示する
MariaDB [company]> SELECT LEFT(name,3) FROM tbl_employee;
+--------------+
| LEFT(name,3) |
+--------------+
| 伊藤英 |
| 山本大 |
| 中村千 |
| 小林谷 |
| 斎藤美 |
+--------------+
5 rows in set (0.000 sec)

④n番目からr個の文字を取り出す
MariaDB [company]> SELECT SUBSTRING(name,3,1) FROM tbl_employee;
+---------------------+
| SUBSTRING(name,3,1) |
+---------------------+
| 英 |
| 大 |
| 千 |
| 谷 |
| 美 |
+---------------------+
5 rows in set (0.001 sec)

⑤逆順に表示
MariaDB [company]> SELECT REVERSE(name) FROM tbl_employee WHERE code =101;
+---------------+
| REVERSE(name) |
+---------------+
| 樹英藤伊 |
+---------------+
1 row in set (0.000 sec)

<グループ化>
①部門ごとに給与平均を出す

MariaDB [company]> SELECT code, dpt_code, AVG(basic_salary)
-> FROM
-> tbl_employee
-> GROUP BY

-> dpt_code; ←ここでグループ分けの基準をdpt_code(部門コード)に指定している
+------+----------+-------------------+
| code | dpt_code | AVG(basic_salary) |
+------+----------+-------------------+
| 101 | 10 | 217500.0000 |
| 102 | 20 | 250000.0000 |
| 104 | 30 | 257000.0000 |
+------+----------+-------------------+
3 rows in set (0.001 sec)

MariaDB [company]> SELECT code,dpt_code,basic_salary
-> FROM
-> tbl_employee;
+------+----------+--------------+
| code | dpt_code | basic_salary |
+------+----------+--------------+
| 101 | 10 | 200000 |
| 102 | 20 | 250000 |
| 103 | 10 | 235000 |
| 104 | 30 | 224000 |
| 105 | 30 | 290000 |
+------+----------+--------------+
5 rows in set (0.000 sec)

②worldデータベースのcityテーブルから、国の人口が1億人以上の国を抽出する
MariaDB [world]> SELECT
-> CountryCode,
-> SUM(Population)
-> FROM
-> city
-> GROUP BY
-> CountryCode
-> HAVING SUM(Population) >= 100000000
-> ORDER BY SUM(Population) DESC;
+-------------+-----------------+
| CountryCode | SUM(Population) |
+-------------+-----------------+
| CHN | 175953614 |
| IND | 123298526 |
+-------------+-----------------+
2 rows in set (0.006 sec)


①部署コードを部署名に変換して表示する

MariaDB [company]> SELECT
-> CASE dpt_code
-> WHEN 10 THEN "総務部" ←部署コードが10なら総務部と表示
-> WHEN 20 THEN "営業部" ←部署コードが20なら営業部と
-> ELSE "開発部" ←それ以外なら開発部と
-> END AS post_name
-> FROM
-> tbl_employee;
+-----------+
| post_name |
+-----------+
| 総務部 |
| 総務部 |
| 営業部 |
| 開発部 |
| 開発部 |
+-----------+
5 rows in set (0.001 sec)

上記の書き方はJavaでいうSwitch文に近い書き方。
単純CASE式とも呼ばれる。

(if文に近い書き方)
MariaDB [company]> SELECT
-> CASE
-> WHEN dpt_code = 10 THEN "総務部"
-> WHEN dpt_code = 20 THEN "営業部"
-> ELSE "開発部"
-> END AS post_name
-> FROM tbl_employee;
+-----------+
| post_name |
+-----------+
| 総務部 |
| 総務部 |
| 営業部 |
| 開発部 |
| 開発部 |
+-----------+
5 rows in set (0.000 sec)

②worldDBのcityテーブルを100行取得し、
 人口ごとに都市の規模を振り分け、一覧表示する
MariaDB [world]> SELECT
-> Name AS "都市名",
-> CASE
-> WHEN Population >= 1000000 THEN "大都市"
-> WHEN Population >= 100000 THEN "都市"
-> WHEN Population >= 30000 THEN "市"
-> ELSE "町"
-> END AS "都市の規模"
-> FROM
-> city LIMIT 100;

・・・④へ続く

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

XAMPPのmysqlがError: MySQL shutdown unexpectedly.で立ち上がらなくなった時の対処方法

XAMPPのmysqlが以下のようなエラーを表示して動かなくなった。
ポートがコンフリクトしているように見えるので、利用ポートを変えてみたり、明示的にmysqlをシャットダウンしてみたり、ibdataとib_logfileを削除してから再起動を試みたがなおらず・・・

16:59:23  [mysql]   Error: MySQL shutdown unexpectedly.
16:59:23  [mysql]   This may be due to a blocked port, missing dependencies, 
16:59:23  [mysql]   improper privileges, a crash, or a shutdown by another method.
16:59:23  [mysql]   Press the Logs button to view error logs and check
16:59:23  [mysql]   the Windows Event Viewer for more clues
16:59:23  [mysql]   If you need more help, copy and post this
16:59:23  [mysql]   entire log window on the forums
2020-02-25 16:59:22 0 [Note] InnoDB: Mutexes and rw_locks use Windows interlocked functions
2020-02-25 16:59:22 0 [Note] InnoDB: Uses event mutexes
2020-02-25 16:59:22 0 [Note] InnoDB: Compressed tables use zlib 1.2.11
2020-02-25 16:59:22 0 [Note] InnoDB: Number of pools: 1
2020-02-25 16:59:22 0 [Note] InnoDB: Using SSE2 crc32 instructions
2020-02-25 16:59:22 0 [Note] InnoDB: Initializing buffer pool, total size = 16M, instances = 1, chunk size = 16M
2020-02-25 16:59:22 0 [Note] InnoDB: Completed initialization of buffer pool
2020-02-25 16:59:22 0 [Note] InnoDB: 128 out of 128 rollback segments are active.
2020-02-25 16:59:22 0 [Note] InnoDB: Creating shared tablespace for temporary tables
2020-02-25 16:59:22 0 [Note] InnoDB: Setting file 'C:\xampp\mysql\data\ibtmp1' size to 12 MB. Physically writing the file full; Please wait ...
2020-02-25 16:59:22 0 [Note] InnoDB: File 'C:\xampp\mysql\data\ibtmp1' size is now 12 MB.
2020-02-25 16:59:22 0 [Note] InnoDB: Waiting for purge to start
2020-02-25 16:59:22 0 [Note] InnoDB: 10.4.11 started; log sequence number 47082; transaction id 9
2020-02-25 16:59:22 0 [Note] InnoDB: Loading buffer pool(s) from C:\xampp\mysql\data\ib_buffer_pool
2020-02-25 16:59:22 0 [Note] Plugin 'FEEDBACK' is disabled.
2020-02-25 16:59:22 0 [Note] InnoDB: Buffer pool(s) load completed at 200225 16:59:22
2020-02-25 16:59:22 0 [Note] Server socket created on IP: '::'.

【対処方法:再インストールに次ぐ最終手段】
注意:自分が作ったデータベースのデータは消えるのでバックアップを取っておくなどしておいてください

xampp\mysql\backupフォルダにあるフォルダとファイルをCtrl+cですべてコピーし
そのデータをxampp\mysql\dataディレクトリに上書きでペースト(Ctrl+v)する。

再度XAMPPからMySQLをStartさせると動き始める(場合がある)。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

メモ④-カラム名の変更とテーブルが異なるカラム同士の結合-

MariaDBでは、表の項目名を自由に設定し表示することができる。

【カラム名を変更しての表示】
例えば、以下のような表示。
MariaDB [company]> SELECT
-> emp.code AS emp_code,
-> emp.name AS emp_name,
-> post.code AS post_code,
-> post.name AS post_name
-> FROM
-> tbl_employee AS emp
-> LEFT OUTER JOIN tbl_post AS post
-> ON emp.post_code = post.code
-> ORDER BY
-> emp.code
-> ;
+----------+----------+-----------+-----------+
| emp_code | emp_name | post_code | post_name |
+----------+----------+-----------+-----------+
| 101 | 伊藤英樹 | 1 | 部長 |
| 102 | 山本大樹 | 3 | 課長 |
| 103 | 中村千佳 | 4 | 係長 |
| 104 | 小林谷雄 | NULL | NULL |
| 105 | 斎藤美緒 | NULL | NULL |
+----------+----------+-----------+-----------+
5 rows in set (0.000 sec)

このように書き換えることで、
カラム名を変更して表示することができる。

MariaDB [company]> SELECT
-> emp.code AS "社員コード",
-> emp.name AS "社員名",
-> post.code AS "役職コード",
-> post.name AS "役職名"
-> FROM
-> tbl_employee AS emp
-> LEFT OUTER JOIN tbl_post AS post
-> ON emp.post_code = post.code
-> ORDER BY
-> emp.code
-> ;
+------------+----------+------------+--------+
| 社員コード | 社員名 | 役職コード | 役職名 |
+------------+----------+------------+--------+
| 101 | 伊藤英樹 | 1 | 部長 |
| 102 | 山本大樹 | 3 | 課長 |
| 103 | 中村千佳 | 4 | 係長 |
| 104 | 小林谷雄 | NULL | NULL |
| 105 | 斎藤美緒 | NULL | NULL |
+------------+----------+------------+--------+
5 rows in set (0.002 sec)

【テーブルが異なるカラム同士を結合して表示する】
worldデータベースに接続。
countryとcountrylanguageを結合し、英語圏の国の国名と言語名を一覧で表示されるようにする

MariaDB [world]> SELECT
-> Name AS "国名",
-> Language AS "言語名"
-> FROM
-> country,countrylanguage
-> WHERE
-> (Language = "English")
-> AND
-> (Code = CountryCode)
-> ORDER BY
-> Code;

・・・⑤に続く

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

環境変数でJavaとMySQLのPATH を通してみる【Windows版】

環境設定でPath を通す

環境変数で「Pathを通す」とは一体何をしているのか、また設定のやり方について説明していきます:grinning:

今回の記事:point_down_tone2:

  • Pathとは?
  • Pathを通す意味
  • システム環境変数でのPathの通し方
  • Pathが通ったかどうか確認

Pathとは?

まずPathとは何かについてです。
Pathとはそのアプリケーションの場所を示すアドレスみたいなものです。
例を見てみましょう。

例:Java
そのPCのjdkをインストールした場所を示すのものがPathです。
「C:\Program Files\Java\jdk1.X.X_XXX\bin」

例:MySQL
「mysql.exe」というのがMySQLのアプリケーションなので、それの場所を指示している「C:\Program Files\MySQL\MySQL Server 8.0\bin」がPathになります。
image.png

Pathを通す意味

Pathとはアプリケーションの場所を示すものだとわかりました。
その「Pathを通す=Pathを設定する」ことによってパソコンに特定のプログラムを「プログラム名だけで実行できるようにして」と頼んでることになります。

システム環境変数でのPathの通し方

早速システム環境変数でPathを通していきましょう!

フォルダーのPCを右クリック→プロパティ(R)をクリック
1.png

システムのページに行くのでシステム詳細設定を押します。
image.png

システムのプロパティが出てくるので、環境変数(N)をクリック
コメント 2020-02-28 091010.png

そこでPathを選択し→編集(E)
コメント 2020-02-28 091108.png

するとPathを入力する画面になります。
ここにPath(C:\Program Files\~)を入力しOKで完了です。
コメント 2020-02-28 091633.png

Pathが通ったかどうか確認

Pathが通ったかどうかの確認はコマンドプロンプトでできます。

例:Java
「javac -version」と打ってみましょう。
image.png

上記のように帰ってくれば成功です。

例:MySQL
「mysql --version」と打ってみましょう。
image.png

上記のように帰ってくれば成功です。

「'~' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。」とでてきた場合はPathがしっかり通っていませんのでご注意ください:bangbang:

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

LIMIT句を使用してページネーションに必要な件数分を取得する図

LIMIT 取得開始行, 取得件数;

取得開始行」は0から始まる数値を指定するため、仮に11〜15までの5件分を取得したい場合は以下のような指定になる。

LIMIT 10, 5;

4ページ目のデータ行を7件分取得する場合のSQL

SELECT * FROM members LIMIT 21,7;

仮にこの取得したパラメータ「4」から「21」を指定するための逆算を行う。
そのためには、過去のページ数に表示件数分を掛ける必要がある。

// offsetとは基準値から差分を相殺した値のこと
$offset = ($page - 1) * 7;

これで各ページごとに、毎回必要な件数分のデータだけを取得することができるようになる。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

MySQLで時差を補正したときのメモ

米国山岳部標準時(MST)で記録されてしまったテーブルの1項目を、SQLで日本標準時(JST)に書き替えたときの、ほぼ自分用メモ。
MSTとJSTの時差である16時間を足すことになる。

SQLコマンド

  • 日時フィールドがDateTime型の場合
UPDATE t_rawdata SET TargetTime = (TargetTime + INTERVAL 16 HOUR) WHERE ID = xxx;
  • 日時フィールドがunsigned int型というかtime_t型というか、要はUNIX time(1970年1月1日午前0時0分0秒からの経過秒数)で記録されている場合
UPDATE t_rawdata SET TargetTime = (TargetTime + 16 * 60 * 60) WHERE ID = xxx;
  • 確認(日時フィールドがUNIX timeが記録されている場合)
SELECT
  ID,
  yyy,
  from_unixtime(min(TargetTime), "%Y/%m/%d %H:%i:%S") as start_time,
  from_unixtime(max(TargetTime), "%Y/%m/%d %H:%i:%S") as end_time
FROM t_rawdata
WHERE ID = xxx
GROUP BY yyy ORDER BY end_time;
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

MySQLで時差を補正(時刻の加算更新)したときのメモ

米国山岳部標準時(MST)で記録されてしまったテーブルの1項目を、SQLで日本標準時(JST)に書き替えたときの、ほぼ自分用メモ。
MSTとJSTの時差である16時間を足すことになる。

SQLコマンド

  • 日時フィールドがDateTime型の場合
UPDATE t_rawdata SET TargetTime = (TargetTime + INTERVAL 16 HOUR) WHERE ID = xxx;
  • 日時フィールドがunsigned int型というかtime_t型というか、要はUNIX time(協定世界時1970年1月1日からの経過秒数)で記録されている場合
UPDATE t_rawdata SET TargetTime = (TargetTime + 16 * 60 * 60) WHERE ID = xxx;

確認

日時フィールドが UNIX time で記録されている場合、from_unixtime()で整形できる。

SELECT
  ID,
  yyy,
  from_unixtime(min(TargetTime), "%Y/%m/%d %H:%i:%S") as start_time,
  from_unixtime(max(TargetTime), "%Y/%m/%d %H:%i:%S") as end_time
FROM t_rawdata
WHERE ID = xxx
GROUP BY yyy ORDER BY end_time;
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む