SQL commands are instructions used to communicate with the database to perform
specific task that work with data. SQL commands can be used not only for
searching the database but also to perform various other functions like, for
example, you can create tables, add data to tables, or modify data, drop the
table, set permissions for users. SQL commands are grouped into four major
categories depending on their functionality:
- Data Definition Language (DDL) - These SQL commands are
used for creating, modifying, and dropping the structure of database objects.
The commands are CREATE, ALTER, DROP, RENAME, and TRUNCATE.
- Data Manipulation Language (DML) - These SQL commands are
used for storing, retrieving, modifying, and deleting data. These commands are
SELECT, INSERT, UPDATE, and DELETE.
- Transaction Control Language (TCL) - These SQL commands
are used for managing changes affecting the data. These commands are COMMIT,
ROLLBACK, and SAVEPOINT.
- Data Control Language (DCL) - These SQL commands are used
for providing security to database objects. These commands are GRANT and REVOKE.
SQL Comparison Keywords
There are other comparison keywords available in sql which are used to enhance
the search capabilities of a sql query. They are "IN", "BETWEEN...AND", "IS
NULL", "LIKE".
Comparision Operators |
Description |
LIKE |
column value is similar to specified character(s). |
IN |
column value is equal to any one of a specified set of values. |
BETWEEN...AND |
column value is between two values, including the end values specified in the
range. |
IS NULL |
column value does not exist. |
SQL LIKE Operator
The LIKE operator is used to list all rows in a table whose column values match
a specified pattern. It is useful when you want to search rows to match a
specific pattern, or when you do not know the entire value. For this purpose we
use a wildcard character '%'.
For example: To select all the students whose name begins with
'S'
SELECT first_name, last_name
FROM student_details
WHERE first_name LIKE 'S%';
The output would be similar to:
first_name |
last_name |
------------- |
------------- |
Stephen |
Fleming |
Shekar |
Gowda |
The above select statement searches for all the rows where the first letter of
the column first_name is 'S' and rest of the letters in the name can be any
character.
There is another wildcard character you can use with LIKE operator. It is the
underscore character, ' _ ' . In a search string, the underscore signifies a
single character.
For example: to display all the names with 'a' second
character,
SELECT first_name, last_name
FROM student_details
WHERE first_name LIKE '_a%';
The output would be similar to:
first_name |
last_name |
------------- |
------------- |
Rahul |
Sharma |
NOTE:Each
underscore act as a placeholder for only one character. So you can use more than
one underscore. Eg: ' __i% '-this has two underscores towards the left, 'S__j%'
- this has two underscores between character 'S' and 'i'.
SQL BETWEEN ... AND Operator
The operator BETWEEN and AND, are used to compare data for a range of values.
For Example: to find the names of the students between age 10
to 15 years, the query would be like,
SELECT first_name, last_name, age
FROM student_details
WHERE age BETWEEN 10 AND 15;
The output would be similar to:
first_name |
last_name |
age |
------------- |
------------- |
------ |
Rahul |
Sharma |
10 |
Anajali |
Bhagwat |
12 |
Shekar |
Gowda |
15 |
SQL IN Operator:
The IN operator is used when you want to compare a column with more than one
value. It is similar to an OR condition.
For example: If you want to find the names of students who are
studying either Maths or Science, the query would be like,
SELECT first_name, last_name, subject
FROM student_details
WHERE subject IN ('Maths', 'Science');
The output would be similar to:
first_name |
last_name |
subject |
------------- |
------------- |
---------- |
Anajali |
Bhagwat |
Maths |
Shekar |
Gowda |
Maths |
Rahul |
Sharma |
Science |
Stephen |
Fleming |
Science |
You can include more subjects in the list like ('maths','science','history')
NOTE:The data
used to compare is case sensitive.
SQL IS NULL Operator
A column value is NULL if it does not exist. The IS NULL operator is used to
display all the rows for columns that do not have a value.
For Example: If you want to find the names of students who do
not participate in any games, the query would be as given below
SELECT first_name, last_name
FROM student_details
WHERE games IS NULL
There would be no output as we have every student participate in a game in the
table student_details, else the names of the students who do not participate in
any games would be displayed.
SQL HAVING Clause
Having clause is used to filter data based on the group functions. This is
similar to WHERE condition but is used with group functions. Group functions
cannot be used in WHERE Clause but can be used in HAVING clause.
For Example: If you want to select the department that has
total salary paid for its employees more than 25000, the sql query would be
like;
SELECT dept, SUM (salary)
FROM employee
GROUP BY dept
HAVING SUM (salary) > 25000
The output would be like:
dept |
salary |
------------- |
------------- |
Electronics |
55000 |
Aeronautics |
35000 |
InfoTech |
30000 |
When WHERE, GROUP BY and HAVING clauses are used together in a SELECT statement,
the WHERE clause is processed first, then the rows that are returned after the
WHERE clause is executed are grouped based on the GROUP BY clause. Finally, any
conditions on the group functions in the HAVING clause are applied to the
grouped rows before the final output is displayed.
SQL Integrity Constraints
Integrity Constraints are used to apply business rules for the database tables.
The constraints available in SQL are
Foreign Key, Not Null, Unique,
Check.
Constraints can be defined in two ways
1) The constraints can be specified immediately after the column definition.
This is called column-level definition.
2) The constraints can be specified after all the columns are defined. This is
called table-level definition.
This constraint defines a column or combination of columns which uniquely
identifies each row in the table.
Syntax to define a Primary key at column level:
column name datatype [CONSTRAINT constraint_name] PRIMARY KEY
Syntax to define a Primary key at table level:
[CONSTRAINT constraint_name] PRIMARY KEY (column_name1,column_name2,..)
- column_name1, column_name2 are the names of the columns which
define the primary Key.
- The syntax within the bracket i.e. [CONSTRAINT constraint_name] is optional.
For Example: To create an employee table with Primary Key
constraint, the query would be like.
Primary Key at table level:
CREATE TABLE employee
( id number(5) PRIMARY KEY,
name char(20),
dept char(10),
age number(2),
salary number(10),
location char(10)
);
or
CREATE TABLE employee
( id number(5) CONSTRAINT emp_id_pk PRIMARY KEY,
name char(20),
dept char(10),
age number(2),
salary number(10),
location char(10)
);
Primary Key at table level:
CREATE TABLE employee
( id number(5),
name char(20),
dept char(10),
age number(2),
salary number(10),
location char(10),
CONSTRAINT emp_id_pk PRIMARY KEY (id)
);
This constraint identifies any column referencing the PRIMARY KEY in another
table. It establishes a relationship between two columns in the same table or
between different tables. For a column to be defined as a Foreign Key, it should
be a defined as a Primary Key in the table which it is referring. One or more
columns can be defined as Foreign key.
Syntax to define a Foreign key at column level:
[CONSTRAINT constraint_name] REFERENCES Referenced_Table_name(column_name)
Syntax to define a Foreign key at table level:
[CONSTRAINT constraint_name] FOREIGN KEY(column_name) REFERENCES
referenced_table_name(column_name);
For Example:
1) Lets use the "product" table and "order_items".
Foreign Key at column level:
CREATE TABLE product
( product_id number(5) CONSTRAINT pd_id_pk PRIMARY KEY,
product_name char(20),
supplier_name char(20),
unit_price number(10)
);
CREATE TABLE order_items
( order_id number(5) CONSTRAINT od_id_pk PRIMARY KEY,
product_id number(5) CONSTRAINT pd_id_fk REFERENCES, product(product_id),
product_name char(20),
supplier_name char(20),
unit_price number(10)
);
Foreign Key at table level:
CREATE TABLE order_items
( order_id number(5) ,
product_id number(5),
product_name char(20),
supplier_name char(20),
unit_price number(10)
CONSTRAINT od_id_pk PRIMARY KEY(order_id),
CONSTRAINT pd_id_fk FOREIGN KEY(product_id) REFERENCES product(product_id)
);
2) If the employee table has a 'mgr_id' i.e, manager id as a foreign key which
references primary key 'id' within the same table, the query would be like,
CREATE TABLE employee
( id number(5) PRIMARY KEY,
name char(20),
dept char(10),
age number(2),
mgr_id number(5) REFERENCES employee(id),
salary number(10),
location char(10)
);
This constraint ensures all rows in the table contain a definite value for the
column which is specified as not null. Which means a null value is not allowed.
Syntax to define a Not Null constraint:
[CONSTRAINT constraint name] NOT NULL
For Example: To create a employee table with Null value, the
query would be like
CREATE TABLE employee
( id number(5),
name char(20) CONSTRAINT nm_nn NOT NULL,
dept char(10),
age number(2),
salary number(10),
location char(10)
);
This constraint ensures that a column or a group of columns in each row have a
distinct value. A column(s) can have a null value but the values cannot be
duplicated.
Syntax to define a Unique key at column level:
[CONSTRAINT constraint_name] UNIQUE
Syntax to define a Unique key at table level:
[CONSTRAINT constraint_name] UNIQUE(column_name)
For Example: To create an employee table with Unique key, the
query would be like,
Unique Key at column level:
CREATE TABLE employee
( id number(5) PRIMARY KEY,
name char(20),
dept char(10),
age number(2),
salary number(10),
location char(10) UNIQUE
);
or
CREATE TABLE employee
( id number(5) PRIMARY KEY,
name char(20),
dept char(10),
age number(2),
salary number(10),
location char(10) CONSTRAINT loc_un UNIQUE
);
Unique Key at table level:
CREATE TABLE employee
( id number(5) PRIMARY KEY,
name char(20),
dept char(10),
age number(2),
salary number(10),
location char(10),
CONSTRAINT loc_un UNIQUE(location)
);
This constraint defines a business rule on a column. All the rows must satisfy
this rule. The constraint can be applied for a single column or a group of
columns.
Syntax to define a Check constraint:
[CONSTRAINT constraint_name] CHECK (condition)
For Example: In the employee table to select the gender of a
person, the query would be like
Check Constraint at column level:
CREATE TABLE employee
( id number(5) PRIMARY KEY,
name char(20),
dept char(10),
age number(2),
gender char(1) CHECK (gender in ('M','F')),
salary number(10),
location char(10)
);
Check Constraint at table level:
CREATE TABLE employee
( id number(5) PRIMARY KEY,
name char(20),
dept char(10),
age number(2),
gender char(1),
salary number(10),
location char(10),
CONSTRAINT gender_ck CHECK (gender in ('M','F'))
);
SQL Joins
SQL Joins are used to relate information in different tables. A Join condition
is a part of the sql query that retrieves rows from two or more tables. A SQL
Join condition is used in the SQL WHERE Clause of select, update, delete
statements.
The Syntax for joining two tables is:
SELECT col1, col2, col3...
FROM table_name1, table_name2
WHERE table_name1.col2 = table_name2.col1;
If a sql join condition is omitted or if it is invalid the join operation will
result in a Cartesian product. The Cartesian product returns a number of rows
equal to the product of all rows in all the tables being joined. For example, if
the first table has 20 rows and the second table has 10 rows, the result will be
20 * 10, or 200 rows. This query takes a long time to execute.
Lets use the below two tables to explain the sql join conditions.
database table "product";
product_id |
product_name |
supplier_name |
unit_price |
100 |
Camera |
Nikon |
300 |
101 |
Television |
Onida |
100 |
102 |
Refrigerator |
Vediocon |
150 |
103 |
Ipod |
Apple |
75 |
104 |
Mobile |
Nokia |
50 |
database table "order_items";
order_id |
product_id |
total_units |
customer |
5100 |
104 |
30 |
Infosys |
5101 |
102 |
5 |
Satyam |
5102 |
103 |
25 |
Wipro |
5103 |
101 |
10 |
TCS |
SQL Joins can be classified into Equi join and Non Equi join.
1) SQL Equi joins
It is a simple sql join condition which uses the equal sign as the comparison
operator. Two types of equi joins are SQL Outer join and SQL Inner join.
For example: You can get the information about a customer who
purchased a product and the quantity of product.
2) SQL Non equi joins
It is a sql join condition which makes use of some comparison operator other
than the equal sign like >, <, >=, <=
1) SQL Equi Joins:
An equi-join is further classified into two categories:
a) SQL Inner Join
b) SQL Outer Join
a) SQL Inner Join:
All the rows returned by the sql query satisfy the sql join condition specified.
For example: If you want to display the product information for
each order the query will be as given below. Since you are retrieving the data
from two tables, you need to identify the common column between these two
tables, which is theproduct_id.
The query for this type of sql joins would be like,
SELECT order_id, product_name,
unit_price, supplier_name, total_units
FROM product, order_items
WHERE order_items.product_id = product.product_id;
The columns must be referenced by the table name in the join condition, because
product_id is a column in both the tables and needs a way to be identified. This
avoids ambiguity in using the columns in the SQL SELECT statement.
The number of join conditions is (n-1), if there are more than two tables joined
in a query where 'n' is the number of tables involved. The rule must be true to
avoid Cartesian product.
We can also use aliases to reference the column name, then the above query would
be like,
SELECT o.order_id, p.product_name,
p.unit_price, p.supplier_name, o.total_units
FROM product p, order_items o
WHERE o.product_id = p.product_id;
b) SQL Outer Join:
This sql join condition returns all rows from both tables which satisfy the join
condition along with rows which do not satisfy the join condition from one of
the tables. The sql outer join operator in Oracle is ( + ) and is used on one
side of the join condition only.
The syntax differs for different RDBMS implementation. Few of them represent the
join conditions as "sql left outer join", "sql right outer join".
If you want to display all the product data along with order items data, with
null values displayed for order items if a product has no order item, the sql
query for outer join would be as shown below:
SELECT p.product_id, p.product_name,
o.order_id, o.total_units
FROM order_items o, product p
WHERE o.product_id (+) = p.product_id;
The output would be like,
product_id |
product_name |
order_id |
total_units |
------------- |
------------- |
------------- |
------------- |
100 |
Camera |
|
|
101 |
Television |
5103 |
10 |
102 |
Refrigerator |
5101 |
5 |
103 |
Ipod |
5102 |
25 |
104 |
Mobile |
5100 |
30 |
NOTE:If the (+)
operator is used in the left side of the join condition it is equivalent to left
outer join. If used on the right side of the join condition it is equivalent to
right outer join.
SQL Self Join:
A Self Join is a type of sql join which is used to join a table to itself,
particularly when the table has a FOREIGN KEY that references its own PRIMARY
KEY. It is necessary to ensure that the join statement defines an alias for both
copies of the table to avoid column ambiguity.
The below query is an example of a self join,
SELECT a.sales_person_id, a.name,
a.manager_id, b.sales_person_id, b.name
FROM sales_person a, sales_person b
WHERE a.manager_id = b.sales_person_id;
2) SQL Non Equi Join:
A Non Equi Join is a SQL Join whose condition is established using all
comparison operators except the equal (=) operator. Like >=, <=, <, >
For example: If you want to find the names of students who are
not studying either Economics, the sql query would be like, (lets use
student_details table defined earlier.)
SELECT first_name, last_name, subject
FROM student_details
WHERE subject != 'Economics'
The output would be something like,
first_name |
last_name |
subject |
------------- |
------------- |
------------- |
Anajali |
Bhagwat |
Maths |
Shekar |
Gowda |
Maths |
Rahul |
Sharma |
Science |
Stephen |
Fleming |
Science |
SQL Views
A VIEW is a virtual table, through which a selective portion of the data from
one or more tables can be seen. Views do not contain data of their own. They are
used to restrict access to the database or to hide data complexity. A view is
stored as a SELECT statement in the database. DML operations on a view like
INSERT, UPDATE, DELETE affects the data in the original table upon which the
view is based.
The Syntax to create a sql view is
CREATE VIEW view_name
AS
SELECT column_list
FROM table_name [WHERE condition];
- view_name is the name of the VIEW.
- The SELECT statement is used to define the columns and rows that you want to
display in the view.
For Example: to create a view on the product table the sql
query would be like
CREATE VIEW view_product
AS
SELECT product_id, product_name
FROM product;
SQL Subquery
Subquery or Inner query or Nested query is a query in a query. A subquery is
usually added in the WHERE Clause of the sql statement. Most of the time, a
subquery is used when you know how to search for a value using a SELECT
statement, but do not know the exact value.
Subqueries are an alternate way of returning data from multiple tables.
Subqueries can be used with the following sql statements along with the
comparision operators like =, <, >, >=, <= etc.
For Example:
1) Usually, a subquery should return only one record, but sometimes it can also
return multiple records when used with operators like IN, NOT IN in the where
clause. The query would be like,
SELECT first_name, last_name, subject
FROM student_details
WHERE games NOT IN ('Cricket', 'Football');
The output would be similar to:
first_name |
last_name |
subject |
------------- |
------------- |
---------- |
Shekar |
Gowda |
Badminton |
Priya |
Chandra |
Chess |
2) Lets consider the student_details table which we have used earlier. If you
know the name of the students who are studying science subject, you can get
their id's by using this query below,
SELECT id, first_name
FROM student_details
WHERE first_name IN ('Rahul', 'Stephen');
but, if you do not know their names, then to get their id's you need to write
the query in this manner,
SELECT id, first_name
FROM student_details
WHERE first_name IN (SELECT first_name
FROM student_details
WHERE subject= 'Science');
Output:
id |
first_name |
-------- |
------------- |
100 |
Rahul |
102 |
Stephen |
In the above sql statement, first the inner query is processed first and then
the outer query is processed.
3) Subquery can be used with INSERT statement to add rows of data from one or
more tables to another table. Lets try to group all the students who study Maths
in a table 'maths_group'.
INSERT INTO maths_group(id, name)
SELECT id, first_name || ' ' || last_name
FROM student_details WHERE subject= 'Maths'
4) A subquery can be used in the SELECT statement as follows. Lets use the
product and order_items table defined in the sql_joins section.
select p.product_name, p.supplier_name,
(select order_id from order_items where product_id = 101) as order_id from
product p where p.product_id = 101
product_name |
supplier_name |
order_id |
------------------ |
------------------ |
---------- |
Television |
Onida |
5103 |
Correlated Subquery
A query is called correlated subquery when both the inner query and the outer
query are interdependent. For every row processed by the inner query, the outer
query is processed as well. The inner query depends on the outer query before it
can be processed.
SELECT p.product_name FROM product p
WHERE p.product_id = (SELECT o.product_id FROM order_items o
WHERE o.product_id = p.product_id);
NOTE:
1) You can nest as many queries you want but it is recommended not to nest more
than 16 subqueries in oracle.
2) If a subquery is not dependent on the outer query it is called a
non-correlated subquery.
SQL Index
Index in sql is created on existing tables to retrieve the rows quickly.
When there are thousands of records in a table, retrieving information will take
a long time. Therefore indexes are created on columns which are accessed
frequently, so that the information can be retrieved quickly. Indexes can be
created on a single column or a group of columns. When a index is created, it
first sorts the data and then it assigns a ROWID for each row.
Syntax to create Index:
CREATE INDEX index_name
ON table_name (column_name1,column_name2...);
Syntax to create SQL unique Index:
CREATE UNIQUE INDEX index_name
ON table_name (column_name1,column_name2...);
- index_name is the name of the INDEX.
- table_name is the name of the table to which the indexed
column belongs.
- column_name1, column_name2.. is the list of columns
which make up the INDEX.
In Oracle there are two types of SQL index namely, implicit and explicit.
Implicit Indexes:
They are created when a column is explicity defined with PRIMARY KEY, UNIQUE KEY
Constraint.
Explicit Indexes:
They are created using the "create index.. " syntax.
NOTE:
1) Even though sql indexes are created to access the rows in
the table quickly, they slow down DML operations like INSERT, UPDATE, DELETE on
the table, because the indexes and tables both are updated along when a DML
operation is performed. So use indexes only on columns which are used to search
the table frequently.
2) Is is not required to create indexes on table which have
less data.
3) In oracle database you can define up to sixteen (16) columns
in an INDEX.
DCL commands are used to enforce database security in a multiple user database
environment. Two types of DCL commands are GRANT and REVOKE. Only Database
Administrator's or owner's of the database object can provide/remove privileges
on a database object.
SQL GRANT Command
SQL GRANT is a command used to provide access or privileges on the database
objects to the users.
The Syntax for the GRANT command is:
GRANT privilege_name
ON object_name
TO {user_name |PUBLIC |role_name}
[WITH GRANT OPTION];
- privilege_name is the access right or privilege granted
to the user. Some of the access rights are ALL, EXECUTE, and SELECT.
- object_name is the name of an database object like
TABLE, VIEW, STORED PROC and SEQUENCE.
- user_name is the name of the user to whom an access
right is being granted.
- user_name is the name of the user to whom an access
right is being granted.
- PUBLIC is used to grant access rights to all users.
- ROLES are a set of privileges grouped together.
- WITH GRANT OPTION - allows a user to grant access rights
to other users.
For Eample: GRANT SELECT ON employee TO user1;This command
grants a SELECT permission on employee table to user1.You should use the WITH
GRANT option carefully because for example if you GRANT SELECT privilege on
employee table to user1 using the WITH GRANT option, then user1 can GRANT SELECT
privilege on employee table to another user, such as user2 etc. Later, if you
REVOKE the SELECT privilege on employee from user1, still user2 will have SELECT
privilege on employee table.
SQL REVOKE Command:
The REVOKE command removes user access rights or privileges to the database
objects.
The Syntax for the REVOKE command is:
REVOKE privilege_name
ON object_name
FROM {user_name |PUBLIC |role_name}
For Eample: REVOKE SELECT ON employee FROM user1;This commmand
will REVOKE a SELECT privilege on employee table from user1.When you REVOKE
SELECT privilege on a table from a user, the user will not be able to SELECT
data from that table anymore. However, if the user has received SELECT
privileges on that table from more than one users, he/she can SELECT from that
table until everyone who granted the permission revokes it. You cannot REVOKE
privileges if they were not initially granted by you.
Privileges and Roles:
Privileges: Privileges defines the access rights provided to a user on a
database object. There are two types of privileges.
1) System privileges - This allows the user to CREATE, ALTER,
or DROP database objects.
2) Object privileges - This allows the user to EXECUTE, SELECT,
INSERT, UPDATE, or DELETE data from database objects to which the privileges
apply.
Few CREATE system privileges are listed below:
System Privileges |
Description |
CREATE object |
allows users to create the specified object in their own schema. |
CREATE ANY object |
allows users to create the specified object in any schema. |
The above rules also apply for ALTER and DROP system privileges.
Few of the object privileges are listed below:
Object Privileges |
Description |
INSERT
|
allows users to insert rows into a table. |
SELECT
|
allows users to select data from a database object. |
UPDATE
|
allows user to update data in a table. |
EXECUTE
|
allows user to execute a stored procedure or a function. |
Roles: Roles are a collection of privileges or access rights.
When there are many users in a database it becomes difficult to grant or revoke
privileges to users. Therefore, if you define roles, you can grant or revoke
privileges to users, thereby automatically granting or revoking privileges. You
can either create Roles or use the system roles pre-defined by oracle.
Some of the privileges granted to the system roles are as given below:
System Role
|
Privileges Granted to the Role
|
CONNECT
|
CREATE TABLE, CREATE VIEW, CREATE SYNONYM, CREATE SEQUENCE, CREATE SESSION etc. |
RESOURCE
|
CREATE PROCEDURE, CREATE SEQUENCE, CREATE TABLE, CREATE TRIGGER etc. The primary
usage of the RESOURCE role is to restrict access to database objects.
|
DBA
|
ALL SYSTEM PRIVILEGES |
Creating Roles:
The Syntax to create a role is:
CREATE ROLE role_name
[IDENTIFIED BY password];
For example: To create a role called "developer" with password
as "pwd",the code will be as follows
CREATE ROLE testing
[IDENTIFIED BY pwd];
It's easier to GRANT or REVOKE privileges to the users through a role rather
than assigning a privilege direclty to every user. If a role is identified by a
password, then, when you GRANT or REVOKE privileges to the role, you definetely
have to identify it with the password.
We can GRANT or REVOKE privilege to a role as below.
For example: To grant CREATE TABLE privilege to a user by
creating a testing role:
First, create a testing Role
CREATE ROLE testing
Second, grant a CREATE TABLE privilege to the ROLE testing. You can add more
privileges to the ROLE.
GRANT CREATE TABLE TO testing;
Third, grant the role to a user.
GRANT testing TO user1;
To revoke a CREATE TABLE privilege from testing ROLE, you can write:
REVOKE CREATE TABLE FROM testing;
The Syntax to drop a role from the database is as below:
DROP ROLE role_name;
For example: To drop a role called developer, you can write:
DROP ROLE testing;