SQL文の基本

SELECTとUPDATE

SELECTはテーブルのデータを表示する命令です。

表示するだけでなので、データが壊されたり変更されたりということがありません。

phpMyAdminのテーブルで「表示」タブを選択すると、各レコードが表示されました。

実はSELECTのクエリを発行し、その結果が表示されていたのです。

カラムのデータを表示(SELECT)

書式 SELECTカラム名1, カラム名2,.....FROM  テーブル名

表示したいカラム名を「,」で区切って記述します。例えば、カラム「pr」と「nm」を表示させるときは、次のようになります。

SELECT  pr, nm FROM tb;を入力して実行をクリック

f:id:mkyosuke:20191129152646p:plain

f:id:mkyosuke:20191129153303p:plain

「pr」「nm」だけが、「pr」➡「nm」の順番で表示されました。

カラム「pr」とカラム「nm」の内容だけが、「pr」➡「nm」の順番で表示されています。SELECTを実行することで、このように任意のカラムの内容を、任意の順番で表示することができます。実行結果の上には、実行されたSQL文も表示されています。

ところで、たくさんのカラムがあるテーブルだと、そのすべてを指定するのは面倒ですね。こんなときに「全部のカラム」という意味で次のように「*」(アスタリスク)を指定することができます。

全部のカラムに対するSELECT

SELECT*FROM テーブル名

SQL文の命令は、半角文字で入力します。全角文字が入るとエラーになってしまうので注意してください。

●カラムのデータを修正する

クエリによるデータの修正方法を解説します。

カラムのデータを更新するには「UPDATE」を使います。

書式 UPDATE テーブル名 SET カラム名 =設定する値

これを実行すれば何全件、何万件だろうが全レコードのデータが一瞬にして置き換わってしまいます。通常は条件を設定して、特定のレコードだけを対象にして実行します。

下記はカラム「pr」の値をすべて2倍にしてみます。次のようなSQL文になります。

UPDATE tb SET pr = pr * 2;

カラムに「pr」に「pr*2」、つまりpr自身の2倍を代入する、という意味です。

f:id:mkyosuke:20191129155539p:plain

価格が2倍になりました。

f:id:mkyosuke:20191129155704p:plain

●条件を指定した処理

データベース内のデータが増えてくると、SELECTやUPDATEなどの命令をカラムのすべてに対して実行することはあまりありません。

通常はWHEREで条件を設定することによりレコードを選んで実行します。

WHEREによる条件設定

条件に一致するレコードに絞って実行するときは、次のようにWHEREを使います。

書式 SELECT  カラム名  FROM  テーブル名 WHERE  条件

「条件」は、例えば「カラム(pr)の値が200以上」というときは「pr>=200」とします。

テーブル「tb」ではカラム「pr」が売上額を示していました。では、prが200以上であるレコードだけ表示してみることにしましょう。

SELECT * FROM tb WHERE pr>=200; 

f:id:mkyosuke:20191129160942p:plain

f:id:mkyosuke:20191129161106p:plain

200以上のレコードだけが表示されました。

MySQLの比較演算子

 

f:id:mkyosuke:20191129163027p:plain

注意したいのは「=」の扱いです。PHPにおける「等しい」は「==」でしたが、MySQLでは文字通り「=」と書きます。「等しい」の意味で「==」とするとエラーになってしまうので注意してください。

▽カラム「pr」が100に等しい

SELECT * FROM tb WHERE pr=100;

f:id:mkyosuke:20191129163554p:plain

▽カラム「pr」が100以外

SELECT * FROM tb WHERE pr<>100;

f:id:mkyosuke:20191129163807p:plain

▽カラム「pr」が100と200の間にある(100以上、200以下)

SELECT * FROM tb WHERE pr BETWEEN 100 AND 200;

f:id:mkyosuke:20191129164114p:plain

▽カラム「pr」が100か200のどちらか

SELECT * FROM tb WHERE pr IN(100,200);

f:id:mkyosuke:20191129164459p:plain

●文字列による条件検索

「~の文字と一致」というような、

文字に対する条件設定には「LIKE」を使います。

例えば、「'ノート'」という文字と一致という条件は「LIKE'ノート'」となります。

▽カラム「nm」に「ノート」の文字を含むレコードを表示する

SELECT * FROM tb WHERE nm LIKE 'ノート';

f:id:mkyosuke:20191129165050p:plain

LIKEでは文字列が完全に一致しなくても、部分的な文字列を含むものを検索することができます。

この場合、「%」や「_」などのワイルドカードを使います。PHPとの連携では「送信された文字列の一部に一致したものを....」というような抽出がよく行われます。

MySQLワイルドカード

ワイルドカード 解説
% 任意の文字列 例「%@%」(@をどこかに含む),「%jpg」(「jpg」で終わる文字列)
_(アンダーバー 任意の1文字 例「___県」(「神奈川県」など4文字目が「県)」

次は、カラム「nm」の最後が「ペン」で終わるものを抽出します。

SELECT * FROM tb WHERE nm LIKE '%ペン';

f:id:mkyosuke:20191129170444p:plain

●レコードの削除

それではここで、条件に一致したレコードを削除する練習をしてみましょう。

レコードの削除には「DELETE」を使います。

書式 DELETE FROM テーブル名 WHERE 条件

たとえば次はテーブル「td」で、カラム「pr」の値が200以上のレコードだけを削除する例です。条件は「WHERE pr>=200」となります。

DELETE FROM tb  WHERE pr>=200;

f:id:mkyosuke:20191129171916p:plain


ちなみに「DELETE FROM tb」を実行するとすべてのレコードが削除されてしまいます。しかしこの場合、テーブル「tb」自体が削除は「DROP TABLE テーブル名」で実行します。

●主キーと連続番号機能

「重複した値がない」というカラムは重要です。「重複した値がない」状態なら、そのカラムだけで「必ずレコードが特定」できるからです。

このように、重複がなく「必ず1つが特定できる」という状態を「一意」または「ユニーク(unique)」といいます。

たとえば、特定の社員番号を持つ社員が2人、3人もいては困ります。社員番号の意味がなくなってしまいます。社員番号は「一意」でなければいけません。

一意  ・・・「重複した値がない」こと

社員番号 氏名 住所
1 Aさん ******
2 Bさん ******
3 Cさん ******
3 Dさん ******
4 Eさん ******
5 Fさん ******

上記の表は社員番号3が重複しており、一意ではありません。

そして一意であるデータを含み、レコードを識別するために設定したカラムを、データベースでは「主キー」といいます。

「一意」であるデータとしては1,2,3.....というような、1から始まる連続した整数がよく使われます。「1番から始まり重複がない」という連続番号は、データを特定するのに便利です。MySQLには主キーを作るために「連続番号機能」が用意されています。

●連続番号機能のカラムを持つテーブルを作成する

例えば、「一意」で「連続番号機能」を持つカラム「a」と、VARCHAR(10)のカラム「b」を設定したテーブル「auto」を作成する方法です。

phpMyAdminを起動して、データベースで「db」を選択します。

f:id:mkyosuke:20191130175701p:plain

このようにして作成した連続番号機能を持つテーブル「auto」では、カラム「b」に何かのデータを入力するだけで、勝手にカラム「a」に1からの連続番号が入力されます。

f:id:mkyosuke:20191130182326p:plain

たとえば次のクエリを発行して、「何かの値」をカラム「b」に入れてレコードをどんどん挿入します。

INSERT INTO auto(b) VALUES("何かの値");

f:id:mkyosuke:20191130180948p:plain

カラム「a」には自動的に連続した番号が入力される

カラム「b」にはどんなデータを入力してもよい

●連続番号に任意の値を設定する/初期化する

自動的に付けられる連続番号は、最初の値を任意に設定することができます。例えばいきなり「100から開始」ということも可能です。ただし当然のことながら「一意である」ため、すでに存在する値を重複して設定することができません。

なお、連続番号の情報は、たとえレコードを削除しても初期化されません。レコードが存在していたときの連続番号の設定が残ってしまいます。つまり一度でも割り振られたことがある番号は使えないという事です。

連続設定に任意の値を設定する、あるいは「1」を指定して初期化する場合、次のように操作します。

f:id:mkyosuke:20191130184014p:plain

操作するテーブルを選択➡「操作」タブを選択➡「AUTO_INCREMENT」のテキストボックスに任意の値を入力(初期化する場合は1)

MySQLの関数

MySQLにも関数がたくさん用意されています。MySQLの関数はPHPで使用する関数とは異なり、MySQLの独自に使用するものです。

MySQLでは、特定のテーブルを指定しなくても「SELECT 値や関数」とすればその値や関数を表示することもできます。

PHPの関数と同様にたとえ引数を設定しなくとも、関数名の後には()を付ける必要があります。

・SUM関数

書式 SUM(カラム名)

機能 指定したカラムの値の合計をする

SELECT SUM(pr) FROM tb;

f:id:mkyosuke:20191201101936p:plain

AVG関数

書式 AVG(カラム名)

機能 指定したカラムの値の平均値を計算する

SELECT AVG(pr)FROM tb;

f:id:mkyosuke:20191201102739p:plain

・REVERSE関数

書式 REVERSE(カラム名)

機能 指定したカラムの文字列を逆から表示する

SELECT REVERSE(b)FROM auto;

f:id:mkyosuke:20191201103255p:plain

・CONCAT関数

書式 CONCAT(文字列1,文字列2,文字列3....)

機能 引数に指定した「文字列n」を連結する

SELECT CONCAT('値のか何','最強') FROM auto;

f:id:mkyosuke:20191201104116p:plain

CONCAT関数の引数「文字列n」には、カラム名を指定することもできます。

テーブル「tb」のカラム「pr」の値に「円」を付けて表示します。

SELECT CONCAT(pr,"円") FROM tb;

f:id:mkyosuke:20191201104422p:plain

・NOW関数

書式 NOW()

機能 現在の日時情報を返す

SELECT NOW();

f:id:mkyosuke:20191201104705p:plain

・VERSION関数

書式 VERSION()

機能 MySQLのバージョンを返す

SELECT VERSION();

f:id:mkyosuke:20191201104956p:plain

練習問題

MySQLのCONCAT関数を使って、テーブル「tb」でカラム「pr」が200以上のレコードだけ、カラム「nm」の文字列に「高価な」の文字列を結合してください。

UPDATE テーブル名 SET カラム名 =設定する値

UPDATE tb SET nm = CONCAT("高価な",nm) where pr >=200;

実行前

f:id:mkyosuke:20191201105750p:plain

実行後

f:id:mkyosuke:20191201110232p:plain