ここでは、初心者から実践的に学べるプログラミングスクール「ウェブカツ!!」のPHP・MySQL部入門またはWEBサービス部を受講している生徒の方向けに、さらに「SQL」についての理解度を上げるため特訓をしていきます。
出題の回答は全て「SQL言語」を使って回答してください。
DBソフトの種類によってSQL言語は微妙に違いますが(と言っても基本の書き方はどれも同じなのでどのDBでも使える知識です)、ここでは「MySQL」を元にしたSQLの書き方を特訓していきます。
必ず実際にMySQLを動かしてphpMyAdminから問題のテーブルを作成してSQLを実行(「SQL」というタブから行えます)しましょう。(じゃないと練習にならないので)
目次
鬼練5:データを更新してみよう!part3
前回同様に下記の仕様書にあるテーブルを作って、そのテーブルにあるデータをまた「更新(UPDATE)」してみましょう。
またまた、一からテーブルは作りましょうね。
また、データも1からinsert文つくって入れましょう。
仕様書
下記要件に従ってSQLを記述してください。
下記の表に従ってテーブル「users」をphpMyAdminから作成し、そのテーブルにデータ(レコード)を4つ入れてください
挿入するデータは下記の4つです。
○1つ目のデータ
「id」の値は連番
「name」の値は「ウェブカツ」
「email」の値は「test@test.com」
「gender」の値は「1」
○2つ目のデータ
「id」の値は連番
「name」の値は「変態おじさん」
「email」の値は「test2@test.com」
「gender」の値は「0」
○3つ目のデータ
「id」の値は連番
「name」の値は「鬼ちゃん」
「email」の値は「test3@test.com」
「gender」の値は「0」
○4つ目のデータ
「id」の値は連番
「name」の値は「鬼練太郎」
「email」の値は「test4@test.com」
「gender」の値は「0」
としてください。
上記データから
「idが3以上」かつ「genderが0」
となるデータに対して
「name」カラムの値を「ウェブカツおじさん」
に変えてください
ヒント
まず、テーブル作成時にgenderカラムにデフォルト値の指定をちゃんとしましょうね。
更新対象のレコードを「複合検索」するにはどうすればいいか?ですが、「AND演算子」というものを使いましょう。
答え
テーブル作成についてはもういいでしょう。省略しちゃいます。
ちなみにboolean型でカラムを指定したのに作成すると「tinyint」という型にmysqlではなっちゃいますね。
ここらへんの話も練習の中で出てくるので、詳しくはphp部入門だったかwebサービス部を見直してみてください。
では、このテーブルのレコードを更新するためのSQLは?というと
1 |
UPDATE `users` SET `name` = 'ウェブカツおじさん' WHERE `id` >= 3 AND gender = 0; |
ですね。
複数の条件を指定したい場合には「AND演算子」というものを使うんでした。
1 |
AND gender = 0; |
の部分がそれですね。
これで
〜かつ「genderが0」
という意味になります。
OR演算子
ちなみに他にも
「OR演算子」
といったものもあります。
1 |
UPDATE `users` SET `name` = 'ウェブカツおじさん' WHERE `id` >= 3 OR gender = 0; |
とやれば
「idが3以上」または「genderが0」
という条件に合致するレコードを更新することになります。
鬼練6:データを削除してみよう!
前回同様に下記の仕様書にあるテーブルを作って、そのテーブルにあるデータを今度は「削除(DELETE)」してみましょう。
またまた、一からテーブルは作りましょうね。
また、データも1からinsert文つくって入れましょう。
だんだん一からテーブル作ったりデータを入れるのめんどくなってきましたか?
でしょうね。
もう分かる人は分かるでしょうが「テーブルを作るための」SQLの書き方があるんです。それはまた以降の鬼練でやります。
仕様書
下記要件に従ってSQLを記述してください。
前回と同じ構造のテーブル「users」をphpMyAdminから作成し、そのテーブルにデータ(レコード)を4つ入れてください
挿入するデータは下記の4つです。
○1つ目のデータ
「id」の値は連番
「name」の値は「ウェブカツ」
「email」の値は「test@test.com」
「gender」の値は「1」
○2つ目のデータ
「id」の値は連番
「name」の値は「変態おじさん」
「email」の値は「test2@test.com」
「gender」の値は「0」
○3つ目のデータ
「id」の値は連番
「name」の値は「鬼ちゃん」
「email」の値は「test3@test.com」
「gender」の値は「0」
○4つ目のデータ
「id」の値は連番
「name」の値は「鬼練太郎」
「email」の値は「test4@test.com」
「gender」の値は「0」
としてください。
上記データから
「idが3以上」
となるデータを削除してください
ヒント
削除は「DELETE文」と呼ばれる書き方を使うんでしたね。
答え
では、このテーブルのレコードを更新するためのSQLは?というと
1 |
DELETE FROM `users` WHERE id >= 3 |
ですね。
DELETE文というものは下記のような文法になってます。
1 |
DELETE FROM テーブル名 WHERE 削除対象を指定する条件式 |
簡単ですね。
あとはUPDATE文のように「WHERE句」を使って対象レコードを指定してやればいいだけです。
指定の条件式はUPDATE文でやったものと全く変わりません。
DELETE文だろうがUPDATE文だろうが、このあとやるSELECT文だろうがWEHERE以降の書き方は皆一緒です。
ちなみに
1 |
DELETE FROM `users` |
を実行してみてください。
全部消えるんで。
もし、これを本番のサーバー上で実行したとしたら。。。
勇気のある猛者はやってみてください。
ちなみにこういう事をちょいちょいやる現役4年目だと言っているエンジニアがいて、僕らの中では「魔法使い」とか「男前」と呼んでました。
メテオの如くバグを勝手に仕込んでくれたり、勝手にソースコード消してたり、Gitにコミット(今後の練習でやります)せずにサーバーにだけファイル上げてたり。
男前です。
鬼練7:データを検索してみよう!
前回同様に下記の仕様書にあるテーブルを作って、そのテーブルにあるデータを今度は「検索(SELECT)」してみましょう。
またまた、一からテーブルは作りましょうね。
また、データも1からinsert文つくって入れましょう。
お気持ちはお察しします。
仕様書
下記要件に従ってSQLを記述してください。
前回と同じ構造のテーブル「users」をphpMyAdminから作成し、そのテーブルにデータ(レコード)を4つ入れてください
挿入するデータは下記の4つです。
○1つ目のデータ
「id」の値は連番
「name」の値は「ウェブカツ」
「email」の値は「test@test.com」
「gender」の値は「1」
○2つ目のデータ
「id」の値は連番
「name」の値は「変態おじさん」
「email」の値は「test2@test.com」
「gender」の値は「0」
○3つ目のデータ
「id」の値は連番
「name」の値は「鬼ちゃん」
「email」の値は「test3@test.com」
「gender」の値は「0」
○4つ目のデータ
「id」の値は連番
「name」の値は「鬼練太郎」
「email」の値は「test4@test.com」
「gender」の値は「0」
としてください。
上記データから
「idが3以上」
となるデータを検索(抽出)して「全カラムの情報」を表示ください
ヒント
検索は「SELECT文」と呼ばれる書き方を使うんでしたね。
答え
では、このテーブルのレコードを更新するためのSQLは?というと
1 |
SELECT * FROM `users` WHERE id >= 3 |
ですね。
SELECT文というものは下記のような文法になってます。
1 |
SELECT 取得したいカラム FROM テーブル名 WHERE 検索対象を指定する条件式 |
ほぼ、DELETEの部分がSELECTに変わっただけなんで簡単ですね。
SELECT文で大事なのは
何を検索結果として得るか
です。
要は
検索の結果としてレコードの「どのカラム」の情報を取得するか
ということです。
レコードにはいくつもカラムがありますからね。
全部取得してもいいし、「名前の情報しかいらない」という場合もあります。
全部取得したい場合は「*(アスタリスク)」にすると全部取得するんでしたね。
今回もそうなっています。
もし、「名前」しか取得したくないのであれば
1 |
SELECT name FROM `users` WHERE id >= 3 |
とやればいいですね。
「id」と「名前」を取得したいのなら
1 |
SELECT id, name FROM `users` WHERE id >= 3 |
という風にカンマで区切ればいいですね。
ただし、
全部取得するのは基本やめましょう。
基本的には
必要な情報のみを取得する
ようなSQLを書いた方がよいです。
なぜなら、その分
処理するデータ量も増えるし、DBから返送されるデータにその分の不要なデータが乗っているので検索したデータ量がもし膨大にもなれば、その分通信時間がかかりますね。
さらには、個人情報を扱っている場合にusersテーブルを検索して本当は名前しか必要ないのに全カラム取得していたらパスワードやそのほか個人情報をごっそり取得してくることになります。
もし、そこでPHP言語などで
DBのデータを全部画面に表示させる処理が書かれていたら?
個人情報など全部画面に表示されちゃいますね。
その人だけ見れるものならいいですが、他の人も見れたら大問題です。
なので、「必要なものだけをきちんとカラム指定する」ことも大切です。
(とはいえ、ちょいちょい現場でも全部アスタリスク使ってやってるとこもあるので、ケースバイケースですけどね)
話戻って、
あとはUPDATE文のように「WHERE句」を使って対象レコードを指定してやればいいだけです。
前にも伝えましたが、指定の条件式はUPDATE文やDELETE文でやったものと全く変わりません。
ちなみに検索することを「抽出する」なんて言い方したりもします。
「このデータ抽出して〜」とかって言ったりします。
鬼練8:データを検索してみよう!part2
前回同様に下記の仕様書にあるテーブルを作って、そのテーブルにあるデータを今度は「検索(SELECT)」してみましょう。
もうそろそろいいでしょ、一から作らずで。使い回しなさい。
仕様書
下記要件に従ってSQLを記述してください。
前回と同じ構造のテーブル「users」をphpMyAdminから作成し、そのテーブルにデータ(レコード)を4つ入れてください
挿入するデータは下記の4つです。
○1つ目のデータ
「id」の値は連番
「name」の値は「ウェブカツおじさん」
「email」の値は「test@test.com」
「gender」の値は「1」
○2つ目のデータ
「id」の値は連番
「name」の値は「変態おじさん」
「email」の値は「test2@test.com」
「gender」の値は「0」
○3つ目のデータ
「id」の値は連番
「name」の値は「鬼ちゃん」
「email」の値は「test3@test.com」
「gender」の値は「0」
○4つ目のデータ
「id」の値は連番
「name」の値は「鬼練太郎」
「email」の値は「test4@test.com」
「gender」の値は「0」
としてください。
上記データから
nameの先頭に「鬼」が入っている
データを検索(抽出)して「全カラムの情報」を表示してください
ヒント
「あいまい検索」と呼ばれるものです。
文字列の中の「ある特定の文字」に合致すれば検索(抽出)するものですね。
「LIKE演算子」というものを使います。
答え
では、このテーブルのレコードを更新するためのSQLは?というと
1 |
SELECT * FROM `users` WHERE name LIKE '鬼%' |
ですね。
1 |
name LIKE '鬼%' |
という形で対象のカラムの後に「LIKE」という演算子をつけて条件を指定します。
指定の仕方は
ワイルドカード
と呼ばれるものを使った指定の仕方です。
今回だと
1 |
'鬼%' |
の部分ですが、まず今回「文字列」なのでもちろんシングルクウォートをつけます。
さらに
先頭が「鬼」の文字列
なので、
先頭は「鬼」と入力します。
そして、先頭が「鬼」の文字列ということは
2文字目以降は「なんでもいい」(そもそも2文字目がなくてもいい)
わけなので、その場合は、「%」を使います。
SQLでの「%」はワイルドカードを意味していて、
「%(ここにはなんでもいいから文字列が入るか、入らないか)」
という意味になります。
こうすることで
先頭が「鬼」の文字列(2文字目以降はあってもなくてもいい)のデータ
を検索する事ができるわけですね。
鬼練9:データを検索してみよう!part3
前回同様に下記の仕様書にあるテーブルを作って、そのテーブルにあるデータを「検索(SELECT)」してみましょう。
使い回しなさい。
仕様書
下記要件に従ってSQLを記述してください。
前回と同じ構造のテーブル「users」をphpMyAdminから作成し、そのテーブルにデータ(レコード)を4つ入れてください
挿入するデータは下記の4つです。
○1つ目のデータ
「id」の値は連番
「name」の値は「ウェブカツおじさん」
「email」の値は「test@test.com」
「gender」の値は「1」
○2つ目のデータ
「id」の値は連番
「name」の値は「変態おじさん」
「email」の値は「test2@test.com」
「gender」の値は「0」
○3つ目のデータ
「id」の値は連番
「name」の値は「鬼ちゃん」
「email」の値は「test3@test.com」
「gender」の値は「0」
○4つ目のデータ
「id」の値は連番
「name」の値は「鬼練太郎」
「email」の値は「test4@test.com」
「gender」の値は「0」
としてください。
上記データから
nameの最後に「おじさん」が入っている
データを検索(抽出)して「全カラムの情報」を表示してください
ヒント
わかるでしょ?
答え
では、このテーブルのレコードを更新するためのSQLは?というと
1 |
SELECT * FROM `users` WHERE name LIKE '%おじさん' |
ですね。
もう分かりますよね。
ちなみに
nameの途中に「おじさん」が入っている
データを取得する場合のSQLは分かりますか?
その場合は、
1 |
SELECT * FROM `users` WHERE name LIKE '%おじさん%' |
こうです。
これで、
nameの途中に「おじさん」が入っている(前に文字があるかもしれないしないかもしれない、後ろに文字があるかもしれないしないかもしれない)
データを取得できます。
「ウェブカツおじさん」
「変態おじさん」
「おじさん」
「おじさんおばさん」
といった名前があったとしたら、全部この条件に該当しますよね。
でも、
「変態おっちゃん」
とかはダメですけどね。
その他にもIN演算子やBETWEEN演算子なんてものもあります。
鬼練10:データを検索してみよう!part3
前回同様に下記の仕様書にあるテーブルを作って、そのテーブルにあるデータを「検索(SELECT)」してみましょう。
仕様書
下記要件に従ってSQLを記述してください。
前回と同じ構造のテーブル「users」をphpMyAdminから作成し、そのテーブルにデータ(レコード)を4つ入れてください
挿入するデータは下記の4つです。
○1つ目のデータ
「id」の値は連番
「name」の値は「ウェブカツおじさん」
「email」の値は「test@test.com」
「gender」の値は「1」
○2つ目のデータ
「id」の値は連番
「name」の値は「変態おじさん」
「email」の値は「test2@test.com」
「gender」の値は「0」
○3つ目のデータ
「id」の値は連番
「name」の値は「鬼ちゃん」
「email」の値は「test3@test.com」
「gender」の値は「0」
○4つ目のデータ
「id」の値は連番
「name」の値は「鬼練太郎」
「email」の値は「test4@test.com」
「gender」の値は「0」
としてください。
上記データから
nameの最後に「おじさん」が入っているレコードの数
を調べてください
ヒント
「レコードの数」がポイントですね。
検索した結果として「何レコードか」が結果として取得できる必要があります。
それには「COUNT」という関数が使えます。
ちなみにSQLの中にも「関数」という便利なごにょごにょ内部で自動でやってくれる「処理の塊」があるので、それを使うだけで簡単に便利な結果を得ることができます。(といってもCOUNT以外は使う機会はかなり少ないので覚えておく必要もありません)
答え
では、このテーブルのレコードを更新するためのSQLは?というと
1 |
SELECT count(*) FROM `users` WHERE name LIKE '%おじさん' |
ですね。
1 |
count(*) |
の部分でCOUNT関数を使ってます。
COUNT関数は、
カッコの中で指定した対象カラムの値がNULL(空)でないものの数を数える
ものです。
レコードの数を数えたいなら「*」を使います。
もし、対象カラムの値がNULL(空)でないもののレコード数だけを数えたい場合はカッコ内にカラムを指定するわけですね。