iT邦幫忙

0

剛接觸SQL 有個問題關於多表單查詢

  • 分享至 

  • xImage

table:student
s_no(學號) |s_name(名字) |s_age(年紀)
------------- | -------------
A1 | JOHN | 16
A2 | JOE | 16
A3 | TONY | 17

table name:subjects
s_no(學號) |subject(科目) |score(分數)
------------- | -------------
A1 | Math | 58
A1 | History | 70
A2 | English | 49
A2 | History | 90
A3 | Math | 35
A3 | English | 77

要求是 查詢出JOE的名字、年紀、及格科目
試著寫了

SELECT student.s_name,student.s_age,subjects.subject
FROM student,subjects
WHERE student.s_no='A2'AND subjects.score>='60';

而顯示出的結果是這樣
s_name(名字) |s_age(年紀)|subject(科目)
------------- | -------------
JOE |16 |History
JOE |16| History
JOE |16| English
不知道是哪邊語法出錯了 請各位不吝指教


感謝回答 另外再問一個問題
如果要將JOHN的數學改成及格 我的寫法是

update subjects set score='60' where s_no='A1' and subject='Math'

有個疑惑的地方就是 如果只有一個表單 是否可以直接寫 欄位名稱 還是都要 表單名稱.欄位名稱 請各位不吝指教

archer9080 iT邦研究生 3 級 ‧ 2020-08-03 15:09:47 檢舉
(1)更新問題不會有通知,尤其有最佳解答之後大多不會有人再點進來查看,所以盡量以新的文章進行敘述及提問,呈上題之類的提問還蠻多的可以翻一翻

(2)針對""要將JOHN的數學改成及格""跟""要將A1的數學改成及格""這兩個題目來說其實是不一樣的,只是我們主觀知道subjects 的 s_no分別代表的是誰

(3)初步看起來的確是能將subjects 屬於 JOHN ( A1 )的Math score 更新成60應該是沒錯的

(4)如果只有一個資料表 可以直接寫 欄位名稱
briton iT邦新手 5 級 ‧ 2020-08-03 16:11:47 檢舉
了解 感謝你的告知
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
2
暐翰
iT邦大師 1 級 ‧ 2020-08-03 13:17:14
最佳解答

xxx
如上圖 cross join 沒有加上關聯欄位 的原因,改成以下sql就可以

select student.s_name,student.s_age,subjects.subject
from subjects 
left join student  on subjects.s_no = student.s_no
where subjects.s_no='A2' and subjects.score>='60'

demo | db<>fiddle

image-20200803131726933

有student才會有成績,因此

from student left join subjects

會不會比較好一點?

暐翰 iT邦大師 1 級 ‧ 2020-08-04 11:17:05 檢舉

paicheng0111 個人建議left join用在 明細 left join 主表,不建議用在主表 left join 明細

1
code
iT邦新手 5 級 ‧ 2020-08-03 12:45:35

這兩個table的共同點,寫在where裡面試試

2
archer9080
iT邦研究生 3 級 ‧ 2020-08-03 14:03:16

先看你寫的SQL

/*查詢 table:student的s_name、table:student的s_age、table:subjects的subject*/
SELECT student.s_name,student.s_age,subjects.subject
/*從table:student和table:subjects*/
FROM student,subjects
/*當table:student的s_no是A2,並且table:subjects的score大於等於60*/
WHERE student.s_no='A2'AND subjects.score>='60';

SQL會從限制開始找尋
WHERE student.s_no='A2'AND subjects.score>='60';
滿足上面這些限制的有
table:student

s_no(學號) s_name(名字) s_age(年紀)
A2 JOE 16

以及
table:subjects

s_no(學號) subject(科目) score(分數)
A1 History 70
A2 History 90
A3 English 77

依照滿足的部分再往您的select去看
SELECT student.s_name,student.s_age,subjects.subject
理所當然會得出這個結果

s_name(名字) s_age(年紀) subject(科目)
JOE 16 History
JOE 16 History
JOE 16 English

再看回來您原本想得出結果的問題

要求是 查詢出JOE的名字、年紀、及格科目

題目的限制是人員是JOE以及JOE的及格科目
table:subjects裡面並沒有人員的名字
人員的名字(s_name)是記錄在table:student
兩個有共通的地方是在學號(s_no)
於是要先告訴它

student.s_no = subjects.s_no

這樣才能知道student的A2是subjects的A2

然後要求s_name是JOE,而JOE所在的表格是table:student
因此

student.s_name='JOE'

最後才是及格科目

subjects.subject >= '60'

整個where就完成了

WHERE student.s_no = subjects.s_no AND student.s_name='JOE' AND  subjects.subject >= '60'

如果回答或理解有誤,再麻煩前輩們輕鞭:D

我要發表回答

立即登入回答