以下這篇帖子,就當是sql語句練習,適合入門新手,練練這些sql語句,也有處於打牢數據庫的基礎。
前期的准備工作,給出三張表,student,course,sc,我們可以清楚的看到每張表的主鍵,以及表與表之間的字段聯系
打開每張表,可以看到具體的字段信息:
以上就是三張表,至於怎么創建,有兩種方法,要么你自己寫sql語句自己創建,並插入一些數據,要么你就直接手動在表格里添加,然后點擊Refresh
CREATE TABLE `student` ( `Sno` char(10) NOT NULL, `Sname` varchar(20) NOT NULL, `Ssex` char(5) DEFAULT NULL, `Sage` tinyint(4) DEFAULT NULL, `Sdept` varchar(20) DEFAULT NULL, PRIMARY KEY (`Sno`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8
CREATE TABLE `course` ( `Cno` char(10) NOT NULL, `Cname` varchar(20) NOT NULL, `Credit` tinyint(4) DEFAULT NULL, `Semester` tinyint(4) DEFAULT NULL, PRIMARY KEY (`Cno`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8
CREATE TABLE `sc` ( `Sno` char(10) NOT NULL, `Cno` char(6) NOT NULL, `Grade` tinyint(4) DEFAULT NULL, PRIMARY KEY (`Sno`,`Cno`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8
單表查詢
一、帶*號
查詢全體學生的詳細記錄
二、帶計算、as列名
查詢全體學生的姓名以及出生年份
三、去重distinct
查詢學生的學號(去掉重復)
四、where條件查詢
1.比大小(> < >= !=等相關大小符號)
①查詢計算機系所有學生的姓名
②查詢所有年齡在20歲以下的學生姓名以及年齡
③查詢考試成績有不及格課程的學生的學號
2.確定范圍(between and)
①查詢年齡在20~23歲的學生的姓名、所在系和年齡
②查詢年齡不在20~23歲的學生的姓名、所在系和年齡
③對於日期類型的基數,也可以使用:select id ,type from titles where pubdate between '2014/7/17' and '2014/12/15'
3.確定集合((常量1,常量2,常量3......))
①查詢信息管理系、通信工程系和計算機系學生的姓名和性別
②查詢信息管理系、通信工程系和計算機系三個系之外的其他系的學生的姓名和性別
4.字符串匹配(like)
①查詢姓'張'的學生的詳細信息
②查詢姓'張'、姓'李'、姓'劉'的學生的詳細信息
③查詢名字的第2個字為'小'或者'大'的學生的姓名和學號
④查詢所有不姓'劉'的學生姓名
⑤在student表中,查詢學號的最后一位不是2、3、5的學生的詳細信息
5.空值查詢
①查詢沒有考試的學生的學號和相應的課程號
②查詢所有已經考試了的學生的學號、課程號和考試成績
6.多重條件查詢
①查詢計算機系年齡20歲以下的學生和姓名
②查詢計算機系和信息管理系學生中年齡在18~20的學生的學號、姓名、所在系和年齡
五、排序(desc降序 和 asc升序)
①將學生按照年齡升序排列
②查詢選修了'C002'課程的學生的學號以及成績,查詢結果按照成績降序排列
③查詢全體學生的信息,查詢結果按所在的系名升序排列,同一個系的學生按照年齡降序排列
六、聚合函數匯總數據(count sum avg max min等)
①統計學生總人數
②統計選了課程的學生人數
③統計學號為'0811101'的學生的考試總成績
④統計'0831103'的學生的考試平均成績
⑤查詢'C001'課程考試成績的最高分和最低分
七、分組(group by 和 having)
1.group by
①統計每門課程的選課人數,列出課程號和選課人數
②統計每個學生的選課門數和平均成績
③統計每個系的學生人數和平均年齡
④統計每個系的女生人數
⑤統計每個系的男生人數和女生人數以及男生的最大年齡和女生的最大年齡,結果按照系名升序排列
2.HAVING
①查詢選課門數超過3門的學生的學號和選課門數
②查詢計算機系和信息管理系每個系的學生人數
③查詢每個系年齡小於等於20的學生人數
接下來,把所有最基礎的單表查詢的結果,放出來,供有需要的同學借鑒使用
-- 查詢全體學生的詳細記錄 SELECT* FROM student /* 二、帶計算、as列名 */ -- 查詢全體學生的姓名以及出生年份 SELECT Sname AS 姓名,2020 - Sage AS 出生年份 FROM student /* 三、去重distinct */ -- 查詢學生的學號(去掉重復) SELECT DISTINCT Sno FROM sc /* 四、where條件查詢 */ -- 查詢計算機系所有學生的姓名 SELECT Sname FROM student WHERE Sdept = '計算機系' -- 查詢所有年齡在20歲以下的學生姓名以及年齡 SELECT Sname,Sage FROM student WHERE Sage < 20 -- 查詢考試成績有不及格課程的學生的學號 SELECT DISTINCT Sno FROM sc WHERE grade < 60 -- 查詢年齡在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 -- 查詢信息管理系、通信工程系和計算機系學生的姓名和性別 SELECT Sname,Ssex FROM student WHERE sdept IN ('信息管理系','通信工程系','計算機系') -- 查詢信息管理系、通信工程系和計算機系三個系之外的其他系的學生的姓名和性別 SELECT Sname,Ssex FROM student WHERE sdept NOT IN ('信息管理系','通信工程系','計算機系') -- 查詢姓'張'的學生的詳細信息 SELECT * FROM student WHERE Sname LIKE '張%' -- 查詢姓'張'、姓'李'、姓'劉'的學生的詳細信息 SELECT * FROM student WHERE Sname LIKE '[張李劉]%' -- 查詢名字的第2個字為'小'或者'大'的學生的姓名和學號 SELECT Sname,Sno FROM student WHERE Sname LIKE '_[小大]%' -- 查詢所有不姓'劉'的學生姓名 SELECT Sname FROM student WHERE Sname NOT LIKE '劉%' -- 在student表中,查詢學號的最后一位不是2、3、5的學生的詳細信息 SELECT* FROM student WHERE Sno LIKE '%[^235]' -- 查詢沒有考試的學生的學號和相應的課程號 SELECT Sno,Cno FROM sc WHERE Grade IS NULL -- 查詢所有已經考試了的學生的學號、課程號和考試成績 SELECT Sno,Cno FROM sc WHERE Grade IS NOT NULL -- 查詢計算機系年齡20歲以下的學生和姓名 SELECT Sname,Sage FROM student WHERE sdept IN ('計算機系') AND Sage < 20 -- 查詢計算機系和信息管理系學生中年齡在18~20的學生的學號、姓名、所在系和年齡 SELECT Sno,Sname,Sdept,Sage FROM student WHERE sdept IN ('計算機系','信息管理系') AND Sage BETWEEN 18 AND 20 /* 五、排序(desc降序 和 asc升序) */ -- 如果沒有指定升序還是降序,那么默認為升序asc SELECT * FROM student ORDER BY Sage -- 以下是按年齡降序 SELECT * FROM student ORDER BY Sage DESC -- 查詢選修了'C002'課程的學生的學號以及成績,查詢結果按照成績降序排 SELECT Sno,Grade FROM sc WHERE Cno = 'C002'ORDER BY Grade DESC -- 查詢全體學生的信息,查詢結果按所在的系名升序排列,同一個系的學生按照年齡降序排列 -- 下面這種是錯誤寫法 SELECT * FROM student ORDER BY Sdept ASC AND ORDER BY Sage DESC (錯誤!!!) -- 正確寫法如下: SELECT * FROM student ORDER BY Sdept ASC, Sage DESC /* 六、聚合函數匯總數據(count sum avg max min等) */ -- 統計學生總人數 SELECT COUNT(*) AS 學生總人數 FROM student -- 統計選了課程的學生人數 SELECT COUNT(DISTINCT Sno) AS 已選課程的學生人數 FROM sc -- 這里要注意,因為一個學生可以選擇多門課程,所以要去重 -- 統計學號為'0811101'的學生的考試總成績 SELECT SUM(Grade) AS 總成績 FROM sc WHERE Sno = '0811101' -- 統計'0831103'的學生的考試平均成績 SELECT AVG(Grade) AS 平均成績 FROM sc WHERE Sno = '0831103' -- 查詢'C001'課程考試成績的最高分和最低分 SELECT MAX(Grade) 最高分,MIN(Grade) 最低分 FROM sc WHERE Cno = 'C001' -- 此時要不要AS 無所謂,要也行,不要也行 /* 七、分組(group by 和 having) */ -- 統計每門課程的選課人數,列出課程號和選課人數 SELECT COUNT(Sno) AS 選課人數,Cno AS 課程號 FROM sc GROUP BY Cno SELECT COUNT(*) AS 選課人數,Cno AS 課程號 FROM sc GROUP BY Cno -- 統計每個學生的選課門數和平均成績 SELECT COUNT(*) AS 選課門數,AVG(Grade) AS 平均成績,Sno AS 學號 FROM sc GROUP BY Sno -- 統計每個系的學生人數和平均年齡 SELECT COUNT(*) 學生人數 ,AVG(Sage) AS 平均年齡, Sdept AS 院系 FROM student GROUP BY sdept -- 統計每個系的女生人數 SELECT COUNT(*) 女生人數,sdept AS 院系 FROM student WHERE Ssex = '女' GROUP BY sdept -- 統計每個系的男生人數和女生人數以及男生的最大年齡和女生的最大年齡,結果按照系名升序排列 SELECT Sdept, COUNT(*) 人數,Ssex,MAX(Sage) 最大年齡 FROM student GROUP BY Sdept,Ssex ORDER BY Sdept -- 查詢選課門數超過3門的學生的學號和選課門數 SELECT Sno,COUNT(*) 選課門數 FROM sc GROUP BY Sno HAVING COUNT(*) > 3 -- 查詢計算機系和信息管理系每個系的學生人數 -- 思路:先找出兩個系的所有人數,再根據院系進行分組 SELECT Sdept, COUNT(*) 學生人數 FROM student WHERE Sdept IN ('計算機系','信息管理系') GROUP BY Sdept -- 查詢每個系年齡小於等於20的學生人數 SELECT Sdept,COUNT(*)學生人數 FROM student WHERE Sage <= 20 GROUP BY Sdept