カテゴリー
SugiBlog Webエンジニアのためのお役立ちTips

ORDER BY句で使える条件式

SQLのORDER BY句では、特定のカラムを昇順や降順に並べ替えることができます。
更にCASE式を使えば任意の並び順にすることも可能です。

今回は、特定のカラムがNULLとなる場合があるテーブルで、NULLは最後にまとめて表示し、それ以外は昇順の表示になるようにしてみたいと思います。

例として以下のようなテーブルがあったとします。

TEST_TABLE
id name age
1 赤井 35
2 池田 22
3 内山 NULL
4 江崎 54
5 太田 NULL

年齢の昇順でデータを表示してみましょう。

SELECT * FROM TEST_TABLE ORDER BY age;

そうすると、NULLが先に表示され、それ以降が年齢の昇順という形になるかと思います。

TEST_TABLE
id name age
3 内山 NULL
5 太田 NULL
2 池田 22
1 赤井 35
4 江崎 54

これを、NULLは最後にまとめて表示し、それ以外を年齢の昇順で表示したい…というのが今回の焦点でしたね。
そのような場合にORDER BY句でCASEの条件式を使います。

SELECT * FROM TEST_TABLE 
ORDER BY
    CASE WHEN age IS NULL THEN 2 ELSE 1 END,
    age;

このようにORDER BY句でCASE式を使用し、年齢がNULLの場合の優先順位を下げてあげるわけです。
その後、年齢の昇順を指定しているので、実行結果の並び順は以下のようになります。

TEST_TABLE
id name age
2 池田 22
1 赤井 35
4 江崎 54
3 内山 NULL
5 太田 NULL

ただし、パフォーマンスはあまりよくないようなので、大規模なデータベースで使うのは避けたほうが良いかもしれません。

使いようによっては便利なので、是非一度試してみてください。

公式マニュアル:
https://docs.microsoft.com/ja-jp/sql/t-sql/queries/select-order-by-clause-transact-sql?view=sql-server-ver16#Case

700 views

MySQLのテーブルから重複したレコードの抽出と削除

MySQLのテーブルで指定した列のデータが重複しているレコードを抽出、及び削除する方法をご紹介します。

まずはサンプルのテーブルを用意しましょう。

CREATE TABLE `sample` (
  `id` int(8) NOT NULL AUTO_INCREMENT,
  `name` varchar(30) NOT NULL,
  `type` int(4) NOT NULL,
  PRIMARY KEY (`id`)
);

サンプルデータを登録します。

INSERT INTO `sample` VALUES
    (DEFAULT, '赤井', 1),
    (DEFAULT, '井田', 2),
    (DEFAULT, '宇野', 3),
    (DEFAULT, '江崎', 1),
    (DEFAULT, '奥本', 2);

テーブルの中身を見てみると次のようになります。

mysql> select * from `sample`;
+----+--------+------+
| id | name   | type |
+----+--------+------+
| 1  | 赤井   | 1    |
| 2  | 井田   | 2    |
| 3  | 宇野   | 3    |
| 4  | 江崎   | 1    |
| 5  | 奥本   | 2    |
+----+--------+------+

typeに重複したデータがあることが分かります。
それではCOUNT関数とHAVING句を使って重複している件数を確認してみましょう。
続きを読む…»

4,982 views

MySQL 4から5へバージョンアップ

今回はまたまたとある環境でMySQLのバージョンアップを行いました。
4.1.20から5.0.95へのバージョンアップです。

ソースをダウンロードして解凍し、該当ディレクトリへ移動します。

コンパイルとインストール

configureを実行

./configure --with-charset=utf8 --with-extra-charset=all --with-mysqld-user=mysql
make
make install

インストールされるファイルやディレクトリ
/usr/local/lib/mysql … データディレクトリ
/usr/local/bin … mysql等の実行ファイル、その他関連コマンド
/usr/local/share/mysql … 言語ファイルや起動用のシェルスクリプト等
/usr/local/include/mysql … ヘッダーファイル


MySQLを初期化

/usr/local/bin/mysql_install_db --user=mysql \
--basedir=/usr/local \
--datadir=/usr/local/lib/mysql

続きを読む…»

1,614 views

テーブルの内容を簡単置き換え【SQL】

MySQLテーブルのデータ内容をSQL文を使って簡単に書き換えることができます。

例えば、何らかのシステムの変更により、テーブルのとあるカラムの内容を
条件を付けて一括で置き換えたい、という場合に便利な方法です。

わざわざPHP等のプログラムを書いてサーバーに入れて処理…などとしなくても
SQLだけで短時間で処理できます。

例)exTableというテーブルのカラム「ex_column2」が「test」という文字列のレコードの
カラム「ex_column」にある「source」という言葉を「destination」に全て置き換えます。

UPDATE exTable SET 
ex_column = REPLACE(ex_column, 'source' , 'destination') 
WHERE ex_column2 = 'test' ;
2,700 views

MySQLデータベースにテーブルが存在するか確認する

データベースに指定した名前でテーブルが既に存在するかどうかを
確認することができます。

LIKE検索なので、テーブル名にはワイルドカード(%)を使用することができます。

ここでは例としてPHPを使って確認します。
実行しているのは単純なSQL文ですので、他の言語でも同様にできると思います。

$con = mysql_connect("localhost", "mysql_user", "mysql_password");
mysql_select_db("database", $con);
$sql = "SHOW TABLES FROM [DATABASE_NAME] LIKE '[TABLE_NAME]'";
$rst = mysql_query($sql, $con);

DBは既に接続されているので以下でも可

$sql = "SHOW TABLES LIKE '[TABLE_NAME]'";
if(mysql_num_rows($rst) == 0){
    print "テーブルが存在しません。";
} else {
    print "テーブルが存在します。";
}
36,955 views