1. 程式人生 > >mysql三表查詢以及多表查詢註釋講解

mysql三表查詢以及多表查詢註釋講解

搞懂下面的學生成績查詢例子,基本可以滿足百分之九十的資料庫查詢需求。以下程式碼都是本人經過親自運營測試釋出的,請放心直接拷貝執行

有三張表
1,stu欄位有id,name,gender,class_id
2,kecheng欄位有id,kecheng_name
3,stu_kecheng欄位有id,stu_id,kecheng_id,得分 

例圖


根據上述提示完成以下查詢:


1,查詢選修了的MySQL的學生姓名;
2,查詢張三同學選修了的課程名字;
3,查詢只選修了1門課程的學生學號和姓名
4,查詢選修了至少3門課的學生資訊
5,查詢選修了所有課程的學生
6,查詢選修了課程的總人數 
7,查詢所學課程至少有一門跟張三所  學課程相同的學生資訊
8,查詢兩門及兩門以上不及格同學 的平均分

查詢之前如果對三個表的對應資訊沒有任何理解可以先使用多表連線查詢下這三個表都是對應著什麼資料

select * from stu as s inner join stu_kecheng as k on stu_id=s.id  inner join kecheng as sk on sk.id=k.kecheng_id;  // 三表的完整資料來源 

1,查詢選修了的MySQL的學生姓名

select name from stu as c 
    inner join stu_kecheng as s on c.id=s.id 
   inner join kecheng as k on k.id= s.id
   where k.kecheng_name='mysql';
 // 第一種方法使用連線查詢 連線三個表查詢

select name from stu where id in(
   select stu_id from stu_kecheng where kecheng_id=(
     select id from kecheng where kecheng_name='mysql'  
       )  
    ); 
// 第二種方法 用子查詢方法查詢出三個表中需要的內容 

2,查詢張三同學選修了的課程名字 

select kecheng_name from kecheng where id in(
    select kecheng_id from stu_kecheng where stu_id=(
        select id from stu where name='張三'
        )
    ); // 第一種方法  使用子查詢方式查詢

select kecheng_name from kecheng as k inner join stu_kecheng as s on k.id=s.kecheng_id inner join stu as st on st.id=s.stu_id where st.name='張三'; 
// 第二種方法 使用多表連線查詢 


3,查詢只選修了1門課程的學生學號和姓名

select st.id,st.name from kecheng as k inner join stu_kecheng as s on k.id=s.kecheng_id inner join stu as st on st.id=s.stu_id group by kecheng_name having count(kecheng_name)=1; // 第一種方法 使用連線查詢

select id,name from stu where id in( 
    select stu_id from stu_kecheng group by stu_id having count(kecheng_id)=1
    ); 
// 第二種方法 ,使用子查詢連線方式查詢


4,查詢選修了至少3門課的學生資訊

select * from stu where id in(
    select stu_id from stu_kecheng group by stu_id having count(*)>=3
    ); 
 // 第一種方法,子查詢方式查詢(group by 如果是kecheng_id 則會根據課程id分類 並不會查出課程的數量 group by 學生id)

select * from stu as s inner join 
stu_kecheng as k on stu_id=s.id  inner join
kecheng as sk on sk.id=k.kecheng_id group by stu_id having count(*)>=3;  
// 第二種方法,多表連線方式查詢

5,查詢選修了所有課程的學生(同題4)

6,查詢選修了課程的總人數 

select count(*) from (
    select id from stu_kecheng group by stu_id
    ) as y; (僅僅是單表即可完成的任務 只不過是需要在原有表上進行加工 讓查詢出來的資料作為資料來源再進行查詢並進行簡單計算,不必想太多 select作為一個數據源(單表)的時候 不要忘了在後面加上 as ‘起名’ 不然容易報錯)// 使用的子查詢 

7,查詢所學課程至少有一門跟張三所學課程相同的學生資訊(稍有難度的查詢)

select * from stu where id in( //直接從學生表中查詢學生的資訊
    select stu_id from stu_kecheng where kecheng_id in( //第三層 從學生課程表中查出這些對應的學生的學號(學生id是多少)
        select kecheng_id from stu_kecheng where stu_id=( // 第二層從課程表中查出與張三選擇一樣課程的 課程id
            select id from stu where name='張三' // 第一層 查出學生表中張三對應的學號是多少
            )
        )
    ); // 倒著向上推
    

【select kecheng_name from kecheng where id in(select kecheng_id from stu_kecheng where stu_id=(select id from stu where name='張三')); 
// 此處的where後的where不可用'='號篩選條件,因為id的篩選值可能是多個,所以要用in來篩選 出來的多個值】

8,查詢兩門及兩門以上不及格同學的平均分   

  select avg(score) from stu_kecheng where score<80 group by stu_id having count(stu_id)>=2;  // 兩門以上不合格可在where處直接篩選,然後用stu_id分組之後直接對不合格的同學把score進行平均值處理

第一篇博文,文中若有錯誤,歡迎指正!