Database Management System 1
Database Management System 1
Database Management System 1
INTRODUCTION TO RDBMS
1.0 Objectives
1.1 Introduction
1.2 What is RDBMS ?
1.3 Difference between DBMS & RDBMS
1.4 Summary
1.5 Check your Progress – Answers
1.6 Questions for Self – Study
1.7 Suggested Readings
1.0 OBJECTIVES
1.1 INTRODUCTION
Most of the problems faced at the time of implementation of any system are
outcome of a poor database design. In many cases it happens that system has to
be continuously modified in multiple respects due to changing requirements of
users. It is very important that a proper planning has to be done.
A relation in a relational database is based on a relational schema, which consists
of number of attributes.
A relational database is made up of a number of relations and corresponding
relational database schema.
The goal of a relational database design is to generate a set of relation schema
that allows us to store information without unnecessary redundancy and also to
retrieve information easily.
One approach to design schemas that are in an appropriate normal form. The
normal forms are used to ensure that various types of anomalies and
inconsistencies are not introduced into the database.
Introduction to RDBMS / 1
The relational model originated from a paper authored by Dr.codd entitled “A
Relational Model of Data for Large Shared Data Banks”, written in 1970. This paper
included the following concepts that apply to database management systems for
relational databases.
The relation is the only data structure used in the relational data model to represent
both entities and relationships between them.
Rows of the relation are referred to as tuples of the relation and columns are its
attributes. Each attribute of the column are drawn from the set of values known as
domain. The domain of an attribute contains the set of values that the attribute may
assume.
From the historical perspective, the relational data model is relatively new .The first
database systems were based on either network or hierarchical models .The relational
data model has established itself as the primary data model for commercial data
processing applications. Its success in this domain has led to its applications outside
data processing in systems for computer aided design and other environments.
1.4 SUMMARY
The goal of a relational database design is to generate a set of relation schema that
allows us to store information without unnecessary redundancy and also to retrieve
information easily.
A database system is an integrated collection of related files, along with details of
interpretation of the data contained therein. DBMS is a s/w system that allows access
to data contained in a database. The objective of the DBMS is to provide a convenient
and effective method of defining, storing and retrieving the information contained in the
database.
Oracle / 2
The DBMS interfaces with application programs so that the data contained in the
database can be used by multiple applications and users. The DBMS allows these
users to access and manipulate the data contained in the database in a convenient
and effective manner. In addition the DBMS exerts centralized control of the database,
prevents unauthorized users from accessing the data and ensures privacy of data.
True or false
1) False
2) True
3) True
4) True
5) False
Introduction to RDBMS / 3
NOTES
Oracle / 4
CHAPTER 2
2.0 Objectives
2.1 Introduction
2.2 Subdivisions of SQL
2.3 Data Definition Language
2.4 Data Manipulation Language Commands
2.5 Data Control Language
2.6 Select Query and Clauses
2.7 Select Statement with Order by Clause
2.8 Group by Clause
2.9 Having Clause
2.10 String Operation
2.11 Distinct Rows
2.12 Rename Operation
2.13 Set Operations
2.14 Aggregate Functions
2.15 Nested Sub Queries
2.16 Embedded SQL
2.17 Dynamic SQL
2.18 Summary
2.19 Check Your Progress - Answers
2.20 Questions for Self – Study
2.21 Suggested Readings
2.0 OBJECTIVES
2.1 INTRODUCTION
In this chapter we study the query language : Structured Query Language (SQL)
which uses a combination of Relational algebra and Relational calculus.
It is a data sub language used to organize, manage and retrieve data from
relational database, which is managed by Relational Database Management System
(RDBMS).
Vendors of DBMS like Oracle, IBM, DB2, Sybase, and Ingress use SQL as
programming language for their database.
SQL originated with the system R project in 1974 at IBM's San Jose Research
Centre.
Original version of SQL was SEQUEL which was an Application Program Interface
(API) to the system R project.
The SQL DDL provides commands for defining relation schemas, deleting
relations, creating indices, and modifying relation schemas.
The SQL DDL allows the specification of not only a set of relations but also
information about each relation including :
• The schema for each relation.
• The domain of values associated with each attribute.
• The integrity constraints.
• The set of indices to be maintained for each relation.
• The security and authorization information for each relation.
• The physical storage structure of each relation on disk.
Domain/Data Types in SQL :
The SQL - 92 standard supports a variety of built-in domain types, including the
following :
(1) Numeric data types include
• Integer numbers of various sizes
INT or INTEGER
SMALLINT
• Real numbers of various precision
REAL
DOUBLE PRECISION
FLOAT (n)
• Formatted numbers can be represented by using
DECIMAL (i, j) or
DEC (i, j)
NUMERIC (i, j) or NUMBER (i, j)
where, i - the precision, is the total number of decimal digits
and j - the scale, is the number of digits after the decimal point.
The default for scale is zero and the default for precision is implementation
defined.
(2) Character string data types - are either fixed - length or varying - length.
CHAR (n) or CHARACTER (n) - is fixed length character string with user
specified length n.
VARCHAR (n) - is a variable length character string, with user - specified
maximum length n. The full form of CHARACTER VARYING (n), is
equivalent.
(3) Date and Time data types :
There are new data types for date and time in SQL-92.
DATE - It is a calendar date containing year, month and day typically in
the form
yyyy : mm : dd
TIME - It is the time of day, in hours, minutes and seconds, typically in the
form
HH : MM : SS.
Varying length character strings, date and time were not part of the SQL -
89 standard.
In this section we will study the three Data Definition Language Commands :
CREATE TABLE
ALTER TABLE
DROP TABLE
1. CREATE TABLE Command :
The CREATE TABLE COMMAND is used to specify a new relation by giving it a
name and specifying its attributes and constraints.
Oracle / 8
[Primary key (Column_name A, Column_name B… Column_name X)]);
Example :
Create table Employee
(E_name Varchar2 (20),
B_Date Date,
Salary Decimal (10, 2),
Address Varchar2 (80),
Constraint PK_Employee
Primary key (Ename));
Create table_student
(Student_id Varchar2 (20),
Last_name Varchar2 (20) NOT NULL,
First_name Varchar2 (20),
B_Date Date,
State Varchar2 (20),
City Varchar2 (20),
Constraint PK_Student
Primary key Student_id));
Create Table_Course
(Course_id Varchar2 (5),
Department_id Varchar2 (20),
Title Varchar2 (20),
Description Varchar2 (20),
Constraint PK_Course
Primary key (Course_id, Department_id));
Note : We do not specify NOT NULL constraint for those columns which form the
primary key, since those are the mandatory columns by default. Primary keys are
subject to several restrictions.
(i) A column that is a part of the primary key cannot be NULL.
(ii) A column that is defined as LONG, or LONG RAW (ORACLE data types)
cannot be a part of primary key.
(iii) The maximum number of columns in the primary key is 16.
Foreign Key : A foreign key is a combination of columns with values based on the
primary key values from another table. A foreign key constraint also known as a
referential integrity constraint, specifies that the values of the foreign key correspond to
actual values of primary key in other table.
Create table command specifies the foreign key as follows :
Create Table table_name
(Column_name 1 data type [NOT NULL],
Examples :
Create table_department
(Department_id Varchar2 (20),
Department_name Varchar2 (20),
Constraint PK_Department
Primary key (Department_id));
Create table_course
(Course_id Varchar2 (20),
Department_id Varchar2 (20),
Title Varchar2 (20),
Description Varchar2 (20),
Constraint PK_course
Primary key (Course_id, Department_id),
Constraint FK - course
Foreign key (Department_id) references Department (Department_id));
Thus, primary key of course table is (Course_id, Department_id).
The primary key of Department table is (Department_id).
Foreign key of course table is (Department_id) which references the department
table.
When you define a foreign key, the DBMS verifies the following :
(1) A primary key has been defined for table referenced by the foreign key.
(2) The number of columns composing the foreign key matches the number of
primary key columns in the referenced table.
(3) The datatype and width of each foreign key columns matches the datatype
and width of each primary key column in the referenced table.
Unique Constraint or Candidate key :
A candidate key is a combination of one or more columns, the values of which
uniquely identify each row of the table. Create table command specifies the unique
constraint as follows :
CREATE TABLE table_name
(column_name 1 data_type [NOT NULL],
:
:
column_name n data_type [NOT NULL],
[constraint constraint_name
Unique (Column_name A,……… Column_nameX)]);
Example :
Oracle / 10
Create table student
(Student_id Varchar2 (20),
Last_name Varchar2 (20), NOT NULL,
First_name Varchar2 (20), NOT NULL,
BDate Date,
State Varchar2 (20),
City Varchar2 (20),
Constraint UK-student
Unique (last_name, first_name),
Constraint PK-student
Primary key (Student_id));
A unique constraint is not a substitute for a primary key. Two differences between
primary key and unique constraints are :
(1) A table can have only one primary key, but it can have many unique
constraints.
(2) When a primary key is defined, the columns that compose the primary key are
automatically mandatory. When a unique constraint is declared, the columns
that compose the unique constraint are not automatically defined to be
mandatory, you must also specify that the column is NOT NULL.
Check Constraint :
Using CHECK constraint SQL can specify the data validation for column during
table creation. CHECK clause is a Boolean condition that is either TRUE or FALSE. If
the condition evaluates to TRUE, the column value is accepted by database, if the
condition evaluates to FALSE, database will return an error code.
The check constraint is declared in CREATE TABLE statement using the syntax :
Column_name datatype [constraint constraint_name] [CHECK (Condition)]
The variables are defined as follows :
Column_name - is the column name
data_type - is the column's data type
constraint_name - is the name given to check constraint condition is the legal
SQL
Condition that returns a Boolean value.
Examples :
Create table_worker
(NameVarchar2 (25) NOT NULL,
Age Number Constraint CK_worker
CHECK (Age Between 18 AND 65) );
Create table_instructor
(Instructor_id Varchar2 (20),
Department_id Varchar2 (20) NOT NULL,
Name Varchar2 (25),
Position Varchar2 (25)
Constraint CK_instructor
CHECK (Position in ('ASSISTANT PROFESSOR', 'ASSOCIATE PROFESSOR', 'PROFESSOR')),
Address Varchar2 (25),
Constraint PK_instructor
Primary key (Instructor_id));
If the position of the instructor is not one of the three legal values, DBMS will
return an error code indicating that a check constraint has been violated.
More than one column can have check constraint.
Create table_Patient
The SQL DML includes commands to insert tuples into database, to delete tuples from
database and to modify tuples in the database.
Oracle / 14
It includes a query language based on both relational algebra and tuple relational
calculus.
In this section we'll study following SQL DML commands.
INSERT
DELETE
UPDATE
SELECT
1. INSERT Command :
The syntax of insert statement is :
INSERT INTO table_name
[(column_name [ , column_name] …… [ , column_name])]
VALUES
(column_value [ , column_value] …… [ , column_value]);
The variables are defined as follows :
Table_name - is the table in which to insert the row.
column_name - is a column belonging to table.
column_value - is a literal value or an expression whose type matches the
corresponding column_name.
The number of columns in the list of column_names must match the number of
literal values or expressions that appear in parenthesis after the keyword values.
Example :
SQL> Insert into Employee
(E_name, B_Date, Salary, Address)
Values
('Sachin', '21-MAR-73', 50000.00, 'Mumbai');
row created
SQL> Insert into student
(Student_id, Last_name, First_name)
Values
('SE201', 'Tendulkar', 'Sachin');
row created
If the column names specified in Insert statement are more than values, then it
returns an error.
Column and value datatype must match.
According to the syntax of INSERT statement, column list is an optional element.
Therefore, if you do not specify the column names to be assigned values, it (DBMS) by
default uses all the columns. The column order that DBMS uses is the order in which
the columns were specified, when the table was created. However, use of Insert
statement without column list is dangerous.
For example,
SQL> Describe ex_class;
Name NULL ? Type
Class_building NOT NULL Varchar2 (25)
Class_room NOT NULL Varchar2 (25)
Seating_capacity Number (38)
SQL> Insert into ex_class
Values
('250', 'Kothrud Pune', 500);
1 row created.
The row is successfully inserted into the table, because, value and column data
types were matching.
But the value 250 is not a correct value for column class_building.
The use of insert without column list may cause following problems.
2. DELETE Command :
The syntax of delete statement is :
DELETE FROM table_name
[WHERE condition]
The variables are defined as follows :
table_name - is the table to be updated.
condition - is a valid SQL condition.
DELETE Command without WHERE clause will empty the table
completely.
Example :
SQL> Delete from Student
Where Student_id = 'SE 201';
1 row deleted.
SQL> Detete from student
Where first_name = 'Sachin' and
Student_id ='SE 202';
1 row deleted.
3. UPDATE Command :
If you want to modify existing data in the database, UPDATE command can be
used to do that. With this statement you can update zero or more rows in a table.
The syntax of UPDATE command is :
UPDATE table_name
SET column_name : : expression
[, column_name : : expression]
[, column_name : : expression]
[where condition]
The variables are defined as follows :
table_name is the table to be updated
column_name is a column in the table being updated.
expression is a valid SQL expression.
condition is a valid SQL condition.
The UPDATE statement references a single table and assigns an expression to at
least one column. The WHERE clause is optional; if an UPDATE statement does not
contain a WHERE clause, the assignment of a value to a column will be applied to all
rows in the table.
Example :
SQL> Update Student
Set
City = 'Pune',
State = 'Maharashtra';
SQL> Update Instructor
Set
Position = 'Professor'
where
Instructor_id = 'P3021';
SQL Grammar :
Here, are some grammatical requirements to keep in mind when you are working
with SQL.
Oracle / 16
1. Every SQL statement is terminated by a semicolon.
2. An SQL statement can be entered on one line or split across several lines for
clarity.
3. SQL isn't case sensitive. You can mix uppercase and lowercase when
referencing SQL keywords (Such as SELECT and INSERT), table names, and column
names.
However, case does matter when referencing to the contents of a column.
For Example : If you ask for all customers whose last names begin with 'a' and all
customer names are stored in uppercase, you won't receive any rows at all.
4. SELECT Command :
The basic structure of an SQL expression consists of three clauses :
select, from and where
• The select clause corresponds to the projection operation of the relational
algebra.
It is used to list the attributes desired in the result of a query.
• The from clause corresponds to the cartesian product operation of the
relational algebra. It lists the relations to be scanned in the elevation of the
expression.
• The where clause corresponds to the selection predicate of the relational
algebra.
It consists of predicate involving attributes of the relations that appear in the
from clause.
Simple SQL query i.e. select statement has the form :
select A1, A2, ……, An
from r1, r2, ……, rm
where P.
The variables are defined as follows :
A1, A2, …, An represent the attributes.
r1, r2, …, rm represent the relations from which the attributes are selected.
P - is the predicate.
This query is equivalent to the relational algebra expression
A A … A (sp (r1 × r2 × r3 … × rm))
1 2 n
where clause is optional. If the where clause is omitted, the predicate P is true.
Select clause forms the cartesian product of relations named in the from clause,
performs a relational algebra selection using the where clause and then projects the
results onto the attributes of the select clause.
A simple select statement :
At a minimum, select statement contains the following two elements.
• The select list, the list of columns to be retrieved.
• The from clause, the tables from which to retrieve the rows.
Example : Consider the student database table.
(1) A simple select statement - a query that retrieves only student_id from the
student table is given
SQL> select student_id
from student;
student_id
S 10231
S 10232
S 10233
S 10234
S 10235
S 10236
student_id First_name
S 10231 Sachin
S 10232 Rahul
S 10233 Ajay
S 10234 Sunil
S 10235 Kapil
S 10236 Anil
6 rows selected.
Description Operator
Addition +
Subtraction –
Multiplication *
Division /
For example, consider the following queries using operators in select list :
SQL> Select E_name, Salary * 1000
from Employee;
E_name Salary * 1000
Sachin 1,00,00,000
Rahul 2,00,00,000
Ajay 1,00,00,000
Anil 1,00,00,000
4 rows selected.
Oracle / 18
SQL> Select Ename, Salary + 10000
from Employee;
E_name Salary + 10000
Sachin 20,000
Rahul 30,000
Ajay 20,000
Anil 30,000
4 rows selected.
Select statement using where clause :
select and from clauses provide you with either some columns and all rows or all
columns and all rows. But if you want only certain rows, you need to add another
clause, the where clause.
where clause consists of one or more conditions that must be satisfied before a
row is retrieved by the query.
It searches for a condition and narrows your selection of data.
For example, consider select statement with where clause given below :
SQL> Select Student_id, First_name
from Student
where Student_id = 'S10234';
Student_id First_name
S10234 Sunil
1 row selected
SQL> Select E_name Salary
from Employee
where Salary > 10000;
E_name Salary
Rahul 20000
Anil 20000
2 row selected
where uses the logical connectives : and, or and not.
where clause uses the comparison operators
Description Operator
Less than <
Less than or equal to <=
Greater than >
Greater than or equal to >=
Equal to =
Not equal to != or < >
Comp_name city
TCS Delhi
MBT Bombay
PCS Pune
Oracle / 20
Example :
Consider the view consisting of branch names and names of customers who have
either an account or a loan at that branch.
SQL> Create view all_customer as
(select branch_name, customer_name
from depositor, account
where depositor·account_number =
account·account·account_no)
Union
(select branch_name, customer_name
from borrower
where borrower·loan_number = loan·loan_number);
The attribute names of a view can be specified explicitly as follows :
SQL> Create view branch_total_loan (branch_name,
total_loan) as
select branch_name, sum (amount)
from loan
group by branch_name;
6. Indexes in SQL : SQL has statements to create and drop indexes on attributes
of base relation. These commands are generally considered to be part of the SQL data
definition language (DDL).
An index is a physical access structure that is specified on one or more attributes
of the relation. The attributes on which an index is created are termed indexing
attributes. An index makes accusing tuples based on conditions that involve its
indexing attributes more efficient. This means that in general executing a query will
take less time if some attributes involved in the query conditions were indexed than if
they were not. This improvement can be dramatic for queries where large relations are
involved. In general, if attributes used in selection conditions and in join conditions of a
query are indexed, the execution time of the query is greatly improved.
In SQL indexed can be created and dropped dynamically. The create Index
command is used to specify an index. Each index is given a name, which is used to
drop the index when we do not need it any more.
Example :
Create Index Emp_Index
ON Employee (Emp_name);
In general, the index is arranged in ascending order of the indexing attribute
values. If we want the values in descending order we can add the keyword DESC after
the attribute name. The default in ASC for ascending. We can also create an index on
a combination of attributes.
Example :
Create Index Emp_Index1
ON Employee (Emp_name ASC,
Comp_name DESC);
There are two additional options on indexes in SQL. The first is to specify the key
constraint on the indexing attribute or combination of attributes.
The keyword unique following the CREATE command is used to specify a key.
The second option on index creation is to specify whether on index is clustering index.
The keyword cluster is used in this case of the end of the create Index command. A
base relation can have atmost one clustering index but any number of non_clustering
indexes.
To drop an index, we issue the Drop Index command. The reason for dropping
indexes is that they are expensive to maintain whenever the base relation is updated
and they require additional storage. However, the indexes that specify a key constraint
should not be dropped as long as we want the system to continue enforcing that
constraint.
Creating Sequences
Always give sequence a name so that it can be referenced later when required.
The minimum information required for generating numbers using a sequence is :
-The starting number
-The maximum number that can be generated by a sequence
- The increment value for generating the next number
This information is provided to oracle at the time of sequence creation
Syntax:
CREATE SEQUENCE <SequenceName>
[INCREMENT BY <IntegerValue>
[START WITH <IntegerValue>
MAXVALUE <IntegerValue> / NOMAXVALUE
MINVALUE <IntegerValue> /NOMINVALUE
CYCLE/NOCYLCLE
CACHE <IntegerValue>/NOCACHE
ORDER/NOORDER ]
START WITH :Speciifes the first sequence number to be generated. The default for an
ascending sequence is the sequence minimum value(1) and for a descending
sequence, it is the maximum value(-1)
CYCLE: Specifies that the sequence continues to generate repeat values after
reaching either its maximum value.
NOCYCLE: Specifies that a sequence cannot generate more values after reaching the
maximum value.
Oracle / 22
CACHE :Specifies how many values of a sequence oracle pre-allocates and keeps in
memory for faster access.The minimum value for this parameter is two.
ORDER :This guarantees that sequence numbers are generated in the order of
request.This is only necessary if using parallel server in parallel mode option .In
exclusive mode option ,a sequence always generates numbers in order.
NOORDER :This does not guarantee sequence numbers are generated in order of
request.This is only necessary if you are using parallel server in parallel mode option.
If the ORDER/NOORDER clause is omitted , a sequence takes the NOORDER clause
by default.
Example
Create a sequence by the name ADDR_SEQ ,which will generate numbers from 1
uptp 9999 in ascending order with an interval of 1.The sequence must restart from the
number 1 after generating number 999.
CREATE SEQUENCE ADDR_SEQ INCREMENT BY 1 START WITH 1 MINVALUE 1
MAXVALUE 999 CYCLE ;
Referencing a sequence
Once a sequence is created SQL can be used to view the values held in its cache.To
simply view sequence value use a SELECT sentence as described below.
SELECT <SequenceName>.Nextval from DUAL ;
This will display the next value held in the cache on the VDU screen. Everytime
nextval references a sequence its output is automatically incremented from the old
value to the new value ready for use.
To reference the current value of a sequence:
SELECT <SequenceName>.CurrVal FROM DUAL;
Dropping a Sequence
The DROP SEQUENCE command is used to remove the sequence from the
database.
Syntax:
DROP SEQUENCE <SequenceName> ;
2. REVOKE Command :
The REVOKE statement is used to deny the grant given on an object.
Syntax :
REVOKE {object privilages}
ON object name
FROM user name;
1. Revoke the object privilages that you didn't grant to the revokee.
2. Revoke the object privilages granted through the operating system.
Example 1 : Revoke Delete privilege on student table from Pradeep.
REVOKE DELETE
ON student
From Pradeep;
Example 2 : Revoke the remaining privilages on student that were granted to
Pradeep.
Revoke ALL
ON student
FROM Pradeep
Oracle / 24
3. COMMIT Command :
Commit command is used to permanently record all changes that the user has
made to the database since the last commit command was issued or since the
beginning of the database session.
Syntax :
COMMIT;
Implicity COMMIT :
The actions that will force a commit to occur even without your instructing it to are :
quit, exit,
create table or create view
drop table or drop view
grant or revoke
connect or disconnect
alter
audit and non-audit
Using any of these commands is just like using commit. Until you commit, only you
can see how your work affects the tables. Anyone else with access to these tables will
continue to get the old information.
4. ROLLBACK command :
The ROLLBACK statement does the exact opposite of the commit statement. It
ends the transaction but undoes any changes made during the transaction. Rollback is
useful for two reasons :
(1) If you have made a mistake, such as deleting the wrong row for a table, you
can use rollback to restore the original data. Rollback will take you back to
intermediate statement in the current transaction, which means that you do not have to
erase the entire transaction.
(2) ROLLBACK is useful if you have started a transaction that you cannot
complete. This might occur if you have a logical problem or if there is an SQL
statement that does not execute successfully. In such cases rollback allows you to
return to the starting point to allow you to take corrective action and perhaps try again.
where
WORK - is optional and is provided for ANSI compatibility
SAVEPOINT - is optional and is used to rollback a partial transaction, as far as
the specified save point.
Savepoint : is a savepoint created during the current transaction.
where clause is optional. If the where clause is omitted, the predicate P is true.
Select clause forms the cartesian product of relations named in the from clause,
performs a relational algebra selection using the where clause and then projects the
results onto the attributes of the select clause.
The purpose of select statement is to retrieve and display data from one or more
database tables It is an extremely powerful statement capable of performing the
equivalent relational algebra’s Selection, Projection, and Join operations in a single
statement. Select is the most frequently used SQL command and has the following
general form :
SELECT DISTINCT |ALL]
FROM Table_Name [alias][,…]
[WHERE condition]
[GROUP BY column_List] [HAVING condition]
[ORDER BY column_List]
The sequence of processing in a select statement is :
FROM
WHERE
GROUP BY
HAVING
Oracle / 26
SELECT
ORDER BY
The order of the clauses in the select command can not be changed. The only two
mandatory columns are : SELECT and FROM, the remainder are optional.
Description Operator
Addition +
Subtraction –
Multiplication *
Division /
For example, consider the following queries using operators in select list :
SQL> Select E_name, Salary * 1000
from Employee;
E_name Salary * 1000
Sachin 1,00,00,000
Rahul 2,00,00,000
Ajay 1,00,00,000
Anil 1,00,00,000
4 rows selected.
SQL> Select E_name, Salary + 10000
from Employee;
E_nam Salary + 10000
Sachin 20,000
Rahul 30,000
Ajay 20,000
Anil 30,000
4 rows selected.
2. Select statement using where clause :
select and from clauses provide you with either some columns and all rows or all
columns and all rows. But if you want only certain rows, you need to add another
clause, the where clause.
where clause consists of one or more conditions that must be satisfied before a
row is retrieved by the query.
It searches for a condition and narrows your selection of data.
For example, consider select statement with where clause given below :
SQL> Select Student_id, First_Name
from Student
where Student_id = 'S10234';
Student_id First_name
S10234 Sunil
1 row selected
SQL> Select E_name Salary
from Employee
where Salary > 10000
E_name Salary
Rahul 20000
Anil 20000
2 row selected
Description Operator
Less than <
Less than or equal to <=
Greater than >
Greater than or equal to >=
Equal to =
Not equal to != or < >
SQL> Select E_name, Salary
from Employee
where Salary>10000 and Ename = Anil
E_name Salary
Anil 20000
1 row selected.
Range Searching
In order to select data that is within a range of values ,the BETWEEN operator is used.
The BETWEEN operator allows the selection of rows that contain values within a
specified lower and upper limit. The range coded after the word BETWEEN is
inclusive.
The lower value must be coded first.The two values in between the range must be
linked with the keyword AND.The BETWEEN operator can be used with both character
and numeric data types.However the datatypes can not be mixed.i.e the lower value of
a range of values from a character column and the other from a numeric column.
Example 1 : List the transactions performed in months of January to March
Solution :
SELECT * FROM TRANS_MSTR WHERE TO_CHAR(DT,’MM’) BETWEEN 01 AND
03 ;
Equivalent to
SELECT * FROM TRANS_MSTR WHERE TO_CHAR (DT,’MM’)>=01 AND
TO_CHAR(DT,’MM’)<=03;
Explanation
The above select will retrieve all those records from the ACCT_MSTR table where the
value held in the DT field is between 01 and 03 (both values inclusive).This is done
using TO_CHAR() function which extracts the month value from the DT field. This is
then compared using the AND operator.
Example 2 : List all the accounts which have not been accessed in the fourth
quarter of the financial year
Solution
SELECT DISTINCT FROM TRANS_MSTR WHERE TO_CHAR(DT,’MM’) NOT
BETWEEN 01 AND 04 ;
Explanation
The above select will retrieve all those records from the ACCT_MSTR table where the
value held in the DT field is not between 01 and 04(both values inclusive).This is done
using TO_CHAR() function which extracts the month value from the DT field and then
compares them using the not and the between operator.
Oracle / 28
The ORDER BY clause consists of a list of column identifiers that the result is to
be sorted on, separated by columns. A column identifier may be either a column name
or a column number.
It is possible to include more than one element in the ORDER BY clause. The
major sort key determines the overall order of the result table
If the values of the major sort key are unique, there is no need for additional keys
to control the sort. However, if the values of the major sort key are not unique, there
may be multiple rows in the result table with the same value for the major sort key. In
this case it may be desirable to order rows with the same value for the major sort key
by some additional sort key. If a second element appears in the ORDER BY clause, it
is called a minor sort key.
Example : Consider the worker database :
SQL> select *
from worker
order By F_NAME asc 0;
Another helpful clause is the group by clause. A group by clause arranges your
data rows into a group according to the columns you specify.
A query that includes group by clause is called a grouped query because it
groups that data from the SELECT tables and generates single summary row for each
group.
The columns named in the group by clause are called the grouping columns.
When GROUP BY clause is used, each item in the SELECT list must be single-
valued per group.
The select clause may contain only :
Column names
Aggregate functions
Constants
An expression involving combinations of the above.
All column names in SELECT must appear in GROUP BY clause, unless the name
is used only in an aggregate function. The contrary is not true; there may be column
names in GROUP BY clause that do not appear in SELECT clause.
When the WHERE clause is used with GROUP BY the WHERE clause is applied first,
then groups are formed from the remaining rows that satisfy the search condition.
Example :
Consider the worker table given below :
SQL> select *
from worker
STATUS GENDER BIRTHDATE
F_NAME
The Having clause is similar to the where clause. The Having clause does for
aggregate data what where clause does for individual rows. The having clause is
another search condition. In this case, however, the search is based on each group of
grouped table.
The difference between where clause and having clause is in the way the query is
processed.
In a where clause, the search condition on the row is performed before rows are
grouped. In having clause, the groups are formed first and the search condition is
applied to the group.
Syntax is :
select select_list
from table_list
[where condition [AND : OR] …… condition]
[group by column 1, column 2, …… column N]
[Having condition]
Oracle / 30
Example :
SQL> select *
from worker
Group By status, Gender
Having Gender = 'F';
SQL> select *
from worker
where Birthdate < 11 / 01 / 70
Group By status, Gender
Having Gender = 'M';
Example Queries :
(1) Find the names of customers whose city name include "bad"
SQL> select cust_name, cust_city
from customer
where cust_city like "%bad";
Cust_name Cust_city
Sachin Aurangabad
Rahul Hyderabad
Ajay Ahemadabad
(2) Find the student's last name and id if the last name begins with "Desh"
SQL> select student_id, last_name
from student
where last_name like "Desh %";
student_id last_name
101 Deshpande
102 Deshmukh
SELECT statement has an optional Keyword distinct. This keyword follows select
and return only those rows which have distinct values for the specified columns. i.e. it
eliminates duplicate values.
The keyword all allows to specify explicitly that the duplicates are not removed.
Example :
SQL> select distinct branch_name
from loan;
which eliminates duplicate values in the result.
SQL> select all branch_name
from loan;
it specifies that duplicates are not eliminated from result relation.
Since duplicate retention is by default, we will not use all.
SQL provides a mechanism for renaming both relations and attributes. It uses as
clause and the syntax is :
old_name as new_name
The as clause can appear in both the select and from clauses.
Example :
SQL> select distinct customer_name, borrower_loan_no.
from borrower, loan
where borrower·loan_no = loan·loan_no and
branch name = 'ICICI';
This query can be rewritten using as clause as follows :
SQL> select customer_name, borrower_loan no as loan_id
from borrower, loan
where borrower loan_no = loan·loan_no and
branch name = 'ICICI';
where borrower_loan_no attribute is renamed as
loan_id.;
Oracle / 32
2.13 SET OPERATIONS
The SQL-92 operations UNION, INTERSECT and MINUS operate on relations and
correspond to the relational algebra operations , , – .
Like the union, intersect and set difference in relational algebra, the relations
participating in the operations must be compatible, i.e. they must have the same set of
attributes.
There are restrictions on the tables that can be combined using the set operations,
the most important one being that the two tables have to be union-compatible; that is
they have the same structure. This implies that the two tables must contain the same
number of columns, and that their corresponding columns have the same data types
and lengths. It is the user’s responsibility to ensure that data values in corresponding
columns come from the same domain.
Union operator :
The syntax for this set operator is :
select_statement 1
Union
select_statement 2
[ order_by_clause]
The variables are defined as :
select_statement 1 and select_statement 2 are valid select statements
order_by_clause is optional ORDER By clause that references the columns by
number rather than by name.
The UNION operator combines the rows returned by the first SELECT statement
with rows returned by the second SELECT statement.
Keep following things in mind when you use the UNION operator.
1. The two SELECT statement may not contain an ORDER By clause; however, you
can order the results of the union operation.
2. The number of columns retrieved by select_statement 1 must be equal to the
number of columns retrieved by select_statement 2.
3. The data types of the columns retrieved by select_statement 1 must match with
the data types of the columns retrieved by select_statement 2.
4. Here the optional order_by_clause differs from the usual ORDER By clause in a
select statement, because the columns used for ordering must be referenced by
number rather than by name. The reason that columns must be referenced by
number is that SQL does not require that the column names retrieved by
select_statement-1 be identical to the column names retrieved by select statement
- 2.
Example :
Find all customers having a loan, an account or both at the bank.
SQL> select customer_name
from depositor
union
select customer_name
from borrower.
Union operation finds all customer having an account, loan or both at bank.
Union operation eliminates duplicates.
Intersect Operator :
The Intersect operator returns the rows that are common between two sets of rows.
The syntax for using the INTERSECT operator is :
select_statement-1
Intersect
select_statement-2
[Order_By_clause]
The variables are defined as follows :
Example : Find all customers who have an account but no loan at the bank.
SQL> Select customer_name
from depositor
MINUS
Select customer_name
from borrower
Aggregate functions are the functions that take a collection of values as input and
return a single value.
SQL offers five built-in aggregate functions.
Oracle / 34
1. Average : AVG
2. Minimum : MIN
3. Maximum : MAX
4. Total : SUM
5. Count : COUNT
These functions operate on a single column of a table and return a single value.
COUNT, MIN and MAX apply to both numeric and non-numeric fields, but SUM
and AVG may be used on numeric fields only.
Apart from COUNT(*), each function eliminates nulls first and operates only on the
remaining non-null values.
If we want to eliminate duplicates before the function is applied, we use the
keyword DISTINCT before the column name in the function.
The keyword ALL can be used if we do not want to eliminate the duplicates. ALL is
assumed if nothing is specified.
DISTINCT has no effect on MIN and MAX functions. It may effect on the result of
SUM or AVG.
It is important to note that an aggregate function can be used only in SELECT list
and in the HAVING clause. It is incorrect to use it elsewhere.
avg function :
avg function computes the column's average value.
The input to avg must be a collection of numbers.
Example : Find the average balance
SQL> select avg (balance)
from account;
This aggregate function can also be applied to a group of set of tuples using
group by clause.
Example : Find the average balance at each branch
SQL> select branch_name, avg (balance)
from account
group by branch_name;
(2) Find all customers who have both an account and loan at the ICICI branch.
SQL> select customer_name
from borrower, loan
where borrower loan no = loan · loan_no and
branch_name = 'ICICI' and
(branch_name, customer_name) in
(select branch_name, customer_name
from depositor, account
where depositor·account_no = account·account_no);
Example query for not in connective :
(1) Find all customers who do have a loan at the bank, but do not have an
account at the bank.
SQL> select customer_name
from borrower
where customer_name not in
(select customer_name
from depositor);
The in and not in operators can also be used on enumerated sets.
Example :
Find the customer names who have a loan at a bank and whose names are
neither 'Sachin' nor 'Ajay'.
SQL> select customer_name
from borrower
Oracle / 36
where customer_name not in (‘Sachin’, ‘Ajay’);
2. Set Comparison :
SQL allows following set comparison operators :
< some : Less than at least one
<= some : Less than or equal to at least one
> some : Greater than at least one
>= some : Greater than or equal to at least one
= some : Equal to at least one
< > some : Not equal to at least one.
Example Query :
"Find the names of all branches that have assets greater than those of at least
one branch located in Bombay"
SQL> select branch_name
from branch
where assets > some (select assets
from branch
where branch_city = ‘Bombay’)
Sub query(select assets
from branch
where branch city = Bombay)
generates the set of all asset values for all branches in Bombay. The > some
comparison in where clause of the outer select is true if the asset value of the tuple is
greater than at least one member of the set of all asset values for branches in
Bombay.
SQL also supports following set of comparison operators :
< all : less than all
<= all : less than or equal to all
> all : greater than all
>= all : greater than or equal to all
= all : equal to all
< > all : not equal to all
Example Query :
Find the branch that has the highest average balance.
SQL> select branch_name from account
group by branch_name having avg (balance) >= all (select avg (balance) from
account group by branch_name);
Test for Empty Relations :
SQL includes a feature for testing whether a sub query has any tuples in its
results.
The exists construct returns the value true if the argument query is non-empty.
Similarly, we can test the non-existence of tuples in a sub-query by using the not-
exists construct.
Example Query using exists construct :
"Find all customers who have both an account and a loan at the bank."
SQL> select customer_name
from borrower
where exists (select *
from depositor
where depositor customer_name =
borrower·customer_name);
Example Query using Not exists construct :
Find all customers who have an account at all branches located in Bombay.
Oracle / 38
R·account_number = account·account_number
and account·branch_name = ‘ICICI’);
(1) Not all queries can be expressed in SQL since, SQL does not provide the full
expressive power of a general purpose language. That is there exist queries that can
be expressed in a language such as Pascal, C, Cobol, or Fortran that cannot be
expressed in SQL. To write such queries, we can embed SQL within a more powerful
language.
SQL is designed such that queries written in it can be optimized automatically and
executed efficiently, and providing the full power of a programming language makes
automatic optimization exceedingly difficult.
Close statement : A close statement must be used to tell the database system to
delete the temporary relation that held the result of the query.
For our example, the close statement is
EXEC SQL close c END EXEC
Embedded SQL expression for database modification can be given as :
EXEC SQL < any valid update, insert
or delete > END EXEC
Host language variables, preceded by a colon, may appear in SQL database
modification expression. If an error arises in the execution of the statement, a
diagnostic is set in the SQLCA.
Oracle / 40
2.17 DYNAMIC SQL
Oracle / 44
company (company_name, city)
manages (employee_name, manager_name).
Give an expression in SQL for each of the following :
(1) Find the names of all employees who work for FBC.
select employee_name
from works
where company_name = 'FBC' ;
(2) Find the names and cities of all employees who work for FBC.
select employee·employee_name, city
from works, employee
where employee·employee_name = works · employee_name and
company_name = 'FBC';
(3) Find the names, street address, and cities of residence of all
employees who work for FBC and earn more than $ 10,000.
select employee·employee_name, street, city
from works employee
where employee·employee_name = works·employee_name and
company_name ='FBC' and salary > 10000;
(4) Find all employees in the database who live in the same cities as the
companies for which they work.
select w.employee_name
from works w, emple, comp c
where e.emp_name = w.emp_name and
C.company_name . w. company_name and e.city = city;
(5) Find all employees in the database who live in the same cities and on
the same street as do their managers.
select E.employee_name
from employee E.employee T, manages
where E.employee_name= manages.employee_name
and E.street = T.street and E.city = T.city and
T.employee_name = manages.manager_name;
(6) Find all employees in the database who do not work for FBC.
(select employee_name
from employee)
minus
(select employee_name
from works
where company_name = 'FBC');
(7) Find all employees in the database who earn more than every
employee of small bank corporation
select employee_name
from works
where salary > (select max (salary)
from works
where company_name = 'FBC');
(8) Find all employees who earn more than the average salary of all
employees of their company.
select T.employee_name
from works T.
where salary > (select avg (S.salary)
from works S.
where T.company_name = S.company_name);
2.18 SUMMARY
2.2-2.7
1)Grant & Revoke
2) Unique & Not Null
3) DDL
4)Commit
5) Having
2.8-2.12
1)Grouped
2)Distinct or Unique
Oracle / 46
2.13-2.16
1) Avg ()
2) Sub Query/Nested Query
3)Open
4) Dynamic SQL
Oracle / 48
NOTES
Oracle / 50
Chapter 3
3.0 Objectives
3.1 Introduction
3.2 Joins
3.2.1 Equi-Join.
3.2.2 Non-Equi-Join.
3.2.3 Outer Join versus Inner Join
3.2.4 Joining Table to Itself.
3.3 Procedures and Functions
3.4 Creating a Procedure
3.5 Executing a Procedure
3.6 Deleting a Procedure
3.7 Functions
3.7.1 Aggregate Functions
3.7.2 Date & Time Function
3.7.3 Arithmatic Functions
3.7.4 Character Functions
3.7.5 Conversion Functions
3.7.6 Miscelleneous Functions
3.8 Summary
3.9 Check Your Progress - Answers
3.10 Questions for Self – Study
3.11 Suggested Readings
3.0 OBJECTIVES
3.1 INTRODUCTION
Today you will learn about joins. This information will enable you to gather and
manipulate data across several tables. By the end of the day, you will understand and
be able to do the following :
One of the most powerful features of SQL is its capability to gather and manipulate
data from across several tables. Without this feature you would have to store all the
data elements necessary for each application in one table. Without common tables you
would need to store the same data in several tables. Imagine having to redesign,
rebuild, and repopulate your tables and databases every time your user needed a
query with a new piece of information. The JOIN statement of SQL enables you to
design smaller, more specific tables that are easier to maintain than larger tables.
ROW REMARKS
======= =======
row 1 Table 1
row 2 Table 1
row 3 Table 1
row 4 Table 1
row 5 Table 1
row 6 Table 1
INPUT :
SELECT *
FROM TABLE2
OUTPUT :
ROW REMARKS
========= ========
row 1 table 2
row 2 table 2
row 3 table 2
row 4 table 2
row 5 table 2
row 6 table 2
INPUT :
SELECT *
FROM TABLE1, TABLE2
OUTPUT :
Oracle / 52
ROW REMARKS ROW REMARKS
========= ========== ======== ==========
row 1 Table 1 row 1 table 2
row 1 Table 1 row 2 table 2
row 1 Table 1 row 3 table 2
row 1 Table 1 row 4 table 2
row 1 Table 1 row 5 table 2
row 1 Table 1 row 6 table 2
row 2 Table 1 row 1 table 2
row 2 Table 1 row 2 table 2
row 2 Table 1 row 3 table 2
row 2 Table 1 row 4 table 2
row 2 Table 1 row 5 table 2
row 2 Table 1 row 6 table 2
row 3 Table 1 row 1 table 2
row 3 Table 1 row 2 table 2
row 3 Table 1 row 3 table 2
row 3 Table 1 row 4 table 2
row 3 Table 1 row 5 table 2
row 3 Table 1 row 6 table 2
row 4 Table 1 row 1 table 2
row 4 Table 1 row 2 table 2
row 4 Table 1 row 3 table 2
row 4 Table 1 row 4 table 2
row 4 Table 1 row 5 table 2
row 4 Table 1 row 6 table 2
row 5 Table 1 row 1 table 2
row 5 Table 1 row 2 table 2
row 5 Table 1 row 3 table 2
row 5 Table 1 row 4 table 2
row 5 Table 1 row 5 table 2
row 5 Table 1 row 6 table 2
row 6 Table 1 row 1 table 2
row 6 Table 1 row 2 table 2
row 6 Table 1 row 3 table 2
row 6 Table 1 row 4 table 2
row 6 Table 1 row 5 table 2
row 6 Table 1 row 6 table 2
Thirty-six rows! Where did they come from ? And what kind of join is this ?
A close examination of the result of the first join shows that each row from TABLE1
was added to each row from TABLE2. An extract from this join shows what happened :
OUTPUT :
ROW REMARKS ROW REMARKS
===== ========== ======= ========
row 1 Table 1 row 1 table 2
row 1 Table 1 row 2 table 2
row 1 Table 1 row 3 table 2
row 1 Table 1 row 4 table 2
row 1 Table 1 row 5 table 2
row 1 Table 1 row 6 table 2
INPUT :
SELECT *
FROM CUSTOMER
OUTPUT :
INPUT :
SELECT O.ORDEREDON, O.NAME, O.PARTNUM,
P.PARTNUM, P.DESCRIPTION
Oracle / 54
FROM ORDERS O, PART P
WHERE O.PARTNUM = P.PARTNUM
OUTPUT :
Using the column PARTNUM that exists in both of the preceding tables, you have
just combined the information you had stored in the ORDERS table with information
from the PART table to show a description of the parts the bike shops have ordered
from you. The join that was used is called an equi-join because the goal is to match
the values of a column in one table to the corresponding values in the second table.
You can further qualify this query by adding more conditions in the WHERE
clause. For example:
INPUT/OUTPUT :
SELECT O.ORDEREDON, O.NAME, O.PARTNUM,
P.PARTNUM, P.DESCRIPTION
FROM ORDERS O, PART P
WHERE O.PARTNUM = P.PARTNUM
AND O.PARTNUM = 76
The number 76 is not very descriptive, and you would not want your sales people
to have to memorize a part number. (We have had the misfortune to see many data
information systems in the field that require the end user to know some obscure code
for something that had a perfectly good name. Please don't write one of those!) Here's
another way to write the query :
INPUT/OUTPUT :
SELECT O.ORDEREDON, O.NAME, O.PARTNUM,
P.PARTNUM, P.DESCRIPTION
FROM ORDERS O, PART P
EMPLOYEE_TABLE EMPLOYEE_PAY_TABLE
employee_id employee_id
last_name salary
first_name department
middle_name supervisor
marital_status
INPUT :
SELECT E.EMPLOYEE_ID, E.LAST_NAME, EP.SALARY
FROM EMPLOYEE_TBL E,
EMPLOYEE_PAY_TBL EP
WHERE E.EMPLOYEE_ID = EP.EMPLOYEE_ID
AND E.LAST_NAME = 'SMITH';
OUTPUT :
Back to the original tables. Now you are ready to use all this information about
joins to do something really useful: finding out how much money you have made from
selling road bikes :
INPUT/OUTPUT :
SELECT SUM(O.QUANTITY * P.PRICE) TOTAL
FROM ORDERS O, PART P
WHERE O.PARTNUM = P.PARTNUM
AND P.DESCRIPTION = 'ROAD BIKE'
TOTAL
===========
19610.00
With this setup, the sales people can keep the ORDERS table updated, the
production department can keep the PART table current, and you can find your bottom
line without redesigning your database.
Oracle / 56
Can you join more than one table? For example, to generate information to send
out an invoice, you could type this statement:
INPUT/OUTPUT :
SELECT C.NAME, C.ADDRESS, (O.QUANTITY * P.PRICE) TOTAL
FROM ORDER O, PART P, CUSTOMER C
WHERE O.PARTNUM = P.PARTNUM
AND O.NAME = C.NAME
You could make the output more readable by writing the statement like this :
INPUT/OUTPUT :
SELECT C.NAME, C.ADDRESS,
O.QUANTITY * P.PRICE TOTAL
FROM ORDERS O, PART P, CUSTOMER C
WHERE O.PARTNUM = P.PARTNUM
AND O.NAME = C.NAME
ORDER BY C.NAME
INPUT/OUTPUT :
SELECT C.NAME, C.ADDRESS,
O.QUANTITY * P.PRICE TOTAL,
P.DESCRIPTION
FROM ORDERS O, PART P, CUSTOMER C
WHERE O.PARTNUM = P.PARTNUM
AND O.NAME = C.NAME
ORDER BY C.NAME
This information is a result of joining three tables. You can now use this
information to create an invoice.
3.2.2 Non-Equi-Joins
Because SQL supports an equi-join, you might assume that SQL also has a non-
equi-join. You would be right! Whereas the equi-join uses an = sign in the WHERE
statement, the non-equi-join uses everything but an = sign. For example :
INPUT :
SELECT O.NAME, O.PARTNUM, P.PARTNUM,
O.QUANTITY * P.PRICE TOTAL
FROM ORDERS O, PART P
WHERE O.PARTNUM > P.PARTNUM
OUTPUT :
Oracle / 58
NAME PARTNUM PARTNUM TOTAL
========== =========== ========= =========
TRUE WHEEL 76 54 162.75
BIKE SPEC 76 54 596.75
LE SHOPPE 76 54 271.25
AAA BIKE 76 54 217.00
JACKS BIKE 76 54 759.50
TRUE WHEEL 76 42 73.50
BIKE SPEC 54 42 245.00
BIKE SPEC 76 42 269.50
LE SHOPPE 76 42 122.50
AAA BIKE 76 42 98.00
AAA BIKE 46 42 343.00
JACKS BIKE 76 42 343.00
TRUE WHEEL 76 46 45.75
BIKE SPEC 54 46 152.50
BIKE SPEC 76 46 167.75
LE SHOPPE 76 46 76.25
AAA BIKE 76 46 61.00
JACKS BIKE 76 46 213.50
TRUE WHEEL 76 23 1051.35
TRUE WHEEL 42 23 2803.60
...
This listing goes on to describe all the rows in the join WHERE O.PARTNUM >
P.PARTNUM. In the context of your bicycle shop, this information does not have much
meaning, and in the real world the equi-join is far more common than the non-equi-
join. However, you may encounter an application in which a non-equi-join produces the
perfect result.
3.2.3 Outer Joins versus Inner Joins
Just as the non-equi-join balances the equi-join, an outer join complements the
inner join. An inner join is where the rows of the tables are combined with each other,
producing a number of new rows equal to the product of the number of rows in each
table. Also, the inner join uses these rows to determine the result of the WHERE
clause. An outer join groups the two tables in a slightly different way. Using the PART
and ORDERS tables from the previous examples, perform the following inner join:
INPUT :
SELECT P.PARTNUM, P.DESCRIPTION, P.PRICE,
O.NAME, O.PARTNUM
FROM PART P
JOIN ORDERS O ON ORDERS.PARTNUM = 54
OUTPUT :
The result is that all the rows in PART are spliced on to specific rows in ORDERS
where the column PARTNUM is 54. Here's a RIGHT OUTER JOIN statement :
INPUT/OUTPUT :
SELECT P.PARTNUM, P.DESCRIPTION, P.PRICE,
This type of query is new. First you specified a RIGHT OUTER JOIN, which
caused SQL to return a full set of the right table, ORDERS, and to place nulls in the
fields where ORDERS.PARTNUM <> 54. Following is a LEFT OUTER JOIN statement
:
INPUT/OUTPUT :
SELECT P.PARTNUM, P.DESCRIPTION,P.PRICE,
O.NAME, O.PARTNUM
FROM PART P
LEFT OUTER JOIN ORDERS O ON ORDERS.PARTNUM = 54
You get the same six rows as the INNER JOIN. Because you specified LEFT (the
LEFT table), PART determined the number of rows you would return. Because PART
is smaller than ORDERS, SQL saw no need to pad those other fields with blanks.
Don't worry too much about inner and outer joins. Most SQL products determine
the optimum JOIN for your query. In fact, if you are placing your query into a stored
procedure (or using it inside a program (both stored procedures and Embedded SQL
covered on Day 13, "Advanced SQL Topics"), you should not specify a join type even
if your SQL implementation provides the proper syntax. If you do specify a join type,
the optimizer chooses your way instead of the optimum way.
Oracle / 60