SQL Server、Oracle和MySQL三种常用数据库的比较(二)

本文对比了SQLServer、MySQL及Oracle在数据排序、大小写敏感性、行数限制、模式匹配等方面的差异,并介绍了它们在存储过程创建与执行方面的区别。
  1. 对于SQL Server和MySQL而言,当数据以升序方式排序时,NULL值会最先出现。在Oracle中,升序排序时NULL值会出现在列表的最后,但是可以通过在ORDER BY子句后添加NULLS FIRST关键字使其最先出现。
    SELECT columnlist FROM tablelist 
    ORDER BY columlist NULLS FIRST;

     

  2. Oracle在排序列表中区分字母的大小写,比如升序排列时大写字母总是出现在小写字母之前。SQL Server和MySQL不区分字母的大小写。
  3. 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;

     

  4. 在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;
    

     

  5. 不同的数据库都可以使用关键字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%';

     

  6. 通配符[characterlist]可以匹配列表中的一个字符。[^characterlist]可以匹配列表以外的一个字符。MySQL和Oracle中不支持这两个通配符。
    SELECT FirstName, LastName FROM Actors
    WHERE FirstName LIKE '[CM]ARY'
    
    SELECT FirstName, LastName FROM Actors
    WHERE FirstName LIKE '[^CG]ARY'

     

  7. 函数SOUNDEXDIFFERENCE可以比较单词的读音是否相似。在MySQL和Oracle中,没有DIFFERENCE函数。
  8. MySQL有时候要求在函数名称和左括号之间不能有空格,这适用于大多数聚合函数,如SUM、AVG、MIN、MAX、COUNT等。
  9. 使用关键字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

     

  10. 与SQL Server和Oracle不同,MySQL不提供全连接FULL JOIN,但可以使用UNION关键字。
  11. 在SQL Server和MySQL中,可以用ALTER VIEW轻松修改视图。在Oracle中,通常需要依次执行DROP VIEWCREATE VIEW来修改视图。
  12. 与SQL Server和Oracle不同,MySQL不支持INTERSECT操作符。MySQL也不支持EXCEPT操作符。Oracle中与EXCEPT等价的操作符是MINUS
  13. 各数据库创建存储过程的语法差异较大。下面给出了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;

     

  14. 创建带输入参数的存储过程。下面给出了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;

     

  15. 各数据库对于执行存储过程的语法也有差异。下面分别给出了不带参数和带参数时SQL Server和MySQL的示例。
    --SQL Server
    EXEC ProcedureName
    EXEC CustomerProcedure @CustID = 2
    
    --MySQL
    CALL ProcedureName;
    CALL CustomerProcedure (2);

     

  16. 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。部分功能可能已经发生变化。

仅供参考。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GottdesKrieges

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值