天天看點

例3.19到3.48

資料查詢

[例題3.19]

查詢全體學生的出生年份,可以以計算的方式:

SELECT Sname,2021-Ssage
FROM Student;
           
例3.19到3.48

[例題3.20]

在查詢中屬性列也可以是字元串,比如

SELECT Sname,'Year of birth:',2021-Ssage 
FROM Student;
           
例3.19到3.48

而且我們還可以在字元串後面添加屬性列的名稱

SELECT Sname,'Year of birth:'BIRTH,2021-Ssage BIRTHDAY
FROM Student;
           
例3.19到3.48

【例3.21】消除重複的行

首先比如查詢選了課的學生名單

SELECT Sno
FROM SC;
           
例3.19到3.48

有重複,如果想顯示不重複的學生名單則:

SELECT DISTINCT Sno
FROM SC;
           
例3.19到3.48

查詢時可以限制條件.比如:

【例3.22】查詢計科全體學生名單

SELECT Sname
FROM Student
WHERE Sdept='計科';
           
例3.19到3.48

還可以有很多的查詢條件限制比如:

【例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.19到3.48

通配符%代表任意長度的字元串

【例3.30】查詢姓狗的學生

select *
from Student
where Sname like'狗%';
           
例3.19到3.48

通配符_(下橫線)代表任意單個字元

【例3.31】查詢姓小且名字隻有兩個字的人

select *
from Student
where Sname like'小_';
           
例3.19到3.48

如果我們查3個字的,這樣打連兩個字的也會出現

select *
from Student
where Sname like'小__';
           
例3.19到3.48

那怎麼查隻有3個字的呢,可以這樣:

select *
from Student
where Sname like'小__' And Sname NOT LIKE '小_';
           
例3.19到3.48

如果查詢的字元串本身就包含%或者_,這時可以用escape’<換碼字元>‘短語進行通配符轉義了

【例3.34】查DB_Design課程的相關資訊

如果直接這樣查的話’_'就代表任意一個字元,并不能準确

select *
from Course
where Cname like'DB_Design';
           
例3.19到3.48

如果我們用換碼字元進行查詢的話就可以這樣

select*
from Course
where Cname like'DB\_Design'escape'\';
           

這樣就可以查到了

例3.19到3.48

【例3.36】涉及空值的查詢

例如查詢是否有成績的學生的資訊

select*
from SC
where Grade is NULL;
select*
from SC
where Grade is not NULL;
select*
from SC
where Grade = NULL;
           
例3.19到3.48

這裡我們不可用=代替is,如果用了=号結果就沒有顯示出來

【例3.38】查詢計科系20歲以下的學生姓名(and的使用)

select Sname
from Student
where Sage<20 and Sdept='CS';
           
例3.19到3.48

order by句子的使用:

使用者可以用order by字句對查詢結果按照一個或者多個屬性列的升序(ASC)或者降序(DESC)排列,預設值為升序

【例3.39】查詢選修了3号課程的學生的成績并按照降序排序

select Sno, Grade
from SC
where Cno='3 '
order by Grade DESC;
           
例3.19到3.48

聚集函數:

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;
           
例3.19到3.48

如果分組後還要進行條件篩選,則可以用having短語

【例3.47】查詢選修了2門課及以上的學生學号

select  Sno
from SC
group by Sno
having count(*)>=2;
           
例3.19到3.48

where子句與having子句的作用對象不同,where子句後面不可以接聚集函數而having可以接、

【例3.48】查詢平均成績大于等于90分的學生學号和平均成績

select Sno,avg(Grade)
from SC
where avg(Grade)>=90
group by Sno;
           

這樣的語句就是不對的,會出現錯誤

例3.19到3.48

這樣就可以了:

select Sno,avg(Grade)
from SC
group by Grade
having avg(Grade)>=90;
           
例3.19到3.48