SQL语句有哪些常见的分类
Tags: DCLDDLDMLDQLESSPGSCSTCL分类
SQL(Structure Query Language,结构化查询语言)是一种在关系型数据库中定义和操纵数据的标准语言。关系型数据库采用SQL作为客户端程序与数据库服务器间沟通的标准接口。客户端发送SQL指令到服务器端,服务器端执行相关的指令并返回其查询的结果。在数据库服务器端执行的SQL指令可以实现各种数据库操作和管理功能,例如:数据的查询和更新(包括添加、修改和删除数据)操作;创建、修改和删除各种数据库对象(如数据表、视图、索引等);数据库用户账户管理、权限管理等。
关系数据语言的共同特点是:语言具有完备的表达能力,是非过程化的集合操作语言,功能强,能够嵌入高级语言中使用。下表给出了所有SQL语句的分类情况:
分类 | 简介 | 示例 |
---|---|---|
DML | 数据操纵语言(Data Manipulation Language,DML):用于改变数据库数据,包括插入新数据的INSERT;删除不需要数据的DELETE;修改存在的数据的UPDATE;合并新旧数据的MERGE。数据更新包括数据的插入、修改和删除等操作,数据更新操作具有一定的风险性,在其执行过程中,DBMS必须保证数据的一致性,以确保数据有效。 | UPDATEINSERTDELETEMERGESELECT ... FOR UPDATE |
DDL | 数据定义语言(Data Definition Language,DDL):用于建立、修改和删除数据库对象,作用就是定义数据的格式和形态。例如CREATE TABLE可以建立表,ALTER TABLE语句则可对表结构进行修改,DROP TABLE语句用来删除某个表,TRUNCATE命令用来删除数据内容,需要注意的是,DDL语句会自动提交事务。在建立数据库时用户首先要使用的就是DDL语句。 | CREATE TABLE/INDEXALTER TABLE/INDEXDROP TABLE/INDEXTRUNCATE TABLE |
DCL | 数据控制语言(Data Control Language,DCL):用于执行权限授予和权限收回操作,包括GRANT和REVOKE两条命令。其中,GRANT命令是给用户或者角色授予权限,REVOKE命令则是收回用户或角色所具有的权限。DCL语句会自动提交事务,在应用开发层面很少用到。 | GRANTREVOKE |
DQL | 数据查询语言(Data Query Language,DQL):即SELECT语句,用于用户检索数据库数据。在所有SQL语句中,SELECT语句的功能和语法最复杂,最灵活。 | SELECT |
TCL | 事务控制语言(Transactional Control Language,TCL):用于维护数据的一致性,包括COMMIT、ROLLBACK、SAVEPOINT等语句。其中,COMMIT语句用于确认和提交已经进行的数据库改变;ROLLBACK用于撤销已经进行的数据库改变;SAVEPOINT语句则用于设置保存点,以取消部分数据库改变,ROLLBACK命令会结束一个事务,但ROLLBACK TO SAVEPOINT不会;SET TRANSACTION设定一个事务的属性(例如,事务的隔离级别);SET CONSTRAINT指定是在每个DML语句之后、还是在事务提交后,执行可延迟完整性约束检查。COMMIT是COMMIT WORK的简写,ROLLBACK是ROLLBACK WORK的简写。 | COMMITROLLBACKSAVEPOINTROLLBACK TO SAVEPOINTSET TRANSACTIONSET CONSTRAINT |
SCS | 会话控制语句(Session Control Statement,SCS):用于动态修改当前用户会话的属性,在应用开发层面极少用到。“ALTER SESSION”用于改变当前会话设置。“SET ROLE”用于启用或禁用角色。系统控制语句(System Control Statement,SCS):用于更改数据库实例的属性。唯一的系统控制语句是ALTER SYSTEM。它能更改系统设置,例如,共享服务器的最小数目、终止一个会话、和执行其他系统级任务。ALTER SYSTEM语句不会隐式提交当前事务。 | ALTER SESSIONSET ROLEALTER SYSTEM |
ESS | 嵌入式SQL语句(Embedded SQL Statements,ESS):用于将DDL、DML、和事务控制语句混入过程化语言程序中。它们和Oracle预编译器一起使用。嵌入式的SQL是一种在过程化语言应用程序中纳入SQL的方法。另一种方法是使用一个程序API,如ODBC(Open Database Connectivity,开放式数据库连接)或JDBC(Java Database Connectivity,Java数据库连接)。嵌入式SQL语句主要包含以下几种:l 定义、分配、和释放游标(DECLARE CURSOR、OPEN、CLOSE)l 指定一个数据库,并连接到该数据库(DECLARE DATABASE、CONNECT)l 初始化描述符(DESCRIBE)l 指定如何处理错误和警告(WHENEVER)l 分析并运行SQL语句(PREPARE、EXECUTE、EXECUTE IMMEDIATE)l 从数据库中检索数据(FETCH) | OPENCLOSECONNECTDESCRIBEWHENEVERPREPAREEXECUTEFETCH |
其中,TCL、SCS和ESS主要是针对Oracle数据库的分类,而DML、DDL、DCL、DQL是通用的分类。
真题1、如果有两个事务,同时对数据库中同一数据进行操作,那么不会引起冲突的操作是()
A、其中有一个是DELETE B、一个是SELECT,另一个是UPDATE
C、两个都是SELECT D、两个都是UPDATE
答案:C。
如果有两个事务,同时对数据库中同一数据进行操作,那么除SELECT外,其余SQL语句不能同时使用,否则会引起冲突。
本题中,对于选项A,若两个操作都是DELETE操作,则其中一个会话就会发生阻塞。所以,选项A错误。
对于选项B,若SELECT的数据恰好是UPDATE的数据,则查询到的数据就会不一致。所以,选项B错误。
对于选项C,2个SELECT语句不会引起冲突。所以,选项C正确。
对于选项D,原理同选项A的DELETE。所以,选项D错误。
所以,本题的答案为C。
真题2、SQL语言集数据查询、数据操纵、数据定义和数据控制功能于一体,语句INSERT、DELETE、UPDATE实现()功能
A、数据查询 B、数据控制 C、数据定义 D、数据操纵
答案:D。
真题3、下列说法错误的是()
A、ALTER TABLE语句可以添加字段 B、ALTER TABLE 语句可以删除字段
C、UPDATE TABLE语句可以修改字段名称 D、ALTER TABLE语句可以修改字段数据类型
答案:C。
在表中添加列的方法如下:
1 | ALTER TABLE table_name ADD column_name datatype; |
删除表中的列的方法如下:
1 | ALTER TABLE table_name DROP COLUMN column_name; |
改变表中列的数据类型的方法如下:
1 | ALTER TABLE table_name MODIFY COLUMN column_name datatype; |
而UPDATE语句只能更改表中的数据,不能用来更改表的结构。
所以,本题的答案为C。
真题4、SQL语言中删除一个表的指令是()
A、DROP TABLE B、DELETE TABLE C、DESTROY TABLE D、REMOVE TABLE
答案:A。
本题中,对于选项A,在SQL语言中,DROP命令用于删除表定义及该表的所有数据、索引、触发器、约束和权限规范,所以,选项A正确。
对于选项B,DELETE命令的作用是删除表中的数据。TRUNCATE TABLE在功能上与不带WHERE子句的DELETE语句相同:二者均删除表中的全部行,但TRUNCATE比DELETE速度快,且使用的系统和事务日志资源少。所以,选项B不正确。
对于选项C与选项D,不存在DESTORY、REMOVE命令。所以,选项C和选项D不正确。
所以,本题的答案为A。
真题5、下面不属于SQL语句的分类的是()
A、数据查询语言(DQL) B、数据定义语言(DDL) C、事务控制语言(TCL) D、数据插入语言(DIL)
答案:D。
真题6、Oracle中的提交有哪几种类型?
答案:在数据库的插入、删除和修改操作时,只有当事务在提交到数据库时才算完成。在Oracle数据库中,在事务提交前,只有操作数据库的这个人才能有权看到所做的事情,别人只有在最后提交完成后才可以看到。因为Oracle数据库的默认事务隔离级别是提交读(Read Committed)。提交数据有三种类型:显式提交、隐式提交及自动提交。下面分别说明这三种类型。
(1) 显式提交
用COMMIT命令直接完成的提交为显式提交。其格式为:
SQL>COMMIT;
(2) 隐式提交
用SQL命令间接完成的提交为隐式提交。这些命令包括:
ALTER,AUDIT,COMMENT,CONNECT,CREATE,DISCONNECT,DROP,EXIT,GRANT,NOAUDIT,QUIT,REVOKE,RENAME。
(3) 自动提交
若把AUTOCOMMIT设置为ON,则在插入、修改、删除语句执行后,系统将自动进行提交,这就是自动提交。其格式为:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | SQL>SET AUTOCOMMIT ON; SYS@PROD1> set auto SP2-0281: autocommit missing set option Usage: SET AUTO[COMMIT] { OFF | ON | IMM[EDIATE] | n } SYS@PROD1> show auto autocommit OFF SCOTT@PROD1> set autocommit on SCOTT@PROD1> show autocommit autocommit IMMEDIATE |
OFF为默认值,表示关闭自动提交;ON和IMM都表示打开自动提交,二者没有区别;n表示成功执行n条DML操作后再自动提交。n不能小于0,也不能大于20亿(2,000,000,000)。注意,这里不是一个DML语句所影响的行数,而是DML语句的个数。
需要注意的是,无论AUTOCOMMIT设置为何值,当退出SQL*Plus时,当前会话所有的DML操作所改变的数据都会被提交。
实验过程如下:
1、数据库版本
1 2 3 4 5 | SQL> select * from v$version where rownum=1; BANNER -------------------------------------------------------------------------------- Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production |
2、查看sqlplus的控制是否自动提交的参数autocommit。无论AUTOCOMMIT设置为何值,当退出SQL*Plus时,当前会话所有的DML操作所改变的数据都会被提交。
1 2 3 4 5 6 7 8 9 | SQL> show user USER is "SCOTT" Usage: SET AUTO[COMMIT] { OFF | ON | IMM[EDIATE] | n } SQL> SQL> show autocommit autocommit OFF |
3、产生DML不提交
1 2 3 4 5 6 | SQL> create table t_commit_lhr(a number); SQL> insert into t_commit_lhr values(1); 1 row created. |
退出当前会话
1 2 3 | Disconnected from Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production With the Partitioning, OLAP, Data Mining and Real Application Testing options |
4,若中途退出未提交DML的SQLPLUS会话,则自动提交DML事务
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | [oracle@seconary ~]$ sqlplus scott/system SQL*Plus: Release 11.2.0.1.0 Production on Sat Oct 17 21:45:13 2015 Copyright (c) 1982, 2009, Oracle. All rights reserved. Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production With the Partitioning, OLAP, Data Mining and Real Application Testing options SQL> select * from t_commit_lhr; A ---------- 1 |
5,调整自动提交为提交,可见autocommit为on,即不用显式再发起命令commit
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 | SQL> show autocommit autocommit OFF SQL> set autocommit on SQL> show autocommit autocommit IMMEDIATE SQL> select * from t_commit_lhr; no rows selected SQL> insert into t_commit_lhr values(2); 1 row created. Commit complete. SQL> host [oracle@seconary ~]$ sqlplus scott/system SQL*Plus: Release 11.2.0.1.0 Production on Sat Oct 17 21:53:55 2015 Copyright (c) 1982, 2009, Oracle. All rights reserved. Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production With the Partitioning, OLAP, Data Mining and Real Application Testing options SQL> select * from t_commit_lhr; A ---------- 1 2 |
连续在当前SQLPLUS会话中运行5个DML语句后会自动提交
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 46 47 48 49 50 51 52 53 54 55 56 | SQL> set autocommit 5 SQL> show autocommit AUTOCOMMIT ON for every 5 DML statements [oracle@seconary ~]$ sqlplus scott/system SQL> truncate table t_commit_lhr; Table truncated. SQL> select * from t_commit_lhr; no rows selected SQL> insert into t_commit_lhr select level from dual connect by level<=6; 6 rows created. SQL> host [oracle@seconary ~]$ sqlplus scott/system SQL*Plus: Release 11.2.0.1.0 Production on Sat Oct 17 21:58:41 2015 Copyright (c) 1982, 2009, Oracle. All rights reserved. Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production With the Partitioning, OLAP, Data Mining and Real Application Testing options SQL> select * from t_commit_lhr; no rows selected SQL> insert into t_commit_lhr values(1); 1 row created. SQL> insert into t_commit_lhr values(1); 1 row created. SQL> insert into t_commit_lhr values(1); 1 row created. SQL> insert into t_commit_lhr values(1); 1 row created. SQL> insert into t_commit_lhr values(1); 1 row created. Commit complete. SQL> |
第5条insert执行完毕后出现Commit complete.提示。