数据定义
操作对象 | 操作方式 | ||
创建 | 删除 | 修改 | |
模式 | CREATE SCHEMA | DROP SCHEMA |
|
表 | CREATE TABLE | DROP TABLE | ALTER TABLE |
视图 | CREATE VIEW | DROP VIEW |
|
索引 | CREATE INDEX | DROP INDEX |
|
模式的定义和删除
CREATE SCHEMA <模式名> AUTHORIZATION <用户名>
如果不指定<模式名>,那么<模式名>隐含为<用户名>
要创建模式,调用该命令的用户必须拥有DBA的权限,或者获得DBA授予的CREATE SCHEMA的权限。
DROP SCHEMA <模式名> <CASCADE | RESTRICT>
当然,CASCADE和RESTRICT其中必选其一。
选择CASCADE(级联),表示在删除模式的同时把该模式中的所有的数据库对象全部一起删除。
选择RESTRICT(限制),表示如果该模式中已经定义了下属的数据库对象,则拒绝该删除语句的执行。
数据类型
CHAR(n) 长度为n的定长字符串
VARCHAR(n) 最大长度为n的变长字符串
INT 长整数(INTEGER)
SMALLINT 短整数
NUMERIC(p, d) 定点数,由p位数字组成,小数后面有d位数字。
REAL 取决于机器精度的双精度浮点数。
Double Precision 取决于机器精度的双精度浮点数。
FLOAT(n) 浮点数,精度至少为n位数字。
DATE 日期
TIME 时间
模式和表
一个模式包含多个基本表。
删除基本表
DROP TABLE <表名> [RESTRICT | CASCADE];
若选择RESTRICT,那么该表的删除是有限制条件的,欲删除的基本表不能被其他表的约束所引用,不能有视图,不能有触发器,不能有存储过程或函数等。如果存在这些依赖该表的对象,则这个表不能删除。
若选择CASCADE,那么该表的删除没有限制条件。在删除基本表的同时,相关的依赖对象,例如视图,都将被删除。
如果不写,缺省的话默认为RESTRICT。
索引的建立和删除
索引的建立
CREATE [UNIQUE] [CLUSTER] INDEX <索引名>
ON <表名> (<列名> [<次序>] [, <列名> [<次序>]]);
UNIQUE表明此索引的每一个索引值只对应唯一的数据记录。
CLUSTER 表示要建立的索引是聚簇索引(所谓的聚簇索引是指索引项的顺序与表 中记录的物理顺序一致的索引组织)。
但要注意经常更新的列不宜建立聚簇索引。
索引的删除
数据查询
SELECT [ALL | DISTINCT] <目标列表达式> [, 目标列表达式]...
FROM <表名或视图名> [, <表名或视图名>]...
[WHERE <条件表达式>]
[GROUP BY <列名1> [HAVING <条件表达式>]]
[ORDER BY <列名2> [ASC | DESC];
SELECT语句的含义是,根据WHERE子句的条件表达式,从FROM子句指定的基本 表或视图中找出满足条件的元组,再按SELECT子句的目标列表达式,选出元组中的 属性形成结果表。
<目标列表达式>不仅仅可以是算术表达式,还可以是字符串常量、函数等。
用户可以通过指定别名来改变查询结果的列标题,这对于含算术表达式、常量、函数名 的目标列表达式尤为有用。
消除取值重复的行,可以用到关键词DISTINCT。
表 3.4 常用的查询条件 | |
查询条件 | 谓词 |
比较 | =,>,<,>=,<=,!=,<>,!>,!<:NOT + 上述比较符 |
确定范围 | BETWEEN AND,NOT BETWEEN AND |
确定集合 | IN, NOT IN |
字符匹配 | LIKE, NOT LIKE |
空值 | IS NULL, IS NOT NULL |
多重条件(逻辑运算) | AND, OR, NOT |
查询满足指定条件的元组可以通过WHERE子句实现。
确定范围的谓词BETWEEN...AND...和NOT BETWEEN...AND...可以用来查找属性值在 (或不在)指定范围内的元组,但是要注意AND之前是范围的下限(低值),AND之 后是范围的上限(高值)。
确定集合谓词IN可以用来查找属性值属于指定集合的元组。
字符匹配[NOT] LIKE ‘<匹配串>’ [ESCAPE’<换码字符>’]
%代表任意长度的字符串。_代表任意单个字符。但是注意当数据库字符集为ASCII一个 汉字需要两个_,当字符集为GBK时只需要一个_。
其实IN是多个OR运算符的缩写。
用户可以用ORDER BY 子句对查询结果按照一个或者多个属性列的升序(ASC)或者 降序(DESC)排列,缺省的话为升序。
COUNT([DISTINCT | ALL]*) | 统计元组个数 |
COUNT([DISTINCT | ALL]<列名>) | 统计一列中值得个数 |
SUM([DISTINCT | ALL]<列名>) | 计算一列值的和 |
AVG([DISTINCT | ALL]<列名>) | 计算一列的平均值 |
MAX([DISTINCT | ALL]<列名>) | 求一列值中最大值 |
MIN([DISTINCT | ALL] <列名>) | 求一列值中的最小值 |
DISTINCT的作用是取消指定列中的重复值。
在聚集函数遇到空值,除COUNT(*)外,都跳过空值而只处理非空值。注意,WHERE 子句中是不能用聚集函数作为条件表达式的。
GROUP BY子句将查询结果按某一列或者多列的值分组,值相等的为一组。
注意WHERE子句和HAVING短语的区别在于作用的对象不同!WHERE子句作用于 基本表或者视图,从中选择满足条件的元组。HAVING短语作用于组,从中选择满足 条件的组。
连接查询
之前的查询都是针对一个表进行的。如果查询涉及到多个表则称为连接查询。连接查询 是关系数据库中最主要的查询,包括等值连接查询、自然连接查询、非等值连接查询、 自身连接查询、外连接查询和复合条件连接查询等。
嵌套查询
在SQL语言中,一个SELECT-FROM-WHERE语句称为一个查询块。可以将一个查询块嵌套在另一个查询块的WHERE子句或者HAVING短语的条件中的查询称为嵌套查询。