热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

玩转oracle学习第二天

1.第一天学习回顾美国Sybase公司的Sybase数据库是大型数据库,大型数据库有db2,oracle数据库默认产生sys用户,system用户&#x

1.第一天学习回顾

  美国Sybase公司的Sybase数据库是大型数据库,大型数据库有db2,oracle数据库
默认产生sys用户,system用户,这两个用户级别很高,另外还有scott默认普通用户

        conn 用户名/密码@实例名
创建用户:只有dba才可以创建用户

2. oracle的表管理(创建/维护)

       2.1表名和列名的规则
      (1)必须以字母开头
  (2)长度不能超过30字符
  (3)不能使用oracle的保留字
  (4)一般只能使用A-Z a-z,0-9,$ #等字符

       2.2oracle支持的数据类型

        (1)字符型
  char 最大2000字符 优点:查询速度极快 注:某个字段老被查询,并且定长,最好使用char类型
  例子:char(10) '小何'前四个字符放'小何',后添加6个空格补全
  create table users(userName char(200),)
  varchar2(20) 变长 最大4000个字符 优点:节省空间
  clob 字符型大对象,最大4G
    (2)数字型
    number 范围 -10的38次方 -  10的38次方可以表示整数,也可以表示小数
number(5,2)
表示一个小数有5位有效数,2位小数
范围:-999.99-999.99
number(5)
表示一个五位整数
范围-99999 - 99999
(3)日期类型
date 包含年月日和时分秒
timestamp 这是oracle 9i对date数据类型的扩展
(4)图片类型
blob 二进制数据可以存放图片/声音 最大 4G

          2.3 建表,删除表,修改表

学生表
create table student
(
xh number(4),
xm varchar2(20),
sex char(2),
birthday date,
sal number(7,2)
);
drop table users;
表空间:一个表一个文件,存放在磁盘上的,oracle数据库可以创建很多表空间
可以指定将表放在某个指定的表空间中,表空间是管理表的
create table class
(
classId number(2),
cname   varchar2(40)
);
给表增加字段列
alter table student add(classId number(2));
修改表字段长度
alter tabele student modify (xm varchar(30));
修改表字段类型(谨慎)
alter table student modify (xm char(30));
删除表字段
alter table student drop column sal;
重命名表
rename student to stu;
删除
drop table student;
插入记录:date 默认格式 DD-MON-YYYY
insert into student values(2008120113,'小何','男','11-12月-1997',234.12);
修改 date的格式:
alter session set nls_date_format='yyyy-mm-dd';
插入空值:
insert into student(xh,xm,sex,birthday) values(123,'何世阳',‘男’,null);
查询为空:
select * from student where birthday is null;
改一个或者多个字段:
update student set sal = sal/2,classid = 3 where sex = '男';
修改含有null值的数据:条件是 is null
删除数据:
delete from student;
删除数据,但是表结构还在,通过日志可以恢复
例如恢复:
savepoint a; //做一个保存点
delete from student;
rollback to a;
oracle数据库保存点默认只有一个保存点,通过设置可以有多个保存点
删除表的结构和数据:
drop table student;
truncate table student;//类似delete,但是删除不写日志,所以删除速度极快
查看表结构
desc student;

       2.4 基本查询

多表查询,关联查询,嵌套查询;
  clear 清屏命令;
  emp表结构说明:
 
           empno(编号) ename(姓名) job(工作) mgr(上级编号) hiredate(雇佣时间) sal comm(奖金)  deptno(部门编号)
  
 
           dept表结构说明:部门表
 
         deptno(部门编号)  dname(部门名称) loc(部门所在地点)
 
        10
 
         20
 
       30
 
      40
 
查看表结构:
  desc dept;
  查询所有列
  查询指定列
  注意:查询数据库切记使用*,查询所有列,尽量查询特定列,指定查询列速度较快
  疯狂自复制:
  insert into student (xh,xm,sex,birthday)  select * from student;
  如何取消重复行:
  select distinct job,deptno from emp;
  单表查询最简单
  数据区分大小写的,oracle关键字,表名,表字段名不区分大小写
  
  使用算术表达式:使用加减乘除运算符
  计算雇员的年工资:
  select enamel,sal*12 from emp;
  给列取别名
  select ename,sal*12+comm*13 "年工资" from emp;
  oracle数据库中表达式中有一个字段为空,则计算结果就为空;
  select ename,sal*12+nvl(comm,0)*13 "年工资" from emp;
  nvl处理null字段的问题
  nvl(comm,0):如果nvl为空,则结果用0代替,不为空就用comm本省
  如何连接字符串(||)
  select ename || 'is a ' || job from emp;
  使用where子句:
  查询1982年1月1日以后入职的员工
  select * from emp where hiredate > '1-1月-1982';  
select ename,sal from emp sal between 2000 and 2500;
或者
select ename,sal from emp sal >&#61; 2000 and sal <&#61; 2500;
like子句查询&#xff1a;
%&#xff1a;表示任意0到多个字符
_:单表任意单个字符
select ename,sal from emp where ename like &#39;S%&#39;;
  select ename,sal from emp where ename like &#39;__O%&#39;;
  where条件中使用in
  select * from emp where empno&#61;123 or empno &#61; 234 or empno &#61; 567;
  或者
  select * from emp where empno in(123,234,567);//此为批量处理方式&#xff0c;查询速度极快
  //查询上级为空的记录
  select ename from emp where mgr is null;
  使用逻辑操作符号
  select * from emp where (sal>500 or job&#61;&#39;MANAGER&#39;) and ename like &#39;J%&#39;;
  使用order by 子句&#xff0c;排序
  select * from emp order by sal;//薪水从低到高 asc 默认
  selecr * from emp order by desc;//薪水从高到低
  部门号升序&#xff0c;雇员工资降序排列
  select * from emp order by deptno asc , sal desc;
  部门号升序&#xff0c;雇员工入职时间降序
  order by hiredate desc;
  使用列的别名排序&#xff0c;as可要可不要
  select ename,(sal&#43;nvl(comm,0))*12 as "年薪" from emp order by "年薪";
  分页查询&#xff1a;
  按雇员的ID号升序取出

2.5 复杂查询

实际应用中经常需要执行复杂的数据统计&#xff0c;经常需要显示多张表查询

  复杂的select语句
  数据分组函数 max min avg sum count
  ?如何显示所有员工中最高工资和最低工资
  select max(sal),min(sal) from emp;
  ?查询最高工资的员工名字和工资
  select  ename,sal from emp where sal &#61; (select max(sal) from emp);
  查询列中有一个分组函数 
  请显示高于平均工资的员工
  select ename,sal from emp where sal > (slect avg(sal) from emp);
  group by 和having子句
  group by 用于查询结果的分组统计
  having子句用于限制分组显示结果  
  如何显示每个部门的平均工资和最高工资
  select avg(sal),max(sal),deptno from emp group by deptno;
  显示每个部门的每种岗位的平均工资和最高工资
    select avg(sal),max(sal),deptno,jobfrom emp group by deptno,job;
  显示平均工资低于2000的部门号和它的平均工资
  select avg(sal),max(sal),deptno from emp group by deptno having avg(sal) <2000;  
  显示每个部门的平均工资大于2000&#xff0c;最高工资&#xff0c;平均工资升序排列
   select avg(sal),max(sal),deptno from emp group by deptno having avg(sal) > 2000 order by avg(sal); 
  对数据分组统计的总结
  (1)分组函数只能出现在选择列中或者出现在having里面&#xff0c;或者出现在order by子句中
  (2)如果在select语句中同时包含grou by ,having,order by三个子句&#xff0c;
  他们的顺序一定是group by ,having,order by
  (3)在选择列中如果有列&#xff0c;表达式&#xff0c;和分组函数&#xff0c;那么这些列和表达式必须有一个出现在group by子句中&#xff0c;否则就会出错
   例如&#xff1a;
   select deptno,avg(sal),max(sal) from emp group by deptno having avg(sal) <2000;
   这里deptno就一定要出现在group by中

&#xff08;1&#xff09;多表查询&#xff1a;

 基于两个或者两个以上的表或是视图的查询&#xff0c;在实际应用中&#xff0c;多表查询是很常见的
    例如dept表和emp表
    &#xff1f;显示雇员名&#xff0c;雇员工资以及所在部门的名字
   select ename,sal,deptname from emp a1 ,dept a2 where a1.deptno &#61; a2.deptno;
   此处要用到笛卡尔积&#xff0c;排除笛卡尔积&#xff0c;多表查询的条件一定不能小于表的个数减1&#xff0c;否则就会出现笛卡尔积 
    ?显示部门的的部门号为10的部门名&#xff0c;员工&#xff0c;工资
    select a1.deptname,a2.ename,a2.sal from dept a1,emp a2 where a1.deptno &#61; a2.deptno and a1.deptno &#61; 10;
    ?显示各个员工的姓名&#xff0c;工资&#xff0c;工资的级别
   salgrade //工资界别表
   grader(级别) losal&#xff08;最低工资&#xff09; hisal&#xff08;最高工资&#xff09;
    select a1.ename,a1.sal,a2.grade from emp a1,salgrade a2 where a1.sal between a2.losal and hisal;
   ?显示雇员名&#xff0c;雇员工资及所在部门&#xff0c;按部门排序
  select ename,sal from emp a1,dept a2 where a1.deptno &#61; a2.deptno order by a1.deptno;
    多表查询&#xff1a;自连接
   子查询&#xff1a;嵌入在其它sql中的select语句&#xff0c;也称嵌套查询 
    select * from emp where deptno &#61; 
   (select deptno from emp where ename&#61;&#39;SMITH&#39;);
   数据库中在执行sql是从左到右执行
    单行子查询&#xff1a;返回一行数据的子查询语句
   多行子查询&#xff1a;
    select distinct job from emp where deptnop&#61;10;
    多行子查询中使用all操作符
   select ename,sal,deptno from emp where sal > all(select sal from emp where deptno&#61;30);
   或者
    select ename,sal,deptno from emp where sal > (select max(sal) from emp);
   以上两个语句的查询结果是相同的&#xff0c;但是第二个语句要比第一句执行效率高哦
    多行子查询中使用any操作符
    多列子查询
    select * from emp where (deptno,job) &#61; (select deptno,job from where ename&#61;&#39;SMITH&#39;);
   查询出比各个部门平均工资高的员工(显示高于自己部门平均工资的员工的信息)
    步骤1&#xff1a;查询出各个部门的平均工资和部门号&#xff1a;
    select deptno,avg(sal) mysal from emp group by deptno;
    步骤2&#xff1a;把上面的查询可看做一张子表
    select  a2.ename,a2.sal,a2.deptno,a1.mysal from emp a2,( select deptno,avg(sal) mysal from emp group by deptno) a1 where a2.deptno &#61; a1.deptno a nd a2.sal > a1.mysal;  
    from子句中使用子查询时候&#xff0c;该子查询被作为一个视图来对待&#xff0c;因此也称内嵌视图&#xff0c;当在from子句中使用子查询的时候必须给子查询
    指定别名给表取别名不能加as&#xff0c;给列取别名可以加as&#xff0c;
  oracle的分页查询&#xff1a;
  oracle分页一共有三种方式&#xff1a;
  1.子查询
  子查询&#xff1a;select * from emp&#xff1b;
  2.rownum分页
  select a1.*,rownum rn from (select * from emp) a1;
  注&#xff1a;rn是oracle给每行分配的行号
  3.   
    select * from (select a1.*,rownum rn from (select * from emp) a1 where rownum <&#61; 10) where rn >&#61; 6;
  指定查询列&#xff0c;只需要修改最里层的子查询
  select * from (select a1.*,rownum rn from (select ename,sal from emp) a1 where rownum <&#61; 10) where rn >&#61; 6;
  如何排序&#xff0c;修改最里层的子查询即可
    select * from (select a1.*,rownum rn from (select ename,sal from emp order by sal desc) a1 where rownum <&#61; 10) where rn >&#61; 6;
  显示4-9的记录
   select * from (select a1.*,rownum rn from (select ename,sal from emp order by sal desc) a1 where rownum <&#61; 9) where rn >&#61; 4;
  select count(*) from emp;//查询总共数据条数
  oracle分页的三种方式
  1.根据rowid来分
  2.按照分析函数来分
  3.按rownum来分&#xff08;此处用这种方法&#xff09;
  oracle表复杂查询 -子查询
  用查询结果创建新表
  create table myemp2 (id,ename,sal) as select empno,ename,sal from emp;
  合并查询&#xff1a;为了合并多个select语句的结果&#xff0c;可以使用集合操作符号union,union all,intersect,minus
  1)union
     该操作符号合并相同的数据记录
      select ename,sal,job,from emp where sal>2500 union 
      select ename,sal,job from emp where job&#61;&#39;manager&#39;;    
  2)union all
    该操作不会合并相同的记录    
  3)intersect
    该操作取两个集合的交集   
  4&#xff09;minus
    该操作用来取两个集合的差集&#xff0c;前面减去后面的

2.6 oracle数据库的创建管理
  &#xff08;1)通过oracle向导工具创建
  dbca创建[数据库配置助手]
创建新的数据库
  &#xff08;2)使用命令手动创建














推荐阅读
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • 在Oracle11g以前版本中的的DataGuard物理备用数据库,可以以只读的方式打开数据库,但此时MediaRecovery利用日志进行数据同步的过 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • Oracle分析函数first_value()和last_value()的用法及原理
    本文介绍了Oracle分析函数first_value()和last_value()的用法和原理,以及在查询销售记录日期和部门中的应用。通过示例和解释,详细说明了first_value()和last_value()的功能和不同之处。同时,对于last_value()的结果出现不一样的情况进行了解释,并提供了理解last_value()默认统计范围的方法。该文对于使用Oracle分析函数的开发人员和数据库管理员具有参考价值。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • 本文讨论了在数据库打开和关闭状态下,重新命名或移动数据文件和日志文件的情况。针对性能和维护原因,需要将数据库文件移动到不同的磁盘上或重新分配到新的磁盘上的情况,以及在操作系统级别移动或重命名数据文件但未在数据库层进行重命名导致报错的情况。通过三个方面进行讨论。 ... [详细]
  • 本文讨论了Kotlin中扩展函数的一些惯用用法以及其合理性。作者认为在某些情况下,定义扩展函数没有意义,但官方的编码约定支持这种方式。文章还介绍了在类之外定义扩展函数的具体用法,并讨论了避免使用扩展函数的边缘情况。作者提出了对于扩展函数的合理性的质疑,并给出了自己的反驳。最后,文章强调了在编写Kotlin代码时可以自由地使用扩展函数的重要性。 ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • Python SQLAlchemy库的使用方法详解
    本文详细介绍了Python中使用SQLAlchemy库的方法。首先对SQLAlchemy进行了简介,包括其定义、适用的数据库类型等。然后讨论了SQLAlchemy提供的两种主要使用模式,即SQL表达式语言和ORM。针对不同的需求,给出了选择哪种模式的建议。最后,介绍了连接数据库的方法,包括创建SQLAlchemy引擎和执行SQL语句的接口。 ... [详细]
  • Day2列表、字典、集合操作详解
    本文详细介绍了列表、字典、集合的操作方法,包括定义列表、访问列表元素、字符串操作、字典操作、集合操作、文件操作、字符编码与转码等内容。内容详实,适合初学者参考。 ... [详细]
  • Java学习笔记之使用反射+泛型构建通用DAO
    本文介绍了使用反射和泛型构建通用DAO的方法,通过减少代码冗余度来提高开发效率。通过示例说明了如何使用反射和泛型来实现对不同表的相同操作,从而避免重复编写相似的代码。该方法可以在Java学习中起到较大的帮助作用。 ... [详细]
  • 本文介绍了Oracle存储过程的基本语法和写法示例,同时还介绍了已命名的系统异常的产生原因。 ... [详细]
  • Oracle Database 10g许可授予信息及高级功能详解
    本文介绍了Oracle Database 10g许可授予信息及其中的高级功能,包括数据库优化数据包、SQL访问指导、SQL优化指导、SQL优化集和重组对象。同时提供了详细说明,指导用户在Oracle Database 10g中如何使用这些功能。 ... [详细]
author-avatar
莣Q楽
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有