mysql和Oracle的简单比较
localhost pda varchar2 自连接 smi ins 修改字段 条件
ORA-27101: shared memory realm does not exist 解决方法:
1、用 CMD 进入命令行 2、sqlplus /nolog3、conn / as sysdba4、startup
首先介绍一下 SQL92/99 标准的四大分类
DML(数据操纵语言):select,
insert,
update,
delete
DDL(数据定义语言):create table,
alert table,
drop table,
truncate table
DCL(数据控制语言):grant权限to scott,
revoke权限fromscott
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 个 Gnumber: 数值类型number(5) 最大可以存 99999number(5,2) 最大可以存 999.99date: 日期时间, 精确到秒
mysql 修改表结构alter tablecategoryadd'desc'varchar(20);
代表给 category 这个表添加一个字符串长度为 20 的名为 desc 的字段
Oracle 修改表结构alter tablecategoryadd(desc varchar2(20));
同上
mysql 修改字段alter tablecategory change'desc'descriptionvarchar(30);
将 desc 这一列的字段的字符长度改为 30
Oracle 修改字段alter tablecategory modify(desc varchar2(30));
同上
mysql 删除字段alter tablecategorydrop desc;
删除 category 表中 desc 这列
Oracle 删除字段alter tablecategorydrop column desc;
同上
mysql 和 Oracle 的增删改 SQL 语句都一样
插入记录 (insert)insert intocategory(cid,cname)values(1,'xxx');
代表向 category 表中的 cname 列插入 xxx 数据
修改数据 (update)updatecategorysetcname=yyywhereid=1;
代表将 category 表中 id 为 1 的 cname 字段改为 yyy
删除数据 (delete)deletefromcategorywhereid=1;
代表删除 category 表中的 id 为一的字段数据
mysql 和 Oracle 的 jdbc 连接
首先是 OracleOracle 导入一个 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*fromemp;
查询 emp 表的不重复的工作selectdistinctjobfromemp;
查询员工的编号, 姓名, 月薪, 年薪selectempno,
ename,
sal,
sal*12fromemp;
使用 where 语句查询:
查询 emp 表中 20 号部门的员工信息select*fromempwheredeptno=20;
查询姓名是 SMITH 的员工,字符串使用'',内容大小写敏感select*fromempwhereename='SMITH';
范围查询:
查询工资大于 1500 的员工select*fromempwheresal>1500;
查询薪水在 1300 到 1600 之间的员工,包括 1300 和 1600select*fromempwheresalbetween1300and1600;
查询不是 20 号或 30 号部门的员工select*fromempwheredeptnonotin(30,20);
like 关键字:
查询姓名以大写字母 N 结束的员工select*fromempwhereenamelike'%N';
空值查询:
查询佣金为 null 的员工select*fromempwherecommisnull;
and 和 or 使用:
查询无佣金且工资大于 1500 的员工select*fromempwhere(commisnull)and(sal>1500);
查询职位是 "MANAGER" 或职位不是 "ANALYST" 的员工select*fromempwhere(job='MANAGER')or(job<>'ANALYST');
排序查询和 order by 使用
查询员工信息(编号,姓名,月薪,年薪),按月薪升序排序,默认升序,如果月薪相同,按 oracle 内置的校验规则排序selectempno,
ename,
sal,
sal*12fromemp orderbysal asc;
查询员工信息(编号,姓名,月薪,年薪),按月薪降序排序selectempno,
ename,
sal,
sal*12fromemp orderbysal desc;
聚合统计
统计工资最高的人selectmax(sal)fromemp;
统计工资最低的人selectmin(sal)fromemp;
根据工号统计所有人数selectcount(deptno)fromemp;
分组后的条件查询查询部门平均工资大于 2000 元的部门selectdeptno"部门编号",
trunc(avg(sal),0)"部门平均工资"fromempgroupbydeptno having trunc(avg(sal),0)>2000orderby2desc;
这里的 2 代表的是第二个条件, 也就是部门平均工资
需要注意的是: where 是行过滤器, 针对原始记录, 跟在 from 后面, 先执行 having 是组过滤器, 针对分组后的记录, 跟在 group by 后面, 后执行
下面是多表查询:
连接查询: 内连接查询: 只能查询出符合条件的记录外连接查询: 既能查询出符合条件的记录, 也能根据一方强行将另一方查询出来
多表外连接查询:(左外连接)按部门 10,20,30,40 号,统计各部门员工人数,要求显示部门号,部门名,人数首先是 sql99:selectdept.deptno"部门号",
dept.dname"部门名",
count(emp.empno)"人数"fromdept leftjoinemp ondept.deptno=emp.deptnogroupbydept.deptno,
dept.dname;
下面是 Oracle 专用语句:selectdept.deptno"部门号",
dept.dname"部门名",
count(emp.empno)"人数"fromdept,
empwheredept.deptno=emp.deptno(+)groupbydept.deptno,
dept.dname;
右外连接首先是 sql99:selectdept.deptno"部门号",
dept.dname"部门名",
count(emp.empno)"人数"fromemp leftjoindept on emp.deptno=dept.deptnogroupbydept.deptno,
dept.dname;
下面是 Oracle 专用语句:selectdept.deptno"部门号",
dept.dname"部门名",
count(emp.empno)"人数"fromdept,
empwhereemp.deptno(+)=dept.deptnogroupbydept.deptno,
dept.dname;
自连接查询:
显示 "SMITH 的上级是 FORD"selectusers.ename||'的上级是'||boss.enamefromemp users,
emp bosswhereusers.mgr=boss.empno;
子查询:查询条件未知的事务查询工资比 WARD 高的员工信息select*fromempwheresal>(selectsalfromempwhereename='WARD');
mysql 和 Oracle 的简单比较
来源: http://www.bubuko.com/infodetail-2138339.html