首页 > 代码库 > mysql和Oracle的简单比较

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);

 

mysql和Oracle的简单比较