記事のディレクトリ
1.実験の目的:
-
データテーブルとインデックスを定義するSQLに精通している。
-
SQLを使用して、データの単一テーブルクエリ、複数テーブルクエリ、およびネストされたクエリ操作を完了することができます。
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はできます