データベースシステム(1)-データクエリ

1.実験の目的:

  1. データテーブルとインデックスを定義するSQLに精通している。

  2. SQLを使用して、データの単一テーブルクエリ、複数テーブルクエリ、およびネストされたクエリ操作を完了することができます。

2.実験内容:

  1. 指定されたシナリオに従ってデータベースを作成します。

  2. 特定のクエリアプリケーションの要件に従って対応するSQLクエリステートメントを記述し、正しいクエリ結果を取得します。
    1.単一のテーブルに基づくSQLのデータクエリ機能に精通している;
    2。単一のテーブルに基づいてGROUPBY句、HAVING句、およびORDERBY句の使用法を
    習得する; 3。単一のテーブル(NOT)INなどに基づいて述語を習得する。使用法、集計関数の使用法を習得します
    。4。マルチテーブル結合クエリの該当する状況と文の構成方法を習得します

3.実験プロセス:

1.学生コースデータベース(stu_course)を作成します。
create database stu_course; 
2.学生テーブル、コーステーブル、および学生選択テーブルの作成と変更:
2.1。データテーブルを作成します。
create table Student(
  	Sno char(9)primary key,
  	Sname char(20)unique,
  	Ssex char(2),
	Sage smallint,
	Sdept char(20)	
);

create table Course (
	Cno char(4)primary key,
	Cname char(4) not null,
  	Cpno char(4),
	Ccredit smallint ,
 	foreign key(Cpno) references Course(Cno) 
);

create table SC(
	Sno char(9),
	Cno char(4),
	Grade smallint,
	primary key(Sno,Cno),
	foreign key(Sno) references Student(Sno),
	foreign key(Cno) references Course(Cno)
);
2.2。データテーブルを変更します。

Studentテーブルに登録時間の列を追加します。データ型は日付型です。

alter table Student add S_entrance Date;

年齢のデータ型を文字型(元々は文字型であると想定)から整数型に変更します。

alter table Student alter column Sage int;

追加のコース名には、一意の制約が必要です。

alter table Course add unique(Cname);

Studentテーブルを削除します。

drop  table Student;
3.データを挿入します。
INSERT INTO student VALUES ('201215121', '李勇', '男', 20, 'CS');
INSERT INTO student VALUES ('201215122', '刘晨', '女', 19, 'CS');
INSERT INTO student VALUES ('201215123', '王敏', '女', 18, 'MA');
INSERT INTO student VALUES ('201215125', '张立', '男', 19, 'IS');

INSERT INTO course VALUES ('1', '数据库', '5', 4);
INSERT INTO course VALUES ('2', '数学', NULL, 2);
INSERT INTO course VALUES ('3', '信息系统', '1', 4);
INSERT INTO course VALUES ('4', '操作系统', '6', 3);
INSERT INTO course VALUES ('5', '数据结构', '7', 4);
INSERT INTO course VALUES ('6', '数据处理', NULL, 2);
INSERT INTO course VALUES ('7', 'PASCAL语言', '6', 4);

INSERT INTO sc VALUES ('201215121', '1', 92);
INSERT INTO sc VALUES ('201215121', '2', 85);
INSERT INTO sc VALUES ('201215121', '3', 88);
INSERT INTO sc VALUES ('201215122', '2', 90);
INSERT INTO sc VALUES ('201215122', '3', 80);
4.さまざまなタイプのクエリ操作:
4.1。単一テーブルのクエリ操作:

1.指定された列をクエリします

すべての学生の学生IDと名前を確認してください。

select Sno,Sname from Student;

2.すべての列をクエリします

すべての学生の情報を照会します。

select * from Student;

3.計算値を照会します

すべての学生の名前と生年月日を照会します。

select Sname 2021-Sage from Student;

ここに画像の説明を挿入
4.重複するタプルを排除します

select Distinct Sno from Student; 

5.条件を満たすタプルをクエリします

コンピュータサイエンス学科のすべての学生について問い合わせる:

select Sname from Student where sdept='CS';

20歳未満の生徒に質問する:

select * from student where Sage <20;

20〜23歳の学生の名前、部門、年齢を​​照会します。

select sname,sdept,sage from student where sage between 20 and 23; 

20〜23歳でない学生の名前、学部、年齢を照会します。

select sname,sdept,sage from student where sage not between 20 and 23; 

6.セット(IN)を決定します

コンピュータサイエンス学科(CS)、数学科(MA)、情報学科(IS)の学生の名前と性別について問い合わせます。

select Sname,Ssex from student where Sdept in('CS','MA','IS'); 

クエリは、コンピュータサイエンス学科(CS)、数学科(MA)、情報学科(IS)の学生の名前と性別ではありません。

select Sname,Ssex from student where Sdept not in('CS','MA','IS'); 

7.文字マッチング(ファジークエリ)

like :字符串匹配
% :代表任意长度字符
_ :代表单个字符

学生番号が201215121である学生の情報を照会します。

select * from where Sno like '201215121';

Liuという名前のすべての学生の名前、学生ID、性別を照会します。

select Sname,Sno,Ssex from student where Sname like'刘%'

Liuという名前ではない学生の名前、学生ID、性別を照会します。

select Sname,Sno,Ssex from student where Sname not like'刘%'

2番目の単語が「Yang」である学生の名前と学生IDを照会します。

select Sname,Sno from student where Sname like'_阳%';

8.複数条件クエリ(および、または)

コンピュータサイエンス学科で20歳未満の学生の学生名を照会します。

select Sname from student where Sdept='CS' and Sage < '20';

9、注文::

コースNo.3を選択した学生の学生IDと成績を、成績の降順(デフォルトは昇順)でクエリします。

select Sno,Grade from SC where Cno='3' order by Grade DESC;

10.集計関数

count(*)                     统计元组个数
count([distinct|all] <列名>)  统计一列中值的个数
Sum([distinct|all] <列名>)    求一列总和
Max([distinct|all] <列名>)    求一列中的最大值
Min([distinct|all] <列名>)    求一列中的最小值
Avg([distinct|all] <列名>)    求一列的平均值

学生の総数を照会します。

select count(*) from student;

選択科目の総数を照会します。

select count(distinct Sno) from student;

201215012選択科目の学生の合計スコアを確認してください。

select sum(Ccredit) from SC,Course where Sno='201215121' and SC.Cno = Course.Cno;

11.グループ化

各コースの数と対応するコースの数を見つけます。

select Cno,count(*) from SC group by Cno;

グループ化後に特定の条件に従ってこれらのグループをフィルタリングする必要がある場合は、フィルター条件を指定する必要があります。

複数のコースを受講した学生の学生IDを照会します。

select Sno from SC group by Sno having count(*)>1;

注:集計関数はwhere句では使用できません!代わりに持っていることを使用する必要があります

4.2。マルチテーブル結合クエリ操作:

一度に2つ以上のテーブルからデータをクエリすることを、結合クエリと呼びます。

各学生と彼の選択科目の状況について問い合わせます。

select student.*,SC.* from student,SC where student.Sno=SC.Sno; 

コース2を受講し、90ポイントを超えたすべての学生の学生IDと名前について問い合わせます。

select student.Sno,Sname from Student,SC where Student.Sno=SC.Sno and SC.Cno='2' and SC.Grade>90;
4.3。ネストされたクエリ操作:

4.要約:

  • HAVINGはGROUPBYと組み合わせて使用​​され、GROUP BYの後に配置されます。このときの関数は、WHEREと同等です。

  • WHEREの背後にある条件(SUM()、AVG()など)に集計関数はありませんが、HAVINGはできます

おすすめ

転載: blog.csdn.net/qq_43531669/article/details/111757037