【初心者向け】SQLの書き方の基礎
「データベースに触ってみよう!MySQLでデータベースを作る方法」でデータベースってどんなものなのか、MySQLを使って自分のパソコンにデータベースをインストールしてデータを登録するところまでを紹介しました。
データベースに接続できるようになると、データの登録、取得、更新、削除ができるようになります。
Webアプリケーションでデータベースを扱う場合は、PHPやJavaなどのサーバーサイドで使われるプログラミング言語からデータベースに接続して、SQLを使ってデータを登録したり取得したりすることになります。
今回はそのSQLというデータベース向けのプログラミング言語の基本的な書き方を紹介したいと思います。
この記事を読めば、SQLあんまりよくわからないという方でも、これだけできれば実務ではまあまあ困らないでしょうというレベルになります。
こちらの記事ではMySQLというデータベースをお題として説明しますが、多くは他のデータベースでも同じ使い方ができるはずです。
まずはテーブルを作ろう!Create Table文の書き方
SQL
Create Table User(
id Bigint Not Null Auto_Increment Comment 'ユーザーID'
, name Varchar(50) Not Null Comment 'ユーザー名'
, type Int Comment 'ユーザー種別'
, is_admin Bit Not Null Default True Comment '管理者フラグ'
, note Text Comment '備考'
, register_date Date Comment '登録日'
, update_user_id Int Not Null Comment '更新者ID'
, update_time Datetime Not Null Comment '更新日時'
, Primary Key(id)
) Comment 'ユーザー情報';
テーブルとはデータが格納される表のことです。
テーブルを作るにはCreate Table文を使います。お試しでユーザー情報をもつテーブルを作ってみました。
基本的には「Create Table テーブル名 (カラム名 データ型, カラム名 データ型…);」といった構文になります。
上の例を解説すると、Userという名前のテーブルを作るSQLで、Userテーブルはid、name〜update_timeというカラムを持つテーブルになります。
わざといろんなデータ型を使ってみたので、ひとつずつ見ていきましょう!
SQL
id Bigint Not Null Auto_Increment Comment 'ユーザーID'
idのデータ型はBigintとしています。これは数値を格納するデータ型になり、億、兆を超えるもの凄い数値が入ります。マイナスの数値も入れることができます。数値系のデータ型は他にもInt、Tinyintなどがあり、小数点を入れる必要があればFloat、Doubleといった型を使うことができます。
基本的にはIntを使うことが多いですが、Intでは収まりきらない数値が予想される時はBigint、逆に小さい数値で収まりそうであればTinyintなどを使うことを検討します。
とりあえず大きい数値を入れられるBigintを使っておけばいいんじゃない?とも思われるかもしれません。
これは検証をしたわけではないですが、大きい値を入れられるようにするということはそれだけ多くの容量をそのカラムに割り当てることになるので、データベースのサイズが大きくなると思います。
その他、適切な型を設定したほうがデータを検索する時の速度が速くなる可能性がありますし、プログラマーが見た時にもここにはこういうデータが入るんだなということがわかるので、何でも大きい型を割り当てるのはあまりいいことではないと思います。
データ型の右に「Not Null」とか「Auto_Increment」「Comment」などが書かれていますが、これらはオプション的な設定になるので必ず必要なものではありません。必要に応じて使うようにしてください。
まず「Not Null」ですが、これは必ず何かしらのデータを入れてねという制約になります。Nullというのはプログラミングにおいては何も無いという意味になります。それの否定系なので「何も入れないのは無しよ」という意味になります。
idはユーザーを識別するカラムのつもりで作ったので、何も無いというのは困るので今回はつけました。実は他にも理由があってそれが次の「Auto_Increment」です。
「Auto_Increment」はデータを登録する時に自動的にすでにあるデータの最大値+1したデータを登録するという意味になります。すでにユーザーIDが10番のデータがいたとすると、次登録されるデータは自動的に11番になります。
「Auto_Increment」の便利なところはデータを登録する際に、何も設定しなくても一意な値(登録済みのデータと被らない値)で勝手に登録してくれるところです。
もし「Auto_Increment」がついていなければ、事前にテーブルを検索して最大値を取ってきて、+1してこれから登録するデータを作るようなことをしなければなりません。
もちろん、英字や記号を交えて一意なデータを作りたい場合は自前で登録値を作らないといけませんが、ただの数字でいいなら「Auto_Increment」は便利です。
この「Auto_Increment」ですが、これをつけると自動的にそのカラムには「Not Null」の制約がつきます。つまり、必ず何かの値が入らないといけなくなります。(なのでわざわざCreate Table文にNot Nullと書かなくても同じことにはなったのですが、明示的に書いたほうがわかりがいいかと思いました。)
最後の「Comment」ですが、これはその名のとおりコメントという意味になりますが、カラムの説明文を書くことができます。コメントはプログラム的には影響することが無いので日本語で書いてもOKです。あくまで開発者のための記述になります。
SQL
, name Varchar(50) Not Null Comment 'ユーザー名'
次にnameというカラムをみていきますと、こちらのデータ型は「Varchar(50)」になっています。Varcharというのは文字列を格納するためのデータ型になり、括弧で書かれているのは格納できる最大文字数になります。なのでこの場合は50文字まで入れられるということになります。
ただし、昔のバージョンのデータベースだとバイト数になっている場合があります。バイト数の場合、全角の日本語は2バイトになるので、すべて全角文字で入れるとすると最大25文字まで入るということになります。
SQL
, type Int Comment 'ユーザー種別'
カラム「type」はInt型でこちらはカラム「id」と同じく数値型になります。Bigint型ほど大きい数値は入りませんが億に満たない数値であれば問題ありません。
また、こちらには「Not Null」をつけていないので必ず登録値を用意しないといけないわけではありません。
SQL
, is_admin Bit Not Null Default True Comment '管理者フラグ'
カラム「is_admin」はBit型になります。Bit型には0か1しか入れることができません。ONかOFFか、YesかNoかのフラグ的な項目を定義する場合に使えます。
こちらのカラムには「Default」と書かれていますが、このように書くことでデータを登録する時に何も設定されなかった時のデフォルト値を設定することができます。カラム「is_admin」の場合は「Default True」と書いていますので「1」がデフォルト値となります。(Bit型においてはtrue=1、false=0になります。)
SQL
, note Text Comment '備考'
カラム「note」はText型ですが、こちらはVarcharなどと同じく文字列を格納できるデータ型になります。Varcharでは最大文字数を設定しなければなりませんが、Textでは設定する必要がありません。どれくらいのサイズの文字が入るのかわからない場合などに使えます。ただし、サイズを指定しないからといって無限に格納できるわけではなく、半角で65,535文字までのようです。これを超えると誤動作に繋がるので、これくらい入ればいいとわかっている場合はVarcharを使うほうが望ましいかもしれません。
SQL
, register_date Date Comment '登録日'
, update_time Datetime Not Null Comment '更新日時'
カラム「register_date」はDate型といって、日付を格納できるデータ型になります。日付になるので時間までは入りません。
日時まで格納したい場合はカラム「update_time」で指定しているようにDatetime型を使いましょう。
SQL
, Primary Key(id)
最後にPrimary Keyですが、これはプライマリーキーと言って括弧の中に書かれたカラムはテーブルの中で重複したデータは登録できないという意味になります。
Primary Key(id)の場合はカラム「id」はそれぞれ別のデータが入っていなければならないという意味になります。
id:1のデータがすでに登録済であれば、id:1のデータはもう登録できないということになります。
カラムは複数設定できます。Primary Key(id, name)と書くとidとnameの組み合わせが同じデータは登録できません。例えばid:1 name:佐藤のデータがすでに登録済であるとするとid:1 name:佐藤のデータはもう登録することができませんが、id:2 name:佐藤もしくはid:1 name:鈴木のデータは登録できます。
すべてのデータ型について説明したわけではありませんが、ざっくりこれぐらいのことが理解できていれば、細かいところは調べれば出てきますし問題ないと思います。
テーブルにデータを登録しよう!Insert文の書き方
次にテーブルにデータを登録してみましょう。
登録するにはInsert文というSQLを書きます。
SQL
Insert Into User Values (Null, '佐藤', 10, True, 'メモです', '2021-02-10', 99, Now());
こちらのSQLを実行すると以下のようにデータが登録されます。
insert文の構文は「Insert Into テーブル名 Values (1つ目のカラムの値, 2つ目のカラムの値, …);」です。
登録する値が無い場合は「Null」を指定してください。ただし、Not Nullの制約があるカラムには「Null」を指定できません。
あれ?と思われたかもしれませんが、上記では1つ目のカラム「id」にNullを指定したのに「1」が登録されていますね。これはこのカラムにAuto_Incrementの制約があるからです。この制約がついている場合、何も登録値を指定しなければ今登録されているデータの最大値+1を登録してくれることになっています。
データが何もなかったので「1」が登録されましたが、次に何も指定しないで登録した時は「2」が登録されます。
カラム「is_admin」には「True」を設定しましたが、「1」が登録されています。このカラムはBit型で0か1しか登録できません。そして0は「False」、1は「True」に置き換えることができます。
プログラミングではTrue/FalseのようなデータをフラグとかBool値とか言いまして、よく使われるのでこちらで指定したほうが直感的かもしれません。(0や1を指定しても問題ありません。)
カラム「update_time」にはNow()と指定しています。このように括弧がつくものはMySQLの関数になり、関数を呼び出すと決まった処理をしてくれます。
Now関数は現在日時を取得する関数になるので、登録値にNow()と設定すると現在日時を登録してくれます。
また、insert文は以下のようにカラムを指定する書き方もできます。
SQL
Insert Into User (name, is_admin, update_user_id, update_time) Values ('鈴木', False, 100, Now());
ご覧のとおり、省略されたカラムにはNullが設定されます。もちろんNot Null制約のあるカラムは省略することはできません。
データを検索してみよう!Select文の書き方
データベースからデータを引っこ抜くにはSelect文というSQLをデータベースで実行します。
上の画像にちょろっと載っていますが、 説明しますと基本的には以下のような構文になります。
「Select カラム名 カラム名… From テーブル名」
試しに以下のSelect文を実行してみましょう。
SQL
Select id, name, note From User;
指定したカラム「id」、「name」、「note」のみ取得できました。
全部のカラムを取りたい場合は「*」を使います。
SQL
Select * From User;
idからupdate_timeまで全カラム取得できました。
今度はデータの件数を取ってみましょう。
SQL
Select Count(*) As num From User;
件数はCount関数を使うと取れます。
また、上記のSQLでは「As num」と書いていますが、これはカラムに別名をつけています。別名をつけなければカラム名は「Count(*)」になってしまいますが、別名をつけることでSQLの実行結果のカラム名が「num」になっています。
これがSelect文の基本的な使い方です。
ここまではテーブルに入っているデータを全件取ってきましたが、特定の条件に該当するデータだけを取ることもできます。
そんな時には「Where句」を使います。
SQL
Select * From User Where id = 2;
Where句はFrom句の後に書きます。
「Where」の後にどんな条件で取るかを書きます。
上記の場合は「id = 2」と書いており、これはidが「2」のレコードを取るという意味になります。結果、鈴木さんのレコードだけが取れました。
(レコードとはテーブルに格納されているデータ1行分のことです。)
「=」とは左辺と右辺が等しいという意味になります。
逆に等しくないという条件にしたい場合は「!=」や「<>」と書きます。
他にも「<」(より小さい)、「<=」(以下)、「>」(より大きい)、「>=」(以上)なんかもあります。
また、条件は一つだけではなく複数書くことができます。その場合は「And」か「Or」で条件を繋げます。
「And」はそれぞれの条件すべてに該当するデータを取るという意味で、
「Or」はいずれかの条件に該当するデータを取るという意味になります。
試しにいろんな条件を交えて取ってみましょう。
SQL
Select * From User Where (id < 4 And type <= 12) Or note = 'メモ5';
上記は3つの条件を指定しています。
・idが4より小さい
・typeが12以下
・noteが「メモ5」と同じ
しかし、noteはOrで繋がっているので実質以下の2つの条件といえます。
「idが4より小さくtypeが12以下」もしくは「noteがメモ5と同じ」
AndとOrが混じるとややこしくなるので必要に応じて括弧で括るとわかりやすくなります。
ちょっとだけ複雑になってきましたね。
でもこれはまだシンプルなほうで、実務になってくるともっとややこしいSQLを書くことがあります。
「この部分でここまでのデータが取れてるな」といったように頭でイメージしながら書くことが大事になってきます。
イメージすることはプログラミング全般に言えることですが、SQLは長くなってくるとどんどんわけがわからなくなってくるので、より想像力が大事になってくる気がします。
データを更新してみよう!Update文の書き方
Insert文ではデータの登録しかできませんが、登録したデータを更新したいということもあるでしょう。そんな時にはUpdate文を使います。
SQL
Update User Set note = '更新!' Where id In (1,3);
Update文は「Update テーブル名 Set 更新対象のカラム名 = 更新値, 更新対象のカラム名 = 更新値…」という構文になります。
Where句をつければ特定のレコードのみ更新できますし、つけなければデータすべてに更新が適用されます。
上記の場合はidが1と3のレコードに対してnoteを「更新!」に変更するという内容です。Where句に書かれているInはIn句といって、括弧の中に書かれたデータを対象とします。括弧の中はカンマ区切りで複数のデータを書けます。
データを消してみよう!Delete文の書き方
登録したデータはDelete文を使って消すことができます。
SQL
Delete From User Where id In (1,3);
Delete文の構文は「Delete From テーブル名」になります。Select文やUpdate文と同様、Where句をつけて削除対象を絞り込むことができます。
上記の場合はUpdate文と同じ条件を設定したので、更新されたレコード(idが1と3)が消えました。
まとめ
いかがだったでしょうか。
データベースを扱う上では検索(Select)、登録(Insert)、更新(Update)、削除(Delete)が基本的な操作になります。
特によく使うし、SQLが複雑になりがちなのがSelect文です。
ただ、今回紹介したのは基礎的なことばかりで登録されているデータが大量にあると検索に時間がかかるようになって、より早く検索できるようにSelect文をチューニングしたり、インデックスを貼ったり、そもそもテーブル構成をどうするかといった設計を検討したりと、データベースはなかなか奥深いです。
自分も知らないことばかりですが、今回紹介した操作ができればひととおりのことができると思います。
興味のある方は試してみてください。
したっけ!
- テーブルを作るにはCreate Table文を使う
- データを登録するにはInsert文を使う
- データを検索するにはSelect文を使う
- データを更新するにはUpdate文を使う
- データを削除するにはDelete文を使う
本格的にプログラミングを学びたいですか?ITのエンジニアになりたいですか?
IT業界は万年人手不足であり、ニーズがあります。
パソコンとインターネットがあれば場所を問わず仕事ができるので、リモートワークが普及しつつある現代にマッチした職種と言えると思いますし、
物理的に必要なものはパソコンぐらいなので初期投資にかかる費用も少なく、人並みに仕事ができればフリーランスになって会社依存を脱却することもできます。
身につけた技術は一生モノです。
もし本腰を入れて勉強したいという方はスクールに入るのも一つの手です。
いくつか紹介しますので、興味があればサイトを覗いてみてください。
TechAcademy
最短4週間で未経験からプロを育てるオンライン完結のスクールです。 どこかに通う必要なく、自宅でもプログラミングやアプリ開発を学ぶことができます。
TechAcademyのサイトへWant to learn programming in earnest? Want to be an IT engineer?
The IT industry is understaffed for many years and has needs.
If you have a computer and the Internet, you can work anywhere,
so I think it can be said that it is a job type that matches the present age when remote work is becoming widespread.
The initial investment cost is low, and if you can work like a normal person, you can become freelance and get rid of your dependence on the company.
The skills that you have acquired is something that will last a lifetime.
If you want to study in earnest, you can go to school.
I will introduce some of them, so if you are interested, please take a look at the site.
DMM WEBCAMP
This is a programming school for those who are serious about changing jobs. guarantee a job change, so it is recommended for those who are inexperienced and are looking for a job change in the IT industry!
move to DMM WEBCAMPTechAcademy
It is an online school that trains professionals from inexperienced in a minimum of 4 weeks. You can learn programming and app development at home without having to go anywhere.
move to TechAcademy