數據庫系統:(需要強調學習的知識點)
1. 當完整性約束條件涉及到該表的多個屬性列時,則必須定義在表級上;
比如:學生選課表中:
primary key(Sno,Cno) //主碼由兩個屬性構成,必須作為表級完整性定義
foreign key(Sno) references Student(Sno)
foreign key(Cno) references Student(Cno)
2. 修改原有的列定義
lter table 表名 alter column 列名 數據類型
其子句用來,包括修改列名和數據類型
3. 完整的數據查詢語句:
select [all || distinct ] <目標列表達式>
from 表名
where 條件表達式
group by <列名1> having <條件表達式>
order by <列名2>[all || distinct]
(1)根據where 子句的條件表達式從from指定的基本表中找到滿足條件的元組,再按select 子句中的目標列表達式選出元組中的屬性值形成結果表
(2) 若有group by子句,則將結果按<列名1>的值進行分組,該屬性列值相等的元組為一個組,通常每組會作用聚集函數;若帶有having 子句,只有滿足指定條件的組才輸出
(3)若有order by子句,則結果還要按列名2的值的升序(asc)或降序(desc)排序,默認升序排列
order by子句一直放在最后
4. select 子句中的<目標列表達式>不僅可以是表中的屬性列,也可以是表達式
表達式可以是算術表達式,字符串常量,函數等
可以通過指定別名來改變查詢結果的列標題(將原屬性名和別名放在一起,以空格隔開),各個列標題以逗號隔開
where子句常用的查詢條件:
比較: = > >= < <= != <> !> !<
確定范圍: between and 和 not between and
確定集合: in 和 not in
字符匹配: like 和 not like (匹配串用單引號括起來,%代表任意長度,_ 代表任意單個字符)
空值: is null 和 is not null
多重條件: and or ( and優先級大于or)
5. 聚集函數
count(*) 統計元組的個數
count([all || distinct] <列名> ) 統計一列中值的個數
sum/ avg / max/ min([all || distinct] <列名>) 針對一列值
查詢選修了課程的學生人數
select count(distinct Sno)//一個學生可能會選修多門課程
from SC
聚集函數只用于select 子句 和 group by 中的having 子句
6. group by子句
可以將查詢結果按一列或多列的值分組,值相等的為一組;
分組的目的是細化聚集函數的作用對象,分組后的聚集函數將作用于每一個組,即每一個組都有一個函數值
若分組后還要求按一定條件對這些組進行篩選,利用having指定篩選條件
比如:查詢了3門以上課程的學生學號
select Sno
from SC
group by Sno
having count(*)>3
先用group by子句按Sno進行分組,再用聚集函數count對每一組計數,having給出選擇組的條件,只有元組個數>3的組才會被選出來
where子句作用于基本表或視圖,從中選擇滿足條件的元組;having短語作用于組,從中選擇滿足條件的組
7.連接查詢
多數是等值連接:
表名1 . 列名1 = 表名2 . 列名2
比如:
查詢學號為201251012選修課程的總學分數
select sum(Ccredit)
from SC,Cource
where Sno = '201251012' and SC.Cno = Course.Cno
8. 嵌套查詢
1. 帶in謂詞的子查詢
(1)查詢與“劉晨”在同一個系學習的學生
(1)確定“劉晨”所在的系的系名
(2)查詢此系的學生
select Sno,Sname,Sdept
from Student
where Sdept in (
select Sdept
from Student
where Sname = '劉晨'
)
此例子中的子查詢不依賴于夫查詢,稱為“不相關子查詢”
2. 帶比較運算符的子查詢(當子查詢的結果是單個值時)
(1)查詢每個學生超過他自己選修課程平均成績的課程號
select Sno,Cno
from SC x //x是SC的別名
where Grade >= (
select avg(Grade)
from SC y
where y.Sno = x.Sno
)
內層查詢是求一個學生所有選修課程平均成績的,至于是那個學生的平均成績要看參數x.Sno的值,而該值是與父查詢相關的,因此這類查詢稱為“相關子查詢”
3. 帶有any 或 all 謂詞的子查詢(當子查詢的結果是多值時)
使用any 或 all時必須同時使用比較運算符
>any 大于子查詢結果中的某個值(是大于結果集合中的min)>min
>all >max
<any <max
<all <min
查詢非計算機科學系中比計算機科學系任意一個學生年齡小的學生的學生姓名和年齡
select Sname , Sage
from Student
where Sage < any(
select Sage
from Student
where Sdept = 'CS'
)
and Sdept <> 'CS'
等價于
select Sname , Sage
from Student
where Sage < (
select max(Sage)
from Student
where Sdept = 'CS'
)
and Sdept <> 'CS'
9. 盡量使用連接查詢(以下2個非常典型的例子)
(1)查詢選修了課程名為“信息系統”的學生的學號和姓名
分析:
(1)學號和姓名放在Student表中,課程名放在Course表中,但Student和Course兩個表之間沒有直接聯系,必須通過SC表建立二者的關系
(2) 對于多個表中的屬性,要表明來自那個表,若是各個表特有的,就不必表明
(3) 一般將其橋梁作用的表放在中間
select Student.Sno , Sname
from Student,SC,Course
where Student.Sno = SC.Sno and SC.Cno = Course.Cno and Course.Cname = '信息系統'
(2)查詢既選修了課程1 又選修了課程2的學生。
select Sno
from SC
where Cno = '1' and Sno in (
select Sno
from SC
where Cno = '2'
)
//注意此處不是用Cno = '1' and Cno = '2',它表示只選修了課程1和課程2的,但除了這兩個外,還有可能選修了其他課程
//只是要求查詢選修了課程1的學生集合 和 選修了課程2的學生集合的交集
10. 數據更新
(1)插入數據 : insert into 表名(屬性列) values(屬性列對應的屬性值)
可以插入一個元組,也可以插入子查詢的結果(一次插入多個元組)
- 對于 into 子句中沒有出現的屬性列,新元組在這些列上取空值(系統自動賦予空值null)
- 若nto 子句中只指出了表名,新元組在表的所有屬性列上都有指定值,并且屬性列的次序與表中的次序相同
? 此時對于沒有指明屬性值的列,需要手動賦予空值null
(2)修改數據 : update 表名 set 列名= 表達式 where條件
既可以修改一個元組的值
若省略where子句,則表示要修改表中的所有元組
(3)刪除數據: delete from 表名 where條件
若省略where子句,則表示要刪除表中的所有元組,但表的定義仍在數據字典中,就是說僅僅刪除表中的數據
若想刪除數據庫對象,用drop table 表名
浙公網安備 33010602011771號