Mysql SQL ステートメント演習 (50 問)

Mysql SQL ステートメント演習 (50 問)

テーブル名とフィールド

–1. 学生リスト
学生 (s_id、s_name、s_birth、s_sex) – 学生ID、学生名、生年月日、学生の性別 – 2. コーススケジュール
Course(c_id,c_name,t_id) – コースID、コース名、教師ID – 3. 教師テーブル
教師 (t_id, t_name) – 教師ID、教師名 – 4. 成績表
Score(s_id,c_id,s_score) – 学生ID、コースID、スコア

テストデータ

--テーブルを作成 --学生テーブル CREATE TABLE `Student`(
`s_id` VARCHAR(20)、
`s_name` VARCHAR(20) NOT NULL デフォルト ''
`s_birth` VARCHAR(20) NOT NULL デフォルト ''
`s_sex` VARCHAR(10) NOT NULL デフォルト ''
主キー (`s_id`)
);
--テーブル「コース」を作成します(
`c_id` VARCHAR(20)、
`c_name` VARCHAR(20) NOT NULL デフォルト ''
`t_id` VARCHAR(20) NULLではない、
主キー (`c_id`)
);
--教師テーブル CREATE TABLE `Teacher`(
`t_id` VARCHAR(20)、
`t_name` VARCHAR(20) NOT NULL デフォルト ''
主キー(`t_id`)
);
--スコアテーブル CREATE TABLE `Score`(
`s_id` VARCHAR(20)、
`c_id` VARCHAR(20)、
`s_score` INT(3)、
主キー(`s_id`,`c_id`)
);
-- テスト データを学生テーブルに挿入します。 insert into Student values('01', '赵雷', '1990-01-01', '男');
Studentに値を挿入します('02' , '钱电' , '1990-12-21' , '男');
Student に値を挿入します('03' , '孙风' , '1990-05-20' , '男');
Student に値を挿入します('04' , '李云' , '1990-08-06' , '男');
Student に値を挿入します('05', '周梅', '1991-12-01', '女');
Student に値('06' , '吴兰' , '1992-03-01' , '女')を挿入します。
Student に値('07' , '郑竹' , '1989-07-01' , '女')を挿入します。
Student に値を挿入します('08', '王菊', '1990-01-20', '女');
--コーススケジュールのテストデータをコースに挿入します。values('01', 'Chinese', '02');
コースに値を挿入します('02', '数学', '01');
コースに値を挿入します('03', 'English', '03');

--Teacher に値 ('01', '张三') を挿入します。
Teacher に値 ('02', '李四') を挿入します。
Teacher に値 ('03', '王五') を挿入します。

--Score に値 ('01', '01', 80) を挿入します。
スコア値('01'、'02'、90)に挿入します。
スコア値('01'、'03'、99)に挿入します。
スコア値('02', '01', 70)に挿入します。
スコア値('02', '02', 60)に挿入します。
スコア値('02', '03', 80)に挿入します。
スコア値('03', '01', 80)に挿入します。
スコア値('03', '02', 80)に挿入します。
スコア値に挿入します('03', '03', 80);
スコア値('04', '01', 50)に挿入します。
スコア値('04', '02', 30)に挿入します。
スコア値('04'、'03'、20)に挿入します。
スコア値('05'、'01'、76)に挿入します。
スコア値('05'、'02'、87)に挿入します。
スコア値('06'、'01'、31)に挿入します。
スコア値('06', '03', 34)に挿入します。
スコア値('07', '02', 89)に挿入します。
スコア値('07', '03', 98)に挿入します。

表のデータは以下のとおりです

学生テーブル:

s_id s_name誕生セックス
01趙磊1990-01-01
02千甸1990-12-21
03孫鳳1990-05-20
04リー・ユン1990-08-06
05周梅1991-12-12女性
06ウー・ラン2017-12-13女性
07鄭朱1989-07-01女性
08王 儒1990-01-20女性
09趙磊1990-01-21女性
10趙磊1990-01-22

スコア スコア表:

s_id c_idスコア
01 01 80
01 02 90
01 03 99
02 01 70
02 02 60
02 03 80
03 01 80
03 02 80
03 03 80
04 01 50
04 02 30
04 03 20
05 01 76
05 03 87
06 01 31
06 03 34
07 03 89
07 01 98

コーススケジュール

c_id c_name t_id
01言語02
02数学01
03英語03

教師テーブル:

t_id t_name
01張三
02李思
03王武
-- 条件を準備し、sql_mode の ONLY_FULL_GROUP_BY を削除します。そうしないと、この場合はエラーが報告されます。
-- 選択リストの式 #1 は group by 句内になく、非集計列 'userinfo' が含まれています。
 -  理由:
-- MySQL 5.7.5 以降では機能依存関係の検出が実装されています。 only_full_group_by SQLモードが有効になっている場合(デフォルト)、
-- MySQL は、選択リスト、条件、または順序リストが、機能的に依存せずにグループ化内の名前のない非集計列を参照するクエリを拒否します。
-- (5.7.5 より前の MySQL では機能の依存関係が検出されず、only_full_group_by はデフォルトで有効になっていませんでした。5.7.5 より前の動作の説明については、MySQL 5.6 リファレンス マニュアルを参照してください。)
-- sql_mode の内容を表示するには、次のコマンドを実行します。
セッション変数を表示します。
グローバル変数を表示;
@@sql_mode を選択します。
-- グローバル sql_mode を 'STRICT_TRANS_TABLES、NO_ZERO_IN_DATE、NO_ZERO_DATE、ERROR_FOR_DIVISION_BY_ZERO、NO_AUTO_CREATE_USER、NO_ENGINE_SUBSTITUTION' に設定変更します。
セッション sql_mode を 'STRICT_TRANS_TABLES、NO_ZERO_IN_DATE、NO_ZERO_DATE、ERROR_FOR_DIVISION_BY_ZERO、NO_AUTO_CREATE_USER、NO_ENGINE_SUBSTITUTION' に設定します。

演習とSQL

-- 1. コース「01」のスコアがコース「02」のスコアよりも高い学生の情報とコーススコアを照会します。select st.*,sc.s_score as 'Chinese' ,sc2.s_score 'Mathematics' 
学生街から
LEFT JOIN スコア sc は sc.s_id=st.s_id および sc.c_id='01' です。 
LEFT JOIN スコア sc2 を sc2.s_id=st.s_id および sc2.c_id='02' で実行 
sc.s_score>sc2.s_scoreの場合

-- 2. コース「01」のスコアがコース「02」のスコアより低い学生の情報とコーススコアを照会します。 select st.*,sc.s_score 'Chinese',sc2.s_score 'Mathematics' from student st
LEFT JOIN スコア sc は sc.s_id=st.s_id および sc.c_id='01' です。
LEFT JOIN スコア sc2 を sc2.s_id=st.s_id および sc2.c_id='02' で実行
sc.s_score<sc2.s_scoreの場合

-- 3. 平均スコアが60点以上の学生の学生ID、名前、平均スコアを照会します。select st.s_id,st.s_name,ROUND(AVG(sc.s_score),2) cjScore from student st
LEFT JOIN スコア sc ON sc.s_id=st.s_id
AVG(sc.s_score)>=60 の st.s_id でグループ化

-- 4. 平均点が 60 点未満の学生の学生 ID、名前、平均点を照会します (点数がある学生とない学生を含む)
st.s_id、st.s_name、(case when ROUND(AVG(sc.s_score),2) is null then 0 else ROUND(AVG(sc.s_score)) end ) cjScore from student st を選択
LEFT JOIN スコア sc on sc.s_id=st.s_id
AVG(sc.s_score)<60 または AVG(sc.s_score) が NULL である st.s_id でグループ化

-- 5. すべてのクラスメートの学生 ID、学生名、コースの合計数、およびすべてのコースの合計スコアを照会します。 select st.s_id,st.s_name,count(c.c_id),( case when SU​​M(sc.s_score) is null or sum(sc.s_score)="" then 0 else SUM(sc.s_score) end) from student st
左結合スコア sc on sc.s_id =st.s_id 
c.c_id=sc.c_id のコース c に左結合
st.s_id でグループ化

-- 6. 姓が「Li」の教師の数を照会する select t.t_name,count(t.t_id) from teacher t
「李%」のような t.t_name を持つ t.t_id でグループ化します。 

-- 7. 教師「張三」に学んだ生徒の情報を照会する生徒stからst.*を選択する 
LEFT JOIN スコア sc ON sc.s_id=st.s_id
c.c_id=sc.c_id のコース c に左結合
t.t_id=c.t_id の教師 t に左から参加
 ここで、t.t_name="張三"

-- 8. 教師「Zhang San」が教えるコースを学習していない学生の情報を照会します -- 教師 Zhang San が教えるコース select c.* from course c left join teacher t on t.t_id=c.t_id where t.t_name="Zhang San"
 -- st.s_id と張三先生のクラスの成績
 sc.s_id をスコア sc から選択します。sc.c_id が存在します (c.c_id をコース c から選択します。t.t_id=c.t_id で教師 t に参加します。t.t_name="张三")
 -- 上記に見つからない st.s_id の学生情報、つまり張三先生の授業を受講していない学生情報 select st.* from student st where st.s_id not in(
 sc.s_id をスコア sc から選択します。sc.c_id が存在します (c.c_id をコース c から選択します。t.t_id=c.t_id で教師 t に参加します。t.t_name="张三")
 )

-- 9. 番号「01」と「02」のコースを受講した学生の情報を照会します。学生stからst.*を選択します。 
内部結合スコア sc on sc.s_id = st.s_id
コース c を c.c_id=sc.c_id および c.c_id="01" で内部結合します。
st.s_id が (
学生st2からst2.s_idを選択 
内部結合スコア sc2 on sc2.s_id = st2.s_id
コース c2 を c2.c_id=sc2.c_id および c2.c_id="02" で内部結合します。
)


ネットユーザーから提供されたアイデア(素晴らしい~):
選択st.*
学生ストリートから
内部結合スコア sc ON sc.`s_id`=st.`s_id`
GROUP BY st.`s_id`
SUM(IF(sc.`c_id`="01" OR sc.`c_id`="02" ,1,0))>1 となる

-- 10. コース番号「01」を受講したが、コース番号「02」を受講していない学生の情報を照会します。学生stからst.*を選択します。 
内部結合スコア sc on sc.s_id = st.s_id
コース c を c.c_id=sc.c_id および c.c_id="01" で内部結合します。
st.s_id が ( に含まれない )
学生st2からst2.s_idを選択 
内部結合スコア sc2 on sc2.s_id = st2.s_id
コース c2 を c2.c_id=sc2.c_id および c2.c_id="02" で内部結合します。
)

-- 11. すべてのコースを修了していない学生の情報を照会する -- 複雑すぎるので、次回は別の方法を試して、より簡単な方法があるかどうかを確認します -- ここでのアイデアは、すべてのコースを修了した学生の ID を照会し、その逆を取得するためにインラインで select * from student where s_id not in (
学生stからst.s_idを選択 
sc.s_id = st.s_id かつ sc.c_id="01" の内部結合スコア sc
st.s_id が (
学生st2からst2.s_idを選択 
sc2.s_id = st2.s_id および sc2.c_id="02" の内部結合スコア sc2
) と st.s_id の (
学生st2からst2.s_idを選択 
sc2.s_id = st2.s_id および sc2.c_id="03" の内部結合スコア sc2
))
-- このアイデアは 1 階のネットユーザーから来ており、左結合し、学生 ID でグループ化し、コース テーブル内のコースの合計数より少ない結果をフィルター処理します (彼のコードを見せてください)。これははるかに簡単です。
Student st から st.* を選択
左結合スコアS
st.s_id = S.s_id の場合
st.s_id でグループ化
count(c_id)<(コースからcount(c_id)を選択)





-- 12. 学生番号「01」の学生と同じクラスに少なくとも1つのコースを持つ学生の情報を照会します。学生stから別のst.*を選択します。 
LEFT JOIN スコア sc ON sc.s_id=st.s_id
sc.c_idが(
学生st2からsc2.c_idを選択
LEFT JOIN スコア sc2 on sc2.s_id=st2.s_id
st2.s_id = '01'の場合
)

-- 13. 学生番号01と同じコースを受講した他の学生の情報を照会します。学生stからst.*を選択します。 
LEFT JOIN スコア sc ON sc.s_id=st.s_id
st.s_id でグループ化
group_concat(sc.c_id) = を持つ 
(
学生st2からgroup_concat(sc2.c_id)を選択します。
LEFT JOIN スコア sc2 on sc2.s_id=st2.s_id
st2.s_id = '01'の場合
)

-- 14. 教師「張三」が担当するコースを学習したことがない学生の名前を照会する。学生stからst.s_nameを選択する。 
st.s_id が ( に含まれない )
スコアscからsc.s_idを選択 
c.c_id=sc.c_id のコース c を内部結合します。
教師 t を t.t_id=c.t_id および t.t_name="张三" に内部結合します。
)

-- 15. 2つ以上のコースに不合格となった学生の学生ID、名前、平均スコアを照会します。select st.s_id,st.s_name,avg(sc.s_score) from student st
LEFT JOIN スコア sc ON sc.s_id=st.s_id
sc.s_idが(
スコアscからsc.s_idを選択 
sc.s_score<60 または sc.s_score が NULL の場合
COUNT(sc.s_id)>=2 の sc.s_id でグループ化
)
st.s_id でグループ化

-- 16. コース「01」のスコアが60未満の学生情報を、スコアの降順でソートして取得します。 select st.*,sc.s_score from student st 
sc.s_id=st.s_id かつ sc.c_id="01" かつ sc.s_score<60 の内部結合スコア sc
sc.s_score 降順で並べ替え

-- 17. すべての学生のすべてのコースの成績と平均成績を平均成績別に高い順から低い順に表示します。表示をより完璧にするために、round、case when then else end を追加できます。select st.s_id,st.s_name,avg(sc4.s_score) "平均スコア",sc.s_score "中国語",sc2.s_score "数学",sc3.s_score "英語" from student st
sc.s_id=st.s_id および sc.c_id="01" の左結合スコア sc
sc2.s_id=st.s_id および sc2.c_id="02" の左結合スコア sc2
sc3.s_id=st.s_id および sc3.c_id="03" の左結合スコア sc3
LEFT JOIN スコア sc4 on sc4.s_id=st.s_id
st.s_id でグループ化 
SUM(sc4.s_score) 降順で並べ替え

-- 18. 各科目の最高、最低、平均スコアを照会します。次の形式で表示します: コース ID、コース名、最高スコア、最低スコア、平均スコア、合格率、中程度の率、良好な率、優秀な率 -- 合格は >=60、中程度は: 70-80、良好な率は: 80-90、優秀な率は: >=90
c.c_id、c.c_name、max(sc.s_score)「最高スコア」、MIN(sc2.s_score)「最低スコア」、avg(sc3.s_score)「平均スコア」を選択します。 
,((s_score>=60 かつ c_id=c.c_id のスコアから count(s_id) を選択)/(c_id=c.c_id のスコアから count(s_id) を選択)) "合格率"
,((select count(s_id) from score where s_score>=70 and s_score<80 and c_id=c.c_id )/(select count(s_id) from score where c_id=c.c_id)) 「中程度のレート」
,((s_score>=80 かつ s_score<90 かつ c_id=c.c_id のスコアから count(s_id) を選択)/(c_id=c.c_id のスコアから count(s_id) を選択)) 「優秀率」
,((select count(s_id) from score where s_score>=90 and c_id=c.c_id )/(select count(s_id) from score where c_id=c.c_id)) 「優秀率」
コースCから
LEFT JOIN スコア sc ON sc.c_id=c.c_id 
sc2.c_id=c.c_id の左結合スコア sc2 
sc3.c_id=c.c_id の左結合スコア sc3 
c.c_id でグループ化

-- 19. 科目スコアで並べ替えてランキングを表示する(完全には実装されていません)
-- MySQL にはランク関数がありません -- @score を追加すると、union all select c1.s_id,c1.c_id,c1.c_name,@score:=c1.s_score,@i:=@i+1 from (select c.c_name,sc.* from course c を使用した後に順序が乱れるのを防ぐことができます。 
LEFT JOIN スコア sc ON sc.c_id=c.c_id
ここで、c.c_id="01"、sc.s_score desc) c1 で順序付け、
(@i:=0 を選択)
すべて結合 
c2.s_id、c2.c_id、c2.c_name、c2.s_score、@ii:=@ii+1 を選択 (c.c_name、sc.* をコース c から選択) 
LEFT JOIN スコア sc ON sc.c_id=c.c_id
ここで、c.c_id="02"、sc.s_score desc) c2 で順序付け、
(@ii:=0 を選択) aa 
すべて結合
c3.s_id、c3.c_id、c3.c_name、c3.s_score、@iii:=@iii+1 を選択 (c.c_name、sc.* をコース c から選択) 
LEFT JOIN スコア sc ON sc.c_id=c.c_id
ここで、c.c_id="03"、順序はsc.s_score desc) c3です。
@iii=0 を設定します。


-- 20. 生徒の合計スコアを照会し、順位付けする select st.s_id,st.s_name
,(case の場合 sum(sc.s_score) が null なら 0、そうでない場合は sum(sc.s_score) 終了)
 学生街から
LEFT JOIN スコア sc ON sc.s_id=st.s_id
st.s_id でグループ化、sum(sc.s_score) で並べ替え

-- 21. 異なる教師が教える異なるコースの平均スコアを高い順から低い順に照会します。 select t.t_id,t.t_name,c.c_name,avg(sc.s_score) from teacher t 
c.t_id=t.t_id のコース c に左結合 
左結合スコア sc on sc.c_id =c.c_id
t.t_id でグループ化
平均(sc.s_score)降順で並べ替え

-- 22. すべてのコースで2位から3位にランクされた学生の情報とコーススコアを照会します。a.*を(から選択します。
学生stからst.*、c.c_id、c.c_name、sc.s_scoreを選択
LEFT JOIN スコア sc on sc.s_id=st.s_id
コース c を c.c_id =sc.c_id および c.c_id="01" で内部結合します。
sc.s_score desc LIMIT 1,2 で並べ替える
すべて結合
b.* を ( から選択
学生stからst.*、c.c_id、c.c_name、sc.s_scoreを選択
LEFT JOIN スコア sc ON sc.s_id=st.s_id
コース c を c.c_id =sc.c_id および c.c_id="02" で内部結合します。
sc.s_score desc LIMIT 1,2) b で並べ替え
すべて結合
c.* を ( から選択
学生stからst.*、c.c_id、c.c_name、sc.s_scoreを選択
LEFT JOIN スコア sc ON sc.s_id=st.s_id
コース c を c.c_id =sc.c_id および c.c_id="03" で内部結合します。
sc.s_score desc LIMIT 1,2) c で並べ替え

-- 23. 各科目の各スコア範囲の学生数を数えます: コース番号、コース名、[100-85]、[85-70]、[70-60]、[0-60]、パーセンテージを選択します。c.c_id、c.c_name 
,((sc.c_id=c.c_id かつ sc.s_score<=100 かつ sc.s_score>80 のスコア sc から count(1) を選択)/(sc.c_id=c.c_id のスコア sc から count(1) を選択)) "100-85"
,((sc.c_id=c.c_id かつ sc.s_score<=85 かつ sc.s_score>70 の場合、スコア sc から count(1) を選択)/(sc.c_id=c.c_id の場合、スコア sc から count(1) を選択)) "85-70"
,((sc.c_id=c.c_id かつ sc.s_score<=70 かつ sc.s_score>60 の場合、スコア sc から count(1) を選択)/(sc.c_id=c.c_id の場合、スコア sc から count(1) を選択)) "70-60"
,((sc.c_id=c.c_id かつ sc.s_score<=60 かつ sc.s_score>=0 の場合、スコア sc から count(1) を選択)/(sc.c_id=c.c_id の場合、スコア sc から count(1) を選択)) "60-0"
コースcからc.c_idで注文

-- 24. 学生の平均スコアと順位を照会する set @i=0;
( から a.*,@i:=@i+1 を選択する
select st.s_id,st.s_name,round((case when avg(sc.s_score) is null then 0 else avg(sc.s_score) end),2) 学生 st からの「平均スコア」
LEFT JOIN スコア sc ON sc.s_id=st.s_id
st.s_id でグループ化 sc.s_score で順序付け desc) a

-- 25. 各科目の上位3つのスコアを照会します。a.* から選択します (
 学生stからst.s_id、st.s_name、c.c_id、c.c_name、sc.s_scoreを選択
 LEFT JOIN スコア sc ON sc.s_id=st.s_id
 c.c_id=sc.c_id と c.c_id='01' のコース c を内部結合します。
 sc.s_score desc LIMIT 0,3) で並べ替える
すべて結合 
b.* を ( から選択
 学生stからst.s_id、st.s_name、c.c_id、c.c_name、sc.s_scoreを選択
 LEFT JOIN スコア sc ON sc.s_id=st.s_id
 c.c_id=sc.c_id と c.c_id='02' のコース c を内部結合します。
 sc.s_score desc LIMIT 0,3) b で並べ替え
すべて結合
c.* を ( から選択
 学生stからst.s_id、st.s_name、c.c_id、c.c_name、sc.s_scoreを選択
 LEFT JOIN スコア sc ON sc.s_id=st.s_id
 c.c_id=sc.c_id と c.c_id='03' のコース c を内部結合します。
 sc.s_score desc LIMIT 0,3) で並べ替え c

-- 26. 各コースを選択した学生の数を照会する select c.c_id,c.c_name,count(1) from course c 
LEFT JOIN スコア sc ON sc.c_id=c.c_id
学生 st を st.s_id=c.c_id に内部結合
st.s_id でグループ化

-- 27. 2つのコースのみを受講しているすべての学生の学生IDと名前を照会します。select st.s_id,st.s_name from student st 
LEFT JOIN スコア sc on sc.s_id=st.s_id
c.c_id=sc.c_id のコース c を内部結合します。 
count(1)=2のst.s_idでグループ化

-- 28. 男子と女子の数を問い合わせる select st.s_sex,count(1) from student st group by st.s_sex

-- 29. 名前に「风」という単語が含まれる学生情報を照会します。 select st.* from student st where st.s_name like "%风%";

-- 30. 同じ名前と性別の学生のリストを照会し、同じ名前の人数を数えます。 select st.*,count(1) from student st group by st.s_name,st.s_sex having count(1)>1

-- 31. 1990 年に生まれた学生のリストを照会します。select st.* from student st where st.s_birth like "1990%";

-- 32. 各コースの平均スコアを照会します。結果は平均スコアの降順でソートされます。平均スコアが同じ場合は、コース番号の昇順でソートされます。 select c.c_id,c.c_name,avg(sc.s_score) from course c
sc.c_id=c.c_id の内部結合スコア sc 
c.c_id でグループ化、avg(sc.s_score) で並べ替え、c.c_id を昇順で並べ替え

-- 33. 平均スコアが85以上のすべての学生の学生ID、名前、平均スコアを照会します。select st.s_id,st.s_name,avg(sc.s_score) from student st
LEFT JOIN スコア sc on sc.s_id=st.s_id
st.s_id でグループ化し、avg(sc.s_score)>=85 とする

-- 34. コース名が「数学」で、スコアが60未満の学生の名前とスコアを照会します。 select st.s_id,st.s_name,sc.s_score from student st
sc.s_id=st.s_id かつ sc.s_score<60 の場合の内部結合スコア sc
コース c を c.c_id=sc.c_id および c.c_name ="Mathematics" で内部結合します。 

-- 35. すべての学生のコースと成績を確認します。
学生stからst.s_id、st.s_name、c.c_name、sc.s_scoreを選択
LEFT JOIN スコア sc ON sc.s_id=st.s_id
c.c_id =sc.c_id のコース c に左結合
st.s_id、c.c_name で並べ替え

-- 36. スコアが 70 を超えるコースの名前、コース名、スコアを照会します。select st2.s_id,st2.s_name,c2.c_name,sc2.s_score from student st2
LEFT JOIN スコア sc2 on sc2.s_id=st2.s_id
c2.c_id=sc2.c_id のコース c2 に左結合 
ここで、st2.s_idは(
学生stからst.s_idを選択 
LEFT JOIN スコア sc ON sc.s_id=st.s_id 
min(sc.s_score)>=70 を持つ st.s_id でグループ化
s_id で並べ替え

-- 37. 不合格コースを照会する select st.s_id,c.c_name,st.s_name,sc.s_score from student st
sc.s_id=st.s_id かつ sc.s_score<60 の場合の内部結合スコア sc
c.c_id=sc.c_id のコース c を内部結合します。 

-- 38. コース番号が01で、コーススコアが80点を超える学生の学生IDと名前を照会します。 select st.s_id,st.s_name,sc.s_score from student st
sc.s_id=st.s_id かつ sc.c_id="01" かつ sc.s_score>=80 の内部結合スコア sc

-- 39. 各コースの学生数を調べる コースcからc.c_id、c.c_name、count(1)を選択する
sc.c_id=c.c_id の内部結合スコア sc
c.c_id でグループ化

-- 40. 教師「張三」が教えるコースを選択した学生の中で最高得点の学生の情報とその得点を照会します。学生stからst.*、c.c_name、sc.s_score、t.t_nameを選択します。
sc.s_id=st.s_id の内部結合スコア sc
c.c_id=sc.c_id のコース c を内部結合します。 
教師 t を t.t_id=c.t_id および t.t_name="张三" に内部結合します。
sc.s_score 降順で並べ替え
制限 0,1

-- 41. 異なるコースで同じスコアを持つ学生の学生ID、コースID、学生スコアを照会します。 select st.s_id,st.s_name,sc.c_id,sc.s_score from student st 
LEFT JOIN スコア sc on sc.s_id=st.s_id
c.c_id=sc.c_id のコース c に左結合
どこ (
学生st2からcount(1)を選択 
LEFT JOIN スコア sc2 on sc2.s_id=st2.s_id
c2.c_id=sc2.c_id のコース c2 に左結合
ここで、sc.s_score=sc2.s_score、c.c_id!=c2.c_id 
)>1

-- 42. 各科目で最高得点を獲得した上位2名の生徒を照会します。select a.* from (select st.s_id,st.s_name,c.c_name,sc.s_score from student st
LEFT JOIN スコア sc ON sc.s_id=st.s_id
コース c を c.c_id=sc.c_id および c.c_id="01" で内部結合します。
sc.s_score desc limit 0,2 で並べ替える
すべて結合
b.* を選択 (学生 st から st.s_id、st.s_name、c.c_name、sc.s_score を選択)
LEFT JOIN スコア sc ON sc.s_id=st.s_id
コース c を c.c_id=sc.c_id および c.c_id="02" で内部結合します。
sc.s_score で並べ替え desc limit 0,2) b
すべて結合
c.* を選択 (学生 st から st.s_id、st.s_name、c.c_name、sc.s_score を選択)
LEFT JOIN スコア sc ON sc.s_id=st.s_id
コース c を c.c_id=sc.c_id および c.c_id="03" で内部結合します。
sc.s_score で並べ替え desc limit 0,2) c
 
-- 参考(より正確で美しい):
 スコアaからa.s_id、a.c_id、a.s_scoreを選択
 where (select COUNT(1) from score b where b.c_id=a.c_id and b.s_score>=a.s_score)<=2 order by a.c_id

-- 43. 各コースを受講している学生の数を数えます(5 名を超える学生がいるコースのみをカウントします)。コース番号とコースを受講している学生数を出力する必要があり、クエリ結果は学生数の降順でソートされます。
-- 学生数が同じ場合は、コース番号の昇順でソートする select sc.c_id,count(1) from score sc
c.c_id=sc.c_id のコース c に左結合
count(1)>5を持つc.c_idでグループ化する
count(1) desc、sc.c_id asc で並び替え

-- 44. 少なくとも2つのコースを受講した学生の学生IDを取得します。 select st.s_id from student st 
LEFT JOIN スコア sc ON sc.s_id=st.s_id
count(1)>=2のst.s_idでグループ化

-- 45. すべてのコースを受講した学生の情報を照会する 学生stからst.*を選択する 
LEFT JOIN スコア sc ON sc.s_id=st.s_id
count(1)=(もちろんcount(1)を選択)を持つst.s_idでグループ化

-- 46. 各生徒の年齢を照会する select st.*,timestampdiff(year,st.s_birth,now()) from student st

-- 47. 今週誕生日を迎える生徒を照会する -- ここで問題があるかもしれません。week 関数は、現在の年の週番号を取得します。2017-12-12 は 50 週目、2018-12-12 は 49 週目です。月、日、曜日 (%w) を取得できます。
 -- それで今週が来月に続くかどうか判断する。面倒すぎる。select st.* from student stの書き方が分からない。 
ここで、week(now())=week(date_format(st.s_birth,'%Y%m%d'))

-- 48. 来週誕生日の生徒を検索するには、生徒のstからst.*を選択します。 
ここで、week(now())+1=week(date_format(st.s_birth,'%Y%m%d'))

-- 49. 今月誕生日の生徒を検索するには、生徒のstからst.*を選択します。 
ここで、month(now())=month(date_format(st.s_birth,'%Y%m%d'))

-- 50. 来月誕生日の生徒を照会する -- 注: 現在の月が 12 の場合、month(now())+1 を使用して 1 ではなく 13 を取得します。timestampadd() 関数または mod を使用して、生徒 st から st.* を選択できます。 
ここで、month(timestampadd(month,1,now()))=month(date_format(st.s_birth,'%Y%m%d'))
-- または、(month(now()) + 1) mod 12 = month(date_format(st.s_birth,'%Y%m%d')) となる Student st から st.* を選択します。

これで、Mysql Sql ステートメント演習 (50 問) に関するこの記事は終了です。関連するその他の Mysql 演習については、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • 最も完全な 50 の MySQL データベース クエリ演習

<<:  Nginxはhttpリクエスト実装プロセス分析を処理する

>>:  HTML テーブル マークアップ チュートリアル (9): セル間隔属性 CELLSPACING

推薦する

nginxプロセスロックの実装の詳細な説明

目次1. nginxプロセスロックの役割2. エントリーレベルのロックの使用3. nginxプロセス...

JavaScript 配列の重複排除とフラット化関数の紹介

目次1. 配列の平坦化(配列の次元削減とも呼ばれる)方法1: 削減メソッドを使用する方法2: スタッ...

知らないかもしれないLinuxのファイル権限管理方法

なぜ権限管理が必要なのでしょうか? 1. コンピュータ リソースは限られているため、コンピュータ リ...

CSS セレクタのグループ化の簡単な分析

セレクタのグループ化h2 要素と段落の両方を灰色にしたいとします。これを行う最も簡単な方法は、次のス...

MySQL 8.0.21.0 コミュニティ エディションのインストール チュートリアル (詳細な図解)

1. MySQLをダウンロードするMySQL 公式 Web サイトにログインし、MSI インストー...

計算機機能を実装するミニプログラム

この記事の例では、計算機機能を実装するためのミニプログラムの具体的なコードを参考までに共有しています...

SQL 挿入文の書き方の説明

方法 1: INSERT INTO t1(field1,field2) VALUE(v001,v00...

4種類のMySQL接続とマルチテーブルクエリの詳細な説明

目次MySQL 内部結合、左結合、右結合、外部結合、複数テーブルクエリビルド環境: 1. 内なる慈恩...

MySql5.7.18 の文字セット構成の詳細なグラフィック説明

背景:かなり前(2017.6.5、記事にはタイムリーさがあり、特に使用されているツールは頻繁に更新さ...

ウェブページをデザインするには?ウェブページを作成するには?

Web デザインの理解に関しては、多くの人がまだ Web ページ制作のレベルにとどまっているようで...

MySQL バッチ挿入とユニークインデックスの問題に対する解決策

MySQL バッチ挿入の問題プロジェクトを開発しているときに、古いシステムの基本データを事前にインポ...

Node.js で Bash スクリプトを書くための究極のソリューション

目次序文zxライブラリ$`コマンド` CD()フェッチ()質問()寝る()スローしない()チョークフ...

Webデザインにおけるフォームデザインテクニックのまとめ

「脳が多数の領域間の関係を処理できるように、入力は論理的なグループに分割する必要があります。」 – ...

JavaScript の new 演算子の原理と例の詳細な説明

新しい用途new の機能は、コンストラクターを通じてインスタンス オブジェクトを作成することです。イ...

Vueプロジェクトウォッチで関数が繰り返しトリガーされる問題の解決

目次問題の説明:解決策1解決策2問題の説明:ページ A と B の 2 つがあり、各ページにはget...