- 对于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。部分功能可能已经发生变化。
仅供参考。
本文对比了SQLServer、MySQL及Oracle在数据排序、大小写敏感性、行数限制、模式匹配等方面的差异,并介绍了它们在存储过程创建与执行方面的区别。
788

被折叠的 条评论
为什么被折叠?



