SQL言語 --- データクエリ

記事ディレクトリ


序文

この記事では主に SQL 言語でのデータ クエリの関連構文について説明し、読者の参考のために詳細な例を示します。


1. SQL言語によるデータクエリ

1. SELECT文の形式

(1) フォーマットを定義する

SQL 設定完了SELECT − FROM − WHERE SELECT-FROM-WHERE選択する_からW H ERE : SELECT A 1 , . . . , A n FROM R 1 , . . . , R m WHERE F の文構造 (R 1 . . . は関係、F は式、A 1 , . . . )
. は属性 SELECT \ A_1,...,A_n\\ FROM \ R_1,...,R_m\\ WHERE \ F\\ ここで、R_1... は関係、F は式、A_1,... は属性\\選択ください 1... Rから 1... RメートルどこF _ ここでR1...は関係、Fは式、A1...は属性です
簡単な理解

  • A はクエリしたい情報を表します
  • R は、情報がどのリレーショナル データ テーブルから取得されたかを表します。
  • F は、これらのデータを取得するために必要な収集操作の数学的記述を表します。

(2) WHERE句の条件式Fの文法記述

WHERE句の条件式Fには以下の演算子が使用できます。

  • 算術比較演算子: <、<=、>、>=、<>、!=
  • 論理演算子: AND、OR、NOT
  • メンバーシップ演算子を設定: IN、NOT IN
  • 谓词:存在する、すべての、一部の、ユニークな
  • 集計関数: AVG、MIN、MAX、SUM、COUNT
  • F のオペランドは別の SELECT ステートメントにすることもできます。つまり、SELECT 文タイプをネストすることができます。
    ここに画像の説明を挿入

(3) SELECT文の文法形式

完全な構文は次のとおりです。

SELECT 目标表的列名或列表达式序列
FROM 基本表名和(或)视图序列
[WHERE 行条件表达式]
[GROUP BY 列名序列[HAVING 组条件表达式]]
[ORDER BY 列名[ASC|DESC],...]

シンプルとは次のように理解できます。

  • SELECT 句: 表示する属性列を指定します。
  • FROM 句: クエリ オブジェクト (基本テーブルまたはビュー) を指定します。
  • WHERE 句: クエリ条件を指定します
  • GROUP BY 句: 指定された列の値によってクエリ結果をグループ化し、この属性の列値が等しいタプルがグループになります。通常、集計関数は各グループに適用されます。
  • HAVING指定:指定した条件を満たすグループのみを出力します
  • ORDER BY 句: 指定された列値の昇順または降順でクエリ結果テーブルを並べ替えます。

2. 単一テーブルクエリ

(1) 単一テーブルクエリとは何ですか?

単一テーブル クエリには 1 つのテーブルのみが含まれ、最も単純なクエリ操作です。
次のように多くの用途があります。

1.选择表中的若干列
2.选择表中的若干元组
3.对查询结果排序
4.使用聚合函数
5.对查询结果分组 

(2) 例文を使って文法を説明する

例 1: 単純なクエリ

800 を超える給与が税金を支払う必要があり、税率が 10% であると仮定して、各人が支払う必要がある税額をクエリします
ここに画像の説明を挿入
。コードは次のとおりです。

SELECT ENAME,(SAL-800)*0.1 FROM EMP; 

結果:
ここに画像の説明を挿入

例 2: 例 1 に基づいたエイリアスの使用

ここに画像の説明を挿入
コード:

SELECT ENAME 姓名,SAL 薪水(SAL-800)*0.1 税金 FROM EMP;

ここに画像の説明を挿入

例 3: DISTINCT キーワード

DISTINCT キーワードを使用して、重複行をキャンセルする効果を実現します。

SELECT DEPTNO FROM EMP;

デフォルトは「ALL」です

SELECT ALL DEPTNO FROM EMP;

ここに画像の説明を挿入

SELECT DISTINCT DEPTNO FROM EMP;

ここに画像の説明を挿入

例 4: 範囲内の値を取得する

SELECT ENAME ,SAL FROM EMP WHERE SAL BETWEEN 1500 AND 2000; 
``````sql
SELECT ENAME ,SAL FROM EMP WHERE SAL>=1500 AND SAL<=2000;

2 つのコードは同じ効果を持ちます。つまり、BETWEEN AND は >=AND<= と同等です。
ここに画像の説明を挿入

例 5: コレクション内の値を決定する

以下に 2 つのメソッドが提供されており、どちらも特定のコレクション要素の値を見つけることができます。
このうち * はすべての列が表示されることを意味し、デフォルトです。

SELECT * FROM EMP WHERE JOB IN('SALESMAN','CLERK');

ここに画像の説明を挿入

SELECT * FROM EMP WHERE JOB='SALESMAN' OR JOB='CLERK';

ここに画像の説明を挿入

例 6: 文字のマッチング

述語: [NOT] LIKE '<一致する文字列>' [ESCAPE '<エスケープ文字>']
<一致する文字列>は完全な文字列または次の文字列を含むことができますワイルドカード % および _

  • % (パーセント記号) は、任意の長さの文字列を表します (長さは 0 にすることもできます)
    。たとえば、a%b は、a で始まり b で終わる任意の長さの文字列を表します。
  • _ (アンダースコア) は任意の 1 文字を表します。
    たとえば、a_b は、a で始まり b で終わる長さ 3 の任意の文字列を意味します。

名前が S で始まり、3 番目の文字が O である従業員の名前をクエリします。

SELECT ENAME FROM EMP WHERE ENAME LIKE 'S_O%';

ここに画像の説明を挿入

例 7: ORDER BY 句

1 つ以上の属性列で並べ替え可能
昇順: ASC; 降順: DESC; デフォルトは昇順です

ソート列にNULL値が含まれる場合

  ASC:排序列为空值的元组最后显示
  DESC:排序列为空值的元组最先显示
SELECT * FROM EMP ORDER BY COMM ASC;

ここに画像の説明を挿入

SELECT * FROM EMP ORDER BY COMM DESC;

ここに画像の説明を挿入

例 8: 集計関数

集計関数は、リレーションシップ全体に関わる別のタイプの操作であり、集計関数を通じて、列内の値を 1 つの値に形成できます。
集計関数には主に 5 つのタイプがあります。

  • カウント
    COUNT([DISTINCT|ALL] *)
    COUNT([DISTINCT|ALL] <列名>)
  • 合計を計算
    SUM([DISTINCT|ALL] <列名>)
  • 平均
    AVG を計算する ([DISTINCT|ALL] <列名>)
  • 最大値
    MAX を検索します ([DISTINCT|ALL] <列名>)
  • 最小値
    MIN を検索します ([DISTINCT|ALL] <列名>)
SELECT count(*) FROM EMP;

ここに画像の説明を挿入

SELECT SUM(SAL) FROM EMP;

ここに画像の説明を挿入

SELECT AVG(SAL) FROM EMP;

ここに画像の説明を挿入

SELECT MAX(SAL) FROM EMP;

ここに画像の説明を挿入

SELECT MIN(SAL) FROM EMP;

ここに画像の説明を挿入

例 9: GROUP BY 句

間引きセット関数の対象

  • クエリ結果はグループ化されていないため、集計関数はクエリ結果全体に作用します。
  • クエリ結果をグループ化した後、集計関数が各グループに個別に適用されます。
SELECT DEPTNO,AVG(SAL) AS 平均工资 FROM EMP GROUP BY DEPTNO;

ここに画像の説明を挿入

例 10: HAVING ステートメント

知らせ:
集計関数は WHERE 句の条件式として使用できないため、HAVING 句が必要です

HAVING指定で指定した条件を満たすグループだけを出力します。
HAVING句とWHERE句の違い:動作の対象が異なる

  • WHERE 句はベース テーブルまたはビューに作用し、そこから条件を満たすタプルが選択されます。
  • HAVING 句はグループに作用し、その中から条件を満たすグループが選択されます。

平均給与が2200元以上の部門をチェック

SELECT DEPTNO ,AVG(SAL) AS 员工工资 FROM EMP GROUP BY DEPTNO HAVING AVG(SAL)>2200;

ここに画像の説明を挿入

3. 接続クエリ

(1) 結合クエリとは何ですか?

結合クエリ: 同時に 3 つ以上のテーブルを含むクエリ
結合条件または結合述語: 2 つのテーブルを結合するために使用される条件
一般的な形式:
[<テーブル名 1>.]<列名 1> <比較演算子> [<テーブル名 2>.]<列名 2>
[<テーブル名 1>.]<列名 1> BETWEEN [<テーブル名 2>.]<列名 2> AND [<テーブル名 2>.]<列名 3 > 結合フィールド : の
名結合述語
結合条件内の各結合フィールドの型は同等である必要がありますが、名前が同じである必要はありません

(2) 例を挙げて説明する

例 1: 等価結合

医師とその給与に応じた肩書を表示
(DOCTOR_INFORMATION)
ここに画像の説明を挿入

(DOCTOR_LEVEL)
ここに画像の説明を挿入

SELECT DOCTOR_INFORMATION.*,DOCTOR_LEVEL.*
FROM DOCTOR_INFORMATION,DOCTOR_LEVEL
WHERE DOCTOR_INFORMATION.DOCTORSAL=DOCTOR_LEVEL.DLEVELSAL;

結果:
ここに画像の説明を挿入

例 2: 内部結合

医師とその給与に応じた肩書を表示
(DOCTOR_INFORMATION)
ここに画像の説明を挿入

(DOCTOR_LEVEL)
ここに画像の説明を挿入

SELECT DOCTOR_INFORMATION.*,DOCTOR_LEVEL.*
FROM DOCTOR_INFORMATION
INSERT JOIN DOCTOR_LEVEL
ON (DOCTOR_INFORMATION.DOCTORSAL=DOCTOR_LEVEL.DLEVELSAL);

例 3: 自然結合

自然結合とは、複数のテーブルを取得するときに、Oracle が最初のテーブルの列を 2 番目のテーブルの同じ名前の列と自動的に結合することを意味します。自然接続では、ユーザーは接続する列を明示的に指定する必要はありません。このタスクは Oracle システムによって自動的に完了します。自然接続では **" が使用されます。自然結合「キーワード。**」

emp テーブルの給与 (sal フィールド) が 2000 を超えるレコードを取得し、emp テーブルと dept テーブル間の自然な接続を実現します。

従業員:
ここに画像の説明を挿入

部:
ここに画像の説明を挿入

SELECT EMPNO,ENAME,JOB,DNAME
FROM EMP NATURAL JOIN DEPT
WHERE SAL>2000;

ここに画像の説明を挿入

例 4: 自己結合

自己結合: テーブルはそれ自体に結合されます
違いを示すためにテーブルに別名を付ける必要がある
すべてのプロパティ名は同じ名前のプロパティであるため、エイリアス接頭辞を使用する必要があります

各タイトルの親タイトルを表示する
ここに画像の説明を挿入

SELECT FIRST.DLEVELID,FIRST.DLEVELNAME,FIRST.FATHERLEVEL,
SECOND.DLEVELID,SECOND.DLEVELNAME
FROM DOCTOR_LEVEL FIRST,DOCTOR_LEVEL SECOND
WHERE FIRST.FATHERLEVEL=SECOND.DLEVELID

結果:
ここに画像の説明を挿入

例 5: 外部結合

外部結合と通常結合の違い

1.普通连接操作只输出满足连接条件的元组
2.外连接操作以指定表为连接主体,将主体表中不满足连接条件的元组一并输出
3.左外连接:列出左边关系中所有的元组 
4.右外连接:列出右边关系中所有的元组 

通常、外部結合には次の 3 種類があります。

  • 左外部結合: キーは次のとおりです。左外部結合または左結合。
  • 右外部結合: キーは右外部結合または右結合。
  • 完全外部結合: キーワードは完全外部結合または完全結合。

DOCTOR_INFORMATION
ここに画像の説明を挿入

ドクターレベル
ここに画像の説明を挿入

  • 左外部結合: 左外部結合のクエリ結果には、結合条件を満たすデータ行だけでなく、左側のテーブルの結合条件を満たさないデータ行も含まれます。
SELECT DOCTOR_INFORMATION.*,DOCTOR_LEVEL.*
FROM DOCTOR_INFORMATION
LEFT JOIN DOCTOR_LEVEL
ON (DOCTOR_INFORMATION.DOCTORSAL=DOCTOR_LEVEL.DLEVELSAL);

結果:
ここに画像の説明を挿入

  • 右外部結合: 右外部結合のクエリ結果には、結合条件を満たすデータ行だけでなく、右テーブルの結合条件を満たさないデータ行も含まれます。
SELECT DOCTOR_INFORMATION.*,DOCTOR_LEVEL.*
FROM DOCTOR_INFORMATION
RIGHT JOIN DOCTOR_LEVEL
ON (DOCTOR_INFORMATION.DOCTORSAL=DOCTOR_LEVEL.DLEVELSAL);

結果:
ここに画像の説明を挿入

  • 完全外部結合: 完全外部結合を実行する場合、Oracle は完全な左外部結合クエリと右外部結合クエリを実行し、クエリ結果をマージして重複レコード行を削除します。
SELECT DOCTOR_INFORMATION.*,DOCTOR_LEVEL.*
FROM DOCTOR_INFORMATION
FULL JOIN DOCTOR_LEVEL
ON (DOCTOR_INFORMATION.DOCTORSAL=DOCTOR_LEVEL.DLEVELSAL);

結果:
ここに画像の説明を挿入

4. ネストされたクエリ

(1) ネストされたクエリとは何ですか?

SELECT-FROM-WHERE ステートメントはクエリ ブロックと呼ばれます。あるクエリ ブロックを別のクエリ ブロックの WHERE 句または HAVING 句の条件内にネストするクエリは、ネストされたクエリと呼ばれます。

SELECT select_list
FROM tablename
WHERE expr_operator
      (SELECT select_list
        FROM table);

  • 上部のクエリ ブロックは外部クエリまたは親クエリと呼ばれ、下部のクエリ ブロックは内部クエリまたはサブクエリと呼ばれます。
  • SQL 言語では、複数レベルのネストされたクエリが可能です。つまり、サブクエリは他のサブクエリをネストすることもできます。

(2) 分類:

解決方法によると

  • 非相関サブクエリ: サブクエリのクエリ条件は親クエリに依存せず、内側から外側へレイヤーごとに処理されます。つまり、各サブクエリは上位レベルのクエリ処理の前に解決され、サブクエリの結果は親クエリの検索条件を確立するために使用されます。
  • 相関サブクエリ:サブクエリのクエリ条件は親クエリに依存しますまず、外部クエリ内のテーブルの最初のタプルを取得し、内部クエリに関連する属性値に従って内部クエリを処理します。WHERE 句の戻り値が true の場合は、このタプルを取得して結果テーブルに入れます。そして、外側のテーブルの次のタプルを取得します。すべての外部テーブルがチェックされるまで、このプロセスを繰り返します。

クエリ結果によると

  • 単一行サブクエリ: 内部 SELECT コマンドは 1 つのレコードを返します
  • 複数行サブクエリ: 内部 SELECT コマンドが複数のレコードを返す
  • 複数列サブクエリ: 内部 SELECT コマンドは複数のデータ列を返します。

(3) サブクエリの使用規則

  • サブクエリは括弧で囲みます
  • サブクエリを比較演算子の右側に配置します。
  • サブクエリに ORDER BY 句を追加しないでください。
  • 単一行サブクエリには単一行演算子 (=、>、< など) を使用します。複数行演算子も使用できます。
  • 複数行のサブクエリには複数行演算子を使用します。IN、ANY、ALL は複数行演算子です。

(4) サブクエリで起こりやすい間違い

  • 単一行演算子を使用しますが、サブクエリは複数行を返します。
  • 内部クエリでレコードが返されませんでした

(5) 例を挙げて説明する

例 1: IN 述語を使用したサブクエリ

SELECT ENAME,DEPTNO,SAL 
FROM EMP 
WHERE SAL IN (
	SELECT MAX(SAL) 
	FROM EMP 
	GROUP BY DEPTNO);

例 2: 比較演算子を使用したサブクエリ

SELECT ENAME,SAL 
FROM EMP 
WHERE SAL>(
	SELECT SAL 
	FROM EMP 
	WHERE ENAME='JONES');

例 3: ANY(SOME) または ALL 述語を使用したサブクエリ

セマンティクスは次のとおりです。

1.> ANY	大于子查询结果中的某个值       
2.> ALL	大于子查询结果中的所有值
3.< ANY	小于子查询结果中的某个值    
4.< ALL	小于子查询结果中的所有值
5.>= ANY	大于等于子查询结果中的某个值    
6.>= ALL	大于等于子查询结果中的所有值
7.<= ANY	小于等于子查询结果中的某个值    
8.<= ALL	小于等于子查询结果中的所有值
9.= ANY	等于子查询结果中的某个值        
10.=ALL	等于子查询结果中的所有值(通常没有实际意义)
11.!=(或<>)ANY	不等于子查询结果中的某个值
12.!=(或<>)ALL	不等于子查询结果中的任何一个值

要約:
ここに画像の説明を挿入

例: 「CLERK」ではなく、どのタイプの「CLERK」よりも賃金が低い従業員の名前を検索します。次の
クエリ結果がわかっています:
ここに画像の説明を挿入
ここに画像の説明を挿入

SELECT ENAME ,DEPTNO, JOB,SAL
FROM EMP
WHERE SAL< ANY (
	SELECT SAL 
	FROM EMP
	WHERE JOB ='CLERK')
AND JOB<>'CLERK';

結果は次のとおりです。
ここに画像の説明を挿入

例 4: EXISTS 述語を使用したサブクエリ

EXISTS 述語を含むサブクエリはデータを返さず、論理 true 値または論理 false 値 "false" のみを返します。

  • 内側のクエリ結果が空でない場合、外側の WHERE 句は true を返します。
  • 内側のクエリ結果が空の場合、外側の WHERE 句は false 値を返します。

EXISTS によって引き起こされるサブクエリの場合、ターゲット列の式は通常 * を使用します。これは、EXISTS を使用したサブクエリは true または false の値のみを返し、列名は無意味であるためです。

NOT EXISTS述語

  • 内側のクエリ結果が空でない場合、外側の WHERE 句は false 値を返します。
  • 内側のクエリ結果が空の場合、外側の WHERE 句は true を返します。

専門職の肩書きを持つ医師全員に問い合わせる

SELECT DOCTORNAME,DOCTORSEX,DOCTORSAL
FROM DOCTOR_INFORMATION
WHERE EXITS(
	SELECT *
	FROM DOCTOR_LEVEL
	WHERE DOCTOR_INFORMATION.DOCTORSAL=DOCTOR_LEVEL.DLEVELSAL);

結果:
ここに画像の説明を挿入

5. クエリを設定する

(1) セットクエリとは何ですか?

集合演算の種類

  • そしてUNIONを操作する
  • 操作後 INTERSECT
  • 動作不良マイナス

集合演算に参加する各クエリ結果の列数は同じである必要があり、対応する項目のデータ型も同じである必要があります。

(2) 例を挙げて説明する

まず、次のクエリ結果が取得されました。
ここに画像の説明を挿入
ここに画像の説明を挿入

例 1: UNION を操作する

SELECT *
FROM EMP 
WHERE JOB='MANAGER'
UNION
SELECT * 
FROM EMP
WHERE DEPTNO='30';

ここに画像の説明を挿入

例 2: 交差演算 INTERSECT

SELECT *
FROM EMP 
WHERE JOB='MANAGER'
INTERSECT
SELECT * 
FROM EMP
WHERE DEPTNO='30';

ここに画像の説明を挿入

例 3: 差分演算 MINUS

SELECT *
FROM EMP 
WHERE JOB='MANAGER'
MINUS
SELECT * 
FROM EMP
WHERE DEPTNO='30';

ここに画像の説明を挿入


要約する

記事が不適切な場合はご容赦ください。
基本的な概念を理解したい読者は、次の記事を参考にしてください:
SQL 言語の概要と SQL 言語のデータ定義

おすすめ

転載: blog.csdn.net/weixin_52042488/article/details/127095812