ANSI/ISO SQL Support In Oracle9i
Oracle9i support de ANSI/ISO SQL: 1999 standaards. Dit maakt de product migratie en de cross training een stuk makkelijker maar performance winst in vergelijk met de huidig syntaxis is er niet.
  • Joins
  • CASE Statements
  • NULLIF Function
  • COALESCE Function
  • Scalar Subqueries
  • Explicit Defaults

Joins 


Een scala van nieuwe join syntaxis is beschikbaar die voldoen aan de ANSI/ISO SQL: 1999 standaards.

De CROSS JOIN produceert een cartesian product:

ANSI/ISO Syntax


SQL>SELECT first_name, 
last_name,
department_name
FROM employees
CROSS JOIN departments;

Bestaande Syntax

SQL>SELECT first_name, 
last_name,
department_name
FROM employees,
departments;


De NATURAL JOIN doet een join voor alle kolommen met gelijke namen in de 2 tabellen:


ANSI/ISO Syntax


SQL>SELECT department_name,
city
FROM departments
NATURAL JOIN locations;

Bestaande Syntax

SQL>SELECT d.department_name, 
l.city
FROM departments d,
locations l
WHERE d.location_id = l.location_id
AND d.country = l.country;

De USING clausule wordt gebruikt als een aantal kolommen de zelfde naam hebben, maar je wilt niet al deze gewone kolommen joinen. De kolommen die getoond worden in de USING clause kunnen geen qualifiers in het statement hebben, inclusief de WHERE clause:

ANSI/ISO Syntax


SQL>SELECT d.department_name,
l.city
FROM departments d
JOIN locations l USING (location_id);

Bestaande Syntax

SQL>SELECT d.department_name, 
l.city
FROM departments d,
locations l
WHERE d.location_id = l.location_id;

De ON clause wordt gebruikt om tabellen te joinen waarvan de kolom namen niet overeenkomen. De join condities zijn van de filter condities verwijderd in de WHERE clause:

ANSI/ISO Syntax


SQL>SELECT d.department_name,
l.city
FROM departments d
JOIN locations l ON (d.location_id = l.id);

Bestaande Syntax

SQL>SELECT d.department_name, 
l.city
FROM departments d,
locations l
WHERE d.location_id = l.id;

Muteerbare Joins zijn die joins waar meer dan 2 tabellen worden gejoined. De SQL: 1999 standaard gaat er van uit dat de tabellen worden gejoined van links naar rechts, waar de join condities alleen kunnen refereren aan kolommen van de huidige join en enige vorige join naar links:


ANSI/ISO Syntax
SQL>SELECT employee_id, 
city,
department_name
FROM locations l
JOIN departments d ON (d.location_id = l.location_id)
JOIN employees e ON (d.department_id = e.department_id);

Bestaande Syntax

SQL>SELECT employee_id, 
city,
department_name
FROM locations l,
departments d,
employees e
WHERE d.location_id = l.location_id
AND d.department_id = e.department_id;


Er zijn 3 variaties van de outer join. De LEFT OUTER JOIN geeft alle rijen terug van de table aan de linkerzijde van de join, samen met de waarden van de rechterkant, of NULLs als een overeenkomstige rij niet bestaat. De RIGHT OUTER JOIN doet het omgeleerde. De FULL OUTER JOIN geeft alle rijen van beide tabellen terug waar de ‘blanks’ met NULLs worden opgevuld:


ANSI/ISO Syntax

 
SQL>SELECT e.last_name,
d.department_name
FROM employees e
LEFT OUTER JOIN departments d ON (e.department_id = d.department_id);

Bestaande Syntax

SQL>SELECT e.last_name, 
d.department_name
FROM employees e,
departments d
WHERE e.department_id = d.department_id(+);

ANSI/ISO Syntax


SQL>SELECT e.last_name,
d.department_name
FROM employees e
RIGHT OUTER JOIN departments d ON (e.department_id = d.department_id);

Bestaande Syntax

SQL>SELECT e.last_name, 
d.department_name
FROM employees e,
departments d
WHERE e.department_id(+) = d.department_id;

ANSI/ISO Syntax

SQL>SELECT e.last_name, 
d.department_name
FROM employees e
FULL OUTER JOIN departments d ON (e.department_id = d.department_id);

HEEFT GEEN EQUIVALENT!

Extra filter condities kunnen aan de join toegevoegd worden met AND om een complexe join te vormen. Deze zijn vaak nodig als filter condities nodig zijn om outer joins uit te sluiten. Als deze filter condities worden geplaatst in de WHERE clause en de outer join geeft een NULL waarde terug voor de filter kolom, zou de rij weggegooid worden. Als de filter conditie als onderdeel van de join is gecodeerd, kan deze situatie voorkomen .

CASE Statements


De case statement is een meer flexibele uitbreiding van het Decode statement. In zijn meest simpele vorm wordt het gebruikt om een waarde terug te geven als een match is gevonden:

 

SQL>SELECT last_name, commission_pct, 
(CASE commission_pct
WHEN 0.1 THEN 'Low'
WHEN 0.15 THEN 'Average'
WHEN 0.2 THEN 'High'
ELSE 'N/A'
END) Commission
FROM employees
ORDER BY last_name;

Een meer complexe versie is de Searched CASE expressie waar een vergelijkende expressie wordt gebruikt om een match te vinden:

 

SQL>SELECT last_name, job_id, salary, 
(CASE
WHEN job_id LIKE 'SA_MAN' AND salary < 12000 THEN '10%'
WHEN job_id LIKE 'SA_MAN' AND salary >= 12000 THEN '15%'
WHEN job_id LIKE 'IT_PROG' AND salary < 9000 THEN '8%'
WHEN job_id LIKE 'IT_PROG' AND salary >= 9000 THEN '12%'
ELSE 'NOT APPLICABLE'
END) pay_raise
FROM employees;

Return waarden kunnen niet NULL zijn.

NULLIF Function


De NULLIF functie komt met een NULL waarde terug als beide parameters gelijk in waarde zijn. De volgende query zou een NULL teruggeven:

SQL>SELECT NULLIF(1,1) FROM dual; 

COALESCE Function


De COALESCE functie komt met de eerste niet-NULL waarde in een expressie lijst. Als alle expressies null zijn komt het met een NULL terug. De volgende query zal een ‘3’ teruggeven:
SQL>SELECT COALESCE(NULL, NULL, '3') FROM dual; 

Scalar Subqueries

Scalar subqueries geven een enkele waarde terug. Ze zouden in eerdere versies van Oracle gebruikt kunnen worden, in sommige delen van een SQL statement, maar Oracle9i breidt het gebruik uit naar bijna elke plek waar een expressie kan worden gebruikt waaronder:

CASE expressions
SELECT statement
VALUES clause van een INSERT statement
WHERE clause 
ORDER BY clause
Als een parameter of een function

Bijvoorbeeld:

SQL>INSERT INTO my_table VALUES ((SELECT 1 FROM dual), NULL);  

 

SQL>SELECT Substr((SELECT 'ABC' FROM dual), 1, 1) FROM dual;

Scalar subqueries kunnen maar met 1 enkele kolom en 1 enkele rij terugkomen. Indien er meer dan 1 rij terugkomt wordt er een error geproduceerd. Als er geen rijen terugkomen zal de waarde NULL gebruikt worden. Het datatype van de terugkomende waarde moet overeenkomen met het datatype waarmee wordt vergeleken.
Scalar subqueries kunnen niet gebrukt worden voor:

Default waarden voor kolommen
RETURNING clause
Hash expressions voor clusters
Functional index expressions
CHECK constraints op kolommen
WHEN condition van triggers
GROUP BY en HAVING clauses
START WITH en CONNECT BY clauses

Explicit Defaults


Het DEFAULT keyword kan gebruikt worden om expliciet een default waarde aan een kolom te geven tijdens een INSERT of UPDATE statement:

 

SQL>INSERT INTO my_table VALUES (1, 'OWNER', DEFAULT, NULL);  

SQL>UPDATE my_table SET column1 = DEFAULT;

 

 

Advertentie

>

Poll

Voorkeur
 

Wie is er aanwezig

We hebben 78 gasten online