SQL(Oracle环境)
结构化查询语言:(Structured Query Language)简称SQL,结构化查询语言是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统;同时也是数据库脚本文件的扩展名。结构化查询语言是高级的非过程化编程语言,允许用户在高层数据结构上工作。它不要求用户指定对数据的存放方法,也不需要用户了解具体的数据存放方式,所以具有完全不同底层结构的不同数据库系统, 可以使用相同的结构化查询语言作为数据输入与管理的接口。结构化查询语言语句可以嵌套,这使它具有极大的灵活性和强大的功能。
结构化查询语言包含5个部分:
一:数据查询语言(DQL:Data Query Language):
其语句,也称为“数据检索语句”,用以从表中获得数据,确定数据怎样在应用程序给出。保留字SELECT是DQL(也是所有SQL)用得最多的动词,其他DQL常用的保留字有WHERE,ORDER BY,GROUP BY和HAⅥNG。这些DQL保留字常与其他类型的SQL语句一起使用。
二:数据操作语言(DML:Data Manipulation Language):
其语句包括动词INSERT,UPDATE和DELETE。它们分别用于添加,修改和删除表中的行。也称为动作查询语言。
三:事务处理语言(TPL):
它的语句能确保被DML语句影响的表的所有行及时得以更新。TPL语句包括BEGIN TRANSACTION,COMMIT和ROLLBACK。
四:数据控制语言(DCL):
它的语句通过GRANT或REVOKE获得许可,确定单个用户和用户组对数据库对象的访问。某些RDBMS可用GRANT或REVOKE控制对表单个列的访问。
五:数据定义语言(DDL):
其语句包括动词CREATE和DROP。在数据库中创建新表或删除表(CREAT TABLE 或 DROP TABLE);为表加入索引等。DDL包括许多与人数据库目录中获得数据有关的保留字。它也是动作查询的一部分。
一:数据查询语言(DQL:Data Query Language):
1. SELECT 语法 select 列名称 from 表名称; 或 select * from 表名称;
例: select stuNo ,sex from t_stuDENT; select * from t_stuDENT;【pl/sql中不区分大小写】
2. SQL操作符【算术操作符 连接操作符 比较操作符 逻辑操作符 集合操作符】算术操作符 用于执行数值计算,由数值数据类型的列名,数值常量和连接它们的算术操作符组成。包括加(+)减(-)乘(*)除(/)等。
例:select stuNo+1 "学号",sex from t_stuDENT;
连接操作符 【 || 】连接操作符用于将多个字符串或数据值合并成一个字符串。通过使用连接操作符可以将表中。
例:select stuname|| '地址是:' || stuaddr from t_student;
比较运算符 比较操作符用于比较两个表达式的值。比较操作符包括 =、!=、<、>、<=、>=、BETWEEN…AND、IN、LIKE 和 IS NULL等
例:
select stuno "学号" from t_student where stuno>4;
select * from t_student where stuno<4;
select * from t_student where stuno=4;
select * from t_student where stuno!=4;
select * from t_student where stuno between 2 and 4;
select * from t_student where stuno in (2,6,44,12);
select * from t_student where stuname like '%年';--【%】表示0到多个字符【_】表示任意单个字符
select * from t_student where stuname like '_四';
select * from t_student where stuaddr is null;
select * from t_student where stuaddr is not null;--不为空用 is not null
逻辑操作符 逻辑操作符用于组合多个比较运算的结果以生成一个或真或假的结果。逻辑操作符包括与(AND)、或(OR)和非(NOT)。
例:
SELECT * FROM t_student WHERE birthDate > '10-5月-1988' AND birthDate < '26-9月-1989';
SELECT * FROM t_student WHERE sex='女' OR birthDate < '26-9月-1989';
SELECT * FROM t_student WHERE not sex='男';--select * from t_student where stuno not in (2,6,44,12);
集合操作符 集合操作符将两个查询的结果组合成一个结果
【 UNION UNION ALL INTERSECT MINUS】
union 是用来将多个select语句的结果集合进行合并处理。其中union会压缩各个结果集中的重复数据,而union all则不会。
intersect 是用来求两个集合的交集。
minus是用来从一个结果集中去除另一个集合中包含的部分。
例:
select stuno,stuname,stuaddr from t_student union select * from t_studentbak;--union all 会全部显示符合条件的选项,union 会只保留一条重复的记录
select stuno,stuname,stuaddr from t_student union all select * from t_studentbak;
select stuno,stuname,stuaddr from t_student intersect select * from t_studentbak;--就是求两个查询的交集
select stuno,stuname,stuaddr from t_student minus select * from t_studentbak;--是用来从一个结果集中去除另一个集合中包含的部分。
除了union all之外的所有集合操作符号都会进行默认排序和去除重复行,这需要占用一定的资源,只有union all回将数据以原始的方式呈现出来。所以在对oracle中进行性能优化时尽量使用union all 而不是 union。
对于每一个查询中,必须要具有相同的列的数目和列的类型,但没有必要使列名相同。如果类型不一样,可以使用类型转换函数来转换。注意这里oracle不会进行隐式转换,必须进行手动转换,如果列的个数不一样,可以使用替代列的方式来充当。
select stuno, stuname from t_student union all select 'a', pname from t_product;--使用填充列
SQL 操作符的优先级从高到低的顺序是:
算术操作符 --------最高优先级
连接操作符
比较操作符
NOT AND OR 逻辑操作符 --------最低优先级
3 一些应用
Desc 表名;--查看表结构
Set timing on[off];--打开时间开关
Select count(*) from 表名;--查看总记录数
Select distinct stuno,stuname form t_student;--取消重复行
Order by desc; --排序desc是降序。Asc是升序【默认】
Select table_name from user_tables;--查询一个用户下面有哪些表
Select to_char(birthdate,'yyyy:MM-dd') from t_student;--字段类型的转变
二:数据操作语言(DML:Data Manipulation Language):
其语句包括动词INSERT,UPDATE和DELETE。它们分别用于添加,修改和删除表中的行。也称为动作查询语言。
Insert语句: 1. 插入所有字段数据
insert into t_student values(0001,'张三',default,default,'河北');--插入全部字段
2. 仅插入部分字段
insert into t_student (stuno,stuName,birthdate)values(1001,'插入部分字段',default);--插入部分字段[当字段是主键或者是属性为 not null 时,该部分字段必须手动插入]
3. 插入空值
insert into t_student (stuno,stuName,birthdate)values(1002,'插入部分字段',null);--插入空值[当字段是主键或者是属性为 not null 时,该部分字段必须手动插入]
Update语句:
1. 修改一个字段
update t_student set birthDate='11-11月-1111' where stuno = 1001;--修改一个字段
2. 修改多个字段
update t_student set birthDate='11-11月-1101',stuname='插入部分' where stuno = 1001;--修改多个字段
3.修改含有null值得数据,不要用 =null; 正确的是 is null;
update t_student set birthDate='11-11月-1002',stuname='部分' where birthdate is null ;--修改含有null值得数据,不要用 =null; 正确的是 is null;
Delete语句:
先设保存点 【 savepoint a 】 删除操作之后 可以【 rollback to a 】
1. 删除一条记录
insert into t_student values(0009,'009','男',default,null);
insert into t_student values(0010,'010','女','26-11月-2013','上海紫竹');
savepoint a;
delete from t_student where stuno = 009;
Rollback to a;
2. 删除所有记录
delete from t_student;--删除所有的记录,表结构还在,写日志,可以恢复,速度慢
drop table t_student;--删除表的结构和数据[不能回滚]
truncate table t_student;--删除所有的记录,表结构还在,不写日志,无法找回删除的记录,速度较快[不能回滚]
三:事务处理语言(TPL):
事务:事务用于保证数据的一致性,它由一组相关的dml语句组成,该组的dml语句要么全部成功,要么全部失败。
例如:网上转账就是典型的要用事务处理,保证数据的一致性。
事务和锁:当执行事务操作的时(dml语句),oracle会在被作用的表上加锁,防止其它用户修改表
的结构,这里对我们用户来讲是非常重要的。
提交事务:使用commit语句可以提交事务。当执行了commit语句之后,会确认事务的变化、结束事务、删除保存点、释放锁,当使用commit语句结束事务之后,其它会话将可以查看到事务变化后的新数据。
回退事务:在回退事务之前, 我们先了解一下保存点(savepoint)的的概念和作用,保存点是事务中的一点。用于取消部分事务,当结束事务时,会自动的删除该事务所定义的 所有保存点。当执行rollback时,通过 指 定 保 存 点 可 以 回 退 到 指 定 的 点 。但 是,必 须 保 证 事 务 没 有 被 commit。
只读事务概念:只读事务是指只允许执行查询的操作,而不允许执行任何其它dml操作的事务,使用只读事务可以确保用户只能取得某时间点的数据。在设置了只读事务后,尽管其它会话可能会提交新的事务,但是只读事务将不会取得最新数据的变化,从而可以保证取得特定时间点的数据信息。
SET TRANSACTION READ ONLY类似于SERIALIZABLE事务隔离级别,在发布SET TRANSACTION READ ONLY起的所有SELECT语句,其结果均为同一个时间点一致,直至显式地发布了COMMIT或ROLLBACK命令或隐式提交(执行DDL)。这个时间点为SET TRANSACTION READ ONLY这个语句执行后的时间点。这个语句与SERIALIZABLE不同之处在于,在READ ONLY这个范围内,不能进行DML。
savepoint a;--设置保存点
rollback to a;--返回到保存点
set transaction read only;--设置只读事务
java程序中如何使用事务
conn.setAutoCommit(false);//关闭自动提交
在会话执行成功后进行事务提交
Conn.commit();//提交事务
在发生异常时。在catch块中进行回滚,返回到语句执行之前的状态
Conn.rollback();//异常回滚
四:数据控制语言(DCL):
它的语句通过GRANT或REVOKE获得许可,确定单个用户和用户组对数据库对象的访问。某些RDBMS可用GRANT或REVOKE控制对表单个列的访问。
在oracle中一个用户只能操作查看本用户下的数据方案。若要允许其他用户可以操控你用户下的数据,必须得赋予其权限。

conn system/m123456@orcl;
drop user msy cascade;--cascade表示级联删除,在该用户下的所有数据一并删除
create user msy identified by msy;--创建用户
grant connect,resource to msy;--给msy用户赋予权限
conn msy/msy@orcl;--登陆msy用户
select * from scott.emp;--不能查看,没有权限需要登陆scott用户然后赋值给msy
conn scott/tiger@orcl;
grant select,update on emp to msy;
conn msy/msy@orcl;
select * from scott.emp;--在msy用户下查看scott用户的emp表
update scott.emp set sal=801 where empno=7369;--在msy用户下修改scott用户的emp表的记录
revoke select on emp from msy;--在scott用户下回收权限
希望msy用户可以去查询scott的emp表/还希望msy可以把这个权限继续给别人。
【对象权限】
grant select on scott.emp to msy with grant option; --msy用户可以把该权限赋予给其他用户
【系统权限】
system给msy权限时:
grant connect to msy with admin option;--msy用户可以把该权限赋予给其他用户
结论:对象权限级联回收;系统权限不级联回收;
五:数据定义语言(DDL):
其语句包括动词CREATE和DROP。在数据库中创建新表或删除表(CREAT TABLE 或 DROP TABLE);为表加入索引等。DDL包括许多与人数据库目录中获得数据有关的保留字。它也是动作查询的一部分。
CREATE:
建表空间:CREATE TABLESPACE tablespacename
DATAFILE ‘filename’ [SIZE integer [K|M]]
[AUTOEXTEND [OFF|ON]];
建表:
create table t_studentbak(stuNo char(4) primary key, stuName varchar(20) not null, stuAddr varchar2(100));
建用户:create user msy identified by msy;--创建用户
ALTER:
alter table t_stu add(classId number(4));--添加字段,添加都最后一个字段
alter table t_stu modify(classId number(7));--修改字段长度
alter table t_stu modify(classId char(4));--修改字段类型[修改时不能有数据,不建议做]
alter table t_stu drop column classId;--删除一个字段【删除后其他的字段顺序会变,不建议做】
rename t_stu to t_stu1;--修改表名
删除主键: Alter table tabname drop primary key(col)
DROP:
删除表: drop table t_stu1;
删除表空间:drop tablespace tabname
删除索引:drop index idxname
删除视图:drop view viewname