Oracle和mysql的一些简单命令对比
1) 使用 mysql 时必须选择数据库 : use mydata; //没有则需创建 create database mydata;
查询表的结构: Oracle : desc emp; mysql : describe emp;
编辑本文: Oracle: 键入 ed 命令可以编辑sql 语句, 以 / 结束 执行
mysql : \. 路径来执行 sql 脚本文档.
2) 2.1 sysdate 与 now() to_char() 与 date_format()
SQL> select to_char(sysdate,'yyyy-mm-dd') from dual;
SQL> select to_char(sysdate,'hh24-mi-ss') from dual;
mysql> select date_format(now(),'%Y-%m-%d');
mysql> select time_format(now(),'%H-%i-%S');
mysql> select data_format(now(), '%Y年%m月%d日 %H:%i:%s')
2.2 日期函数:增加一个月
SQL> select to_char(add_months(to_date ('20000101','yyyymmdd'),1),'yyyy-mm-dd') from dual;
结果:2000-02-01
SQL> select to_char(add_months(to_date('20000101','yyyymmdd'),5),'yyyy-mm-dd') from dual;
结果:2000-06-01
mysql> select date_add('2000-01-01',interval 1 month);
结果:2000-02-01
mysql> select date_add('2000-01-01',interval 5 month);
结果:2000-06-01
2.3 截取字符串:substr() 与 substring()
SQL> select substr('abcdefg',1,5) from dual;
SQL> select substrb('abcdefg',1,5) from dual;
结果:abcdemysql> select substring('abcdefg',2,3);
结果:bcd
mysql> select mid('abcdefg',2,3);
结果:bcd
mysql> select substring('abcdefg',2);
结果:bcdefg
mysql> select substring('abcdefg' from 2);
结果:bcdefg
3) 在MySQL中from 后的表如果是(select.......)这种子表,那么后面必须有别名
4) 连接字符串在Oracle中用|| ,SqlServer中用+,MySQL中用concat('a','b','c')
5) mysql的group by 语句可以select 没有被分组的字段,如 select id,name,age from A group by age
但是在orcale和sqlserver中是会报错的。这个取出的id,name所在的行是每个分组中的第一行数据。
6) mysql,orcale,sqlserver 语句执行顺序
开始->FROM子句->WHERE子句->GROUP BY子句->HAVING子句->ORDER BY子句->SELECT子句->LIMIT子句->最终结果每个子句执行后都会产生一个中间结果 ,供接下来的子句使用,如果不存在某个子句,就跳过。
7) 分页查询:
Oracle 使用 rownum //rownum相当于行号,只能与 < 或 <= 来使用,并且只能从 1 开始;而个rownum 起别名之后就可随意使用.
mysql 使用 limit //select * from table limit m,n 其中m是指记录开始的index,从0开始,表示第一条记录, n是指从第m+1条开始,取n条.
eg:select * from tablename limit 2,4 //取出第3条至第6条,4条记录
--求薪水最高的第六到第十名雇员
Oracle :
方法1:
select ename, sal from
(
select ename, sal, rownum r from (select ename, sal from emp order by sal desc)
)
where r >=6 and r <= 10
方法2:
select ename, sal from
(
select ename, sal, rownum r from (select ename, sal from emp order by sal desc)
where rownum <= 10
)
where r >=6
分析:方法2效率更高,2个方法在执行第1层子查询时均取得所有数据,而在执行第2层子查询时,方法1取了所有数据,方法2只取了前10条数据,在第3层查询时,方法1在所有数据中取6到10,而方法2在10条数据中取第6之后的数据.因此方法2的执行效率更高.
mysql:
select ename,sal from emp order by sal desc limit 5, 5
8) 自动递增:
Oracle 使用 sequence 来实现自动递增:
create sequence seq; //1.首先建立一个自动化序列 seq
create table user //2.建立1个表
(
id number(6) primary key,
name varchar2(20),
......
)
insert into user values(seq.nextval, '水电费', ....); //3.插入数据时,使用seq.nextval,获取值并自动+1
select seq.currval from dual; //4.获取当前 seq 的值
mysql 使用 auto_increment 来实现自动递增:
create table user
(
id number(6) primary key auto_increment, //1.创建1张表,标记自动递增
name varchar2(20),
......
)
insert into user values(null, '水电费', .....); //2.插入数据时使用 null 值,会自动递增.