データベース、テーブル、正規化、および確実なバックアップ計画により、データの保存と保守が可能になります。
これらを組み合わせたベストプラクティスにより、そのデータとのやり取りが可能になります。今日のデータ主導の世界では、データは貴重です。データは価値があるだけでなく、製品やサービスによって提供されるエンドユーザーソリューションにとって重要な場合がよくあります。クエリとデータ操作によってデータから洞察を抽出し、質問に答え、意味のあるメトリックを取得することは、一般にSQLの不可欠なコンポーネントです。
PostgreSQLも例外ではありません。
この基本的な要点は、データ主導のあらゆる側面で成功するために重要です。
以下に、データセットの調査、調査、学習、またはその他の操作に興味深く魅力的であると感じた8つの異なるクエリまたはクエリのタイプの組み合わせを示します。
重要度の高い順にリストされていません。
ほとんどの人はおそらくおなじみの古くからの友人でしょう。おそらく、何人かは新しい知人になるでしょう。
使用されるサンプルテーブルとデータは、クエリ自体の実際の構成や、各クエリが返す、提供する、または提供するものほど重要ではありません。それらの多くはモックであり、デモンストレーションの目的で派生したものであり、文字通りそれらの値に取り入れるべきではありません。
1。左結合、右のヌルに注意してください...
この例では、2か月の継続販売があり、両方を合わせたものを取得しているとします。
それでも、何らかの理由で、2か月目はその重みを引き出せなかったので、1か月目がたるみを取り戻した日をターゲットにしたいと思います。
これらの売上は、このデモンストレーションのテーブル支払いとfake_monthとして表されます。
注:
- 合計が2000を超える場合にのみチェックします。
- 出力を10行に制限します。
まず、この共通テーブル式(CTE)'生成があります。 '私たちのためのfake_monthテーブル、およびそれに続くクエリ。
dvdrental=> WITH fake_month AS(
SELECT setup::date
FROM generate_series('2007-02-01', '2007-02-28', INTERVAL '1 day') AS setup
)
SELECT date_part('day', p.payment_date)::INT AS legit,
SUM(p.amount),
date_part('day', fk.setup)::INT AS fake
FROM payment AS p
LEFT JOIN fake_month AS fk
ON date_part('day', fk.setup)::INT = date_part('day', p.payment_date)::INT
GROUP BY legit, fake
HAVING SUM(p.amount) > 2000
LIMIT 10;
legit | sum | fake
-------+---------+------
1 | 2808.24 | 1
2 | 2550.05 | 2
6 | 2077.14 | 6
8 | 2227.84 | 8
9 | 2067.86 | 9
17 | 3630.33 | 17
18 | 3977.74 | 18
19 | 3908.59 | 19
20 | 3888.98 | 20
21 | 3786.14 | 21
(10 rows)
両方の月がそこに貢献したように見えます。それで、これは解決されましたか?
これが解決したと考える前に、ORDERBY句にアクセスしてみましょう。
もちろん、ASCまたはDESCで注文できます。
ただし、最初または最後にORDER BY NULLSを使用することもできます。これにより、状況が少し変わります。
このクエリを書き直して、正当な列で最初にORDERBYNULLSを使用してみましょう。
簡潔にするために、出力からCTEを削除しますが、CTEがまだ存在し、使用されていることを確認します。
SELECT date_part('day', p.payment_date)::INT AS legit,
SUM(p.amount),
date_part('day', fk.setup)::INT AS fake
FROM payment AS p
LEFT JOIN fake_month AS fk
ON date_part('day', fk.setup)::INT = date_part('day', p.payment_date)::INT
GROUP BY legit, fake
HAVING SUM(p.amount) > 2000
ORDER BY legit NULLS first
LIMIT 10;
legit | sum | fake
-------+---------+------
1 | 2808.24 | 1
2 | 2550.05 | 2
6 | 2077.14 | 6
8 | 2227.84 | 8
9 | 2067.86 | 9
17 | 3630.33 | 17
18 | 3977.74 | 18
19 | 3908.59 | 19
20 | 3888.98 | 20
21 | 3786.14 | 21
(10 rows)
違いはまったくありません。
偽の列で最初にORDERBYNULLSを実行するとどうなりますか? 右にあるもの 参加の側?
見てみましょう。
SELECT date_part('day', p.payment_date)::INT AS legit,
SUM(p.amount),
date_part('day', fk.setup)::INT AS fake
FROM payment AS p
LEFT JOIN fake_month AS fk
ON date_part('day', fk.setup)::INT = date_part('day', p.payment_date)::INT
GROUP BY legit, fake
HAVING SUM(p.amount) > 2000
ORDER BY fake NULLS first
LIMIT 10;
legit | sum | fake
-------+---------+------
29 | 2717.60 |
30 | 5723.89 |
1 | 2808.24 | 1
2 | 2550.05 | 2
6 | 2077.14 | 6
8 | 2227.84 | 8
9 | 2067.86 | 9
17 | 3630.33 | 17
18 | 3977.74 | 18
19 | 3908.59 | 19
(10 rows)
今、私たちはどこかに到達しています。 29日目と30日目は、結果セットの上から偽の列が注文されていることがわかります。
ORDERBYの偽のNULLが最初であるため。
これで、「セール2」が何日遅れたのかという疑問が解決します。
疑問に思っていますか...
「WHEREfakeIS NULLでフィルタリングできますか? "
このように:
SELECT date_part('day', p.payment_date)::INT AS legit,
SUM(p.amount),
date_part('day', fk.setup)::INT AS fake
FROM payment AS p
LEFT JOIN fake_month AS fk
ON date_part('day', fk.setup)::INT = date_part('day', p.payment_date)::INT
WHERE date_part('day', fk.setup) IS NULL
GROUP BY legit, fake
HAVING SUM(p.amount) > 2000
LIMIT 10;
legit | sum | fake
-------+---------+------
29 | 2717.60 |
30 | 5723.89 |
(2 rows)
はい、動作します。では、代わりにそのクエリを使用しないのはなぜですか?なぜそれが重要なのですか?
JOINの右側のテーブルに最初にLEFTJOINとORDERBYNULLSを使用することは、なじみのないテーブルやデータセットを探索するための優れた方法だと思います。
データが「不足している」場合はそれを確認することにより、 ’最初に結合条件のその側にあります。明確さと認識を高め、WHERE
もちろん、テーブルとデータセットに精通していると、ここに示す左結合が不要になる可能性があります。
これは、PostgreSQLを利用している人にとって、探索中に少なくとも試してみる価値のあるクエリです。
2。文字列の連結
2つの文字列の結合または追加である連結は、結果セットの表示オプションを提供します。多くの'もの '連結できます。
ただし、ドキュメントに記載されているように、文字列連結演算子('||')は、文字列である限り、文字列以外の入力を受け入れます。
以下のクエリでいくつかの例を見てみましょう:
postgres=> SELECT 2||' times'||' 2 equals: '|| 2*2;
?column?
---------------------
2 times 2 equals: 4
(1 row)
上記のように、数字と文字列をすべて連結できることがわかります。
'||'演算子はPostgreSQLで利用できるものの1つにすぎません。
concat()関数は複数の引数を受け入れ、戻り時にすべてを連結します。
動作中のその関数の例を次に示します。
postgres=> SELECT concat('Josh ','Otwell') AS first_name;
first_name
-------------
Josh Otwell
(1 row)
必要に応じて、3つ以上の引数を渡すことができます:
postgres=> SELECT concat('Josh',' ','Otwell') AS first_name;
first_name
-------------
Josh Otwell
(1 row)
これらの次の例で本当に簡単なことに注意しましょう:
postgres=> SELECT CONCAT('Josh',NULL,'Otwell') AS first_name;
first_name
------------
JoshOtwell
(1 row)
postgres=> SELECT 'Josh '||NULL||'Otwell' AS first_name;
first_name
------------
(1 row)
postgres=> SELECT NULL||'Josh '||'Otwell' AS first_name;
first_name
------------
(1 row)
postgres=> SELECT CONCAT(NULL,'Josh','Otwell') AS first_name;
first_name
------------
JoshOtwell
(1 row)
concat()関数は、パラメーターのリストのどこに配置されていてもNULLを無視しますが、文字列連結演算子は無視しないことに注意してください。
連結する文字列のどこかに存在する場合は、NULLが返されます。
それに注意してください。
PostgreSQLには、連結する文字列内に手動で含める代わりに、最初のパラメーターとして文字列区切り文字を受け入れるconcat_ws()関数も含まれています。
次のクエリでアクセスします:
postgres=> SELECT concat_ws('-',333,454,1919) AS cell_num;
cell_num
--------------
333-454-1919
(1 row)
postgres=> SELECT concat_ws(' ','Josh','Otwell') AS first_name;
first_name
-------------
Josh Otwell
(1 row)
concat_ws()は、数値または文字列のいずれかを引数として受け入れ、上記のように、最初の引数を区切り文字として使用します。
concat_ws()はNULLをどのように扱いますか?
postgres=> SELECT concat_ws('-',333,NULL,1919) AS cell_num;
cell_num
----------
333-1919
(1 row)
postgres=> SELECT concat_ws(NULL,333,454,1919) AS cell_num;
cell_num
----------
(1 row)
NULLは、concat_ws()に指定された区切り引数でない限り無視されます。
次に、すべての引数が無視され、代わりにNULLが返されます。
連結はかっこいいです...
連結がどのように機能するかがわかったので、その例をいくつか見てみましょう。
模擬DVDレンタルデータベースに戻る
アカウントを更新するためのメモを送信するために、顧客の名前と名前、および電子メールアドレスのリストを作成する必要があるとします。
簡潔にするために、出力を10行に制限しますが、それでも||を示します。オペレーター。
dvdrental=> SELECT first_name||' '||last_name||'''s email address is: '||email AS name_and_email
FROM customer
LIMIT 10;
name_and_email
--------------------------------------------------------------------------
Jared Ely's email address is: [email protected]
Mary Smith's email address is: [email protected]
Patricia Johnson's email address is: [email protected]
Linda Williams's email address is: [email protected]
Barbara Jones's email address is: [email protected]
Elizabeth Brown's email address is: [email protected]
Jennifer Davis's email address is: [email protected]
Maria Miller's email address is: [email protected]
Susan Wilson's email address is: [email protected]
Margaret Moore's email address is: [email protected]
(10 rows)
アポストロフィで使用される一重引用符をエスケープし、各顧客の電子メールアドレスの所有を示すために追加の一重引用符を使用する必要があることに注意してください。
なぜ知っておくべきですか?
データを連結すると、使用しているデータセットに対する洞察と理解が向上する場合があります。レポートオプションに加えて、共有データセットを他のデータセットと連結すると、それら(データ)が読みやすく、消化しやすくなる可能性があります。
3。サブクエリでIN値リストを提供する
サブクエリには多くの強力な用途があります。それらの中で、メンバーシップをチェックするための値のINリストを提供することは一般的なものです。
簡単な使い方です。
模擬DVDレンタル店に顧客と支払いのテーブルがあり、4月10日から13日の間に映画をレンタルした上位5人の顧客に報酬を与えたいとします。
それが特別な目標期間だと想像してみてください。そのため、お客様が30ドル以上を費やした場合は、そのことを認めたいと思います。
このタイプの質問を解決するために利用できるオプションは他にもあります(つまり、結合、複数の選択からの結果のキャプチャなど)が、サブクエリでも処理できます。
ここでは、シバン全体から始めます。この完全なクエリは、この特定の質問に必要なすべてを返します。
dvdrental=> SELECT first_name, last_name, email
FROM customer
WHERE customer_id IN (
SELECT customer_id FROM (
SELECT DISTINCT customer_id, SUM(amount)
FROM payment
WHERE extract(month from payment_date) = 4
AND extract(day from payment_date) BETWEEN 10 AND 13
GROUP BY customer_id
HAVING SUM(amount) > 30
ORDER BY SUM(amount) DESC
LIMIT 5) AS top_five);
この例には、実際にはネストされたサブクエリが含まれており、そのうちの1つは派生テーブルです。
まず、最も内側のサブクエリである派生テーブルにドリルダウンします。
このサブクエリは、それ自体がスタンドアロンのSELECTステートメントであり、金額列にcustomer_idとSUM()を返します。
WHERE句とHAVING句によってチェックされた基準を満たす顧客のみがカットを行い、LIMIT5でさらに間引かれます;
なぜ次のサブクエリを尋ねるのですか?
ここで最も外側のSELECTのWHEREcustomer_idIN部分を使用するだけではいけませんか?
実践的なアプローチで見てみましょう。
サブクエリからAStop_fiveを削除し、今すぐそれを使用して最も外側のクエリを試してみます:
dvdrental=> SELECT first_name, last_name, email
FROM customer
WHERE customer_id IN
(SELECT DISTINCT customer_id, SUM(amount)
FROM payment
WHERE extract(month from payment_date) = 4
AND extract(day from payment_date) BETWEEN 10 AND 13
GROUP BY customer_id
HAVING SUM(amount) > 30
ORDER BY SUM(amount) DESC
LIMIT 5);
ERROR: subquery has too many columns
LINE 3: WHERE customer_id IN (
ここでは、INメンバーシップはcustomer_id列のみでテストされていますが、派生テーブルは2つの列を返し、PostgreSQLから通知されます。
1つの解決策は、別のサブクエリを使用することです。派生テーブルの結果セットからcustomer_idのみを選択すると、次の内部ネストサブクエリが作成されます。
これで、IN述語には、customer_idのWHERE句に対してメンバーシップをチェックして最終結果セットを作成するために、1つの列の値の複数の行が含まれます。
なぜそれが重要なのですか?
IN()述語でテストできる可能性のある値の数が多いため、この方法でサブクエリを利用することは強力です。
100があったと想像してみてください。それ以上?
'ハードコーディング 'IN()リストにあるそれらすべては、値の量が増えるにつれて問題が発生し、エラーが発生しやすくなる可能性があります。
4。 generate_series()
このセットを返す関数は、使用して探索するのに便利でとても楽しいです。上記の例でgenerate_series()を使用しましたが、それ自体で説明する価値があります。機能と機能にさらに焦点を当てます。
generate_series()は、一部またはすべてのデータが欠落している比較クエリに役立ちます。
または、私が調査している時点では、部分的なデータしか利用できません。便利な使用法の1つは、テーブルに「ダミーデータ」を入力することです。 '。
まず、簡単なテーブルを作成します:
trial=> CREATE TABLE tbl_1(
trial(> tb_id SERIAL PRIMARY KEY,
trial(> some_day DATE,
trial(> an_amt NUMERIC(4,2));
CREATE TABLE
次に、INSERTステートメントの値としてgenerate_series()を使用します。
trial=> INSERT INTO tbl_1(some_day, an_amt)
VALUES(
generate_series('2018-04-01','2018-04-15',INTERVAL '1 day'),
generate_series(2.43, 34.20, 1.03));
INSERT 0 31
次に、2番目のテーブルを作成します
trial=> CREATE TABLE tbl_2(
tb2_id SERIAL PRIMARY KEY,
some_day2 DATE,
an_amt2 NUMERIC(4,2));
CREATE TABLE
また、INSERTステートメントでgenerate_series()を使用してデータを入力します。
trial=> INSERT INTO tbl_2(some_day2, an_amt2)
VALUES(
generate_series('2018-05-16','2018-05-31',INTERVAL '1 day'),
generate_series(15.43, 31., 1.03));
INSERT 0 16
なぜそれが重要なのですか?
繰り返しになりますが、generate_series()は、模擬データや練習データを作成するのに非常に便利です。
比較のために月または日の範囲を模倣することは、generate_series()では例外的であることがわかりました。セクション1とそこにあるCTEを参照して、この使用法を示してください。
generate_series()を使用して完全なデータのセットを作成し、保存されているデータと比較して欠落しているデータがあるかどうかを判断するために使用することも、大きな価値があります。
5。 COUNT()集計関数を使用したクエリ。
このシンプルでありながら効果的な集計関数は、誰の武器にもなるはずです。特に、テーブルやデータセットを初めて探索する場合。
つまり、本当に'すべてを選択したいですか '100万行のテーブルから?
COUNT(*)を使用して、ロードする前に存在するレコードの数を決定します。
この模擬DVDレンタルテーブルのフィルムテーブルの行数を調べてみましょう。
dvdrental=> SELECT COUNT(*)
dvdrental-> FROM film;
count
-------
1000
(1 row)
100万行以上ほど広範ではありませんが、有用性があると確信しています。
特定の行の数を返すために、COUNT(*)をWHERE句でフィルタリングできます。
「G」の評価が付いている映画の数を見てみましょう:
dvdrental=> SELECT COUNT(*)
dvdrental-> FROM film
dvdrental-> WHERE rating = 'G';
count
-------
178
(1 row)
注意すべきCOUNT()の別の形式があります。 COUNT(some_expression) 。
それらの違いは次のとおりです。
- COUNT(*)は、すべての入力行(NULLおよび重複を含む)の合計を返します。
- COUNT( some_expression )NULL以外の入力行の数をカウントします。
DISTINCTキーワードと組み合わせて使用すると、COUNT()は重複するエントリを排除し、一意の値のみを返します。
COUNT()とDISTINCTを使用して、固有のタイプの評価がいくつ存在するかを判断する動作を見てみましょう。
dvdrental=> SELECT COUNT(DISTINCT rating) FROM film;
count
-------
5
(1 row)
このクエリでは、5種類の評価があることがわかります。
なぜそれが重要なのですか?
追跡または対象となるものによっては、存在するものがいくつあるかを知ることが重要になる場合があります。したがって、COUNT(*)またはCOUNT( some_expression )これらのタイプの課題を支援します。
COUNT(*)はNULLを無視しないことに注意してください。重複値とNULL値を含むすべての行は、最終的な数値の一部として返されます。
6。 CASE式を使用して複数の行を更新します。
次のテーブルがあるとします:
trial=> SELECT * FROM reward_members;
rm_id | expense_amt | member_status
-------+-------------+---------------
1 | 1245.33 | gold
2 | 1300.49 | gold
3 | 900.20 | bronze
4 | 2534.44 | platinum
5 | 600.19 | bronze
6 | 1001.55 | silver
7 | 1097.99 | silver
8 | 3033.33 | platinum
(8 rows)
member_status列の名前を変更し、' groupを追加する必要があります '各レコードに存在する現在の名前の末尾まで。
手始めに、複数の個別のUPDATEステートメントでこれを問題なく実行できます。
ただし、単一のCASE式も同様です。
trial=> UPDATE reward_members
SET member_status = (
CASE member_status
WHEN 'gold' THEN 'gold_group'
WHEN 'bronze' THEN 'bronze_group'
WHEN 'platinum' THEN 'platinum_group'
WHEN 'silver' THEN 'silver_group'
END
)
WHERE member_status IN ('gold', 'bronze','platinum', 'silver');
UPDATE 8
変更を確認するために、テーブルをもう一度クエリしてみましょう。
trial=> SELECT * FROM reward_members;
rm_id | expense_amt | member_status
-------+-------------+----------------
1 | 1245.33 | gold_group
2 | 1300.49 | gold_group
3 | 900.20 | bronze_group
4 | 2534.44 | platinum_group
5 | 600.19 | bronze_group
6 | 1001.55 | silver_group
7 | 1097.99 | silver_group
8 | 3033.33 | platinum_group
(8 rows)
すべての更新が成功しました。
なぜそれが重要なのですか?
複数の個別のUPDATEステートメントが実行された場合、サーバーへのラウンドトリップ数を想像できます。実は、この例では4つだけです。しかし、それでも、多くの人の可能性は常にあります。
ただし、CASE式を使用したUPDATEを使用すると、代わりに1つのクエリのみを送信します。
7。 COPYおよび\copy
PostgreSQLは、ファイルとテーブル間でデータをエクスポートするためのコマンドであるCOPYを提供します。
提供されているリンクにアクセスして、COPYで利用できる豊富なオプションを確認してください。
COPYに関する重要な注意事項。このコマンドを実行するには、SUPERUSERロール権限が必要です。
psqlメタコマンド\copyは、このロール属性と見なされないユーザーの代替手段です。間もなくそのコマンドにアクセスします。
まず、COPYコマンドを実行して、特定の列をローカルマシンのCSVファイルにエクスポートしましょう。
エクスポート用にこのクエリ結果があると仮定します:
trial=# SELECT expense_amt, member_status
trial-# FROM reward_members
trial-# WHERE member_status = 'gold_group';
expense_amt | member_status
-------------+---------------
1245.33 | gold_group
1300.49 | gold_group
(2 rows)
COPYを使用すると、そのSELECTステートメントを使用してこのエクスポートを完了することができます。
trial=# COPY (SELECT expense_amt, member_status
FROM reward_members
WHERE member_status = 'gold_group')
TO '/home/linux_user_here/awards_to_honor.csv'
DELIMITER ','
CSV HEADER;
COPY 2
*注:ドキュメントによると、クエリは括弧内に含める必要があります。
そのファイルの内容を確認しましょう:
$ cat awards_to_honor.csv
expense_amt,member_status
1245.33,gold_group
1300.49,gold_group
最初の行にはHEADER(列名)が含まれており、両方の行には、WHERE句フィルターから返された両方の列のexpense_amtデータとmember_statusデータが含まれていることがわかります。
上記のCOPYコマンドの実行から発見したもう1つの重要な警告。
ユーザーには、OSレベルでファイルに書き込むための権限が必要です。
私の場合、次のように修正しました:
$ sudo chown postgres awards_to_honor.csv
代わりに、現在のユーザーがアクセスできる/ tmp(以下に表示)などのシステムファイルに書き込むことで、この問題を回避できます。
trial=# COPY (SELECT expense_amt, member_status
FROM reward_members
WHERE member_status = 'gold_group')
TO '/tmp/awards_to_honor.csv'
DELIMITER ','
CSV HEADER;
COPY 2
ただし、SUPERUSER属性のないテストロールの1つで、/tmpファイルへの書き込みで問題が発生しました。
確認のために以下を参照してください:
trial=# SET role log_user; -- changing from postgres user to log_user
SET
同じCOPYコマンドを試し、/tmpフォルダーに書き込みます
trial=> COPY (SELECT expense_amt, member_status
FROM reward_members
WHERE member_status = 'gold_group')
TO '/tmp/awards_to_honor2.csv'
DELIMITER ','
CSV HEADER;
ERROR: must be superuser to COPY to or from a file
HINT: Anyone can COPY to stdout or from stdin. psql's \copy command also works for anyone.
HINT:で提案されているように、SUPERUSER属性のないロールの場合、おそらくより適切な方法はpsql\copyメタコマンドです。
そのSUPERUSER属性を必要とせずに、同じロールを使用する代わりに\copyを使用して同様のタイプのコマンドを実行してみましょう。
trial=> \copy (SELECT expense_amt, member_status
FROM reward_members
WHERE member_status = 'silver_group')
TO '/home/linux_user_here/more_awards.csv'
DELIMITER ','
CSV HEADER;
COPY 2
問題ありません。
そしてファイルの内容
$ cat more_awards.csv
expense_amt,member_status
1001.55,silver_group
1097.99,silver_group
/ tmpフォルダーでも機能します:
trial=> \copy (SELECT expense_amt, member_status
FROM reward_members
WHERE member_status = 'silver_group')
TO '/tmp/more_awards.csv'
DELIMITER ','
CSV HEADER;
COPY 2
書き込まれたファイルにも同じ内容が存在します:
trial=> \! cat /tmp/more_awards.csv
expense_amt,member_status
1001.55,silver_group
1097.99,silver_group
なぜそれが重要なのですか?
ファイルを介してPostgreSQLにデータをインポートすることは、確実な一括アップロード方法です。このブログ投稿ではすべてがカバーされているわけではありませんが、COPYと\ copyは両方とも、さまざまなファイル形式と拡張子を操作するためのいくつかのオプションを提供します。
同じように、テーブルまたは特定の列からのデータのエクスポートも、これらのコマンドの両方で簡単に処理できます。
8。 psql\helpメタコマンド
psqlコマンドラインセッションを使用しています。 CREATE INDEXコマンドの構文に興味がありますか?
ブラウザや別のドキュメントにアクセスする必要はありません。
代わりにこれを試してください:
trial=> \help CREATE INDEX
Command: CREATE INDEX
Description: define a new index
Syntax:
CREATE [ UNIQUE ] INDEX [ CONCURRENTLY ] [ [ IF NOT EXISTS ] name ] ON table_name [ USING method ]
( { column_name | ( expression ) } [ COLLATE collation ] [ opclass ] [ ASC | DESC ] [ NULLS { FIRST | LAST } ] [, ...] )
[ WITH ( storage_parameter = value [, ... ] ) ]
[ TABLESPACE tablespace_name ]
[ WHERE predicate ]
利用可能なヘルプテキストを知るには、\ helpを単独で実行して、利用可能なオプションのリストを取得できます。
ここにすべてをリストするのではなく、オプションが利用可能であることを知っているだけです。
なぜそれが重要なのですか?
このメタコマンドが非常に使いやすく、強力で便利であるという事実は、ここで言及するのに十分なプロです。他のドキュメント全体を検索するのに費やす時間を大幅に節約できました。そしてもちろん、初心者なので、私はそれをかなり頻繁に使用します!
結論
これは完全なリストではありません。また、'すべてがすべて終了する 'クエリとデータ操作の。
私がSQLDeveloperの役割を学び、成長し続ける中で、私の興味をそそり、私に話しかけるものだけを取り上げます。このブログ投稿を通じて、上記のクエリとコマンドのユースケースが見つかり、適切と思われるものを実装できることを願っています。