SQLのHAVING句とは?使い方をサンプルコード付きでわかりやすく解説
SQLには、データベースへクエリを実行するためのさまざまな操作が用意されています。その中でもHAVING句は、最初のクエリの結果に対してサブクエリのように動作する句です。共通の値を持つ大量のレコードがあり、それをさらに絞り込みたい場合に非常に役立ちます。この記事では、HAVING句の仕組みと使い方を詳しく見ていきます。
準備
この記事の例では、MySQLを使用したSQL Fiddle上で、以下のサンプルスキーマを作成しました。
create table Cars ( id INT PRIMARY KEY, year VARCHAR(50), car_make VARCHAR(50), car_model VARCHAR(50) );
これにより「Cars」というテーブルが作成され、各車のメーカー(car_make)、モデル(car_model)、年式(year)を管理するスキーマになります。次のコードブロックで、これらのカラムにデータを挿入します。
insert into Cars (id, year, car_make, car_model) values (1, 2011, 'Mazda', 'Miata MX-5'); insert into Cars (id, year, car_make, car_model) values (2, 1969, 'Ford', 'Mustang'); insert into Cars (id, year, car_make, car_model) values (3, 2007, 'Toyota', '4Runner'); insert into Cars (id, year, car_make, car_model) values (4, 2013, 'Porsche', '911'); insert into Cars (id, year, car_make, car_model) values (5, 1991, 'Buick', 'Coachbuilder'); insert into Cars (id, year, car_make, car_model) values (6, 2007, 'Kia', 'Sportage'); insert into Cars (id, year, car_make, car_model) values (7, 1997, 'Oldsmobile', 'Cutlass Supreme'); insert into Cars (id, year, car_make, car_model) values (8, 2003, 'BMW', '7 Series'); insert into Cars (id, year, car_make, car_model) values (9, 1996, 'Ford', 'F150'); insert into Cars (id, year, car_make, car_model) values (10, 1992, 'Suzuki', 'SJ'); insert into Cars (id, year, car_make, car_model) values (11, 2001, 'Jeep', 'Grand Cherokee'); insert into Cars (id, year, car_make, car_model) values (12, 2000, 'Ford', 'F250'); insert into Cars (id, year, car_make, car_model) values (13, 2003, 'Honda', 'Insight'); insert into Cars (id, year, car_make, car_model) values (14, 2006, 'Chevrolet', 'HHR Panel'); insert into Cars (id, year, car_make, car_model) values (15, 1987, 'Mercedes-Benz', 'S-Class'); insert into Cars (id, year, car_make, car_model) values (16, 2004, 'Chevrolet', 'SSR'); insert into Cars (id, year, car_make, car_model) values (17, 1990, 'Maserati', '228'); insert into Cars (id, year, car_make, car_model) values (18, 2005, 'Saturn', 'Ion'); insert into Cars (id, year, car_make, car_model) values (19, 1987, 'Audi', '5000CS'); insert into Cars (id, year, car_make, car_model) values (20, 1999, 'Chevrolet', 'S10'); insert into Cars (id, year, car_make, car_model) values (21, 2007, 'Jeep', 'Liberty'); insert into Cars (id, year, car_make, car_model) values (22, 2002, 'Lamborghini', 'Murciélago'); insert into Cars (id, year, car_make, car_model) values (23, 2000, 'Hyundai', 'Tiburon'); insert into Cars (id, year, car_make, car_model) values (24, 2011, 'Jeep', 'Patriot'); insert into Cars (id, year, car_make, car_model) values (25, 1985, 'Pontiac', 'Sunbird');
この演習用に独自のテストデータを作成したい場合は、mockaroo.comの利用をおすすめします。このサービスを使えば、データベースのスキーマに合わせたダミーデータを簡単に生成できます。
HAVING句の使い方
SELECT COUNT(id), car_make FROM Cars GROUP BY car_make HAVING COUNT(id) > 0;
HAVING句は、集計関数を使用する必要があり、WHERE句が使えない場面で活躍します。集計関数とは、何らかの操作を実行して単一の値を返す関数のことで、COUNT、AVG、SUMなどが代表例です。上記のコードを実行すると、次の結果が返されます。
| COUNT(id) | car_make |
| 1 | Audi |
| 1 | BMW |
| 1 | Buick |
| 3 | Chevrolet |
| 3 | Ford |
| 1 | Honda |
| 1 | Hyundai |
| 3 | Jeep |
| 1 | Kia |
| 1 | Lamborghini |
| 1 | Maserati |
| 1 | Mazda |
| 1 | Mercedes-Benz |
| 1 | Oldsmobile |
| 1 | Pontiac |
| 1 | Porsche |
| 1 | Saturn |
| 1 | Suzuki |
| 1 | Toyota |
このクエリでは、SELECT文で各メーカー(car_make)の登録台数をCOUNT関数で取得し、GROUP BY句でcar_makeごとにレコードをグループ化しています。さらにHAVING句で「COUNT(id) > 0」という条件を指定することで、1台以上登録されているメーカーのみを抽出しています。
ブートキャンプ参加者の81%が、受講後にテック業界でのキャリアの見通しについて自信を持てるようになったと回答しています。今すぐ自分に合ったブートキャンプを見つけましょう。
また、ブートキャンプ卒業生の平均キャリア移行期間は、受講開始から初めての仕事に就くまで6か月未満と短いこともわかっています。
以上がHAVING句の基本的な使い方です。おさらいすると、SQLクエリにおけるHAVING句とは、集計関数を利用してデータベースに対して追加の絞り込み処理を行うサブフィルターのようなものです。
ぜひ他の集計関数(AVGやSUMなど)も組み合わせて試し、この便利な句への理解を深めてみてください!
-
【SQL Server】HAVING句の使い方を徹底解説!GROUP BYとの組み合わせと実用例
SQL Server(Transact-SQL)におけるHAVING句は、GROUP BY句と組み合わせて使用し、グループ化された結果に対して条件を指定するための句です。WHERE句が個々の行を絞り込むのに対し、HAVING句は集計後のグループに対してフィルターを適用できる点が大きな特徴です。HAVING句の条件がTRUEと評価されたグループのみが、結果セットとして返されます。 HAVING句の基本構文 SELECT 式1, 式2, … 式n, 集計関数(式) FROM テーブル名 [WHERE 条件] GROUP BY 式1, 式2, … 式n HAVING having条
-
Oracle Database 19cのSQL検疫(SQL Quarantine)機能とは?リソースマネージャによる暴走クエリ対策の完全ガイド
本記事では、Oracle Database 19cの新機能であるSQL検疫(SQL Quarantine)について詳しく解説します。Oracle® Resource Managerを使用すると、CPUやI/Oといったシステムリソースの使用量を制御・制限できます。さらに注目すべきは、定義された閾値を超える長時間実行クエリの実行自体を防止できる点です。 SQL検疫(SQL Quarantine)とは何か? 「検疫(Quarantine)」とは隔離を意味します。SQL検疫は、暴走クエリ(Runaway Query)がもたらすオーバーヘッドを排除するために使用できる、19cの新機能です。暴走クエリとは