興味深い基本的なSQL

-------- 2020-04-17

今日私はsqlの練習問題を見ました、それは非常に興味深いです、少しの抽出、それを記録してください〜

元の記事へのリンク:https://zhuanlan.zhihu.com/p/38354000

-------------------------------------------------- ------------------容赦ない冷たい血の分割線--------------------------- -------------------------------

まず、ライブラリテーブル

学生テーブル:学生(学生番号、学生名、生年月日、性別)

スコア表:スコア(学生番号、コース番号、スコア)

コーステーブル:コース(コース番号、コース名、教師番号)

教師テーブル:教師(教師番号、教師名)

2.演習

1.簡単なクエリ

  • 姓の猿を持つ学生を見つける:「 '%」など
  • 最後の単語がサルである学生を見つけます: '%Monkey'など
  • サルのキャラクターを持つ学生を探す:「%芙%」など

2.サマリー分析

  • コース '002'の合計スコアをクエリします:(概要)コース番号= '002'のスコアから合計(スコア)を選択します。
  • 選択科目の数を問い合わせます:(データの複製)スコアから選択科目の数としてカウント(個別の学生数)を選択します。

3.グループ化

  • 各科目の最高点と最低点を確認します。
  • select 课程号,max(成绩) as 最高分,min(成绩) as 最低分
    from score
    group by 课程号;
  • 各コースで選択された学生の数をクエリします。
  • select 课程号, count(学号)
    from score
    group by 课程号;
  • 男性と女性の数を確認してください:
  • select 性别,count(*)
    from student
    group by 性别;

4.グループ化結果をクエリする

  • 平均スコアが60ポイントを超える学生の学生数と平均スコアをクエリします:(各学生の平均スコアを見つけます[学生番号でグループ化]、グループ化されたデータスクリーニング:スコア> 60)
  • select 学号, avg(成绩)
    from score
    group by 学号
    having avg(成绩)>60;
  • 少なくとも2つのコースの学生IDをクエリします:(各学生のコース数を調べます[学生IDでグループ化]、グループ化データのスクリーニング:コース数> 2)
  • select 学号, count(课程号) as 选修课程数目
    from score
    group by 学号
    having count(课程号)>=2;
  • 同じ名前の同性の学生のリストを照会し、同じ名前の学生の数を数えます:(同じ名前と同じ性の学生の数を確認します[名前でグループ化]、グループデータフィルタリング:数値> = 2 [同名の同性の説明、少なくとも2人])
  • select 姓名,count(*) as 人数
    from student
    group by 姓名
    having count(*)>=2;
  • 失敗したコースをクエリし、コース番号に従って並べ替えます。
  • select 课程号
    from score 
    where 成绩<60
    order by 课程号 desc;
  • 各コースの平均スコアをクエリします。結果は平均成績の昇順で並べ替えられます。平均成績が同じ場合は、コース番号の降順で並べ替えられます。
  • 按课程号分组,按平均成绩升序排序:asc,平均成绩相同时,按课程号降序排列:desc
  • select 课程号, avg(成绩) as 平均成绩
    from score
    group by 课程号
    order by 平均成绩 asc,课程号 desc;

5.複雑なクエリ

  • 成績が60未満のすべての学生の学生IDと名前を照会する
  • ①分数表score查出成绩小于60分学生的学号;②根据学号在student表查询学生姓名
  • select 学号,姓名
    from student
    where  学号 in (
    select 学号 
    from student
    where 成绩 < 60
    );
  • すべてのコースを履修していない学生IDと学生の名前をクエリします。
  • ①count求所有课程数量;②每一个学生选修课程数量:group by;③having条件:学生课程数量<课程总数量
  • select 学号,姓名
    from student
    where 学号 in(
    select 学号 
    from score
    group by 学号
    having count(课程号) < (select count(课程号) from course)
    );

6.マルチテーブルクエリ

  • 出会うすべての学生番号、名前、選択科目の合計得点:(左の数が参加します:left join
  • selecta.学号,a.姓名,count(b.课程号) as 选课数,sum(b.成绩) as 总成绩
    from student as a left join score as b
    on a.学号 = b.学号
    group by a.学号;
  • 学校番号85のすべての学生は、左のクエリ、名前と平均:(成績評価点の平均スコアよりも大きい場合は、参加します:left join
  • select a.学号,a.姓名, avg(b.成绩) as 平均成绩
    from student as a left join score as b
    on a.学号 = b.学号
    group by a.学号
    having avg(b.成绩)>85;
  • 学生のコース選択のクエリ:学生番号、名前、コース番号、コース名:(内部リンク:inner join
  • select a.学号, a.姓名, c.课程号,c.课程名称
    from student a inner join score b on a.学号=b.学号
    inner join course c on b.课程号=c.课程号;
  • 各コースの合格者と合格者の数をクエリします:(判決ケースの使用)
  • select 课程号,
    sum(case when 成绩>=60 then 1 
    	 else 0 
        end) as 及格人数,
    sum(case when 成绩 <  60 then 1 
    	 else 0 
        end) as 不及格人数
    from score
    group by 课程号;
  • セグメンテーション[100-85]、[85-70]、[70-60]、[<60]を使用して、各科目のスコアをそれぞれカウントします:各セグメントの数、コース番号、コース名:(判定条件の場合)使用)
  • elect a.课程号,b.课程名称,
    sum(case when 成绩 between 85 and 100 
    	 then 1 else 0 end) as '[100-85]',
    sum(case when 成绩 >=70 and 成绩<85 
    	 then 1 else 0 end) as '[85-70]',
    sum(case when 成绩>=60 and 成绩<70  
    	 then 1 else 0 end) as '[70-60]',
    sum(case when 成绩<60 then 1 else 0 end) as '[<60]'
    from score as a right join course as b 
    on a.课程号=b.课程号
    group by a.课程号,b.课程名称;
  • コース番号が0003で、コーススコアが80ポイントを超えている学生番号と学生の名前を照会します|:
  • select a.学号,a.姓名
    from student  as a inner join score as b on a.学号=b.学号
    where b.课程号='0003' and b.成绩>80;

-------------------------------------------------- ------------------容赦ない冷たい血の分割線--------------------------- -------------------------------

左結合:左結合 / 左外部結合(一部の左テーブル、右テーブルはnull

右結合:右結合 / 右外部結合(左のテーブルはそうではなく、右のテーブルはnullです

内部結合:内部結合 / 内部外部結合(共通の左と右のテーブルを表示

3つのパフォーマンス:

左結合:Aを選択します。*、B。*から  左外部結合Bをオンにします(A.a1 = B.a2)----- 左のテーブルにはあり、右のテーブルにはnullがありません

 

右接続:Aから選択します。*、B。*からAの  外部結合Bをオンにします(A.a1 = B.a2)----- 左のテーブルにはありません、右のテーブルにはnullがあります

接続:SELECT * FROM A、B ON Bインナー参加(A.A1 = b.a2---- - 左右サイドショーテーブルを共有)

自然接続:SELECT * FROM a、bここで、a.a1 = b.a2の場合、これらの2つの書き込み方法は同じであり、通常、自然接続が使用されます。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

おすすめ

転載: www.cnblogs.com/lilySeven/p/12721429.html