如果编译原理学得不错的话,根据sql的文法就可以写个程序来解析了,最简单的莫过于自顶向下递归解析。
sql数据定义:表定义,更改语句,删除语句和模式定义
sql创建语句
1
2
create_statement :
create { role_def | table_def | view_def | type_def | func_def | index_def | trigger_def | sequence_def }
sql表定义的文法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
table_def :
CREATE [ TEMPORARY | LOCAL TEMPORARY | GLOBAL TEMPORARY ] TABLE table_name '(' table_content_source ')'
[ ON COMMIT DELETE ROWS | ON COMMIT PRESERVE ROWS | ON COMMIT DROP ]
table_content_source :
table_element ',' ... | column_name ',' ... AS select_query [ WITH NO DATA | WITH DATA ]
table_element :
column_name data_type [ column_option ...]
| CONSTRAINT constraint_name table_constraint_type
| column_name WITH OPTIONS '(' column_option ',' ... ')'
| LIKE table_name
| column_name SERIAL
| column_name BIGSERIAL
table_constraint_type :
UNIQUE '(' column_name ',' ... ')'
| PRIMARY KEY '(' column_name ',' ... ')'
| FOREIGN KEY '(' column_name ',' ... ')' REFERENCES table_name [ '(' column_name ',' ... ')' ] [ match_options ] [ ref_actions ]
column_option :
DEFAULT default_value
| [ constraint_name ] column_constraint_type
| GENERATED ALWAYS AS IDENTITY [ '(' serial_parameters ')' ]
| AUTO_INCREMENT
column_constraint_type :
NOT NULL | NULL | UNIQUE | PRIMARY KEY
| REFERENCES table_name [ '(' column_name ',' ... ')' ] [ match_options ] [ ref_actions ]
serial_parameters :
[ START WITH nonzero ]
| [ RESTART | RESTART WITH subquery
| RESTART WITH nonzero ]
| [ INCREMENT BY nonzero ]
| [ MINVALUE nonzero | NOMINVALUE ] | [ MAXVALUE nonzero | NOMAXVALUE ] | [ CACHE nonzero ] | [ CYCLE | NONCYCLE ]
match_options :
MATCH { FULL | PARTIAL | SIMPLE }
ref_actions :
ON UPDATE { NO ACTION | CASCADE | RESTRICT | SET NULL | SET DEFAULT }
| ON DELETE { NO ACTION | CASCADE | RESTRICT | SET NULL | SET DEFAULT }
| { ON DELETE | ON UPDATE } { NO ACTION | CASCASDE | RESTRICT | SET NULL | SET DEFAULT }
| { ON UPDATE | ON DELETE } { NO ACTION | CASCASDE | RESTRICT | SET NULL | SET DEFAULT }
sql表的标识列
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
CREATE TABLE table_name table_content_source
table_content_source :
'(' table_element ',' ... ')'
| [ '(' column_name ',' ... ')' ] AS select_query [ WITH NO DATA | WITH DATA ]
table_element :
column_name data_type [ column_option ...]
| column_name WITH OPTIONS '(' column_option ',' ... ')'
column_option :
DEFAULT default_value
| GENERATED ALWAYS AS IDENTITY [ '(' serial_parameters ')' ]
| AUTO_INCREMENT
serial_parameters :
[ START WITH nonzero ]
| [ RESTART | RESTART WITH subquery
| RESTART WITH nonzero ]
| [ INCREMENT BY nonzero ]
| [ MINVALUE nonzero | NOMINVALUE ]
| [ MAXVALUE nonzero | NOMAXVALUE ]
| [ CACHE nonzero ]
| [ CYCLE | NONCYCLE ]
sql表的限制
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
CREATE TABLE table_name table_content_source
table_content_source :
'(' table_element ',' ... ')'
table_element :
column_name data_type [ column_option ... ]
| CONSTRAINT constraint_name table_constraint_type
| column_name WITH OPTIONS ( column_option ',' ... )
table_constraint_type :
UNIQUE ( column_name ',' ...)
| PRIMARY KEY '(' column_name ',' ... ')'
| FOREIGN KEY '(' column_name ',' ... ')' REFERENCES table_name
[ '(' column_name ',' ... ')' ] [ match_options ] [ ref_actions ]
column_option :
[ constraint_name ] column_constraint_type
column_constraint_type :
NOT NULL
| NULL
| UNIQUE
| PRIMARY KEY
| REFERENCES table_name [ '(' column_name ',' ... ')' ] [ match_options ] [ ref_actions ]
match_options :
MATCH { FULL | PARTIAL | SIMPLE }
ref_actions :
ON UPDATE { NO ACTION | CASCASDE | RESTRICT | SET NULL | SET DEFAULT }
| ON DELETE { NO ACTION | CASCASDE | RESTRICT | SET NULL | SET DEFAULT }
| { ON DELETE | ON UPDATE } { NO ACTION | CASCASDE | RESTRICT | SET NULL | SET DEFAULT }
| { ON UPDATE | ON DELETE } { NO ACTION | CASCASDE | RESTRICT | SET NULL | SET DEFAULT }
sql创建表索引
1
2
3
index_def :
[ UNIQUE | CLUSTERED ] INDEX ident ON qname '(' ident ',' ... ')'
| CLUSTER ident ON qname '(' ident ',' ... ' )
sql创建表的视图
1
view_def : CREATE VIEW view_name [ '(' column_name ',' ... ')' ] AS select_query [ WITH CHECK OPTION ]
sql更改语句
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
alter_statement :
ALTER TABLE qname ADD [ COLUMN ] add_table_element
| ALTER TABLE qname ALTER alter_table_element
| ALTER TABLE qname DROP drop_table_element
| ALTER TABLE qname SET READ ONLY
| ALTER USER ident passwd_schema
| ALTER USER ident RENAME TO ident
| ALTER USER SET
[ ENCRYPTED | UNENCRYPTED ] PASSWORD string USING OLD PASSWORD string
| ALTER SEQUENCE name
[ RESTART [ WITH [ poslng | subqeury ] ] ]
[ INCREMENT BY nonzerolng ]
[ MINVALUE nonzerolng | NO MINVALUE ]
[ MAXVALUE nonzerolng | NO MAXVALUE ]
[ CACHE nonzerolng ]
[ [ NO ] CYCLE ]
| ALTER SEQUENCE qname opt_alt_seq_params
alter_table_element : [ COLUMN ] ident SET [ NOT ] NULL | [ COLUMN ] ident SET DEFAULT [ default_value ]
drop_table_element : [ COLUMN ] ident [ RESTRICT | CASCADE ] | CONSTRAINT ident drop_action
constraint_type :
UNIQUE '(' column_name ',' ... ')'
| PRIMARY KEY '(' column_name ',' ... ')'
| FOREIGN KEY '(' column_name ',' ... ')' PEFERENCES table_name [ '(' column_name ',' ... ')' ]
[ MATCH [ FULL | PARTIAL | SIMPLE ] ] [ ref_action ]
| CHECK '(' search_condition ')'
ref_action : ON { DELETE | UPDATE } { NO ACTION | CASCADE | RESTRICT | SET NULL | SET DEFAULT }
passwd_schema : SET SCHEMA ident | WITH [ ENCRYPTED | UNENCRYPTED ] PASSWORD string [ SET SCHEMA ident ]
sql删除语句
1
2
3
4
5
6
7
8
9
10
11
12
13
drop_statement :
DROP TABLE qname [ RESTRICT | CASCADE ]
| DROP FUNCTION qname '(' [ data_type ',' ... ] ')' [ RESTRICT | CASCADE ]
| DROP PROCEDURE qname '(' [ data_type ',' ... ] ')' [ RESTRICT | CASCADE ]
| DROP ALL FUNCTION qname [ RESTRICT | CASCADE ]
| DROP ALL PROCEDURE qname [ RESTRICT | CASCADE ]
| DROP VIEW qname [ RESTRICT | CASCADE ]
| DROP ROLE qname
| DROP USER ident
| DROP INDEX qname
| DROP CLUSTER qname
| DROP TRIGGER qname
| DROP SEQUENCE qname
sql创建模式
1
2
3
4
5
6
7
8
9
10
schema :
CREATE SCHEMA schema_name_clause
[ DEFAULT CHARACTER SET ident ]
[ PATH schema_name ',' ... ]
[ schema_element ... ]
| DROP SCHEMA qname drop_action
schema_name_clause : ident | [ ident ] AUTHORIZATION
ident schema_element : grant | revoke | create_statement | drop_statement | alter_statement
sql用户验证
1
2
3
4
5
6
user_stmt :
CREATE USER "user_name" WITH PASSWORD 'user_password' NAME 'name' SCHEMA "schema_name"
| ALTER USER "user_name" [ WITH [ ENCRYPTED | UNENCRYPYED ] PASSWORD 'user_password' ] [ SET SCHEMA "new_schema_name" ]
| ALTER USER SET [ ENCRYPTED | UNENCRYPYED ] PASSWORD 'new_password' USING OLD PASSWORD 'cur_password'
| DROP USER "user_name"
| ALTER USER "user_name" RENAME TO "new_user_name"
sql角色
1
2
3
4
5
role_def :
ROLE qname [ WITH ADMIN grantor ]
| USER ident WITH [ ENCRYPTED | UNENCRYPTED ] PASSWORD string NAME string SCHEMA ident
grantor : CURRENT_USER | CURRENT_ROLE
sql授权
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
grant :
GRANT privileges TO grantees [ WITH GRANT OPTION ] [ WITH ADMIN grantor ]
| GRANT authid_list TO grantees [ WITH ADMIN OPTION ] [ WITH ADMIN grantor ]
revoke :
REVOKE [ GRANT OPTION FOR ] privileges FROM grantees [ FROM grantor ]
| REVOKE [ ADMIN OPTION FOR ] authid ',' ... FROM grantees [ FROM grantor ]
grantor : CURRENT_USER | CURRENT_ROLE
privileges : object_privileges ON TABLE [ ident | ident ]
object_privileges : ALL [ PRIVILEGES ] | operation ',' ...
operation : INSERT | DELETE | [ UPDATE | SELECT | REFERENCES ] opt_column_list
| EXECUTE grantees : [ PUBLIC | authid ] ',' ...
数据操作:1.表更新 2.表操作 3.批量输入输出
sql表更新
1
2
3
4
5
6
7
8
INSERT INTO table_name [ '(' column_name ',' ... ')' ] [ VALUES '(' value_expression ',' ... ')' ',' ... | select_query ]
UPDATE table_name SET assignment ',' ... [ WHERE search_condition ]
assignment : column_name '=' ( scalar_exp | search_condition | NULL )
DELETE FROM table_name [ WHERE search_condition ]
sql表join操作
1
2
3
4
5
6
7
8
9
10
11
12
13
14
table_reference : simple_table
| '(' select_query ')' [ AS ] table_name [ '(' column_name ',' ... ')' ]
| '(' select_query ')'
| joined_table | '(' joined_table ')' [ AS ] table_name [ '(' column_name ',' ... ')' ]
joined_table : '(' joined_table ')'
| table_reference { CROSS | NATURAL } JOIN table_reference
| table_reference { JOIN | UNIONJOIN } table_reference join_spec
| table_reference join_type JOIN table_reference join_spec
| table_reference NATURAL join_type JOIN table_reference
join_spec : ON search_condition | USING '(colunm_name ' , ' ...' ) '
join_type : INNER | { LEFT | RIGHT | FULL } [ OUTER ]
sql表select操作
1
2
3
4
5
6
7
8
select_query :
SELECT [ ALL | DISTINCT ] ( '*' | column_name ',' ... ) [ INTO column_name ',' ... ]
[ FROM table_name ',' ... ]
[ WHERE search_condition ]
[ GROUP BY column_name ',' ... ]
[ HAVING search_condition ]
[ ORDER BY ordering_spec ',' ... ]
[ LIMIT posint ] [ OFFSET posint ]
sql表with操作
1
2
3
with_clause : WITH with_element ',' ... select_query
with_element : table_name '(' column_name ',' ... ')' AS '(' select_query ')'
sql表各种其他类型的操作
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
predicate :
comparison_predicate
| between_predicate
| like_predicate
| test_for_null
| in_predicate
| all_or_any_predicate
| existence_test
| '(' predicate ')'
comparison_predicate :
pred_expr COMPARISON pred_expr
| pred_expr = pred_exp between_predicate :
pred_expr [ NOT ] BETWEEN [ SYMMETRIC | ASYMMETRIC ] pred_expr AND pred_expr like_predicate :
pred_expr [ NOT ] LIKE atom_expr
test_for_null :
column_name IS [ NOT ] NULL
in_predicate :
pred_expr [ NOT ] IN '(' element_name ',' ... ')' all_or_any_predicate :
pred_expr COMPARISON { ANY | ALL | SOME } subquery
existence_test :
[ NOT ] EXISTS subquery pred_expr :
scalar_expr
| predicate
atom_expr :
[ '(' ] atom [ ')' ]
| [ '(' ] atom [ ')' ] ESCAPE string
| '?'
sql表string类型的操作
1
2
3
4
5
6
7
string_funcs :
SUBSTRING ( scalar_expr FROM scalar_expr FOR scalar_expr ')'
| SUBSTRING '(' scalar_expr ',' scalar_expr ',' scalar_expr ')'
| SUBSTRING '(' scalar_exprFROM scalar_expr ')'
| SUBSTRING '(' scalar_expr ',' scalar_expr ')'
| SUBSTRING '(' scalar_expr int_value scalar_expr ')'
| scalar_expr '||' scalar_expr
sql过程定义
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
func_def :
CREATE PROCEDURE qname '(' [ paramlist ] ')' EXTERNAL NAME external_function_name
| CREATE PROCEDURE qname '(' [ paramlist ] ')' routine_body
routine_body :
procedure_statement
| BEGIN procedure_statement_list END
| BEGIN ATOMIC procedure_statement_list END
procedure_statement :
transaction_statement
| update_statement
| schema
| grant
| revoke
| create_statement
| drop_statement
| alter_statement
| declare_statement
| set_statement
| control_statement
sql程序模块定义:1.过程定义 2.函数定义 3.触发器定义 4.变量定义 5.控制流
sql函数定义
1
2
3
4
5
6
7
8
unc_def :
FUNCTION qname '(' [ paramlist ] ')' RETURNS func_data_type EXTERNAL NAME external_function_name
| FUNCTION qname '(' [ paramlist ] ')' RETURNS func_data_type routine_body
| AGGREGATE qname '(' [ paramlist ] ')' RETURNS func_data_type EXTERNAL NAME external_function_name
func_data_type :
TABLE '(' column data_type ',' ... ')'
| data_type type_def : TYPE qname EXTERNAL NAME ident
sql触发器定义
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
trigger_def : TRIGGER qname trigger_action_time trigger_event ON ident opt_referencing_list triggered_action
trigger_action_time : BEFORE | AFTER
trigger_event : INSERT | DELETE | UPDATE | UPDATE OF ident ',' ...
opt_referencing_list : [ REFERENCING old_or_new_values_alias ... ]
old_or_new_values_alias :
OLD [ ROW ] [ AS ] ident | NEW [ ROW ] [ AS ] ident
| OLD TABLE [ AS ] ident | NEW TABLE [ AS ] ident
triggered_action : opt_for_each [ WHEN search_condition ] triggered_statement
opt_for_each : /*default for each statement*/ | FOR EACH ROW | FOR EACH STATEMENT
triggered_statement :
trigger_procedure_statement
| BEGIN ATOMIC trigger_procedure_statement_list END
trigger_procedure_statement : transaction_statement | update_statement | grant | revoke | declare_statement | set_statement | control_statement | select_statement_single_row
sql变量定义
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
declare_statement :
DECLARE
| DECLARE table_def
variable_list :
ident ',' ... data_type
| variable_list ',' ident ',' ... data_type
set_statement :
SET ident '=' simple_atom
| SET SESSION AUTHORIZATION ident
| SET SCHEMA ident
| SET user '=' ident
| SET ROLE ident
| SET TIME ZONE LOCAL
| SET TIME ZONE interval_expression
user : [ USER | SESSION_USER | CURRENT_USER ]
sql控制流
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
control_statement :
CALL func_ref
| CALL routine_name '(' argument_list ')'
| while_statement
| if_statement
| case_statement
| RETURN return_value
case_statement :
CASE scalar_exp when_statement ... [ ELSE procedure_statement_list ] END CASE
| CASE when_search_statement ... [ ELSE procedure_statement_list ] END CASE
when_statement : WHEN scalar_exp THEN procedure_statement_list
when_search_statement : WHEN search_condition THEN procedure_statement_list
if_statement : IF search_condition THEN procedure_statement_list if_opt_else END IF
if_opt_else :
/* empty */
| ELSE procedure_statement_list
| ELSEIF search_condition THEN procedure_statement_list if_opt_else
while_statement :
[ ident ':' ] WHILE search_condition DO procedure_statement_list END WHILE [ ident ]
return_statement : RETURN return_value
return_value :
select_no_parens_orderby
| search_condition
| TABLE '(' select_no_parens_orderby ')' | NULL
SQL标准定义了三种弱一致性级别以及一致性的可串行化级别。违反可串行性的三种现象:不可重复读、读脏数据和读幻想。定义如下:
不可重复读 (nonrepeatable read)。一个事务在执行过程中对同一对象读两次。第二次得到不同的值,尽管在此期间该事务并没有改变其值。
读脏数据 (dirty read)。事务读由另一个尚未提交的事务所写的值。
读幻象 (phantom read)。事务重新执行返回结果为满足某搜索条件的行集合的查询,发现满足条件的行集合已经改变,这是因为令一个事务最近提交了。
四种标准SQL隔离级别的定义:
隔离级别 | 读脏数据 | 不可重复读 | 幻象
读未提交 | 可能 可能 可能
读已提交 | 可能 可能 可能
重复读 | 可能 可能 可能
可串行化 | 不可能 不可能 不可能