全文は3183語で、予想学習時間は8分です。
出典:unsplash
この記事では、よくあるが常に見落とされがちなエラーをいくつか指摘します。落ち着いて、クエリスキルを向上させる準備をしてください。
架空のビジネスを例にとってみましょう。あなたがAmazoneコマース分析チームのメンバーであり、いくつかの簡単なクエリを実行する必要があるとします。手元に「製品」と「割引」の2つのテーブルがあります。
1.NULLフィールドの数を計算します
nullフィールドの数をカウントするには、COUNT関数の動作原理を習得する必要があります。製品の数を計算するときに、テーブル「product」の「productid」主キー列に欠落しているフィールドを含める必要があるとします。
SELECT COUNT(product_id)
FROM product;Result: 3
「productid」列のnull値をカウントする必要があるため、クエリ結果は4になるはずですが、COUNT()関数はnull値をカウントしません。
解決策:COUNT(*)関数を使用します。この関数はnull値をカウントできます。
Select Count(*)
From product;Result: 4
この操作は単純ですが、複雑なクエリを作成する場合は常に無視されます。
2.列名として予約語を使用する
SELECT product_id,
RANK() OVER (ORDER BY price desc) As Rank
FROM product;
列名「Rank」はRank関数の予約語であるため、クエリ結果が間違っています。
解決:
SELECT product_id,
RANK() OVER (ORDER BY price desc) As ‘Rank’
FROM product;
一重引用符を追加して、目的の結果を取得します。
3.NULL比較演算
SELECT product_name
FROM product
WHERE product_id=NULL;
比較演算子「=」を使用しているため、ここでの動作は異常となり、別の比較演算子「!=」も異常となります。ここでの論理的な問題は、作成するクエリが「製品ID」列の値が不明であるかどうかであり、この列の値が不明な製品であるかどうかを判断できないことです。
解決:
SELECT product_name
FROM product
WHERE product_id ISNULL;
4.ON句フィルタリングとWHERE句フィルタリングの違い
これは、ON句フィルタリングとWHERE句フィルタリングの違いについての基本的な理解を深める非常に興味深い概念です。これは完全に間違いではありませんが、両方の使用法を示しているだけであり、ビジネスニーズに応じて最適なソリューションを選択できます。
出典:unsplash
SELECT d.product_id,
price,
discount
FROM product p RIGHT JOIN discount d ON
p.product_id=d.product_id
WHERE p.product_id>1;
結果:
この場合、フィルター条件は2つのテーブルが接続された後に有効になります。したがって、得られた結果には、d.product_id≤1の行は含まれません(同様に、明らかに、p.product≤1の行も含まれません)。
解決策:ANDを使用して、結果の違いに注意してください。
SELECT d.product_id,
price,
discount
FROM product p RIGHT JOIN discount d ON
p.product_id=d.product_id
AND p.product_id>1;
結果:
ここで、条件文ANDは、2つのテーブルの接続が発生する前に計算されます。このクエリは、1つのテーブル(「製品」テーブル)にのみ適用されるWHERE句と考えてください。これで、正しい接続により、d.product_id≤1の行が結果に表示されます(明らかに、p.product_id> 1の行があります)。
ON句のフィルタリングとWHERE句のフィルタリングは、左/右/外部結合でのみ異なり、内部結合でも同じであることに注意してください。
5.同じクエリのWHERE句でWindows関数によって生成された列を使用し、CASEWHEN句を使用します
同じクエリのWHERE句でWindows関数とCASEWHEN句によって生成された列名を使用しないことに注意してください。
SELECT product_id,
RANK() OVER (ORDER BY price desc) AS rk
FROM product
WHERE rk=2;
列rkはWindows関数によって生成され、列は同じクエリのWHERE句で使用されるため、クエリ結果は異常になります。
解決策:この問題は、一時テーブルまたはサブクエリを使用することで解決できます。
WITH CTE AS
(
SELECT product_id,
RANK() OVER (ORDER BY price desc) AS rk
FROM product
)
SELECT product_id
FROM
CTE
WHERE rk=2;
または
SELECT product_id
FROM
(
SELECT product_id,
RANK() OVER (ORDER BY price desc) AS rk
FROM product;
)
WHERE rk=2;
同じ方法が、CASEWHEN句を使用して作成された列にも適用されます。Windows関数は、SELECT句またはORDERBY句にのみ表示できることに注意してください。
6.BETWEENの誤った使用
BETWEENの有効範囲がわからない場合は、目的のクエリ結果が得られない可能性があります。BETWEEN x AND yステートメントの有効な範囲には、xとyが含まれます。
SELECT *
FROM discount
WHERE offer_valid_till BETWEEN ‘2019/01/01’ AND ‘2020/01/01’
ORDER BY offer_valid_till;
結果:
クエリでは、2019年のすべての日付のみを取得したい場合がありますが、結果には2020年1月1日も含まれます。これは、BETWEENステートメントの有効範囲に2019/01/01と2020/01/01が含まれているためです。
解決策:この問題を解決するには、それに応じて範囲を調整します。
SELECT *
FROM discount
WHERE offer_valid_till BETWEEN ‘2019/01/01’ AND ‘2019/12/31’
ORDER BY offer_valid_till;
結果:
現在、すべてのクエリ結果は2019年のものです。
7. GROUPBYステートメントの後にWHERE句を使用します
GROUP BYステートメントを作成するときは、WHERE句の場所に注意してください。
SELECT category,
AVG (price)
FROM product p INNER JOIN discount d ON
p.product_id=d.product_id
GROUP BY category
WHERE discount_amount>10;
WHERE句はGROUPBYステートメントの後に配置されるため、このクエリは間違っています。どうしてこれなの?
WHERE句は、クエリ結果をフィルタリングするために使用されます。この手順は、グループ化してからフィルタリングするのではなく、クエリ結果をグループ化する前に実装する必要があります。正しいアプローチは、最初にWHERE条件を適用してフィルター処理してデータを削減し、次にGROUP BY句を使用して集計関数(ここでは集計関数AVGを使用)を介してデータをグループ化することです。
解決:
SELECT category,
AVG (price)
FROM product p INNER JOIN discount d ON
p.product_id=d.product_id
WHERE discount_amount>10
GROUP BY category;
メインのSQLステートメントの実行順序に注意してください。
・FROM句
・WHERE句
・GROUPBY句
・HAVING句
・SELECT句
・ORDERBY句
画像ソース:Pexels
上記には、特に初心者向けの不可解なエラーのほとんどが含まれています。ヘンリー・フォードが言ったように、「唯一の間違いは、私たちが何も学ばないということです」、この記事があなたのクエリスキルの向上に役立つことを願っています。
AIの学習と開発の乾物を一緒に共有する
フルプラットフォームのAI垂直セルフメディア「コアリーディング」をフォローすることを歓迎します
(エディターWeChat:dxsxbbを追加し、リーダーサークルに参加して、最新の人工知能技術について一緒に話し合ってください〜)