ORACLE/MYSQL/MSSQL语法的不同之处
最近在研究Oracle/MySQL/MSSQL三种数据库的数据增删改。以此记录一些使用感受。
转义符
每种数据库都有自己的关键字,比如view
。当使用关键字作为表名时,需要使用转义符对关键字进行处理后才能创建对应的表,列名同理。
- MSSQL中的转义符为
[]
- Oracle中的转义符为
"
- MySQL中的转义符为```
大小写
MSSQL和MySQL默认对大小写不敏感,所以在写这两个数据库的查询语句时,表名和列名不论大小写都支持。
Oracle是大小写敏感的,默认情况下,表名和列名都是大写。但是一旦用转义符"
引用表名或列名,此时就要注意表名和列名的大小写了。
临时表
MSSQL
MSSQL中的临时表分为两种,#
开头的为局部临时表,##
开头的为全局临时表。它不存储在当前数据库内,而是存储在系统数据库tempdb
里。
局部临时表只在当前会话中创建和访问,当退出当前会话后,局部临时表就不存在了。
全局临时表一旦创建后,任何用户都可以连接访问。当创建这个临时表会话的用户中断连接后,且没有其他用户访问这个临时表,全局临时表才会被删除。
一般情况下我们会先判断临时表是否存在,如果已存在则清空,如果不存在则创建。
MSSQL语法
1 | IF OBJECT_ID(N'tempdb.dbo.#temp_table') IS NOT NULL BEGIN TRUNCATE TABLE #temp_table; END ELSE BEGIN SELECT * INTO #temp_table FROM source_table; END |
Oracle
Oracle中的临时表有点不同,一旦创建后它的表结构会保留,不会随着用户连接断开而自动销毁。只是它存在的空间为临时的表空间,而非用户的表空间。Oracle临时表支持会话以及事务级别,只对当前的会话或事务可见。每个会话只能查看和修改自己的数据。
- ON COMMIT DELETE ROWS
这是临时表的默认参数,表示临时表中的数据仅在事务过程中有效。当事务提交后,临时表的数据将被自动TRUNCATE。
- ON COMMIT PRESERVER ROWS
临时表的内容可以跨事务存在,只有当会话结束时,临时表的数据才会被丢弃。
以上两种临时表,在事务或会话结束后,它的结构和元数据都还存储在用户的数据字典中。所以,一旦使用完临时表,最好立即删除,否则数据库残留很多临时表的表结构和元数据。
Oracle创建临时表的语法
1 | CREATE GLOBAL TEMPORARY TABLE temp_table (...) ON COMMIT DELETE/PRESERVE ROWS |
需要注意的是,如果使用
1 | SELECT * INTO temp_table FROM source_table; |
来创建临时表的话,如果列为字符串类型,默认情况下,临时表对应的列的长度只有2。
MySQL
MySQL中的临时表和MSSQL的临时表功能的类似,只是创建临时表的语法不同
1 | CREATE TEMPORARY TABLE IF NOT EXISTS temp_table(...); |
Insert语法
三个数据库都可以通用
1 | INSERT INTO target_table(target_col1, target_col2, ...) SELECT (source_col1, source_col2, ...) FROM source_table; |
Update语法
MSSQL
1 | UPDATE target_table SET ... FROM source_table WHERE condition; |
Oracle
1 | UPDATE target_table SET (target_col1, target_col2, ...) = (SELECT source_col1, source_col2, ... FROM source_table WHERE condition); |
MySQL
1 | UPDATE target_table INNER JOIN source_table ON condition SET ...; |
DELETE语法
三个数据库都可以通用
1 | DELETE FROM target_table WHERE EXISTS (SELECT * FROM source_table WHERE condition); |
分页
MSSQL使用TOP
关键字进行条数限制查询。语法为
1 | SELECT TOP 1000 * FROM table; |
Oracle使用ROWNUM
关键字进行条数限制查询。语法为
1 | SELECT * FROM table WHERE ROWNUM <= 1000; |
MySQL使用LIMIT
以及OFFSET
关键字进行条数限制查询。语法为
1 | SELECT * FROM table LIMIT 100 OFFSET 100 |