DBMS (1) Dbms
DBMS (1) Dbms
customerid
order_date
item
quantity
price
10330
30-Jun-1999
Pogo stick
28.00
10101
30-Jun-1999
Raft
58.00
10298
01-Jul-1999
Skateboard
33.00
10101
01-Jul-1999
Life Vest
125.00
10299
06-Jul-1999
Parachute
1250.00
10339
27-Jul-1999
Umbrella
4.50
10449
13-Aug-1999
Unicycle
180.79
10439
14-Aug-1999
Ski Poles
25.50
10101
18-Aug-1999
Rain Coat
18.30
10449
01-Sep-1999
Snow Shoes
45.00
10439
18-Sep-1999
Tent
88.00
10298
19-Sep-1999
Lantern
29.00
10410
28-Oct-1999
Sleeping Bag
89.22
10438
01-Nov-1999
Umbrella
6.75
10438
02-Nov-1999
Pillow
8.50
10298
01-Dec-1999
Helmet
22.00
10449
15-Dec-1999
Bicycle
380.50
10449
22-Dec-1999
Canoe
280.00
10101
30-Dec-1999
Hoola Hoop
14.75
10330
01-Jan-2000
Flashlight
28.00
10101
02-Jan-2000
Lantern
16.00
10299
18-Jan-2000
Inflatable Mattress
38.00
10438
18-Jan-2000
Tent
79.99
10413
19-Jan-2000
Lawnchair
32.00
10410
30-Jan-2000
Unicycle
192.50
10315
2-Feb-2000
Compass
8.00
10449
29-Feb-2000
Flashlight
4.50
10101
08-Mar-2000
Sleeping Bag
88.70
10298
18-Mar-2000
Pocket Knife
22.38
10449
19-Mar-2000
Canoe paddle
40.00
10298
01-Apr-2000
Ear Muffs
12.50
10330
19-Apr-2000
Shovel
16.75
customers
customerid
firstname
lastname
city
state
10101
John
Gray
Lynden
Washington
10298
Leroy
Brown
Pinetop
Arizona
10299
Elroy
Keller
Snoqualmie
Washington
10315
Lisa
Jones
Oshkosh
Wisconsin
10325
Ginger
Schultz
Pocatello
Idaho
10329
Kelly
Mendoza
Kailua
Hawaii
10330
Shawn
Dalton
Cannon Beach
Oregon
10338
Michael
Howell
Tillamook
Oregon
10339
Anthony
Sanchez
Winslow
Arizona
10408
Elroy
Cleaver
Globe
Arizona
10410
Mary Ann
Howell
Charleston
South Carolina
10413
Donald
Davids
Gila Bend
Arizona
10419
Linda
Sakahara
Nogales
Arizona
10429
Sarah
Graham
Greensboro
North Carolina
10438
Kevin
Smith
Durango
Colorado
10439
Conrad
Giles
Telluride
Colorado
10449
Isabela
Moore
Yuma
Arizona
SELECT Statement
The SELECT statement is used to query the database and retrieve selected data that match the
criteria that you specify.
The SELECT statement has five main clauses to choose from, although, FROM is the only
required clause. Each of the clauses have a vast selection of options, parameters, etc. The clauses
will be listed below, but each of them will be covered in more detail later in the tutorial.
Here is the format of the SELECT statement:
SELECT [ALL | DISTINCT] column1[,column2] FROM table1[,table2] [WHERE "conditions"] [GROUP BY
"column-list"] [HAVING "conditions] [ORDER BY "column-list" [ASC | DESC] ]
The above statement will select all of the values in the name, age, and salary columns from the
employee table whose age is greater than 50.
Note: Remember to put a semicolon at the end of your SQL statements. The ; indicates that your
SQL statment is complete and is ready to be interpreted.
Comparison Operators
=
Equal
>
Greater than
<
Less than
>=
<=
<> or !=
Not equal to
LIKE
The above statement will select all of the rows/values in the name, title, and dept columns from
the employee table whose title starts with 'Pro'. This may return job titles including Programmer
or Pro-wrestler.
ALL and DISTINCT are keywords used to select either ALL (default) or the "distinct" or
unique records in your query results. If you would like to retrieve just the unique records in
specified columns, you can use the "DISTINCT" keyword. DISTINCT will discard the duplicate
records for the columns you specified after the "SELECT" statement: For example:
SELECT DISTINCT age
FROM employee_info;
This statement will return all of the unique ages in the employee_info table.
ALL will display "all" of the specified columns including all of the duplicates. The ALL keyword
is the default if nothing is specified.
Note: The following two tables will be used throughout this course. It is recommended to have
them open in another window or print them out.
Review Exercises
1. From the items_ordered table, select a list of all items purchased for customerid 10449.
Display the customerid, item, and price for this customer.
2. Select all columns from the items_ordered table for whoever purchased a Tent.
3. Select the customerid, order_date, and item values from the items_ordered table for any
items in the item column that start with the letter "S".
4. Select the distinct items in the items_ordered table. In other words, display a listing of
each of the unique items from the items_ordered table.
5. Make up your own select statements and submit them.
Aggregate Functions
MIN
MAX
SUM
AVG
COUNT
COUNT(*)
Aggregate functions are used to compute against a "returned column of numeric data" from your
SELECT statement. They basically summarize the results of a particular column of selected data.
We are covering these here since they are required by the next topic, "GROUP BY". Although
they are required for the "GROUP BY" clause, these functions can be used without the "GROUP
BY" clause. For example:
SELECT AVG(salary)
FROM employee;
This statement will return a single result which contains the average value of everything returned
in the salary column from the employee table.
Another example:
SELECT AVG(salary)
FROM employee
WHERE title = 'Programmer';
This statement will return the average salary for all employee whose title is equal to
'Programmer'
Example:
SELECT Count(*)
FROM employee;
This particular statement is slightly different from the other aggregate functions since there isn't a
column supplied to the count function. This statement will return the number of rows in the
employees table.
Review Exercises
1. Select the maximum price of any item ordered in the items_ordered table. Hint: Select the
maximum price only.
2. Select the average price of all of the items ordered that were purchased in the month of
Dec.
3. What is the total number of rows in the items_ordered table?
4. For all of the tents that were ordered in the items_ordered table, what is the price of the
lowest tent? Hint: Your query should return the price only.
Exercise #3
SELECT count(*)
FROM items_ordered;
Exercise #4
SELECT min(price) FROM items_ordered WHERE item = 'Tent';
GROUP BY clause
The GROUP BY clause will gather all of the rows together that contain data in the specified
column(s) and will allow aggregate functions to be performed on the one or more columns. This
can best be explained by an example:
GROUP BY clause syntax:
SELECT column1,
SUM(column2)
FROM "list-of-tables"
GROUP BY "column-list";
Let's say you would like to retrieve a list of the highest paid salaries in each dept:
SELECT max(salary), dept
FROM employee
GROUP BY dept;
This statement will select the maximum salary for the people in each unique department.
Basically, the salary for the person who makes the most in each department will be displayed.
Their, salary and their department will be returned.
Multiple Grouping Columns - What if I wanted to display their lastname too?
For example, take a look at the items_ordered table. Let's say you want to group everything of
quantity 1 together, everything of quantity 2 together, everything of quantity 3 together, etc. If
you would like to determine what the largest cost item is for each grouped quantity (all quantity
1's, all quantity 2's, all quantity 3's, etc.), you would enter:
SELECT quantity, max(price)
FROM items_ordered
GROUP BY quantity;
Enter the statement in above, and take a look at the results to see if it returned what you were
expecting. Verify that the maximum price in each Quantity Group is really the maximum price.
Review Exercises
1. How many people are in each unique state in the customers table? Select the state and
display the number of people in each. Hint: count is used to count rows in a
column, sum works on numeric data only.
2. From the items_ordered table, select the item, maximum price, and minimum price for
each specific item in the table. Hint: The items will need to be broken up into separate
groups.
3. How many orders did each customer make? Use the items_ordered table. Select the
customerid, number of orders they made, and the sum of their orders. Click the Group By
answers link below if you have any problems.
HAVING clause
The HAVING clause allows you to specify conditions on the rows for each group - in other
words, which rows should be selected will be based on the conditions you specify. The HAVING
clause should follow the GROUP BY clause if you are going to use it.
HAVING clause syntax:
SELECT column1,
SUM(column2)
FROM "list-of-tables"
GROUP BY "column-list"
HAVING "condition";
HAVING can best be described by example. Let's say you have an employee table containing the
employee's name, department, salary, and age. If you would like to select the average salary for
each employee in each department, you could enter:
SELECT dept, avg(salary)
FROM employee
GROUP BY dept;
But, let's say that you want to ONLY calculate & display the average if their salary is over
20000:
SELECT dept, avg(salary)
FROM employee
GROUP BY dept
HAVING avg(salary) > 20000;
Review Exercises (note: yes, they are similar to the group by exercises, but these
contain the HAVING clause requirements)
1. How many people are in each unique state in the customers table that have more than one
person in the state? Select the state and display the number of how many people are in
each if it's greater than 1.
2. From the items_ordered table, select the item, maximum price, and minimum price for
each specific item in the table. Only display the results if the maximum price for one of
the items is greater than 190.00.
3. How many orders did each customer make? Use the items_ordered table. Select the
customerid, number of orders they made, and the sum of their orders if they purchased
more than 1 item.
Click the HAVING exercise answers link below if you have any problems.
Exercise #3
SELECT customerid, count(customerid), sum(price)
FROM items_ordered
GROUP BY customerid
HAVING count(customerid) > 1;
ORDER BY clause
ORDER BY is an optional clause which will allow you to display the results of your query in a
sorted order (either ascending order or descending order) based on the columns that you specify
to order by.
ORDER BY clause syntax:
For example:
SELECT employee_id, dept, name, age, salary FROM employee_info WHERE dept = 'Sales'
ORDER BY salary;
If you would like to order based on multiple columns, you must seperate the columns with
commas. For example:
SELECT employee_id, dept, name, age, salary
FROM employee_info
WHERE dept = 'Sales'
ORDER BY salary, age DESC;
Review Exercises
1. Select the lastname, firstname, and city for all customers in the customers table. Display
the results in Ascending Order based on the lastname.
2. Same thing as exercise #1, but display the results in Descending order.
3. Select the item and price for all of the items in the items_ordered table that the price is
greater than 10.00. Display the results in Ascending order based on the price.
Exercise #3
SELECT item, price
FROM items_ordered
WHERE price > 10.00
ORDER BY price ASC;
The OR operator can be used to join two or more conditions in the WHERE clause also.
However, either side of the OR operator can be true and the condition will be met - hence, the
rows will be displayed. With the OR operator, either side can be true or both sides can be true.
For example:
SELECT employeeid, firstname, lastname, title, salary
FROM employee_info
This statement will select the employeeid, firstname, lastname, title, and salary from the
employee_info table where the salary is greater than or equal to 50000.00 AND the title is equal
to 'Programmer'. Both of these conditions must be true in order for the rows to be returned in the
query. If either is false, then it will not be displayed.
Although they are not required, you can use paranthesis around your conditional expressions to
make it easier to read:
SELECT employeeid, firstname, lastname, title, salary
FROM employee_info
WHERE (salary >= 45000.00) AND (title = 'Programmer');
Another Example:
SELECT firstname, lastname, title, salary FROM employee_info WHERE (title = 'Sales') OR
(title = 'Programmer');
This statement will select the firstname, lastname, title, and salary from the employee_info table
where the title is either equal to 'Sales' OR the title is equal to 'Programmer'.
Review Exercises
1. Select the customerid, order_date, and item from the items_ordered table for all items
unless they are 'Snow Shoes' or if they are 'Ear Muffs'. Display the rows as long as they
are not either of these two items.
2. Select the item and price of all items that start with the letters 'S', 'P', or 'F'.
IN & BETWEEN
SELECT col1, SUM(col2)
FROM "list-of-tables"
WHERE col3 IN
(list-of-values);
SELECT col1, SUM(col2)
FROM "list-of-tables"
WHERE col3 BETWEEN value1
AND value2;
The IN conditional operator is really a set membership test operator. That is, it is used to test
whether or not a value (stated before the keyword IN) is "in" the list of values provided after the
keyword IN.
For example:
SELECT employeeid, lastname, salary
FROM employee_info
WHERE lastname IN ('Hernandez', 'Jones', 'Roberts', 'Ruiz');
This statement will select the employeeid, lastname, salary from the employee_info table where
the lastname is equal to either: Hernandez, Jones, Roberts, or Ruiz. It will return the rows if it is
ANY of these values.
The IN conditional operator can be rewritten by using compound conditions using the equals
operator and combining it with OR - with exact same output results:
SELECT employeeid, lastname, salary
FROM employee_info
WHERE lastname = 'Hernandez' OR lastname = 'Jones' OR lastname = 'Roberts'
OR lastname = 'Ruiz';
As you can see, the IN operator is much shorter and easier to read when you are testing for more
than two or three values.
You can also use NOT IN to exclude the rows in your list.
The BETWEEN conditional operator is used to test to see whether or not a value (stated before
the keyword BETWEEN) is "between" the two values stated after the keyword BETWEEN.
For example:
SELECT employeeid, age, lastname, salary
FROM employee_info
WHERE age BETWEEN 30 AND 40;
This statement will select the employeeid, age, lastname, and salary from the employee_info
table where the age is between 30 and 40 (including 30 and 40).
This statement can also be rewritten without the BETWEEN operator:
SELECT employeeid, age, lastname, salary
FROM employee_info
WHERE age >= 30 AND age <= 40;
You can also use NOT BETWEEN to exclude the values between your range.
Review Exercises
1. Select the date, item, and price from the items_ordered table for all of the rows that have
a price value ranging from 10.00 to 80.00.
2. Select the firstname, city, and state from the customers table for all of the rows where the
state value is either: Arizona, Washington, Oklahoma, Colorado, or Hawaii.
Mathematical Functions
Standard ANSI SQL-92 supports the following first four basic arithmetic operators:
+
addition
subtraction
multiplication
division
modulo
The modulo operator determines the integer remainder of the division. This operator is not ANSI
SQL supported, however, most databases support it. The following are some more useful
mathematical functions to be aware of since you might need them. These functions are not
standard in the ANSI SQL-92 specs, therefore they may or may not be available on the specific
RDBMS that you are using. However, they were available on several major database systems
that I tested. They WILL work on this tutorial.
ABS(x)
SIGN(x)
MOD(x,y)
FLOOR(x)
CEILING(x) or
returns the smallest integer value that is greater than or equal to x
CEIL(x)
POWER(x,y)
ROUND(x)
ROUND(x,d)
returns the value of x rounded to the number of decimal places specified by the
value d
SQRT(x)
For example:
SELECT round(salary), firstname
FROM employee_info
This statement will select the salary rounded to the nearest whole value and the firstname from
the employee_info table.
Review Exercises
1. Select the item and per unit price for each item in the items_ordered table. Hint: Divide
the price by the quantity.
All of the queries up until this point have been useful with the exception of one major limitation that is, you've been selecting from only one table at a time with your SELECT statement. It is
time to introduce you to one of the most beneficial features of SQL & relational database
systems - the "Join". To put it simply, the "Join" makes relational database systems "relational".
Joins allow you to link data from two or more tables together into a single query result--from one
single SELECT statement.
A "Join" can be recognized in a SQL SELECT statement if it has more than one table after the
FROM keyword.
For example:
SELECT "list-of-columns"
FROM table1,table2
WHERE "search-condition(s)"
Joins can be explained easier by demonstrating what would happen if you worked with one table
only, and didn't have the ability to use "joins". This single table database is also sometimes
referred to as a "flat table". Let's say you have a one-table database that is used to keep track of
all of your customers and what they purchase from your store:
Id
first
last
address
city
state
zip
date
item
Price
Everytime a new row is inserted into the table, all columns will be be updated, thus resulting in
unnecessary "redundant data". For example, every time Wolfgang Schultz purchases something,
the following rows will be inserted into the table:
Id
first
last
address
city
state
zip
date
item
price
10982
Wolfgang
Schultz
Yuma
AZ
85002
032299
snowboard
45.00
10982
Wolfgang
Schultz
Yuma
AZ
85002
082899
snow shovel
35.00
10982
Wolfgang
Schultz
Yuma
AZ
85002
091199
gloves
15.00
10982
Wolfgang
Schultz
Yuma
AZ
85002
100999
lantern
35.00
10982
Wolfgang
Schultz
Yuma
AZ
85002
022900
tent
85.00
firstname
lastname
address
City
state
zip
"Purchases" table:
customer_number
date
item
price
Now, whenever a purchase is made from a repeating customer, the 2nd table, "Purchases" only
needs to be updated! We've just eliminated useless redundant data, that is, we've
just normalized this database!
Notice how each of the tables have a common "cusomer_number" column. This column, which
contains the unique customer number will be used to JOIN the two tables. Using the two new
tables, let's say you would like to select the customer's name, and items they've purchased. Here
is an example of a join statement to accomplish this:
SELECT customer_info.firstname, customer_info.lastname, purchases.item
FROM customer_info, purchases
WHERE customer_info.customer_number = purchases.customer_number;
This particular "Join" is known as an "Inner Join" or "Equijoin". This is the most common type
of "Join" that you will see or use.
Notice that each of the columns are always preceded with the table name and a period. This isn't
always required; however, it is good practice so that you wont confuse which columns go with
what tables. It is required if the name column names are the same between the two tables. I
recommend preceding all of your columns with the table names when using joins.
Note: The syntax described above will work with most Database Systems -including the one
with this tutorial. However, in the event that this doesn't work with yours, please check
your specific database documentation.
Although the above will probably work, here is the ANSI SQL-92 syntax specification for an
Inner Join using the preceding statement above that you might want to try:
SELECT customer_info.firstname, customer_info.lastname, purchases.item
FROM customer_info INNER JOIN purchases
ON customer_info.customer_number = purchases.customer_number;
Another example:
SELECT employee_info.employeeid, employee_info.lastname, employee_sales.comission
FROM employee_info, employee_sales
WHERE employee_info.employeeid = employee_sales.employeeid;
This statement will select the employeeid, lastname (from the employee_info table), and the
comission value (from the employee_sales table) for all of the rows where the employeeid in the
employee_info table matches the employeeid in the employee_sales table.
Review Exercises
1. Write a query using a join to determine which items were ordered by each of the
customers in the customers table. Select the customerid, firstname, lastname, order_date,
item, and price for everything each customer purchased in the items_ordered table.
2. Repeat exercise #1, however display the results sorted by state in descending order.
SQL Interpreter
Note: This SQL Interpreter/Database on this site will only support the commands covered on this
tutorial - specifically, the SELECT statement. If you are interested in using the other SQL
commands, please go to: sqlcourse.com
This site will support all of the advanced SELECT statement options that are not supported on
the original sqlcourse.com site.
You must use the two tables provided on each of the pages to select from: