SQLのexists句の使い方

SQLにはexists句があるのですが、その使い方を書いてみます。exists句は副問合せの結果が真となれば、その内容を抽出します。言葉で言ってもわかりづらいため、例を示します。

商品テーブルと売上テーブルがあります。商品テーブルは商品の一覧、売上テーブルは売上の一覧です。

例えば、3/1に売上のあった商品名を抽出したい場合は以下のSQLです。

select 売上.日付, 商品.商品名 from 商品, 売上
where 商品.コード = 売上.コード
and 売上.日付 = '3/1';

結果は、こうなります。

exists句の使い方ですが「売上のあった商品を抽出」したい場合に役に立ちます。SQLを書くと以下となります。

select * from 商品
where exists
(select * from 売上 where 商品.コード = 売上.コード);

結果は、こうなります。

副問合せの結果が真(つまり、売上テーブルにある商品)の分を商品テーブルから抽出します。

exists句は、関連する2つのテーブルがあった場合、一方のテーブルに含まれる(存在する)レコード分をもう一方のテーブルから抽出するときに使うと良いです。

ちなみにこれはin句を使って代用もできます。in句を使った場合のSQLは以下です。

select * from 商品
where 商品.コード in
(select 売上.コード from 売上);

この場合も、商品テーブルからりんごとみかんの2レコードが抽出されます(exists句を使った場合と結果は同じです)。

売上のあった商品ではなく売上のなかった商品を抽出したい場合は、existsにnotをつけることで抽出できます。

売上のなかった商品を抽出するSQLは以下です。

select * from 商品
where not exists
(select * from 売上 where 商品.コード = 売上.コード);

結果は、こうなります。

ここからは補足です。

売上のあった商品を抽出する際に、商品テーブルと売上テーブルを表結合しても抽出できるのではないか?と思う人もいるかと思います。確かに抽出はされるのですが余分なレコードも抽出されてしまいます。

表結合した場合のSQLです。

select 商品.* from 商品, 売上
where 商品.コード = 売上.コード;

この場合の結果は、こうなります。

りんごが2件抽出されてしまいます。これは売上テーブルが3レコードあるため、3レコード分が対象となってしまうためです。

WordPressの「PHPの更新を推奨」を対応してみた。

WordPressを使っていて、あるときからダッシュボードに「PHPの更新の推奨」が表示されるようになりました。WordPressはローカルPC(ubuntu18.04)にインストールしていて、Nginx+PHP7.2で動かしていました。WordPressがPHP7.2をサポートしなくなったため表示されるようになったようです。

その後、ubuntuを20.04にアップグレードしてPHPも7.4にしたのですが、この表示が消えない。PHPパッケージで何か足りないものがあるのかと思い確認してみました。

7.2と7.4のパッケージを比較すると、php7.2-fpmはあるけどphp7.4-fpmがないことに気づきました。そういえば、NginxではPHPとのデータのやりとりにはphp-fpmが必要で、php7.2-fpmを入れていたのを思い出しました。たぶん、今はこのような感じなのでしょう。

Nginxから見るとphp7.2-fpmは変わっていないため、PHPのバージョンを7.2と認識していたのだと思います。

ということで、php7.4-fpmをインストールします。

$ sudo apt install php7.4-fpm

インストールが出来たら /run/php 配下のphp-fpmのソケットを確認します。

php-fpm.sockのシンボリックリンクがあります。これがどこへのリンクか見てみます。

$ update-alternatives --display php-fpm.sock

/run/php/php7.4-fpm.sock のほうを指しているようです。

あとはNignxの設定ファイルを修正します。通常は /etc/nginx/nginx.conf ですが、個別の設定ファイルが /etc/nginx/conf.d 配下にある場合もあります。

設定ファイルに fastcgi_pass ディレクティブがあるはずなので、それを以下のようにします。

fastcgi_pass unix:/run/php/php-fpm.sock;

Nginxを再起動します。WordPressのダッシュボードを確認すると「PHPの更新の推奨」の表示は消えていました。