Lab Task ADB
Lab Task ADB
Introduction to Databases
CODD'S Rules
Datatypes and Creating Tables
Oracle SQL SELECT Statement
UNION, INTERSECT, MINUS Operators and Sorting Query Result
Oracle SQL Functions (Character Functions, Math Functions, Aggregate Functions)
Oracle Join Queries, (Inner Join, Outer Join, Self Join)
GROUP BY Queries, SUB Queries, CUBE, ROLLUP Functions, WITH, CASE Operators
Oracle Data Manipulation Language (INSERT, UPDATE, DELETE, INSERT ALL, MERGE)
Oracle Data Definiation Language (CREATE, ALTER, DROP, TRUNCATE, RENAME)
Oracle Transaction Control Language (COMMIT, ROLLBACK,SAVEPOINT)
Data Control Language (GRANT, REVOKE)
Oracle Integrity Constraints (PRIMARY KEY, NOT NULL, CHECK, FOREIGN KEY, UNIQUE)
Oracle Date Operators, Functions
Managing Oracle Views
Managing Oracle Sequences and Synonyms
Managing Indexes and Clusters
Oracle Table Partitioning and Creating Partitioned Tables
Oracle Objects and Object Types
Introduction to Databases.
DATABASE
A database is a collection of Data (Information). Examples of databases, which we use in our daily life,
is an Attendance Register, Telephone Directory, Muster Rule. Database Management System(DBMS): A
database management system is a collection of programs written to manage a database. That is, it acts
as a interface between user and database.
RDBMS
A
ORACLE
Oracle is an Object-Relational Database Management System. It is the leading RDBMS vendor worldwide. Nearly half
of RDBMS worldwide market is owned by Oracle.
ORACLE DATABASE
Every Oracle Database Contains Logical and Physical Structures. Logical Structures are tablespaces, Schema objects,
extents and segments. Physical Structures are Datafiles, Redo Log Files, and Control File. A database is divided into
logical storage units called tablespaces, which group related logical structures together. Each Tablespace in turn consists
of one are more data files.
All the tables and other objects are stored in table space logically, but physically they are stored in the data files
associated with the table space. Every Oracle database has a set of two or more redo log files. The set of redo log files for
a database is collectively known as the database's redo log. A redo log is made up of redo entries (also called redo
records). The primary function of the redo log is to record all changes made to data. If a failure prevents modified data
from being permanently written to the data files, the changes can be obtained from the redo log so work is never lost.
Every Oracle database has a control file. A control file contains the database name and locations of all datafiles and
redoes log files. Every Oracle database also has a Parameter File. Parameter file contains the name of the Database,
Memory Settings and Location of Control file.
CODDS RULES
Information Rule: All information in a relational database including table names, column names are
represented by values in tables. This simple view of data speeds design and learning. User productivity is
improved since knowledge of only one language is necessary to access all data such as description of the
table and attribute definitions, integrity constraints. Action can be taken when the constraints are violated.
Access to data can be restricted. All these information are also stored in tables.
Guaranteed Access Rule: Every piece of data in a relational database can be accessed by using
combination of a table name, a primary key value that identifies the row and column name which identified
a cell. User productivity is improved since there is no need to resort to using physical pointers addresses.
Provides data independence. Possible to retrieve each individual piece of data stored in a relational database
by specifying the name of the table in which it is stored, the column and primary key which identified the
cell in which it is stored.
Systematic Treatment of Nulls Rule: The RDBMS handles records that have unknown or inapplicable
values in a pre-defined fashion. Also, the RDBMS distinguishes between zeros, blanks and nulls in the
records hand handles such values in a consistent manner that produces correct answers, comparisons and
calculations. Through the set of rules for handling nulls, users can distinguish results of the queries that
involve nulls, zeros and blanks. Even though the rule doesnt specify what should be done in the case of
nulls it specifies that there should be a consistent policy in the treatment of nulls.
Active On-line catalog based on the relational model: The description of a database and in its contents is
database tables and therefore can be queried on-line via the data manipulation language. The database
administrators productivity is improved since the changes and additions to the catalog can be done with the
same commands that are used to access any other table. All queries and reports can also be done as any
other table.
Comprehensive Data Sub-language Rule: A RDBMS may support several languages. But at least one of
them should allow user to do all of the following: define tables and views, query and update the data, set
integrity constraints, set authorizations and define transactions. User productivity is improved since there
is just one approach that can be used for all database operations. In a multi-user environment the user does
not have to worry about the data integrity as such things, which will be taken care by the system. Also, only
users with proper authorization will be able to access data.
View Updating Rule: Any view that is theoretically updateable can be updated using the RDBMS. Data
consistency is ensured since the changes made in the view are transmitted to the base table and vice-versa.
High-Level Insert, Update and Delete: The RDBMS supports insertions, updating and deletion at a table
level. The performance is improved since the commands act on a set of records rather than one record at a
time.
Physical Data Independence: The execution of adhoc requests and application programs is not affected by
changes in the physical data access and storage methods. Database administrators can make changes to the
physical access and storage method which improve performance and do not require changes in the
application programs or requests. Here the user specified what he wants a need not worry about how the
data is obtained.
Logical Data Independence: Logical changes in tables and views such adding/deleting columns or
changing fields lengths need not necessitate modifications in the programs or in the format of adhoc
requests. The database can change and grow to reflect changes in reality without requiring the user
intervention or changes in the applications. For example, adding attribute or column to the base table should
not disrupt the programs or the interactive command that have no use for the new attribute.
Integrity Independence: Like table/view definition, integrity constraints are stored in the on-line catalog
and can therefore be changed without necessitating changes in the application programs. Integrity
constraints specific to a particular RDB must be definable in the relational data sub-language and storable in
the catalog. At least the Entity integrity and referential integrity must be supported.
Distribution Independence: Application programs and adhoc requests are not affected by change in the
distribution of physical data. Improved systems reliability since application programs will work even if the
programs and data are moved in different sites. No subversion Rule: If the RDBMS has a language that
accesses the information of a record at a time, this language should not be used to bypass the integrity
constraints. This is necessary for data integrity.
According to Dr. Edgar. F. Codd, a relational database management system must be able to manage the
database entirely through its relational capabilities.
A table is the data structure that holds data in a relational database. A table is composed of rows and
columns.
A table in Oracle Ver. 7.3 can have maximum 255 Columns and in Oracle Ver. 8 and above a table can have
maximum 1000 columns. Number of rows in a table is unlimited in all the versions.
A table can represent a single entity that you want to track within your system. This type of a table could
represent a list of the employees within your organization, or the orders placed for your company's
products.
A table can also represent a relationship between two entities. This type of a table could portray the
association between employees and their job skills, or the relationship of products to orders. Within the
tables, foreign keys are used to represent relationships.
Although some well designed tables could represent both an entity and describe the relationship between
that entity and another entity, most tables should represent either an entity or a relationship.
The following sessions explain how to create, alter, and drop tables. Some simple guidelines to follow when
managing tables in your database are included.
Designing Tables
Consider the following guidelines when designing your tables:
Before creating a table, you should also determine whether to use integrity constraints. Integrity constraints
can be defined on the columns of a table to enforce the business rules of your database automatically.
Before creating a Table you have to decide what type of data each column can contain. This is known as
data type. Lets discuss what data types are available in Oracle.
Datatypes
A datatype associates a fixed set of properties with the values that can be used in a column of a table or in
an argument of a procedure or function. These properties cause Oracle to treat values of one datatype
differently from values of another datatype. For example, Oracle can add values of NUMBER datatype, but not
values of RAW datatype.
Oracle supplies the following built-in datatypes:
Character datatypes
CHAR
NCHAR
VARCHAR2 and VARCHAR
NVARCHAR2
CLOB
NCLOB
LONG
DATE
datatype
Time and date datatypes:
NUMBER
BLOB
BFILE
RAW
LONG RAW
Another data type, ROWID, is used for values in the ROWID pseudo column, which represents the unique
address of each row in a table.
The following table summarizes the information about each Oracle built-in data type.
Datatype
Description
Bytes or characters.
VARCHAR2 (size[BYTE |
CHAR])
NCHAR (size)
NVARCHAR2 (size)
CLOB
NCLOB
LONG
NUMBER (p, s)
DATE
Fixed-length date and time data, ranging from Jan. Fixed at 7 bytes for each row in the table. Default
1, 4712 B.C.E. to Dec. 31, 4712 C.E.
format is a string (such as DD-MON-RR) specified
by the NLS_DATE_FORMAT parameter.
INTERVAL YEAR
(precision) TO MONTH
Fixed at 11 bytes.
TIMESTAMP (precision)
parameter.
TIMESTAMP (precision)
WITH TIME ZONE
TIMESTAMP (precision)
WITH LOCAL TIME ZONE
BLOB
BFILE
RAW (size)
LONG RAW
ROWID
CLOB and NCLOB datatypes store single-byte and multibyte character strings of
up to four gigabytes.
CHAR
This datatype is provided for backward compatibility with existing applications; in general, new
applications should useCLOB and NCLOB datatypes to store large amounts of character data,
and BLOB and BFILE to store large amounts of binary data.
When deciding which datatype to use for a column that will store alphanumeric data in a table, consider the
following points of distinction:
To store data more efficiently, use the VARCHAR2 datatype. The CHAR datatype
blank-pads and stores trailing blanks up to a fixed column length for all column
values, while the VARCHAR2 datatype does not add any extra blanks.
For example if you define empname as char(20) then if you store names like Sami
then name will occupy 20 bytes( 4 bytes for characters Sami and 16 blank spaces)
And if you define empname as varchar2(20) then if you store names like Sami then
oracle will take 4 bytes only.
Use the CHAR datatype when you require ANSI compatibility in comparison
semantics (when trailing blanks are not important in string comparisons). Use
the VARCHAR2 when trailing blanks are important in string comparisons.
The CHAR and VARCHAR2 datatypes are and will always be fully supported. At this
time, the VARCHAR datatype automatically corresponds to the VARCHAR2 datatype and
is reserved for future use.
of precision. You can store positive and negative numbers of magnitude 1 x 10-130 through 9.99 x10125, as
well as zero, in a NUMBER column.
You can specify that a column contains a floating-point number, for example:
Distance NUMBER
Or, you can specify a precision (total number of digits) and scale (number of digits to right of decimal
point):
Price NUMBER (8, 2)
Although not required, specifying precision and scale helps to identify bad input values. If a precision is not
specified, the column stores values as given. The following table shows examples of how data different
scale factors affect storage.
Input Data
Specified As
Stored As
4,751,132.79
NUMBER
4751132.79
4,751,132.79
NUMBER (9)
4751133
4,751,132.79
NUMBER (9,2)
4751132.79
4,751,132.79
NUMBER (9,1)
4751132.7
4,751,132.79
NUMBER (6)
4,751,132.79
4,751100
Use the DATE datatype to store point-in-time values (dates and times) in a table. The DATE datatype stores the
century, year, month, day, hours, minutes, and seconds.
Use the TIMESTAMP datatype to store precise values, down to fractional seconds. For example, an application
that must decide which of two events occurred first might use TIMESTAMP. An application that needs to
specify the time for a job to execute might use DATE.
Date Format
For input and output of dates, the standard Oracle default date format is DD-MON-RR. For example:
'13-NOV-1992'
To change this default date format on an instance-wide basis, use the NLS_DATE_FORMAT parameter. To change
the format during a session, use the ALTER SESSION statement. To enter dates that are not in the current
default date format, use theTO_DATE function with a format mask. For example:
TO_DATE ('November 13, 1992', 'MONTH DD, YYYY')
Be careful using a date format like DD-MON-YY. The YY indicates the year in the current century. For
example, 31-DEC-92 isDecember 31, 2092, not 1992 as you might expect. If you want to indicate years in
any century other than the current one, use a different format mask, such as the default RR.
Time Format
Time is stored in 24-hour format, HH24:MI:SS. By default, the time in a date field is 12:00:00 A.M.
(midnight) if no time portion is entered. In a time-only entry, the date portion defaults to the first day of the
current month. To enter the time portion of a date, use the TO_DATE function with a format mask indicating
the time portion, as in:
INSERT INTO Birthdays_tab (bname, bday) VALUES
('ANNIE',TO_DATE('13-NOV-92 10:56 A.M.','DD-MON-YY HH:MI A.M.'));
Creating Tables in Oracle
Once you have designed the table and decided about datatypes use the following SQL command to create a
table.
For example, the following statement creates a table named Emp.
CREATE TABLE Emp (
Empno
NUMBER(5),
Ename
VARCHAR2(15),
Hiredate
DATE,
Sal
NUMBER(7,2)
);
To insert rows in the table you can use SQL INSERT command.
For example the following statement creates a row in the above table.
SQL>insert into emp values (101,Sami,3400);
To insert rows continuously in SQL Plus you can give the following command.
SQL>insert into emp values (&empno,&name,&sal);
These &Empno, &name and &sal are known as substitution variables. That is SQLPlus
will prompt you for these values and then rewrites the statement with supplied
values.
To see the rows you have inserted give the following command.
SQL> Select * from emp;
To see the structure of the table i.e. column names and their datatypes and widths.
Give the following command.
SQL>desc
emp
To see how many tables is in your schema give the following command.
SQL> select * from cat;
or
SQL>select * from tab;
You can filter information using where conditions like suppose you want to see only those employees
whose salary is above 5000 then you can type the following query with where condition
SQL>select * from emp where sal > 5000;
To see those employees whose salary is less than 5000 then the query will be
SQL> select * from emp where sal < 5000;
Logical Conditions
A logical condition combines the results of two component conditions to produce a single result based on
them or to invert the result of a single condition. Table below lists logical conditions.
Condition
Operation
Example
NOT
SELECT *
FROM emp
WHERE NOT (sal IS
Condition
Operation
Example
NULL);
SELECT *
FROM emp
WHERE NOT
(salary BETWEEN 1000
AND 2000);
AND
SELECT *
FROM employees
WHERE ename ='SAMI'
AND sal=3000;
OR
SELECT *
FROM emp
WHERE ename = 'SAMI'
OR sal >= 1000;
Membership Conditions
A membership condition tests for membership in a list or subquery
The following table lists the membership conditions.
Condition
Operation
Example
IN
NOT IN
Null Conditions
Condition
Operation
Example
IS [NOT]
SELECT ename
Condition
Operation
NULL
Example
FROM emp
WHERE deptno
IS NULL;
EXISTS Conditions
Condition
Operation
Example
SELECT deptno
FROM dept d
WHERE EXISTS
(SELECT * FROM emp e
WHERE d.deptno
= e.deptno);
LIKE Conditions
The LIKE conditions specify a test involving pattern matching. Whereas the equality operator (=) exactly
matches one character value to another, the LIKE conditions match a portion of one character value to
another by searching the first value for the pattern specified by the second. LIKE calculates strings using
characters as defined by the input character set.
For example you want to see all employees whose name starts with S char. Then you can use LIKE
condition as follows
SQL> select * from emp where ename like S%;
Similarly you want to see all employees whose name ends with d
SQL>select * from emp where ename like %d;
You want to see all employees whose name starts with A and ends withd like Abid, Adward,
Arnold.
SQL>select * from emp where ename like A%d;
You want to see those employees whose name contains character a anywhere in the string.
SQL> select * from emp where ename like %a%;
To see those employees whose name contains a in second position.
SQL>select * from emp where ename like _a%;
To see those employees whose name contains a as last second character.
SQL>select * from emp where ename like %a_;
To see those employees whose name contain % sign. i.e. % sign has to be used as literal not as wild
char.
SQL> select * from emp where ename like %\%% escape \;
ENAME
----Sami
Smith
Tamim
Ravi
SAL
-----5000
Transfer Date
------------11-jul-2000
10-AUG-2000
2400
INTERSECT Example
The following statement combines the results with the INTERSECT operator, which returns only those rows returned by
both queries:
SELECT empno FROM emp
INTERSECT
SELECT empno FROM oldemp;
MINUS Example
The following statement combines results with the MINUS operator, which returns only rows returned by the first query
but not by the second:
SELECT empno FROM emp
MINUS
SELECT empno FROM oldemp;
Sorting Examples.
The following query sorts the employees according to ascending order of salaries.
select * from emp order by sal;
The following query sorts the employees according to descending order of salaries.
select * from emp order by sal desc;
The following query sorts the employees according to ascending order of names.
select * from emp order by ename;
The following query first sorts the employees according to ascending order of names.If names are equal then sorts
employees on descending order of salaries.
select * from emp order by ename, sal desc;
You can also specify the positions instead of column names. Like in the following query,which shows employees
according to ascending order of their names.
select * from emp order by 2;
The following query first sorts the employees according to ascending order of salaries.
If salaries are equal then sorts employees on ascending order of names
select * from emp order by 3, 2;
SQL functions are built into Oracle and are available for use in various appropriate SQL statements. You
can also create your own function using PL/SQL.
Single-Row Functions
Single-row functions return a single result row for every row of a queried table or view. These functions can
appear in select lists, WHERE clauses, START WITH and CONNECT BY clauses, and HAVING clauses.
Number Functions
Number functions accept numeric input and return numeric values. Most of these functions return values
that are accurate to 38 decimal digits.
The number functions available in Oracle are:
ABS ACOS ASIN ATAN ATAN2 BITAND CEIL COS COSH EXP FLOOR LN LOG
MOD POWER ROUND (number) SIGN SIN SINH SQRT TAN TANH TRUNC (number)
ABS
ABS returns the absolute value of n.
The following example returns the absolute value of -87:
SELECT ABS(-87) "Absolute" FROM DUAL;
Absolute
---------87
ACOS
ACOS returns the arc cosine of n. Inputs are in the range of -1 to 1, and outputs are in the range of 0 to pi and
are expressed in radians.
The following example returns the arc cosine of .3:
COS
Returns the cosine of an angle (in radians).
Example:
The following example returns the COSINE angle of 60 radians.
select
SIN
Returns the Sine of an angle (in radians).
Example:
The following example returns the SINE angle of 60 radians.
select
TAN
Returns the Tangent of an angle (in radians).
Example:
The following example returns the tangent angle of 60 radians.
select
Similar to SIN, COS, TAN functions hyperbolic functions SINH, COSH, TANH are also
available in oracle.
MOD
Returns the remainder after dividing m with n.
Example
LN
Returns natural logarithm of n.
Example
The following example returns the natural logarithm of 2.
select ln(2) from dual;
LN
------------
LOG
Returns the logarithm, base m, of n.
Example
The following example returns the log of 100.
select log(10,100) from dual;
LOG
--------2
ROUND
Returns a decimal number rounded of to a given decimal positions.
Example
--------4
Character Functions
INITCAP
Returns a given string with Initial letter in capital.
select INITCAP(mohammed sami) from dual;
INITCAP
-----------------Mohammed Sami
LENGTH
Returns the length of a given string.
select length(mohammed sami) from dual;
LENGTH
-----------13
SUBSTR
Returns a substring from a given string. Starting from position p to n characters.
For example the following query returns sam from the string mohammed sami.
select substr('mohammed sami',10,3) from dual;
Substr
-------sam
INSTR
Tests whether a given character occurs in the given string or not. If the character
occurs in the string then returns the first position of its occurrence otherwise returns
0.
Example
The following query tests whether the character a occurs in string mohammed
sami
select instr('mohammed sami','a') from dual;
INSTR
-------4
REPLACE
Replaces a given set of characters in a string with another set of characters.
Example
The following query replaces mohd with mohammed .
select replace('ali mohd khan','mohd','mohammed') from dual;
REPLACE
--------ali mohammed khan
INSTR
Tests whether a given character occurs in the given string or not. If the character
occurs in the string then returns the first position of its occurrence otherwise returns
0.
Example
The following query tests whether the character a occurs in string mohammed
sami
TRANSLATE
This function is used to encrypt characters. For example you can use this function to
replace characters in a given string with your coded characters.
Example
The following query replaces characters A with B, B with C, C with D, D with E,...Z with
A, and a with b,b with c,c with d, d with e ....z with a.
select
translate('interface','ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvw
xyz',
'BCDEFGHIJKLMNOPQRSTUVWXYZAbcdefghijklmnopqrstuvwxyza') Encrypt
from dual;
Encrypt
----------joufsgbdf
SOUNDEX
This function is used to check pronounciation rather than exact characters. For
example many people write names as smith or smyth or smythe but they are
pronounced as smith only.
Example
The following example compare those names which are spelled differently but are
pronouced as smith.
Select ename from emp where soundex(ename)=soundex('smith');
ENAME
--------Smith
Smyth
Smythe
RPAD
Right pads a given string with a given character to n number of characters.
Example
The following query rights pad ename with '*' until it becomes 10 characters.
select rpad(ename,'*',10) from emp;
Ename
---------Smith*****
John******
Mohammed**
Sami******
LPAD
Left pads a given string with a given character upto n number of characters.
Example
The following query left pads ename with '*' until it becomes 10 characters.
select lpad(ename,'*',10) from emp;
Ename
---------*****Smith
******John
**Mohammed
******Sami
LTRIM
Trims blank spaces from a given string from left.
Example
The following query returns string
select ltrim('
Interface
Interface
left trimmed.
Ltrim
-------------Interface
RTRIM
Trims blank spaces from a given string from Right.
Example
The following query returns string
select rtrim('
Interface
Interface
right trimmed.
Rtrim
-----------Interface
TRIM
Trims a given character from left or right or both from a given string.
Example
The following query removes zero from left and right of a given string.
COALESCE
Coalesce function returns the first not null value in the expression list.
Example.
The following query returns salary+commision, if commission is null then returns
salary, if salary is also null then returns 1000.
ENAME
SALARY
-----
------
---- -------
SMITH
1000
100
SAMI
3000
1100
3000
SCOTT
1000
RAVI
200
1000
DECODE
DECODE(expr, searchvalue1, result1,searchvalue2,result2,..., defaultvalue)
Decode functions compares an expr with search value one by one. If the expr does
not match any of the search value then returns the default value. If the default value
is omitted then returns null.
Example
The following query returns the department names according the deptno. If the
deptno does not match any of the search value then returns Unknown Department
select decode(deptno,10,'Sales',20,'Accounts,30,'Production,
40,'R&D','Unknown Dept') As DeptName from emp;
DEPTNAME
----------
Sales
Accounts
Unknown Dept.
Accounts
Production
Sales
R&D
Unknown Dept.
GREATEST
GREATEST(expr1, expr2, expr3,expr4...)
Returns the greatest expr from a expr list.
Example
select greatest(10,20,50,20,30) from dual;
GREATEST
-------50
GREATEST
--------
TANYA
LEAST
LEAST(expr1, expr2, expr3,expr4...)
It is simillar to greatest. It returns the least expr from the expression list.
select least(10,20,50,20,30) from dual;
LEAST
-------10
select least('SAMI','SCOTT','RAVI','SMITH','TANYA') from dual;
LEAST
-------RAVI
NVL
NVL2(expr1,expr2)
This function is oftenly used to check null values. It returns expr2 if the expr1 is
null, otherwise returns expr1.
Example
The following query returns commission if commission is null then returns 'Not
Applicable'.
Select ename,nvl(comm,'Not Applicable') Comm from dual;
ENAME
COMM
------
----
Scott
300
Tiger
450
Sami
Not Applicable
Ravi
300
Tanya
Not Applicable
NVL2
NVL2(expr1,expr2,expr3)
NVL2 returns expr2 if expr1 is not null, otherwise return expr3.
Example
The following query returns salary+comm if comm is not null, otherwise just returns
salary.
select salary,comm,nvl2(comm,salary+comm,salary) Income from emp;
SALARY
COMM
INCOME
------
----
------
1000
100
1100
2000
2300
3400
2000
200
2500
3400
NULLIF
NULLIF(expr1, expr2)
Nullif compares expr1 with expr2. If they are equal then returns null, otherwise return
expr1.
Example.
The following query shows old jobs of those employees who have changed their jobs
in the company by comparing the current job with old job in oldemp table.
Select ename,nullif(e.job,o.job) Old Job from emp e, oldemp o where
e.empno=o.empno;
ENAME
OLD JOB
-----
-------
SMITH
CLERK
SAMI
SCOTT
MANAGER
UID
Returns the current session ID of user logged on.
Example
select uid from dual;
UID
---20
USER
Returns the username of the current user logged on.
select user from dual;
USER
--------SCOTT
SYS_CONTEXT
SYS_CONTEXT returns the value of parameter associated with the context namespace.
You can use this function in both SQL and PL/SQL statements.
EXAMPLE
The following query returns the username of the current user.
Select sys_context('USERENV','SESSION_USER') Username from dual;
USERNAME
--------SCOTT
:To check whether the current user is having DBA privileges or not.
:Returns the name of host machine from which the client is connected.
:The instance identification number of the current instance
BYTES
------
------
SCOTT
SAMI
RAVI
KIRAN
Aggregate Functions
Aggregate functions return a single value based on groups of rows, rather than single
value for each row. You can use Aggregate functions in select lists and
in ORDER BY and HAVING clauses. They are commonly used with the GROUP BY clause in
a SELECT statement, where Oracle divides the rows of a queried table or view into
groups.
The important Aggregate functions are :
Avg
Sum
Max
Min
Count
Stddev
Variance
AVG
expr)
Average Salary
-----------------------2400.40
SUM
SUM(ALL/DISTINCT
expr)
26500
MAX
MAX(ALL/DISTINCT expr)
Returns maximum value of expr.
Example
The following query returns the max salary from the employees.
Maximum Salary
-----------------------4500
MIN
MIN(ALL/DISTINCT
expr)
COUNT
COUNT(*)
OR
COUNT(ALL/DISTINCT
expr)
Returns the number of rows in the query. If you specify expr then count ignore nulls. If
you specify the asterisk (*), this function returns all rows, including duplicates and
nulls. COUNT never returns null.
Example
The following query returns the number of employees.
Select count(*) from emp;
COUNT
-----14
The following query counts the number of employees whose salary is not null.
Select count(sal) from emp;
COUNT
-----12
STDDEV
STDDEV(ALL/DISTINCT expr)
STDDEV
expr,
a set of numbers.
Example
The following query returns the standard deviation of salaries.
select stddev(sal) from emp;
Stddev
------1430
VARIANCE
VARIANCE(ALL/DISTINCT
Variance returns the variance of
expr)
expr.
Example
The following query returns the variance of salaries.
select variance(sal) from emp;
Variance
------1430
Joins
A join is a query that combines rows from two or more tables, views, or materialized views. Oracle
performs a join whenever multiple tables appear in the query's FROM clause. The query's select list can select
any columns from any of these tables. If any two of these tables have a column name in common, you must
qualify all references to these columns throughout the query with table names to avoid ambiguity.
Join Conditions
Most join queries contain WHERE clause conditions that compare two columns, each from a different table.
Such a condition is called a join condition. To execute a join, Oracle combines pairs of rows, each
containing one row from each table, for which the join condition evaluates to TRUE. The columns in the join
conditions need not also appear in the select list.
Equijoins
An equijoin is a join with a join condition containing an equality operator ( = ). An equijoin combines rows
that have equivalent values for the specified columns.
For example the following query returns empno,name,sal,deptno and department name and city from
department table.
select emp.empno,emp.ename,emp.sal,emp.deptno,dept.dname,dept.city from
emp,dept where emp.deptno=dept.deptno;
The above query can also be written like, using aliases, given below.
select e.empno, e.ename, e.sal, e.deptno, d.dname, d.city from emp e,
dept d where emp.deptno=dept.deptno;
The above query can also be written like given below without using table qualifiers.
select empno,ename,sal,dname,city from emp,dept where
emp.deptno=dept.deptno;
And if you want to see all the columns of both tables then the query can be written like this.
select * from emp,dept where emp.deptno=dept.deptno;
Non equi joins is used to return result from two or more tables where exact join is not possible.
For example we have emp table and salgrade table. The salgrade table contains grade and their low salary
and high salary. Suppose you want to find the grade of employees based on their salaries then you can use
NON EQUI join.
select e.empno, e.ename, e.sal, s.grade from emp e, salgrade s where
e.sal between s.lowsal and s.hisal
Self Joins
A self join is a join of a table to itself. This table appears twice in the FROM clause and is followed by table
aliases that qualify column names in the join condition. To perform a self join, Oracle combines and returns
rows of the table that satisfy the join condition.
For example the following query returns employee names and their manager names for whom they are
working.
Select e.empno, e.ename, m.ename
emp m where e.mgrid=m.empno
Inner Join
An inner join (sometimes called a "simple join") is a join of two or more tables that returns only those rows
that satisfy the join condition.
Outer Joins
An outer join extends the result of a simple join. An outer join returns all rows that satisfy the join condition
and also returns some or all of those rows from one table for which no rows from the other satisfy the join
condition.
To write a query that performs an outer join of tables A and B and returns all rows from
A (a left outer join), use the ANSI LEFT[OUTER] JOIN syntax, or apply the outer join operator (+) to all
columns of B in the join condition. For all rows in A that have no matching rows in B, Oracle returns null
for any select list expressions containing columns of B.
To write a query that performs an outer join of tables A and B and returns all rows from
B (a right outer join), use the ANSIRIGHT [OUTER] syntax, or apply the outer join operator (+) to all
columns of A in the join condition. For all rows in B that have no matching rows in A, Oracle returns null
for any select list expressions containing columns of A.
To write a query that performs an outer join and and returns all rows from A and B,
extended with nulls if they do not satisfy the join condition (a full outer join), use the
ANSI FULL [OUTER] JOIN syntax.
For example the following query returns all the employees and department names and even those
department names where no employee is working.
select e.empno,e.ename,e.sal,e.deptno,d.dname,d.city
where e.deptno(+)=d.deptno;
That is specify the (+) sign to the column which is lacking values.
Cartesian Products
If two tables in a join query have no join condition, Oracle returns their Cartesian product. Oracle combines
each row of one table with each row of the other. A Cartesian product always generates many rows and is
rarely useful. For example, the Cartesian product of two tables, each with 100 rows, has 10,000 rows.
Always include a join condition unless you specifically need a Cartesian product.
SUBQUERIES
A query nested within a query is known as subquery.
For example, you want to see all the employees whose salary is above average salary. For this you have to
first compute the average salary using AVG function and then compare employees salaries with this
computed salary. This is possible using subquery. Here the sub query will first compute the average salary
and then main query will execute.
Select * from emp where sal > (select avg(sal) from emp);
Similarly we want to see the name and empno of that employee whose salary is maximum.
Select * from emp where sal = (select max(sal) from emp);
To see second maximum salary
Select max(sal) from emp where
sal < (select max(sal) from emp);
Similarly to see the Third highest salary.
Select max(sal) from emp where
sal < (select max(sal) from emp Where
sal < (select max(sal) from emp));
We want to see how many employees are there whose salary is above average.
Select count(*) from emp where
sal > (select max(sal) from emp);
We want to see those employees who are working in Hyderabad. Remember emp and dept are joined on
deptno and city column is in the dept table. Assuming that wherever the department is located the employee
is working in that city.
Select * from emp where deptno
The above average total salary department wise can also be achieved in 9i using WITH clause given below
WITH
DEPTOT AS (select sum(sal) as dsal from emp
group by deptno)
select avg(dsal) from deptot;
GROUP BY QUERIES
You can group query results on some column values. When you give a SELECT statement without group by
clause then all the resultant rows are treated as a single group.
For Example, we want to see the sum salary of all employees dept wise. Then the following query will
achieved the result
Select deptno,sum(sal) from emp group by deptno;
Similarly we want to see the average salary dept wise
Now we want to see the cities name and the no of employees working in each city. Remember emp and dept
are joined on deptno and city column is in the dept table. Assuming that wherever the department is located
the employee is working in that city.
Select dept.city,count(empno) from emp,dept
where emp.deptno=dept.deptno
Group by dept.city;
ROLLUP
The ROLLUP operation in the simple_grouping_clause groups the selected rows based on the values of the
first n, n-1, n-2, ... 0 expressions in the GROUP BY specification, and returns a single row of summary for each
group. You can use the ROLLUPoperation to produce subtotal values by using it with the SUM function. When
used with SUM, ROLLUP generates subtotals from the most detailed level to the grand total. Aggregate
functions such as COUNT can be used to produce other kinds of superaggregates.
For example, given three expressions (n=3) in the ROLLUP clause of the simple_grouping_clause, the
operation results in n+1 = 3+1 = 4 groupings.
Rows grouped on the values of the first 'n' expressions are called regular rows, and the others are
called superaggregate rows.
The following query uses rollup operation to show sales amount product wise and year wise. To see the
structure of the sales table refer to appendices.
Select prod,year,sum(amt) from sales
group by rollup(prod,year);
CUBE
The CUBE operation in the simple_grouping_clause groups the selected rows based on the values of all
possible combinations of expressions in the specification, and returns a single row of summary information
for each group. You can use the CUBEoperation to produce cross-tabulation values.
For example, given three expressions (n=3) in the CUBE clause of the simple_grouping_clause, the operation
results in 2n = 23= 8 groupings. Rows grouped on the values of 'n' expressions are called regular rows, and
the rest are called superaggregate rows.
The following query uses CUBE operation to show sales amount product wise and year wise. To see the
structure of the sales table refer to appendices.
expressions let you use IF ... THEN ... ELSE logic in SQL statements without having to invoke
procedures.
CASE
For example the following query uses CASE expression to display Department Names based on deptno.
Select empno,ename,sal,CASE deptno when 10 then Accounts
When 20 then Sales
When 30 then R&D
Else Unknown end
From emp;
The following statement finds the average salary of the employees in the employees table using $2000 as
the lowest salary possible:
SELECT AVG(CASE WHEN e.sal > 2000 THEN e.sal
ELSE 2000 END) "Average Salary" from emp e;
The CREATE, ALTER, and DROP commands require exclusive access to the specified object. For
example, an ALTER TABLEstatement fails if another user has an open transaction on the specified
table.
The GRANT, REVOKE, ANALYZE, AUDIT, and COMMENT commands do not require exclusive access to the
specified object. For example, you can analyze a table while other users are updating the table.
Oracle implicitly commits the current transaction before and after every DDL statement.
Many DDL statements may cause Oracle to recompile or reauthorize schema objects.
DDL Statements are
CREATE
ALTER
DROP
REPLACE
Empno
To do this we can first create TAX table by defining column names and datatypes and then use
INSERT into EMP SELECT . statement to insert rows from emp table. like given below.
create table tax (empno number(5), tax number(10,2));
insert into tax select empno,(sal-5000)*0.40
from emp where sal > 5000;
Instead of executing the above two statements the same result can be achieved by giving a single
CREATE TABLE AS statement.
create table tax as select empno,(sal-5000)*0.4
as tax from emp where sal>5000
You can also use CREATE TABLE AS statement to create copies of tables. Like to create a copy
EMP table as EMP2 you can give the following statement.
create table emp2 as select * from emp;
To copy tables without rows i.e. to just copy the structure give the following statement
create table emp2 as select * from emp where 1=2;
It is also possible to create a temporary table. The definition of a temporary table is visible to all
sessions, but the data in a temporary table is visible only to the session that inserts the data into
the table. You use the CREATE GLOBAL TEMPORARY TABLE statement to create a temporary table.
The ON COMMIT keywords indicate if the data in the table is transaction-specific(the default)
or session-specific:
ON COMMIT DELETE ROWS specifies that the temporary table is transaction
specific and Oracle truncates the table (delete all rows) after each commit.
ON COMMIT PRESERVE ROWS specifies that the temporary table is session specific
and Oracle truncates the table when you terminate the session.
Indexes can be created on temporary tables. They are also temporary and the data in the index has
the same session or transaction scope as the data in the underlying table.
Alter
From Oracle Ver. 8i you can drop columns directly it was not possible in previous versions.
For example to drop PIN, CITY columns from emp table.
alter table emp drop column (pin, city);
Remember you cannot drop the column if the table is having only one column.
If the column you want to drop is having primary key constraint on it then you have to give
cascade constraint clause.
alter table emp2 drop column (empno) cascade constraints;
To drop columns in previous versions of Oracle8.0 and 7.3. and to change the column name in all
Oracle versions do the following.
For example we want to drop pin and city columns and to change SAL column name to SALARY.
Step
Rename
Use the RENAME statement to rename a table, view, sequence, or private synonym for a table, view,
or sequence.
Oracle automatically transfers integrity constraints, indexes, and grants on the old object to the
new object.
Oracle invalidates all objects that depend on the renamed object, such as views, synonyms, and
stored procedures and functions that refer to a renamed table.
Example
To rename table emp2 to employee2 you can give the following command.
rename emp2 to employee2
Drop
Use the drop statement to drop tables, functions, procedures, packages, views, synonym,
sequences, tablespaces etc.
Example
The following command drops table emp2
drop table emp2;
If emp2 table is having primary key constraint, to which other tables refer to, then you have to
first drop referential integrity constraint and then drop the table. Or if you want to drop table by
dropping the referential constraints then give the following command
drop table emp2 cascade constraints;
Truncate
Use the Truncate statement to delete all the rows from table permanently . It is same as DELETE
FROM <table_name> except
Truncate does not generate any rollback data hence, it cannot be roll backed.
If any delete triggers are defined on the table. Then the triggers are not fired
It deallocates free extents from the table. So that the free space can be use
by other tables.
Example
SYSTIMESTAMP
:The SYSTIMESTAMP function returns the system date, including fractional
seconds and time zone of the database. The return type is TIMESTAMP WITH TIME ZONE.
SYSDATE Example
To see the current system date and time give the following query.
select sysdate from dual;
SYSDATE
------8-AUG-03
The format in which the date is displayed depends on NLS_DATE_FORMAT parameter.
For example set the NLS_DATE_FORMAT to the following format
Alter session set NLS_DATE_FORMAT=DD-MON-YYYY HH:MIpm;
Then give the give the following statement
select sysdate from dual;
SYSDATE
-----------------8-AUG-2003 03:05pm
The default setting of NLS_DATE_FORMAT is DD-MON-YY
CURRENT_DATE Example
To see the current system date and time with time zone use CURRENT_DATE function
ALTER SESSION SET TIME_ZONE = '-4:0';
ALTER SESSION SET NLS_DATE_FORMAT = 'DD-MON-YYYY HH24:MI:SS';
SELECT SESSIONTIMEZONE, CURRENT_DATE FROM DUAL;
SESSIONTIMEZONE CURRENT_DATE
--------------- --------------------04:00
22-APR-2003 14:15:03
ALTER SESSION SET TIME_ZONE = '-7:0';
SELECT SESSIONTIMEZONE, CURRENT_DATE FROM DUAL;
SESSIONTIMEZONE CURRENT_DATE
--------------- --------------------07:00
22-APR-2003 09:15:33
SYSTIMESTAMP Example
To see the current system date and time with fractional seconds with time zone give the
following statement
Select systimestamp from dual;
SYSTIMESTAMP
------------------------------22-APR-03 08.38.55.538741 AM -07:00
To translate the date into a different format string you can use TO_CHAR function with date
format. For example to see the current day you can give the following query
To translate a character value, which is in format other than the default date format, into a date
value you can use TO_DATE function with date format to date
MEANING
Day of the week
Day of the month
Day of the year
Full day for ex. Monday, Tuesday, Wednesday
Day in three letters for ex. MON, TUE,FRI
Week of the month
Week of the year
Month in two digits (1-Jan, 2-Feb,12-Dec)
Month in three characters like Jan, Feb, Apr
Full Month like January, February, April
Month in Roman Characters (I-XII, I-Jan, II-Feb,XII-Dec)
Quarter of the Month
Last two digits of the year.
Full year
Year in words like Nineteen Ninety Nine
Hours in 12 hour format
Hours in 12 hour format
Hours in 24 hour format
Minutes
Seconds
Fractional Seconds
Milliseconds
Julian Day i.e Days since 1st-Jan-4712BC to till-date
If the year is less than 50 Assumes the year as 21ST Century. If the year is greater than 50 then
assumes the year in 20th Century.
SUFFIXES
TH
SP
AM or PM
SPTH
Returns th, st, rd or nd according to the leading number like 1st , 2nd 3rd 4th
Spells out the leading number
Returns AM or PM according to the time
Returns Spelled Ordinal number. For. Example First, Fourth
For example you want to see hire dates of all employee in the following format
Friday, 8th August, 2003
Then give the following query.
select to_char(hire_date,Day, ddth Month, yyyy) from emp;
TO_DATE Example
To_Date function is used to convert strings into date values. For example you want to see what
was the day on 15-aug-1947. The use the to_date function to first convert the string into date
value and then pass on this value to to_char function to extract day.
select to_char(to_date(15-aug-1947,dd-mon-yyyy),Day)
from dual;
TO_CHAR(
-------Friday
To see how many days have passed since 15-aug-1947 then give the following query
Select sysdate-to_date(15-aug-1947,dd-mon-yyyy)
from dual;
Now we want to see which date will occur after 45 days from now
ADD_MONTHS
To see which date will occur after 6 months from now, we can use ADD_MONTHS function
Select ADD_MONTHS(SYSDATE,6) from dual;
ADD_MONTHS
---------22-OCT-2003
MONTHS_BETWEEN
To see how many months have passed since 15-aug-1947, use the MONTHS_BETWEEN
function.
Select months_between(sysdate,to_date(15-aug-1947))
from dual;
Months
-----616.553
To eliminate the decimal value use truncate function
LAST_DAY
To see the last date of the month of a given date, Use LAST_DAY function.
select LAST_DAY(sysdate) from dual;
LAST_DAY
-------31-AUG-2003
NEXT_DAY
To see when the next Saturday is coming, use the NEXT_DAY function.
select next_day(sysdate) from dual;
NEXT_DAY
----------09-AUG-2003
EXTRACT
An EXTRACT datetime function extracts and returns the value of a specified datetime field from a
datetime or interval value expression. When you extract
a TIMEZONE_REGION or TIMEZONE_ABBR (abbreviation), the value returned is a string containing the
appropriate time zone name or abbreviation
The syntax of EXTRACT function is
EXTRACT ( YEAR / MONTH / WEEK / DAY / HOUR / MINUTE / TIMEZONE FROM DATE)
Example
The following demonstrate the usage of EXTRACT function to extract year from current date.
Select extract(year from sysdate) from dual;
EXTRACT
------2003
INDEXES
Use indexes to speed up queries. Indexes speeds up searching of information in tables. So create
indexes on those columns which are oftenly used in WHERE conditions. Indexes are helpful if
the operations return only small portion of data i.e. less than 15% of data is retrieved from tables.
Follow these guidelines for creating indexes
Do not create indexes on small tables i.e. where number of rows are less.
Do not create indexes on those columns which contain many null values.
Do not create BTree index on those columns which contain many repeated
values in this case create BITMAP indexes on these columns.
Limit the number of indexes on tables because, although they speed up
queries, but at the same time DML operations becomes very slow as all the indexes have to
updated whenever an Update, Delete or Insert takes place on tables.
Creating Indexes
To create an Index give the create index command. For example the following statement creates
an index on empno column of emp table.
create index empno_ind on emp (empno);
If two columns are oftenly used together in WHERE conditions then create a composite index on
these columns. For example, suppose we use EMPNO and DEPTNO oftenly together in WHERE
condition. Then create a composite index on these column as given below
create index empdept_ind on emp (empno,deptno);
BITMAP INDEXES
Create Bitmap indexes on those columns which contains many repeated values and when tables
are large. City column in EMP table is a good canditate for Bitmap index because it contain many
repeated values. To create a composite index give the following command.
create bitmap index city_ind on emp (city);
Function Based indexes are built on expressions rather column values. For example if you oftenly
use the expression SAL+COMM in WHERE conditions then create a Function base index on this
expression like this
create index salcomm_ind on emp (sal+comm);
Now, whenever you use the expression SAL+COMM in where condition then oracle will use
SALCOMM_IND index.
DROPPING INDEXES
To drop indexes use DROP INDEX statement. For example to drop SALCOMM_IND give the
following statement
drop index salcomm_ind;
Listing Information about indexes
To see how many indexes are there in your schema and its information, give the following
statement.
select * from user_indexes;
CLUSTERS
If you two are more tables are joined together on a single column and most of the time you issue
join queries on them, then consider creating a cluster of these tables.
A cluster is a group tables that share the same data blocks i.e. all the tables are physically stored
together.
For example EMP and DEPT table are joined on DEPTNO column. If you cluster them, Oracle
physically stores all rows for each department from both the emp and dept tables in the same data
blocks.
Since cluster stores related rows of different tables in same data blocks, Disk
I/O is reduced and access time improves for joins of clustered tables.
Each cluster key value is stored only once each in the cluster and the cluster
index, no matter how many rows of different tables contain the value.
Therefore, less storage might be required to store related table and index data in a cluster than is
necessary in non-clustered table format.
CREATING A CLUSTER
To create clustered tables. First, create a cluster and create index on it. Then create tables in it.
For example to create a cluster of EMP and DEPT tables in which the DEPTNO will be cluster
key, first create the cluster by typing the following command.
create cluster emp_dept (deptno number(2));
Then create index on it.
create index on cluster emp_dept;
Now create table in the cluster like this
create table dept (deptno number(2),
name varchar2(20),
loc varchar2(20))
cluster emp_dept (deptno);
create table emp (empno number(5),
name varchar2(20),
sal number(10,2),
deptno number(2)) cluster emp_dept (deptno)
Dropping Clusters
To drop a cluster use DROP CLUSTER statement. For example to drop the emp_dept cluster give
the following command.
drop cluster emp_dept;
This will drop the cluster, if the cluster is empty i.e. no tables are existing it it. If tables are there
in the cluster first drop the tables and then drop the cluster. If you want to drop the cluster even
when tables are there then give the following command.
drop cluster emp_dept including tables;
Listing Information about Clusters
To see how many clusters are there in your schema give the following statement.
select * from user_clusters;
To see which tables are part of a cluster. Give the following command.
select * from tab
TABLE_NAME
---------EMP
SALGRADE
CUSTOMER
DEPT
TYPE
---TABLE
TABLE
TABLE
TABLE
CLUSTER_ID
----------1
1
In the above example notice the CLUSTER_ID column, for EMP and DEPT table the cluster_id
is 1. That means these tables are in cluster whose cluster_id is 1. You can see the cluster_ids
name in USER_CLUSTERS table.
Table Partitioning
In the above example if you dont specify the partition p4 with values less
than MAVALUE, then you will not be able to insert any row with year above
1994.
Although not required, you can place partitions in different table spaces. If
you place partitions in different table spaces then you can isolate problems
due to failures as only a particular partition will not be available and rest of
the partitions will still be available.
The above example the table is partition by range.
Range Partitioning
Hash Partitioning
List Partitioning
Composite Partitioning
Range Partitioning
This type of partitioning is useful when dealing with data that has logical
ranges into which it can be distributed;
for example, value of year. Performance is best when the data evenly
distributes across the range
Hash partitioning
Use hash partitioning if your data does not easily lend itself to range
partitioning, but you would like to partition for
performance and manageability reasons. Hash partitioning provides a
method of evenly distributing data across a
specified number of partitions. Rows are mapped into partitions based on a
hash value of the partitioning key
partno,
four
and assigned system generated names, and they are placed in four named tablespaces
(tab1,tab2, ...).
List Partitioning
Use list partitioning when you require explicit control over how rows map to partitions. You can specify a list
of discrete
values for the partitioning column in the description for each partition. This is different from range
partitioning, where a
range of values is associated with a partition, and from hash partitioning, where the user has no control of the
row to
partition mapping.
List partitioning allows unordered and unrelated sets of data to be grouped and organized together very
naturally
The following example creates a table with list partitioning
Create table customers (custcode number(5),
Name varchar2(20),
Addr varchar2(10,2),
City varchar2(20),
Bal number(10,2))
Partition by list (city),
Partition north_India values (DELHI,CHANDIGARH),
Partition east_India values (KOLKOTA,PATNA),
COMPOSITE PARTITONING
Composite partitioning partitions data using the range method, and within each partition,
subpartitions it using
the hash method. Composite partitions are ideal for both historical data and striping, and provide
improved
manageability of range partitioning and data placement, as well as the parallelism advantages of
hash partitioning.
When creating composite partitions, you specify the following:
Partitioning column(s)
Subpartitioning column(s)
The following statement creates a composite-partitioned table. In this example, three range
partitions are created, each
containing eight subpartitions. Because the subpartitions are not named, system generated names
are assigned, but the
STORE IN clause distributes them across the 4 specified tablespaces ( tab1, ...,tab4).
CREATE TABLE PRODUCTS (partno NUMBER,
description VARCHAR(32),
costprice NUMBER)
PARTITION BY RANGE (partno)
SUBPARTITION BY HASH(description)
SUBPARTITIONS 8 STORE IN (tab1, tab2, tab3, tab4)
(PARTITION p1 VALUES LESS THAN (100),
PARTITION p2 VALUES LESS THAN (200),
PARTITION p3 VALUES LESS THAN (MAXVALUE));
Any value in the set of literal values that describe the partition(s) being added must not exist in
any of the other partitions
of the table.
Coalescing Partitions
To drop a partition from Range Partition table, List Partition or Composite Partition table give
the following command.
Alter table sales drop partition p5;
Once you have drop the partition and if you have created a global index on the table. Then you
have to rebuild the global index after dropping the partition by giving the following statement.
Alter index sales_ind rebuild;
To avoid rebuilding of indexes after dropping of the partitions you can also first delete all the
records and then drop
the partition like this
Delete from sales where year=1994;
Alter table sales drop partition p4;
This method is most appropriate for small tables, or for large tables when the partition being
dropped contains a small percentage of the total data in the table.
Merging Partitions
Use the ALTER TABLE ... MERGE PARTITIONS statement to merge the contents of two partitions into
one partition. Te two original partitions are dropped, as are any corresponding local indexes.
You cannot use this statement for a hash-partitioned table or for hash subpartitions of a
composite-partitioned table.
You can only merged two adjacent partitions, you cannot merge non adjacent partitions.
For example the merge the partition p2 and p3 into one partition p23 give the following
statement.
Alter table sales merge partition p2 and p3 into
partition p23;
Modifying Partitions: Adding Values
Use the MODIFY PARTITION ... ADD VALUES clause of the ALTER TABLE statement to extend the value
list of an existing partition. Literal values being added must not have been included in any other
partition's value list. The partition value list for any corresponding local index partition is
correspondingly extended, and any global index, or global or local index partitions, remain
usable.
The following statement adds a new set of cities ( 'KOCHI', 'MANGALORE') to an existing partition
list.
ALTER TABLE customers
MODIFY PARTITION south_india
ADD VALUES ('KOCHI', 'MANGALORE');
Use the MODIFY PARTITION ... DROP VALUES clause of the ALTER TABLE statement to remove literal
values from the value list of an existing partition. The statement is always executed with
validation, meaning that it checks to see if any rows exist in the partition that correspond to the
set of values being dropped. If any such rows are found then Oracle returns an error message and
the operation fails. When necessary, use a DELETE statement to delete corresponding rows from
the table before attempting to drop values.
You cannot drop all literal values from the value list describing the partition. You must use
the ALTER TABLE ... DROP PARTITION statement instead.
The partition value list for any corresponding local index partition reflects the new value list, and
any global index, or global or local index partitions, remain usable.
The statement below drops a set of cities ( KOCHI' and 'MANGALORE') from an existing partition
value list.
ALTER TABLE customers
MODIFY PARTITION south_india
DROP VALUES (KOCHI,MANGALORE);
SPLITTING PARTITIONS
You can split a single partition into two partitions. For example to split the partition p5
of sales table into two partitions give the following command
Alter table sales split partition p5 into
(Partition p6 values less than (1996),
Partition p7 values less then (MAXVALUE));
TRUNCATING PARTITON
Truncating a partition will delete all rows from the partition.
To truncate a partition give the following statement
Alter table sales truncate partition p5;