資料查詢
[例題3.19]
查詢全體學生的出生年份,可以以計算的方式:
SELECT Sname,2021-Ssage
FROM Student;

[例題3.20]
在查詢中屬性列也可以是字元串,比如
SELECT Sname,'Year of birth:',2021-Ssage
FROM Student;
而且我們還可以在字元串後面添加屬性列的名稱
SELECT Sname,'Year of birth:'BIRTH,2021-Ssage BIRTHDAY
FROM Student;
【例3.21】消除重複的行
首先比如查詢選了課的學生名單
SELECT Sno
FROM SC;
有重複,如果想顯示不重複的學生名單則:
SELECT DISTINCT Sno
FROM SC;
查詢時可以限制條件.比如:
【例3.22】查詢計科全體學生名單
SELECT Sname
FROM Student
WHERE Sdept='計科';
還可以有很多的查詢條件限制比如:
【例3.23】查詢年齡20歲以下的學生姓名和年齡
SELECT Sname,Sage
FROM Student
WHERE Sage<20;
【例3.24】查詢成績不及格的
select distinct Sno
from SC
where Grade<60;
這裡distinct可以讓多次課程都不及格的學生隻顯示一次
【例3.25】between and 使用
select Sname,Sdept,Sage
from Student
where Sage between 20 and 23;
【例3.26】not between and
select Sname,Sdept,Sage
from Student
where Sage not between 20 and 23;
【例3.27】【例3.28】略
查詢也可以通過字元比對來查詢:
【例3.29】查詢學号為1001的學生情況
select *
from Student
where Sno like'1001';
通配符%代表任意長度的字元串
【例3.30】查詢姓狗的學生
select *
from Student
where Sname like'狗%';
通配符_(下橫線)代表任意單個字元
【例3.31】查詢姓小且名字隻有兩個字的人
select *
from Student
where Sname like'小_';
如果我們查3個字的,這樣打連兩個字的也會出現
select *
from Student
where Sname like'小__';
那怎麼查隻有3個字的呢,可以這樣:
select *
from Student
where Sname like'小__' And Sname NOT LIKE '小_';
如果查詢的字元串本身就包含%或者_,這時可以用escape’<換碼字元>‘短語進行通配符轉義了
【例3.34】查DB_Design課程的相關資訊
如果直接這樣查的話’_'就代表任意一個字元,并不能準确
select *
from Course
where Cname like'DB_Design';
如果我們用換碼字元進行查詢的話就可以這樣
select*
from Course
where Cname like'DB\_Design'escape'\';
這樣就可以查到了
【例3.36】涉及空值的查詢
例如查詢是否有成績的學生的資訊
select*
from SC
where Grade is NULL;
select*
from SC
where Grade is not NULL;
select*
from SC
where Grade = NULL;
這裡我們不可用=代替is,如果用了=号結果就沒有顯示出來
【例3.38】查詢計科系20歲以下的學生姓名(and的使用)
select Sname
from Student
where Sage<20 and Sdept='CS';
order by句子的使用:
使用者可以用order by字句對查詢結果按照一個或者多個屬性列的升序(ASC)或者降序(DESC)排列,預設值為升序
【例3.39】查詢選修了3号課程的學生的成績并按照降序排序
select Sno, Grade
from SC
where Cno='3 '
order by Grade DESC;
聚集函數:
count(*):統計元組個數
count([distinct|all]<列名>):統計一組中值的個數
sum([distinct|all]<列名>):計算一列值的總和(此列必須為數值型)
avg([distinct|all]<列名>):計算一列值的平均值(此列必須為數值型)
max([distinct|all]<列名>):求一列中最大值
min([distinct|all]<列名>):求一列中最小值
【例3.41】查學生總人數
select count(*)
from Student;
【例3.42】查詢選修了的學生人數
select count(distinct Sno)
from SC;
【例3.43】查詢選修了一号課程的學生的平均成績
select avg(grade)
from SC
where Cno='1';
【例3.44】查詢選修了一号課的學生的最高分
select max(grade)
from SC
where Cno='1';
【例3.45】查詢學生1001選修課程的總分
selest sum(grade)
from SC Course
where Sno='1001' and SC.Cno=Course.Cno;
group by子句:該子句将查詢結果按某一列或多列的值進行分組,值相等的為一組。
【例3.46】求各個課程号及相應的選課人數
select Cno,Count(Cno)renshu
from SC
group by Cno;
如果分組後還要進行條件篩選,則可以用having短語
【例3.47】查詢選修了2門課及以上的學生學号
select Sno
from SC
group by Sno
having count(*)>=2;
where子句與having子句的作用對象不同,where子句後面不可以接聚集函數而having可以接、
【例3.48】查詢平均成績大于等于90分的學生學号和平均成績
select Sno,avg(Grade)
from SC
where avg(Grade)>=90
group by Sno;
這樣的語句就是不對的,會出現錯誤
這樣就可以了:
select Sno,avg(Grade)
from SC
group by Grade
having avg(Grade)>=90;