目录与学习目标
1:数据库的层次结构上2:数据库中表字段类型3:主键4:单引号处理5:空字符的处理6:翻页的sql语句的处理 7:组函数用法规则8:日期字段的处理9:长字符串的处理10:字符串的模糊比较
1:数据库的层次结构上
oracle:创建一个数据库,数据库下有好多用户:sys、system、scott等,不同用户下有好多表,一般情况下只创建一个数据库用。mysql:默认用户是root,用户下可以创建好多数据库,每个数据库下还有好多表,一般情况下都是使用默认用户,不会创建多个用户;
2:数据库中表字段类型
oracle:number 数值型 varchar2、varchar、char 字符型 date 日期型 等…mysql:int、float、double等数值型, varchar、char字符型, date、datetime、time、year、timestamp等日期型。
3:主键
oracle:没有自动增长类型,主键一般使用的序列,插入记录时将序列号的下一个值赋给该字段即可,只是ORM框架是只要是native主键生成策略即可。mysql:一般使用自动增长类型,在创建表时只要指定表的主键auto increment,插入记录时,不需要再指定该记录的主键值,mysql将自动增长。mysql有自动增长的数据类型,插入记录时不用操作此字段,会自动获得数据值。oracle没有自动增长的数据类型,需要建立一个自动增长的序列号,插入记录时要把序列号的下一个值赋于此字段。create sequence序列号的名称(最好是表名+序列号标记)increment by 1 start with 1 maxvalue 99999 cycle nocache;其中最大的值按字段的长度来定,如果定义的自动增长的序列号number(6),最大值为999999insert语句插入这个字段值为:序列号的名称.nextval
4:单引号处理
oracle:只可以用单引号包起字符串, 如果需要输入字符串 ' ,则需要使用 '' 替换 ' 。mysql:可以用双引号包起字符串。
5:空字符的处理
oracle: 定义了非空字段就不容许有null与空字符串。(因为Oracle没有空字符串的概念)mysql: 定义了非空字段就不容许有null,但运行有空字符串。(因为MySQL有空字符串的概念)
6:翻页的sql语句的处理
oracle处理翻页的 sql语句比较繁琐。有3种方式:1:rowId2:分析函数 row_number3:rownum下面仅讲解使用rownum进行分页每个结果集只有一个rownum字段标明它的位置,并且只能用rownum<100,不能用rownum>50。这里就要对oracle的rownum做进一步的理解。因为rownum并不是当作实体数据存放在每一张表中,而是在每一次select查询的时候,根据基表的默认insert顺序由oracle动态分配的,有前100才有打印50,如果rownum没有前100,那么大于50也就没有了意义,所以这个查询就不会有任何结果出来。以下是经过分析后较好的两种oracle翻页sql语句(id是唯一关键字的字段名),我们需要利用子查询和别名列来实现这个需求:语句一: select id, [field_name,...] from table_name where id in ( select id from (select rownum as numrow, id from table_name where 条件1 order by 条件2) where numrow > 50 and numrow < 100 ) order by 条件3;语句二: select * from ( ( select rownum as numrow, c.* from (select [field_name,...] from table_name where 条件1 order by 条件2) c) where numrow > 50 and numrow < 100 ) order by 条件3;
mysql 处理翻页的sql语句比较简单,用limit开始位置,记录个数;
7:组函数用法规则
在oracle中如果查询语句中有组函数,那其他列名必须是组函数处理过的,或者是group by子句中的列否则报错。而在mysql中组函数在select语句中可以随意使用
在oracle中就有问题:select name,count(money) from user;需要修改成:1:select name,count(money) from user group by name 2:select max(name),count(money) from user;
以下三个SQL放在mysql中没有问题select name,count(money) from user;1:select name,count(money) from user group by name 2:select max(name),count(money) from user;
8:日期字段的处理
oracle: 日期字段只有date,包含年月日时分秒信息。 有两种格式SYSDATE与SYSTIMESTAMP 本质上都是date,只是展示的时候不太一样。 转换通常使用两种方式: 1:to_char函数,date形式转字符串 2:to_date函数,字符串形式转date形式 用当前数据库的系统时间为SYSDATE,精确到秒, SELECT SYSDATE FROM dual; SELECT to_char(SYSDATE,'yyyy-mm-dd hh24:mi:SS') TIME FROM DUAL; 用当前数据库的系统时间为SYSTIMESTAMP,精确到毫秒, SELECT SYSTIMESTAMP FROM DUAL; SELECT to_char(SYSTIMESTAMP,'yyyy-mm-dd hh24:mi:SS:ff') TIME FROM DUAL; SELECT to_char(SYSTIMESTAMP,'yyyy-mm-dd hh24:mi:SS') TIME FROM DUAL; 日期型字段转换成字符串函数to_char(‘2001-08-01','yyyy-mm-dd hh24:mi:ss') select to_date('20220410','yyyy-mm-dd hh24:mi:SS') from dual select to_date('20220410153010','yyyy-mm-dd hh24:mi:SS') from dual oracle找到离当前时间7天用 date_field_name >sysdate - 7;
mysql 日期字段分date和time两种> 插入当前时间的几个函数是: now()函数以`'yyyy-mm-dd hh:mm:ss'返回当前的日期时间,可以直接存到datetime字段中。 curdate()以'yyyy-mm-dd'的格式返回今天的日期,可以 直接存到date字段中。 curtime()以'hh:mm:ss'的格式返回当前的时间,可以直接存到time字段中。 例:insert into tablename (fieldname) values (now()) mysql找到离当前时间7天用date_field_name > subdate(now(),interval 7 day)
9:长字符串的处理
oracle: 长字符串的处理oracle有它特殊的地方。 insert和update时最大可操作的字符串长度小于等于4000个单字节,如果要插入更长的字符串,请考虑字段用clob类型,方法借用oracle里自带的dbms_lob程序包。 插入修改记录前一定要做进行非空和长度判断,不能为空的字段值和超出长度字段值都应该提出警告,返回上次操作。 mysql: varchar类型 MySQL5.0以下版本: 最大长度255 MySQL5.0以上版本: 最大长度65535 如果VARCHAR类型不能满足你存取字符串长度的需求,那么应选择以下字符字段类型。 text类型 最大长度65535 mediumtext类型 最大长度16777215 longtext类型 最大长度4294967295
10:字符串的模糊比较
两者都可以使用 like%XXX% 或者 instr函数,不管是Oracle还是MySQL,当查询的字段添加索引之后,使用instr函数明显比like要快1.select * from tb where name like '%XX%';2.select * from tb where instr(name,'XXX')>0;若是在name字段上没有加索引,两者效率差不多,基本没有区别。为提高效率,我们在name字段上可以加上非唯一性索引:create index idx_tb_name on tb(name);然后再重复上面的查询,会发现速度有所提升