SQL Notes
SQL Notes
SQL Notes
What is SQL?
Why SQL
Table basics
Table Constraints
Selecting data
Creating tables
Data Types
Predicate operations (Where Clause)
Order By
What is SQL?
SQL is Structured Query Language, which is a computer language for storing, manipulating and retrieving data
stored in relational database.
SQL is the standard language for Relation Database System. All relational database management systems like
MySQL, MS Access, Oracle, Sybase, Informix, postgres and SQL Server use SQL as standard database language.
Also, they are using different dialects, such as:
Why SQL?
SQL Process:
When you are executing an SQL command for any RDBMS, the system determines the best way to carry out
your request and SQL engine figures out how to interpret the task.
There are various components included in the process. These components are Query Dispatcher, Optimization
Engines, Classic Query Engine and SQL Query Engine, etc. Classic query engine handles all non-SQL queries but
SQL query engine won't handle logical files.
SQL Commands:
The standard SQL commands to interact with relational databases are CREATE, SELECT, INSERT, UPDATE, DELETE
and DROP. These commands can be classified into groups based on their nature:
DDL - Data Definition Language:
CREATE Creates a new table, a view of a table, or other object in database
ALTER Modifies an existing database object, such as a table.
DROP
+----+----------+-----+-----------+----------+
| 1 | Ramesh | 32 | Ahmedabad | 2000.00 |
| 2 | Khilan | 25 | Delhi
| 3 | kaushik | 23 | Kota
| 1500.00 |
| 2000.00 |
+----+----------+-----+-----------+----------+
What is field?
Every table is broken up into smaller entities called fields. The fields in the CUSTOMERS table consist of ID,
NAME, AGE, ADDRESS and SALARY.
A field is a column in a table that is designed to maintain specific information about every record in the table.
What is record or row?
A record, also called a row of data, is each individual entry that exists in a table. For example there are 7 records
in the above CUSTOMERS table. Following is a single row of data or record in the CUSTOMERS table:
+----+----------+-----+-----------+----------+
| 1 | Ramesh | 32 | Ahmedabad | 2000.00 |
+----+----------+-----+-----------+----------+
A record is a horizontal entity in a table.
What is column?
A column is a vertical entity in a table that contains all information associated with a specific field in a table.
For example, a column in the CUSTOMERS table is ADDRESS, which represents location description and would
consist of the following:
+-----------+| ADDRESS |+-----------+
| Ahmedabad |
| Delhi
| Kota
+----+------+
NOT NULL Constraint: Ensures that a column cannot have NULL value.
DEFAULT Constraint: Provides a default value for a column when none is specified.
UNIQUE Constraint: Ensures that all values in a column are different.
PRIMARY Key: Uniquely identified each rows/records in a database table.
FOREIGN Key: Uniquely identified a rows/records in any another database table.
CHECK Constraint: The CHECK constraint ensures that all values in a column satisfy certain conditions.
INDEX: Use to create and retrieve data from the database very quickly.
Data Integrity:
The following categories of the data integrity exist with each RDBMS:
Entity Integrity: There are no duplicate rows in a table.
Domain Integrity: Enforces valid entries for a given column by restricting the type, the format, or the
range of values.
Referential integrity: Rows cannot be deleted, which are used by other records.
User-Defined Integrity: Enforces some specific business rules that do not fall into entity, domain or
referential integrity.
Selecting data:
The select statement is used to query the database and retrieve selected data that match the criteria that you
specify. Here is the format of a simple select statement:
select "column1"
[,"column2",etc]
from "tablename"
[where "condition"];
[] = optional
A SQL SELECT statement can be broken down into numerous elements, each beginning with a keyword.
Although it is not necessary, common convention is to write these keywords in all capital letters. In this article,
we will focus on the most fundamental and common elements of a SELECT statement, namely
SELECT
FROM
WHERE
ORDER BY
If we want only specific columns (as is usually the case), we can/should explicitly specify them in a commaseparated list, as in which results in the specified fields of data for all of the rows in the table:
SELECT EmployeeID, FirstName, LastName, HireDate, City FROM Employees
Explicitly specifying the desired fields also allows us to control the order in which the fields are returned, so that
if we wanted the last name to appear before the first name, we could write
SELECT EmployeeID, LastName, FirstName, HireDate, City FROM Employees
Resulting in
If you wanted to get the opposite, the employees who do not live in London, you would write
SELECT EmployeeID, FirstName, LastName, HireDate, City FROM Employees WHERE City <> 'London'
It is not necessary to test for equality; you can also use the standard equality/inequality operators that you
would expect. For example, to get a list of employees who were hired on or after a given date, you would write
SELECT EmployeeID, FirstName, LastName, HireDate, City FROM Employees WHERE HireDate >= '1-july-1993'
Of course, we can write more complex conditions. The obvious way to do this is by having multiple conditions in
the WHERE clause. If we want to know which employees were hired between two given dates, we could write
SELECT EmployeeID, FirstName, LastName, HireDate, City FROM
Employees
WHERE (HireDate >= '1-june-1992') AND (HireDate <= '15-december-1993')
resulting in
Note that SQL also has a special BETWEEN operators that checks to see if a value is between two values
(including equality on both ends). This allows us to rewrite the previous query as
SELECT EmployeeID, FirstName, LastName, HireDate, City FROM Employees
WHERE HireDate BETWEEN '1-june-1992' AND '15-december-1993'
We could also use the NOT operator, to fetch those rows that are not between the specified dates:
SELECT EmployeeID, FirstName, LastName, HireDate, City FROM Employees
WHERE HireDate NOT BETWEEN '1-june-1992' AND '15-december-1993'
Let us finish this section on the WHERE clause by looking at two additional, slightly more sophisticated,
comparison operators.
What if we want to check if a column value is equal to more than one value? If it is only 2 values, then it is easy
enough to test for each of those values, combining them with the OR operator and writing something like
SELECT EmployeeID, FirstName, LastName, HireDate, City FROM Employees
WHERE City = 'London' OR City = 'Seattle'
However, if there are three, four, or more values that we want to compare against, the above approach quickly
becomes messy. In such cases, we can use the IN operator to test against a set of values. If we wanted to see if
the City was either Seattle, Tacoma, or Redmond, we would write
As with the BETWEEN operator, here too we can reverse the results obtained and query for those rows where
City is not in the specified list:
SELECT EmployeeID, FirstName, LastName, HireDate, City FROM Employees
WHERE City NOT IN ('Seattle', 'Tacoma', 'Redmond')
Finally, the LIKE operator allows us to perform basic pattern-matching using wildcard characters. For Microsoft
SQL Server, the wildcard characters are defined as follows:
Wildcard
Description
_ (underscore)
[]
matches any single character within the specified range (e.g. [a-f]) or set (e.g. [abcdef]).
[^]
matches any single character not within the specified range (e.g. [^a-f]) or set (e.g. [^abcdef]).
WHERE FirstName LIKE '_im' finds all three-letter first names that end with 'im' (e.g. Jim, Tim).
WHERE LastName LIKE '%stein' finds all employees whose last name ends with 'stein'
WHERE LastName LIKE '%stein%' finds all employees whose last name includes 'stein' anywhere in the
name.
WHERE FirstName LIKE '[JT]im' finds three-letter first names that end with 'im' and begin with either 'J'
or 'T' (that is, only Jim and Tim)
WHERE LastName LIKE 'm[^c]%' finds all last names beginning with 'm' where the following (second)
letter is not 'c'.
Here too, we can opt to use the NOT operator: to find all of the employees whose first name does not start with
'M' or 'A', we would write
SELECT EmployeeID, FirstName, LastName, HireDate, City FROM Employees WHERE (FirstName NOT LIKE 'M%') AND (FirstName NOT LIKE
'A%')
resulting in
By default, the sort order for a column is ascending (from lowest value to highest value), as shown below for the
previous query:
If we want the sort order for a column to be descending, we can include the DESC keyword after the column
name.
The ORDER BY clause is not limited to a single column. You can include a comma-delimited list of columns to
sort bythe rows will all be sorted by the first column specified and then by the next column specified. If we
add the Country field to the SELECT clause and want to sort by Country and City, we would write:
SELECT EmployeeID, FirstName, LastName, HireDate, Country, City FROM Employees
ORDER BY Country, City DESC
Note that to make it interesting, we have specified the sort order for the City column to be descending (from
highest to lowest value). The sort order for the Country column is still ascending. We could be more explicit
about this by writing
SELECT EmployeeID, FirstName, LastName, HireDate, Country, City FROM Employees
ORDER BY Country ASC, City DESC
but this is not necessary and is rarely done. The results returned by this query are
It is important to note that a column does not need to be included in the list of selected (returned) columns in
order to be used in the ORDER BY clause. If we don't need to see/use the Country values, but are only interested
in them as the primary sorting field we could write the query as
SELECT EmployeeID, FirstName, LastName, HireDate, City FROM Employees
ORDER BY Country ASC, City DESC
DATATYPE
MIN
MAX
STORAGE
8 9 10 11 TYPE
NOTES
Bigint
-2^63
2^63-1
8 bytes
Exact
Int
-2,147,483,648
2,147,483,647
4 bytes
Exact
Smallint
-32,768
32,767
2 bytes
Exact
Tinyint
255
1 bytes
Exact
Bit
1 to 8 bit columns in
the same table requires
a total of 1 byte, 9 to
16 bits = 2 bytes, etc...
Exact
Decimal
-10^38+1
10^381
Exact
Numeric
same as Decimal
same as Decimal
same as Decimal
Exact
Money
-2^63 / 10000
2^63-1 / 10000
8 bytes
Exact
Smallmoney
-214,748.3648
214,748.3647
4 bytes
Exact
Float
-1.79E + 308
1.79E + 308
Approx
Real
-3.40E + 38
3.40E + 38
4 bytes
Approx
Precision is fixed to 7.
Datetime
1753-01-01
00:00:00.000
9999-12-31
23:59:59.997
8 bytes
Smalldatetime
1900-01-01 00:00
2079-06-06 23:59
4 bytes
Datetime
Date
0001-01-01
9999-12-31
3 bytes
no no
Datetime
Time
00:00:00.0000000
23:59:59.9999999
time(0-2) = 3 bytes,
time(3-4) = 4 bytes,
time(5-7) = 5 bytes
no no
DATATYPE
MIN
MAX
STORAGE
8 9 10 11 TYPE
NOTES
round the value.
Datetime2
0001-01-01
00:00:00.0000000
9999-12-31
23:59:59.9999999
no no
Datetimeoffset
0001-01-01
00:00:00.0000000 14:00
9999-12-31
23:59:59.9999999
+14:00
Char
0 chars
8000 chars
Defined width
String
Fixed width
Varchar
0 chars
8000 chars
2 bytes + number of
chars
String
Variable width
Varchar(max)
0 chars
2^31 chars
2 bytes + number of
chars
String
Variable width
Text
0 chars
String
Variable width
Nchar
0 chars
4000 chars
Unicode
Fixed width
Nvarchar
0 chars
4000 chars
Unicode
Variable width
Nvarchar(max)
0 chars
2^30 chars
Unicode
Variable width
Ntext
0 chars
1,073,741,823 chars
Unicode
Variable width
Binary
0 bytes
8000 bytes
Binary
Fixed width
Varbinary
0 bytes
8000 bytes
Binary
Variable width
Varbinary(max)
0 bytes
2^31 bytes
Binary
Variable width
Image
0 bytes
2,147,483,647 bytes
Binary
Other
no
Defined width x 2
no
no
Sql_variant
Timestamp
8 bytes
Other
Uniqueidentifier
16 bytes
Other
Other
Xml
no
Creating Tables:
The create table statement is used to create a new table. Here is the format of a simple create table statement:
create table "tablename"
("column1" "data type",
"column2" "data type",
"column3" "data type");
Format of create table if you were to use optional constraints:
create table "tablename"
("column1" "data type"
[constraint],
"column2" "data type"
[constraint],
"column3" "data type"
[constraint]);
[ ] = optional
Note: You may have as many columns as you'd like, and the constraints are optional.
Example:
create table employee
(first varchar(15),
last varchar(20),
age number(3),
address varchar(30),
city varchar(20),
state varchar(20));
To create a new table, enter the keywords create table followed by the table name, followed by an open
parenthesis, followed by the first column name, followed by the data type for that column, followed by any
optional constraints, and followed by a closing parenthesis. It is important to make sure you use an open
parenthesis before the beginning table and a closing parenthesis after the end of the last column definition.
Make sure you separate each column definition with a comma. All SQL statements should end with a ";".
The table and column names must start with a letter and can be followed by letters, numbers, or underscores not to exceed a total of 30 characters in length. Do not use any SQL reserved keywords as names for tables or
column names (such as "select", "create", "insert", etc.).
Data types specify what the type of data can be for that particular column. If a column called "Last_Name", is to
be used to hold names, then that particular column should have a "varchar" (variable-length character) data
type.
Exercise:
Table: EMP
EMPNO
7369
7499
7521
7566
7654
7698
7782
7788
7839
7844
7876
7900
7902
7934
Table: DEPT
ENAME
SMITH
ALLEN
WARD
JONES
MARTIN
BLAKE
CLARK
SCOTT
KING
TURNER
ADAMS
JAMES
FORD
MILLER
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
JOB
CLERK
SALESMAN
SALESMAN
MANAGER
SALESMAN
MANAGER
MANAGER
ANALYST
PRESIDENT
SALESMAN
CLERK
CLERK
ANALYST
CLERK
MGR
7902
7698
7698
7839
7698
7839
7839
7566
7698
7788
7698
7566
7782
HIREDATE
17-Dec-80
20-Feb-81
22-Feb-81
2-Apr-81
28-Sep-81
1-May-81
9-Jun-81
9-Dec-82
17-Nov-81
8-Sep-81
12-Jan-83
3-Dec-81
3-Dec-81
23-Jan-82
SAL
800
1600
1250
2975
1250
2850
2450
3000
5000
1500
1100
950
3000
1300
COMM
300
500
1400
DEPTNO
20
30
30
20
30
30
10
20
10
30
20
30
20
10
DEPTNO
10
20
30
40
DNAME
ACCOUNTING
RESEARCH
SALES
OPERATIONS
Table: SALGRADE
GRADE
LOSAL
1
2
3
4
5
LOC
NEW YORK
DALLAS
CHICAGO
BOSTON
HISAL
700
1201
1401
2001
3001
1200
1400
2000
3000
9999
Order by clause
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
Display details of all the employees and output should have highest comm row displayed at end
Display details of all the employees and output should have highest comm row displayed on top
Display the names of employees in order of commission(comm) i.e. the name of the employee earning
lowest commission(comm) should appear first
Display the names of employees in order of commission(comm) i.e. the name of the employee earning
highest commission(comm) should appear last
Display the names of employees in descending order of commission(comm) i.e., the name of the
employee earning highest commission(comm) should appear first
Display the names of employees in descending order of commission(comm) i.e., the name of the
employee earning lowest commission(comm) should appear last
Display the details from EMP table in order of employee name
Display EMPNO, ENAME, DEPTNO and SAL. Sort the output based on DEPTNO and then by SAL
Display employee details from EMP table. Sort the output based on DEPTNO (highest to lowest) and then
by SAL (highest to lowest)
Display the name of employees along with their annual salary (SAL*12). The name of the employee
earning highest annual salary should appear first
Display ENAME, SAL, HRA, PF, DA, total salary for each employee. The output should be in the order of
total salary (HRA 15% of SAL, DA 10% of SAL, PF 5% of SAL and Total Salary will be (SAL + HRA + DA) PF
Display EMPNO, ENAME, SAL, and DEPTNO from EMP table. Output should be in the order of length of
ename(high to low), if length of ename is same for more employees then sort the output by salary(high to
low) and if more employees has same salary than sort the output by ename
Write a query to display ename from EMP table. MILLER to be displayed in first row and rest in ascending
order
Understanding Joins
Querying with Inner Joins
Querying with Outer Joins
Querying with Cross Joins and Self Joins
Understanding Joins:
SQL join is instruction to a database to combine data from more than one table. There are different kinds of
joins, which have different rules for the results they create.
Let's look at the different kinds of SQL joins:
INNER JOIN:
An inner join produces a result set that is limited to the rows where there is a match in both tables for what
we're looking for. If you don't know which kind of join you need, this will usually be your best bet.
Example:
SELECT gid, first_name, last_name, pid, gardener_id, plant_name
FROM Gardners INNER JOIN Plantings ON gid = gardener_id
Cross Join:
The cross join returns a table with a potentially very large number of rows. The row count of the result is equal
to the number of rows in the first table times the number of rows in the second table. Each row is a combination
of the rows of the first and second table.
Example:
SELECT gid, first_name, last_name, pid, gardener_id, plant_name
FROM Gardners CROSS JOIN Plantings
SELF JOIN
You can join a single table to itself. In this case, you are using the same table twice.
Example:
SELECT G1.gid, G1.first_name, G1.last_name, G2.gid, G2.first_name, G2.last_name
FROM Gardners G1 INNER JOIN Gardners G2 ON G1.first_name = G2.first_name
Exercise:
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.