選擇題會(huì)考:
1.數(shù)據(jù)查詢:
SELECT:用于選擇需要查詢的列和行。
FROM:用于指定要查詢的表。
WHERE:用于指定查詢條件。
GROUP BY:用于按照指定的列對(duì)結(jié)果進(jìn)行分組。
HAVING:用于指定分組條件。
ORDER BY:用于指定查詢結(jié)果的排序方式。
2.數(shù)據(jù)操縱:
INSERT INTO:用于將數(shù)據(jù)插入表中。
UPDATE:用于更新表中的數(shù)據(jù)。
DELETE FROM:用于刪除表中的數(shù)據(jù)。
3.數(shù)據(jù)定義:
CREATE TABLE:用于創(chuàng)建新表。
ALTER TABLE:用于修改現(xiàn)有表的結(jié)構(gòu)。
DROP TABLE:用于刪除表。
4.數(shù)據(jù)控制:
GRANT:用于向用戶或用戶組授予特定的數(shù)據(jù)庫權(quán)限。
REVOKE:用于撤銷已授予的數(shù)據(jù)庫權(quán)限。
3.1SQL概述
SQL語句特點(diǎn):
3.3數(shù)據(jù)定義
建立三個(gè)表
1. 建立學(xué)生表Student
create table Student
(
Sno char(9) primary key,
Sname char(20) unique,
Ssex char(2),
Sage smallint,
Sdept char(20)
);
2. 建立一個(gè)課程表Course
create table Course
(
Cno char(4) primary key,
Cname char(40) not null,
Cpno char(4),
Ccredit smallint,
foreign key (Cpno) references Course (Cno)
);
3. 創(chuàng)建一個(gè)SC表
create table SC
(
Sno char(9),
Cno char(9),
Grade smallint,
primary key (Sno,Cno),
foreign key (Sno) references Student(Sno),
foreign key (Cno) references Course(Cno)
);
3.4數(shù)據(jù)查詢
一般格式:select [all或distinct]<目標(biāo)列表達(dá)式>[,<目標(biāo)列表達(dá)式>]...
from<表名字或視圖名>[,<表名或視圖名...>]或(<select 語句>)[as]<別名>
[where<條件表達(dá)式>]
[group by<列名1>[having <條件表達(dá)式>]]
[order by<列名2>[asc或desc]];
例一:查詢?nèi)w學(xué)生的學(xué)號(hào)與姓名
select Sno,Sname
from student;
例二:查詢?nèi)w學(xué)生的詳細(xì)記錄
select *
from student;
例三:查詢?nèi)w學(xué)生的姓名、出生年份、所在院系(小寫)
select Sname,2023-Sage as Birthyear,
lower(Sdept)as Department
from student;
/*注意列名的丟失*/
例四:查詢考試成績(jī)合格學(xué)生的成績(jī)
select distinct Sno/*畢竟在SC表中 學(xué)號(hào)是重復(fù)出現(xiàn)的元素*/
from SC
where Grade>60;
例五:查詢年齡在20~23歲之間學(xué)生的姓名,系名,年齡
select Sname,Sdept,Sage
from student
where Sage between 20 and 30;
例六:查詢CS MA IS的學(xué)生姓名和學(xué)號(hào)
select Sname,Sage
from student
where Sdept in('CS','MA','IS');
/*in 查找屬性值屬于指定集合的元組*/
例七:查詢第二個(gè)名字為立的同學(xué)
select Sno
from Student
where Sname like '_立%';/*一個(gè)漢字這里是倆個(gè)斜杠*/
/*但是在sql server中一個(gè)漢字代表的是一個(gè)斜杠*/
例八:查詢DB_Design課程的課程號(hào)和學(xué)分
select Cno,Ccredit
from Course
where Cname like 'DB\_Design' escape '\';
/*由于_是占位符 但是在這里_是具體符號(hào),所以得用escape關(guān)鍵字*/
Order by子句
例九:查詢?nèi)w學(xué)生情況,系號(hào)升序年齡降序
以上為錯(cuò)誤示范
select *
from Student
order by Sdept , Sage desc;/*默認(rèn)升序*/
聚集函數(shù)
例十:查詢選修了課程的學(xué)生人數(shù)
select count(distinct Sno)
from sc;
例十一:查詢選修1號(hào)課程的學(xué)生平均成績(jī)
select avg(Grade)
from SC;
where Cno='1';
例十二:查詢學(xué)生202102810224選修課程的總學(xué)分?jǐn)?shù)
select sum(Ccreidt)
from SC,Course
where Sno='202102810224' and SC.Cno=Course.Cno;/*必須連接倆表 否則關(guān)系無法建立起來*/
group by 子句
往往表頭元素和數(shù)字有關(guān)系的時(shí)候 就會(huì)用group by語句 比如:查詢每個(gè)學(xué)生的選課門數(shù),選修三門以上學(xué)生的名字等等
目的:細(xì)化聚集函數(shù)的作用對(duì)象,分組后,聚集函數(shù)將作用于每一個(gè)組,每一個(gè)組都有一個(gè)函數(shù)值
將表頭元素和聚集函數(shù)值生成表建立聯(lián)系
不可以用where 只可以用having
group by 后面加聚集函數(shù)之前的所有列表屬性
having后面只可以加聚集函數(shù)
例一:查詢各個(gè)課程號(hào)及相應(yīng)的選課人數(shù)
select Cno,count(Sno)
from SC
group by Cno;
例二:查詢每個(gè)學(xué)生的選課門數(shù)
select Sno,count(Cno)
from SC
group by Sno;
例三:查詢選修三門以上課程的學(xué)生學(xué)號(hào)
select Sno
from SC
group by Sno
having count(Cno)>3;
例四:查詢選修課程中至多一門>70分的學(xué)生學(xué)號(hào)
SC的Sno投影-Sno的投影(選擇Grade>70(SC)) 所有成績(jī)都<=70的
并(union)上
有且僅有一門是70分的(和數(shù)量有關(guān) 得用到group by)
where后面不可以加聚集函數(shù)
/*所有成績(jī)<=70的*/
select Sno
from SC
where Sno not in
(select Sno from SC where Grade >70)
union
/*有且僅有一門是70分的*/
select Sno
from SC
where Grade>70
group by Sno
having count(Cno)=1
/*對(duì)于課本的表 這個(gè)代碼是沒有數(shù)據(jù)的*/
為什么這段代碼沒有數(shù)據(jù)??
分組之后 Cno已經(jīng)沒有=1的了
例五:查詢平均成績(jī)>=90分的學(xué)生學(xué)號(hào)和平均成績(jī)
select Sno,avg(Grade)
from SC
group by Sno
having avg(Grade)>=90;
連接查詢
例一:查詢每個(gè)學(xué)生及其選修課程的情況
select Student.*,SC.*
from Student,SC
where SC.Sno=Student.Sno;
例二:查詢選修二號(hào)課程且成績(jī)?cè)?0分以上的所有學(xué)生的學(xué)號(hào)和姓名
select Student.Sno,Sname
from Student,SC
where SC.Sno=Student.Sno and SC.Cno='2' and SC.Grade>90;
例三:查詢每一門課的間接先修課
select C1.Cno,C2.Cpno
from Course as C1 ,Course as C2
where C1.Cpno=C2.Cno;
例四:查詢每個(gè)學(xué)生的學(xué)號(hào),姓名,選修的課程,成績(jī)
select Sno,Sname,Cno,Grade
from SC,Course,Student
where Student.Sno=SC.Sno and SC.Cno=Course.Cno /*雖然是三表連接 但是用一個(gè)and就可以解決問題*/
例五:
注意,SC連接的時(shí)候用的是Sno,不是Cno
嵌套查詢
在 SQL 語言中, 一個(gè)select-from-where 語句稱為一個(gè)查詢塊,將一個(gè)查詢塊嵌套在另一個(gè)和查詢塊的 where 子句或者 having 短語的條件中的查詢稱為 嵌套查詢
- 無關(guān)子查詢,先寫子查詢?cè)賹懜覆樵?/li>
- 能用in的絕對(duì)不要用=
- 子查詢前面一定是屬性+in 不要只寫in
例一:查詢與劉晨在同一個(gè)系的學(xué)生
select Sno,Sname,Sdept
from Student
where Sdept in(select Sdept from Student where Sname='劉晨');
例二:查詢既選修1號(hào)又選修2號(hào)課程的學(xué)生
select Sno
from Student
where Cno='1' and Sno in
(select Sno from Student where Cno='2');
例三:查詢選修了課程名為'信息系統(tǒng)'的學(xué)生姓名和學(xué)號(hào)
select distinct Student.Sno,Sname
from SC,Student,Course
where SC.Sno=Student.Sno and Course.Cno=SC.Cno and Course.Cname='信息系統(tǒng)';
例四:查詢成績(jī)都大于70分學(xué)生的成績(jī)
/*查詢所選課程成績(jī)?nèi)看笥?0分的學(xué)生的學(xué)號(hào)*/
select distinct Sno
from SC
where Grade not in(select Grade from SC where Grade<=70);
相關(guān)子查詢
例五:找出每個(gè)學(xué)生超過他自己選修課程平均成績(jī)的課程號(hào)
select Sno,Cno
from SC as X
where Grade>=(select avg(grade) from SC Y where Y.Sno=X.Sno);
// 1. 從外層查詢中取出 SC 的一個(gè)元組 x, 將元組 x 的 Sno 值(201215121) 傳送給內(nèi)層查詢
select avg(Grade)
form SC y
where y.Sno='201215121'
// 2. 執(zhí)行內(nèi)層查詢,得到值 88(平均成績(jī)的近似值), 用該值代替內(nèi)層查詢, 得到外層查詢
select Sno,Cno
from SC x
where Grade>=88
// 3. 執(zhí)行這個(gè)查詢,得到
select Sno,Cno
from SC x
where Grade>=88;
然后從外層查詢?nèi)〕鱿乱粋€(gè)元組重復(fù)上述 1 ~ 3 步驟的處理, 知道外層的 SC 元組全部處理完畢,結(jié)果為
// 學(xué)號(hào) 和 課程號(hào)
(201215121,1)
(201215121,3)
(201215122,2)
帶有ANY和ALL謂詞的子查詢
例一:查詢非計(jì)算機(jī)科學(xué)系某一個(gè)學(xué)生年齡小的學(xué)生姓名和年齡
select Sname,Sage
from student
where Sage<any(select Sage from Student where Sdept='CS')
and Sdept <>'CS';
例二:查詢非計(jì)算機(jī)科學(xué)系中比計(jì)算機(jī)學(xué)科系所有學(xué)生年齡都小的學(xué)生姓名和年齡
select Sname,Sage
from Student
where Sage<all(select Sage from student where Sdept='CS') and Sdept <>'CS';
帶有EXISTS謂詞的子查詢
例一:查詢選修了1號(hào)課程的學(xué)生姓名
select Sname
from Student
where exists(select * from SC where SC.Sno=Student.Sno and Cno='1');
相關(guān)子查詢的過程分析:
1.取外層查詢中Student表的第一個(gè)元組,根據(jù)與內(nèi)層查詢相關(guān)的屬性值處理內(nèi)層查詢
2.與SC.Sno判斷條件,如果滿足,則記錄下來
3.取Student表的下一個(gè)元組,重復(fù)這一過程
例二:查詢選修了全部課程的學(xué)生姓名
select Sname
from Student
where not exists
(select* from Course where not exists
(select* from SC where Sno=Student.Sno and Cno=Course.Cno));
理解:如果同時(shí)滿足倆個(gè)條件,那么雙重否定表肯定就是想要的結(jié)果
只要有一個(gè)結(jié)果不滿足,那么就返回真,之后還有一個(gè)NOT EXISTS,就是假
例三:查詢至少選修了20215122選秀的全部課程的學(xué)生號(hào)碼
select distinct Sno
from SC X
where not exists
(select * from SC Y where y.Sno='20215122' and not exists
(select * from SC Z where Z.Sno=X.Sno and Z.Sno=Y.Cno));
集合查詢
例一:查詢計(jì)算機(jī)科學(xué)系的學(xué)生及年齡不大于19歲的學(xué)生
select *
from Student
where Sdept='CS'
union
select *
from Student
where Sage<=19;
例二:查詢選修1號(hào)課程與2號(hào)課程的學(xué)生
select Sno
from SC
where Cno='1'
intersect
select Sno
from SC
where Cno='2';
例三:查詢計(jì)算機(jī)科學(xué)系的學(xué)生與年齡不大于19歲的學(xué)生的差集
select *
from Student
where Sdept='CS'
except--除去的意思
select *
from Student
where Sage<=19;
基于派生表的查詢
意義:可以將一些相關(guān)子查詢改寫為便于理解的非相關(guān)子查詢
前情背景: 我們的子查詢語句一般都是在where語句中,當(dāng)然也可以出現(xiàn)在from語句中,這時(shí)候可以利用子查詢生成的臨時(shí)派生表成為主查詢的查詢對(duì)象
例一:找出每個(gè)學(xué)生超過自己選修課程平均成績(jī)的
select Sno,Cno
from SC x
where Grade>=(select avg(Grade) from SC y where y.Sno=x.Sno);
改寫:
select Sno,Cno
from SC,(select Sno,avg(Grade) from SC group by Sno) as avgsc(avgsno,avggrade);
where SC.Sno=avgsc.avgsno and SC.Cno>avgsc.avggrade;
注:如果子查詢沒有聚集函數(shù),派生類可以不指定屬性列
例二:查詢所有選修1號(hào)課程的學(xué)生名字
select Sname
from Student,(select Sno from SC where Cno='1') as SC1
where Student.Sno=SC1.Sno;
3.5數(shù)據(jù)更新
1.插入數(shù)據(jù)
insert
into 表名 (表頭名1,表頭名2...)
values (常量1,常量2)
注意:如果into中沒有指明任何屬性列名,則新插入的元組必須在每個(gè)屬性列上均有值
插入元組
- INTO子句中沒有出現(xiàn)的屬性列,新元組在這些列上將會(huì)取NULL
- 若INTO子句中沒有指明任何屬性列名,則新插入的元祖必須在每個(gè)屬性列上均有值
例一:將一個(gè)新學(xué)生元組(學(xué)號(hào):201215128,姓名:陳冬,性別:男,所在系:年齡:18歲)插入到Student 表中
INSERT
INTO Student(Sno,Sname,Ssex,Sdept,Sage)
VALUES ('201215128 陳冬,男,IS18);
- 注意順序可以和表不一致(因?yàn)閟tudent后面的屬性已經(jīng)完全指出了)
例二:插入學(xué)生張三
INSERT
INTO student
VALUES('201215126','張成民','男',18,'CS');
- 注意由于沒有指定順序,所以按照必須按照表中屬性列的順序插入,否則會(huì)導(dǎo)致插入錯(cuò)誤
插入子查詢
例三:對(duì)每一個(gè)系,求學(xué)生的平均年齡,并把結(jié)果存入數(shù)據(jù)庫
CREATE TABLE dept_age(
Sdept char(15),
Age SMALLINT
);
INSERT
INTO dept_age(Sdept,Age)
SELECT Sdept,AVG(Sage)
FROM student
GROUP BY Sdept;
2.修改數(shù)據(jù)(update)
例四:將所有學(xué)生的年齡增加1歲
UPDATE student
set Sage=Sage+1;
例五:將CS所有學(xué)生成績(jī)?yōu)?
UPDATE sc
SET Grade=0
WHERE Sno IN
(
SELECT Sno FROM student WHERE Sdept='CS'
);
3.刪除數(shù)據(jù)(delete)
- DELETE刪除的是表的數(shù)據(jù),而不是表的定義
- 如果省略WHERE子句,那么就表示刪除全部元組
例六:刪除計(jì)算機(jī)科學(xué)系所有學(xué)生選課記錄
DELETE FROM sc
WHERE Sno IN
(SELECT Sno FROM student WHERE Sdept='CS');
3.6觸發(fā)器
插入:inserted表中有,deleted無
刪除:deleted有,inserted無
CREATE TRIGGER trigger_name
ON table_name
INSTEAD OF DELETE--前觸發(fā)器
AS
BEGIN
-- 觸發(fā)器內(nèi)容
END
例一:當(dāng)在學(xué)生表S中刪除某一個(gè)學(xué)生時(shí),在學(xué)生選課表SC中的選課記錄也全部被刪除。
例二:當(dāng)對(duì)表sc的grade進(jìn)行修改時(shí),若分?jǐn)?shù)增加了10%,則將此次操作記錄到另一個(gè)表中sc_u(sno,cno,oldgrade,newgrade)
--則將此次操作記錄到另一個(gè)表中sc_u(sno,cno,oldgrade,newgrade)
create trigger sb
on sc
after update
as
begin
set nocount on;
if (1.1<=(select inserted.grade/deleted.grade
from inserted,deleted
where inserted.sno=deleted.sno and inserted.cno=deleted.cno))
begin
insert into sc_u
select deleted.* ,inserted.grade
from inserted,deleted
where inserted.sno=deleted.sno and inserted.cno=deleted.cno
end
end
例三:創(chuàng)建觸發(fā)器,該觸發(fā)器能夠保證在學(xué)生選課表SC表中添加新的記錄時(shí),學(xué)生的學(xué)號(hào)SNO必須已經(jīng)存在于學(xué)生基本信息表S中
例三:如果學(xué)生成績(jī)小于60,改為60
create TRIGGER scl_grade
on SC
instead of INSERT
as
BEGIN
SET NOCOUNT ON;
if 60> (select grade--50 --70
from inserted)
begin
insert into SC
select Sno,Cno,60
from inserted
end
if 60<= (select grade from inserted)
begin
insert into SC
select Sno,Cno,inserted.Grade
from inserted
end
END;
insert into SC values('001','10',50);
ALTER TABLE Orders
ADD CONSTRAINT FK_CustomerOrder
FOREIGN KEY (CustomerID)
REFERENCES Customers(CustomerID)
ON DELETE CASCADE;
3.7視圖(見課本121頁吧 實(shí)在寫不動(dòng)了)
寫實(shí)驗(yàn)報(bào)告遇到的錯(cuò)誤點(diǎn)
1.插入錯(cuò)誤
表和into的位置寫反了
2.查詢選修了全部課程的學(xué)生的學(xué)號(hào)和姓名
第二個(gè)表是course 寫成了SC 因?yàn)橐氖侨空n程 所以就得從Course中選擇
3.刪除C1的記錄
更改:
4.創(chuàng)建視圖
文章來源:http://www.zghlxwxcb.cn/news/detail-714497.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-714497.html
到了這里,關(guān)于【數(shù)據(jù)庫系統(tǒng)概論】第三章關(guān)系數(shù)據(jù)庫標(biāo)準(zhǔn)語言SQL的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!