2009/04/27
と、思ったけれど?!
Ruby②を本屋さんでパラパラ見てみたら、
アルゴリズムがあーだとかファイル構造がこーだと
あまり何につながるのかパッと浮かばない感じだったので
モチベーションが上がらず・・・
結局、これ買いました☆
どうでしょう?このワクワクするタイトル。
もう変数や配列の説明は、詳しく要らないので
ちょっとレベル上がりますが、ここから行ってみたいと思います!
2009/04/24
PHPからMySQLを操作する
ようやくPHPから操作する時がきた!
■PHPスクリプトでMySQLサーバーに接続する
|sample|
+-----------------------------------------------------------------------+
<?php
$s=mysql_connect("localhost","root","1234") or die("失敗です");
print "成功しました";
mysql_close($s);
?>
+-----------------------------------------------------------------------+
mysql_connect(サーバー名,ユーザー名,パスワード)
接続に成功すると、「データベース接続の値」を返す
失敗すると、「false」を返す
or die(メッセージ)
()内を表示して、スクリプトの実行を中止する(=exit())
mysql_close(データベース接続の値)
切断に成功すると、「true」
失敗すると、「false」を返す
■PHPスクリプトでクエリを発行する
|sample|
+-----------------------------------------------------------------------+
<?php
$s=mysql_connect("localhost","root","1234") or die("失敗です");
print "成功しました";
mysql_select_db("db1",$s);
mysql_query("INSERT INTO tb1 VALUES('K777','PHP太郎',20);
mysql_close($s);
?>
+-----------------------------------------------------------------------+
mysql_select_db(データベース名,データベース接続の値)
データベースを指定する
mysql_query(SQL文)
SQL文を発行する
(※SQL文のデリミタはつけない、「"」「'」を入れ子で使うかヒアドキュメントを使用)
■PHPでSQL文の実行結果を受け取る
$re=mysql_query("SELECT * FROM tb1);で
print $re;としても、mysql_queryの返す値が単純な文字列でないため結果が実行できない!
mysql_fetch_array(結果)
SQLコマンドの結果を配列として得る
呼び出すときは、while文を使って
while($kekka=mysql_fetch_array($re)){
print $kekka[0];
・・・
}
とするとよい。
|point|
mysql_queryで実行されるクエリで、エラーが起こった場合、
mysql_query(・・・) or die(mysql_error());
でエラーの内容を表示できる
■データベースに存在するテーブルの一覧を取得する
mysql_list_tables(データベース名,データベース接続の値):
|sample|
+-----------------------------------------------------------------------+
<?php
$s=mysql_connect("localhost","root","1234") or die("失敗です");
$re=mysql_list_tables("db1",$s);
while($kekka=mysql_fetch_array($re)){
print $kekka[0];
print "
";
}
mysql_close($s);
?>
+-----------------------------------------------------------------------+
■PHPスクリプトでMySQLサーバーに接続する
|sample|
+-----------------------------------------------------------------------+
<?php
$s=mysql_connect("localhost","root","1234") or die("失敗です");
print "成功しました";
mysql_close($s);
?>
+-----------------------------------------------------------------------+
mysql_connect(サーバー名,ユーザー名,パスワード)
接続に成功すると、「データベース接続の値」を返す
失敗すると、「false」を返す
or die(メッセージ)
()内を表示して、スクリプトの実行を中止する(=exit())
mysql_close(データベース接続の値)
切断に成功すると、「true」
失敗すると、「false」を返す
■PHPスクリプトでクエリを発行する
|sample|
+-----------------------------------------------------------------------+
<?php
$s=mysql_connect("localhost","root","1234") or die("失敗です");
print "成功しました";
mysql_select_db("db1",$s);
mysql_query("INSERT INTO tb1 VALUES('K777','PHP太郎',20);
mysql_close($s);
?>
+-----------------------------------------------------------------------+
mysql_select_db(データベース名,データベース接続の値)
データベースを指定する
mysql_query(SQL文)
SQL文を発行する
(※SQL文のデリミタはつけない、「"」「'」を入れ子で使うかヒアドキュメントを使用)
■PHPでSQL文の実行結果を受け取る
$re=mysql_query("SELECT * FROM tb1);で
print $re;としても、mysql_queryの返す値が単純な文字列でないため結果が実行できない!
mysql_fetch_array(結果)
SQLコマンドの結果を配列として得る
呼び出すときは、while文を使って
while($kekka=mysql_fetch_array($re)){
print $kekka[0];
・・・
}
とするとよい。
|point|
mysql_queryで実行されるクエリで、エラーが起こった場合、
mysql_query(・・・) or die(mysql_error());
でエラーの内容を表示できる
■データベースに存在するテーブルの一覧を取得する
mysql_list_tables(データベース名,データベース接続の値):
|sample|
+-----------------------------------------------------------------------+
<?php
$s=mysql_connect("localhost","root","1234") or die("失敗です");
$re=mysql_list_tables("db1",$s);
while($kekka=mysql_fetch_array($re)){
print $kekka[0];
print "
";
}
mysql_close($s);
?>
+-----------------------------------------------------------------------+
2009/04/12
環境変数
phpinfo関数による表示の中の「Apache Environment」のブロックにあり、「Webサーバのソフトウェア」「クライアントIPアドレス」などの重要な情報が保管されている
REMOTE_ADDRは、使用中のマシンのIPアドレス(localhostの場合127.0.0.1)
■getenv関数
環境変数を返す、引数に指定した情報を得られる
getenv(得たい情報の項目)
■gethostbyaddr関数
IPアドレスからホスト名を得る
gethostbyaddr(得たいホストのIPアドレス)
例)クライアントのホスト名を表示する
<?php
print gethostbyaddr(getenv("REMOTE_ADDR"));
?>
REMOTE_ADDRは、使用中のマシンのIPアドレス(localhostの場合127.0.0.1)
■getenv関数
環境変数を返す、引数に指定した情報を得られる
getenv(得たい情報の項目)
得たい情報の項目 | 得られる情報 |
---|---|
SERVER_SOFTWARE | Webサーバーのソフトウェア |
SERVER_PORT | 使用しているポート |
PATH | サーバーに設定されているPATH |
REMOTE_ADDR | クライアントのIPアドレス |
HTTP_USER_AGENT | クライアントのブラウザの情報 |
■gethostbyaddr関数
IPアドレスからホスト名を得る
gethostbyaddr(得たいホストのIPアドレス)
例)クライアントのホスト名を表示する
<?php
print gethostbyaddr(getenv("REMOTE_ADDR"));
?>
PHPの基礎知識
「MySQL+PHPでWeb上でデータベースを操作する」をテーマに進めていくので、
まずはPHPの基礎を学習する。
気になったものだけを箇条書きでメモ。
・PHPでは変数に型を宣言しなくてよい
[変数のデータ型]
integer(整数)
float(浮動小数点)
double(浮動小数点)
string(文字列)
boolean(論理値)
object(オブジェクト)
array(配列)
NULL(空)
・文字列をつなげるには「.」
例)「あいうえお」と出力したい場合
「"あいう"."えお"」
◆「"」と「'」の違い◆
文字列のデータは「"」か「'」で囲む
「" "」で囲んだ変数は展開され、「' '」で囲った変数は展開されない
「" "」で囲った文字の中に「"」の文字を入れたり、「' '」で囲った文字の中に「'」の文字を入れたりすることはできない
[対処法]
・「\"」でエスケープ処理する
・「' '」と「" "」を組み合わせる
MySQLによるWebアプリケーションを作成するとき、PHPスクリプトによってSQL文を発行する
SQL文を文字列としてmysql_query関数の引数にする
mysql_query(文字列としてのSQL文)
例)INSERT INTO tb1 VALUES('A101',・・・)のSQL文を発行する
mysql_query("INSERT INTO tb1 VALUES('A101',・・・)")
■今回扱うPHP関数
(※mysql_で始まるのは、MySQLデータベースを扱う関数)
date関数
その他
■「繰り返し処理」
・for(初期値;繰り返しの条件;変化){
繰り返し実行する処理
}
・while(繰り返しを行う条件){
繰り返しの処理
}
最初にカウンタ変数の初期値を設定する
繰り返していくうちに、必ず繰り返しを行う条件がfalseになるようにする
・do{
繰り返しの処理
}while(繰り返しを行う条件)
■「条件分岐」
・if(条件が正しいときに実行する処理){
else{
条件が正しくないときに実行する処理
}
・switch(変数){
case 変数の値1:
処理1
break;
case 変数の値2:
処理2
break;
...
default:
すべての条件が正しくないときに実行する処理
}
変数がcaseの条件と一致した場合、それぞれの処理が実行される
一致する値がなければ、default:以降の処理を実行
■「配列」「連想配列」
まずはPHPの基礎を学習する。
気になったものだけを箇条書きでメモ。
・PHPでは変数に型を宣言しなくてよい
[変数のデータ型]
integer(整数)
float(浮動小数点)
double(浮動小数点)
string(文字列)
boolean(論理値)
object(オブジェクト)
array(配列)
NULL(空)
・文字列をつなげるには「.」
例)「あいうえお」と出力したい場合
「"あいう"."えお"」
◆「"」と「'」の違い◆
文字列のデータは「"」か「'」で囲む
「" "」で囲んだ変数は展開され、「' '」で囲った変数は展開されない
「" "」で囲った文字の中に「"」の文字を入れたり、「' '」で囲った文字の中に「'」の文字を入れたりすることはできない
[対処法]
・「\"」でエスケープ処理する
・「' '」と「" "」を組み合わせる
MySQLによるWebアプリケーションを作成するとき、PHPスクリプトによってSQL文を発行する
SQL文を文字列としてmysql_query関数の引数にする
mysql_query(文字列としてのSQL文)
例)INSERT INTO tb1 VALUES('A101',・・・)のSQL文を発行する
mysql_query("INSERT INTO tb1 VALUES('A101',・・・)")
■今回扱うPHP関数
関数名 | 内容 |
---|---|
die | スクリプトの実行を中止する |
exec | コマンドを実行する |
phpinfo | PHPの情報を表示する |
mysql_connect | MySQLサーバーに接続する |
mysql_close | MySQLサーバーから切断する |
mysql_select_db | 使うデータベースを指定する |
mysql_fetch_array | SQL文を発行する |
mysql_error | 最後に起こったエラーを返す |
getenv | 環境変数を得る |
gethostbyname | ホスト名からIPアドレスを得る |
gethostbyaddr | IPアドレスからホスト名を得る |
(※mysql_で始まるのは、MySQLデータベースを扱う関数)
date関数
日時の書式 | 返す値 |
---|---|
g | 12時間単位の「時」 |
h | 12時間単位の「時」2桁表示 |
G | 24時間単位の「時」 |
H | 24時間単位の「時」2桁表示 |
j | 「日」 |
l | 「曜日」の英語の文字列 |
F | 「月」の英語の文字列 |
n | 「月」 |
m | 「月」2桁表示 |
s | 「秒」2桁表示 |
Y | 「年」 |
y | 「年」2桁表示 |
その他
■「繰り返し処理」
・for(初期値;繰り返しの条件;変化){
繰り返し実行する処理
}
・while(繰り返しを行う条件){
繰り返しの処理
}
最初にカウンタ変数の初期値を設定する
繰り返していくうちに、必ず繰り返しを行う条件がfalseになるようにする
・do{
繰り返しの処理
}while(繰り返しを行う条件)
■「条件分岐」
・if(条件が正しいときに実行する処理){
else{
条件が正しくないときに実行する処理
}
・switch(変数){
case 変数の値1:
処理1
break;
case 変数の値2:
処理2
break;
...
default:
すべての条件が正しくないときに実行する処理
}
変数がcaseの条件と一致した場合、それぞれの処理が実行される
一致する値がなければ、default:以降の処理を実行
■「配列」「連想配列」
IE6で透過pngを表示する
久しぶりにやってきました、この課題。
前回やったときはスイスイできたはずなのに、なぜか今回はうまくいかない・・・。
結局最終的にできたのは、この方法でした。
透過PNGをCSSで背景に指定してIE6や5.5のバージョンでも綺麗に表示してみる(参考)
①iepngfix.jsをダウンロードし、ディレクトリに保存
②透過pngを含むHTMLファイルの<head>~</head>内に、以下を記述
<script language="JavaScript" type="text/javascript" src="iepngfix.js"></script>
③CSSの背景画像として読み込んでいる タグorIDorクラス に、以下を設定
* html タグorIDorクラス {
behavior: expression(IEPNGFIX.fix(this));
}
----
ほかに試した方法で、JQueryを使う方法がある。
①以下をダウンロード
pngFix.zip
②この中の2つのjsファイルをコピーし、ディレクトリに保存
・jquery-1.3.2.min.js
・jquery.pngFix.js
③HTMLファイルの<head>~</head>内に、以下を記述
<script type="text/javascript" src="jquery-1.3.2.min.js"></script>
<script type="text/javascript" src="jquery.pngFix.js"></script>
<script type="text/javascript">
$(document).ready(function(){
$(document).pngFix();
});
</script>
・・・でもなぜかこれを<a>タグに読み込んだCSSの背景画像として表示させると、IE6でリンクがきかなくなってしまった。そのため、今回は見送ります。。。
私のやり方が間違っている可能性もあるので、またトライしてみたい。
前回やったときはスイスイできたはずなのに、なぜか今回はうまくいかない・・・。
結局最終的にできたのは、この方法でした。
透過PNGをCSSで背景に指定してIE6や5.5のバージョンでも綺麗に表示してみる(参考)
①iepngfix.jsをダウンロードし、ディレクトリに保存
②透過pngを含むHTMLファイルの<head>~</head>内に、以下を記述
<script language="JavaScript" type="text/javascript" src="iepngfix.js"></script>
③CSSの背景画像として読み込んでいる タグorIDorクラス に、以下を設定
* html タグorIDorクラス {
behavior: expression(IEPNGFIX.fix(this));
}
----
ほかに試した方法で、JQueryを使う方法がある。
①以下をダウンロード
pngFix.zip
②この中の2つのjsファイルをコピーし、ディレクトリに保存
・jquery-1.3.2.min.js
・jquery.pngFix.js
③HTMLファイルの<head>~</head>内に、以下を記述
<script type="text/javascript" src="jquery-1.3.2.min.js"></script>
<script type="text/javascript" src="jquery.pngFix.js"></script>
<script type="text/javascript">
$(document).ready(function(){
$(document).pngFix();
});
</script>
・・・でもなぜかこれを<a>タグに読み込んだCSSの背景画像として表示させると、IE6でリンクがきかなくなってしまった。そのため、今回は見送ります。。。
私のやり方が間違っている可能性もあるので、またトライしてみたい。
ラベル:
css,
javascript
2009/04/05
SELECTしたコードからSELECTする(サブクエリ)
サブクエリが使えるのはMySQL4.1以降のみ
サブクエリ・・・「副問い合わせ」
クエリを実行して取り出されたデータを使って、さらにクエリを発行する(2段階処理)
例えば、
最も売上の高い社員データを抽出するにあたって、
SELECT * FROM tb ORDER BY uria DESC LIMIT 1; (・・・①)
という方法でやってみたけれど、
サブクエリを使うと、こんなやり方ができる。
SELECT * FROM tb WHERE uria IN (SELECT MAX(uria) FROM tb); (・・・②)
もし最高売上獲得社員が複数いた場合、
①のやり方では一人しか抽出できないので、正確に最高額を売り上げた社員を割り出すことはできないが、②のやり方なら何人いても大丈夫!
GROUP BY関数
MAXやAVG、SUMなどの集計を行う関数はGROUP BY関数と呼ばれ、本来はグループ化したときの値を処理する。ただし、「GROUP BY・・・」がない場合は、テーブル全体を1つのグループとして処理する。
■INを使う -カラムを返すサブクエリ-
サブクエリがカラムを返す例
1段階目:サブクエリで条件に一致したカラムを返す
2段階目:その値を含むレコードを対象に抽出する
サブクエリの構文
SELECT 表示するカラム FROM テーブル名 WHERE カラム名 IN (SELECTによるサブクエリでカラムを抽出);
INではなく=(イコール)を使おうとすると、サブクエリが1件以上抽出された場合は
「Subquery returns more than 1 row」
というエラーになる。
INは「・・・の中のどれか」という意味になるので、安心。
■EXISTSで、存在するレコードだけを対象にする
特定のカラムではなく、1段階目のサブクエリが「対象となるレコードが存在する」という情報を返す
NOT EXISTSで、サブクエリによって抽出されないレコードを対象にして処理する
サブクエリ・・・「副問い合わせ」
クエリを実行して取り出されたデータを使って、さらにクエリを発行する(2段階処理)
例えば、
最も売上の高い社員データを抽出するにあたって、
SELECT * FROM tb ORDER BY uria DESC LIMIT 1; (・・・①)
という方法でやってみたけれど、
サブクエリを使うと、こんなやり方ができる。
SELECT * FROM tb WHERE uria IN (SELECT MAX(uria) FROM tb); (・・・②)
もし最高売上獲得社員が複数いた場合、
①のやり方では一人しか抽出できないので、正確に最高額を売り上げた社員を割り出すことはできないが、②のやり方なら何人いても大丈夫!
GROUP BY関数
MAXやAVG、SUMなどの集計を行う関数はGROUP BY関数と呼ばれ、本来はグループ化したときの値を処理する。ただし、「GROUP BY・・・」がない場合は、テーブル全体を1つのグループとして処理する。
■INを使う -カラムを返すサブクエリ-
サブクエリがカラムを返す例
1段階目:サブクエリで条件に一致したカラムを返す
2段階目:その値を含むレコードを対象に抽出する
サブクエリの構文
SELECT 表示するカラム FROM テーブル名 WHERE カラム名 IN (SELECTによるサブクエリでカラムを抽出);
INではなく=(イコール)を使おうとすると、サブクエリが1件以上抽出された場合は
「Subquery returns more than 1 row」
というエラーになる。
INは「・・・の中のどれか」という意味になるので、安心。
■EXISTSで、存在するレコードだけを対象にする
特定のカラムではなく、1段階目のサブクエリが「対象となるレコードが存在する」という情報を返す
NOT EXISTSで、サブクエリによって抽出されないレコードを対象にして処理する
2009/04/04
複数のテーブルを利用する
■2つのテーブルのレコードを集めて表示
(SELECT カラム名1 FROM テーブル名1) UNION (SELECT カラム名2 FROM テーブル名2);
3つ以上のテーブルの場合もUNIONでつなげる
条件をつけてカラムを抽出する場合、
SELECT * FROM tb WHERE bang NOT IN('A101');
重複を省く場合、
UNION ALL
■複数のテーブルを結合して表示する(内部結合)
内部結合は、「JOIN」(あるいはINNER JOIN)により、キーが一致しているレコードだけを取り出す
SELECT カラム名 FORM テーブル1 JOIN 結合するテーブル2
ON テーブル1のカラム=テーブル2のカラム;
カラム名が同じ場合、
USING(カラム名);
テーブルが2つ以上の場合、
SELECT ~ FROM
テーブル名1
JOIN テーブル名2 結合の条件
JOIN テーブル名3 結合の条件
・・・
;
■複数のテーブルの全てのレコードを表示する(外部結合)
外部結合は、一致していなくても一方のテーブルのレコードはすべての取り出す
※存在しない値は、「NULL」になる
・左外部結合(LEFT JOIN または LEFT OUTER JOIN)
一致したレコード+テーブル1の全データ
SELECT カラム名 FROM テーブル1
LEFT JOIN 結合するテーブル2
ON テーブル1のカラム= テーブル2のカラム;
・右外部結合(RIGHT JOIN または RIGHT OUTER JOIN)
一致したレコード+テーブル2の全データ
SELECT カラム名 FROM テーブル1
RIGHT JOIN 結合するテーブル2
ON テーブル1のカラム= テーブル2のカラム;
■自己結合
同じカラム名が2つ表示されてエラーになるため、必ずエイリアスをつける
SELECT カラム名 FROM テーブル名 AS エイリアス1 JOIN テーブル名 AS エイリアス2;
自己結合の活用法
・すべての組み合わせを表示し、そこから条件をつけて必要なものを選べる
(順位付けをするにはORDERとGROUPを組み合わせて処理する必要がある)
SELECT a.nama,a.tosi,COUNT(*) FROM tb1 AS b WHERE a.tosi<=b.tosi GROUP BY a.bang;
(SELECT カラム名1 FROM テーブル名1) UNION (SELECT カラム名2 FROM テーブル名2);
3つ以上のテーブルの場合もUNIONでつなげる
条件をつけてカラムを抽出する場合、
SELECT * FROM tb WHERE bang NOT IN('A101');
重複を省く場合、
UNION ALL
■複数のテーブルを結合して表示する(内部結合)
内部結合は、「JOIN」(あるいはINNER JOIN)により、キーが一致しているレコードだけを取り出す
SELECT カラム名 FORM テーブル1 JOIN 結合するテーブル2
ON テーブル1のカラム=テーブル2のカラム;
カラム名が同じ場合、
USING(カラム名);
テーブルが2つ以上の場合、
SELECT ~ FROM
テーブル名1
JOIN テーブル名2 結合の条件
JOIN テーブル名3 結合の条件
・・・
;
■複数のテーブルの全てのレコードを表示する(外部結合)
外部結合は、一致していなくても一方のテーブルのレコードはすべての取り出す
※存在しない値は、「NULL」になる
・左外部結合(LEFT JOIN または LEFT OUTER JOIN)
一致したレコード+テーブル1の全データ
SELECT カラム名 FROM テーブル1
LEFT JOIN 結合するテーブル2
ON テーブル1のカラム= テーブル2のカラム;
・右外部結合(RIGHT JOIN または RIGHT OUTER JOIN)
一致したレコード+テーブル2の全データ
SELECT カラム名 FROM テーブル1
RIGHT JOIN 結合するテーブル2
ON テーブル1のカラム= テーブル2のカラム;
■自己結合
同じカラム名が2つ表示されてエラーになるため、必ずエイリアスをつける
SELECT カラム名 FROM テーブル名 AS エイリアス1 JOIN テーブル名 AS エイリアス2;
自己結合の活用法
・すべての組み合わせを表示し、そこから条件をつけて必要なものを選べる
(順位付けをするにはORDERとGROUPを組み合わせて処理する必要がある)
SELECT a.nama,a.tosi,COUNT(*) FROM tb1 AS b WHERE a.tosi<=b.tosi GROUP BY a.bang;
UPDATE、DELETEコマンド 【データ編集・削除編】
■カラムのデータを修正する
UPDATE テーブル名 SET カラム名=修正する値;
・条件をつける
~ WHERE 条件
・並べ替え後の抽出
~ ORDER BY カラム名 LIMIT 限定数
例) ALTER TABLE tb ADD bikou VARCHAR(100);
UPDATE tb SET bikou='no data';
(一行で書くと、ALTER TABLE tb ADD bikou VARCHAR(100) DEFAULT 'no data';)
UPDATE tb SET bikou='good!' ORDER BY uria DESC LIMIT 3;
■条件に一致したレコードをコピーする
CREATE TABLE 新規テーブル名 SELECT * FROM tb WHERE カラム名 LIKE '抽出する文字列';
すでに存在するテーブルにレコードを挿入する場合、
INSERT INTO 存在するテーブル名 SELECT * FROM tb WHERE bang LIKE 'A101';
・順番に並べ替え、抽出してコピー
CREATE TABLE 新規テーブル名 SELECT * FROM tb ORDER BY uria DESC LIMIT 4 OFFSET 1;
■条件に一致したレコードを削除する
DELETE FROM テーブル名;(テーブルのカラム構造自体は残る)
DELETE FROM テーブル名 WHERE 条件;
DELETE FROM テーブル名 ORDER BY カラム名 LIMIT 限定数;
UPDATE テーブル名 SET カラム名=修正する値;
・条件をつける
~ WHERE 条件
・並べ替え後の抽出
~ ORDER BY カラム名 LIMIT 限定数
例) ALTER TABLE tb ADD bikou VARCHAR(100);
UPDATE tb SET bikou='no data';
(一行で書くと、ALTER TABLE tb ADD bikou VARCHAR(100) DEFAULT 'no data';)
UPDATE tb SET bikou='good!' ORDER BY uria DESC LIMIT 3;
■条件に一致したレコードをコピーする
CREATE TABLE 新規テーブル名 SELECT * FROM tb WHERE カラム名 LIKE '抽出する文字列';
すでに存在するテーブルにレコードを挿入する場合、
INSERT INTO 存在するテーブル名 SELECT * FROM tb WHERE bang LIKE 'A101';
・順番に並べ替え、抽出してコピー
CREATE TABLE 新規テーブル名 SELECT * FROM tb ORDER BY uria DESC LIMIT 4 OFFSET 1;
■条件に一致したレコードを削除する
DELETE FROM テーブル名;(テーブルのカラム構造自体は残る)
DELETE FROM テーブル名 WHERE 条件;
DELETE FROM テーブル名 ORDER BY カラム名 LIMIT 限定数;
2009/04/03
表示の工夫【関数の処理など】
エイリアス(alias)・・・本物を参照するためにユーザーが自由につけた名前。偽名。別名。ニックネーム。
■カラム名をエイリアスにする
SELECT カラム名 AS エイリアス FROM テーブル名;
※複数のカラム名を指定するときは、「,」で区切って「カラム名 AS エイリアス」を付け加えていく
■関数を使って計算する
平均 AVG()
合計 SUM()
個数 COUNT()
結合 CONCAT() ※文字列を直接指定することもできる
など他にもたくさんの関数がある
たとえば
円周率 PI()
のように、テーブルと全く無縁の関数もある
引数は不要の場合も必ず付ける!
・MySQLサーバーのバージョン
SELECT VERSION();
・現在使っているデータベースを表示
SELECT DATABASE();
・現在のユーザーを表示
SELECT USER();
・引数で指定した文字の文字コード(文字セット)を表示
SELECT CHARSET('この文字');
■文字列操作で活躍する関数
・右から取り出す:RIGHT関数
・左から取り出す:LIGHT関数
例) SELECT RIGHT(bang,2) FROM tb;
「bangの右から2文字を表示する」
・X番目から△個取り出す:SUBSTRING関数
例) SELECT SUBSTRING(bang,2,3) FROM tb;
「bangの2文字目から3文字分を表示する」
・繰り返して表示:REPEAT関数
例) SELECT REPEAT(' .' , tosi) FROM tb;
「「.」の文字をtosiの回数だけ繰り返して表示する」
・逆さから表示:REVERSE関数
例) SELECT REVERSE(nama) FROM tb;
「nama(氏名)のデータの文字列を逆さに表示する」
■日付・時刻の関数
NOW関数 現在の日付と時刻の値を返す
DATETIME型に設定してカラムを入力する
■条件を指定した選択
・レコードを決めて表示する
LIMIT関数
SELECT カラム名 FROM テーブル名 LIMIT 表示するレコード数;
・WHEREを使った抽出(条件に一致したレコードだけを取り出す)
SELECT カラム名 FROM テーブル名 WHERE 条件;
※条件には、比較演算子などを使う
[比較演算子]
= 等しい
> より大きい
>= 以上
< より小さい
<= 以下
<> とは異なる
○ IN × ×のリスト中に○がある
○ NOT IN × ×のリスト中に○がない
○ BETWEEN × AND ×× ×から××の間に○がある
○ NOT BETWEEN × AND ×× ×から××の間に○がない
・文字列を使った条件
WHERE カラム名='文字列'
・LIKE:あいまい検索
WHERE LIKE '~'
「~の文字列を含む」
NOT LIKE '~'
「~の文字列を含まない」
[ワイルドカード]
% 任意の文字列
_ 任意の一文字
・NULLを使った条件
WHERE カラム名 IS NULL
「カラムがNULLのレコードを抽出」
IS NOT NULL
「カラムがNULLでないレコードを抽出」
・重複したデータを省いて抽出
SELECT DISTINCT カラム名 FROM テーブル名;
・複数の条件を指定
AND かつ
OR または
※ANDが優先して処理される
優先したい処理は()で囲むとよい
CASE WHEN:条件によって入力する値を変化させる
CASE
WHEN 条件1 THEN 表示する値
WHEN 条件2 THEN 表示する値
WHEN 条件3 THEN 表示する値
・・・・・
ELSE すべての条件に当てはまらないときの値
END
・並べ替え
昇順
SELECT カラム名 FROM テーブル名 ORDER BY キーとなるカラム ASC;
降順
SELECT カラム名 FROM テーブル名 ORDER BY キーとなるカラム DESC ;
降順に下から5件だけ表示するとき
SELECT カラム名 FROM テーブル名 ORDER BY キーとなるカラム DESC LIMIT 5;
・表示するレコードの範囲を決める
SELECT カラム名 FROM テーブル名 LIMIT 表示するレコード OFFSET 表示開始レコードのシフト数;
表示開始のレコード数とは、「何個移動したところから表示させるか」を指定する数
(「指定した数の次」個目から表示)
・グループごとに表示
グループとして扱うことで、グループ単位での処理が可能になる
GROUP BY:グループ化
SELECT カラム名 FROM テーブル名 GROUP BY グループ化するカラム名;
指定したカラムの偶然選ばれたレコードが表示される
ただし、処理の対象は同じグループに属するすべてのレコードが対象
・グループごとの数を数える
例) SELECT bang,COUNT(*) AS 件数 FROM tb GROUP BY bang;
・グループごとの合計・平均を表示する
例) SELECT bang,SUM(uria) AS 合計 FROM tb GROUP BY bang;
SELECT bang,AVG(uria) AS 平均 FROM tb GROUP BY bang;
・グループに分けて条件をつけて取り出す
「グループ化した後で抽出」
SELECT 集計したカラム FROM テーブル名 GROUP BY グループ化するカラム HAVING 条件;
「抽出してからグループ化」
SELECT 集計したカラム FROM テーブル名 WHERE 条件 GROUP BY グループ化するカラム;
「グループ化してから並べ替える」
SELECT 集計したカラム FROM テーブル名 GROUP BY グループ化するカラム ORDER BY キーとなるカラム;
+------------------------------+
◆記述順のポイント◆
①WHERE条件
↓
②GROUP BY
↓
③ORDER BY ○○ (DESC)
+------------------------------+
■カラム名をエイリアスにする
SELECT カラム名 AS エイリアス FROM テーブル名;
※複数のカラム名を指定するときは、「,」で区切って「カラム名 AS エイリアス」を付け加えていく
■関数を使って計算する
平均 AVG()
合計 SUM()
個数 COUNT()
結合 CONCAT() ※文字列を直接指定することもできる
など他にもたくさんの関数がある
たとえば
円周率 PI()
のように、テーブルと全く無縁の関数もある
引数は不要の場合も必ず付ける!
・MySQLサーバーのバージョン
SELECT VERSION();
・現在使っているデータベースを表示
SELECT DATABASE();
・現在のユーザーを表示
SELECT USER();
・引数で指定した文字の文字コード(文字セット)を表示
SELECT CHARSET('この文字');
■文字列操作で活躍する関数
・右から取り出す:RIGHT関数
・左から取り出す:LIGHT関数
例) SELECT RIGHT(bang,2) FROM tb;
「bangの右から2文字を表示する」
・X番目から△個取り出す:SUBSTRING関数
例) SELECT SUBSTRING(bang,2,3) FROM tb;
「bangの2文字目から3文字分を表示する」
・繰り返して表示:REPEAT関数
例) SELECT REPEAT(' .' , tosi) FROM tb;
「「.」の文字をtosiの回数だけ繰り返して表示する」
・逆さから表示:REVERSE関数
例) SELECT REVERSE(nama) FROM tb;
「nama(氏名)のデータの文字列を逆さに表示する」
■日付・時刻の関数
NOW関数 現在の日付と時刻の値を返す
DATETIME型に設定してカラムを入力する
■条件を指定した選択
・レコードを決めて表示する
LIMIT関数
SELECT カラム名 FROM テーブル名 LIMIT 表示するレコード数;
・WHEREを使った抽出(条件に一致したレコードだけを取り出す)
SELECT カラム名 FROM テーブル名 WHERE 条件;
※条件には、比較演算子などを使う
[比較演算子]
= 等しい
> より大きい
>= 以上
< より小さい
<= 以下
<> とは異なる
○ IN × ×のリスト中に○がある
○ NOT IN × ×のリスト中に○がない
○ BETWEEN × AND ×× ×から××の間に○がある
○ NOT BETWEEN × AND ×× ×から××の間に○がない
・文字列を使った条件
WHERE カラム名='文字列'
・LIKE:あいまい検索
WHERE LIKE '~'
「~の文字列を含む」
NOT LIKE '~'
「~の文字列を含まない」
[ワイルドカード]
% 任意の文字列
_ 任意の一文字
・NULLを使った条件
WHERE カラム名 IS NULL
「カラムがNULLのレコードを抽出」
IS NOT NULL
「カラムがNULLでないレコードを抽出」
・重複したデータを省いて抽出
SELECT DISTINCT カラム名 FROM テーブル名;
・複数の条件を指定
AND かつ
OR または
※ANDが優先して処理される
優先したい処理は()で囲むとよい
CASE WHEN:条件によって入力する値を変化させる
CASE
WHEN 条件1 THEN 表示する値
WHEN 条件2 THEN 表示する値
WHEN 条件3 THEN 表示する値
・・・・・
ELSE すべての条件に当てはまらないときの値
END
・並べ替え
昇順
SELECT カラム名 FROM テーブル名 ORDER BY キーとなるカラム ASC;
降順
SELECT カラム名 FROM テーブル名 ORDER BY キーとなるカラム DESC ;
降順に下から5件だけ表示するとき
SELECT カラム名 FROM テーブル名 ORDER BY キーとなるカラム DESC LIMIT 5;
・表示するレコードの範囲を決める
SELECT カラム名 FROM テーブル名 LIMIT 表示するレコード OFFSET 表示開始レコードのシフト数;
表示開始のレコード数とは、「何個移動したところから表示させるか」を指定する数
(「指定した数の次」個目から表示)
・グループごとに表示
グループとして扱うことで、グループ単位での処理が可能になる
GROUP BY:グループ化
SELECT カラム名 FROM テーブル名 GROUP BY グループ化するカラム名;
指定したカラムの偶然選ばれたレコードが表示される
ただし、処理の対象は同じグループに属するすべてのレコードが対象
・グループごとの数を数える
例) SELECT bang,COUNT(*) AS 件数 FROM tb GROUP BY bang;
・グループごとの合計・平均を表示する
例) SELECT bang,SUM(uria) AS 合計 FROM tb GROUP BY bang;
SELECT bang,AVG(uria) AS 平均 FROM tb GROUP BY bang;
・グループに分けて条件をつけて取り出す
「グループ化した後で抽出」
SELECT 集計したカラム FROM テーブル名 GROUP BY グループ化するカラム HAVING 条件;
「抽出してからグループ化」
SELECT 集計したカラム FROM テーブル名 WHERE 条件 GROUP BY グループ化するカラム;
「グループ化してから並べ替える」
SELECT 集計したカラム FROM テーブル名 GROUP BY グループ化するカラム ORDER BY キーとなるカラム;
+------------------------------+
◆記述順のポイント◆
①WHERE条件
↓
②GROUP BY
↓
③ORDER BY ○○ (DESC)
+------------------------------+
テーブルやレコードのコピー・削除、さまざまな抽出方法など
■テーブルのコピー方法
・テーブルのカラム構造+データのコピー
CREATE TABLE 新規テーブル名 SELECT * FROM 元となるテーブル名;
・テーブルのカラム構造だけをコピー
CREATE TABLE 新規テーブル名 LIKE 元となるテーブル名;
AUTO_INCREMENTやPRIMARY KEYの属性もコピーされる
・他のテーブルのデータのみコピー
INSERT INTO テーブル名 SELECT * FROM 元となるテーブル名;
・特定カラムを選択してコピー
INSERT INTO テーブル名(カラム名) SELECT カラム名 FROM 元となるテーブル名;
※データ型が同じであること!
■テーブル・データベース・レコードの削除
・テーブルを削除
DROP TABLE テーブル名;
・もし指定のテーブルがあれば削除する
DROP TABLE IF EXISTS テーブル名;
・データベースの削除
DROP DATABASE データベース名;
・レコード丸ごと削除
DELETE FROM テーブル名;
※丸ごとでなくレコードを選択して削除するときは
「WHERE」で条件を設定する
・テーブルのカラム構造+データのコピー
CREATE TABLE 新規テーブル名 SELECT * FROM 元となるテーブル名;
・テーブルのカラム構造だけをコピー
CREATE TABLE 新規テーブル名 LIKE 元となるテーブル名;
AUTO_INCREMENTやPRIMARY KEYの属性もコピーされる
・他のテーブルのデータのみコピー
INSERT INTO テーブル名 SELECT * FROM 元となるテーブル名;
・特定カラムを選択してコピー
INSERT INTO テーブル名(カラム名) SELECT カラム名 FROM 元となるテーブル名;
※データ型が同じであること!
■テーブル・データベース・レコードの削除
・テーブルを削除
DROP TABLE テーブル名;
・もし指定のテーブルがあれば削除する
DROP TABLE IF EXISTS テーブル名;
・データベースの削除
DROP DATABASE データベース名;
・レコード丸ごと削除
DELETE FROM テーブル名;
※丸ごとでなくレコードを選択して削除するときは
「WHERE」で条件を設定する
xamppのインストール
いつもいつも、悩まされるのが最初の環境作り。
今回もXPでは問題なくできたものの、
家のVISTAでやってみたらAPACHEのインストールがうまくいかない。
エラーメッセージ:
「ポート80または443(SSL)はすでに利用されています。Apache2をサービスとしてインストールするのに失敗しました。」
どうやらポート番号がかぶっている模様。。。
ネットで調べたらSkypeが標準でポート80番を使っているらしい。
Skypeの
[Tools > Options > Connections ]で、
Use ports 80 and 443 for incoming connectionsのチェックを外せばいいらしいが、
[Connections]がないんですけどぉ???
よく分かりません。。。
今回もXPでは問題なくできたものの、
家のVISTAでやってみたらAPACHEのインストールがうまくいかない。
エラーメッセージ:
「ポート80または443(SSL)はすでに利用されています。Apache2をサービスとしてインストールするのに失敗しました。」
どうやらポート番号がかぶっている模様。。。
ネットで調べたらSkypeが標準でポート80番を使っているらしい。
Skypeの
[Tools > Options > Connections ]で、
Use ports 80 and 443 for incoming connectionsのチェックを外せばいいらしいが、
[Connections]がないんですけどぉ???
よく分かりません。。。
MySQLのコマンドいろいろ【カラム構造変更編】
■カラムの定義を変更する
alter table テーブル名 modify カラム名 データ型;
カラム順を変更するには、
alter table テーブル名 modify 対象カラム 場所;
■カラムを追加する
alter table テーブル名 add カラム名 データ型;
カラムの先頭に新規カラムを追加するには、
alter table テーブル名 add カラム名 データ型 first;
任意カラムの後に新規カラムを追加する場合、
alter table テーブル名 add カラム名 データ型 after 任意カラム名;
■カラムの名前と定義を変更する
alter table テーブル名 change 変更前カラム名 変更後カラム名 変更後データ型;
■カラムを削除する
alter table テーブル名 drop カラム名;
alter table テーブル名 modify カラム名 データ型;
カラム順を変更するには、
alter table テーブル名 modify 対象カラム 場所;
■カラムを追加する
alter table テーブル名 add カラム名 データ型;
カラムの先頭に新規カラムを追加するには、
alter table テーブル名 add カラム名 データ型 first;
任意カラムの後に新規カラムを追加する場合、
alter table テーブル名 add カラム名 データ型 after 任意カラム名;
■カラムの名前と定義を変更する
alter table テーブル名 change 変更前カラム名 変更後カラム名 変更後データ型;
■カラムを削除する
alter table テーブル名 drop カラム名;
データ型<よく使うものだけ~>
「フィールド」…テーブルを構成する項目のデータ
「カラム」…実際に入力されたレコードを構成する項目のデータ
データベース名やテーブル名、カラム名には日本語を使わない!
「カラム」…実際に入力されたレコードを構成する項目のデータ
データベース名やテーブル名、カラム名には日本語を使わない!
■数値型■ | |
INT | 正負の整数(-2147483648~2147483647) |
DOUBLE | 小数点以下(「○E+△(○×10の△乗)」) |
■文字列型■ | |
VARCHAR(最大文字数) | 文字データ(255文字まで) |
TEXT(最大文字数) | 文字データ(65535文字まで) |
■日付・時刻型■ | |
DATETIME | 日付と時刻 YYYY-MM-DD HH:MM:SS |
DATE | 日付のみ YYYY-MM-DD |
MySQLのコマンドいろいろ【テーブル操作編】
■テーブルの作成
create table テーブル名 (カラム名1 データ型1, カラム名2 データ型2 ...);
主キー※を設定してテーブルを作成する場合、
create table テーブル名 (カラム名 データ型 primary key...);
※主キーはレコードを厳密に特定できるように
・値の重複がない
・何のデータも入力しない(null)ことはできない
主キーの代わりに、一意キー(unique)を指定することもできる
一意キーは、重複はできないがnullを入力することは可能
自動的に連続番号が入力されるauto_incrementは、主キーに適する
例:create table renzoku (a INT AUTO_INCREMENT PRIMARY KEY, b VARCHAR(10));
■すべてのテーブルの表示
show tables;
文字セットを指定してテーブルを作る場合、
(Shift_JISを指定してテーブルを作成)
create table テーブル名 (カラム名1 データ型1, カラム名2 データ型2 ...) charset=sjis;
■他のデータベースへのアクセス
select * from データベース名.テーブル名;
■テーブルのカラム構造の確認
desc テーブル名;
[見方]
null…何も入力しなくても許す!
default…何も入らなければこの値
Field…カラム名
Type…データ型
■データの挿入
insert into テーブル名 values(データ1,データ2...);
設定したカラムの順に、データを「,」で区切って記述
※文字列データは「"(ダブルクォーテーション)」「'(シングルクォーテーション)」で囲む
■カラム名を指定してデータを挿入する
insert into テーブル名 (カラム1,カラム2...) values(データ1,データ2...);
■一度にデータを入力する
insert into テーブル名 (カラム1,カラム2...) values(データ1,データ2...),(データ1,データ2...),(データ1,データ2...);
■データの表示
select カラム1,カラム2... from テーブル名;
全部のカラムの場合、
select * from テーブル名;
create table テーブル名 (カラム名1 データ型1, カラム名2 データ型2 ...);
主キー※を設定してテーブルを作成する場合、
create table テーブル名 (カラム名 データ型 primary key...);
※主キーはレコードを厳密に特定できるように
・値の重複がない
・何のデータも入力しない(null)ことはできない
主キーの代わりに、一意キー(unique)を指定することもできる
一意キーは、重複はできないがnullを入力することは可能
自動的に連続番号が入力されるauto_incrementは、主キーに適する
例:create table renzoku (a INT AUTO_INCREMENT PRIMARY KEY, b VARCHAR(10));
■すべてのテーブルの表示
show tables;
文字セットを指定してテーブルを作る場合、
(Shift_JISを指定してテーブルを作成)
create table テーブル名 (カラム名1 データ型1, カラム名2 データ型2 ...) charset=sjis;
■他のデータベースへのアクセス
select * from データベース名.テーブル名;
■テーブルのカラム構造の確認
desc テーブル名;
[見方]
null…何も入力しなくても許す!
default…何も入らなければこの値
Field…カラム名
Type…データ型
■データの挿入
insert into テーブル名 values(データ1,データ2...);
設定したカラムの順に、データを「,」で区切って記述
※文字列データは「"(ダブルクォーテーション)」「'(シングルクォーテーション)」で囲む
■カラム名を指定してデータを挿入する
insert into テーブル名 (カラム1,カラム2...) values(データ1,データ2...);
■一度にデータを入力する
insert into テーブル名 (カラム1,カラム2...) values(データ1,データ2...),(データ1,データ2...),(データ1,データ2...);
■データの表示
select カラム1,カラム2... from テーブル名;
全部のカラムの場合、
select * from テーブル名;
MySQLのコマンドいろいろ【データベース操作編】
■MySQLモニタの起動
mysql -u ユーザー名 -pパスワード(※-pの後には半角スペースを入れない)
-----
mysql -u ユーザー名 -p
Enter password:
の方が、パスワードを盗み見られてしまうことがにため、より安全
■MySQLモニタの終了
exit(あるいは quit)
■新規ユーザーの作成
create user 新規ユーザー名 identified by '新規パスワード';
■ユーザー権限を設定
grant 与える権限 on データベース名.テーブル名 to ユーザー名;
[与える権限について]
・全権限 「ALL」
・指定する場合 「例)SELECT,UPDATE」
・全データベースの全テーブル 「*.*」
■ユーザーの削除
drop user ユーザー名;
■データベースの作成
create database データベース名;
■データベースの一覧を表示
show databases;
■使うデータベースを指定する
use データベース名
(※SQL文ではないので最後に「;」は不要)
¥U データベース名
■現在使用しているデータベースの表示
select database();
データベースをあらかじめ選択して、MySQLモニタを起動するには、
mysql データベース名 -u root -p
とすればよい
mysql -u ユーザー名 -pパスワード(※-pの後には半角スペースを入れない)
-----
mysql -u ユーザー名 -p
Enter password:
の方が、パスワードを盗み見られてしまうことがにため、より安全
■MySQLモニタの終了
exit(あるいは quit)
■新規ユーザーの作成
create user 新規ユーザー名 identified by '新規パスワード';
■ユーザー権限を設定
grant 与える権限 on データベース名.テーブル名 to ユーザー名;
[与える権限について]
・全権限 「ALL」
・指定する場合 「例)SELECT,UPDATE」
・全データベースの全テーブル 「*.*」
■ユーザーの削除
drop user ユーザー名;
■データベースの作成
create database データベース名;
■データベースの一覧を表示
show databases;
■使うデータベースを指定する
use データベース名
(※SQL文ではないので最後に「;」は不要)
¥U データベース名
■現在使用しているデータベースの表示
select database();
データベースをあらかじめ選択して、MySQLモニタを起動するには、
mysql データベース名 -u root -p
とすればよい
Shift_JISでやっていくワケ【5C問題】
日本語を利用するため!
…なんだけど、それ以外の文字コードでは日本語に対応するターミナルソフト(例:コマンドプロンプト)が必要だったり、またShift_JISはWindowsでは初心者でも扱いやすいものだそう。
ただし、文字コードの中に「5C」が含まれてる文字では、エスケープ処理されて「¥」がついたり、文字化けすることがある。
代表的なものでは、 「十、申、貼、能、表、予、ソ」 など。
設定の変更はc:\xampp\mysql\bin内の「my.cnf」というファイルをメモ帳で開いて以下のように変更する。
(30行目付近)
[mysqld]
...
old-passwords
character-set-server = sjis
#collation-server = latin1_general_ci
skip-character-set-client-handshake
とりあえずはShift_JISで行きます。
…なんだけど、それ以外の文字コードでは日本語に対応するターミナルソフト(例:コマンドプロンプト)が必要だったり、またShift_JISはWindowsでは初心者でも扱いやすいものだそう。
ただし、文字コードの中に「5C」が含まれてる文字では、エスケープ処理されて「¥」がついたり、文字化けすることがある。
代表的なものでは、 「十、申、貼、能、表、予、ソ」 など。
設定の変更はc:\xampp\mysql\bin内の「my.cnf」というファイルをメモ帳で開いて以下のように変更する。
(30行目付近)
[mysqld]
...
old-passwords
character-set-server = sjis
#collation-server = latin1_general_ci
skip-character-set-client-handshake
とりあえずはShift_JISで行きます。
2009/04/02
基礎からのMySQL
ようやくRuby①の本が終わりました…。(時間かかりすぎ)
そして今日からスタートです!!
データベースは初めてだけど、前にRuby on RailsやPHPをやったときにデータベースをちょこっと触っていたのもあって、今のところ順調です。このまま行けますように・・・☆
今回はxamppを使ってやりまーす。
登録:
投稿 (Atom)