Oracle数据库操作---基础使用(二)

此篇承接上一篇的基本原理,继续展开学习,本篇主要面向数据的使用和管理,也就是开发者常用的东西,开始喽……

>>>对整表的操作

>创建表   关键字 Create

create table student(

stu_id  int primary key,

stu_name  varchar2(20) not null,

stu_address  varchar2(40));

>查看表结构  Desc

Desc student;

>修改表  Alter table

>增加字段/属性 【alter table 表名 add(属性);

alter table student add(stu_photo  varchar2(20));

>修改字段         【alter table 表名 modify(属性)

alter table student modify(stu_id number(4));

>删除字段         【alter table 表名 drop column 字段名;

alter table student drop column stu_photo;

>删除表  Drop

>删除表  【drop table  表名;】

>>>对数据的操作(基础操作---单表)

>插入数据 【Insert into 表名(属性) values(属性值)】

Insert into student(stu_id,stu_name,stu_address) values(1,‘lisi‘,‘扬州‘);

>查询数据 【Select * from 表名 where 限制条件】

select * from student where id=1;

>修改数据 【update 表名 set 字段名=‘修改后的值‘ where 限制条件】

update student set stu_name=‘zhangba‘ where id=1;

目前表中只有一行数据,所以加不加where都可以,不过最好养成好习惯,否则实际环境中不加where的话,会将所有要修改的字段的值全部改掉;千万谨慎啊!

>删除数据 【Delete 表名 where 限制条件】

Delete from sutdent where id=1;

Truncate student;

##Delete和Truncate的区别

  Delete执行删除的过程是每次从表中删除一行,并且同时将该行的删除操作作为事务记录在日志中保存,以便进行进行回滚操作。

  Truncate table 则一次性地从表中删除所有的数据,并且不会把单独的删除操作记录,记入日志保存,删除行是不能恢复的。并且在删除的过程中不会激活与表有关的删除触发器。执行速度快。

  Delete操作针对的时table和view,会保持现有表空间和索引的空间大小;

  Truncate操作针对的是table,表空间和索引的空间大小会恢复到初始大小;

  整体来看,Delete和Truncate删除的是表中的数据而不会改动表的结构。

>查询数据【Select 字段名 from 表名 where 限定条件……】(★

Select查询是使用数据库的重点,在这里会详细讲解,如果有不全面的地方,后续还会进行更新补充的;

先说一说使用Select查询时,SQL执行的顺序:

     1)语法分析,分析语句的语法是否符合规范,衡量语句中各表达式的意义。

2)语义分析,检查语句中涉及的所有数据库对象是否存在,且用户有相应的权限。

3)视图转换,将涉及视图的查询语句转换为相应的对基表查询语句。

4)表达式转换, 将复杂的 SQL 表达式转换为较简单的等效连接表达式。

5)选择优化器,不同的优化器一般产生不同的“执行计划”

6)选择连接方式, ORACLE 有三种连接方式,对多表连接 ORACLE 可选择适当的连接方式。

7)选择连接顺序, 对多表连接 ORACLE 选择哪一对表先连接,选择这两表中哪个表做为源数据表。

8)选择数据的搜索路径,根据以上条件选择合适的数据搜索路径,如是选用全表搜索还是利用索引或是其他的方式。

9)运行“执行计划”。

说到这里,就顺便说一下Oracle的共享原理

首先,Oracle将执行过的SQL语句存放在内存的共享池(shared buffer pool)中,可以被所有的数据库用户共享,当你执行一条SQL语句时,如果它和之前的执行过的语句完全相

同, Oracle就能很快获得已经被解析的语句以及最好的执行路径. 这个功能大大地提高了SQL的执行性能并节省了内存的使用。

查询语句中,关键字的执行顺序

比如: select 字段 from 表名/视图名 where 条件 group by (字段) having 条件 order by 字段

①先由from将所查询的表或视图中的数据进行整理;【整理顺序是从右往左进行,一般将数据量最小的表放在最右面,作为基表处理】

②再执行where子句的限定条件,进行数据的筛选;【筛选顺序从右向左进行,一般将表关联语句放在最左边,筛选条件放在右端,这样可以减小笛卡尔积,提升查询效率】

③执行group by将数据按你给的条件进行分组;

④使用聚合函数进行计算;

⑤执行Having子句筛选分组;

⑥计算所有的表达式;

⑦执行Orader by语句进行结果集排序【排序一定是最后执行的,将所有查询的数据都执行完之后才进行,否则将失去排序的作用】

oracle 语句提高查询效率的方法

  语句1: where column in(select * from ... where ...);

  语句2:... where exists (select ‘X‘ from ...where ...);

  第二种格式要比第一种格式的效率高。

  在Oracle中几乎可以将所有的IN关键字子查询改写为Exists的子查询。在使用Exists时,Oracle系统会首先检查主查询,然后运行子查询直到它找到第一个匹配项,这就节省了时

间。Oracle系统在执行IN子查询时,首先执行子查询,并将获得的结果表存放在在一个加了索引的临时表中。

  避免使用Having子句,Having只会在检索出所有记录之后才对结果集进行过滤,这个处理需要排序,总计等操作。如果能通过where子句限制记录的数目,那就能减少这方面的开销。

SQL初级优化:

①选择最有效的表名顺序(只在基于规则的优化器中有效)

上面已经提到,Oracle的解析器是按照从右向左的顺序处理From子句中的表或索引的,

在由多个表名的情况下,建议将子句中最小数据量的表作为基础表(driving table)放在最右面,将被最先执行;

②Where子句中的连接顺序

Oracle采用自下向上,自右向左的顺序执行限制条件,所以,建议将表之间的连接写在where后面的紧挨着的位置,那些可以过滤掉最大数据量的条件写在where子句的末尾.

③Select子句中避免使用星号 *

④使用Exists替代IN、使用NOT Exists替代NOT IN;

⑤SQL语句用大写的;因为Oracle总是先解析SQL语句,将小写字母转换成大写字母【但是开发中,Mapper.xml中建议使用全小写字母去写,因为项目最终运行环境是Linux,如果xml文件中sql与pojo中的大小写不一致,会导致Linux环境中运行出错】

⑥避免在索引列上使用计算;

⑦用IN来替换OR【上面提到如果可以使用Exists的地方,使用Exists】

文中有一部分是参照别人写的进行总结学习的,如果有什么错误的地方,欢迎大家指正,我会及时修改;

由于有一些其他的任务,暂时先写这些吧,后面还会继续完善……

原文地址:https://www.cnblogs.com/SpaceKiller/p/10582467.html

时间: 2024-10-12 07:48:50

Oracle数据库操作---基础使用(二)的相关文章

C# Oracle数据库操作类实例详解

本文所述为C#实现的Oracle数据库操作类,可执行超多常用的Oracle数据库操作,包含了基础数据库连接.关闭连接.输出记录集.执行Sql语句,返回带分页功能的dataset .取表里字段的类型和长度等,同时还有哈稀表自动插入数据库等高级任务.需要特别指出的是:在执行SQL语句,返回 DataReader之前一定要先用.read()打开,然后才能读到数据,再用hashTable对数据库进行insert,update,del操作,注意此时只能用默认的数据库连接"connstr". 本文

Oracle数据库迁移-基础

Oracle数据库迁移-基础 作为一个开发人员,数据库知识肯定是需要我们掌握的.但是目前公司的数据库都是有专门的DBA维护的,一般都是给我们一个环境地址,然后我们书写CRUD SQL.而且公司产品要求是可以跨数据源的,这样平时基本上都不太关心特定数据库平台的操作.结果导致自己的DB知识严重不足.今天因为一些原因,需要在外网服务器上搭建演示环境,结果需要"悲剧"的自己操作数据库. 任务:在外网服务器上搭建演示环境,包括服务器.代码.数据库.     解决方案: (1)找一个新的产品安装程

oracle数据库操作语句

常用到的oracle数据库操作语句,以下仅供参考: 一. 查询 1.查询某个数据库表大于某个日期的所有数据条数    select count(*) from ALARM_LOG t where t.ALARM_START_TIME> to_date('2017-01-10 08:00:00','yyyy-mm-dd hh24:mi:ss');   查询某个数据库表大于某个日期的所有历史数据  select * from ALARM_LOG t where t.ALARM_START_TIME>

Oracle数据库操作知道

SELECT TGTID,PHONENUM,REGISTERDATE ,to_date(REGISTERDATE,'YYYY-MM-DD HH24:MI:SS') AS T FROM WTRESSENWEB.T_AXMALL_COMMONCLIENT WHERE TGTID = '2087' AND to_date(REGISTERDATE,'YYYY-MM-DD HH24:MI:SS') > to_date('2014-07-09','yyyy-mm-dd'); 对于to_char() to_

基于OCILIB的oracle数据库操作总结及自动生成Model和Dao的工具

基于OCILIB的oracle数据库操作总结 1.       类图 2.       基类BaseOCIDao的设计与实现 BaseOCIDao.h头文件 #pragma once /* --------------------------------------------------------------------------------------------- * * INCLUDES * ----------------------------------------------

查询ORACLE数据库操作记录

代码: SELECT a.First_Load_Time,        a.Sql_Text,        s.Sid,        s.Serial#,        s.Program --,        ,        a.* --       Utl_Inaddr.Get_Host_Address(s.Terminal) Ip   FROM V$sqlarea a, V$session s  WHERE s.Sql_Address(+) = a.Address    AND U

ThinkPHP的操作基础(二)

1.$readTime_rank_result=M('blog')->order('bReadTime DESC')->limit(3)->select(): a.返回值为数据集,可以用一下的方法在前台输出: <volist name="readTime" id="r"> {$r.Id} nbsp; {$r.Time} </br>  //或是:{$r['Id']} nbsp; {$r['Time']} </volist

(转)C# Oracle数据库操作类

原文地址:http://www.cnblogs.com/haibing0107/p/6143922.html using System;using System.Data;using System.Collections.Generic;using System.Configuration;using System.Data.OracleClient;using System.Text;using System.IO; /// <summary>  /// Oracle数据库操作类  ///

MySQL/Oracle数据库的基础(二)

MySQL/Oracle数据库 Oracle数据库管理系统是管理数据库访问的计算机软件,由Oracle数据库与Oracle实例构成 Oracle数据库:一个相关的操作系统文件集合,这些文件组织在一起,成为一个逻辑整体,即为Oracle数据库.Oracle数据库必须要与内存实例合作,才能对外提供数据管理服务. Oracle实例:位于物理内存里的数据结构,它由操作系统的多个后台进程和一个共享的内存池所组成,共享的内存池可以被进程锁访问. Oracle用它们来管理数据库访问 Oracle实例就是平常所