SQLでGROUP BYとCOUNTを使用して重複行をカウントする方法です。
「SQL」カテゴリーアーカイブ
SQL関連のカテゴリ
SQL:SELECT結果の重複行を除外する方法
SQL:全角文字と半角文字を判定する方法
SQL:文字列のバイト数を取得する方法
SQLでバイト数を取得する場合は、LENGTHBやOCTET_LENGTH関数を使用することで取得出来ます。
DBMS毎に使用できる関数が異なり、ORACLEではLENGTHB、MYSQLやPostgreSQLではOCTET_LENGTH、AccessではLENBが使用できます。
DBMS毎のバイト数を取得できる関数
DBMS | バイト数を取得できる関数 | 備考 |
---|---|---|
ORACLE | LENGTHB | ・全角文字の場合には使用しているキャラクタセットによりバイト数は異なる ※UTF-8 の場合には全角文字1文字が3バイト ・ CLOB と NCLOB において LENGTHB は使用できない |
MYSQL or PostgreSQL | OCTET_LENGTH | |
Access | LENB | |
SQLServer | 対象なし |
使用例
SQL:前方一致・後方一致・部分一致検索する方法
SQLで前方一致・後方一致・部分一致等のあいまい検索の方法についてご紹介します。
SQLであいまい検索を行う場合はワイルドカード文字として「%」を使用します。
サンプルテーブル
以下の商品テーブル「goods」を元に説明します。
前方一致検索
SQL文(クエリー)
-
- 前方一致検索する場合、LIKE演算子を指定して検索条件の最後に「%」を記載します。
- 「SELECT * FROM [テーブル名] WHERE LIKE ‘[条件]%’;」の形式で記述します。
1 |
SELECT * FROM goods WHERE name LIKE '商品%'; |
実行結果
以下の様に前方に「商品」と入力されているデータのみ出力されます。
後方一致検索
SQL文(クエリー)
-
- 後方一致検索する場合、LIKE演算子を指定して検索条件の先頭に「%」を記載します。
- 「SELECT * FROM [テーブル名] WHERE LIKE ‘%[条件]’;」の形式で記述します。
1 |
SELECT * FROM goods WHERE name LIKE '%A'; |
実行結果
以下の様に後方に「A」と入力されているデータのみ出力されます。
部分一致検索
SQL文(クエリー)
-
- 部分一致検索する場合、LIKE演算子を指定して検索条件の前後に「%」を記載します。
- 「SELECT * FROM [テーブル名] WHERE LIKE ‘%[条件]%’;」の形式で記述します。
1 |
SELECT * FROM goods WHERE name LIKE '%ボード%'; |
実行結果
SQL:INDEXのメリットとデメリットについて
業務でデータベースの操作をする場合、データが大量に登録されているテーブルへアクセスする場合に索引(INDEX)を作成するとSQLクエリの実行が劇的に早くなるケースが多々あります。この索引(INDEX)についてどういう場合に作成すれば良いのか、メリット、デメリット等についてまとめておきます。
どういう場合に索引(INDEX)を作成すれば良いのか
索引(INDEX)を作成した方が良いケース
- 項目数/データ数が多い大規模な表の1%~15%程の行を頻繁にアクセスする場合
- WHERE句で頻繁に使用されている列である場合
- 列の値が比較的一意である場合
- 参照整合性制約で使用されている外部キーになっている列である場合
索引(INDEX)を作成しない方が良いケース
- データ登録件数が少ない表である場合
- 列内の値がほぼユニークである場合
- NULL値が多く、NULL以外の値を検索しない場合
索引(INDEX)のメリット
- 表検索(SELCET)する際、特定の行を素早く検索する事が出来る為、検索のパフォーマンスが早くなります。
- ソート作業を省略出来ます。
索引(INDEX)のデメリット
- データの登録(INSERT)、変更(UPDATE)の際、索引変更のためのオーバーヘッドが加わるため、索引(INDEX)がないテーブルに比べると時間が掛かります。
- 索引(INDEX)を作成する領域が必要となります。
SQL:複数の値で検索する方法
SQLで1つの項目に対して複数の値に一致した条件で検索する方法をご紹介します。
この場合、考えられる方法としては「OR」演算子を使用する方法と「IN」演算子を使用する2つの方法があります。
通常はIN演算子で済むような条件であればOR演算子は使用しません。
サンプルテーブル
1つの項目に対して複数の値で検索
SQL:「OR」演算子を使用する場合
「OR」演算子を使用する場合、以下の様にWHERE句にOR演算子を指定する事で複数の値で検索する事が出来ます。
「SELECT * FROM [テーブル名] WHERE [条件1] OR [条件2];」形式で記述します。
1 |
SELECT * FROM goods WHERE type_code = 101 OR type_code = 102; |
SQL:「IN」演算子を使用する場合
「IN」演算子を使用する場合、以下の様にWHERE句にIN演算子を指定する事で複数の値で検索する事が出来ます。
「SELECT * FROM [テーブル名] WHERE [列名] IN ([値1], [値2] …;」形式で記述します。
1 |
SELECT * FROM goods WHERE type_code IN(101, 102); |
実行結果
SQL:範囲検索する方法
SQL:レコード件数を取得する方法
SQLでテーブルのレコード数を取得する方法をご紹介します。
サンプルテーブル
単純なレコード件数の取得
重複データを除いたレコード件数の取得
SQL:内部結合と外部結合の違い
業務でSQLを使用する場合、必ず使用する事になると言って良いのがテーブルの結合処理です。WEB系システムの場合、そのほとんどはRDBMSを使用してますのでテーブルが一つだけなどという事はまずありえません。複数のテーブルからその時々に応じて必要なデータを取得し使用するのが常です。その際に重要になるポイントの一つが内部結合と外部結合です。
サンプルテーブル
内部結合とは
- 2つのテーブルで一致したデータ行のみ取得します。
- SQLは「SELECT * FROM [テーブル名1] INNER JOIN [テーブル名2] ON [結合条件]」形式で記載します。
- サンプルSQL
1234SELECT goods.type_code, goods.name, type_code.code_nameFROM goodsINNER JOIN type_codeON goods.type_code = type_code.code;
サンプルSQLの実行結果
外部結合とは
- 2つのテーブルで一致しないデータも含めてどちらか一方のテーブルのデータを全て取得します。
- SQLは左外部結合の場合、「SELECT * FROM [テーブル名1] LEFT OUTER JOIN [テーブル名2] ON [結合条件]」形式で記載します。
- SQLは右外部結合の場合、「SELECT * FROM [テーブル名1] RIGHT OUTER JOIN [テーブル名2] ON [結合条件]」形式で記載します。
- サンプルSQL(左外部結合の場合)
1234SELECT goods.type_code, goods.name, type_code.code_nameFROM goodsLEFT OUTER JOIN type_codeON goods.type_code = type_code.code;
サンプルSQLの実行結果