- 对于SQL Server和MySQL而言,当数据以升序方式排序时,NULL值会最先出现。在Oracle中,升序排序时NULL值会出现在列表的最后,但是可以通过在ORDER BY子句后添加NULLS FIRST关键字使其最先出现。
SELECT columnlist FROM tablelist
ORDER BY columlist NULLS FIRST;
- Oracle在排序列表中区分字母的大小写,比如升序排列时大写字母总是出现在小写字母之前。SQL Server和MySQL不区分字母的大小写。
- 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;
- 在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;
- 不同的数据库都可以使用关键字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%';
- 通配符[characterlist]可以匹配列表中的一个字符。[^characterlist]可以匹配列表以外的一个字符。MySQL和Oracle中不支持这两个通配符。
SELECT FirstName, LastName FROM Actors
WHERE FirstName LIKE '[CM]ARY'
SELECT FirstName, LastName FROM Actors
WHERE FirstName LIKE '[^CG]ARY'
- 函数SOUNDEX和DIFFERENCE可以比较单词的读音是否相似。在MySQL和Oracle中,没有DIFFERENCE函数。
- MySQL有时候要求在函数名称和左括号之间不能有空格,这适用于大多数聚合函数,如SUM、AVG、MIN、MAX、COUNT等。
- 使用关键字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
- 与SQL Server和Oracle不同,MySQL不提供全连接FULL JOIN,但可以使用UNION关键字。
- 在SQL Server和MySQL中,可以用ALTER VIEW轻松修改视图。在Oracle中,通常需要依次执行DROP VIEW和CREATE VIEW来修改视图。
- 与SQL Server和Oracle不同,MySQL不支持INTERSECT操作符。MySQL也不支持EXCEPT操作符。Oracle中与EXCEPT等价的操作符是MINUS。
- 各数据库创建存储过程的语法差异较大。下面给出了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;
- 创建带输入参数的存储过程。下面给出了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;
- 各数据库对于执行存储过程的语法也有差异。下面分别给出了不带参数和带参数时SQL Server和MySQL的示例。
--SQL Server
EXEC ProcedureName
EXEC CustomerProcedure @CustID = 2
--MySQL
CALL ProcedureName;
CALL CustomerProcedure (2);
- 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。部分功能可能已经发生变化。
仅供参考。