zoukankan      html  css  js  c++  java
  • mysql和Oracle的简单比较

    ORA-27101: shared memory realm does not exist解决方法:

    1、用CMD进入命令行
    2、sqlplus /nolog
    3、conn / as sysdba
    4、startup

    首先介绍一下SQL92/99标准的四大分类

      DML(数据操纵语言):

    select,insert,update,delete


      DDL(数据定义语言):

    create table,alert table,drop table,truncate table


      DCL(数据控制语言):

    grant 权限 to scott,revoke 权限 from scott


      TCL(事务控制语言):

    commit,rollback,

    下面会分别用类似的需求体现mysql和Oracle的区别

      mysql创建数据库:

    create database xxx;

      在Oracle中是创建表空间

    create tablespace xxx;

    --指定存放空间
    datafile 'C:xxx.dbf'
    --指定大小
    size 100m
    --大小满了自动增长
    autoextend on
    --每次自动增长的大小
    next 10m

      创建表mysql和oracle是一样的

    create table 表名{
      字段名 类型(长度) [约束],
      .....
      .....
    }

    但是他们的类型各不相同:

     

    mysql:
      varchar(n) 字符串
      int 整型
      double 浮点
      date 时间

    oracle:

      char:固定长度的字符类型,最多存储2000个字节
      varchar2:可变长度的字符类型,最多存储4000字节
      LONG:大文本类型,最大可以存储2个G
      number:数值类型
      number(5) 最大可以存99999
      number(5,2) 最大可以存999.99
      date:日期时间,精确到秒

    mysql修改表结构

     

    alter table category add 'desc' varchar(20);

    代表给category这个表添加一个字符串长度为20的名为desc的字段

    Oracle修改表结构

      

    alter table category add (desc varchar2(20));

    同上

    mysql修改字段

      

    alter table category change 'desc' description varchar(30);

    将desc这一列的字段的字符长度改为30

    Oracle修改字段

      

    alter table category modify(desc varchar2(30));

    同上

    mysql删除字段

      

    alter table category drop desc;

    删除category表中desc这列

    Oracle删除字段

      

    alter table category drop column desc;

    同上

     mysql和Oracle的增删改SQL语句都一样 

    插入记录(insert)
      

    insert into category(cid,cname) values(1,'xxx');

    代表向category表中的cname列插入xxx数据


    修改数据(update)
      

    update category set cname = yyy where id =1;

    代表将category表中id为1的cname字段改为yyy


    删除数据(delete)
      

    delete from category where id = 1;

    代表删除category表中的id为一的字段数据

    mysql和Oracle的jdbc连接

    首先是Oracle
      Oracle导入一个ojdbc14.jar的包
      反射加载驱动为:oracle.jdbc.driver.OracleDriver
      获取连接:jdbc:oracle:thin:@192.168.80.10:1521:orcl

    下面是mysql

      反射加载驱动为:com.mysql.jdbc.Driver
      获取连接:jdbc:mysql://localhost:3306/test

    下面是mysql和Oracle共有的属性,主要是查询语句

      这里使用的是Scott用户在Oracle中示范

    基本查询:(单表查询)

      查询emp表的所有内容
      

    select * from emp;


      查询emp表的不重复的工作
     

     select distinct job from emp;


      查询员工的编号,姓名,月薪,年薪
     

     select empno,ename,sal,sal*12 from emp;

    使用where语句查询:

      查询emp表中20号部门的员工信息
      

    select * from emp where deptno = 20;


      查询姓名是SMITH的员工,字符串使用'',内容大小写敏感
      

    select * from emp where ename = 'SMITH';

    范围查询:

      查询工资大于1500的员工
      

    select * from emp where sal > 1500;


      查询薪水在1300到1600之间的员工,包括1300和1600
      

    select * from emp where sal between 1300 and 1600;


      查询不是20号或30号部门的员工
     

     select * from emp where deptno not in (30,20);

    like关键字:

      查询姓名以大写字母N结束的员工
      

    select * from emp where ename like '%N';

    空值查询:

      查询佣金为null的员工
      

    select * from emp where comm is null;

    and和or使用:

      查询无佣金且工资大于1500的员工
      

    select * from emp where(comm is null) and (sal > 1500);


      查询职位是"MANAGER"或职位不是"ANALYST"的员工
     

     select * from emp where (job='MANAGER') or (job<>'ANALYST');

    排序查询和order by使用

      查询员工信息(编号,姓名,月薪,年薪),按月薪升序排序,默认升序,如果月薪相同,按oracle内置的校验规则排序
      

    select empno,ename,sal,sal*12 from emp order by sal asc;


      查询员工信息(编号,姓名,月薪,年薪),按月薪降序排序
      

    select empno,ename,sal,sal*12 from emp order by sal desc;

    聚合统计

      统计工资最高的人
      

    select max(sal) from emp;


      统计工资最低的人
      

    select min(sal) from emp;


      根据工号统计所有人数
      

    select count(deptno) from emp;


      分组后的条件查询
      查询部门平均工资大于2000元的部门
      

    select deptno "部门编号",trunc(avg(sal),0) "部门平均工资" from emp group by deptno having trunc(avg(sal),0) > 2000 order by 2 desc;


      这里的2代表的是第二个条件,也就是部门平均工资

    需要注意的是:
      where是行过滤器,针对原始记录,跟在from后面,先执行
      having是组过滤器,针对分组后的记录,跟在group by后面,后执行

    下面是多表查询:

      连接查询:
      内连接查询:只能查询出符合条件的记录
      外连接查询:既能查询出符合条件的记录,也能根据一方强行将另一方查询出来

    多表外连接查询:(左外连接)
      按部门10,20,30,40号,统计各部门员工人数,要求显示部门号,部门名,人数
      首先是sql99:
      

    select dept.deptno "部门号",dept.dname "部门名",count(emp.empno) "人数" from dept left join emp on    dept.deptno = emp.deptno group by dept.deptno,dept.dname;


      下面是Oracle专用语句:
      

    select dept.deptno "部门号",dept.dname "部门名",count(emp.empno) "人数" from dept,emp where dept.deptno = emp.deptno(+) group by dept.deptno,dept.dname;


      右外连接
      首先是sql99:
      

    select dept.deptno "部门号",dept.dname "部门名",count(emp.empno) "人数" from emp left join dept on emp.deptno = dept.deptno group by dept.deptno,dept.dname;

      下面是Oracle专用语句:
     

     select dept.deptno "部门号",dept.dname "部门名",count(emp.empno) "人数" from dept,emp where emp.deptno(+) = dept.deptno group by dept.deptno,dept.dname;

      自连接查询:

    显示"SMITH的上级是FORD"
     

     select users.ename || '的上级是' ||boss.ename from emp users,emp boss where users.mgr = boss.empno;

    子查询:
      查询条件未知的事务
      查询工资比WARD高的员工信息
      

    select * from emp where sal > (select sal from emp where ename = 'WARD');
  • 相关阅读:
    SQL Server CHARINDEX和PATINDEX详解
    Delphi7控件包详解 (转)
    经历一次人际关系危机总结,改进
    2008年5月份目标和计划
    God bless 贝贝!
    开始新的生活~~~
    一切安好~~~
    Hadoop : “Moving Computation is Cheaper than Moving Data”
    改论文,不轻言放弃,力求准确,简洁
    杜绝拖拖拉拉《明日歌》
  • 原文地址:https://www.cnblogs.com/learnjfm/p/7078615.html
Copyright © 2011-2022 走看看