ざっくりん雑記

プログラミングで忘れそうなことをひたすらメモる

PHP - 字句構造(基本的ルール)

PHPにおける字句構造について

 プログラミング言語についての「字句構造」とは、その言語を記述しプログラミングをしていく上での基本的なルールのこと。最も下位レベルでの文法規則と言える。

大文字/小文字の区別

組み込みキーワードは区別しない

 定義するクラスや関数の名前、echo、while、classといった組み込まれているキーワードの名前は、大文字と小文字が区別されない。よって以下の3行のコードは同一の意味を持つ。

echo("hello, php");
ECHO("hello, php");
Echo("hello, php");

変数名は区別する

 一方で、変数名については大文字と小文字を区別する。

$count;
$Count;
$COUNT;

 以上は全て異なる変数を表す。

命令文

   PHPは、命令文の区切りとしてセミコロンを用いる(;)。 if文やwhile文における波括弧({})に包括されたコード群の、閉じ括弧については、セミコロンは不要。 終了タグ直前のコードはセミコロンが不要で省略できる。省略可能であってもややこしかったり、なんだかヒヤヒヤするし、後の可読性も落ちるので必ず付けておくと良さそう。

<?php
if ($name == $admin) {
    echo "Administratorですね"; // このセミコロンは必須
}                               // 閉じ括弧にセミコロンは不要
echo "Hello, PHP!"               // 終了タグ直前のセミコロンは省略可
?>

空白と改行

 PHPにおける空白文字はプログラムに影響を与えない。ので、自由に行頭を揃えたり、インデントするなどして可読性の高いコードを書くことができる。

fruit($apple, $banana, $kiwi, $grape);

// こんな風にも書ける

fruit(
    $apple,
    $banana,
    $kiwi,
    $grape
);

コメント

 適度にコメントを書こう。これはPHPに限った話ではない。

// ✕:よくないコメント

$x = 17; // 変数$xに17を代入する

// ○:よさげなコメント

// &#nnn; 形式のエンティティを文字に変換する
$text = preg_replace('/&#([0-9])+;/e', "chr('\\1')", $text);

シェル形式コメント

 ハッシュ記号(#)があると、そこから文末までがコメントとなる。目立つのでシェル形式コメントは、コードブロックの区切りとして使うのも良い。

if ($name == $admin) {
    # Adminなら
    echo "Administratorですね";
}   

##################
## ○○な関数
##################

$value = $height * $width; # 面積を計算

<?php $level = 4; # レベル4に設定 ?>レベル:<?php echo $level; ?>
レベル:4

 上記の最後の例は、PHPの終了タグでコメント範囲が終わるという点で、便利に使えるといえる。

C++形式コメント

if ($name == $admin) {
    // Adminなら
    echo "Administratorですね";
}   

///////////////////
// ○○な関数
///////////////////

$value = $height * $width; // 面積を計算

<?php $level = 4; // レベル4に設定 ?>レベル:<?php echo $level; ?>
レベル:4

C形式コメント

 シェル形式やC++はコメントが短い場合に便利。より長いコメントの場合はブロック形式のコメントが便利だが、PHPはブロック形式コメントもサポートしている。また、形式はC言語と同じ。

/*   こんな感じでC言語と同じように
    C言語と同様なブロック形式のコメントが
    PHPでも可能です。
    コードの一部を無効にしたい場合にも便利です。
    PHPの終了タグを包括すれば、その中身は無効になります。
    コメントを入れ子にすると、エラーが出るので気をつけよう。
*/

リテラル

 リテラルとは、以下の様なもの。

2016
0xFE
1.23456
"Hello, PHP"
'こんにちは'
true
null

識別子($)

変数名

OKな例
$name
$Count
$MAX_LENGTH
$_underscore
$_int
NGな例
$not number
$=
$50per

関数名

 関数名については、大文字/小文字が区別されない。 以下の関数名が有効。

checkPermission
list_all_admins
deleteName
UPPERCASE_IS_FOR_WIMPS
_hide

クラス名

 クラス名については、大文字/小文字が区別されない。 以下のクラス名が有効。

Person
User
Account

定数

 定数については、ある単純な値を保持する識別子のことで、指定できる値はスカラー値(論理値、整数、浮動小数点数、あるいは文字列)のみである。  定数の値を取得したい場合は、識別子を使用する。定数の値を設定したい場合はdefine()関数を使用する。

define(`MAX_LENGTH`, 100);
echo MAX_LENGTH

予約語(キーワード)

 言語自体に既に予約されており識別子として用いることができないキーワードは以下のリンクを参照。

参考

Ruby - シングルクウォートとダブルクォートの違い

結論から言うと、変数展開するかしないか

name = "寿司くん"

puts "こんにちは、#{name}"
# 結果:こんにちは、寿司くん

puts 'こんにちは、#{name}'
# 結果:こんにちは、#{name}

ダブルクォート「"」で囲んだ場合は、上記の通り、「#{変数}」とすると、変数を展開して変数に入っている値に置き換えられる。これを変数展開という。

シングルクォート「'」で囲んだ場合は、変数展開がされずに「#{変数}」はその文字列のままputsされる。

寿司くんって何


【自主制作アニメ】 寿司くん 第一話「出会い」(sushi-kun) - YouTube

「僕が世界で一番好きなもの、それはお寿司。高い地位や名誉よりも大切なものはお寿司。それぐらい僕はお寿司が好きだ。あぁ、お寿司が食べたいなぁ。」

たかし君 - アニメ寿司くん

寿司くん、好きです。

Ruby - %記法を使って手打ちで配列に要素を代入するやつ

%記法を利用する

a = ["a", "b", "c"]

こうやって配列に要素を入れるのが普通だけど何度もダブルコーテーションを打たねばならないので途中でアァァ!!!!!ってなる(ならないけど面倒くさい)

a = %W(a b c)

こうすれば、同じように配列に要素が入る(スゴイ)

一応動作確認

a = ["a", "b", "c"]
b = %W(a b c)
p a
p b
["a", "b", "c"]
["a", "b", "c"]

同じように配列ができている。

数値を%記法で入れたらどうなるか

a = ["a", "b", "c", 1 , 2, 3]
b = %W(a b c 1 2 3)
p a
p b
["a", "b", "c", 1, 2, 3]
["a", "b", "c", "1", "2", "3"]

文字列になって入ってる。 この文字列の ["1", "2", "3"] を数値として配列から取り出したい時は、

b = %W(a b c 1 2 3)
p b[3,3].map(&:to_i)
[1, 2, 3]

数値にして取り出せなくもないけど、なら最初から%記法を使わないで配列作ったほうがいいかもしれない。

参考

#12 %記法を使ってみよう | Ruby入門 - プログラミングならドットインストール

map, map! (Array) - Rubyリファレンス

Python - if __name__ == '__main__': の意味

if __name__ == '__main__': って何?

サンプルコードにも頻出するこの__name__属性。

Pythonを勉強し始めて3日ぐらいのときに一度調べたのだけど「???」な感じだった。

で、きょう今一度調べてみるとやっと理解できた。

Pythonを始めて3日目の自分でも理解できるようにやたら冗長に説明するメモを残したいと思う。(しつこいくらいに同じこと言ってる)

例えば test.py というスクリプトを書いたとする。

#!/usr/bin/env python
# -*- coding: utf-8 -*-

def shout():
    print u"ウェーイw"

print u"ワンチャンあるっしょw"

if __name__ == '__main__':
    shout()

ウェーイ系のセリフを2つ用意した。

基本的に、print文「ワンチャンあるっしょw」は絶対実行される。

print文「ウェーイw」は 「 if __name__ == '__main__':」が True である場合のみ、def文の shout() が実行され「ウェーイw」する。

コマンドラインから上記の test.py を指定してPythonインタプリタを起動する。(実行する)

> python test.py

結果はこうなる。

>test.py
ワンチャンあるっしょw
ウェーイw

結果から、 「 if __name__ == '__main__':」の判定は True となって、shout関数が呼び出され、いわゆるウェーイ系大学生が「ウェーイw」したことが分かる。

え、なんで「 if __name__ == '__main__':」がTrueになってるの?

__name__という変数を作った覚えも、

__name____main__なんて代入した覚えないよ?って思うよね。(Python始めて3日目の自分はそう思った)

まず、__name__属性についての説明をじっくり読んで欲しい。

コマンドラインからスクリプトファイルを指定してPythonインタプリタを起動すると、指定されたファイルは、__main__という名前のモジュールとしてPythonに読み込まれる。実行中スクリプトのモジュールの名前は、__name__という名前の変数に設定されているため、この値を参照して、ファイルがコマンドラインから実行されたのか、それともimport文でインポートされたのかを識別できる。

という仕組みになっているようだ。

つまり、コマンドラインから直接スクリプトファイルを実行した場合は「__name__という変数(属性)の中に自動的に__main__を代入する」操作が一番はじめに水面下で行われる。

だから、test.py の場合の判定は True になった。

逆に、コマンドラインから直接スクリプトファイルを実行しない場合って何?って感じなんだけど、それはimport文でスクリプトファイルがモジュールとしてインポートされた場合。

import で読み込まれたスクリプトファイルの場合は そのモジュール名 が__name__に入る。

例えば test.py をモジュールとしてimportして実行した場合は __name__ には test が入る。

実際に test.py がimportでインポートした場合を試してみる。

test.py の内容を少し変える。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
print __name__

def shout():
    print u"ウェーイw"

if __name__ == '__main__':
    shout()

初めに __name__ の中身をprintするようにし、「ワンチャンあるっしょw」を消した。

余談だが、ムーミン谷のリトルミイの名言の一つにこの言葉がある。

f:id:azuuun:20150509121614j:plain

何とかなる。それは、やることをちゃんとやってる人のセリフ。

"""そもそもワンチャンはちゃんと努力した人に訪れるのだ"""

だから、軽はずみに"ワンチャンあるっしょw"とか言わないようにしたい。

話を戻す。

まずは、

__main__
ウェーイw

実行時に __name__ には __main__ が入っていて、コマンドラインから直接スクリプトファイルが実行されたことがわかるし、「if __name__ == '__main__':」判定が True となって「ウェーイw」したことも分かる。

  • test.pyをimportしたtest_import.pyを実行した場合

test_import.pyの中身

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import test

実行する

test

testとしか出力されない。

つまり、importした場合は__name__にはモジュール名、今回の場合は test が入り、のちのif判定もFalseとなり、shout関数も実行されず「ウェーイw」しなかった。

つまり?

__name__属性は、

  • モジュール作成と同時に自動的に与えられて以下の設定が行われる
    • モジュールファイルがトップレベルファイル(main)として機能する ==> __name__に__main__ が代入される
    • モジュールファイルがインポートされる ==> __name__にモジュール名が代入される

言い換えると、

「 if name == 'main': 」ステートメント

  • コマンドラインでファイルを指定して起動された場合は True で実行される
  • importでインポートされた場合は False で実行されない

ということ。

どう応用する?

たとえば、

「モジュールを作っているとき、かんたんにテストしたい(値をprintするなどで確認する)コードを書くとき」

これは、他のモジュールにインポートされた時には表示する必要がなかったりする。

そういう時は、テストするためのコードを「if __name__ == '__main__':」の中にかけば、 トップレベルファイルで実行された時にのみ、テスト用の値出力処理が行われるようにすることができる。

他のモジュールからインポートされた時は False となり、実行されない。ちょっと便利。

この他にも使いドコロがありそう!

まとめると

「直接実行されているのか、それともimportされて実行されているのかが、この__name__変数の値を確認することで分かる!」

MySQL入門 - レコードの抽出方法

前回、レコードを挿入する方法を確認した。

azuuun-memorandum.hatenablog.com

今回は、SELECT文を使います。

余談だけど、基本情報の出題範囲でSQLの勉強をしたことがあったんだけどいまいちパットしなかった。でも、実際にMySQLを使ってレコードを抽出したりする中で、あぁ~なるほどな~と思うことも少しあったので、やっぱ実際にいじれる環境を作れるのなら、いじってみるのがいいと再確認しました。(基本情報勉強してた時は思いつきもしなかったけど…)

例えば午前問題のこの問題は今やってるレコードの抽出に関するところです。

問30 SQL文の結果 平成24年春期|基本情報技術者試験.com

RDBMSは、データを格納するだけでなく大量のデータから欲しい情報を検索して抽出するのが得意。

ではさっそく、そのデータを検索し抽出する方法を確認する。

レコードを抽出する

新しくusersテーブルを作ります。(既にusersテーブルがある場合は削除するか名称を変更)

create table users (
    id int not null auto_increment primary key,
    name varchar(255),
    email varchar(255) unique,
    team enum('Rilakkuma', 'Pooh', 'Kumamon'),
    score double,
    created datetime
);

前回の記事のテーブルから若干の簡易なものに変更しました。

レコードの挿入は、insert into [レコード名]です。

insert into users (name,email,team,score,created) values
('azuuun', 'azuuun@hatena.hoge.com','Rilakkuma',6.2,'2015-05-04 15:25:00'),
('tuna', 'tuna@hatena.hoge.com','Pooh',4.6,'2015-02-06 15:25:00'),
('salmon', 'salmon@hatena.hoge.jp','Rilakkuma',10.0,'2015-04-04 12:25:00'),
('shrimp', 'shrimp@hatena.hoge.com','Kumamon',2.3,'2014-01-04 12:23:00'),
('arkshell', '','Pooh',7.3,'2015-05-04 22:21:00'),
('omelet', 'omelet@hatena.hoge.jp','Kumamon',0.2,'2015-03-04 11:25:00');

6つのレコードを挿入しました。レコードを複数挿入する際は',(カンマ)'で区切って最後に';(セミコロン)'で。

usersテーブルのレコードを全て抽出してみます。

mysql> select * from users;
命令 意味
select 抽出しなさい
* 全てのフィールド
from users userテーブルから

つまり、usersテーブルからすべてのフィールドを抽出しなさいという命令。これもレコードの抽出です。

+----+----------+------------------------+-----------+-------+---------------------+
| id | name     | email                  | team      | score | created             |
+----+----------+------------------------+-----------+-------+---------------------+
|  1 | azuuun   | azuuun@hatena.hoge.com | Rilakkuma |   6.2 | 2015-05-04 15:25:00 |
|  2 | tuna     | tuna@hatena.hoge.com   | Pooh      |   4.6 | 2015-02-06 15:25:00 |
|  3 | salmon   | salmon@hatena.hoge.jp  | Rilakkuma |    10 | 2015-04-04 12:25:00 |
|  4 | shrimp   | shrimp@hatena.hoge.com | Kumamon   |   2.3 | 2014-01-04 12:23:00 |
|  5 | arkshell |                        | Pooh      |   7.3 | 2015-05-04 22:21:00 |
|  6 | omelet   | omelet@hatena.hoge.jp  | Kumamon   |   0.2 | 2015-03-04 11:25:00 |
+----+----------+------------------------+-----------+-------+---------------------+

無事挿入したレコードが全て抽出できているのが確認できる。

名前が寿司のネタでチーム名がクマ関連でカオス感がすごい。

全てのフィールドを一気に抽出してしまうとフィールド数が多い場合に横に長い表組みになってしまう場合がある。そいった場合は、

mysql> select * from users \G

(この場合セミコロンは不要)

こう実行すると

*************************** 1. row ***************************
     id: 1
   name: azuuun
  email: azuuun@hatena.hoge.com
   team: Rilakkuma
  score: 6.2
created: 2015-05-04 15:25:00
*************************** 2. row ***************************
     id: 2
   name: tuna
  email: tuna@hatena.hoge.com
   team: Pooh
  score: 4.6
created: 2015-02-06 15:25:00
*************************** 3. row ***************************
     id: 3
   name: salmon
  email: salmon@hatena.hoge.jp
   team: Rilakkuma
  score: 10
created: 2015-04-04 12:25:00

(※4.row以降省略)

このように、フィールドを縦に表示してくれるので見やすく表示できます。

レコードを抽出する

usersテーブルから名前とemailのフィールドのみ抽出する

mysql> select name,email from users;

すべての場合はアスタリスクだったのに対して、今回はname,emailを指定している。

+----------+------------------------+
| name     | email                  |
+----------+------------------------+
| azuuun   | azuuun@hatena.hoge.com |
| tuna     | tuna@hatena.hoge.com   |
| salmon   | salmon@hatena.hoge.jp  |
| shrimp   | shrimp@hatena.hoge.com |
| arkshell |                        |
| omelet   | omelet@hatena.hoge.jp  |
+----------+------------------------+

うまく抽出できている。

usersテーブルから全てのフィールドを"スコアが3以上"という条件に合致するレコードを抽出する

select * from users where score >= 3;
+----+----------+------------------------+-----------+-------+---------------------+
| id | name     | email                  | team      | score | created             |
+----+----------+------------------------+-----------+-------+---------------------+
|  1 | azuuun   | azuuun@hatena.hoge.com | Rilakkuma |   6.2 | 2015-05-04 15:25:00 |
|  2 | tuna     | tuna@hatena.hoge.com   | Pooh      |   4.6 | 2015-02-06 15:25:00 |
|  3 | salmon   | salmon@hatena.hoge.jp  | Rilakkuma |    10 | 2015-04-04 12:25:00 |
|  5 | arkshell |                        | Pooh      |   7.3 | 2015-05-04 22:21:00 |
+----+----------+------------------------+-----------+-------+---------------------+

usersテーブルからname, teamフィールドのみ "teamがKumamon"という条件に合致するレコードを抽出する

mysql> select name,team from users where team = 'Kumamon';
+--------+---------+
| name   | team    |
+--------+---------+
| shrimp | Kumamon |
| omelet | Kumamon |
+--------+---------+

usersテーブルからname,emailフィールドのみ "emailに'@hatena.hoge.com'含まれる"という条件に合致するレコードを抽出する

あいまいな検索をするときは like を使う。

likeには、'%'と'_'の2つの記号がある。いわゆるワイルドカードです。

  • %:任意の0文字以上の文字列

  • _:任意の一文字

mysql> select name,email from users where email like '%@hatena.hoge.com';
+--------+------------------------+
| name   | email                  |
+--------+------------------------+
| azuuun | azuuun@hatena.hoge.com |
| tuna   | tuna@hatena.hoge.com   |
| shrimp | shrimp@hatena.hoge.com |
+--------+------------------------+

usersテーブルからid,emailフィールドのみ "emailに'@hatena.hoge.[任意の2文字]'が含まれる"という条件に合致するレコードを抽出する

mysql> select id,email from users where email like '%@hatena.hoge.__';
+----+-----------------------+
| id | email                 |
+----+-----------------------+
|  6 | omelet@hatena.hoge.jp |
|  3 | salmon@hatena.hoge.jp |
+----+-----------------------+

usersテーブルから全てのフィールドを "スコアが5以上8以下"という条件に合致するレコードを抽出する

betweenは範囲を指定する際に使う。

mysql> select * from users where score between 5.0 and 8.0;
+----+----------+------------------------+-----------+-------+---------------------+
| id | name     | email                  | team      | score | created             |
+----+----------+------------------------+-----------+-------+---------------------+
|  1 | azuuun   | azuuun@hatena.hoge.com | Rilakkuma |   6.2 | 2015-05-04 15:25:00 |
|  5 | arkshell |                        | Pooh      |   7.3 | 2015-05-04 22:21:00 |
+----+----------+------------------------+-----------+-------+---------------------+

usersテーブルから全てのフィールドを "teamが'Pooh'か'Kumamon'"という条件に合致するレコードを抽出する

inはあらかじめ設定された値の中でどれか一つにあてはまるかどうかを調べる時に使う。

mysql> select * from users where team in ('Pooh', 'Kumamon');
+----+----------+------------------------+---------+-------+---------------------+
| id | name     | email                  | team    | score | created             |
+----+----------+------------------------+---------+-------+---------------------+
|  2 | tuna     | tuna@hatena.hoge.com   | Pooh    |   4.6 | 2015-02-06 15:25:00 |
|  4 | shrimp   | shrimp@hatena.hoge.com | Kumamon |   2.3 | 2014-01-04 12:23:00 |
|  5 | arkshell |                        | Pooh    |   7.3 | 2015-05-04 22:21:00 |
|  6 | omelet   | omelet@hatena.hoge.jp  | Kumamon |   0.2 | 2015-03-04 11:25:00 |
+----+----------+------------------------+---------+-------+---------------------+

これまで使ってきた検索手法を and や or を使って組み合わせて条件式を作る

例えば 「usersテーブルから全てのフィールドを "スコアが4以上 かつ チームが’Rilakkuma'」という条件に合致するレコ^ドを抽出する」

かつの部分で2つの条件を合わせて抽出しています

mysql> select * from users where score >= 4.0 and team = 'Rilakkuma';
+----+--------+------------------------+-----------+-------+---------------------+
| id | name   | email                  | team      | score | created             |
+----+--------+------------------------+-----------+-------+---------------------+
|  1 | azuuun | azuuun@hatena.hoge.com | Rilakkuma |   6.2 | 2015-05-04 15:25:00 |
|  3 | salmon | salmon@hatena.hoge.jp  | Rilakkuma |    10 | 2015-04-04 12:25:00 |
+----+--------+------------------------+-----------+-------+---------------------+


だいたいの検索は上記で確認した条件句を and や or で組み合わせることで実現することができ、自在にデータを引っ張ってくることが可能。

今回はここまで。

MySQL入門 - レコードの挿入方法

前回、フィールドのオプション設定を終えて、やっとレコードを挿入できる状態になった。

azuuun-memorandum.hatenablog.com

今回は、テーブルにレコードを挿入してみる。

レコードの挿入方法

今回使う users テーブルの構造はこのような感じ。

+----------+-----------------------+------+-----+---------+----------------+
| Field    | Type                  | Null | Key | Default | Extra          |
+----------+-----------------------+------+-----+---------+----------------+
| id       | int(11)               | NO   | PRI | NULL    | auto_increment |
| name     | varchar(255)          | YES  |     | NULL    |                |
| age      | int(11)               | YES  |     | NULL    |                |
| email    | varchar(255)          | YES  | UNI | NULL    |                |
| password | char(32)              | YES  |     | NULL    |                |
| sex      | enum('male','female') | YES  |     | male    |                |
| score    | double                | YES  | MUL | NULL    |                |
| memo     | text                  | YES  |     | NULL    |                |
| created  | datetime              | YES  |     | NULL    |                |
+----------+-----------------------+------+-----+---------+----------------+

id は自動連番、sexもデフォルト値が設定されているので入力しないこととする。

  • insert(挿入)の書式
insert into [テーブル名] (field1, field2, ...)
  values (value1, value2, ...);

実際に users テーブルにレコードを挿入してみる。

insert into users (name, age, email, password, score, memo, created) values
('azuuun', '100','azuuun@hatena.hoge.com', 'hogehoge', 123.456, 'めもめも', '2015-05-04 15:25:00');

テーブルに無事、入ったようなのでusersテーブルの中身を見てみる。

select * from users;

select文については、今後詳しく触れるが、usersテーブルの一覧を見るときはこう指定すれば問題ない。

+----+--------+------+------------------------+----------+------+---------+----------+---------------------+
| id | name   | age  | email                  | password | sex  | score   | memo     | created             |
+----+--------+------+------------------------+----------+------+---------+----------+---------------------+
|  1 | azuuun |  100 | azuuun@hatena.hoge.com | hogehoge | male | 123.456 | めもめも | 2015-05-04 15:25:00 |
+----+--------+------+------------------------+----------+------+---------+----------+---------------------+

問題無くレコードが挿入できました。


次回は抽出してみます。

MySQL入門 - フィールドのオプション設定について

前回は、テーブルを作る方法、作ったテーブルの構造を取得する方法などを確認した。

azuuun-memorandum.hatenablog.com

今回は前回のテーブル作成時のフィールド設定、

create table users (
    id int,
    name varchar(255),
    age int,
    email varchar(255),
    password char(32),
    sex enum('male', 'female'),
    memo text
);

こちらをより便利にする設定を付加していく。

フィールドにオプションを付加する

まず, idカラム に付加すると便利なオプションとして、

  • 入力を必須とする not null
  • 自動連番 auto_increment

sexカラムに付加すると便利なオプションとして、

  • デフォルト値 default

emailカラムに付加すると便利なオプションとして、

  • ユニークキー unique

がある。

入力を必須とする not null

not null は null を許可しないというもので、指定することによってそのレコードを挿入する際にidフィールドが null であることを防ぐことができる。

id int not null

自動で連番を付けてくれる auto_increment

auto_increment は整数型のみ指定できるオプションで、自動的に連番の値を格納してくれる。初期値1で対象のレコードが null または 0 であった場合、前のレコードの値+1を格納する。

id int not null auto_increment
  • auto_increment の注意事項
  • AUTO_INCREMENTを設定するカラムには同時にインデックスを設定する必要がある
  • AUTO_INCREMENTはテーブル内の1つのカラムにしか設定できない
  • AUTO_INCREMENTを設定したカラムにはDEFAULTは設定できない
  • AUTO_INCREMENTには正の値しか格納できない(負の数も可能だが予期しない結果となる)
    AUTO_INCREMENTの設定 - テーブルの作成 - MySQLの使い方

デフォルト値を設定する defalut

defaultはテーブルにデータを追加する時、カラムに値が指定されなかった場合にデフォルトで設定される値を入れてくれる。 定数のみ設定することができるが、例外としてTIMESTAMP型というものがある。

sex enum('male', 'female') default 'male'

重複を許さないユニークキー unique

ユニークキーが設定されたカラムでは重複する値は入れることが出来ない。

email varchar(255) unique,

主キー(プライマリーキー) primary key

そもそも主キーって何だろう…

組(レコード)の識別子として利用するのにもっとも好ましいものとして、リレーション(テーブル)毎にただ一つ設計者により選択・定義された候補キーをいう。
主キー - Wikipedia

idに付加するのが適切かな。idは一意なものであるので、識別子として好ましい。あと主キーは必ず入力する必要があるからnot nullをセット。(書かなくても勝手にnot nullになる)

id int not null auto_increment primary key,

主キーについてはこちらがわかりやすいです。

01 主キーの設定

 キー key

このキーというのは例えば score というカラムがあったとして、この値をよく検索する場合インデックスすることで検索が早くなる…らしい。自分もよくわかっていない。今後考えていく。

key score(score)

インデックスについて

インデックスは、主キー、キー、ユニークキー等のことを指し、フィールドに付けておくと動作が早くなるという利点がある。 ただし、検索するときには速いが、データを挿入するときにインデックスをたくさん貼りすぎているとその度にインデックスを作り直すので動作が重くなるという面もある。バランスよくよく検索するフィールドに設定する必要がある。

最終的なフィールド設定

create table users (
    id int not null auto_increment primary key,
    name varchar(255),
    age int,
    email varchar(255) unique,
    password char(32),
    sex enum('male', 'female') default 'male',
    score double,
    memo text,
    key score(score),
    created datetime
);

scoreやdatetimeを追加した。scoreには適当な数値が入って、datetimeは日付が入る。

最後に users テーブルの構造を確かめておく。

+----------+-----------------------+------+-----+---------+----------------+
| Field    | Type                  | Null | Key | Default | Extra          |
+----------+-----------------------+------+-----+---------+----------------+
| id       | int(11)               | NO   | PRI | NULL    | auto_increment |
| name     | varchar(255)          | YES  |     | NULL    |                |
| age      | int(11)               | YES  |     | NULL    |                |
| email    | varchar(255)          | YES  | UNI | NULL    |                |
| password | char(32)              | YES  |     | NULL    |                |
| sex      | enum('male','female') | YES  |     | male    |                |
| score    | double                | YES  | MUL | NULL    |                |
| memo     | text                  | YES  |     | NULL    |                |
| created  | datetime              | YES  |     | NULL    |                |
+----------+-----------------------+------+-----+---------+----------------+

今回はここまで。