目录与学习目标

  1. 1:数据库的层次结构上
  2. 2:数据库中表字段类型
  3. 3:主键
  4. 4:单引号处理
  5. 5:空字符的处理
  6. 6:翻页的sql语句的处理
  7. 7:组函数用法规则
  8. 8:日期字段的处理
  9. 9:长字符串的处理
  10. 10:字符串的模糊比较

1:数据库的层次结构上

  1. oracle:创建一个数据库,数据库下有好多用户:syssystemscott等,不同用户下有好多表,一般情况下只创建一个数据库用。
  2. mysql:默认用户是root,用户下可以创建好多数据库,每个数据库下还有好多表,一般情况下都是使用默认用户,不会创建多个用户;

2:数据库中表字段类型

  1. oraclenumber 数值型
  2. varchar2varcharchar 字符型
  3. date 日期型 等…
  4. mysqlintfloatdouble等数值型,
  5. varcharchar字符型,
  6. datedatetimetimeyeartimestamp等日期型。

3:主键

  1. oracle:没有自动增长类型,主键一般使用的序列,插入记录时将序列号的下一个值赋给该字段即可,只是ORM框架是只要是native主键生成策略即可。
  2. mysql:一般使用自动增长类型,在创建表时只要指定表的主键auto increment,插入记录时,不需要再指定该记录的主键值,mysql将自动增长。
  3. mysql有自动增长的数据类型,插入记录时不用操作此字段,会自动获得数据值。oracle没有自动增长的数据类型,需要建立一个自动增长的序列号,插入记录时要把序列号的下一个值赋于此字段。
  4. create sequence序列号的名称(最好是表名+序列号标记)increment by 1 start with 1 maxvalue 99999 cycle nocache;
  5. 其中最大的值按字段的长度来定,如果定义的自动增长的序列号number(6),最大值为999999
  6. insert语句插入这个字段值为:序列号的名称.nextval

4:单引号处理

  1. oracle:只可以用单引号包起字符串,
  2. 如果需要输入字符串 ' ,则需要使用 '' 替换 '
  3. mysql:可以用双引号包起字符串。

5:空字符的处理

  1. oracle
  2. 定义了非空字段就不容许有null与空字符串。(因为Oracle没有空字符串的概念)
  3. mysql
  4. 定义了非空字段就不容许有null,但运行有空字符串。(因为MySQL有空字符串的概念)

6:翻页的sql语句的处理

  1. oracle处理翻页的 sql语句比较繁琐。
  2. 3种方式:
  3. 1rowId
  4. 2:分析函数 row_number
  5. 3rownum
  6. 下面仅讲解使用rownum进行分页
  7. 每个结果集只有一个rownum字段标明它的位置,并且只能用rownum<100,不能用rownum>50
  8. 这里就要对oraclerownum做进一步的理解。
  9. 因为rownum并不是当作实体数据存放在每一张表中,而是在每一次select查询的时候,
  10. 根据基表的默认insert顺序由oracle动态分配的,有前100才有打印50,如果rownum没有前100,那么大于50也就没有了意义,所以这个查询就不会有任何结果出来。
  11. 以下是经过分析后较好的两种oracle翻页sql语句(id是唯一关键字的字段名),
  12. 我们需要利用子查询和别名列来实现这个需求:
  13. 语句一:
  14. select id, [field_name,...]
  15. from table_name where
  16. id in ( select id from (select rownum as numrow, id from table_name where 条件1 order by 条件2) where numrow > 50 and numrow < 100 )
  17. order by 条件3;
  18. 语句二:
  19. select * from (
  20. ( select rownum as numrow, c.* from (select [field_name,...] from table_name where 条件1 order by 条件2) c)
  21. where numrow > 50 and numrow < 100 )
  22. order by 条件3;

  1. mysql 处理翻页的sql语句比较简单,用limit开始位置,记录个数;

7:组函数用法规则

  1. oracle中如果查询语句中有组函数,那其他列名必须是组函数处理过的,或者是group by子句中的列否则报错。
  2. 而在mysql中组函数在select语句中可以随意使用

  1. oracle中就有问题:
  2. select name,count(money) from user
  3. 需要修改成:
  4. 1select name,count(money) from user group by name
  5. 2select max(name),count(money) from user

  1. 以下三个SQL放在mysql中没有问题
  2. select name,count(money) from user
  3. 1select name,count(money) from user group by name
  4. 2select max(name),count(money) from user

8:日期字段的处理

  1. oracle
  2. 日期字段只有date,包含年月日时分秒信息。
  3. 有两种格式SYSDATESYSTIMESTAMP 本质上都是date,只是展示的时候不太一样。
  4. 转换通常使用两种方式:
  5. 1to_char函数,date形式转字符串
  6. 2to_date函数,字符串形式转date形式
  7. 用当前数据库的系统时间为SYSDATE,精确到秒,
  8. SELECT SYSDATE FROM dual;
  9. SELECT to_char(SYSDATE,'yyyy-mm-dd hh24:mi:SS') TIME FROM DUAL;
  10. 用当前数据库的系统时间为SYSTIMESTAMP,精确到毫秒,
  11. SELECT SYSTIMESTAMP FROM DUAL;
  12. SELECT to_char(SYSTIMESTAMP,'yyyy-mm-dd hh24:mi:SS:ff') TIME FROM DUAL;
  13. SELECT to_char(SYSTIMESTAMP,'yyyy-mm-dd hh24:mi:SS') TIME FROM DUAL;
  14. 日期型字段转换成字符串函数to_char(‘2001-08-01','yyyy-mm-dd hh24:mi:ss')
  15. select to_date('20220410','yyyy-mm-dd hh24:mi:SS') from dual
  16. select to_date('20220410153010','yyyy-mm-dd hh24:mi:SS') from dual
  17. oracle找到离当前时间7天用 date_field_name >sysdate - 7;

  1. mysql
  2. 日期字段分datetime两种>
  3. 插入当前时间的几个函数是:
  4. now()函数以`'yyyy-mm-dd hh:mm:ss'返回当前的日期时间,可以直接存到datetime字段中。
  5. curdate()以'yyyy-mm-dd'的格式返回今天的日期,可以 直接存到date字段中。
  6. curtime()以'hh:mm:ss'的格式返回当前的时间,可以直接存到time字段中。
  7. 例:insert into tablename (fieldname) values (now())
  8. mysql找到离当前时间7天用date_field_name > subdate(now(),interval 7 day)

9:长字符串的处理

  1. oracle
  2. 长字符串的处理oracle有它特殊的地方。
  3. insertupdate时最大可操作的字符串长度小于等于4000个单字节,如果要插入更长的字符串,请考虑字段用clob类型,方法借用oracle里自带的dbms_lob程序包。
  4. 插入修改记录前一定要做进行非空和长度判断,不能为空的字段值和超出长度字段值都应该提出警告,返回上次操作。
  5. mysql
  6. varchar类型
  7. MySQL5.0以下版本: 最大长度255
  8. MySQL5.0以上版本: 最大长度65535
  9. 如果VARCHAR类型不能满足你存取字符串长度的需求,那么应选择以下字符字段类型。
  10. text类型
  11. 最大长度65535
  12. mediumtext类型
  13. 最大长度16777215
  14. longtext类型
  15. 最大长度4294967295

10:字符串的模糊比较

  1. 两者都可以使用 like%XXX% 或者 instr函数,
  2. 不管是Oracle还是MySQL,当查询的字段添加索引之后,使用instr函数明显比like要快
  3. 1.select * from tb where name like '%XX%';
  4. 2.select * from tb where instr(name,'XXX')>0;
  5. 若是在name字段上没有加索引,两者效率差不多,基本没有区别。
  6. 为提高效率,我们在name字段上可以加上非唯一性索引:
  7. create index idx_tb_name on tb(name);
  8. 然后再重复上面的查询,会发现速度有所提升