因为以前用的是oracle,所以总结一些mysql语法上的区别(区别用法,只写mysql)


提交方式:

bdb , innodb:支持事务 commit 提交方式: 默认为autocommit = on , 注意误操作
myisam等引擎 :不支持事务 commit不生效

查看自动提交参数

mysql> show variables like ‘%autocommit%’;

设置提交参数 (临时,只针对当前会话)

set @@autocommit=0

永久修改:
通过修改配置文件my.cnf文件
在[mysqld](服务器选项下)添加:
autocommit=0保存,然后重启mysql服务即可生效


mysql可以实现自增长主键(通过字段的auto_increment属性);无法获取nextval
Oracle则需要通过序列(Sequence)来实现。 可以直接得到下一个id值
这也是商业和非商业性质数据库比较大的一个区别


语法区别

1.mysql的子查询一定要写别名

不起别名会报错:

mysql> select * from (select * from tb1);
ERROR 1248 (42000): Every derived table must have its own alias

加别名

mysql> select * from (select * from tb1) as tb;
+------+----------+
| id   | name     |
+------+----------+
|    1 | zhangsan |
|    2 | lisi     |
|    3 | wangwu   |
+------+----------+
3 rows in set (0.00 sec)

mysql删除语句表不支持别名

mysql> delete from tb1 as t where t.id = '1';
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'as t where t.id = '1'' at line 1

mysql> delete from tb1  where id = '1';
Query OK, 1 row affected (0.05 sec)

now( ) 和 sysdate( )
NOW()取的是语句开始执行的时间,SYSDATE()取的是动态的实时时间。
NOW()取自mysql的一个变量”TIMESTAMP”,而这个变量在语句开始执行的时候就设定好了,因此在整个语句执行过程中都不会变化。

concat() 支持多个参数拼接

mysql> select concat('a', 'b', 'c') from dual;
+-----------------------+
| concat('a', 'b', 'c') |
+-----------------------+
| abc                   |
+-----------------------+
1 row in set (0.00 sec)

if(condition , A, B)

mysql> select if(1+1=2,'a','b') from dual ;
+-------------------+
| if(1+1=2,'a','b') |
+-------------------+
| a                 |
+-------------------+
1 row in set (0.00 sec)

time_format 和 data_format

mysql> select time_format(now(),'%H-%i-%S'); 
+-------------------------------+
| time_format(now(),'%H-%i-%S') |
+-------------------------------+
| 15-25-28                      |
+-------------------------------+
1 row in set (0.00 sec)

mysql> select date_format(now(),'%Y-%m-%d'); 
+-------------------------------+
| date_format(now(),'%Y-%m-%d') |
+-------------------------------+
| 2018-08-11                    |
+-------------------------------+
1 row in set (0.00 sec)

ifnull(expr1,expr2)
expr1为空那么显示expr2,否则显示expr1

offset limit 用法
语句1:select * from test_tb1 limit 2 offset 1;//MySQL5.0之后支持该语法
语句2:select * from test_tb1 limit 1,2;
语句1和语句2是等价的
行号从0开始,limit m,n代表第1行,返回n条数据(从0行开始)。
分页用法
offset -> (page - 1) * pageSize
limit -> pageSize

mysql的group by 语句
可以select 没有被分组的字段,如 select id,name,age from A group by age;
这个取出的id,name所在的行是每个分组中的第一行数据。
不完全准确:需要修改参数sql_mode=only_full_group_by,然而这样的修改是不被推荐的

mysql> select id ,count(name) from tb1 group by name;
ERROR 1055 (42000): Expression #1 of SELECT list is not in GROUP BY clause and contains 
nonaggregated column 'mydb.tb1.id' which is not functionally dependent on columns in GROUP BY clause; 
this is incompatible with sql_mode=only_full_group_by

CAST与CONVERT的用法
数据类型转换函数
convert(score, SIGNED)
1、CAST(value as type) 就是CAST(xxx AS 类型)
2、CONVERT(value, type) 就是CONVERT(xxx,类型)
限制:
二进制,同带binary前缀的效果 : BINARY
字符型,可带参数 : CHAR()
日期 : DATE
时间: TIME
日期时间型 : DATETIME
浮点数 : DECIMAL
整数 : SIGNED
无符号整数 : UNSIGNED

coalesce函数
coalesce函数返回参数(列名)中第一个非NULL的字段值,注意不是为空”

使用细节:

  • mysql中注释行以“#“开始;
  • mysql中备份命令:mysqldump,执行结果是一个sql文件;
  • mysql在Windows环境下大小写是不敏感的;unix/linux环境下,对数据库名、表名大小写敏感,列名大小写不敏感。
  • show create table_name 可以查看DDL语句

开发手册中以前未注意的:

  • 5.3.1【强制】不要使用 count(列名)或 count(常量)来替代 count(),count()是 SQL92 定义的 标准统计行数的语法,跟数据库无关,跟 NULL 和非 NULL 无关。
  • 5.3.3 使用如下方式来避免 sum 的 NPE 问题:SELECT IF(ISNULL(SUM(g)),0,SUM(g)) FROM table;
  • 5.3.5. 【强制】在代码中写分页查询逻辑时,若 count 为 0 应直接返回,避免执行后面的分页语句。