一、数据类型
Oracle与MySQL语法在数据类型方面存在一些差别。
Oracle中,字符串类型可以使用VARCHAR、VARCHAR2、CHAR,其中CHAR是定长字符串,VARCHAR和VARCHAR2是变长字符串。而在MySQL中,字符串类型只有VARCHAR和CHAR,其中CHAR是定长字符串,VARCHAR是变长字符串。
此外,在日期类型方面,Oracle使用DATE类型,而MySQL则使用DATETIME类型。
二、关键字
Oracle与MySQL语法在关键字方面也存在一些差别。
在Oracle中,SELECT语句可以使用ROWNUM来限制结果集的行数。而在MySQL中,可以使用LIMIT语句来限制结果集的行数。
此外,在Oracle中,使用CONNECT BY语句可以进行层级查询。而在MySQL中,使用WITH RECURSIVE语句可以进行递归查询。
三、函数
Oracle与MySQL语法在函数方面也有一些差别。
在字符串函数方面,Oracle中的SUBSTR函数可以使用第三个参数表示截取长度。而在MySQL中的SUBSTRING函数使用第二个和第三个参数表示截取的起始位置和截取长度。
此外,在日期函数方面,Oracle中可以使用TO_DATE函数将字符串转换为日期类型。而MySQL则可以使用STR_TO_DATE函数将字符串转换为日期类型。
四、索引
Oracle与MySQL语法在索引方面也存在差别。
在Oracle中,可以使用B-tree、Bitmap、Function-Based等多种索引方式。而在MySQL中,可以使用B-tree、HASH、FULLTEXT等多种索引方式。
此外,在唯一索引方面,Oracle和MySQL也有一些差别。在Oracle中,唯一索引可以包括空值。而在MySQL中,唯一索引不包括空值。
五、语句
Oracle与MySQL语法在语句方面也有一些差别。
在插入语句方面,Oracle可以使用SELECT…INTO语句将查询结果插入到表中。而MySQL则需要使用INSERT…SELECT语句。
此外,在更新语句方面,Oracle中可以使用MERGE语句进行合并更新。而MySQL则需要使用UPDATE语句进行更新操作。
完整代码示例
Oracle
-- 创建表 CREATE TABLE users ( id NUMBER(10), name VARCHAR2(50), age NUMBER(3), create_time DATE ); -- 查询前10行记录 SELECT * FROM ( SELECT * FROM users ORDER BY create_time DESC ) WHERE ROWNUM <= 10; -- 查询部门及子部门 SELECT * FROM departments START WITH dept_id = 1 CONNECT BY PRIOR dept_id = parent_dept_id; -- 字符串截取 SELECT SUBSTR('hello world', 1, 5) FROM dual; -- 唯一索引可以包含空值 CREATE UNIQUE INDEX idx_users_name ON users(name); -- 使用SELECT ... INTO将结果插入表中 SELECT name, age INTO users(name, age) FROM employees WHERE age > 18; -- 合并更新操作 MERGE INTO users u USING ( SELECT id, name, age, create_time FROM temp_users ) t ON (u.id = t.id) WHEN MATCHED THEN UPDATE SET u.name = t.name, u.age = t.age, u.create_time = t.create_time WHEN NOT MATCHED THEN INSERT (id, name, age, create_time) VALUES (t.id, t.name, t.age, t.create_time);
MySQL
-- 创建表 CREATE TABLE users ( id INT(10), name VARCHAR(50), age INT(3), create_time DATETIME ); -- 查询前10行记录 SELECT * FROM users ORDER BY create_time DESC LIMIT 10; -- 查询部门及子部门 WITH RECURSIVE dept_tree AS ( SELECT * FROM departments WHERE dept_id = 1 UNION ALL SELECT d.* FROM departments d JOIN dept_tree t ON d.parent_dept_id = t.dept_id ) SELECT * FROM dept_tree; -- 字符串截取 SELECT SUBSTRING('hello world', 1, 5); -- 唯一索引不包含空值 CREATE UNIQUE INDEX idx_users_name ON users(name) WHERE name IS NOT NULL; -- 使用INSERT...SELECT将结果插入表中 INSERT INTO users (name, age) SELECT name, age FROM employees WHERE age > 18; -- 更新操作 UPDATE users SET age = age + 1 WHERE age < 18;