この記事では、1つ以上のSQL Serverテーブルからデータを取得するためのSQL SELECTステートメントの基本について説明します。また、選択した列を取得する方法と、SQL WHERE句とHAVING句を使用して行をフィルタリングする方法についても詳しく説明します。
この記事のサンプルはすべて、AdventureWorksLT2019サンプルデータベースを使用しています。このシリーズの前の記事では、INSERT、UPDATE、およびDELETEステートメントを使用してSQL Serverテーブルを設定する方法について説明しました。これらの構造化照会言語(SQL)ステートメントはテーブルの内容を変更しますが、SQL SELECTステートメントは異なる目的で使用されます。
シンプルなSQL SELECTステートメントの使用方法
SQL SELECTステートメントは、テーブルからデータを照会するために使用されます。次のコードは、SELECTステートメントの最も基本的な構文を示しています。
SELECT columns FROM schema_name.table_name;
ご存知の通り、テーブルデータは行と列の形式で整理されます。各行はテーブル内の一意のレコードを表し、各列はデータセット内のフィールドを表します。
SELECTステートメントの最初の部分は、取得する列名のリストです。ここでは、データを取得したいカンマ区切りの列のリストを指定します。
次に、FROM句はソーステーブルとそのスキーマ名(必要な場合)を指定します。SQL Serverでは、スキーマを使用してテーブルやその他のデータベースオブジェクトを論理的にグループ化します。すべてのデータベースのデフォルトスキーマはdboであり、ここで使用されているスキーマなので省略することができます。
以下は、簡単なSELECTステートメントの例を示しています。
- 最初のUSEコマンドは現在のデータベースをAdventureWorksLT2019に設定します。
- SELECTステートメントは、SalesLT.Customerテーブルから取得される結果セットの列リストを提供します。
- この場合、AdventureWorksLT2019サンプルデータベースでは、スキーマ名が「SalesLT」(他にもあります)となっているため、スキーマ名、ドット、そしてテーブル名である「Customers」を含める必要があります。
- 「FirstName」と「LastName」の列は、顧客の名前と姓を取得します。
USE AdventureWorksLT2019 SELECT FirstName, LastName from SalesLT.Customer

省略記法として、列の数に関係なくテーブル内のすべての列を取得するためにアスタリスク(*)を使用することができます。その例を以下で見ることができます:
USE AdventureWorksLT2019 SELECT * from SalesLT.Customer

SELECT *ステートメントは、臨時のクエリや、不慣れなテーブルの列やデータを調べるために便利です。ただし、本番コードではこのステートメントを使用しないでください。通常、アプリケーションが必要とするデータよりも多くのデータを取得するため、SQL Serverのワークロードを増やしたくありません。
SQL WHERE句で行をフィルタリングする方法
SELECT文の真のパワーは、そのフィルタリングおよび結合の機能にあります。SELECTクエリは、返されるデータをフィルタリングするためのオプションのWHERE句を使用することができます。
WHERE句では、1つ以上のブール条件を使用して、必要なテーブルデータを選択します。WHERE句は常にFROM句の後、GROUP BY、HAVING、ORDER BY句の前に配置されます。
SQLのWHERE句の使用例を以下に示します。ここでは、WHERE句を使用して、「CompanyName」列に値「Sharp Bikes」を含む行から「FirstName」、「LastName」、「Phone」、「CompanyName」の選択リストをフィルタリングしています。
USE AdventureWorksLT2019 SELECT FirstName, LastName, Phone, CompanyName FROM SalesLT.Customer WHERE CompanyName = 'Sharp Bikes';

文字列の一部として値を含む行をフィルタリング
SELECT文との組み合わせでWHERE句を使用することの強力さは、その柔軟性にあります。WHERE句は単純な等価性、「より大きい」と「より小さい」といった比較演算子を超えています。まずはSQLのLIKE演算子の使用から始めましょう。
LIKE演算子は特定の文字列が指定されたパターンに一致するかどうかを判定するために使用されます。以下の例では、「CompanyName」列のどこにでも単語「Bike」が含まれるCustomerテーブルからすべての行を取得します。ここでは、単語「Bike」の前後の%ワイルドカード文字を使用する必要があります。
USE AdventureWorksLT2019 SELECT SalesPerson, CompanyName FROM SalesLT.Customer WHERE CompanyName LIKE('%Bike%');

3つの条件のいずれかを満たす行をフィルタリング
複数の異なる値に基づいて行をフィルタリングする場合は、WHERE句を使用することもできます。次のコードリストは、Productテーブルから3つの異なる値を選択するためにSELECT文をWHERE句と共に使用する方法を示しています。この例では、WHERE句がOR演算子と共に使用され、’ProductID’が680、711、または722と等しい行が選択されます。
USE AdventureWorksLT2019 SELECT Name, ProductID, ProductNumber FROM SalesLT.Product WHERE ProductID = 680 OR ProductID = 711 OR ProductID = 722;

値のリスト内の行をフィルタリング
同様に、IN演算子を使用して定義されたリスト内に含まれる行を選択するために、WHERE句を使用することができます。次の例では、SELECT文は、SalesLT.Addressテーブルの‘City’列に‘Bothell’、‘Bellevue’、または‘Renton’の値を含む行を返します。
USE AdventureWorksLT2019 SELECT AddressID, AddressLine1, City FROM SalesLT.Address WHERE City IN ('Bothell', 'Bellevue', 'Renton');

2つの値の間にある値を持つ行をフィルタリングする
また、特定の列内で事前に定義された範囲内の行値を選択するために、SELECT文のWHERE句をBETWEEN演算子と一緒に使用することもできます。次の例では、BETWEENを使用して、‘ListPrice列’の値が10より大きく50より小さいProductテーブル内の行のみを返す方法が示されています。
USE AdventureWorksLT2019 SELECT ProductID, Name FROM SalesLT.Product WHERE ListPrice Between 10 AND 50;

HAVING句を使用して行をフィルタリングする
結果セットの行をフィルタリングするには、HAVING句を使用することもできます。 WHEREキーワードはGROUP BYなどの集計関数と一緒に使用できないため、SQL ServerにHAVING句が追加されました。これは、異なるレコードグループに対して1つ以上の条件が真である検索条件を指定するために使用されます。
HAVING句は常にGROUP BY句の後、ORDER BY句の前に配置されます。次のSQLステートメントで確認できるように、この例では結果セットに「SalesOrderID」と列エイリアス「SubTotal」が含まれています。順序は昇順で、行は「SalesOrderID」でグループ化された集計です。
USE AdventureWorksLT2019 ; SELECT SalesOrderID, SUM(LineTotal) AS SubTotal FROM SalesLT.SalesOrderDetail GROUP BY SalesOrderID HAVING SUM(LineTotal) > 5000.00 ORDER BY SalesOrderID ;

概要
このチュートリアルでは、T-SQL SELECTステートメントの基本を説明し、さまざまな方法で行をフィルタリングする方法を紹介しました。WHERE句は非常に柔軟な演算子セットを提供し、さまざまな条件に基づいて行を選択できるようにします。同様に、HAVING句を使用すると、特定の条件を満たす行のグループを選択できます。読んでくれてありがとう、次回の記事もこのSQL Server Essentialsシリーズでお楽しみに。
関連記事: