SQL语法规则

一、创建表语句

CREATE TABLE <表名>(<列名><数据类型>[列级完整性约束条件],
                  [<列名><数据类型>[列级完整性约束条件]]···
                  [,<表级完整性约束条件>]);

1. 主键

PRIMARY KEY(C_BH)   -- 加在字段后面或结尾(分号前)
PRIMARY KEY(C_NAME, C_ITEM, ……)  -- 多个属性的主键仅可加在结尾
NOT NULL UNIQUE  -- 等同于主键,仅可加在字段后面,NNU和PK仅一个即可

2. 外键

REFERENCES T_TABLE(C_BH)   -- 加在字段后面
FOREIGN KEY(C_BH_JZ) REFERCNCES T_TABLE(C_BH)  -- 加在结尾(分号前)

二、修改表语句

ALTER TABLE <表名>[ADD<新列名><数据类型>[完整性约束条件]]
[DROP<完整性约束名>]
[MODIFY<列名><数据类型>];

示例

ALTER TABLE T_TABLE ADD C_NEW_COLUMN VARCHAR(300);
ALTER TABLE T_TABLE MODIFY C_NEW_COLUNM INT;

三、删除表

DROP TABLE <表名>;

四、创建删除索引

1. 创建索引

CREATE [UNIQUE][CLUSTER] INDEX <索引名> 
ON <表名>(<列名>[<次序>][,<列名>[<次序>]]···);
-- 次序:ASC/DESC, 即升序或降序,默认ASC升序
-- UNIQUE 唯一索引,表明此索引的每一个索引值只对应唯一数据记录
-- CLUSTER 聚簇索引,表明索引项的顺序是与表中记录的物理顺序一致

示例

CREATE UNIQUE INDEX S-SNO ON S(Sno);
CREATE UNIQUE INDEX SPJ-NO ON SPJ(Sno ASC, Pno DESC, Jno ASC);

2. 删除索引

DROP INDEX <索引名>;

五、创建删除视图

1.创建视图

CREATE VIEW 视图名(列名) AS SELECT 查询子句 [WITH CHECK OPTION];
-- WITH CHECK OPTION: 表示对UPDATE、INSERT、DELETE操作时保证更新插入删除的行满足视图定义中的谓词条件(即子查询中的条件表达式)

2.删除视图

DROP VIEW 视图名;

3.视图操作

视图操作规则

  1. 从多个基本表通过连结操作到处的视图不允许更新。
  2. 对使用了分组、集函数操作的视图不允许进行更新操作。
  3. 如果视图是从单个基本表通过投影、选取操作导出的则允许进行更新操作,且语法同基本表。

六、数据操作

1. 查询

SELECT [ALL|DISTINCT]<目标列表达式>[,<目标列表达式>]··· 
FROM <表名或视图名>[,<表名或视图名>]···
[WHERE <条件表达式>]
[GROUP BY <列名1>[HAVING<条件表达式>]]
[ORDER BY <列名2>[ASC|DESC]···]

2. 子查询

示例

SELECT Sno, Sname FROM S WHERE Sno IN (SELECT Sno FROM SC);

2.1. 谓词 ALL/ANY

示例

SELECT Sname, Sage FROM S WHERE Sage < ALL(SELECT Sage FROM S);
即等价于:
SELECT Sname, Sage FROM S WHERE Sage < (SELECT MIN(Sage) FROM S);

等价转换

谓词 语义 等价转换关系
>ANY 大于子查询结果中的某个值 >MIN
<ANY 小于子查询结果中的某个值 <MAX
=ANY 等于子查询结果中的某个值 IN
>ALL 大于子查询结果中的所有值 >MAX
<ALL 小于子查询结果中的所有值 <MIN
<>ALL 不等于子查询结果中的所有值 NOT IN

2.2.分组查询

GROUP BY子句、HAVING子句

示例

SELECT Jno, AVG(Qty) FROM SPJ 
GROUP BY Jno HAVING COUNT(DISTINCT(Sno)) > 2 
ORDER BY Jno DESC

3. 更名/别名

AS

示例

SELECT C_BH AS 编号, C_XM AS 姓名 FROM T_TABLE;

4. 字符串操作(模糊查询)

LIKE 关键字

特殊字符 匹配方式
% 任意字符串
_ 任意一个字符

示例

SELECT * FROM T_TABLE WHERE C_NAME LIKE '%秀%';   -- 名字包含秀的
SELECT * FROM T_TABLE WHERE C_NAME LIKE '_建国';   -- 名字叫x建国的
SELECT * FROM T_TABLE WHERE C_NAME LIKE '___';    -- 名字是3个字符的
SELECT * FROM T_TABLE WHERE C_NAME LIKE '__%';    -- 名字至少包含2个字符的

5. 集合操作

关键字: UNION、INTERSECT、EXCEPT

关键字 含义
UNION [ALL] 并集(UNION去重,UNION ALL不去重)
INTERSECT 交集
EXCEPT 差集 - 有顺序

示例

(SELECT C_BH, C_NAME FROM T_TABLE1)
UNION/INTERSECT/EXCEPT                    -- EXCEPT 指在T_TABLE1中但不在T_TABLE2中
(SELECT C_BH, C_NAME FROM T_TABLE2)

七、数据库授权

1. 完整性约束

完整性约束分为:实体完整性约束、参照完整性约束、用户自定义完整性约束

1.1. 实体完整性约束(主键约束)

<列名> <数据类型> [PRIMARY KEY]    -- CREATE 语句中
或
PEIMARY KEY(<列名>[,<列名>]···)    -- CREATE 语句结尾

1.2. 参照完整性约束(外键约束)

REFERENCES <表名><列名> [ON DELETE CASECODE|SET NULL]  -- 加在字段后面
FOREIGN KEY(<列名>) REFERCNCES <表名><列名> [ON DELETE CASECODE|SET NULL] -- 加在结尾(分号前)
-- 说明:
ON DELETE CASECODE  删除被参照关系的元组时,同时删除参照关系中的元组
ON DELETE SET NULL  删除被参照关系的元组时,同时将参照关系中元组所属字段置为null

1.3. 用户自定义完整性约束

关键字 含义 示例
NOT NULL 非空 C_NAME VARCHAR(300) NOT NULL
UNIQUE 唯一 C_BH_USER VARCHAR(300) UNIQUE
CHECK 校验 CHECK(C_AGE > 18 )

2.授权与销权

2.1. 授权(GRANT)

GRANT <权限>[,<权限>]··· 
ON <对象类型><对象名> 
TO <用户>[,<用户>]···
[WITH GRANT OPTION]   -- 获得该权限的用户还可以将该权限赋给其他用户
对象 对象类型 操作权限
属性列 TABLE SELECT、INSERT、UPDATE、DELETE、ALL PRIVILEGES(所有权限)
视图 VIEW SELECT、INSERT、UPDATE、DELETE、ALL PRIVILEGES(所有权限)
基本表 TABLE SELECT、INSERT、UPDATE、DELETE、ALTER、INDEX、ALL PRIVILEGES(所有权限)
数据库 DATABASE CREATETAB(建表权限)

说明:TO PUBLIC 将权限赋给全部用户

示例

GRANT ALL PRIVILEGES ON TABLE T_TABLE1, T_TABLE2 TO USER1, USER2;
GRANT INSERT ON TABLE T_TABLE TO USER1 WITH GRANT OPTION;
GRANT CREATETAB ON DATABASE DB_JR TO USER1;

2.2. 销权(REVOKE)

REVOKE <权限>[,<权限>]··· 
ON <对象类型><对象名> 
FROM <用户>[,<用户>]···
[RESTRICT|CASECODE]  -- RESTRICT 只收回指定用户权限(默认)  CASECODE 级联收回用户权限

示例

REVOKE ALL PRIVILEGES ON TABLE T_TABLE1, T_TABLE2 FROM USER1, USER2;
REVOKE SELECT ON TABLE T_TABLE FROM PUBLIC;
REVOKE UPDATE(Sno) ON TABLE T_TABLE FROM USER1 CASECODE;

八、触发器

1. 新建触发器

CREATE TRIGGER<触发器名> [{BEFORE|AFTER}]    -- 在执行处罚语句之前/之后激发触发器
	{[DELETE|INSERT|UPDATE OF [列名清单]]}   -- 触发器类型删除/新增/修改
	ON 表名
	[REFERINCING<临时视图名>]                 -- 执行临时视图别名,存放新值和旧值
	[WHEN<触发条件>]                          -- 触发条件必须包含临时视图名
	BEGIN
		<触发动作>
	END [触发器名]

示例

CREATE TRIGGER overdraft_trigger AFTER UPDATE ON t_acount
	REFERENCING NEW ROW AS NROW
	FOR EACH ROW                             -- 行级触发器
	WHEN NROW.n_balance < 0
	BEGIN ATOMIC                             -- ATOMIC指原子性即事务
		INSERT INTO ……;
		INSERT INTO ……;
		UPDATE t_acount SET ……
	END
CREATE TRIGGER reorder_trigger AFTER UPDATE of n_amount ON t_inventory
	REFERENCING OLD ROW AS OROW, NEW ROW AS NROW
	FOR EACH ROW                             -- 行级触发器
	WHEN NROW.c_level <= 50 and OROW.c_level > 0
	BEGIN
		INSERT INTO ……
	END

2. 修改触发器

ALTER TRIGGER <触发器名> [{BEFORE|AFTER}]    -- 在执行处罚语句之前/之后激发触发器
	{[DELETE|INSERT|UPDATE OF [列名清单]]}   -- 触发器类型删除/新增/修改
	ON 表名|视图名
	AS
	BEGIN
		要执行的SQL语句
	END

3. 删除触发器

DROP TRIGGER <触发器名>[,<触发器名>]···

九、嵌入式SQL

嵌入到其他语言的SQL

EXEC SQL <SQL语句>
或
EXEC SQL <SQL语句> END-EXEC

1. SQL通信区

SQL通信区即:SQLCA,向诸语言传递SQL语句执行的状态信息。

2. 主变量

DECLARE语句

说明主变量示例

EXEC SQL BEGIN DECLARE SECTION;               -- 说明主变量
	char Msno[4],Mcno[3],givensno[5];
	int Mgrade;
	char SQLSTATE[6];
EXEC SQL END DECLARE SECTION;	

示例

EXEC SQL SELECT sname,age,sex
	INTO :Msno, :Mcno, :givensno
	FROM students
	WHERE sno = :Msno;
EXEC SQL INSERT
	INTO SC(Sno, Cno, Grade)
	VALUES(:Hsno, :Hcno, :Hgrade);

3. 游标

3.1. 定义游标

说明性语句,不立即执行。

EXEC SQL DELCLARE <游标名> CURSOR FOR
	<SELECT 语句>
END_EXEC

3.2. 打开游标

执行SELECT语句,游标处于活动状态,游标是个指针,此时指向结果第一行之前。

EXEC SQL OPEN <游标名> END_EXEC

3.3. 推进游标

游标推进一行,并把游标指向的行中值取出,送到共享变量中。

变量表即共享变量列表,例如: :Hsno, :Hcno, ···

EXEC SQL FETCH FROM <游标名> INTO <变量表> END_EXEC

3.4. 关闭游标

EXEC SQL CLOSE <游标名> END_EXEC

游标示例

十、存储过程

CREATE PROCEDURE 存储过程名(IN|OUT|IN OUT 参数1 数据类型, IN|OUT|IN OUT 参数2 数据类型···)
[AS]
BEGIN
	<SQL语句>
END

说明:

  1. IN: 为默认值,表示该参数为输入型参数,在过程体中值一般不变。
  2. OUT: 表示该参数为输入参数,可以作为存储过程的输出结果,供外部调用者使用。
  3. IN OUT: 既可以作为输入参数,也可以作为输出参数。

十一、事务

BEGIN TRANSACTION            -- 开始事务
END TRANSACTION              -- 结束事务
COMMIT                       -- 提交事务
ROLLBACK                     -- 回滚事务

示例

BEGIN TRANSACTION 
	read(A);                          -- 读A账户余额
	A = A - x;
	IF(A < 0) THEN
		print("金额不足,不能转账");
		ROLLBACK;                     -- 撤销该事务 
	ELSE
		write(A);                     -- 写入账户A余额
		read(B);
		B = B + 1;
		write(B);
		COMMIT;                       -- 提交事务
	ENDIF;
END TRANSACTION