1. 程式人生 > >PL/SQL入門——基礎的增刪改查(轉載)

PL/SQL入門——基礎的增刪改查(轉載)

斜杠 一起 重復行 ima table ext 自己 課程 新的

鏈接:https://blog.csdn.net/u013253278/article/details/51120705

學生表Student

技術分享圖片

課程表Course

技術分享圖片

選課表SC

技術分享圖片

首先用system身份登錄

-- 創建表空間

create tablespace abc

datafile ‘c:\app\text\abc.dbf‘

size 10M;

-- 創建用戶

create user xiaoming

identified by a123

default tablespace abc;

-- 授權

grant connect,resource to xiaoming;

grant create session to xiaoming;

grant create view to xiaoming;

用戶和表空間創建完成後,就可以用xiaoming這個身份登錄進入數據庫操作了

建表操作

--建立學生表
CREATE TABLE Student
(Sno CHAR(9) PRIMARY KEY,
Sname CHAR(20) UNIQUE,
Ssex CHAR(2),
Ssage SMALLINT,
Sdept CHAR(20)
);


--建立課程表
CREATE TABLE Course
(Cno CHAR(4) PRIMARY KEY,
Cname CHAR(40),
Cpno CHAR(4), --先修課
Ccredit SMALLINT, --學分
CONSTRAINT FK_Cpno FOREIGN KEY (Cpno) REFERENCES Course(Cno) --建表時添加外鍵
);


--建立學生選課表
CREATE TABLE SC
(Sno CHAR(9),
Cno CHAR(4),
Grade SMALLINT, --成績
PRIMARY KEY (Sno,Cno)
);

添加或者刪除約束

--添加外鍵
ALTER TABLE SC ADD CONSTRAINT FK_Cno FOREIGN KEY (Cno) REFERENCES Course(Cno);
ALTER TABLE SC ADD CONSTRAINT FK_Sno FOREIGN KEY (Sno) REFERENCES Student(Sno);
ALTER TABLE SC ADD CONSTRAINT FK_test FOREIGN KEY (Sno) REFERENCES Course(Cno);

--刪除外鍵
ALTER TABLE Course DROP CONSTRAINT FK_test;

刪除表的操作

--刪除表
DROP TABLE Student CASCADE CONSTRAINT;
DROP TABLE Course CASCADE CONSTRAINT;
DROP TABLE SC CASCADE CONSTRAINT;

對已經建好的表進行修改

--向學生表添加“入學時間”列
ALTER TABLE Student ADD S_entrance DATE;

--刪除列
ALTER TABLE Student DROP COLUMN S_entrance;

--修改列名
ALTER TABLE Student RENAME COLUMN Ssage TO Sage;

--將年齡類型改為INT
ALTER TABLE Student MODIFY (Sage INT);

插入操作

--插入數據
INSERT INTO Student VALUES (‘200215121‘,‘李勇‘,‘男‘,20,‘CS‘);
INSERT INTO Student VALUES (‘200215122‘,‘劉晨‘,‘女‘,19,‘CS‘);
INSERT INTO Student VALUES (‘200215123‘,‘王敏‘,‘女‘,18,‘MA‘);
INSERT INTO Student VALUES (‘200215125‘,‘張立‘,‘男‘,19,‘IS‘);

INSERT INTO Course VALUES (‘6‘,‘數據處理‘,null,2);
INSERT INTO Course VALUES (‘4‘,‘操作系統‘,‘6‘,3);
INSERT INTO Course VALUES (‘7‘,‘PASCAL語言‘,‘6‘,4);
INSERT INTO Course VALUES (‘5‘,‘數據結構‘,‘7‘,4);
INSERT INTO Course VALUES (‘1‘,‘數據庫‘,‘5‘,4);
INSERT INTO Course VALUES (‘3‘,‘信息系統‘,‘1‘,4);
INSERT INTO Course VALUES (‘2‘,‘數學‘,null,2);

INSERT INTO SC VALUES (‘200215121‘,‘1‘,92);
INSERT INTO SC VALUES (‘200215121‘,‘2‘,85);
INSERT INTO SC VALUES (‘200215121‘,‘3‘,88);
INSERT INTO SC VALUES (‘200215122‘,‘2‘,90);
INSERT INTO SC VALUES (‘200215122‘,‘1‘,80);

--插入子查詢結果
CREATE TABLE Dept_age
(Sdept CHAR(20),
AVG_age REAL);

INSERT INTO Dept_age (Sdept,AVG_age) SELECT Sdept , AVG(Sage) FROM Student GROUP BY Sdept;

索引,提高查詢效率

--建立索引
CREATE UNIQUE INDEX Stusno ON Student(Sno DESC);
CREATE UNIQUE INDEX Coucno ON Course(Cno DESC);
CREATE UNIQUE INDEX SCno ON SC (Sno ASC,Cno DESC);

--刪除索引
DROP INDEX SCno;

查詢操作,變化多樣

--查詢經過計算的列,可以起別名(AS可省略)
SELECT Sname,2004-Sage BIRTHDAY FROM Student;


--可以查詢字符串常量和函數
SELECT Sname NAME , ‘Year of Birth:‘ BIRTH , 2004-Sage BIRTHDAY , LOWER(Sdept) DEPARTMENT FROM Student;


--消除取值重復的行,缺省為ALL
SELECT DISTINCT Sno FROM SC;

--比較大小,>=、<=、!=、<>、!>、!<
SELECT DISTINCT Sno FROM SC WHERE Grade >= 90;


--確定範圍,between 下限 and 上限,相對的是 NOT between 下限 and 上限
SELECT Sname,Sdept,Sage FROM Student WHERE Sage NOT BETWEEN 20 AND 23;


--確定集合,關鍵詞 IN,相對的是NOT IN
SELECT Sname,Ssex FROM Student WHERE Sdept IN (‘IS‘,‘MA‘,‘CS‘);


--字符匹配,[NOT] LIKE ‘匹配字符串‘ [ESCAPE ‘換嗎字符‘]
UPDATE Student SET Sname = ‘李勇%‘ WHERE Sname = ‘李勇‘;
SELECT * FROM Student WHERE Sname LIKE ‘%\%%‘ESCAPE ‘\‘; --反斜杠後的%被轉義,%不在具有通配符的含義
UPDATE Student SET Sname = ‘李勇‘ WHERE Sname = ‘李勇%‘;


--涉及空值查詢,IS [NOT] NULL
SELECT * FROM Course WHERE Cpno IS NULL;


--多重條件查詢 AND OR
SELECT * FROM Student WHERE Sdept = ‘IS‘ OR Sdept = ‘CS‘ OR Sdept = ‘MA‘;


--ORDER BY 子句,ASC DESC
SELECT * FROM Student ORDER BY Sdept,Sage DESC;
SELECT * FROM Course ORDER BY Cname; --ORDER BY 字符字段


--聚集函數 COUNT(),MAX(),MIN(),AVG(),SUM(),註意:聚集函數不能作為WHERE的條件表達式
SELECT COUNT(Cpno) FROM Course;
SELECT COUNT(*) FROM Course;
SELECT AVG(Grade) FROM SC WHERE Cno = 2;


--GROUP BY 字句
SELECT Cno , COUNT(Sno) NUM FROM SC GROUP BY Cno;
SELECT Sno FROM SC GROUP BY Sno HAVING COUNT(Cno) >= 2; --HAVING作用於GROUP BY的分組,WHERE作用於基本表或試圖,聚集函數可以作用於HAVING


--等值與非等值連接查詢
SELECT a.*,b.* FROM Student a , SC b WHERE a.Sno = b.Sno; --等值連接
SELECT Student.* FROM Student , SC WHERE Student.Sno = SC.Sno AND Cno = ‘2‘ AND Grade > 70;
SELECT a.* , b.* ,c.* FROM Student a , SC b , Course c WHERE a.sno = b.sno AND b.cno = c.cno;
SELECT a.* , b.* FROM Student a INNER JOIN SC b ON a.Sno = b.Sno; --內連接


--自身連接
SELECT a.Cno , b.Cpno 間接先修課 FROM Course a , Course b WHERE a.Cpno = b.Cno ORDER BY a.Cno;


--外連接
SELECT a.* , b.* FROM Student a LEFT JOIN SC b ON a.Sno = b.Sno;
SELECT a.* , b.* FROM Student a RIGHT JOIN SC b ON a.Sno = b.Sno;
SELECT a.* , b.* FROM Student a FULL JOIN SC b ON a.Sno = b.Sno;


--嵌套查詢,註意:子查詢SELECT不允許用ORDER BY子句
SELECT * FROM Student WHERE Sno IN (SELECT Sno FROM SC WHERE Cno = ‘2‘);
SELECT * FROM Student WHERE Sdept IN (SELECT Sdept FROM Student WHERE Sname = ‘劉晨‘); --不相關子查詢,子查詢的查詢條件不依賴於父查詢
SELECT * FROM Student WHERE Sdept = (SELECT Sdept FROM Student WHERE Sname = ‘劉晨‘); --子查詢結果是單值,所以可以用等號。註意只有當子查詢是單值時才可以用比較運算符
SELECT * FROM Student WHERE (SELECT Sdept FROM Student WHERE Sname = ‘劉晨‘) = Sdept ;
SELECT a.* FROM Student a , Student b WHERE b.Sname = ‘劉晨‘ AND a.Sdept = b.Sdept; --和上面三條等價
SELECT DISTINCT a.Sno , Sname FROM Student a , SC b WHERE a.Sno IN (SELECT Sno FROM SC , Course WHERE SC.Cno = Course.Cno AND Cname = ‘信息系統‘);
SELECT DISTINCT Sno , Sname FROM Student WHERE Sno IN (SELECT Sno FROM SC WHERE Cno IN (SELECT Cno FROM Course WHERE Cname = ‘信息系統‘));
SELECT DISTINCT a.Sno , Sname FROM Student a , SC b , Course c WHERE Cname = ‘信息系統‘ AND c.Cno = b.Cno AND b.Sno = a.Sno; --和上面兩條等價
SELECT a.* , Cno FROM Student a , SC b WHERE Grade > (SELECT AVG(Grade) FROM SC WHERE a.Sno = b.Sno); -- 相關子查詢
SELECT Sno , Cno FROM SC a WHERE Grade > (SELECT AVG(Grade) FROM SC b WHERE a.Sno = b.Sno); -- 相關子查詢


--帶ANY(SOME) , ALL 謂詞的子查詢,
SELECT Sname , Sage FROM Student WHERE Sage < ANY (SELECT Sage FROM Student WHERE Sdept = ‘CS‘) AND Sdept != ‘CS‘; --ANY 也可以用 SOME 代替
SELECT Sname , Sage FROM Student WHERE Sage < (SELECT MAX(Sage) FROM Student WHERE Sdept = ‘CS‘) AND Sdept != ‘CS‘;--和上面一條等價,註意:用聚集函數查詢比用ANY或ALL效率高
SELECT Sname , Sage FROM Student WHERE Sage < ALL (SELECT Sage FROM Student WHERE Sdept = ‘CS‘) AND Sdept != ‘CS‘;
SELECT Sname , Sage FROM Student WHERE Sage < (SELECT MIN(Sage) FROM Student WHERE Sdept = ‘CS‘) AND Sdept != ‘CS‘; --和上面一條等價


--帶有EXISTS 或 NOT EXISTS 謂詞的子查詢,不返回任何數據只產生 TRUE 或者 FALSE ,註意:某些帶 [NOT] EXISTS不能被其他姓氏子查詢代替,但所有帶IN ,比較運算符,ANY或ALL的子查詢都能被EXISTS查詢代替
SELECT Sname FROM Student WHERE EXISTS (SELECT * FROM SC WHERE SC.Sno = Student.Sno AND Cno = ‘1‘); --由EXISTS 引出的查詢通常都用 *
SELECT Sname FROM Student a , SC b WHERE a.Sno = b.Sno AND b.Cno = ‘1‘; --和上面一條等價
SELECT Sname FROM Student WHERE NOT EXISTS (SELECT * FROM SC WHERE SC.Sno = Student.Sno AND Cno = ‘1‘);
SELECT * FROM Student S1 WHERE EXISTS (SELECT * FROM Student S2 WHERE S1.Sdept = S2.Sdept AND Sname = ‘劉晨‘); --和 139 行等價
SELECT * FROM Student WHERE NOT EXISTS (SELECT * FROM Course WHERE NOT EXISTS (SELECT * FROM SC WHERE Student.Sno = Sno AND Course.Cno = Cno)); --查詢選修了全部課程的學生,NOT EXISTS相當於 任意
SELECT * FROM Student x WHERE NOT EXISTS (SELECT Cno FROM SC y WHERE Sno = ‘200215122‘ AND NOT EXISTS (SELECT * FROM SC z WHERE y.Cno = z.Cno AND x.Sno = z.Sno));


--集合查詢,並UNION ,交INTERSECT ,差 MINUS ,註意:參加集合操作的查詢結果列數必須相同,對應項類型也必須相同
SELECT * FROM Student WHERE Sdept = ‘CS‘ UNION SELECT * FROM Student WHERE Sage <= 19; --並集,UNION會自動去掉重復行,保留要用UNION ALL
SELECT * FROM Student WHERE Sdept = ‘CS‘ INTERSECT SELECT * FROM Student WHERE Sage <= 19; --交集
SELECT * FROM Student WHERE Sdept = ‘CS‘ AND Sage <= 19; --和上面一條等價
SELECT * FROM Student WHERE Sdept = ‘CS‘ MINUS SELECT * FROM Student WHERE Sage <= 19; --差集
SELECT Sno FROM SC WHERE Cno = ‘1‘ UNION SELECT Sno FROM SC WHERE Cno = ‘2‘;

以上查詢操作的結果集請讀者自行操作

修改和刪除操作

--修改數據
UPDATE Student SET Sage = Sage + 1;
UPDATE SC SET Grade = Grade + 1 WHERE SC.Sno = Student.Sno AND Student.Sdept = ‘CS‘; --錯誤
UPDATE SC SET Grade = Grade + 1 WHERE (SELECT Sdept FROM Student WHERE Student.Sno = SC.Sno) = ‘CS‘; --計算機系全體學生成績加一,帶子查詢的修改語句

--刪除數據
DELETE FROM Student WHERE Sno = ‘200215128‘;
DELETE FROM SC WHERE (SELECT Sdept FROM Student WHERE Sno = SC.Sno) = ‘CS‘; --帶子查詢的刪除語句

視圖

--定義視圖,SELECT 語句中不能有ORDER BY 和 DISTINCT
CREATE VIEW IS_Student1 AS SELECT Sno IS_Sno , Sname , Sage FROM Student WHERE Sdept = ‘IS‘; --行列子集視圖,視圖列默認為SELECT子句的列,當多表查詢時列名重合或者聚集函數或者列表達式作為列名則需要視圖自己定義列
CREATE VIEW IS_Student2 (Sno , Sname , Ssex , Ssage ,Sdept) AS SELECT * FROM Student WHERE Sdept = ‘IS‘ WITH CHECK OPTION; --表示對視圖進行增刪改時的操作行要滿足子查詢中的條件表達式
CREATE VIEW IS_Student3 AS SELECT IS_Student1.IS_Sno , Sname , Sage FROM IS_Student1 , SC WHERE IS_Student1.IS_Sno = SC.Sno AND Cno = ‘1‘; --在試圖上再導出視圖
CREATE VIEW S_G (Sno ,Sname , AVG_Grade) AS SELECT SC.Sno , Sname , AVG(Grade) FROM SC , Student WHERE Student.Sno = SC.Sno GROUP BY SC.Sno , Sname; --分組視圖,PS:可以GROUP BY多列
CREATE VIEW Girl AS SELECT Sno , Sname Name , Sage GirlAge FROM Student WHERE Ssex = ‘女‘ WITH CHECK OPTION; --修改基本表Student後會破壞基本表與該視圖的映像關系,改表之後需刪掉視圖重建


--刪除視圖, CASCADE則該視圖導出的視圖一起刪除
DROP VIEW S_g;

--查詢視圖
SELECT * FROM IS_Student1 WHERE Sage < 22; --視圖消解,將視圖中的子查詢和用戶查詢結合起來 WHERE Sdept = ‘IS‘ AND Sage < 22
SELECT * FROM S_G WHERE AVG_Grade <= 90;

--更新視圖
UPDATE IS_Student1 SET Sname = ‘劉辰‘ WHERE Sname = ‘劉晨‘;
INSERT INTO IS_Student2 VALUES (‘200215129‘ , ‘王傑‘ , ‘男‘ , ‘19‘ , ‘IS‘); --Sdept必須為IS
UPDATE S_G SET S_G = 70 WHERE Sno = ‘200215121‘; --錯誤,因為平均成績不能更新,所以並不是所有視圖都可以更新,一般行列子集視圖是可以更新的

PL/SQL入門——基礎的增刪改查(轉載)