1. 对于SQL Server和MySQL而言,当数据以升序方式排序时,NULL值会最先出现。在Oracle中,升序排序时NULL值会出现在列表的最后,但是可以通过在ORDER BY子句后添加NULLS FIRST关键字使其最先出现。
SELECT columnlist FROM tablelist 
ORDER BY columlist NULLS FIRST;
  1. Oracle在排序列表中区分字母的大小写,比如升序排列时大写字母总是出现在小写字母之前。SQL Server和MySQL不区分字母的大小写。
  2. SQL Server使用TOP关键字来限制查询返回的行数。MySQL使用关键字LIMIT。Oracle使用关键字ROWNUM,且需要在WHERE子句中指定。
--SQL Server
SELECT TOP 10 * FROM table

--MySQL
SELECT * FROM table LIMIT 10;

--Oracle
SELECT * FROM table WHERE ROWNUM <= 10;
  1. 在Oracle中,对行的限制和排序较为复杂。需要先排序,再使用ROWNUM查询条件。
--SQL Server
SELECT TOP 1 
Title AS 'Book Title',
CurrentMonthSales AS 'Quantity Sold'
FROM Books WHERE Author = 'Shakespeare'
ORDER BY CurrentMonthSales DESC

--Oracle
SELECT * FROM
(SELECT 
Title AS "Book Title",
CurrentMonthSales AS "Quantity Sold"
FROM Books WHERE Author = 'Shakespeare'
ORDER BY CurrentMonthSales DESC)
WHERE ROWNUM <= 1;
  1. 不同的数据库都可以使用关键字LIKE通配符%进行模式匹配。但是与SQL Server和MySQL不同,Oracle在模式匹配时会区分字母的大小写,因此可以先把字符串都转换成大写。
--SQL Server
SELECT MovieTitle AS 'Movie' FROM Movies
WHERE MovieTitle LIKE '%Love%'

--Oracle
SELECT MovieTitle AS Movie FROM Movies
WHERE UPPER (MovieTitle) LIKE '%LOVE%';
  1. 通配符[characterlist]可以匹配列表中的一个字符。[^characterlist]可以匹配列表以外的一个字符。MySQL和Oracle中不支持这两个通配符。
SELECT FirstName, LastName FROM Actors
WHERE FirstName LIKE '[CM]ARY'

SELECT FirstName, LastName FROM Actors
WHERE FirstName LIKE '[^CG]ARY'
  1. 函数SOUNDEXDIFFERENCE可以比较单词的读音是否相似。在MySQL和Oracle中,没有DIFFERENCE函数。
  2. MySQL有时候要求在函数名称和左括号之间不能有空格,这适用于大多数聚合函数,如SUM、AVG、MIN、MAX、COUNT等。
  3. 使用关键字GROUP BY时,SELECT关键字后面的列要么是GROUP BY子句中的列,要么是在聚合函数中使用的列。否则,在SQL Server和Oracle中会报错,而在MySQL中会出现错误的结果。
SELECT GradeType AS 'Grade Type',
Student AS 'Student',
AVG (Grade) AS 'Average Grade'
FROM Grades
GROUP BY GradeType, Student
ORDER BY GradeType, Student
  1. 与SQL Server和Oracle不同,MySQL不提供全连接FULL JOIN,但可以使用UNION关键字。
  2. 在SQL Server和MySQL中,可以用ALTER VIEW轻松修改视图。在Oracle中,通常需要依次执行DROP VIEWCREATE VIEW来修改视图。
  3. 与SQL Server和Oracle不同,MySQL不支持INTERSECT操作符。MySQL也不支持EXCEPT操作符。Oracle中与EXCEPT等价的操作符是MINUS
  4. 各数据库创建存储过程的语法差异较大。下面给出了SQL Server和MySQL的示例。在Oracle中创建存储过程较为复杂,需要先创建一个package包对象,其中包含包声明specification和包体body两部分。
--SQL Server
CREATE PROCEDURE ProcedureName
AS OptionalParameterDeclarations
BEGIN
SQLStatements
END

--MySQL
DELIMITER $$
CREATE PROCEDURE ProcedureName()
BEGIN
SQLStatements;
END $$
DELIMITER;
  1. 创建带输入参数的存储过程。下面给出了SQL Server和MySQL的示例。
--SQL Server
CREATE PROCEDURE CustomerProcedure
(@CustID INT)
AS
BEGIN
SELECT * FROM Customers
WHERE CUstomerID = @CustID
END

--MySQL
DELIMITER $$
CREATE PROCEDURE CustomerProcedure
(CustID INT)
BEGIN
SELECT * FROM Customers
WHERE CUstomerID = CustID;
END$$
DELIMITER;
  1. 各数据库对于执行存储过程的语法也有差异。下面分别给出了不带参数和带参数时SQL Server和MySQL的示例。
--SQL Server
EXEC ProcedureName
EXEC CustomerProcedure @CustID = 2

--MySQL
CALL ProcedureName;
CALL CustomerProcedure (2);
  1. SQL Server可以使用ALTER PROCEDURE修改存储过程。MySQL则需要先使用DROP PROCEDURE删除原有的存储过程,再使用CREATE PROCEDURE重新创建。
--SQL Server
ALTER PROCEDURE CustomerProcedure
(@CustID INT)
AS
BEGIN
SELECT TOP 5 * FROM Customers
WHERE CUstomerID = @CustID
END

--MySQL
DROP PROCEDURE CustomerProcedure;

以上对比基于Microsoft SQL Server 2008,Oracle Database 11g和同一时期的MySQL。部分功能可能已经发生变化。

仅供参考。