关系数据库标准语言SQL(一)

声明:最近在准备考试,故整理数据库笔记。

关系数据库标准语言SQL(一)

SQL概述

 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=‘软件工程’);

你可能感兴趣的:(关系数据库标准语言SQL(一))