データベース SQL の高度なクエリ ステートメント: 集計クエリ、複数テーブル クエリ、結合クエリ

学生テーブルを作成する

学生テーブルとコーステーブルを作成する

CREATE TABLE Students (
    StudentID int PRIMARY KEY,
    Name varchar(255),
    Gender varchar(1),
    Age int,
    City varchar(255)
);
INSERT INTO Students VALUES(1, 'David', 'M', 21, 'Shanghai');
INSERT INTO Students VALUES(2, 'Kevin', 'M', 19, 'Beijing');
INSERT INTO Students VALUES(3, 'Emily', 'F', 22, 'Shanghai');
INSERT INTO Students VALUES(4, 'William', 'M', 20, 'New York City');
INSERT INTO Students VALUES(5, 'Alice', 'F', 19, 'Los Angeles');
INSERT INTO Students VALUES(6, 'Frank', 'F', 22, 'Los Angeles');
CREATE TABLE Courses (
    CourseID int PRIMARY KEY,
    CourseName varchar(255)
);
INSERT INTO Courses VALUES(1, 'CS101');
INSERT INTO Courses VALUES(2, 'CS202');
INSERT INTO Courses VALUES(3, 'EE101');

集計クエリ

ここに画像の説明を挿入

集計関数

直接のお問い合わせ

SELECT COUNT(*) FROM Students;

ここに画像の説明を挿入

エイリアスクエリを設定する

SELECT COUNT(*) AS StudentsNum FROM Students;

条件付きクエリを設定する

StudentID が主キーであり、レコードの各行の主キーが異なるため、COUNT(*) と COUNT(StudentID) を使用しても同じ効果があります。さらに、集計クエリでは引き続き WHERE 句を使用できます。たとえば、20 歳以上の学生の数を調べたい場合は、次の SQL ステートメントを使用できます。

SELECT COUNT(*) FROM Students AS s WHERE s.age > 20; 

よく使用される集計関数

関数の説明
SUM 特定の列の合計を計算します。列は数値型である必要があります
。 AVG 特定の列の平均を計算します。列は数値型である必要があります。
MAX 特定の列の最大値を計算します。 MIN 特定の列の最小値
を計算します。あるコラム

学生の平均年齢を問い合わせる

SELECT AVG(Age) FROM Students;

AVG 集計関数の使用
ここに画像の説明を挿入

グループクエリ

単一フィールドのグループ化

都市に基づいて学生をグループ化し、各都市に何人の学生がいるかをクエリする必要がある

SELECT City, COUNT(*) FROM Students GROUP BY City;

ここに画像の説明を挿入

エラーレポートグループクエリ

クエリ結果に Name も入力すると、同じ都市の異なる名前の学生が多数存在する可能性があるため、エラーが報告されます。そのため、次のステートメントは無効です。

SELECT City, COUNT(*), Name FROM Students GROUP BY City;

エラー メッセージは次のとおりです。
ここに画像の説明を挿入
SELECT リストの式 #3 は GROUP BY 句になく、GROUP BY 句の列に機能的に依存しない非集計列 "tuling.Students.Name" が含まれています。 ; これは sql_mode= と一致していますが、only_full_group_by には互換性がありません。

#3 は「名前」列を指します。

複数フィールドのグループクエリ

GROUP BY では複数のフィールドを指定することもできます。たとえば、学生を最初に市区町村に従ってグループ化し、次に性別に従ってグループ化したい、次のステートメントを使用できます。

SELECT City, Gender, COUNT(*) FROM Students GROUP BY City, Gender;

ここに画像の説明を挿入
学生テーブルのロサンゼルスの 2 人の性別は同じです。グループ表示は F で、カウントは 2 です。
ここに画像の説明を挿入
次に、そのうちの 1 人の性別を M に変更します。クエリ結果が変わるかどうか考えてください。

同じ位置にあるが性別が異なるものを区別しました。
ここに画像の説明を挿入
ロサンゼルスの元の数字は 2 ですが、現在は 2 つの 1 になり、性別 M と F が区別されていることがわかります。
ここに画像の説明を挿入

複数テーブルのクエリ

SELECT クエリでは、単一のテーブルからデータをクエリするだけでなく、複数のテーブルからデータをクエリすることもできます。構文は次のとおりです。

直接のお問い合わせ

SELECT * FROM Students, Courses;

クエリ結果は 2 つのテーブルのデカルト積です。

Student には 5 列のフィールドと 7 行のレコードがあり、Courses には 2 列のフィールドと 3 行のレコードがあるとします。結果は、21 (3 * 7) 行のレコードと 7 (5 + 7) 行の 2 次元テーブルになります。 2) フィールドの列、つまり学生 テーブルの各行は、Courses テーブルの各行と結合されます。結果セットの列数は 2 つのテーブルの列数の合計になり、行数は 2 つのテーブルの行数の積になります。
ここに画像の説明を挿入

クエリ名の変更

2 つのテーブルに同じ名前のフィールドがあり、結果が混乱する場合がありますが、AS を使用してフィールドにエイリアスを付けて区別することができます。たとえば、次のステートメントを使用して、StudentID と CourseID の名前を StudentId と CourseId に変更します。

SELECT Students.StudentID AS StudentId, Courses.CourseID AS CourseId FROM Students, Courses;

フィールドのエイリアスを作成するための構文は、column_name AS new_column_name に似ています。上記のステートメントでは、StudentID と CoursesID にそれぞれ StudentId と CourseId のエイリアスを付けていますが、この例では最後の文字 D を小文字に変更しているだけです。ただし、別の状況を考えてみましょう: Students と Courses の主キー フィールドが両方とも ID と呼ばれると仮定すると、このエイリアスは非常に役立ちます。次のステートメントを使用すると、クエリ結果をより明確にできます。

SELECT Students.ID AS StudentId, Courses.ID AS CourseId FROM Students, Courses;

出力フィールドのエイリアスに加えて、テーブルのエイリアスも便利です。構文は table_name AS alias に似ています。上記のステートメントは次のように記述できます。

SELECT S.ID AS StudentId, C.ID AS CourseId FROM Students AS S, Courses AS C;

Student テーブルに新しい列 CourseID を作成します。

複数テーブルのクエリでは、WHERE 句を引き続き使用できます。全員が次の内容を理解できるようにするには、この学生が選択したコースを表す新しいフィールド CourseID を学生に追加する必要があります。

City の後に CourseID の新しい列を作成します

alter table Students add column CourseID int(4) not null after City;

ここに画像の説明を挿入
CouseID の値は StudentID の値の半分に設定されます

update Students set CourseID = StudentID/2

ここに画像の説明を挿入

StudentID とそれに対応するコース名をクエリします

SELECT S.StudentID,C.CourseName 
FROM Students AS S,Courses AS C
WHERE S.CourseID = C.CourseID;

ここに画像の説明を挿入
エラーを報告してください! 理由はわかりますか? 一般に、erro 構文は漢字の問題です。

Students as S,Courses as C 这个逗号是中文字符,改成英文字符后运行成功啦

ここに画像の説明を挿入
WHERE 句に加えて、ORDER BY や GROUP BY に似た他の句も複数テーブル クエリに適しています。

WHERE 句に加えて、ORDER BY や GROUP BY に似た他の句も複数テーブル クエリに適しています。

JOINクエリ

内部結合

結合クエリは複数テーブル クエリの別のタイプで、複数のテーブルに対して JOIN 操作を実行します。つまり、最初にメイン テーブルを結果セットとして決定し、次に他のテーブルのレコードをメイン テーブルの結果セットに選択的に「埋め込み」ます。

各学生が選択したコース名を知りたいとします。上記の複数テーブル クエリと WHERE 句に加えて、INNER JOIN 句も使用できます。

SELECT S.StudentID, C.CourseName 
FROM Students AS S 
INNER JOIN Courses AS C ON S.CourseID = C.CourseID;

ここに画像の説明を挿入
このステートメントは、各 StudentID とそれに対応するコース名をクエリできます。INNSER JOIN ステートメントの内部実行プロセスは次のとおりであることに注意してください。

  • 1 メインテーブルを決定します。FROM table_name を使用します。
  • 2 次に、接続されたテーブルを確認し、INNER JOIN table_name を使用します。
  • 3 接続条件を決定し、ON 条件を使用します。上記ステートメントの条件は、S.CourseID = C.CourseID です。
  • 4 最後に、WHERE、ORDER BY およびその他の句を追加できます
    。INNER JOIN に加えて、LEFT JOIN、RIGHT JOIN、および FULL JOIN もあります。

補足: 可読性を高めるためだけにエイリアスは必要ありません。

右結合、左結合

ステートメントを RIGHT JOIN に変更すると、次のようになります。

SELECT S.StudentID, C.CourseName
FROM Students AS S 
RIGHT JOIN Courses AS C ON S.CourseID = C.CourseID;

ここに画像の説明を挿入

Student テーブルを変更して、5 と 6 がコース 1 を選択し、クエリを再度右結合します。
ここに画像の説明を挿入
上記のステートメントを実行した後、参加する学生がいないクラスがある場合、レコード内に CourseName のみが含まれる冗長レコードが作成されますが、StudentID は NULL になります。
ここに画像の説明を挿入
なぜそうなるのでしょうか? INNER JOIN は 2 つのテーブルに同時に存在するデータを返します。Students のコース番号が 1、2、3、および 5 であり、Courses のコース番号も 1、2、3、および 4 である場合、結果はそれらの交差になります。 1、2、3を設定します。RIGHT JOIN は、右側のテーブルに存在するレコードを返します。右側のテーブルの特定の行が左側のテーブルに存在しない場合、結果のそれらの行は NULL になります。

LEFT JOIN は、左側のテーブルに存在する番号を返します。CourseID=10 が Students に追加された場合、Courses テーブルに ID 10 のコース レコードがない場合でも、LEFT JOIN の結果にはさらに 1 行のレコードが含まれます。 、対応する CourseName は NULL です。(補足: データベースによっては、LEFT JOIN を LEFT OUT JOIN と呼ぶ場合もあります。同様に、RIGHT JOIN を RIGHT OUT JOIN と呼ぶ場合もあります。)

完全結合

最後のタイプの JOIN は FULL JOIN で、結果セットは 2 つのテーブルからすべてのレコードを選択し、2 つのテーブルに存在しない列に NULL を自動的に追加します。

接続クエリのロジックを理解するために、次の図を参照すると、左側の円は左側のテーブル、右側の円は右側のテーブルとして理解できます。
ここに画像の説明を挿入
上記は SQL 構文に関する基本的なチュートリアルです。SQL を使用してテーブルとレコードを作成し、高度な SQL ステートメントを使用して複雑なクエリを実行する方法を学習しました。次の章では、実際のデータベース ソフトウェア MySQL の使用方法を学習していきます。 。

宿題

CourseID 1 に参加している学生の数とコース名を調べる SQL ステートメントを作成してください。検索しているのは 20 歳以上の男性学生の数だけであることに注意してください。

方法 1 使用場所

SELECT COUNT(*) AS StudentsNum,CourseName 
FROM Students AS S,Courses AS C
WHERE S.CourseID = C.CourseID AND S.CourseID = 1 AND S.Age > 20 AND S.Gender = 'M';

方法2 Group by + where

SELECT COUNT(*) AS StudentsNum, CourseName 
FROM Students LEFT JOIN Courses ON Students.CourseID = Courses.CourseID 
WHERE Students.Age > 20 AND Students.Gender = 'M'
GROUP BY Students.CourseID;

レビュー

  • 1 メインテーブルを決定します。FROM table_name を使用します。
  • 2 次に、接続されたテーブルを確認し、INNER JOIN table_name を使用します。
  • 3 接続条件を決定し、ON 条件を使用します。上記ステートメントの条件は、S.CourseID = C.CourseID です。
  • 4 最後に、WHERE、ORDER BY およびその他の句を追加できます
    。INNER JOIN に加えて、LEFT JOIN、RIGHT JOIN、および FULL JOIN もあります。

参考

[SQL の高度なクエリ ステートメント: 集計クエリ、複数テーブル クエリ、接続クエリ [リレーショナル データベース SQL チュートリアル 5]] https://www.bilibili.com/video/BV1Zp4y1Q7mj/?share_source=copy_web&vd_source=fe6c23f6f1353ed1eff5d5e866171572

おすすめ

転載: blog.csdn.net/qq_41398619/article/details/132263105