005.Oracle表管理

Oracle表的管理

表名和列的命名规则

  1. 必须以字母开头
  2. 长度不能超过30字符
  3. 不能使用Oracle的保留字
  4. 只能使用如下字符:A-Z,a-z,0-9,$,#等

Oracle的数据类型

类型字段特性说明示例
字符型char查询速度最快固定长度,最大2000字符char(10),"小明",前4个字符放"小明",
后6个字符用空格补全
varchar2最节省空间可变长度,最大4000字节varchar2(10),"小明";Oracke只分配4个字节放"小明"
nvarchar2兼容性更强可变长度,最大2000字符单位为字符,一个汉字和一个字母均为一个字符(2个字节)
clob可存储最大空间字符型大对象,最大4G超过4000字符的内容,用此类型存储
数字型Number可以表示整数,也可以表示小数范围-(1038)~1038Number(5,2) 表示5位数,有2位小数:-999.99~999.99
Number(5) 表示5位数整数:-99999~99999
日期类型date完整时间,精确到秒包含年月日时分秒最常用的日期类型,适用于大部分情况
timestamp精度非常高,精确到毫秒表示时间戳常用于银行等对时间精度要求特别高的情况
图片类型blob二进制数据可以存放图片、声音、视频一般不将图片等文件存储到数据库,只存文件的路径,
文件存储在一个目录中,通过路径来调取
保密性高的文件一定要存储到数据库中

表操作

创建表格

  • 创建一个学生表
    create table student --表名student
    ( xh number(4), --学号
        xm varchar2(20), --姓名
        sex char(2), --性别
        birthady date, --出生日期
        sal number(7,2) --奖学金
    );
    
  • 创建一个班级表
    create table classes --表名classes
    (   classid number(2), --班级ID
        cname varchar(40), --班级名称
    );
    
  • 子查询快速建表
    • 语法:create table 新表名 (新字段1,新字段2...新字段n) as select 字段1,字段2...字段n from 表名;
    • 复制整张表
      create table myemp as select * from emp
      
    • 根据子表部分字段建表
      create table myemo(empno,ename,sal) as select empno,ename,sal from emp where deptno=10
      
  • 查询表记录数
    • 查询当前用户所有表记录数
    select t.table_name,t.num_rows from user_tables t
    
    • 查询数据库所有表记录数
    select t.table_name,t.num_rows from dba_tables t
    

修改表

  • 添加一个字段
    • alter table student add (classid number(2));
  • 删除一个字段(不要轻易使用)
    • alter table student drop column sal;
  • 修改字段长度
    • alter table student modify (xm varchar2(30));
  • 修改字段类型(不能有数据)
    • alter table student modify (xm char(30));
  • 修改字段名称
    • alter table student rename column old_name to new_name;
  • 修改表的名称
    • rename student to Newstudent;
  • 删除表
    • drop table student;
  • 修改表备注
    • comment on table 表名 is '表的注释信息';
  • 修改字段备注
    • comment on column 表名.字段名 is '字段的注释信息';
  • 获取表所有字段名
    • select (column_name) from user_tab_columns where table_name= upper('表名')
  • 获取表所有字段名、字段类型,字段长度
    • select COLUMN_NAME,DATA_TYPE,DATA_PRECISION from user_tab_columns where table_name= upper('t_wms_bas_whsart_store')

数据操作

添加数据

  • 所有字段都添加数据
    • insert into student values ('A001','张三','男','01-5月-20',10)
  • 部分字段添加数据
    • insert into student (xh,xm,sex,birthday) values ('A002','李四','男','01-5月-20')
  • 注意:Oracle中默认的日期格式是'DD-MON-YY',月份必须带'月'
    • 修改日期默认格式:
      • alter session set nls_date_format = 'yyyy-mm-dd';
    • 修改后添加数据
      • insert into student values('A003','李梅','女','2020-10-28',20);
  • 添加空值
    • insert into student values('A004','小红','女','2020-10-28',null);
    • 查询字段为空的语句
      • select * from student where sal is null;
    • 查询字段为非空语句
      • select * from student where sal is not null;
  • 添加多条数据
    • 当使用values子句时,一次只能插入一行数据。当使用子查询插入数据时,一条insert语句可以插入大量的数据
    • 当处理行迁移或装载外部表的数据到数据库时,可以用子查询来插入数据
    • 插入部分字段
      insert into 表2(字段1, 字段2) select 字段1, 字段2 from 表1 where 条件;
      
    • 插入所有字段
      insert into 表2 select * from 表1 where 条件;
      
    • 示例
      >>> 创建一个表myemp2,包含字段myid, myname, mydept
      create table myemp2(myid number(4), myname varchar2(50), mydept number(5));
      
      >>> 给新表批量插入数据
      insert into myemp2(myid,myname) select empno,ename from emp where deptno=10;
      
      >>> 将所有字段数据全部插入到新表
      insert into myemp2 select * from emp where deptno=10;
      

修改数据

  • 修改一个字段
    • 语法:update 表名 set 字段=值 where 条件;
    • update student set sex='女' where xh='A001';
  • 修改多个字段
    • 语法:update 表名 set 字段1=值1,字段2=值2 where 条件;
    • update student set sex='男',birthday='2019-01-01' where xh='A001';
  • 修改含有null值的数据
    • 语法:update 表名 set 字段=值 where 字段 is null;
    • update student set sex='男' where sal is null;
  • 关联表更新
    update test1 
    set (test1.name,test1.age)=
    (select test2.name,test2.age from test2 where test2.id=test1.id)
    
  • 用子查询更新多条数据
    • 使用Update语句更新数据时,既可以使用表达式或者数值直接修改数据,也可以使用子查询修改数据
    案例:希望员工scott的岗位、工资、补助与smith员工一样
    update myemp
       set (job, sal, comm) =
           (select job, sal, comm from myemp where ename = 'SMITH')
     where ename = 'SCOTT'
    

删除数据

  • 删除所有记录,表结构还在
    • delete from student;
    • 写日志,可以恢复,速度慢
  • 删除表结构和数据
    • drop table student;
  • 删除一条记录
    • delete from student where xh='A001';
  • 删除所有记录,表结构还在
    • truncate table student;
    • 不写日志,无法恢复,速度快
  • 恢复删除记录
  • 通过回滚命令:Rollback
    • 前提必须先设定保存点:Savepoint a;
    • 回滚到保存点:Rollback to a;
    • 此操作,让数据恢复到设置回滚点的时候,之后所有操作都丢失

查询数据

功能关键字语法
查看表结构descdesc 表名;
查询所有数据select * from 表名
查询指定列数据select 字段1,字段2,... from 表名
去重查询distinctselect distinct 字段1,字段2,...from 表名
带条件查询whereselect * from 表名 where 条件表达式
多条件查询andselect * from 表名 where 条件表达式1 and 条件表达式2
多条件查询orselect * from 表名 where 条件表达式1 or 条件表达式2
模糊查询[not]likeselect * from 表名 where 字段 like '%元素%'
关键字查询[not]inselect * from 表名 where 字段 in ('元素1','元素2',...)
范围查询between andselect * from 表名 where 字段 between 值1 and 值2
空值查询is [not] nullselect * from 表名 where 字段 is [not] null
查询结果排序order by [ASC/DESC]select * from 表名 order by 字段 [ASC/DESC]
分组查询group byselect 分组字段,统计字段 from 表名 group by 分组字段
分组查询筛选group by 字段 having 条件表达式select 分组字段,统计字段 from 表名 group by 分组字段 having 统计字段条件表达式
分组查询汇总group by rollup(分组字段)select 分组字段,统计字段 from 表名 group by rollup(分组字段)
分组查询合并wm_concat(to_char(合并字段))select 分组字段,wm_concat(to_char(合并字段)) from t_bas_user group by 分组字段;
分页查询rownumselect * from (select t.* rownum rn from (select * from 表名) t where rownum<=最大行数) where rn>=最小行数
  • 查看表结构
    • 语法:desc 表名;
      • desc dept;
  • 查询所有列数据
    • 语法:select * from 表名;
      • select * from dept;
  • 查询指定列数据
    • 语法:select 列1,列2,列3 from 表名;
      • select ename, sal, job, deptno from emp;
  • 取消重复行
    • 语法:select distinct 列1, 列2 from 表名;
      • select distinct deptno, job from emp;
    • 小练习
    • 表格结构:
    • 表数据
    >>> emp表
    EMPNO ENAME      JOB         MGR HIREDATE          SAL      COMM DEPTNO
    ----- ---------- --------- ----- ----------- --------- --------- ------
     7369 SMITH      CLERK      7902 1980/12/17     800.00               20
     7499 ALLEN      SALESMAN   7698 1981/2/20     1600.00    300.00     30
     7521 WARD       SALESMAN   7698 1981/2/22     1250.00    500.00     30
     7566 JONES      MANAGER    7839 1981/4/2      2975.00               20
     7654 MARTIN     SALESMAN   7698 1981/9/28     1250.00   1400.00     30
     7698 BLAKE      MANAGER    7839 1981/5/1      2850.00               30
     7782 CLARK      MANAGER    7839 1981/6/9      2450.00               10
     7788 SCOTT      ANALYST    7566 1987/4/19     3000.00               20
     7839 KING       PRESIDENT       1981/11/17    5000.00               10
     7844 TURNER     SALESMAN   7698 1981/9/8      1500.00      0.00     30
     7876 ADAMS      CLERK      7788 1987/5/23     1100.00               20
     7900 JAMES      CLERK      7698 1981/12/3      950.00               30
     7902 FORD       ANALYST    7566 1981/12/3     3000.00               20
     7934 MILLER     CLERK      7782 1982/1/23     1300.00               10
     
     >>>dept表
     DEPTNO DNAME          LOC
    ------ -------------- -------------
        10 ACCOUNTING     NEW YORK
        20 RESEARCH       DALLAS
        30 SALES          CHICAGO
        40 OPERATIONS     BOSTON
    
    1. 查询SMITH的薪水,岗位,所在部门
      select sal, job, deptno from emp where ename='smith';
      >>> 查询结果:
            SAL JOB       DEPTNO
      --------- --------- ------
      查询不到任何数据
      因为表格中SMITH为大写,SQL语句中为小写,所以查询不到
      
      select sal, job, deptno from emp where ename='SMITH';
      >>> 查询结果:
            SAL JOB       DEPTNO
      --------- --------- ------
         800.00 CLERK         20
      
    2. 显示每个雇员的年工资(月工资*月份+奖金*月份)
      select sal*12+comm*12 as "年薪",ename as "姓名",comm as "奖金" from emp;
      >>> 查询结果:
          年薪     姓名       奖金
      ---------- ---------- ---------
                 SMITH      
           22800 ALLEN         300.00
           21000 WARD          500.00
                 JONES      
           31800 MARTIN       1400.00
                 BLAKE      
                 CLARK      
                 SCOTT      
                 KING       
           18000 TURNER          0.00
                 ADAMS      
                 JAMES      
                 FORD       
                 MILLER     
                 
      >> 该结果可以看出来,奖金为空的,年薪也为空
      >> Oracle运算特性:凡是运算过程中有null值,结果均为null  
      >> 解决该问题,用nvl函数,nvl(x, 0):如果x的值为null,则替换成0;
      
      select ename as "姓名", sal*12+nvl(comm)*12 as "年薪",sal as "工资",comm as "奖金" from emp;
      姓名               年薪   工资    奖金
      ---------- ---------- --------- ---------
      SMITH            9600    800.00 
      ALLEN           22800   1600.00    300.00
      WARD            21000   1250.00    500.00
      JONES           35700   2975.00 
      MARTIN          31800   1250.00   1400.00
      BLAKE           34200   2850.00 
      CLARK           29400   2450.00 
      SCOTT           36000   3000.00 
      KING            60000   5000.00 
      TURNER          18000   1500.00      0.00
      ADAMS           13200   1100.00 
      JAMES           11400    950.00 
      FORD            36000   3000.00 
      MILLER          15600   1300.00 
      
  • 带条件查询 where
    • 语法:
      • select 字段 from 表名 where 条件;
      • 多条件用 and 或者 or
    • 小练习
    1. 查询工资大于3000的员工
      select ename, sal from emp where sal > 3000;
      
    2. 查询在1982.1.1之后入职的人员
      select ename, hiredate from emp where hiredate > '1-1月-1982';
      
      用alter session set nls_date_format = 'yyyy-mm-dd';修改日期格式,仅仅是临时生效,数据库重启之前均有效,重启之后失效
    3. 查询工资在2000到5000之间的人员
      select * from emp where sal>=2000 and sal<=5000;
      
  • Where条件中使用 Like
    字符说明
    %0到多个任意字符
    _单个任意字符
    • 小练习
    1. 查询首字母为S的员工姓名和工资
      select ename, sal from emp where ename like 'S%';
      
    2. 查询第三个字符为大写O的员工姓名和工资
      select ename, sal from emp where ename like '__O%';
      
  • Where条件中使用 In
    1. 查询员工编码为7499、7698、7876的员工姓名和工资
      select ename, sal from emp where empno in (7499,7698,7876);
      
  • Where条件中使用 is null
    1. 查询没有上级的雇员的情况
      select * from emp where mgr is null;
      
  • Where条件中使用逻辑操作符(and,or)
    1. 查询工资高于500或者岗位为MANAGER,同时还要满足姓名首字母为J的雇员信息
      select * from emp where (sal > 500 or job = 'MANAGER') and ename like 'J%';
      
  • Order by 语句(排序)
    1. (升序) 如何按照工资的从低到高的顺序显示员工信息
      select * from emp order by sal [asc];
      
    2. (降序) 如何按照工资从高到低的顺序显示员工信息
      select * from emp order by sal desc;
      
    3. 按照部门号升序,而员工工资降序排列
      select * from emp order by empno [asc], sal desc;
      
    4. 使用列的别名进行排序
      select ename, (sal+ nvl(comm,0))*12 as "年薪" from emp 
          order by "年薪";
      
  • Oracle表的复杂查询——单表查询
    • 说明:在实际应用中,经常需要执行复杂的数据统计,经常需要显示多张表的数据。
    • 数据分组
      • Max(最大值),Min(最小值),Avg(平均值),Sum(总数),Count(个数)
        1、查询所有员工中最高工资和最低工资
        select max(sal), min(sal) from emp;
        
        2、查询所有员工的总工资、平均工资和总人数
        select sum(sal), avg(sal), Count(ename) from emp;
        
        3、查询所有员工中最高工资的员工姓名和工资
        selcet ename, sal from emp where sal = (select Max(sal) from emp);
        
        4、查询所有员工中工资高于平均工资的员工信息
        select * from emp where sal>(select avg(sal) from emp);
        
        5、查询所有员工中工资高于平均工资的员工信息并按工资升序排序
        select * from emp
            where sal>(select avg(sal) from emp)
            order by sal;
        
    • group by 和 having子句
      • group by:用于对查询的结果分组统计
      • having子句:用于限制分组显示结果
        1、显示每个部门的平均工资和最高工资
        select avg(sal), max(sal), deptno from emp
            group by deptno;
        
        >>> 查询结果
          AVG(SAL)   MAX(SAL) DEPTNO
        ---------- ---------- ------
        1566.66666       2850     30
              2175       3000     20
        2916.66666       5000     10
        
        2、显示每个部门、每个岗位的平均工资,并按部门代号排序
        select avg(sal) from emp
            group by deptno, job
            order by deptno;
        
        >>> 查询结果
          AVG(SAL)   MAX(SAL) DEPTNO JOB
        ---------- ---------- ------ ---------
              1300       1300     10 CLERK
              2450       2450     10 MANAGER
              5000       5000     10 PRESIDENT
              3000       3000     20 ANALYST
               950       1100     20 CLERK
              2975       2975     20 MANAGER
               950        950     30 CLERK
              2850       2850     30 MANAGER
              1400       1600     30 SALESMAN
        
        3、显示平均工资低于2000的部门号和它的平均工资
        select avg(sal), max(sal),deptno 
            from emp
            group by deptno
            having avg(sal)>2000;
        
        >>> 查询结果
          AVG(SAL)   MAX(SAL) DEPTNO
        ---------- ---------- ------
              2175       3000     20
        2916.66666       5000     10
        
    • 数据分组总结
      • 分组函数(Max、Min、Avg、Sum、Count)只能出现在选择列表、having、order by子句中
      • 如果在select语句中,同时包含有group by、having、order by,那么他们的顺序是:group by,having,order by
        select avg(sal), max(sal), deptno, (sal+nvl(comm,0))*12 
            from emp
            group by deptno, (sal+nvl(comm,0))*12
            having avg(sal)>1000
            order by max(sal);
        
      • 在选择列中如果有列、表达式、分组函数,那么这些列和表达式必须出现在group by子句中,否则就会出错
        select avg(sal), max(sal), deptno, (sal+nvl(comm,0))*12 
            from emp
            group by deptno, (sal+nvl(comm,0))*12;
        
  • Oracle表的复杂查询——多表查询
    • 说明:多表查询是指基于两个或两个以上的表或者视图的查询。
    1. 查询员工姓名、员工工资以及所在部门的名称
      select e.ename, e.sal, d.dname 
          from emp e, dept d 
          where e.deptno=d.deptno;
      
    2. 查询部门号为10的部门号、部门名、员工姓名、工资
      方法一:
      select * from (
          select d.deptno,d.dname,e.ename,e.sal 
              from emp e,dept d 
              where d.deptno=e.deptno) 
          where deptno='10';
      
      方法二:    
      select d.deptno,d.dname,e.ename,e.sal 
              from emp e,dept d 
              where d.deptno=e.deptno and d.deptno='10'
      
    3. 查询个员工姓名、工资及其工资级别(salgrade表)
           GRADE      LOSAL      HISAL
          ------   ----------    ------
               1        700       1200
               2       1201       1400
               3       1401       2000
               4       2001       3000
               5       3001       9999
      select e.ename,e.sal,s.grade 
          from emp e, salgrade s 
          where e.sal between s.losal and s.hisal;
      
      • 关键字:between 在什么范围内
    4. 查询员工姓名、员工工资及所在部门的名字,并按部门代号排序
      select e.ename, e.sal, d.dname 
          from emp e, dept d 
          where e.deptno=d.deptno 
          order by e.deptno;
      
      >>> 查询结果
      ENAME             SAL DNAME
      ---------- ---------- --------------
      CLARK            2450 ACCOUNTING
      KING             5000 ACCOUNTING
      MILLER           1300 ACCOUNTING
      JONES            2975 RESEARCH
      FORD             3000 RESEARCH
      ADAMS            1100 RESEARCH
      SMITH             800 RESEARCH
      SCOTT            3000 RESEARCH
      WARD             1250 SALES
      TURNER           1500 SALES
      ALLEN            1600 SALES
      JAMES             950 SALES
      BLAKE            2850 SALES
      MARTIN           1250 SALES
      
    • Oracle表复杂查询-多表查询-自连接
    • 说明:自连接是指在同一张表的连接查询
      1. 查询某个员工的上级领导的姓名。比如:查询'FORD'的上级
      • 将一张表当作两张表来查询
        select worker.ename, boss.ename 
            from emp worker, emp boss 
            where worker.mgr=boss.empno and worker.ename='FORD';
            
            >>> 查询结果
            ENAME      ENAME
            ---------- ----------
            FORD       JONES
        
  • Oracle表复杂查询-子查询
    • 子查询:是指嵌入在其他Sql语句中的select语句。也叫嵌套查询
      select * from emp 
          where deptno=(select deptno from emp where ename='SMITH');
      
    • 该查询语句中select deptno from emp where ename='SMITH'为子查询
    • 单行子查询
    • 单行子查询是指只返回一行数据的子查询语句
      1. 如何显示与SMITH同一部门的所有员工
        select ename deptno from emp 
            where deptno=(select deptno from emp where ename='SMITH');
            
            >>> 查询结果
            ENAME      DEPTNO
            ---------- ------
            SMITH          20
            JONES          20
            SCOTT          20
            ADAMS          20
            FORD           20
        
    • 多行子查询
    • 多行子查询是指返回多行数据的子查询
      1. 如何查询和部门10的员工工作相同的员工姓名、岗位、工资、部门代号
        select ename, job, sal, deptno from emp 
            where job in (select distinct job from emp where deptno='10');
        
    • 多行子查询中使用all操作符
      1. 如何查询工资比部门30的所有员工的工资高的员工姓名、工资和部门代号
        >>> 方法一:all
        select ename, sal, deptno from emp 
            where sal > all (select sal from emp where deptno='30');
         
        >>> 方法二:max
        select ename, sal, deptno from emp 
            where sal > (select max(sal) from emp where deptno='30');
        
        方法二的执行效率比方法一的高很多
        
    • 多行子查询中使用any操作符
      1. 如何查询工资比部门30的任意一个员工的工资高的员工姓名、工资、部门代号
        >>> 方法一:any
        select * from emp 
            where sal > any (select sal from emp where deptno='30');
        
        >>> 方法二:min
        select * from emp 
            where sal > (select min(sal) from emp where deptno='30');
        
    • 多列子查询
    • 单行子查询和多行子查询都是返回单列数据;而多列子查询则是指查询返回多个列数据的子查询语句
      1. 如何查询与SMITH的部门和岗位完全相同的所有员工
        select * from emp 
            where (deptno,job)=(select deptno, job from emp where ename='SMITH');
        
      • 查询的条件与子查询中的返回结果位置要一一对应
    • 在from子句中使用子查询
      • 当在from子句中使用子查询时,该子查询会被作为一个试图来对待,因此也叫做内嵌试图。
      • 当在from子句中使用子查询时,必须给子查询指定别名。
        1. 如何显示高于自己部门平均工资的员工的信息
          >> 第一步:查询出各个部门的平均工资和部门号
          select deptno, avg(sal) mysal from emp group by deptno;
          
          >> 第二步:把查询的结果看作是一张子表
          select
              a1.ename, a1.sal, a1.deptno, a2.mysal
          from 
              emp a1, (select deptno, avg(sal) mysal from emp group by deptno) a2 
          where
              a1.deptno=a2.deptno and a1.sal > a2.mysal;
          
    • 分页查询
      • 分页需要用两个子查询
      • Oracle分页查询一共有三种方式
        方法特点说明
        根据rownum分页执行效率中等,最容易理解所有的查询改变,均只需要更改最里层的查询
        根据rowid分页执行效率最高,但是最难理解
        根据分析函数分页写法最简单,执行效率最慢
      • 小练习
        1. 按员工的ID号升序取出
        • rownum分页法
          1. 先做一个子查询
              select * from emp;
          2. 显示rownum(Oracle分配的),把上一个查询作为from的子查询
              select a1.* rownum rn from (select * from emp) a1;
          3. 添加第一个筛选条件
              select a1.* rownum rn from (select * from emp) a1 where rownum<=10;
              注意:该处的条件必须用rownum,不能用rn。并且不能同时写两个条件,oracle设定的
          4. 添加第二个筛选条件,把上一个查询作为from的子查询
              select * from (select a1.*, rownum rn from (select * from emp) a1 where rownum<=10) where rn>5;
          
          rownum分页的变动
          查询字段改变:select * from (select a1.*, rownum rn from (select ename, sal from emp) a1 where rownum<=10) where rn>5;
          查询结果需要排序:select * from (select a1.*, rownum rn from (select ename, sal from emp order by sal) a1 where rownum<=10) where rn>5;
          查询条目的变动:select * from (select a1.*, rownum rn from (select ename, sal from emp order by sal) a1 where rownum<=6) where rn>1;
          
        • rowid分页法
          select * from emp where rowid in (
          	select rid from (
          		select rownum rn, rid from (
          			select rowid rid, sal from emp order by sal desc) 
          		where rownum<=10) 
          	where rn>5) 
          order by sal desc;
          
        • 分析函数分页法
          select * from (
          	select a1.*, row_number() over(order by sal desc) rk from emp a1) 
          where rk<=10 and rk>5;
          
    • 用查询结果创建新表
      • 这个命令是一个快速建表的方法
      • 语法:create table 新表名 (新字段1,新字段2...新字段n) as select 字段1,字段2...字段n from 表名;
      • 复制整张表:create table 新表名 as select * from 表名;
        create table mytable (id,name,sal,job,deptno) as select empno,ename,sal,job,deptno from emp;
        

    • 合并查询
    • 在实际应用中,为了合并多个select语句的结果,可以使用集合操作符号:union,union all,intersect,minus
      • union
        • 该操作符用于取得两个结果集的并集。当使用该操作符时,会自动去掉结果集中重复行
          select * from emp where sal>2500 union 
          select * from emp where job='MANAGER';
          

      • union all
        • 该操作符与union相似,但是不会取消重复行,而且不会排序
          select * from emp where sal>2500 union all
          select * from emp where job='MANAGER';
          

      • intersect
        • 使用该操作符,用于取两个结果集的交集
          select * from emp where sal>2500 intersect
          select * from emp where job='MANAGER';
          

      • minus
        • 使用该操作符用于取得两个结果集的差集,它会显示存在于第一个结果集,而不存在第二个结果集中的数据
          select * from emp where sal>2500 minus
          select * from emp where job='MANAGER';
          

      • 合并查询在日常工作中用的少,但是合并查询的效率比and、or条件查询效率快很多
    • 用子查询插入多条数据
      • 当使用values子句时,一次只能插入一行数据。当使用子查询插入数据时,一条insert语句可以插入大量的数据
      • 当处理行迁移或装载外部表的数据到数据库时,可以用子查询来插入数据
      • insert into myemp(myid, myname, mydept) select empno,ename,deptno from emp where deptno=10;
        案例:给新建表格添加部门ID为10的员工信息
        >>> 创建一个表myemp2,包含字段myid, myname, mydept
        create table myemp2(myid number(4), myname varchar2(50), mydept number(5));
        
        >>> 给新表批量插入数据
        insert into myemp2(myid,myname,mydept) select empno,ename,deptno from emp where deptno=10;
        
    • 用子查询更新多条数据
      • 使用Update语句更新数据时,既可以使用表达式或者数值直接修改数据,也可以使用子查询修改数据
      案例:希望员工scott的岗位、工资、补助与smith员工一样
      update myemp
         set (job, sal, comm) =
             (select job, sal, comm from myemp where ename = 'SMITH')
       where ename = 'SCOTT'
      

创建数据库的两种方法

  1. 通过oracle提供的向导工具
    • Database Configuration Assistant(dbca 数据库配置助手)
  2. 通过手工步骤直接创建
  • DBCA数据库配置助手创建数据库

课外小知识

  • 打开显示操作时间的开关:set timing on;
  • Oracle运算特性:凡是运算过程中有null值,结果均为null
    解决该问题,用nvl函数,nvl(x, 0):如果x的值为null,则替换成0;
  • 数据库在执行SQL语句时候,是从右到左执行扫描
    • 比如:select * from emp where ename='SMITS' and job='CLERK';
    • 这个sql语句,先筛选job='CLERK',再筛选ename='SMITS'
    • 所以在写sql语句时候把能筛选掉大部分数据的条件写在最左边(最后面)
  • Sql语句中,给列取别名可以加as,但是在给表取别名的时候一定不能加as.否则会出错
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

失心疯_2023

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值