Module 3
Module 3
Internet Applications:
The three-Tier application architecture, The presentation layer, The Middle Tier
Additional features allow users to specify more complex retrievals from database
uses a three-valued logic with values TRUE, FALSE, and UNKNOWN instead of
the standard two-valued (Boolean) logic with values TRUE or FALSE. It is therefore
necessary to define the results (or truth values) of three- valued logical expressions
when the logical connectives AND, OR, and NOT are used
The rows and columns represent the values of the results of comparison conditions,
In select-project-join queries, the general rule is that only those combinations of tuples
that evaluate the logical expression in the WHERE clause of the query to TRUE are
selected. Tuple combinations that evaluate to FALSE or UNKNOWN are not
selected.
SQL allows queries that check whether an attribute value is NULL using the comparison
operators
IS or IS NOT.
Example: Retrieve the names of all employees who do not have supervisors.
SELECT Fname, Lname
FROM EMPLOYEE
WHERE Super_ssn IS NULL;
The first nested query selects the project numbers of projects that have an employee
with last name 'Smith' involved as manager. The second nested query selects the
project numbers of projects that have an employee with last name 'Smith' involved
as worker. In the outer query, we use the OR logical connective to retrieve a
PROJECT tuple if the PNUMBER value of that tuple is in the result of either nested
query.
SOL allows the use of tuples of values in comparisons by placing them within
parentheses. For example, the following query will select the Essns of all employees
who work the same (project, hours) combination on some project that employee
'John Smith' (whose Ssn = '123456789') works on
Example: Retrieve the name of each employee who has a dependent with the
same first name and is the same sex as the employee
SELECT E.Fname, E.Lname
FROM EMPLOYEE AS E
WHERE E.Ssn IN ( SELECT Essn
FROM DEPENDENT AS D
WHERE E.Fname=D.Dependent_name
AND E.Sex=D.Sex );
In the above nested query, we must qualify E.Sex because it refers to the Sex
attribute of EMPLOYEE from the outer query, and DEPENDENT also has an
attribute called Sex.
1.1.3 Correlated Nested Queries
Whenever a condition in the WHERE clause of a nested query references
some attribute of a relation declared in the outer query, the two queries are said to
be correlated.
Example: SELECT E.Fname, E.Lname
FROM EMPLOYEE AS E
WHERE E.Ssn IN ( SELECT Essn
FROM DEPENDENT AS D
WHERE E.Fname=D.Dependent_name
AND E.Sex=D.Sex );
The nested query is evaluated once for each tuple (or combination of tuples) in the
outer query. we can think of query in above example as follows: For each
EMPLOYEE tuple, evaluate the nested query, which retrieves the Essn values for
all DEPENDENT tuples with the same sex and name as that EMPLOYEE tuple; if
the Ssn value of the EMPLOYEE tuple is in the result of the nested query, then select
that EMPLOYEE tuple.
1.1.4 The EXISTS and UNIQUE Functions in SQL
EXISTS Functions
The EXISTS function in SOL is used to check whether the result of a correlated nested
query is
empty (contains no tuples) or not. The result of EXISTS is a Boolean value
• TRUE if the nested query result contains at least one tuple, or
In general, EXISTS(Q) returns TRUE if there is at least one tuple in the result of the
nested query Q, and it returns FALSE otherwise.
NOT EXISTS Functions
NOT EXISTS(Q) returns TRUE if there are no tuples in the result of nested query Q, and
it returns
FALSE otherwise.
Example: Retrieve the names of employees who have no dependents.
SELECT Fname, Lname
FROM EMPLOYEE
WHERE NOT EXISTS ( SELECT *
FROM DEPENDENT
WHERE Ssn=Essn );
Dept. of ISE, AJIET, MANGALORE Page 6
Database Management System [18CS53]
For each EMPLOYEE tuple, the correlated nested query selects all DEPENDENT
tuples whose Essn value matches the EMPLOYEE Ssn; if the result is empty, no
dependents are related to the employee, so we select that EMPLOYEE tuple and
retrieve its Fname and Lname.
Example: Retrieve the name of each employee who works on all the
projects controlled by department number 5
SELECT Fname, Lname
FROM EMPLOYEE
WHERE NOT EXISTS ( ( SELECT Pnumber
FROM PROJECT
WHERE Dnum=5)
EXCEPT ( SELECT
Pno FROM
WORKS_ON
WHERE Ssn=Essn) );
UNIQUE Functions
UNIOUE(O) returns TRUE if there are no duplicate tuples in the result of query
O; otherwise, it returns FALSE. This can be used to test whether the result of a
nested query is a set or a multiset.
Example: Retrieve the last name of each employee and his or her supervisor
SELECT E.Lname AS
Employee_name, S.Lname AS
Supervisor_name
FROM EMPLOYEE
AS E, EMPLOYEE
AS S
WHERE E.Super_ssn=S.Ssn;
An inner join is the most common join operation used in applications and can be
regarded as the default join-type. Inner join creates a new result table by combining
column values of two tables (A and B) based upon the join- predicate (the condition).
The result of the join can be defined as the outcome of first taking the Cartesian
product (or Cross join) of all records in the tables (combining every record in table
A with every record in table B)-then return all records which satisfy the join predicate
Example: SELECT* FROM employee
employee.dno = department.dnumber;
NATURAL JOIN is a type of EOUIJOIN where the join predicate arises implicitly by
comparing all columns in both tables that have the same column-names in the
joined tables. The resulting joined table contains only one column for each pair of
equally named columns.
If the names of the join attributes are not the same in the base relations, it is possible
to rename the attributes so that they match, and then to apply NATURAL JOIN. In
this case, the AS construct can be used to rename a relation and all its attributes in
the FROM clause.
CROSS JOIN returns the Cartesian product of rows from tables in the join. In other
words, it will produce rows which combine each row from the first table with each
row from the second table.
OUTER JOIN
An outer join does not require each record in the two joined tables to have a
matching record. The joined table retains each record-even if no other matching
record exists. Outer joins subdivide further into
• Left outer joins
• Right outer joins
• Full outer joins
No implicit join-notation for outer joins exists in standard SQL.
► Not all SQL implementations have implemented the new syntax of joined
tables.
► In some systems, a different syntax was used to specify outer joins by using
the comparison operators += =+, and +=+ for left, right and full outer join
respectively
► For example, this syntax is available in Oracle. To specify theleft outer
join in Q8B using this syntax, we could write the query QSC as follows:
MULTIWAY JOIN
It is also possible to nest join specifications; that is, one of the tables in a join may
itself be a joined table. This allows the specification of the join of three or more tables
as a single joined table, which is called a multiway join.
Example: For every project located in 'Stafford', list the project number, the
controlling department number, and the department manager's last name,address,
and birth date.
SELECT Pnumber, Dnum, Lname, Address, Bdate
FROM ((PROJECT JOIN DEPARTMENT ON Dnum=Dnumber)
JOIN EMPLOYEE ON Mgr_ssn=Ssn)
WHERE Plocation='Stafford';
Examples
1. Find the sum of the salaries of all employees, the maximum salary, the minimum
salary, and the average salary.
SELECT SUM (Salary), MAX (Salary), MIN (Salary), AVG (Salary)
FROM EMPLOYEE;
2. Find the sum of the salaries of all employees of the 'Research ' department, as well
as the maximum salary, the minimum salary, and the average salary in this
department.
Dept. of ISE, AJIET, MANGALORE Page 12
Database Management System [18CS53]
4. To retrieve the names of all employees who have two or more dependents
SELECT Lname, Fname
FROM EMPLOYEE
WHERE ( SELECT COUNT (*)
FROM DEPENDENT
WHERE Ssn=Essn ) >= 2;
Example: For each project, retrieve the project number, the project name, and
the number of employees who work on that project.
SELECT Pnumber, Pname, COUNT (*)
FROM PROJECT , WORKS_ON
WHERE Pnumber=Pno
GROUP BY Pnumber, Pname;
Above query shows how we can use a join condition in conjunction with GROUP
BY. In this case, the grouping and functions are applied after the joining of the
two relations.
Example: For each project on which more than two employees work, retrieve
the project number, the project name, and the number of employees who work
on the project.
SELECT Pnumber, Pname, COUNT (*)
FROM PROJECT , WORKS_ON
WHERE Pnumber=Pno
GROUP BY Pnumber,
Pname HAVING
COUNT(*)> 2;
Example: For each project, retrieve the project number, the project name, and
the number of employees from department 5 who work on the project.
SELECT Pnumber, Pname, COUNT (*)
FROM PROJECT , WORKS_ON, EMPLOYEE
WHERE Pnumber=Pno AND Ssn=Essn AND Dno=5
GROUP BY Pnumber, Pname;
Example: For each department that has more than five employees, retrieve the
department number and the number of its employees who are making more than
$40,000.
SELECT Dnumber, COUNT (*)
FROM DEPARTMENT , EMPLOYEE
WHERE Dnumber=Dno AND Salary>40000 AND
( SELECT Dno
FROM
EMPLOYEE
GROUP BY
Dno
HAVING COUNT(*)> 5);
The SELECT clause lists the attributes or functions to be retrieved. The FROM
clause specifies all relations (tables) needed in the query, including joined relations,
but not those in nested queries. The WHERE clause specifies the conditions for
selecting the tuples from these relations, including join conditions if needed.
GROUP BY specifies grouping attributes, whereas HAVING specifies a condition
on the groups being selected rather than on the individual tuples. Finally, ORDER
BY specifies an order for displaying the result of a query.
A query is evaluated conceptually by first applying the FROM clause to identify all
tables involved in the query or to materialize any joined tables followed by the
WHERE clause to select and join tuples, and then by GROUP BY and HAVING.
ORDER BY is applied at the end to sort the query result Each DBMS has special
query optimization routines to decide on an execution plan that is efficient to execute
In general, there are numerous ways to specify the same query in SOL.This
flexibility in specifying queries has advantages and disadvantages.
■ The main advantage is that users can choose the technique with which they
are most comfortable when specifying a query. For example, many queries
may be specified with join conditions in the WHERE clause, or by using joined
relations in the FROM clause, or with some form of nested queries and the
IN comparison. From the programmer's and the system's point of view
regarding query optimization, it is generally preferable to write a query with as
little nesting and implied ordering as possible.
■ The disadvantage of having numerous ways of specifying the same query is
that this may confuse the user, who may not know which technique to use to
specify particular types of queries. Another problem is that it may be more
efficient to execute a query specified in one way than the same query
specified in an alternative way
General form :
CREATE ASSERTION <Name_of_assertion> CHECK (<cond>)
For the assertion to be satisfied, the condition specified after CHECK clause must return
true.
For example, to specify the constraint that the salary of an employee must not be
greater than the salary of the manager of the department that the employee works
for in SOL, we can write the following assertion:
CREATE ASSERTION SALARY_CONSTRAINT
CHECK ( NOT EXISTS ( SELECT * FROM EMPLOYEE E,
EMPLOYEE M, DEPARTMENT D WHERE E.Salary>M.Salary
AND
E.Dno=D.Dnumber AND D.Mgr_ssn=M.Ssn ) );
later to refer to the constraint or to modify or drop it. Any WHERE clause condition
can be used, but many constraints can be specified using the EXISTS and NOT
EXISTS style of SOL conditions.
By including this query inside a NOT EXISTS clause, the assertion will specify that
the result of this query must be empty so that the condition will always be TRUE. Thus,
the assertion is violated if the result of the query is not empty
Example: consider the bank database with the following tables
1. Write an assertion to specify the constraint that the Sum of loans taken by a
customer does not exceed 100,000
CREATE ASSERTION sumofloans
CHECK (100000> = ALL
SELECT customer_name,sum(amount)
FROM borrower b, loan I
WHERE b.loan_number=l.loan_number
GROUP BY customer_name );
2. Write an assertion to specify the constraint that the Number of accounts for
each customer in a given branch is at most two
Does the trigger execute for each updated or deleted record, or once for the entire
statement?. We define such granularity as follows:
This trigger is activated once (per UPDATE This trigger is activated before deleting
statement) after all records are each record
updated
Examples:
1) If the employee salary increased by more than 10%, then increment the rank field by 1.
2) Keep the bonus attribute in Employee table always 3% of the salary attribute
A view in SOL terminology is a single table that is derived from other tables. other
tables can be base tables or previously defined views. A view does not necessarily
exist in physical form; it is considered to be a virtual table, in contrast to base tables,
whose tuples are always physically stored in the database. This limits the possible
update operations that can be applied to views, but it does not provide any limitations
on querying a view. We can think of a view as a way of specifying a table that we
need to reference frequently, even though it may not exist physically.
For example, referring to the COMPANY database, we may frequently issue queries
that retrieve the employee name and the project names that the employee works
on. Rather than having to specify the join of the three tables
EMPLOYEE,WORKS_ON, and PROJECT every time we issue this query, we can
define a view that is specified as the result of these joins. Then we can issue queries
on the view, which are specified as single table retrievals rather than as retrievals
Dept. of ISE, AJIET, MANGALORE Page 25
Database Management System [18CS53]
In SOL, the command to specify a view is CREATE VIEW. The view is given a
(virtual) table name (or view name), a list of attribute names, and a query to specify
the contents of the view. If none of the view attributes results from applying functions
or arithmetic operations, we do not have to specify new attribute names for the view,
since they would be the same as the names of the attributes of the defining tables
in the default case.
Example 1:
In example 1, we did not specify any new attribute names for the view
WORKS_ON1. In this case,WORKS_ON1inherits the names of the view attributes
from the defining tables EMPLOYEE, PROJECT, and WORKS_ON.
Example 2 explicitly specifies new attribute names for the view DEPT_INFO, using
a one-to-one correspondence between the attributes specified in the CREATE
VIEW clause and those specified in the SELECT clause of the query that defines
the view.
We can now specify SOL queries on a view-or virtual table-in the same way we
specify queries involving base tables.
For example, to retrieve the last name and first name of all employees who work on
the 'ProductX' project, we can utilize the WORKS_ON1 view and specify the query
as :
The same query would require the specification of two joins if specified on the base
relations directly. one of the main advantages of a view is to simplify the
specification of certain queries. Views are also used as a security and authorization
mechanism.
The disadvantage of this approach is that it is inefficient for views defined via
complex queries that are time-consuming to execute, especially if multiple queries
are going to be applied to the same view within a short period of time.
• The second strategy, called view materialization, involves physically creating a
temporary view table when the view is first queried and keeping that table on the
assumption that other queries on the view will follow. In this case, an efficient
strategy for automatically updating the view table when the base tables are
updated must be developed in order to keep the view up-to-date.
Techniques using the concept of incremental update have been developed for
this purpose, where the DBMS can determine what new tuples must be inserted,
deleted, or modified in a materialized view table when a database update is
applied to one of the defining base tables.
The view is generally kept as a materialized (physically stored) table as long as it is
being queried. If the view is not queried for a certain period of time, the system may
then automatically remove the physical table and recompute it from scratch when
future queries reference the view.
Updating of views is complicated and can be ambiguous. In general, an update on
a view defined on a single table without any aggregate functions can be mapped to
an update on the underlying base table under certain conditions. For a view involving
joins, an update operation may be mapped to update operations on the underlying
base relations in multiple ways. Hence, it is often not possible for the DBMS to
determine which of the updates is intended.
Dept. of ISE, AJIET, MANGALORE Page 28
Database Management System [18CS53]
Update (a) relates 'John Smith' to the 'ProductY' PROJECT tuple instead of the
'ProductX' PROJECT tuple and is the most likely desired update. However, (b)
would also give the desired update effect on the view, but it accomplishes this by
changing the name of the 'ProductX' tuple in the PROJECT relation to 'ProductY'.
It is quite unlikely that the user who specified the view update UV1 wants the update
to be interpreted as in (b), since it also has the side effect of changing all the view
tuples with Pname = 'ProductX'.
Some view updates may not make much sense; for example, modifying the Total_sal
attribute of the DEPT_INFO view does not make sense because Total_sal is defined to
be the sum of the individual employee salaries. This request is shown as UV2:
UV2: UPDATE DEPT_INFO
SET Total_sal=100000
WHERE Dname='Research' ;
A large number of updates on the underlying base relations can satisfy this view update.
Generally, a view update is feasible when only one possible update on the base
relations can accomplish the desired update effect on the view. Whenever an update
on the view can be mapped to more than one update on the underlying base
relations, we must have a certain procedure for choosing one of the possible
updates as the most likely one.
In SQL, the clause WITH CHECK OPTION must be added at the end of the view
definition if a view is to be updated. This allows the system to check for view
updatability and to plan an execution strategy for view updates. It is also possible
to define a view table in the FROM clause of an SQL query. This is known as an in-
line view. In this case, the view is defined within the query itself.
If a base relation within a schema is no longer needed, the relation and its definition
can be deleted by using the DROP TABLE command. For example, if we no longer
wish to keep track of dependents of employees in the COMPANY database, , we
can get rid of the DEPENDENT relation by issuing the following command:
DROP TABLE DEPENDENT CASCADE;
If the RESTRICT option is chosen instead of CASCADE, a table is dropped only if
it is not referenced in any constraints (for example, by foreign key definitions in
another relation) or views or by any other elements. With the CASCADE option, all
Dept. of ISE, AJIET, MANGALORE Page 31
Database Management System [18CS53]
such constraints, views, and other elements that reference the table being dropped
are also dropped automatically from the schema, along with the table itself.
The DROP TABLE command not only deletes all the records in the table if
successfu,l but also removes the table definition from the catalog. If it is desired to
delete only the records but to leave the table definition for future use, then the
DELETE command should be used instead of DROP TABLE.
The DROP command can also be used to drop other types of named schema
elements, such as constraints or domains.
The definition of a base table or of other named schema elements can be changed
by using the ALTER command. For base tables, the possible alter table actions
include adding or dropping a column (attribute), changing a column definition, and
adding or dropping table constraints.
For example, to add an attribute for keeping track of jobs of employees to the
EMPLOYEE base relation in the COMPANY schema, we can use the command:
ALTER TABLE COMPANY.EMPLOYEE ADD COLUMN Job VARCHAR(12);
We must still enter a value for the new attribute Job for each individual EMPLOYEE
tuple. This can be done either by specifying a default clause or by using the
UPDATE command individually on each tuple. If no default clause is specified, the
new attribute will have NULLs in all the tuples of the relation immediately after the
command is executed; hence, the NOT NULL constraint is not allowed in this case.
To drop a column, we must choose either CASCADE or RESTRICT for drop behavior.
If CASCADE
is chosen, all constraints and views that reference the column are dropped
automatically from the schema, along with the column. If RESTRICT is chosen, the
command is successful only if no views or constraints (or other schema elements)
reference the column.
For example, the following command removes the attribute Address from the
EMPLOYEE base table:
ALTER TABLE COMPANY.EMPLOYEEDROP COLUMN Address
CASCADE;
'333445555' ;
For example we can change the data type of the column named "DateOfBirth"
from date to year in the "Persons" table using the following SQL statement:
ALTER TABLE Persons
ALTER COLUMN DateOfBirth year;
Notice that the "DateOfBirth" column is now of type year and is going to hold a year in
a two- or four-digit format.
2.1 Introduction
We often encounter a situation in which we need the greater flexibility of a general-
purpose programming language in addition to the data manipulation facilities
provided by SOL.For example, we may want to integrate a database applications
with GUI or we may want to integrate with other existing applications.
The use of SQL commands within a host language is called Embedded SQL.
Conceptually, embedding SQL commands in a host language program is straight
forward. SQL statements can be used wherever a statement in the host language is
allowed. SQL statements must be clearly marked so that a preprocessor can deal
with them before invoking the compiler for the host language. Any host language
variable used to pass arguments into an SQL command must be declared in SQL.
There are two complications:
1. Data types recognized by SQL may not be recognized by the host language and vice
versa
- This mismatch is addressed by casting data values appropriately before
passing them to or from SQL commands.
2. SQL is set-oriented
- Addressed using cursors
SQL statements can refer to variables defined in the host program. Such host
language variables must be prefixed by a colon(:) in SQL statements and be
EXEC SQL BEGIN DECLARE SECTION and EXEC SQL END DECLARE SECTION
The first question that arises is which SQL types correspond to the various C types,
since we have just declared a collection of C variables whose values are intended
to be read (and possibly set) in an SQL run-time environment when an SQL statement
that refers to them is executed. The SQL-92 standard defines such a correspondence
between the host language types and SQL types for a number of host languages. In
our example, c_sname has the type CHARACTER(20) when referred to in an SQL
statement, c_sid has the type INTEGER, crating has the type SMALLINT, and
c_age has the type REAL.
We also need some way for SQL to report what went wrong if an error condition
arises when executing an SQL statement. The SQL-92 standard recognizes two
special variables for reporting errors, SQLCODE and SQLSTATE.
■ SQLCODE is the older of the two and is defined to return some negative
value when an error condition arises, without specifying further just what
error a particular negative integer denotes.
■ SQLSTATE, introduced in the SQL-92 standard for the first time, associates
predefined
values with several common error conditions, thereby introducing some
uniformity to how errors are reported.
One of these two variables must be declared. The appropriate C type for SQLCODE is
long and the appropriate C type for SQLSTATE is char [6] , that is, a character string
five characters long.
Dept. of ISE, AJIET, MANGALORE Page 36
Database Management System [18CS53]
The SQLSTATE variable should be checked for errors and exceptions after each
Embedded SOL statement.SOL provides the WHENEVER command to simplify
this task:
EXEC SQL WHENEVER [SQLERROR I NOT FOUND ] [CONTINUEIGOTO stmt]
If SQLERROR is specified and the value of SOLSTATE indicates an exception,
control is transferred to stmt, which is presumably responsible for error and
exception handling. Control is also transferred to stmt if NOT FOUND is specified
and the value of SOLSTATE is 02000, which denotes NO DATA.
2.2.2 Cursors
A major problem in embedding SOL statements in a host language like C is that an
impedance mismatch occurs because SOL operates on sets of records, whereas
languages like C do not cleanly support a set-of-records abstraction. The solution is
to essentially provide a mechanism that allows us to retrieve rows one at a time from
a relation- this mechanism is called a cursor
We can declare a cursor on any relation or on any SOL query. Once a cursor is declared, we
can
■ open it (positions the cursor just before the first row)
■ Fetch the next row
■ Move the cursor (to the next row,to the row after the next n, to the first row
or previous row etc by specifying additional parameters for the fetch
command)
■ Close the cursor
Dept. of ISE, AJIET, MANGALORE Page 37
Database Management System [18CS53]
The INTO clause allows us assign the columns of the single answer row to the host
variable c_sname and c_age. Therefore, we do not need a cursor to embed this
query in a host language program.
ii) Compute the name and ages of all sailors with a rating greater than the current
value of the host variable c_minrating
SELECT s.sname,s.age
FROM sailors s WHERE s.rating>:c_minrating;
The query returns a collection of rows. The INTO clause is inadequate. The solution
is to use a cursor:
DECLARE sinfo CURSOR FOR
SELECT s.sname,s.age
FROM sailors s
WHERE s.rating>:c_minrating;
This code can be included in a C program and once it is executed, the cursor
sinfo is defined. We can open the cursor by using the syntax:
OPEN sinfo;
Dept. of ISE, AJIET, MANGALORE Page 38
Database Management System [18CS53]
Properties of Cursors
The general form of a cursor declaration is:
DECLARE cursomame [INSENSITIVE] [SCROLL]
CURSOR [WITH HOLD]
FOR some query
[ORDER BY order-item-list]
[FOR READ ONLY I FOR UPDATE]
A cursor can be declared to be a read-only cursor (FOR READ ONLY) or updatable
cursor (FOR UPDATE).lf it is updatable, simple variants of the UPDATE and
DELETE commands allow us to update or delete the row on which the cursor is
positioned. For example, if sinfo is an updatable cursor and open, we can execute
the following statement:
UPDATE Sailors S
SET S.rating = S.rating -1
WHERE CURRENT of sinfo;
A cursor is updatable by default unless it is a scrollable or insensitive cursor in which
case it is read- only by default.
If the keyword SCROLL is specified, the cursor is scrollable, which means that
variants of the FETCH command can be used to position the cursor in very flexible
ways; otherwise, only the basic FETCH command, which retrieves the next row, is
allowed
The answer is sorted first in ascending order by minage, and if several rows have
the same minage value, these rows are sorted further in descending order by
Rating minage
rating
8 25.5
3 25.5
7 35.0
Dynamic SQL
Dynamic SOL Allow construction of SOL statements on-the-fly. Consider an
application such as a spreadsheet or a graphical front-end that needs to access
data from a DBMS. Such an application must accept commands from a user and,
based on what the user needs, generate appropriate SOL
statements to retrieve the necessary data. In such situations, we may not be able
to predict in advance just what SOL statements need to be executed. SOL provides
some facilities to deal with such situations; these are referred to as Dynamic SQL.
Example:
A driver is a software program that translates the ODBC or JDBC calls into DBMS-
specific calls. Drivers are loaded dynamically on demand since the DBMSs the
application is going to access are known only at run-time. Available drivers are
registered with a driver manager a driver does not necessarily need to interact
with a DBMS that understands SOL. It is sufficient that the driver translates the
SOL commands from the application into equivalent commands that the DBMS
understands.
An application that interacts with a data source through ODBC or JDBC selects
a data source, dynamically loads the corresponding driver, and establishes a
connection with the data source. There is no limit on the number of open
connections. An application can have several open connections to different data
sources. Each connection has transaction semantics; that is, changes from one
connection are visible to other connections only after the connection has
committed its changes. While a connection is open, transactions are executed
by submitting SOL statements, retrieving results, processing errors, and finally
committing or rolling back. The application disconnects from the data source to
terminate the interaction.
2.3.1 Architecture
The architecture of JDBC has four main components:
■ Application
■ Driver manager
■ Drivers
Dept. of ISE, AJIET, MANGALORE Page 42
Database Management System [18CS53]
■ Data sources
Application
Driver manager
■ Load JDBC drivers and pass JDBC function calls from the application to the correct
driver
■ Handles JDBC initialization and information calls from the applications
and can log all function calls
■ Performs some rudimentary error checking
Drivers
Data sources
Drivers in JDBC are classified into four types depending on the architectural
relationship between the application and the data source:
Type I Bridges:
■ This type of driver translates JDBC function calls into function calls of another
API that is not native to the DBMS.
■ An example is a JDBC-ODBC bridge; an application can use JDBC calls
to access an ODBC compliant data source. The application loads only one
driver, the bridge.
■ Advantage:
• it is easy to piggyback the application onto an existing installation,
and no new drivers have to be installed.
■ Drawbacks:
Dept. of ISE, AJIET, MANGALORE Page 43
Database Management System [18CS53]
Class.forName("oracle/jdbc.driver.OracleDriver");
There are two other ways ofregistering a driver. We can include the driver with -
Djdbc. drivers=oracle/jdbc. driver at the command line when we start the Java
application. Alternatively, we can explicitly instantiate a driver, but this method is
used only rarely, as the name of the driver has to be specified in the application code,
and thus the application becomes sensitive to changes at the driver level.
After registering the driver, we connect to the data source.
2.4.2 Connections
2.4.3
A session with a data source is started through creation of a Connection object;
Connections are specified through a JDBC URL, a URL that uses the jdbc protocol.
Such a URL has the form
jdbc:<subprotocol>:<otherParameters>
String uri = ..
jdbc:oracle:www.bookstore.com:3083..
Connection connection;
try
{
connection = DriverManager.getConnection(url,userld,password);
}
catch(SQLException excpt)
{
System.out.println(excpt.getMessageO);
return;
}
- TRANSACTION_REPEATABLE_READ
- TRANSACTION_SERIALIZABLE
■ public boolean getReadOnlyO throws SQLException and
public void setReadOnly(boolean readOnly) throws SQLException.
- These two functions allow the user to specify whether the transactions
executed through this connection are read only.
■ public boolean isClosed() throws SQLException.
- Checks whether the current connection has already been closed.
■ setAutoCommit and get AutoCommit.
In case an application establishes many different connections from different parties
(such as a Web server), connections are often pooled to avoid this overhead. A
connection pool is a set of established connections to a data source. Whenever a
new connection is needed, one of the connections from the pool is used, instead of
creating a new connection to the data source.
pstmt.setString(I, isbn);
pstmt.setString(2, title);
pstmt.setString(3, author);
pstmt.setFloat(5, price);
pstmt.setlnt(6, year);
int numRows = pstmt.executeUpdate();
The SOL query specifies the query string, but uses "?' for the values of the
parameters, which are set later using methods setString, setFloat,and setlnt. The
"?" placeholders can be used anywhere in SOL statements where they can be
replaced with a value. Examples of places where they can appear include the
WHERE clause (e.g., 'WHERE author=?'), or in SOL UPDATE and INSERT
statements. The method setString is one way to set a parameter value; analogous
methods are available for int, float, and date. It is good style to always use
clearParameters() before setting parameter values in order to remove any old data.
There are different ways of submitting the query string to the data source. In the
example, we used the executeUpdate command, which is used if we know that the
SOL statement does not return any records (SOL UPDATE, INSERT.ALTER, and
DELETE statements). The executeUpdate method returns
- an integer indicating the number of rows the SOL statement modified;
- 0 for successful execution without modifying any rows.
The executeOuery method is used if the SOL statement returns data, such as in a
regular SELECT query. JDBC has its own cursor mechanism in the form of a
ResultSet object.
2.4.5 ResultSets
ResultSet cursors in JDBC 2.0 are very powerful; they allow forward and reverse
scrolling and in- place editing and insertions. In its most basic form, the ResultSet
object allows us to read one row of the output of the query at a time. Initially, the
ResultSet is positioned before the first row, and we have to retrieve the first row
with an explicit call to the next() method. The next method returns false if there are
no more rows in the query answer, and true other\vise. The code fragment shown
below illustrates the basic usage of a ResultSet object:
ResultSet rs=stmt.executeQuerry(sqlQuery);
I I rs is now a cursor
I I first call to rs.nextO moves to the first record
I I rs.nextO moves to the next row String sqlQuery;
ResultSet rs = stmt.executeQuery(sqlQuery)
while (rs.next())
{
I I process the data
}
While next () allows us to retrieve the logically next row in the query answer, we can
move about in the query answer in other ways too:
■ previous() moves back one row.
■ absolute(int num) moves to the row with the specified number.
■ relative(int num) moves forward or backward (if num is negative) relative
to the current position. relative (-1) has the same effect as previous.
■ first() moves to the first row, and last() moves to the last row.
With these accessor methods, we can retrieve values from the current row of the
query result referenced by the ResultSet object. There are two forms for each
accessor method. One method retrieves values by column index, starting at one,
and the other retrieves values by column name.
The following example shows how to access fields of the current ResultSet row
using accesssor methods.
ResultSet rs=stmt.executeOuery(sqIOuery);
String sqlOuerYi
ResultSet rs = stmt.executeOuery(sqlOuery)
while (rs.nextO)
{
isbn = rs.getString(I);
title = rs.getString("TITLE");
I I process isbn and title
}
warning = warning.getNextWarningO;
while (columnsRS.next())
{
System.out.print(colummsRS.getString("COLUMN_NAME")
+" ");
}
I I print out the primary keys of this table
}
7 steps for jdbc :
1. Import the package
-- import java.sql.*;
2. Load and register the driver
--class.forname();
3. Establish the connection
-- Connection con;
4. Create a Statement object
-- Statement st;
5. Execute a query
-- st.execute();
6. Process the result
7. Close the connection
- CallableStatement.
• The Statement class is the base class for the other two statement classes. It
allows us to query the data source with any static or dynamically
generated SOL query.
• The PreparedStatement class dynamically generates precompiled SOL
statements that can be used several times
• CallableStatement are used to call stored procedures from JDBC.
CallableStatement is a subclass of PreparedStatement and provides the
same functionality.
• Example:
Statement st=con.createStatement();
Step 5: executing a query
usn='4W15CS001"';
ResultSet rs=st.executeQuery(query);
String sname=rs.getString(2);
System.out.println(sname);
connection
con.close();
String title;
Float price;
String author;
Books books;
#sql books= {
};
while (books.next()) {
books.close() ;
All SQLJ statements have the special prefix #sql. In SQLJ, we retrieve the results
of SQL queries with iterator objects, which are basically cursors. An iterator is an
instance of an iterator class.
Usage of an iterator in SQLJ goes through five steps:
1. Declare the Iterator Class: In the preceding code, this happened through
the statement #sql iterator Books (String title, Float price);
This statement creates a new Java class that we can use to instantiate objects.
2. Instantiate an Iterator Object from the New
while (true)
if (books.endFetch())
{ break: }
Benefits:
• reduces the amount of information transfer between client and database server
• Compilation step is required only once when the stored procedure is created.
Then after it does not require recompilation before executing unless it is
modified and reutilizes the same execution plan whereas the SOL statements
need to be compiled every time whenever it is sent for execution even if we
send the same SOL statement every time
Syntax:
ls/As
<declaration>
Begin
<SQL Statement>
Exception
End procedurename;
Student(usn:string,sname:string)
Let us now write a stored procedure to retrieve the count of students with
is stu_cnt int;
begin
Stored procedures can also have parameters. These parameters have to be valid
SQL types, and have one of three different modes: IN, OUT, or INOUT.
Example:
( IN book_isbn CHAR(IO),
IN addedOty INTEGER)
Procedures without parameters are called static procedures and with parameters are
called
dynamic procedures.
emp(Essn int) as
eName varchar(20);
begin
select fname into eName from employee where ssn=Essn and dno=5;
end emp;
statement:
Customerlnfo customerinfo;
ShowNumberOfOrders};
while (customerinfo.next()
System.out.println(customerinf.ocid() + "," +
customerinfo.count()) ;
2.6.3 SQUPSM
procedure code;
• Each parameter is a triple consisting of the mode (IN, OUT, or INOUT ), the parameter name,
and the SQL datatype of the parameter.
• The following SQL/PSM function returns the rating of the customer, which is defined as follows:
Customers who have bought more than ten books during the year are rated 'two'; customer who
have purchased between 5 and 10 books are rated 'one', otherwise the customer is rated 'zero'.
The following SQL/PSM code computes the rating for a given customer and year.
CREATE PROCEDURE RateCustomer (IN custId INTEGER, IN year INTEGER)
RETURNS INTEGER
DECLARE rating INTEGER;
DECLARE numOrders INTEGER;
SET numOrders = (SELECT COUNT(*) FROM Orders 0 WHERE O.tid = custId);
IF (numOrders> 10) THEN rating=2;
ELSEIF (numOrders>5) THEN rating=1;
ELSE rating=O;
END IF;
RETURN rating;
ELSEIF statements;
ELSE statements; END IF
Loops are of the form
LOOP
statements:
END LOOP
5. Queries can be used as part of expressions in branches, queries that return a single value can
be assigned to variables.
6. We can use the same cursor statements as in Embedded SQL (OPEN, FETCH, CLOSE), but we
do not need the EXEC SQL constructs, and variables do not have to be prefixed by a colon ':'
RETURNS
sqlDataType local
variable declarations
function code;
Example:
END IF;
RETURN rating;
• We can declare local variables using the DECLARE statement. In our example,
we declare two local variables: 'rating', and 'numOrders'.
• PSM/SQL functions return values via the RETURN statement. In our example,
we return the value of the local variable 'rating'.
• We can assign values to variables with the SET statement. In our example,
we assigned the return value of a query to the variable 'numOrders'.
ELSEIF
statements;
ELSEIF
statements;
ELSE
statements;
END IF
LOOP
statements:
END LOOP
Queries can be used as part of expressions in branches; queries that return a single
value can be assigned to variables.We can use the same cursor statements as in
Embedded SQL (OPEN, FETCH, CLOSE), but we do not need the EXEC SQL
constructs, and variables do not have to be prefixed by a colon ':'.
3.1 Introduction
3.2.1 Single-Tier
Initially, data-intensive applications were combined into a single tier, including the
DBMS, application logic, and user interface. The application typically ran on a
mainframe, and users accessed it through dumb terminals that could perform only data
input and display.
■ Benefit
• easily maintained by a central administrator
■ Drawback:
• Users expect graphical interfaces that require much more
computational power than simple dumb terminals.
• Do not scale to thousands of users
user interface and business logic, or clients that implement user interface and part
of the business logic, with the remaining part being implemented at the server level;
such clients are often called thick clients.
At the presentation layer, we need to provide forms through which the user can issue
requests, and display responses that the middle tier generates. It is important that
this layer of code be easy to adapt to different display devices and formats; for
example, regular desktops versus handheld devices versus cell phones. This
adaptivity can be achieved either at the middle tier through generation of different
pages for different types of client, or directly at the client through style sheets that
specify how the data should be presented. The hypertext markup language (HTML)
is the basic data presentation language.
HTML Forms
HTML forms are a common way of communicating data from the client tier to
the middle tier . The general format of a form :
<FORM ACTION="page.jsp" METHOD="GET" NAME="LoginForm">
</FORM>
• ACTION: Specifies the URI of the page to which the form contents are
submitted. If the ACTION attribute is absent, then the URI of the
current page is used
• METHOD: The HTTP/1.0 method used to submit the user input from the
filled-out form to the webserver. There are two choices: GET
and POST
• NAME: This attribute gives the form a name
A single HTML document can contain more than one form. Inside an HTML form,
we can have any HTML tags except another FORM element
There are two different ways to submit HTML Form data to the webserver. If the
method GET is used, then the contents of the form are assembled into a query URI
(as discussed next) and sent to the server. If the method POST is used, then the
contents of the form are encoded as in the GET method, but the contents are sent
in a separate data block instead of appending them directly to the URI. Thus, in the
GET method the form contents are directly visible to the user as the constructed
URI, whereas in the POST method, the form contents are sent inside the HTTP
request message body and are not visible to the user.
JavaScript
JavaScript is a scripting language at the client tier with which we can add programs
to webpages that run directly at the client. JavaScript is often used for the following
types of computation at the client:
■ Browser Detection: JavaScript can be used to detect the browser type and
load a
browser-specific page.
■ Form Validation: JavaScript is used to perform simple consistency checks on form
fields
■ Browser Control: This includes opening pages in customized windows;
examples include the annoying pop-up advertisements that you see at many
websites, which are programmed using JavaScript.
JavaScript is usually embedded into an HTML document with a special tag, the SCRIPT tag
The SCRIPT tag has the attribute LANGUAGE, which indicates the language in
which the script is written. For JavaScript, we set the language attribute to
JavaScript. Another attribute of the SCRIPT tag is the SRC attribute, which specifies
an external file with JavaScript code that is automatically embedded into the HTML
document. Usually JavaScript source code files use a '.js' extension.
Style Sheets
• we can reuse the same document many times and display it differently
depending on the context
• we can tailor the display to the reader's preference such as font size, color
style, and even level of detail.
• we can deal with different output formats, such as different output devices
(laptops versus cell phones), different display sizes (letter versus legal
paper), and different display media (paper versus digital display)
• we can standardize the display format within a corporation and thus apply
style sheet conventions to documents at any time.
■ XSL
■ css
• CSS was created for HTML with the goal of separating the display
characteristics of different formatting tags from the tags themselves
• CSS defines how to display HTML elements.
• Styles are normally stored in style sheets, which are files that contain style
definitions.
• Many different HTML documents, such as all documents in a website, can
refer to the same CSS.
• Thus, we can change the format of a website by changing a single file.
• Each line in a CSS sheet consists of three parts; a selector, a property, and a
value.They are syntactically arranged in the following way:
selector {property: value}
• The selector is the element or tag whose format we are defining.
• The property indicates the tag's attribute whose value we want to set in the style
sheet
• Example: BODY {BACKGROUND-COLOR:
yellow} P {MARGIN-LEFT: 50px;
COLOR: red}
XSL
The middle layer runs code that implements the business logic of the application.
The middle tier code is responsible for supporting all the different roles involved in
the application. For example, in an Internet shopping site implementation, we would
like
• customers to be able to browse the catalog and make purchases
• administrators to be able to inspect current inventory, and
• data analysts to ask summary queries about purchase histories
• Each of these roles can require support for several complex actions
The first generation of middle-tier applications was stand-alone programs written in
a general- purpose programming language such as C, C++, and Perl.
Programmers quickly realized that interaction with a stand-alone application was
quite costly. The overheads include starting the application every time it is invoked
and switching processes between the webserver and the application. Therefore,
such interactions do not scale to large numbers of concurrent users. Most of today's
large-scale websites use an application server to run application code at the middle tier
. Application server provides the run-time for several technologies that can be used
to program middle-tier application components.
The Common Gateway Interface connects HTML forms with application programs.
■ It is a protocol that defines how arguments from forms are passed to programs
at the server side
■ CGI is the part of the Web server that can communicate with other programs
running on the server
■ With CGI, the Web server can call up a program, while passing user-specific
data to the program (such as what host the user is connecting from, or input
the user has supplied using HTML form syntax)
■ The program then processes that data and the server passes the program's
response back to the Web browser.
Program fragment: A Sample 'web Page Where Form Input Is Sent to a CGI
Script
Application Servers
Application logic can be enforced through server-side programs that are invoked
using the CGI protocol. However, since each page request results in the creation of
a new process, this solution does not scale well to a large number of simultaneous
requests. An application server maintains a pool of threads or processes and uses
these to execute requests. Thus, it avoids the startup cost of creating a new process
for each request. They facilitate concurrent access to several heterogeneous data
sources (e.g., by providing JDBC drivers), and provide session management
services.
Servlets
Java servlets are pieces of Java code that run on the middle tier, in either webservers
Dept. of ISE, AJIET Page 75
Database Management System [18CS53]
JavaServer Pages
Java Server Pages (JSP) is a server-side programming technology that enables the
creation of dynamic, platform-independent method for building Web-based
applications. JSP have access to the entire family of Java APls, including the JDBC
API to access enterprise databases
JavaServer pages (.JSPs) interchange the roles of output aml application logic.
JavaServer pages are written in HTML with servlet-like code embedded in special
HT1VIL tags. Thus, in comparison to servlets, JavaServer pages are better suited to
quickly building interfaces that have some logic inside, whereas servlets are better
suited for complex application logic.
Maintaining State
There is a need to maintain a user's state across different pages. As an example,
consider a user who wants to make a purchase at the Barnes and Nobble website.
The user must first add items into her shopping basket, which persists while she
navigates through the site Thus, we use the notion of state mainly to remember
information as the user navigates through the site.
The HTTP protocol is stateless. We call an interaction with a webserver stateless if
no information is retained from one request to the next request. We call an interaction
with a webserver stateful, or we say that state is maintained, if some memory is
stored between requests to the server, and different actions are taken depending
on the contents stored.
Since we cannot maintain state in the HTTP protocol, where should we maintain
state? There are basically two choices:
Dept. of ISE, AJIET Page 76
Database Management System [18CS53]
■ We can maintain state in the middle tier, by storing information in the local main
memory of
the application logic, or even in a database system
■ Alternatively , we can maintain state on the client side by storing data in the form of a
cookie.
■ First, we could store the state at the bottom tier, in the database server. The state
survives crashes of the system, but a database access is required to query or
update the state, a potential performance bottleneck
■ An alternative is to store state in main memory at the middle tier. The drawbacks
are that this information is volatile and that it might take up a lot of main memory
■ We can also store state in local files at the middle tier, as a compromise between
the first two approaches.
Question Bank
1. Discuss how NULLs are treated in comparison operators in SOL. How are
NULLs treated when aggregate functions are applied in an SOL query? How
are NULLs treated if they exist in grouping attributes?
2. Describe the six clauses in the syntax of an SOL retrieval query. Show what
type of constructs can be specified in each of the six clauses . Which of the six
clauses are required and which are optional?
3. Describe conceptually how an SOL retrieval query will be executed by specifying
the conceptual order of executing each of the six clauses.
4. Explain how the GROUP BY clause works. What is the difference between the
WHERE and HAVING clause?
5. Explain insert, delete and update statements in SOL and give example for each.
6. Write a note on:
i) Views in SOL
ii) Aggregate functions in SOL
7. Explain DROP command with an example.
8. How is view created and dropped? What problems are associated with updating views?
9. How are triggers and assertions defined in SOL? Explain.
10. Consider the following schema for a COMPANY database:
EMPLOYEE (Fname, Lname, Ssn, Address, Super-ssn,
Salary, Ono) DEPARTMENT (Dname, Dnumber, Mgr-ssn,
Mgr-start-date)
DEPT-LOCATIONS (Dnumber,
Dlocation) PROJECT (Pname,
Pnumber, Placation, Dnum) WORKS-ON
(Ess!!, Pno, Hours)
DEPENDENT (Essn, Dependent-name, Sex, Bdate,
Relationship) write the SOL query for the following:
i) List the names of managers who have at least one dependent.
ii) Retrieve the list of employees and the projects they are working on, ordered by
department and, within each department, ordered alphabetically by last name,
first name.
iii) For each project, retrieve the project number, the project name, and
the number of employees who work on that project.
iv) For each project on which more than two employees work, retrieve
the project number, the project name, and the number of employees
who work on the project.
v) For each project, retrieve the project number, the project name, and
the number of employees from department 4 who work on the
project.
ii) Retrieve the student name who have enrolled under any of the courses in
which 'kumar' has enrolled.
iii) Retrieve the faculty name who earn salary which is greater than the
average salary of all the faculties.
iv) Retrieve the sname who are not bee taught by faculty 'kumar'.
v) Retrieve the faculty names who are assistant professors of CSE dept.
14. How do we use SOL statements within a host langl.lage? How do we check for
errors in statement execution?