关系数据库标准语言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, Credit
FROM Courses;
SELECT *
FROM Courses;

SELECT子句中的列可以是表达式

SELECT DISTINCT 2019year(Birthday) AS Age
FROM Students;

比较表达式

SELECT *
FROM Departments
WHERE Dname = '信息工程学院';

BETWEEN表达式

SELECT Sname, Speciality
FROM Students
WHERE year(Birthday) BETWEEN 1997 AND 1999;

IN表达式

SELECT Sno, Sname
FROM Students
WHERE Speciality IN (‘计算机科学与技术’, ‘软件工程’)

LIKE表达式

SELECT Cname
FROM Courses
WHERE Cname LIKE ‘数据%;

NULL表达式

SELECT Sno, Cno
FROM 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, Students
WHERE Students.Sno = SC. Sno 
GROUP BY Students.Sno, Sname

连接查询

SELECT Cname, Grade
FROM SC, Courses
WHERE SC.Cno=Courses.Cno AND Sno =201705001
SELECT Student.Sno, Sname, AVG (Grade)
FROM SC, Students
WHERE Students.Sno = SC. Sno 
GROUP BY Students.Sno, Sname 
HAVING AVG (Grade)>85;

嵌套查询

SELECT Sno, Sname
FROM Students
WHERE Sex = ‘女’ AND Speciality IN
(SELECT Speciality
FROM Students
WHERE Sname = ‘林艳’);

集合的比较引出的子查询

SELECT Sno, Sname, Speciality, year(Birthday)
FROM Students
WHERE Speciality <>‘软件工程’ AND
year(Birthday)> ALL (SELECT year(Birthday)
FROM Students
WHERE Speciality = ‘软件工程’);

存在量词引出的子查询

SELECT Sno, Sname
FROM Students, SC
WHERE Students.Sno=SC.Sno AND Cno=‘CS102’);
SELECT Sno, Sname
FROM Students 
WHERE Sno IN
(SELECT Sno
FROM SC
WHERE Cno=‘CS102’);

集合查询

SELECT DISTINCT Sno
FROM SC
WHERE Cno=‘CS301’ OR 
Cno=‘CS306’;
SELECT DISTINCT Sno
FROM SC
WHERE Cno=‘CS301’ AND 
Sno NOT IN 
(SELECT Sno
FROM SC
WHERE Cno= ‘CS306’);
SELECT DISTINCT Sno
FROM SC
WHERE Cno=‘CS301’ AND Sno
IN 
(SELECT Sno
FROM 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.00
FROM Teachers
WHERE Dno= ‘IE’;

删除

DELETE FROM Students
WHERE Sno =201824010;
DELETE FROM SC
WHERE Sno IN
(SELECT Sno
FROM Students
WHERE Speciality=‘软件工程’);

修改

UPDATE Teachers
SET Title = ‘副教授’
WHERE Tno = ‘B050041’;
UPDATE SC
SET Grade = Grade + 5
WHERE Grade<60 AND Sno IN
(SELECT Sno
FROM Students
WHERE Speciality=‘软件工程’);

你可能感兴趣的:(数据库原理SQL)