Beginning SQL, Differences Between Oracle and Microsoft


Beginning SQL, Differences Between Oracle and Microsoft


    If you're new to SQL or just new to Oracle SQL, perhaps coming from a

Microsoft SQL Server environment, it may seem like the two versions should be

very similar, and they are, to a certain degree, but they are also very different in

some important and basic ways.

You may need to know these differences because of a migration effort from one

to the other, or because you need to access both of them in your day-to-day

operations. Perhaps you have an Oracle server being downloaded into a SQL

Server data warehouse, or perhaps you have distributed SQL Server databases

being upload into a consolidating Oracle database. For these and other

circumstances under which these two exist, you may need to be aware of the

differences between the two versions of the SQL language.

So what are the differences from SQL Server to Oracle?


Part I.

 A Quick Intro for the SQL Server User

Don't Use Databases

Well, first of all, we don't use databases, we connect to them:


SQL Server

use mydatabase

Oracle

connect mydatabase/mypassword

Use Dual

And then, our select statements have different options, in this instance requiring

a from clause:

SQL Server

select getdate();

Oracle

select getdate() from dual;

so we use that dummy we call DUAL. Did you notice the lack of a from clause

in the first version? It's a nice shortcut, but Oracle doesn't allow it, nor does

ANSI SQL92.

Select Into

And we don't select rows into a table, but instead, insert the rows by selecting

them:

SQL Server

select getdate() mycolumn

into mytable;

Oracle

insert into mytable

select sysdate() mycolumn from dual;

Actually, the SQL Server version creates a table if one doesn’t exist, so the

Oracle version would require a CREATE TABLE AS statement to arrive at the

same result.

Inserts

By the way, the into clause of an insert statement is not an option on Oracle; it's

required:

SQL Server

insert mytable values('more text');

Oracle

insert into mytable values('more text');

Updates

What about updates? Well, these are different too, and may have to be

rewritten entirely to replace the from clause used to get data from one or more

tables:

SQL Server

update mytable

set mycolumn=myothertable.mycolumn

from mytable,myothertable

where mytable.mycolumn like 'MY%'

and myothertable.myothercolumn='some text';

Oracle

update mytable

set mycolumn=

(select a.mycolumn

from myothertable a

where myothertable.myothercolumn='some text';

)

where mytable.mycolumn like 'MY%';

Deletes

And finally, the delete requires a FROM clause in Oracle:

SQL Server

delete mytable where mycolumn like 'some%';

Oracle

delete from mytable where mycolumn like 'some%';

which we always try to double-check in either case. Notice that we used a link

for thattable on thatdb, which is considered to be a remote database.

Vendor Programs

So where is all this taking place? What programs are we running on Oracle?

Well, in place of iSQL, we're using SQL*Plus to enter our statements, and in

place of the Northwind examples, we use Scott's tiger:

SQL Server

command-line-prompt:isql

or, for queries developed in SQL Analyzer:

command-line-prompt: osql

use northwind

Oracle

command-line-prompt:sqlplus

scott/tiger

Notice that we didn't have to use the connect statement because it's automatic

when you first login.

Now that we're logged in, we can query Scott's infamous tables, EMP and

DEPT, to execute the examples we find in various reference materials such as

the SQL*Plus User's Guide and others.

And now, we're off on our own to pursue our education in Oracle SQL further.

Welcome aboard!

Part II. A Little More Detail

Outer Join

Now, where would we be without the outer join? Missing data, that's where.

So, here's an example of that query in dialects:

SQL Server

Select d.deptname,e.empname

from dept d, emp e

WHERE d.empno *= e.enum;

Oracle

Select d.deptname,e.empname

from dept d, emp e

WHERE d.empno = e.enum (+);

Notice the slight syntactic difference shown in this example from Scott's beloved

EMP and DEPT tables. This may seem like completely opposite forms of

expressing this statement, nevertheless all departments are listed even though

some have no employees.

Sub-queries in Place of Columns

Another SQL Server extension over both SQL92 and Oracle, is the use of

sub-queries wherever a column name is allowed. Here, the quarterly sales

columns are returned by a sub-query on the sales table to produce a single row

listing all four quarters results for the year:

SQL Server

select distinct year,

q1 = (select Amount amt FROM sales

where Quarter=1 AND year = s.year),

q2 = (SELECT Amount amt FROM sales

where Quarter=2 AND year = s.year),

q3 = (SELECT Amount amt FROM sales

where Quarter=3 AND year = s.year),

q4 = (SELECT Amount amt FROM sales

where Quarter=4 AND year = s.year)

from sales s;

Oracle

SELECT year,

DECODE( quarter, 1, amount, 0 ) q1,

DECODE( quarter, 2, amount, 0 ) q2,

DECODE( quarter, 3, amount, 0 ) q3,

DECODE( quarter, 4, amount, 0 ) q4

FROM sales s;

The same one-line result is produced by the decode function, which is reported

by Oracle to be faster than the sub-queries and actually looks like a simpler

swatch of code than the select statements.

Deletes With Second From Clause

Deleting rows from one table conditionally based on the contents of rows in

another table can be expressed with a statement containing two from clauses:

SQL Server

delete

from products

from products, product_deletes

where products.a = product_deletes.a

and products.b = product_deletes.b

and product_deletes.c = 'd';

Oracle

delete

from products

where ( a, b ) in

( select a, b

from product_deletes

where c = 'd' );


This can be rewritten to a statement using a single FROM clause, even if there is

a multi-column join, with a sub-query to produce the same effect of deleting only

those rows marked for the purpose in the other table.

Part III. More Depth

The Connect Concept

                            SQL Server provides connection to a server which allows access to multiple

databases, while Oracle's Server provides access to one database with multiple

users and roles, so a database is roughly equivalent to a tablespace, user,

schema and role. One can change roles or connect as a different user, but the

one server, one database concept remains.

For all the similarities between the two SQL versions, there are a few key

conceptual differences:

A SQL Server: is an Oracle:

Database owner, DBO Schema

Group/Role Role

Non-unique Index Index

Transact SQL stored procedure PL/SQL procedure

T-SQL stored procedure PL/SQL function

Trigger BEFORE trigger

Complex rule AFTER trigger

Column identity property Sequence

And a few that are only available in Oracle:

Clusters

Packages

Triggers for each row

Synonyms

Snapshots



Data Type Differences

Here's a summary of the datatype differences between the two versions:

SQL Server -                                            Oracle

INTEGER                                        NUMBER(10)

SMALLINT                                    NUMBER(6)

TINYINT                                         NUMBER(3)

REAL                                                FLOAT

FLOAT                                              FLOAT

BIT                                                     NUMBER(1)

VARCHAR(n)                                     VARCHAR2(n)

TEXT                                                 CLOB

IMAGE                                             BLOB

BINARY(n)                                     RAW(n) or BLOB

VARBINARY                                     RAW(n) or BLOB

DATETIME                                             DATE

SMALL-DATE                                TIME DATE

MONEY                                             NUMBER(19,4)

NCHAR(n)                                         CHAR(n*2)

NVARCHAR(n)                             VARCHAR(n*2)

SMALLMONEY                             NUMBER(10,4)

TIMESTAMP                                     NUMBER

SYSNAME                                 VARCHAR2(30), VARCHAR2(128)

As you may imagine, there are also differences in the concepts of data storage,

such as page versus data block, but our purposes are limited to SQL.

Time

Oracle's default time storage in the date datatype resolves down to the second,

while SQL Server's DATETIME datatype will store to the 1/300th second, but the

new Oracle TIMESTAMP datatype will store 1/100 millionth of a second in

accuracy, if one remembers to use it instead of the default type. See the

Migration Guide for an extended example on this subject.

Alias

A column alias is useful sometimes in cutting down the clutter in an SQL

statement:    

SQL Server

select a=deptid,b=deptname,c=empno from dept;

Oracle

select deptid a, deptname b, empno c from dept;


One can think of these as being the reverse of each other, as a memory aid, with

the SQL Server version coming before the the column name and the Oracle

version coming after it.

Sub-queries

SQL Server

SELECT ename, deptname

FROM emp, dept

WHERE emp.enum = 10

AND(SELECT security_code

FROM employee_security

WHERE empno = emp.enum) =

(SELECT security_code

FROM security_master

WHERE sec_level = dept.sec_level);

Oracle

SELECT empname, deptname

FROM emp, dept

WHERE emp.empno = 10

AND EXISTS (SELECT security_code

FROM employee_security es

WHERE es.empno = emp.empno

AND es.security_code =

(SELECT security_code

FROM security_master

WHERE sec_level =

dept.sec_level));

Both versions of SQL support multiple subqueries, but with differing syntax. The

select in place of a column name in SQL Server can produce the same effect as

the query within the subquery in Oracle, which is the version supported by

SQL92.


Part III: Something New

With the recent update of Oracle SQL to support the use of regular expressions,

the expressive power of simple queries is greatly expanded. New features have

been introduced for this purpose, such as the operator REGEXP_LIKE and the

functions REGEXP_INSTR, REGEXP_SUBSTR, and REGEXP_REPLACE.


            We can now write queries for non-digit zipcodes in one, short statement:

select zip

from zipcode

where regexp_like (zip, '[^[:digit:]]')

This one shows the starting column of both the 5 and 9 digit

zip code:

SELECT REGEXP_INSTR('Joe Smith, 10045 Berry Lane, San Joseph, CA

91234-1234',

' [[:digit:]]{5}(-[[:digit:]]{4})?$')

AS starts_at

FROM dual


Further examples can be found in the excellent article, on OTN, written by

Alice Rischert.

Summary

This discussion has been an attempt at a light and lively introduction to the

Oracle database world for those familiar with the Microsoft SQL Server

database products. Much more in-depth examples are available in the

references shown that follow, from which many of the examples were drawn

and for which we can thank the authors involved.

References

(1) Oracle Migration Workbench Reference Guide for SQL Server and Sybase

Adaptive Server Migrations, Release 9.2.0 for Microsoft Windows

98/2000/NT and Microsoft Windows XP, Part Number B10254-01

(2) Microsoft Transact-SQL Reference:

http://msdn.microsoft.com/library/default.asp?url=/library/enus/

tsqlref/ts_tsqlcon_6lyk.asp

(4) Oracle Technology Network, OTN:

http://otn.oracle.com/software/index.html

As Oracle puts it:

"All software downloads are free, and each comes with a development

license that allows you to use full versions of the products only while

developing and prototyping your applications. You can buy Oracle products

with full-use licenses at any time from the online Oracle Store or from your

Oracle sales representative."

(5) Writing Better SQL Using Regular Expressions, By Alice Rischert

http://otn.oracle.com/oramag/webcolumns/2003/techarticles/rischert_regexp_

pt1.html