mysql


【mysql】特定の長さの文字列だけをselectで取り出す

フィールドの中の、特定の長さのレコードだけを取り出す場合の記述

SELECT * FROM table1 WHERE LENGTH(field1) > 60

mysqlの正規表現で括弧()をマッチさせる

mysqlの正規表現で括弧()をマッチさせるには、エスケープシーケンスを連続して記述する。(\\)

下記は 行頭が (11) の文字列にマッチさせる場合。

REGEXP '^\\(11\\)'

エスケープシーケンス(\)が1つの場合はMySQLに対するエスケープとみなされる。
正規表現としてのエスケープするために、2つ並べている。

PHPファイルの中にsql文を記述する場合は、「\」が四つ並んだりする

$sql = "SELECT field FROM table WHERE field REGEXP '^\\\\(11\\\\)'";

mysqlで正規表現を使って置換する方法

mysqlは正規表現のREGEXP関数、置換のREPLACE関数があるが、同時に使えない。

なのでPHPを組み合わせて利用する方法を取る。

次のPHPスクリプトでは、field1 に入っている文字列が「;」で終わっていた場合に、その部分だけを削除している。

--------------------------------------------------------------------------
<?php
$pattern = ";$"; //正規表現のパターン

//mysqlの正規表現を使ってUPDATEの対象になるレコードを取り出す。
$sql = "SELECT field1 FROM table1 WHERE field1 REGEXP '" . $pattern . "'";
$result = mysql_query($sql) or die(mysql_error()); //sqlを実行

//全て展開
while ($item = mysql_fetch_array($result)) {
$in_data = $item['field1'];
$out_data = preg_replace( "/" . $pattern . "/", "", $in_data); //PHPで置換
$new_sql = "UPDATE table1 SET field1 = '".$out_data."' WHERE field1 = '".$in_data."'"; //置換した文字列をUPDATEするsql文
mysql_query($new_sql) or die(mysql_error()); //sqlを実行
}
?>
--------------------------------------------------------------------------

このファイルをサーバーにアップロードして、ブラウザでアクセスすればPHPおよび、mysqlが実行される。

【mysql】特定のフィールドで重複しているレコードを削除する

たとえば"field1"でレコードが重複しているので、一つを残してその他を削除したいときの手順。

1.field1をグループ化して、重複データを1つにまとめる。その状態のテーブルをコピー。

//グループ化してcopy_tableという名前のテーブルを作った。
CREATE TABLE copy_table as SELECT * FROM main_table GROUP BY field1

2.メインテーブルを削除。(くれぐれも自己責任で!)
DROP TABLE main_table

3.コピーしたテーブルをメインテーブルにリネーム。
ALTER TABLE copy_table RENAME TO main_table

【mysql】 カラムに文字列を追記する方法

すでに内容のあるカラムに文字列を追記するには、「concat」を使う。
以下のとおり。

UPDATE テーブル名 SET 追加先のカラム = concat(追加先のカラム, '追加したい文字列');

ちなみに、追加先のカラムが「null」の状態だと追記されません。

【mysql】複数のテーブルのデータをinsertで一つのテーブルにまとめる

複数のテーブルのデータを一つのテーブルにinsertで追加、まとめるsql

INSERT INTO table_name (column1,column2) SELECT column1,column2 from table_name2;

データが追加される側のカラムとデータを参照するカラムの構造は同じにしてください。

【mysql】すでにあるカラムにユニークキーやプライマルキーを追加する方法

すでにあるカラムにユニークキーやプライマルキーを追加するには次のSQL文を実行すればいい。

プライマルキーなら、

mysql> ALTER TABLE テーブル名 ADD PRIMARY KEY (カラム名);

ユニークキーなら、
mysql> ALTER TABLE テーブル名 ADD UNIQUE (カラム名);

もし、

ERROR 1170 (42000): BLOB/TEXT column 'text_field' used in key specification without a key length

のようなエラーが出たら、キーの長さを指定する必要があるので、

プライマルキーなら、

mysql> ALTER TABLE テーブル名 ADD PRIMARY KEY (カラム名(255以下のキーの長さ));

ユニークキーなら、
mysql> ALTER TABLE テーブル名 ADD UNIQUE (カラム名(255以下のキーの長さ));

こう記述するとエラーにならないはず。

しかし カラムが utf8mb4(一文字4バイト) の物に対してキーの長さを 255 にするとエラーが出る。

Specified key was too long; max key length is 767 bytes
(索引のキーが長すぎます。最大 767 バイトまでです。)

この場合、キー長さを 191 以下に下げればいい。

ALTER TABLE テーブル名 ADD PRIMARY KEY (カラム名(191));

4byte × 191 = 764byte

767byte 以内に収まる。

【mysql】3つのテーブルを結合する時の記述

mysqlで3つのテーブルをリレーションしたいときは次のように書く

SELECT * FROM table1 INNER JOIN table2 ON table1.id = table2.id INNER JOIN table3 ON table1.id = table3.id;

条件で絞りたいなら最後にWHEREをつける

SELECT * FROM table1 INNER JOIN table2 ON table1.id = table2.id INNER JOIN table3 ON table1.id = table3.id WHERE ~~;

[mysql]フィールドのデータがNULLの最小のプライマリキー(id番号)を出力

最大値が欲しければminをmaxに変える。

mysqlで文字数の多い順、少ない順で取り出す記述(ソート)

mysql文字列の多い順少ない順でのソート

■文字数が少ない順に取り出す記述
$sql = "SELECT *,CHAR_LENGTH(フィールド名) as MOJI_LEN FROM テーブル名 ORDER BY MOJI_LEN ASC";

■文字数が多い順に取り出す記述
$sql = "SELECT *,CHAR_LENGTH(フィールド名) as MOJI_LEN FROM テーブル名 ORDER BY MOJI_LEN ASC";