数据库
SQL功能 |
动词 |
数据查询 |
SELECT |
数据定义 |
CREATE, DROP, ALTER |
数据操纵 |
INSERT, UPDATE, DELETE |
数据控制 |
GRANT, REVOKE |
SQL的数据定义语句
定义模式
CREATE SCHEMA <模式名> AUTHORIZATION<用户名>
删除模式
DROP SCHEMA<模式名><CASCADE>|RESTRICT>
CASCADE(级联):表示在删除模式的同时把该模式中所有的数据库对象全部删除。
RESTRICT(限制):表示如果该模式中已经定义了下属的数据库对象(如表、视图等),则拒绝该删除语句的执行。只有当该模式中没有任何下属的数据库对象时才能执行DROP SCHEMA语句。
定义基本表
CREATE TABLE<表名>(<列名><数据类型>[列级完整性约束条件]
[,<列名><数据类型>[列级完整性约束条件]]
…
[,<表级完整性约束条件>]);
修改基本表
ALTERTABLE<表名> //修改基本表
[ADD[COLUMN] <新列名><数据类型>[完整性约束]] //ADD子句用于增加新列等
[ADD<表级完整性约束>]
[DROP[COLUMN] <列名>[CASCADE|RESTERICT]]
//DROP COLUMN子句用于删除表中的列
[DROPCONSTRAINT<完整性约束名>[RESTRICT|CASCADE]]
[ALTERCOLUMN<列名><数据类型>];
//ALTER COLUMN子句用于修改原有的列定义,包括修改列名和数据类型
删除基本表
DROP TABLE<表名>[RESTRICT|CASCADE];
索引的建立与删除
建立索引
CREATE[UNIQUE][CLUSTER] INDEX<索引名> ON <表名>(<列名>[次序][,<列名>[<次序>]] …);
ASC(升序) DESC(降序)
UNIQUE表明此索引的每一个索引值只对应唯一的数据记录
CLUSTER表明要建立的索引是聚簇索引
修改索引
ALTER INDEX<旧索引名>RENAME TO<新索引名>;
删除索引
DROP INDEX<索引名>;
数据查询
数据查询一般格式为
SELECT [ALL|DISTINCT] <目标列表达式>[,<目标列表达式>]…FROM<表名或视图名> [,<表名或视图名>…] | (<SELECT语句>)[AS]<别名> [WHERE<条件表达式>]
[GROUP BY<列名1>[HAVING<条件表达式>]] //结果按<列名1>的值进行分组
[ORDER BY<列名2>[ASC | DESC]; //结果表要按<列名2>的值升序或降序排序
单表查询
(1) 查询指定列
例:SELECT Sno, Sname FROM Student;
(2) 查询全部列
例:SELECT * FROM Student;
(3) 查询经过计算的值
SELECT子句的<目标表达式>不仅可以是表中的属性列,也可以是表达式
例:SELECT Sname, 2014-Sage FROM Student //查询结果的第二列是一个算数表达式
(4) 消除取值重复的行(DISTINCT)
例:SELECT DISTINCT Sno FROM SC;
(5) 查询满足条件的元组(WHERE)
1) 比较大小
例:SELECT Sname,Sage FROM Student WHERE Sage < 20;
2) 确定范围(BETWEEN…AND…和NOT BETWEEN…AND…)
例:SELECT Sname,Sdept,Sage FROM Student WHERE Sage BETWEEN 20 AND 30;
3) 确定集合(IN和NOT IN)
例:SELECT Sname,Ssex FROM Student WHERE Stept IN (‘CS’,’MA’,’IS’);
4) 字符匹配(LIKE和NOT LIKE)
[NOT] LIKE ‘<匹配串>’ [ESCAPE ‘<换码字符>’]
%:代表任意长度(长度可以为0)的字符串
_:代表任意单个字符串
例:SELECT Sname,Sno,Sex FROM Student WHERE Sname LIKE ‘刘%’;
5) 涉及空值的查询(IS NULL和IS NOT NULL)
例:SELECT Sno,Cno FROM SC WHERE Grade IS NULL;
6) 多重条件查询(AND 和OR)
例:SELECT Sname FROM Student WHERE Sdept = ‘CS’ AND Sage < 20;
(6) ORDER BY 子句(升序或者降序排序)
例:SELECT Sno, Grade FROM SC WHERE Cno = ‘3’ ORDER BY Grade DESC;
对于空值,排序时显示的次序由具体系统实现来决定
(7) 聚集函数
COUNT(*) //统计元组个数
COUNT([DISTINCT|ALL]<列名>) //统计一列中值的个数
SUM([DISTINCT|ALL]<列名>) //计算一列值的总和
AVG([DISTINCT|ALL]<列名>) //计算一列值的平均值
MAX([DISTINCT|ALL]<列名>) //求一列值中的最大值
MIN([DISTINCT|ALL]<列名>) //求一列值中的最小值
人生就和学习一样,出现了错误,只要去改正,反思,牢记,就会Be A Better Man。
连接查询
(1) 等值与非等值连接查询
[<表名1>.] <列名1><比较运算符> [<表名2>.]<列名2>
其中比较运算符主要有=、>、< 、>=、 <= 、!= (或<>) 等。
此外连接谓词还可以使用下面的形式:
[<表名1>.]<列名1>BETWEEN [<表名2>.]<列名2>AND[<表名2>.]<列名3>
当连接运算符为=时,称为等值连接,使用其他运算符称为非等值连接
例:SELECT Student.*,SC.* FROM Student,SC WHERE Student.Sno = SC.Sno; //将Student与SC中同一学生的元组连接起来
自然连接:在等值连接中把目标列中重复的属性列去掉
一条SQL语句可以同时完成选择和连接查询,这时WHERE子句是由连接谓词和选择谓词组成的复合条件
例:SELECT Student.Sno,Sname FROM Student,SC WHERE Student.Sno = SC.SnoAND //连接谓词
SC.Sno = ‘2’ ANDSC.Grade > 90; //其他限定条件
自身连接:一个表与其自己进行连接
例:要为Course表取两个别名,一个是FIRST,另一个是SECOND
SELECTFIRST.Con, SECOND.Cpon FROM Course FIRST, Course SECOND WHERE FIRST.Cpon =SECOND.Cno;
外连接:把悬浮元组也保存在结果关系中,而在其他属性上填空值(NULL)
例:SELECT Student.Sno,Sname,Sex,SageFROM Student LEFT OUTER JOIN SC ON(Student.Sno=SC.Sno);
左外连接:只保留左边关系R中的悬浮元组
右外连接:只保留右边关系S中的悬浮元组
多表连接
SELECT Student.Sno,Sname,Cname,Grade FROMStudent,SC,Course WHERE Student.Sno=SC.Sno AND SC.Cno=Course.Cno;
嵌套查询
将一个查询块嵌套在另一个查询块的WHERE子句或HAVING短语的条件中的查询称为嵌套查询。
SELECT Sname FROM Student WHERE Sno IN //外层查询或者父查询
(SELECT Sno FROM SC WHERE Cno = ‘2’); //内层查询或者子查询
不相关子查询:子查询的条件不依赖于父查询,反之为相关子查询。
(1)带有比较运算符的子查询
SELECTSno,Sname,Sdept FROM Student WHERE Sdept = (SELECT Stept FROM Student WHERESname = ‘刘晨’);
(2) 带有ANY(SOME)或ALL谓词的子查询
SELECTSname,Sage FROM Student WHERE Sage<ANY(SELECT Sage FROM Student WHERE Sdept= ‘CS’) AND Sdept <> ‘CS’; //<ANY:小于子查询结果中的某个值,Sdept<>’CS’:这是父查询块中的条件
ANY(或SOME)、ALL谓词与聚集函数、IN谓词的等价转换关系
|
= |
<>或!= |
< |
<= |
> |
>= |
ANY |
IN |
-- |
<MAX |
<=MAX |
>MIN |
>=MIN |
ALL |
-- |
NOT IN |
<MIN |
<=MIN |
>MAX |
>=MAX |
(3)带有EXISTS谓词的子查询
带有EXISTS谓词的子查询不返回任何数据,值产生逻辑真值“true”或逻辑假值“false”。
SELECT Sname FROM Student WHERE EXISTS(SELECT* FROM SC WHERE Sno = Student.Sno AND Cno = ‘1’);
若内层查询结果非空,则外层的WHERE子句返回真值,否则返回假值
与EXISTS谓词相对应的是NOT EXISTS谓词,使用存在量词NOT EXISTS后,若内层查询结果为空,则外层的WHERE子句返回真值,否则返回假值。
集合查询
多个SELECT语句的结果可进行集合操作
集合操作只要包括并操作UNION、交操作INTERSECT和差操作EXCEPT
例:SELECT * FROM Student WHERE Sdept= ‘CS’ UNION SELECT * FROM Student WHERE Sage <= 19;
基于派生表的查询
子查询不仅可以出现在WHERE子句中,还可以出现在FROM子句中,这时子查询生成的临时派生表成为主查询的查询对象
例:SELECT SnameFROM Student,(SELECT Sno FROM SC WHERE Con = ‘1’) AS SC1 WHERE Student.Sno =SC1.Sno;
通过FROM子句生成派生表时,AS关键字可以省略,但必须为派生关系指定一个别名。