SQL

  1. 如果是组合索引,且遵循最左匹配,如果其中有字段是范围查询,那么:命中的字段只会到范围查询那个字段,比如:
EXPLAIN select * FROM TEST_COMPOSITE_INDEX tci 
where tci.AA>'A1' AND tci.BB='B1';

那么这次查询使用的索引字段只有:AA,而不会使用BB

  1. 索引字段为 ABC,AC会使用到索引(实际上只有A)、BC不会用到索引
  2. 不能在字段上使用函数,否则就不会走索引
  3. 可以使用count(distinct left(列名,索引长度))/count(*)的来确定区分度。
  4. DELETE语句执行删除的过程是每次从表中删除一行,并且同时将该行的删除操作作为事务记录在日志中保存以便进行进行回滚操作。
    TRUNCATE TABLE 则一次性地从表中删除所有的数据并不把单独的删除操作记录记入日志保存,删除行是不能恢复的。并且在删除的过程中不会激活与表有关的删除触发器。执行速度快。
  5. 当表被TRUNCATE 后,这个表和索引所占用的空间会恢复到初始大小,
    DELETE操作不会减少表或索引所占用的空间。
    drop语句将表所占用的空间全释放掉。
  6. delete语句为DML(data maintain Language),这个操作会被放到 rollback segment中,事务提交后才生效。如果有相应的 tigger,执行的时候将被触发。
    truncate、drop是DDL(data define language),操作立即生效,原数据不放到 rollback segment中,不能回滚

大事务一般会对数据库造成什么问题?

  1. 锁定数据过多,容易造成大量的死锁和锁超时
  2. 回滚记录占用大量存储空间,事务回滚时间长
  3. 执行时间长,容易造成主从延迟
  1. union不包含重复的行,union all包含重复行
  2. 使用 like 进行模糊查询时,%不要放在首位(尽量避免’%abc%’的写 法),因为会限制对索引的使用。 例如 like 'abc%' 可以走索引,而 like '%abc'或者'%abc%'基本不会走索引。
  3. MySQL判空函数 IFNULL(expr1,expr2) 如果expr1不是NULL,IFNULL()返回expr1,否则它返回expr2。IFNULL()返回一个数字或字符串值,取决于它被使用的上下文环境。
  4. IFNULL在规范中不允许使用,会影响sql的效率,替换方案为 CASE WHEN
select
    ifnull(t2.trantask_name,t1.trantask_name) AS trantask_name,
    (CASE
        WHEN t2.trantask_name is NULL THEN t1.trantask_name
        ELSE t2.trantask_name
        END) AS trantask_name
from A t1
LEFT JOIN B t2 ON t1.trantask_id=t2.trantask_id
WHERE t1.trantask_id=7
  1. FIND_INSET函数
    FIND_INSET(A,B)返回A串在B串中的位置,不存在则返回0
  2. INSTR函数
    INSTR(str,substr)返回substr在str中的位置,不存在则返回0
  3. Oracle判空函数     | Logic                 | equivalent                   |     | ---------------------- | ----------------------------- |     | DECODE(E1, E2, E3, E4) | IF E1 = E2 THEN E3 ELSE E4   |     | NULLIF(E1, E2)         | IF E1 = E2 THEN NULL ELSE E1 |     | NVL(E1, E2)           | IF E1 IS NULL THEN E2 ELSE E1 |     | NVL2(E1, E2, E3)       | IF E1 IS NULL THEN E3 ELSE E2 |
  4. Oracle 在使用group by 时,有一个规则需要遵守,即出现在select列表中的字段,如果没有在组函数中,那么必须出现在group by 子句中。(select中的字段不可以单独出现,必须出现在group语句中或者在组函数中。)
  5. MYSQL: 字符集转换 : CONVERT(xxx USING gb2312) 类型转换和SQL Server一样,就是类型参数有点点不同 : CAST(xxx AS 类型) , CONVERT(xxx,类型),类型必须用下列的类型: 可用的类型  二进制,同带binary前缀的效果 : BINARY   字符型,可带参数 : CHAR()   日期 : DATE   时间: TIME   日期时间型 : DATETIME   浮点数 : DECIMAL   整数 : SIGNED   无符号整数 : UNSIGNED

Mysql与Oracle函数、语法的区别

基本数据类型

编号

ORACLE

MYSQL

注释

1

NUMBER

int / DECIMAL

DECIMAL就是NUMBER(10,2)这样的结构INT就是是NUMBER(10),表示整型; MYSQL有很多类int型,tinyint mediumint bigint等,不同的int宽度不一样

2

Varchar2(n)

varchar(n)

3

Date

DATATIME

日期字段的处理 MYSQL日期字段分DATE和TIME两种,ORACLE日期字段只有DATE,包含年月日时分秒信息,用当前数据库的系统时间为 SYSDATE, 精确到秒,或者用字符串转换成日期型函数TO_DATE(‘2001-08-01','YYYY-MM-DD')年-月-日 24小时:分钟:秒的格式YYYY-MM-DD HH24:MI:SS TO_DATE()还有很多种日期格式, 可以参看ORACLE DOC.日期型字段转换成字符串函数TO_CHAR(‘2001-08-01','YYYY-MM-DD HH24:MI:SS') 日期字段的数学运算公式有很大的不同。MYSQL找到离当前时间7天用 DATE_FIELD_NAME > SUBDATE(NOW(),INTERVAL 7 DAY)ORACLE找到离当前时间7天用 DATE_FIELD_NAME >SYSDATE - 7; MYSQL中插入当前时间的几个函数是:NOW()函数以`'YYYY-MM-DD HH:MM:SS'返回当前的日期时间,可以直接存到DATETIME字段中。CURDATE()以'YYYY-MM-DD'的格式返回今天的日期,可以直接存到DATE字段中。CURTIME()以'HH:MM:SS'的格式返回当前的时间,可以直接存到TIME字段中。例:insert into tablename (fieldname) values (now()) 而oracle中当前时间是sysdate

4

INTEGER

int / INTEGER

Mysql中INTEGER等价于int

5

EXCEPTION

SQLEXCEPTION

详见<<2009001-eService-O2MG.doc>>中2.5 Mysql异常处理

6

CONSTANT VARCHAR2(1)

mysql中没有CONSTANT关键字

从ORACLE迁移到MYSQL,所有CONSTANT常量只能定义成变量

7

TYPE g_grp_cur IS REF CURSOR;

光标 : mysql中有替代方案

详见<<2009001-eService-O2MG.doc>>中2.2 光标处理

8

TYPE unpacklist_type IS TABLE OF VARCHAR2(2000) INDEX BY BINARY_INTEGER;

数组: mysql中借助临时表处理 或者直接写逻辑到相应的代码中, 直接对集合中每个值进行相应的处理

详见<<2009001-eService-O2MG.doc>>中2.4 数组处理

9

自动增长的序列

自动增长的数据类型

MYSQL有自动增长的数据类型,插入记录时不用操作此字段,会自动获得数据值。ORACLE没有自动增长的数据类型,需要建立一个自动增长的序列号,插入记录时要把序列号的下一个值赋于此字段。

10

NULL

NULL

空字符的处理 MYSQL的非空字段也有空的内容,ORACLE里定义了非空字段就不容许有空的内容。按MYSQL的NOT NULL来定义ORACLE表结构, 导数据的时候会产生错误。因此导数据时要对空字符进行判断,如果为NULL或空字符,需要把它改成一个空格的字符串。

数字函数

  1. 功能: 返回不小于 X 的最小整数
  2. Oracle:ceil(-1.001) --> select ceil(-1.001) value from dual
  3. Mysql:ceiling(-1.001) --> select ceiling(-1.001) value

=========================================================================

  1. 功能:在父串中从第1/n个字符开始查找子串,序号从1开始
  2. Oracle:INSTR('sdsq','s',2) --> select INSTR('sdsq','s',2) value from dual(要求从位置2开始)
  3. MySQL: INSTR('sdsq','s') --> select INSTR('sdsq','s') value(从默认的位置1开始)

=========================================================================

  1. 功能:字符串截取
  2. Oracle:SUBSTR('abcd',2,2) --> select substr('abcd',2,2) value from dual
  3. MySQL:substring('abcd',2,2) --> select substring('abcd',2,2) value

=========================================================================

  1. 功能:获取字符串长度
  2. Oracle:length(str) --> SELECT length('AAAASDF') VALUE FROM DUAL
  3. MySQL:char_length() --> SELECT char_length('AAAASDF') VALUE

=========================================================================

类型转换函数

  1. 功能:类型转换 日期转换为字符串格式
  2. Oracle:TO_CHAR(SQLCODE) --> select to_char(sysdate,'yyyy-mm-dd') from dual; select to_char(sysdate,'hh24-mi-ss') from dual;
  3. MySQL:date_format/ time_format --> select date_format(now(),'%Y-%m-%d'); select time_format(now(),'%H-%i-%S');

=========================================================================

  1. 功能:类型转换 字符串转换为日期格式
  2. Oracle:to_date(str,format) --> SELECT to_date('2009-3-6','yyyy-mm-dd') VAULE FROM DUAL
  3. MySQL:STR_TO_DATE(str,format) --> SELECT STR_TO_DATE('2004-03-01', '%Y-%m-%d') VAULE

=========================================================================

  1. 功能: 截取时间或者数值,返回指定的值
  2. Oracle:trunc(-1.002) --> select trunc(-1.002) value from dual
  3. MySQL:cast(-1.002 as SIGNED) --> select cast(-1.002 as SIGNED) value

=========================================================================

  1. 功能:类型转换 将字符串转换为数值类型
  2. Oracle:TO_NUMBER(str) --> SELECT TO_NUMBER('123') AS VALUE FROM DUAL;
  3. MySQL:CAST("123" AS SIGNED INTEGER) --> SELECT CAST("123" AS SIGNED INTEGER) as value; SIGNED INTEGER:带符号的整形

=========================================================================

日期函数

  1. 功能:获取当前日期时间
  2. Oracle:SYSDATE --> select SYSDATE value from dual
  3. MySQL:now() / SYSDATE() --> select now() value; select sysdate() value;

=========================================================================

  1. 功能:当前系统时间的 下一星期天~六 (1-7) 的时间
  2. Oracle:Next_day(sysdate,7) --> SELECT Next_day(sysdate,7) value FROM DUAL
  3. MySQL:需要自定义函数实现

=========================================================================