首页 > WEB开发 > 数据库 > Oracle Select语句深入学习
2014
11-17

Oracle Select语句深入学习

8、Select语句练习

Demo1:找到员工表(emp)中工资最高的前三名:

03. Oracle Select语句深入学习6561

Demo2:找到员工表中薪水大于本部门平均薪水的员工

03. Oracle Select语句深入学习6590

Demo3:统计每年入职的员工个数

03. Oracle Select语句深入学习6610

三、DML:insert、update、delete

  • DML(Data Manipulation Language):数据操作语言,包括insert、update、delete。select语句有时被划分到DML。
  • 事务:由完成一项工作的多条DML语句组成,要么都执行、要么都不执行。有ACID特性。

1、insert

语法:insert into tableName [(column[,column...])] values(value[,value...])

常见用法可以参考《SQL入门》一文,在此补充几点:

  • 插入sysdate表示数据库系统的当前日期时间
  • 在insert语句中使用子查询可以从其他表中拷贝数据,子查询中的值列表应与insert中的列名对应(替代values子句):

03. Oracle Select语句深入学习6958

  • 在SQL中使用 & ,其作用跟PreparedStatement中”?”占位符的作用类似。

03. Oracle Select语句深入学习7006

2、update

语法:update tableName set column=value [, column=value, ...] where condition;

  • 在update语句中使用子查询,使得当前更新基于表中其他的数据(或另一个表中的数据):

03. Oracle Select语句深入学习7137

3、delete

语法:delete [from] table [where condition]

需要注意delete和truncate的区别:

  • delete逐条删除,truncate 先摧毁,再重建
  • (☆)delete是DML(可以rollback),truncate是DDL(不可以rollback)
  • delete不会释放空间(undo空间),truncate会
  • delete会产生碎片,truncate不会
  • Oracle中,delete的效率要高于truncate。

4、事务

1)Oracle中事务开始和结束的标志

Oracle中,事务以第一条DML语句执行作为开始,无需手动开启事务。事务的结束有如下情形:

  • 显示:commit、rollback
  • 隐式提交:DDL语言、DCL语言、exit(事务正常退出)
  • 隐式回滚:非正常退出, 掉电,宕机

2)保存点(savepoint)

① 创建保存点:savepoint A;

② 回滚到保存点A:rollback to savepoint A

将事务回滚到保存点时,在该保存点之后所作的全部更改都将被撤消。

3)数据库的隔离级别

关于隔离级别的详细内容参考《SQL入门》一文。

  • Oracle中支持的两种事务隔离级别:Read Commited、Serializable。Oracle默认的事务隔离级别为:Read Commited。
  • MySql支持四种事务隔离级别,其默认事务隔离级别为Repeatable Read。

四、一些总结

1、SQL语句的优化原则

1)尽量使用列名代替 *

使用列名可以减少从*到列名的解析。

2)where解析的顺序:从右到左

因此多个过滤条件用and连接时,把错误可能最大的条件尽量靠右;用or连接时,把为正确可能最大的条件尽量靠右。

3)尽量使用Where子句而不是Having子句(☆)

Where子句:先过滤再分组,因此可以减轻后面的工作量。Having子句:先分组再过滤,此时分组正对的是所有记录,因此效率比Where子句低。但是在Where子句中不能使用分组函数,因此只有过滤条件中有分组函数时再去使用Having子句。

4)尽量不要使用集合运算

见集合运算的最后一个Demo。

2、关于Oracle中空值(null)的总结

1)包含空值的数学表达式的值都为空值。

03. Oracle Select语句深入学习8125

解决办法:使用滤空函数nvl改写:12*sal + nvl(comm,0)

2)null永远 !=null

03. Oracle Select语句深入学习8182

解决办法:使用is null

3)(了解)not in后面的集合中不能出现null,in后面的集合中可以出现null。

4)Oracle中,null最大。

03. Oracle Select语句深入学习8264

5)分组函数会自动滤空,如果不想自动滤空,可以嵌套nvl函数来屏蔽滤空功能。这个在分组函数的小节中有讲过。


留下一个回复

你的email不会被公开。