ブログの説明

学校に通わないで学んだことを記しています。間違っているところが何かありましたらご指摘下さると幸いです。コメントに対する返信が遅れる可能性があります。その場合は申し訳ありません。

このブログではサイドバーに広告を表示しています。このブログ内の投稿記事を検索するには右上の拡大鏡のアイコンを、アーカイブやラベル付けから投稿記事を閲覧するには左上の三重線のアイコンをクリックして下さい。

数式の表示にはMathJaxを利用させていただいています。数式の表示のためにJavaScriptが有効である必要があります。そうでない場合、訳の分からないLatexのコードが表示されます。幾何学図形やチャートの表示にはHTML5 CanvasやGoogle Chartを使用しています。その表示のためにもJavaScriptが有効である必要があります。

MariaDBかMySQLでmysqlシェルを用いてテーブル作成

mysqlシェルを起動

mysqlシェルを起動。-uはユーザーを指定する。そのユーザーにパスワードを設定してある場合は-pを指定する必要がある。

$ mysql -u testuser -p
Enter password:
(中略)
MariaDB [(none)]>

データベースを新規作成する。SQLなので構文の終わりに;(セミコロン)を忘れずに。

MariaDB [(none)]> CREATE DATABASE mydatabase;
Query OK, 1 row affected (0.000 sec)

SQLは大文字である必要はない。

データベースの一覧を表示

存在するデータベースの一覧を表示する。

MariaDB [(none)]> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mydatabase         |
| mysql              |
| performance_schema |
+--------------------+
5 rows in set (0.000 sec)

データベースを削除するにはDROP データベース名;と入力する。

アクセス対象にするデータベースを選択

USE構文を用いて特定のデータベースを使用することをシェルに伝える。

MariaDB [(none)]> USE mydatabase;
Database changed
MariaDB [mydatabase]>

[(none)]が[指定したデータベース名]に変わる。

列(カラム)を定義してテーブルを作成

CREATE TABLE構文を用い、データを記録する形式となるテーブルを作成する。

MariaDB [mydatabase]> CREATE TABLE persons (
    -> id INT UNSIGNED NOT NULL AUTO_INCREMENT,
    -> p_name VARCHAR(20) NOT NULL,
    -> f_name VARCHAR(20) NOT NULL,
    -> sex VARCHAR(6),
    -> birth DATE,
    -> hight DECIMAL(4,1),
    -> weight DECIMAL(4,1),
    -> PRIMARY KEY (id)
    -> );

CREATE TABLE構文はだいたい次のような書式となる。

CREATE TABLE テーブル名 (
列名 データ型 修飾子,
列名 データ型(制限数) 修飾子,
列名 データ型,
PRIMARY KEY (列名, 列名)
);

テーブル名、列名、データ型は必須。他は必要に応じて。CREATE TABLE構文はSQLなので構文の終わりには;(セミコロン)が必要。

ここではpersonsという名前のテーブルを作ってみた。テーブルを構成する列(カラム)は、id, p_name, f_name, sex, birth, hight, weightとした。

idのデータ型はINT型。INTはもっとも一般的な整数型。UNSIGNEDは負数を無効にする。NOT NULLを指定することによって空欄を示すNULL値の格納を禁じた。ただしNULL値でない空欄は可能。AUTO_INCREMENTは番号を自動的に割り振るようにする指定。

p_nameとfimily_nameのデータ型は共にVARCHAR型にした。VARCHARは可変長の文字列を格納するのに適したデータ型。()内にその上限の字数を指定。ここでは20字を共に上限とした。NOT NULLによって共にNULL値の格納を禁じた。

sexのデータ型もVARCHAR型。()内に最大文字数6を指定した。

birthdayのデータ型はDATA型。DATA型では日付を'yyyy-mm-dd'(例えば'2021-01-25')という書式で格納できる。

heightとweightのデータ型は共にDECIMAL型。DECIMALは固定小数点数を格納できるデータ型。オプションとして()を付け、有効な全桁数を4、小数点以下の有効な桁数を1と指定した。ただし全桁数には負数を示すネガティブ符号(-)を含まない。

PRIMARY KEYは主キーのこと。主キーを指定した列にはデータの重複(同じデータが一つ以上あること)が許されなくなる。()内にidと指定することによってidを主キーに指定した。

テーブルを削除

テーブルはDROP TABLE テーブル名;によって削除することができる。

テーブルへ行(レコード)を挿入

リレーショナル・データベースではデータを行(レコード)単位で追加する。テーブルに行(レコード)挿入するためにはINSERT INTO構文を用いる。VALUES句以降に挿入するデータを具体的に記述する。挿入する行(レコード)はデータごとに,(カンマ)で区切って行ごとに()(丸括弧)でまとめる。

MariaDB [mydatabase]> INSERT INTO persons VALUES
    -> (id,'Taro','Suzuki','male','1995-01-10',168.5,65),
    -> (id,'Hanako','Yamada','female','1998-06-20',155.5,43.5);
Query OK, 2 rows affected (0.033 sec)
Records: 2  Duplicates: 0  Warnings: 0

INSERT INTO構文の書式はだいたい次のようになる。INSERT INTO構文はSQLなのでその終わりには;(セミコロン)が必要。

INSERT INTO テーブル名 VALUES
(データ1,データ2,...),
(データ1,データ2,...);

フィールドを特定してデータを挿入する場合には、挿入対象となる列名をテーブル名の引数として()で挟んで明示する必要がある。例えばsexとbirthdayが不明であるときには次のように記述する。sexとbirthdayにはそれぞれNULL値が格納される。

MariaDB [mydatabase]> INSERT INTO persons
    -> (id,p_name,f_name,height,weight)
    -> VALUES (id,'Isamu','Tanaka',175.6,73.2);
Query OK, 1 row affected (0.028 sec)

テーブルから行を取得して表示

挿入したデータを表示するにはSELECT構文を用いる。SELECT後の*(アスタリスク)は全ての列を指す。FROM句にはテーブル名を指定する。

次のSELECT構文は、personsテーブルから全ての列を取得せよという意味。

MariaDB [mydatabase]> SELECT * FROM persons;
+----+--------+--------+--------+------------+--------+--------+
| id | p_name | f_name | sex    | birthday   | height | weight |
+----+--------+--------+--------+------------+--------+--------+
|  1 | Taro   | Suzuki | male   | 1995-01-10 |  168.5 |     65 |
|  2 | Hanako | Yamada | female | 1998-06-20 |  155.5 |   43.5 |
|  3 | Isamu  | Tanaka | NULL   | NULL       |  175.6 |   73.2 |
+----+--------+--------+--------+------------+--------+--------+
3 rows in set (0.000 sec)

SELECT構文はSQLなのでその終わりに;(セミコロン)が必要。

特定の列を選んで取得して表示することもできる。次のSELECT構文は、personsテーブルからp_nameとbirthdayという列(カラム)を取得せよという意味。

MariaDB [mydatabase]> SELECT p_name,birthday FROM persons;
+--------+------------+
| p_name | birthday   |
+--------+------------+
| Taro   | 1995-01-10 |
| Hanako | 1998-06-20 |
| Isamu  | NULL       |
+--------+------------+
3 rows in set (0.000 sec)

SELECT構文についてはまたの機会により詳しく学ぶつもり。

データを変更

データを更新するにはUPDATE構文を用いる。SET句に列名と新規のデータ、WHERE句に列名と既存のデータを指定する。

MariaDB [mydatabase]> UPDATE persons
    -> SET sex='male'
    -> WHERE sex is NULL;
Query OK, 1 row affected (0.044 sec)
Rows matched: 1  Changed: 1  Warnings: 0

MariaDB [mydatabase]> SELECT p_name,sex FROM persons;
+--------+--------+
| p_name | sex    |
+--------+--------+
| Taro   | male   |
| Hanako | female |
| Isamu  | male   |
+--------+--------+
3 rows in set (0.000 sec)

MariaDB [mydatabase]> UPDATE persons
    -> SET birthday='2001-12-25'
    -> WHERE birthday is NULL;
Query OK, 1 row affected (0.033 sec)
Rows matched: 1  Changed: 1  Warnings: 0

MariaDB [mydatabase]> SELECT p_name,birthday FROM persons;
+--------+------------+
| p_name | birthday   |
+--------+------------+
| Taro   | 1995-01-10 |
| Hanako | 1998-06-20 |
| Isamu  | 2001-12-25 |
+--------+------------+
3 rows in set (0.000 sec)

UPDATE構文はSQLの構文なのでその終わりに;(セミコロン)が必要。

maleを男に、femaleを女に置き換えてみる。

MariaDB [mydatabase]> UPDATE persons
    -> SET sex='男'
    -> WHERE sex='male';
Query OK, 2 rows affected (0.052 sec)
Rows matched: 2  Changed: 2  Warnings: 0

MariaDB [mydatabase]> SELECT p_name,sex FROM persons;
+--------+--------+
| p_name | sex    |
+--------+--------+
| Taro   | 男     |
| Hanako | female |
| Isamu  | 男     |
+--------+--------+
3 rows in set (0.000 sec)

MariaDB [mydatabase]> UPDATE persons
    -> SET sex='女' WHERE sex='female';
Query OK, 1 row affected (0.030 sec)
Rows matched: 1  Changed: 1  Warnings: 0

MariaDB [mydatabase]> SELECT p_name,sex FROM persons;
+--------+------+
| p_name | sex  |
+--------+------+
| Taro   | 男   |
| Hanako | 女   |
| Isamu  | 男   |
+--------+------+
3 rows in set (0.000 sec)

UPDATA構文の基本的な書式は次のようになる。

UPDATE テーブル名
SET 列名=新規データ
WHERE 列名=既存データ;

数値型以外のデータ型では'(一重引用符)でデータを挟む必要がある。WHERE句でNULLを指定するときには=ではなくisを使うことに要注意。つまり、列名 is NULL;のように。

もちろんWHERE句には条件式や函数を指定することができる。

CSVファイルからデータを取り込む

CSV(comma-separated values)ファイルとはカンマと改行で区切られたテキスト形式のデータを持つファイル。

Microsoft ExcelやOracle OpenOffice CalcやLibreOffice Calcなどの表計算アプリにはそのデータをCSVファイル形式で保存することができる機能があるはず。CSVファイルを介せばそれらの表計算アプリのデータをMariaDBに取り込むことができる。

とあるCSVファイルからMariaDBへそのテキスト・データを取り込んでみる。

例えば次のような内容のCSVファイルpersons.csvが/home/fooディレクトリ内にあったとする。

足利,直美,女,1997-10-11,164.7,55
大岩,舞,女,2000-03-23,158.4,43.5
木下,誠一,男,1988-07-15,168.5,65.5
伊藤,エリナ,女,2003-09-29,162,50.5

このデータを読み込むにはLOAD DATA INFILE構文を用いる。INTO TABLE句に挿入先のテーブル名を指定し、FIELDS TERMINATED BY句にはフィールドの終わり(区切り)を示すカンマを指定する。そして()に挟んで挿入する対象となる列名の順番を指定し、SET句に列名のidにNULLを指定。

MariaDB [mydatabase]> LOAD DATA
    -> INFILE '/home/foo/persons.csv'
    -> INTO TABLE persons
    -> FIELDS TERMINATED BY ','
    -> (p_name,f_name,sex,birthday,height,weight)
    -> SET id = NULL;
Query OK, 4 rows affected (0.053 sec)                
Records: 4  Deleted: 0  Skipped: 0  Warnings: 0

MariaDB [mydatabase]> SELECT * FROM persons;
+----+--------+-----------+------+------------+--------+--------+
| id | p_name | f_name    | sex  | birthday   | height | weight |
+----+--------+-----------+------+------------+--------+--------+
|  1 | Taro   | Suzuki    | 男   | 1995-01-10 |  168.5 |     65 |
|  2 | Hanako | Yamada    | 女   | 1998-06-20 |  155.5 |   43.5 |
|  3 | Isamu  | Tanaka    | 男   | 2001-12-25 |  175.6 |   73.2 |
|  4 | 足利   | 直美      | 女   | 1997-10-11 |  164.7 |     55 |
|  5 | 大岩   | 舞        | 女   | 2000-03-23 |  158.4 |   43.5 |
|  6 | 木下   | 誠一      | 男   | 1988-07-15 |  168.5 |   65.5 |
|  7 | 伊藤   | エリナ    | 女   | 2003-09-29 |    162 |   50.5 |
+----+--------+-----------+------+------------+--------+--------+
7 rows in set (0.000 sec)

LOAD DATA INFILE構文はSQLなのでその構文の終わりに;(セミコロン)が必要。

id列にはテーブルを作成する際にAUTO_INCREMENTを指定してあるので自動的に番号が振られるようになっている。この場合、CSVファイルを読み込むにはSET句にid = NULLと指定する必要がある。

XMLファイルからデータを取り込む方法についてはまたの機会に。

テーブルの列名を変更

列名を日本語に変更してみる。

列名を変更するにはALTER TABLE構文を用いる。CHANGE句に古い列名と新しい列名とそのデータ型を指定する。

MariaDB [mydatabase]> ALTER TABLE persons
    -> CHANGE p_name 名 VARCHAR(20) NOT NULL;
Query OK, 0 rows affected (0.359 sec)
Records: 0  Duplicates: 0  Warnings: 0

MariaDB [mydatabase]> SELECT * FROM persons;
+----+--------+-----------+------+------------+--------+--------+
| id | 名     | f_name    | sex  | birthday   | height | weight |
+----+--------+-----------+------+------------+--------+--------+
|  1 | Taro   | Suzuki    | 男   | 1995-01-10 |  168.5 |     65 |
|  2 | Hanako | Yamada    | 女   | 1998-06-20 |  155.5 |   43.5 |
|  3 | Isamu  | Tanaka    | 男   | 2001-12-25 |  175.6 |   73.2 |
|  4 | 足利   | 直美      | 女   | 1997-10-11 |  164.7 |     55 |
|  5 | 大岩   | 舞        | 女   | 2000-03-23 |  158.4 |   43.5 |
|  6 | 木下   | 誠一      | 男   | 1988-07-15 |  168.5 |   65.5 |
|  7 | 伊藤   | エリナ    | 女   | 2003-09-29 |    162 |   50.5 |
+----+--------+-----------+------+------------+--------+--------+
7 rows in set (0.000 sec)

MariaDB [mydatabase]> ALTER TABLE persons
    -> CHANGE f_name 姓 VARCHAR(20) NOT NULL;
Query OK, 0 rows affected (0.459 sec)
Records: 0  Duplicates: 0  Warnings: 0

MariaDB [mydatabase]> SELECT * FROM persons;
+----+--------+-----------+------+------------+--------+--------+
| id | 名     | 姓        | sex  | birthday   | height | weight |
+----+--------+-----------+------+------------+--------+--------+
|  1 | Taro   | Suzuki    | 男   | 1995-01-10 |  168.5 |     65 |
|  2 | Hanako | Yamada    | 女   | 1998-06-20 |  155.5 |   43.5 |
|  3 | Isamu  | Tanaka    | 男   | 2001-12-25 |  175.6 |   73.2 |
|  4 | 足利   | 直美      | 女   | 1997-10-11 |  164.7 |     55 |
|  5 | 大岩   | 舞        | 女   | 2000-03-23 |  158.4 |   43.5 |
|  6 | 木下   | 誠一      | 男   | 1988-07-15 |  168.5 |   65.5 |
|  7 | 伊藤   | エリナ    | 女   | 2003-09-29 |    162 |   50.5 |
+----+--------+-----------+------+------------+--------+--------+
7 rows in set (0.000 sec)

MariaDB [mydatabase]> ALTER TABLE persons
    -> CHANGE sex 性別 VARCHAR(1);
Query OK, 7 rows affected (0.551 sec)              
Records: 7  Duplicates: 0  Warnings: 0

MariaDB [mydatabase]> SELECT * FROM persons;
+----+--------+-----------+--------+------------+--------+--------+
| id | 名     | 姓        | 性別   | birthday   | height | weight |
+----+--------+-----------+--------+------------+--------+--------+
|  1 | Taro   | Suzuki    | 男     | 1995-01-10 |  168.5 |     65 |
|  2 | Hanako | Yamada    | 女     | 1998-06-20 |  155.5 |   43.5 |
|  3 | Isamu  | Tanaka    | 男     | 2001-12-25 |  175.6 |   73.2 |
|  4 | 足利   | 直美      | 女     | 1997-10-11 |  164.7 |     55 |
|  5 | 大岩   | 舞        | 女     | 2000-03-23 |  158.4 |   43.5 |
|  6 | 木下   | 誠一      | 男     | 1988-07-15 |  168.5 |   65.5 |
|  7 | 伊藤   | エリナ    | 女     | 2003-09-29 |    162 |   50.5 |
+----+--------+-----------+--------+------------+--------+--------+
7 rows in set (0.001 sec)

ALTER TABLE構文はSQLなのでその構文の終わりに;(セミコロン)が必要。

すべての列名についてこれを行った結果が次のとおり。

MariaDB [mydatabase]> SELECT * FROM persons;
+----+--------+-----------+--------+------------+--------+--------+
| id | 名     | 姓        | 性別   | 誕生日     | 身長   | 体重   |
+----+--------+-----------+--------+------------+--------+--------+
|  1 | Taro   | Suzuki    | 男     | 1995-01-10 |  168.5 |     65 |
|  2 | Hanako | Yamada    | 女     | 1998-06-20 |  155.5 |   43.5 |
|  3 | Isamu  | Tanaka    | 男     | 2001-12-25 |  175.6 |   73.2 |
|  4 | 足利   | 直美      | 女     | 1997-10-11 |  164.7 |     55 |
|  5 | 大岩   | 舞        | 女     | 2000-03-23 |  158.4 |   43.5 |
|  6 | 木下   | 誠一      | 男     | 1988-07-15 |  168.5 |   65.5 |
|  7 | 伊藤   | エリナ    | 女     | 2003-09-29 |    162 |   50.5 |
+----+--------+-----------+--------+------------+--------+--------+
7 rows in set (0.000 sec)

既存のテーブルの列名を変更するためのALTER TABLE構文の基本的な書式はだいたい次のとおり。SQLなので構文の終わりに;(セミコロン)が必要。

ALTER TABLE テーブル名
CHANGE 古い列名 新しい列名 データ型名;

ちなみに、列のデータ型だけを変更するにはCHANGE句の代わりにMODIFY句を用いる。その書式はだいたい次のようになる。

ALTER TABLE テーブル名
MODIFY 列名 新しいデータ型名;

NOT NULLやAUTO_INCREMENTなどの修飾子が必要なら、CHANGE句でそれらも一緒に指定する必要があることに要注意。

行(レコード)を削除

行(レコード)を削除するにはDELETE構文を使う。FROM句に対象となるテーブル名を指定し、WHERE句に削除対象とする行(レコード)を特定する条件を指定する。IN句を指定すると複数指定することができる。ここではidの番号1,2,3をIN句に指定し、3つの行を同時に削除してみた。

MariaDB [mydatabase]> DELETE FROM persons
    -> WHERE id IN (1,2,3);
Query OK, 3 rows affected (0.047 sec)

MariaDB [mydatabase]> SELECT * FROM persons;
+----+--------+-----------+--------+------------+--------+--------+
| id | 名     | 姓        | 性別   | 誕生日     | 身長   | 体重   |
+----+--------+-----------+--------+------------+--------+--------+
|  4 | 足利   | 直美      | 女     | 1997-10-11 |  164.7 |     55 |
|  5 | 大岩   | 舞        | 女     | 2000-03-23 |  158.4 |   43.5 |
|  6 | 木下   | 誠一      | 男     | 1988-07-15 |  168.5 |   65.5 |
|  7 | 伊藤   | エリナ    | 女     | 2003-09-29 |    162 |   50.5 |
+----+--------+-----------+--------+------------+--------+--------+
4 rows in set (0.000 sec)

DELETE構文はSQLなのでその文末には;(セミコロン)が必要。

次は、体重55未満の行をWHERE句の条件に指定して削除してみた。

MariaDB [mydatabase]> DELETE FROM persons
    -> WHERE 体重 < 55;
Query OK, 2 rows affected (0.037 sec)

MariaDB [mydatabase]> SELECT * FROM persons;
+----+--------+--------+--------+------------+--------+--------+
| id | 名     | 姓     | 性別   | 誕生日     | 身長   | 体重   |
+----+--------+--------+--------+------------+--------+--------+
|  4 | 足利   | 直美   | 女     | 1997-10-11 |  164.7 |     55 |
|  6 | 木下   | 誠一   | 男     | 1988-07-15 |  168.5 |   65.5 |
+----+--------+--------+--------+------------+--------+--------+
2 rows in set (0.000 sec)

DELETE構文の書式はだいたい次のとおり。

DELETE FROM テーブル名
WHERE 削除対象となる行を特定する条件式;

まとめ

テーブルの定義と作成
CREATE TABLE テーブル名 (列名1 データ型, 列名2 データ型, ...);
CREATE TABLE テーブル名 (列名1 データ型 NOT NULL, 列名2 データ型, ..., PRIMARY KEY (列名1)
NOT NULL
その列の空欄を禁じる。
AUTO_INCREMENT
その列に番号を自動的に振る。インデックスの自動生成。
PRIMARY KEY (列名)
()内の列名に主キーを定める。
INT
符号付きでは-2147483648から2147483647まで、符号なしでは0から4294967295の範囲を持つ整数を格納できるデータ型。
VARCHAR(最大文字数)
文字数が定まらない文字列(可変長の文字列)を格納するのに向いているデータ型。()内の最大文字数は0から65535文字までの範囲で指定できる。ただし文字コードにUTF-8を用いる場合には0から21844文字の範囲になる。
実際の使用文字数が定義した最大文字数に達しなくても記憶領域の無駄遣いにはならない。しかし追加情報を必要とするためにCHARと同じ文字数であっても各々のデータごとに1バイト大きくなってしまうことに要注意。
DATE
日付用のデータ型。'1000-01-01'から'9999-12-31'までの範囲をサポートしている。
ちなみに時間まで格納したければDATATIME型を用いる。タイムスタンプとしてその列を使いたい場合にはTIMESTAMP型がある。
DECIMAL
固定浮動小数点数用のデータ型。オプションとして括弧内に(全桁数,小数点以下の桁数)を指定できる。
DECやNOMERICやFIXEDはDECIMALの同義語。UNSIGNEDを指定すると負数が無効になる。
テーブルへの行(レコード)の挿入
INSERT INTO テーブル名 (列名1,列名2, ...) VALUES (データ1, データ2, ...);
列名はVALUESでのデータに対応している。数値型以外のデータは'(一重引用符)で挟む必要がある。
行(レコード)の参照・問い合わせ
SELECT 列名1,列名2, ... FROM テーブル名;
列名に*(アスタリスク)を指定すると列名全体を指定したことになる。
列名の変更
ALTER TABLE テーブル名 CHANGE 古い列名 新しい列名 そのデータ型;
NOT NULLやAUTO_INCREMENTなどが必要な場合はデータ型の後に指定する必要がある。
列のデータ型の変更
ALTER TABLE テーブル名 MODIFY 列名 新しいデータ型;
NOT NULLやAUTO_INCREMENTなどが必要な場合はデータ型の後に指定する必要がある。
CSVファイルからのデータの取り込み
LODA DATA INFILE 'パスとファイル名' INTO TABLE テーブル名;
LODA DATA INFILE 'パスとファイル名' INTO TABLE テーブル名 FIELDS TERMINATED BY ',' (列名1, 列名2, ...);
LODA DATA INFILE 'パスとファイル名' INTO TABLE テーブル名 FIELDS TERMINATED BY ',' (列名1, 列名2, ...) SET id = NULL;
行(レコード)の削除
DELETE FROM テーブル名 WHERE 削除対象の行を特定する条件式;
DELETE FROM テーブル名 WHERE id=1;
DELETE FROM テーブル名 WHERE id IN(1,2,3);

関連記事

コメント

このブログの人気の投稿

LATEXで数式:指数と順列などで使う添数・添字

10の補数と9の補数と2の補数と1の補数

Visual Studio 2019にはC++のためのフォームデザイナーがない件