湯LOG

主に自分用のメモ

SQL初心者のおぼえがき(1)

SQLとは

ウィキペディアより引用

SQL(エスキューエル英語 i [ˈɛs kjuː ˈɛl]、シークェル英語 i [ˈsiːkwəl]、シーケル)は、リレーショナルデータベース管理システム (RDBMS) において、データの操作や定義を行うためのデータベース言語(問い合わせ言語)である。
SQL - ウィキペディア
https://ja.wikipedia.org/wiki/SQL

つまるところ、アプリとかWEBサービスとかを作る際に、ユーザーの情報だとかを保持するために必要な「データベース」を操作するための言語ということですね。

データベースにも幾つか種類があるのですが、その中でもメジャーなMySQLを勉強しました。

勉強するにあたって、下記のサイトをもとに参考にしました。dotinstall.com

MySQLのインストール

まずはMySQLのインストールから。インストール手順、セキュリティ設定などは以下のサイトを参考に。qiita.com
今回はSQLの勉強がメインということで作業ユーザの設定などは行いません。

用語

データベース(DB)

特定のテーマに沿ったデータを集めて管理し、容易に検索・抽出などの再利用をできるようにしたもの。
データベースをコンピュータ上で管理するためのシステムをデータベース管理システム (Database Management System, DBMS) という。

テーブル

データベースにおける表のことで、ExelのSheetをイメージするといいと思います。
データベースの中にいくつかテーブルを作ることができるんですね。
Exelには無数の行列がありますが、一方でデータベースでのテーブルは所定の個数の列があり、行数は不定です。各行は特定の列の値で識別され、それを候補キーと呼びます。

フィールド

列。

レコード

各フィールドに対応するデータ。行。

データベースの操作

それでは、実際にMySQLの起動、操作に移っていきます。

データベースの作成

mysql> create database test_database;

ここではtest_databaseという名前のデータベースを作成します。
ちなみに「;」を忘れると以下のように入力待ちになります。(次の行でセミコロン打っても大丈夫)

mysql> create database test_database
    -> ;
作成したデータベースを見る
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| test               |
| test_database      |
+--------------------+
5 rows in set (0.00 sec)

こんな感じのでました。デフォルトでいくつか入ってるんですね。databasesは複数形なので注意です。

作成したデータベースを削除する
mysql> drop database test_database;

確認

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| test               |
+--------------------+
4 rows in set (0.01 sec)

簡単に消えてしまいました。これはこれで注意が必要そう。

作業データベースの変更
mysql> use test_database;
Database changed

テーブルの作成

create table [テーブル名](フィールド名 型, フィールド名 型, ・・・);
mysql> create table users(
    -> id int,
    -> name varchar(255),
    -> email varchar(255),
    -> password char(8)
    -> );

ここで、intは整数型、varchar(255)は255文字までの文字列、char(8)は8文字の文字列ということを指定します。
他にも、浮動小数点のdouble型、列挙型と言われるenum、文字列の長さがわからない場合のtextなどがあります。

mysql> show tables;
+-------------------------+
| Tables_in_test_database |
+-------------------------+
| users                   |
+-------------------------+
1 row in set (0.00 sec)
入力を必須にする
    -> id int not null,
自動連番
    -> id int not null auto_increment,
デフォルト値
    -> sex enum('male', 'female') default 'male',

索引(インデックス)

主キー:レコードを一意に特定するキー

    -> id int not null auto_increment primary key,

キー:普通の索引キー

    -> key score (score),

ユニークキー:重複した値が入ってきた時にエラーではじく

    -> email varchar(255) unique,

これらを基に、あらたに表を作成します。
ちなみに列挙型enumは、1が'male'、2が'female'を示します。

mysql> create table users(
    -> id int not null auto_increment primary key,
    -> name varchar(255),
    -> email varchar(255) unique,
    -> password char(8),
    -> score double,
    -> sex enum('male', 'female') default 'male',
    -> key score (score)
    -> );

テーブルの中身を確認

mysql> desc users;
+----------+-----------------------+------+-----+---------+----------------+
| Field    | Type                  | Null | Key | Default | Extra          |
+----------+-----------------------+------+-----+---------+----------------+
| id       | int(11)               | NO   | PRI | NULL    | auto_increment |
| name     | varchar(255)          | YES  |     | NULL    |                |
| email    | varchar(255)          | YES  | UNI | NULL    |                |
| password | char(8)               | YES  |     | NULL    |                |
| score    | double                | YES  | MUL | NULL    |                |
| sex      | enum('male','female') | YES  |     | male    |                |
+----------+-----------------------+------+-----+---------+----------------+
6 rows in set (0.01 sec)

幅が足りなくて見づらくなってしまいました。
が、ターミナル上では見やすく表示されるはずです。

レコードの挿入

対応する引数に値を代入し、レコードを作成します。

mysql> insert into users (name, email, password, score)
    -> values ('takuya', 'takuya@email.com', 'xxxx', 5.5);

データを抽出

挿入したレコードを表示させます。

mysql> select * from users;
+----+--------+------------------+----------+-------+------+
| id | name   | email            | password | score | sex  |
+----+--------+------------------+----------+-------+------+
|  1 | takuya | takuya@email.com | xxxx     |   5.5 | male |
+----+--------+------------------+----------+-------+------+
1 row in set (0.00 sec)

select文についてはまた後述します。
アスタリスク(*)はレコードを全部指定するということです。
挿入したレコードがきちんと表示されました。


長くなってしまったので、続きは次回に回したいと思います。(更新しました)yuzatakujp1013.hatenablog.com