声明:最近在准备考试,故整理数据库笔记。
SQL是一种完整地数据库语言,其功能涵盖数据定义、数据操纵、数据控制等数据管理的主要需求
但SQL语言相对比较简洁,其核心动词只有9个
CREATE,ALTER,DROP
SELECT,INSERT,DELETE,UPDATE
GRANT,REVOKE
SQL的数据类型
CHAR(n):定长字符串,长度n由用户指定。省略n时,长度为1,CHAR的全称是CHARACTER。
VARCHAR(n):变长字符串,最大长度n由用户指定,VARCHAR的全称是CHARACTER VARYING。
定长和变长字符串的差别主要表现在前者需要固定长度的空间,而后者占用的空间在最大长度范围内是可改变的。
BIT(n):定长二进位串,长度n由用户指定。省略n时,长度为1
BIT VARYING(n):变长二进位串,最大长度n由用户指定数据类型。
INT:整数,其值域依赖于具体实现。INT的全称是INTEGER。
SMALLINT:小整数,其值域依赖于具体实现,但小于INT的值域。
DEC(p, d):p位有效数字的定点数,其中小数点右边占d位。DEC的全称是DECIMAL。
FLOAT(n):精度至少为n位数字的浮点数,其值域依赖于实现。
REAL:实数,精度依赖于实现数据类型。
DOUBLE PRECISION:双精度实数,精度依赖于实现,但精度比REAL高 DATE:日期,包括年、月、日,格式为YYYY-MM-DD。
TIME:时间,包括时、分、秒,格式为HH:MM:SS。TIME(n)可以表示比秒更小的单位,秒后取n位
TIMESTAMP:时间戳,是DATE与 TIME的结合。
INTERVAL:时间间隔。SQL允许对DATE、TIME和INTERVAL类型的值进行计算数据类型。
SQL提供ETRACT(field FROM Var),Var可以是DATE、TIME或TIMESTAMP数据类型的变量,ETRACT函数的功能是从Var中提取字。段 field。 例如,如果d是DATE类型,则ETRACT(YEAR FROM d)返回d中的年份。
模式的定义和删除
模式的定义
CREATE SCHEMA <模式名> [<模式元素>…]
创建一个以<模式名>命名的模式,并可以在创建模式的同时为该模式创建或不创建模式元素
<模式元素>可以是表定义、视图定义、断言定义、授权定义等
这种格式没有授权其他用户访问创建的模式,以后可以用授权语句授权
CREATE SCHEMA [<模式名>] AUTHORIZATION <用户名> [<模式元素>…]
与第一种的区别在于它将创建的模式授权予<用户名>指定的用户
当<模式名>缺省时,用<用户名>作为模式名
模式删除
DBA和模式的拥有者可以用DROP SCHEMA删除模式。删除模式的语句格式为:
DROP SCHEMA <模式名> CASCADE∣RESTRICT
其中CASCADE和RESTRICT两者必须选择其一
CASCADE,则删除<模式名>指定模式得同时并删除该模式中的所有数据库对象(基本表、视图、断言等)
RESTRICT,则仅当<模式名>指定的模式不包含任何数据库对象时才删除指定的模式,否则拒绝删除
表的定义
CREATE TABLE <表名> (<列名><数据类型> [DEFAULT <缺省值>] [列级约束定义],<列名><数据类型> [DEFAULT <缺省值>] [列级约束定义],…, [<表级约束定义>, …, <表级约束定义>]);
列级约束的定义
NOT NULL:不允许该列取空值
PRIMARY KEY:指明该列是主码
UNIQUE:该列上的值必须惟一
CHECK (<条件>):指明该列的值必须满足的条件,其中<条件>是一个涉及该列的布尔表达式
表级约束的定义
PRIMARY KEY (A1, …, Ak):说明属性列A1, …, Ak构成该关系的主码
UNIQUE (A1, …, Ak):说明属性列A1, …, Ak上的值必须惟一,这相当于说明A1, …, Ak构成该关系的候选码
CHECK (<条件>):说明该表上的一个完整性约束条件
FOREIGN KEY (A1, …, Ak) REFERENCES <外表名> (<外表主码>) [<参照触发动作>]
修改基本表
ALTER TABLE <表名> [ADD [COLUMN] <列名><数据类型>[列级约束定义]]
[ALTER [COLUMN] <列名> {SET DEFAULT <缺省值> |
DROP DEFAULT}]
[DROP [ COLUMN ] <列名> {CASCADE | RESTRICT}]
[ADD <表约束定义>]
[DROP CONSTRAINT <约束名>{CASCADE | RESTRICT}]
删除基本表
DROP TABLE <表名> {CASCADE∣RESTRICT}
其中CASCADE表示及联删除,依赖于表的数据对象(最常见的是视图)也将一同被删除
RESTRICT表示受限删除,如果基于该表定义有视图,或者有其他表引用该表(如CHECK、FOREIGN KEY等约束),或者该表有触发器、存储过程或函数等,则不能删除
索引的定义
CREATE [UNIQUE] [CLUSTER] INDEX <索引名> ON <表名> (<列名> [<次序>]{,<列名> [<次序>]})
<索引名>为建立的索引命名
<表名>是要建立索引的基本表的名字
索引可以建在该表的一列或多列上,各列名间用逗号分隔;每个<列名>后可以用<次序>指定索引值的排列次序
次序可以是ASC(升序)和DESC(降序),缺省值为ASC
UNIQUE 表示该索引为惟一性索引UNIQUE缺省时,创建的索引为非唯一性索引
CLUSTER表示建立的索引是聚簇索引,缺省时为非聚簇索引
创建索引不仅创建索引结构,而且将索引的定义存储在数据字典中
索引删除
索引—旦建立,就由系统来选择和维护,无需用户干预,但当删除一些不必要的索引时,可用下列语句来实现:
DROP INDEX <索引名> 删除索引时,系统将删除索引结构,并同时从数据字典中删去有关该索引的定义
SELECT语句介绍
SELECT语句的一般形式如下:
SELECT [ALL︱DISTINCT] <选择序列>
FROM <表引用>, …, <表引用>
[WHERE <查询条件>]
[GROUP BY <分组列> {,<分组列>} [HAVING <分组选择条件>]]
[ORDER BY <排序列> [ASC︱DESC] {, <排序列> [ASC︱DESC]}]
最基本的结构是SELECT-FROM-WHERE,并且SELECT子句和FROM子句是必须的,其他子句都是可选的
单表查询
SELECT Cno, Cname, Period, CreditFROM Courses;SELECT *FROM Courses;
SELECT子句中的列可以是表达式
SELECT DISTINCT 2019﹣year(Birthday) AS AgeFROM Students;
比较表达式
SELECT *FROM DepartmentsWHERE Dname = '信息工程学院';
BETWEEN表达式
SELECT Sname, SpecialityFROM StudentsWHERE year(Birthday) BETWEEN 1997 AND 1999;
IN表达式
SELECT Sno, SnameFROM StudentsWHERE Speciality IN (‘计算机科学与技术’, ‘软件工程’)
LIKE表达式
SELECT CnameFROM CoursesWHERE Cname LIKE ‘数据%’;
NULL表达式
SELECT Sno, CnoFROM SC
WHERE Grade IS NULL;
排序
SELECT *FROM SC
WHERE Cno=’CS202’ORDER BY Grade DESC;
聚集函数
SELECT MIN (Grade), AVG (Grade), MAX (Grade)FROM SC
WHERE Cno = ‘CS102’;
分组语句group by
SELECT Cno, AVG (Grade)FROM SC
GROUP BY Cno;
SELECT Sno, AVG (Grade)FROM SC
GROUP BY Sno HAVING AVG (Grade)>85;
分组和聚集函数的关系
SELECT Student.Sno, Sname, AVG (Grade)FROM SC, StudentsWHERE Students.Sno = SC. Sno
GROUP BY Students.Sno, Sname
连接查询
SELECT Cname, GradeFROM SC, CoursesWHERE SC.Cno=Courses.Cno AND Sno = ‘201705001’
SELECT Student.Sno, Sname, AVG (Grade)FROM SC, StudentsWHERE Students.Sno = SC. Sno
GROUP BY Students.Sno, Sname
HAVING AVG (Grade)>85;
嵌套查询
SELECT Sno, SnameFROM StudentsWHERE Sex = ‘女’ AND Speciality IN(SELECT SpecialityFROM StudentsWHERE Sname = ‘林艳’);
集合的比较引出的子查询
SELECT Sno, Sname, Speciality, year(Birthday)FROM StudentsWHERE Speciality <>‘软件工程’ AND
year(Birthday)> ALL (SELECT year(Birthday)FROM StudentsWHERE Speciality = ‘软件工程’);
存在量词引出的子查询
SELECT Sno, SnameFROM Students, SC
WHERE Students.Sno=SC.Sno AND Cno=‘CS102’);
SELECT Sno, SnameFROM Students
WHERE Sno IN(SELECT SnoFROM SC
WHERE Cno=‘CS102’);
集合查询
SELECT DISTINCT SnoFROM SC
WHERE Cno=‘CS301’ OR Cno=‘CS306’;
SELECT DISTINCT SnoFROM SC
WHERE Cno=‘CS301’ AND Sno NOT IN (SELECT SnoFROM SC
WHERE Cno= ‘CS306’);
SELECT DISTINCT SnoFROM SC
WHERE Cno=‘CS301’ AND SnoIN (SELECT SnoFROM SC
WHERE Cno=‘CS306’);
插入
INSERT INTO Students
VALUES (‘201816010’, ‘司马煜’, ‘男’, 1999-01-28, ‘2018’, ‘计算数学’, ‘MATH’)
INSERT INTO Cardinf (Card-no, Name, Balance)SELECT Tno, Tname, 100.00FROM TeachersWHERE Dno= ‘IE’;
删除
DELETE FROM StudentsWHERE Sno = ‘201824010’;
DELETE FROM SC
WHERE Sno IN(SELECT SnoFROM StudentsWHERE Speciality=‘软件工程’);
修改
UPDATE TeachersSET Title = ‘副教授’WHERE Tno = ‘B050041’;
UPDATE SC
SET Grade = Grade + 5WHERE Grade<60 AND Sno IN(SELECT SnoFROM StudentsWHERE Speciality=‘软件工程’);