1数据库
/* ? mysql可以创建数据库,而oracle没有这个操作,oracle只能创建实例; ? sql数据库操作:database ? 格式: ? ? * create database 数据库名; ? ? * create database 数据库名 character set 字符集; */ CREATE DATABASE j0815_1;? CREATE DATABASE j0815_2 CHARACTER SET utf8; -查看数据库 SHOW DATABASES; -查看定义的数据库 SHOW CREATE DATABASE j0815_1; -删除数据库 DROP DATABASE j0815_1; -切换数据库 USE j0815_1; -查看正在使用的数据库: SELECT database();
2 表
2.1 创建表(异)
/* ? mysql: ? ? 1、mysql没有number、varchar2()类型; ? ? 2、mysql可以声明自增长:auto_increment; ? ? 3、mysql有double类型; ? oracle: ? ? 1、oracle没有double类型、有int类型但多数会用number来代替int; ? ? 2、oracle不可以声明自增长:auto_increment,主键自带自增长; ? ? 3、oracle小数只有float类型; */
--MySQL: create TABLE emp( ? eno INT PRIMARY KEY AUTO_INCREMENT, ? ename VARCHAR(20) NOT NULL UNIQUE, ? job VARCHAR(10) DEFAULT ‘员工‘, ? mgr INT(10), ? hiredate ?DATE, ? comm DOUBLE? );
--Oracle: create table emp( ? empno number(10) primary key,--主键 ? ename varchar2(20) not null unique,--不能为空,唯一 ? job varchar2(10) default ‘匿名‘,--默认值,用单引号 ? mgr number(10), ? hiredate date,--默认格式DD-MM-YY ? sal number(10,2), ? comm float, ? deptno number(10) );
??
2.2 删除表(异) /* ? ?MySQL: ? ? DROP TABLE IF EXISTS 表名; ? ? 或drop table if exists 表名;
? ?Oracle:
? ? drop table 表名;
? ?注:Oracle没有if exists关键字,也没用类似if exists的SQL语法。 */
--MySQL:
DROP TABLE IF EXISTS emp;
drop table if exists emp;
?
--Oracle:
drop table emp
3 列
3.1 添加列(异) /* ? MySQL:
? ? A. alter table 表名 add column 字段 数据类型;
? ? B. alter table 表名 add column 字段1 数据类型,add column 字段2 数据类型;
? ? 注:其中关键字column可有可无。
? Oracle:
? ? A. alter table 表名 add 字段 数据类型;
? ? B. alter table 表名 add (字段 数据类型);
? ? C. alter table 表名 add (字段1 数据类型,字段2 数据类型);?
? ? 注:对于A,只有添加单列的时候才可使用,对于添加多列时需要使用C,不能像MySQL那样重复使用add column关键字。 */ --MySQL: ALTER TABLE emp ADD COLUMN marriage VARCHAR(2);? ALTER TABLE emp ADD marriagedate DATE;? ALTER TABLE emp ADD COLUMN lovename VARCHAR(50),ADD COLUMN loveage INT;
--Oracle: alter table emp add marriage varchar2(2); alter table emp add (marriagedate DATE); alter table emp add (lovename varchar2(50),loveage INT);
desc emp;
3.2 删除列(异) /* ? MySQL:
? ? A. alter table 表名 drop column 字段;
? ? B. alter table 表名 drop column 字段,drop column 字段;
? ? 注:其中关键字column可有可无。
? ?
? Oracle:
? ? A. alter table 表名 drop column 字段;
? ? B. alter table 表名 drop (字段);
? ? C. alter table 表名 drop (字段1,字段2);
? ? 注:对于A,只有删除单列的时候才可使用,对于删除多列时需要使用C,不能像MySQL那样重复使用drop column关键字。 */ --MySQL: ALTER TABLE emp DROP COLUMN marriage; ALTER TABLE emp DROP COLUMN marriagedate,DROP COLUMN lovename,DROP COLUMN loveage;
--Oracle: alter table emp drop column marriage; alter table emp drop (marriagedate); alter table emp drop (lovename,loveage);
3.3 修改列名(异) /* ? MySQL:
? ? alter table 表名 change column 原来字段 新的字段 字段类型(必须);
? Oracle:
? ? alter table 表名 rename column 原来字段 to 新的字段; ?注:不能有字段类型 ? ?? ? ?? ? ? 修改字段类型:alter table 表名 modify(字段 数据类型 约束条件); */
--MySQL: ALTER TABLE emp CHANGE COLUMN mgr manager VARCHAR(20);
--Oracle: alter table emp rename column mgr to manager;
3.4 修改列类型(说明) /* ? Oracle中,在列有数据的时候,无法修改列类型;没有数据时可以。 ? ? ? alter table 表名 modify(字段 数据类型 约束条件);
? MySQL中,无论列是否有数据都可以修改列类型。 ? ? ? alter table 表名 modify column 字段名 类型;
? 但是当有数据时,直接修改列类型都可能对数据造成丢失等,所以一般需要结合具体的业务来对列数据做处理后,再修改列类型类型。所以修改列的类型并非使用SQL语句进行一步到位的修改,而是通过以下流程:
? ? A. 添加临时列
? ? B. 将需要更改的列的值经过类型转换的验证后,赋值给临时列
? ? C. 删除原有列
? ? D. 将临时列的列名修改为原有列列名 */
--MySQL: ALTER TABLE emp MODIFY COLUMN manager VARCHAR(20);
--Oracle: alter table emp modify(manager varchar2(20));
4 索引
/*
在整个数据库内,MySQL的索引可以同名,也就是说MySQL的索引是表级别的;但是Oracle索引不可以同名,也就是说Oracle的索引是数据库级别的。
4.1 创建索引(同)
create index indexName on tableName (columnName);
4.2 删除索引(异)
MySQL:
alter table tableName drop index indexName
?
Oracle:
drop index indexName
4.3 查询表的索引(异)
MySQL:
show index from tableName
?
Oracle:
select index_name,table_name,column_name from user_ind_columns where table_name=‘ tableName ‘? */ ?
5 空字符串问题 /*
Oracle中空字符串‘‘就是null(也就是说,只有null,没有空字符),而MySQL是区分null和‘‘的。
对于使用语句:select * from table1 where user_name <> ‘‘来查询列user_name不为空(不为null且不为空字符)时,Oracle会查不出任何结果,而MySQL可以正常运行。这里MySQL之所以可以得到正确结果,还因为比较符号<>会先将列为null的内容进行过滤,然后再比较内容是否为空字符串。
这就要求一方面,以后在编写代码的时候,尽量保证不会往数据库插入空字符串‘‘这样的值,要么保持有数据,要么保持为null。另外,对于MySQL中已经同时存在Null和‘‘时,所有判断是否为null或者‘‘的地方改为判断列的长度是否为0。 */
?
MySQL与Oracle SQL语言差异比较
|
编号
类别
ORACLE
MYSQL
注释
1
内连接的更改
1、
select a.*,b.*,c.*,d.*
? from a,b,c,d
?where a.id = b.id
?? and a.name is not null
?? and a.id = c.id(+)
?? and a.id = d.id(+)
"(+)"所在位置的另一侧为连接的方向,
所以上面的例子1是左连接。
以下的例子2既是右连接。
2、
select a.*,d
?where a.id = b.id
?? and a.name is not null
?? and a.id(+) = c.id
方法一
select a.*,d.*
? from a
? left join(c,d)?
? on (a.id = c.id and a.id = d.id),b
?where a.id = b.id
?? and a.name is not null
方法二
select a.*,d.*
? from a
? left join c on a.id = c.id
? left join d on a.id = d.id,b
?where a.id = b.id
?? and a.name is not null
oracle sql语句和mysql sql语句有一定的区别.
1. oracle左连接,右连接可以使用(+)来实现.?
?? Mysql只能使用left join,right join等关键字.?
2
最后一句执行的sql statement所取得或
影响的条数
SQL%ROWCOUNT
执行select语句后用: FOUND_ROWS()
执行update delete insert语句后用:?
ROW_COUNT().?
oracle中:?
sql 表示最后一句执行的 SQL Statement,rowcount表示該 SQL 所取得或影响的条数.
Mysql中:?
执行select语句后查询所影响的条数用: FOUND_ROWS()
执行update delete insert语句后查询所影响的条数用: ROW_COUNT()
3
查询分页
SELECT t1.*
FROM?
(SELECT MSG_INT_KEY,?
???? MSG_TY,?
???? MSG_CD,?
???? ROWNUM ROW_NUM
? FROM SD_SYS_MSG
? WHERE (ii_msg_int_key IS NULL?
??????? OR msg_int_key = ii_msg_int_key)
? ORDER BY MSG_CD
) t1
WHERE (in_page_no IS NULL)
?OR (t1.ROW_NUM >
????? ((in_page_no -1)*li_per_page_amt)?
?AND t1.ROW_NUM <
??? (in_page_no*li_per_page_amt + 1)
?);
方法:使用循环变量替换oracle中ROWNUM
set @mycnt = 0;
???? SELECT (@mycnt := @mycnt + 1) as ROW_NUM,t1.*
???? FROM
???? (SELECT? MSG_INT_KEY,???? MSG_TY,???? MSG_CD,??????? ROWNUM ROW_NUM
?????? FROM SD_SYS_MSG
??? WHERE (ii_msg_int_key IS NULL OR msg_int_key? = ii_msg_int_key )
?????? ORDER BY MSG_CD
???? ) t1
?????? WHERE (in_page_no IS NULL)
?????????????????? OR (t1.ROW_NUM> ((in_page_no - 1) * li_per_page_amt)
?????????????????? AND t1.ROW_NUM < (in_page_no * li_per_page_amt + 1)
???????????????????? );
?
4
java null值
""作为参数传入后,在oracle中将识别为null
""作为参数据传mysql还是""
现在java代码需要修改:
inPara.add(MSG_TY.equals("") ? null : MSG_TY);
5
执行动态sql
lv_sql := ‘SELECT ‘ ||‘ distinct ‘ || iv_cd_field_name || ‘ FIELD1 ‘||
???????????????? ‘ FROM ‘ || iv_table_name ||
???? ‘ WHERE ‘ || NVL(iv_where_cause,‘ 1=1 ‘);
? OPEN l_sys_cur FOR lv_sql;
?set @a = iv_cd_field_name;
?set @b = iv_table_name;
?set @c = IFNULL(iv_where_cause,‘ 1=1 ‘);
?SET @s = concat(‘SELECT distinct ‘,@a,‘ FIELD1? FROM ‘,@b,
????? ‘ WHERE ‘,IFNULL(@c,‘ 1=1 ‘));
?PREPARE stmt3 FROM @s;
?EXECUTE stmt3;
?
?DEALLOCATE PREPARE stmt3;
1. oracle可以将动态sql放在游标中执行.?
??? mysql游标声明有一定的局限性:? mysql游标必须在声明处理程序之前被声明,并且变量和条件必须在声明光标或处理程序之前被声明。Mysql采用Prepared Statements实现动态sql. 例子如下:
INT Emp_id_var = 56
PREPARE SQLSA
FROM "DELETE FROM employee WHERE emp_id=?" ;
EXECUTE SQLSA USING :Emp_id_var ;
6
存储过程相互调用时传递数组
oracle使用数组步骤:?
1.?将传入的字符串通过P_UNPACK_LIST方法转换为数组.(lo_holiday_jan_upl即为数组)
?? P_UNPACK_LIST(iv_jan__str,lv_delimiter,lo_holiday_jan_upl);
2.?传数组到另一个存储过程.
?? P_MOD_MONTH(iv_year,lo_holiday_jan_upl,iv_user_cd);
3. P_MOD_MONTH中使用数组: (将数组中的各个元素取出来插入到SD_HOLIDAY表)
FOR li_cnt IN 0 .. 9 LOOP
??? IF iv_daystr(li_cnt) IS NOT NULL THEN
????? INSERT INTO SD_HOLIDAY
??????? (HOLIDAY_INT_KEY,
???????? YEAR,
???????? MONTH,
???????? DAY,
???????? ENABLE_FLAG,
???????? CREATE_BY,
???????? CREATE_DATE,
???????? LAST_UPD_BY,
???????? LAST_UPD_DATE)
????? VALUES
??????? (SEQ_HOLIDAY_INT_KEY.NEXTVAL,
???????? iv_year,
???????? iv_month,
???????? iv_daystr(li_cnt),
???????? 1,
???????? iv_user_cd,
???????? ld_sys_date,
???????? ld_sys_date);
? END IF;
END LOOP;
mysql中数用数组步骤:?
1.?将需要处理的字符串交给执行业务逻辑
的存储过程处理.?
? CALL SD_HOLIDAY_P_MOD_MONTH(iv_year,iv_jan__str,iv_user_cd);
2. SD_HOLIDAY_P_MOD_MONTH中处理字符串. (将字符串按自定格式分隔出来,在对每个小字符串进行业务逻辑处理.)
SET lv_inputstr = iv_inputstr;
??? loopLable:LOOP
?? IF li_cnt > 9 THEN
???? LEAVE looplable;
?? ELSE
???? SET li_pos = INSTR(lv_inputstr,iv_delimiter);
???? IF li_pos = 0 THEN
???????? leave looplable;
???? ELSE
??????? set temp_str = SUBSTR(lv_inputstr,li_pos - 1);
?????? /*插入temp_str到SD_HOLIDAY表*/
?????? INSERT INTO SD_HOLIDAY(...)
?????? SET lv_inputstr = SUBSTRING(lv_inputstr,li_pos + LENGTH(iv_delimiter));?
???? END IF;??
???? SET li_cnt = li_cnt+1;
? END IF;
END LOOP loopLable;
?存储过程相互调用时传递数组解决方法:?
? oracle中传入12个字符串到存储过程,然后将这12个字符串转换为12个数组,再调用其他存储过程并将这12个数组分别传给存储过程,便利每个数组进行业务逻辑处理.?
?? mysql解决方法: 将存储过程中的数组去掉,两个存储过程调用时直接传递字符串,然后再需要处理业务逻辑的地方将字符串分解,进行业务逻辑处理.?
??
? 可以参考<<2009002-OTMPPS-Difficult Questions-0001.doc>> 中? 2.4.2 逐层分解字符串
7
Java无法以String来接取int
select fac_unit_key? FILED1在oracle可以
select fac_unit_key FILED1在mysql中要改
select CAST(fac_unit_key AS CHAR) FILED1
CAST(intvalue? AS CHAR)