Showing posts with label SQL Tutorial - Intermediate. Show all posts
Showing posts with label SQL Tutorial - Intermediate. Show all posts

Friday, 22 June 2012

10. Table Joins in SQL (a must)

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:

idfirstlastaddresscitystatezipdateitemprice


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:

idfirstlastaddress            citystatezipdateitemprice
10982WolfgangSchultz300 N. 1st AveYumaAZ85002032299snowboard45.00
10982WolfgangSchultz300 N. 1st AveYumaAZ85002082899snow shovel35.00
10982WolfgangSchultz300 N. 1st AveYumaAZ85002091199gloves15.00
10982WolfgangSchultz300 N. 1st AveYumaAZ85002100999lantern35.00
10982WolfgangSchultz300 N. 1st AveYumaAZ85002022900tent85.00


An ideal database would have two tables:
  1. One for keeping track of your customers
  2. And the other to keep track of what they purchase:
"Customer_info" table:
customer_numberfirstnamelastnameaddresscitystatezip



"Purchases" table:
customer_numberdateitemprice


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!


Normalization:

Data Normalization is a technique of database design that is used to get the tables in your database into at least the third normal form (3NF). Basically, this means that you want to eliminate the redundancy of non-key data when constructing your tables. Each table should only have columns that depend on the primary key.



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 colums are always preceeded with the table name and a period. This isn't always required, however, it IS good practice so that you wont confuse which colums go with what tables. It is required if the name column names are the same between the two tables. I recommend preceeding 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.

9. Mathematical Functions in SQL


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)returns the absolute value of x
SIGN(x)returns the sign of input x as -1, 0, or 1 (negative, zero, or positive respectively)
MOD(x,y)modulo - returns the integer remainder of x divided by y (same as x%y)
FLOOR(x)returns the largest integer value that is less than or equal to x
CEILING(x) or CEIL(x)returns the smallest integer value that is greater than or equal to x
POWER(x,y)returns the value of x raised to the power of y
ROUND(x)returns the value of x rounded to the nearest whole integer
ROUND(x,d)returns the value of x rounded to the number of decimal places specified by the value d
SQRT(x)returns the square-root value of 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.

8. BETWEEN & NOT BETWEEN Keywords in SQL


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.

7. IN & NOT IN keywords in SQL



SELECT col1, SUM(col2)

FROM "list-of-tables"

WHERE col3 IN (list-of-values);
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.

6. Combining Conditions & Boolean Operators in SQL


The AND operator can be used to join two or more conditions in the WHERE clause. Both sides of the AND condition must be true in order for the condition to be met and for those rows to be displayed.

SELECT column1, 
SUM(column2)

FROM "list-of-tables"

WHERE "condition1" AND 
"condition2";

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

WHERE salary >= 50000.00 AND title = 'Programmer';

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 >= 50000.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'.

5. ORDER BY clause in SQL


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:

SELECT column1, SUM(column2) FROM "list-of-tables" ORDER BY "column-list" [ASC | DESC];
[ ] = optional

This statement will select the employee_id, dept, name, age, and salary from the employee_info table where the dept equals 'Sales' and will list the results in Ascending (default) order based on their Salary.

ASC = Ascending Order - default

DESC = Descending Order 

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;

4. HAVING clause in SQL


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;

3. GROUP BY clause in SQL


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?

SELECT max(salary), dept

FROM employee

GROUP BY dept;


What you'll need to do is:


SELECT lastname, max(salary), dept
FROM employee
GROUP BY dept, lastname;



This is a called "multiple grouping columns".


2. Aggregate Functions in SQL (Min, Max, Sum, Avg, Count)



MINreturns the smallest value in a given column
MAXreturns the largest value in a given column
SUMreturns the sum of the numeric values in a given column
AVGreturns the average value of a given column
COUNTreturns the total number of values in a given column
COUNT(*)returns the number of rows in a table


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 employees whose title is equal to 'Programmer'
Example:

SELECT Count(*)

FROM employees;
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.

1.c) ALL & DISTINCT Keywords in SQL


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.

1.b) LIKE clause in SQL


Example:

SELECT name, title, dept FROM employee WHERE title LIKE 'Pro%';

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.

1.a) FROM & WHERE clause in SQL


Example:
 
SELECT name, age, salary
 
FROM employee
 
WHERE age > 50;

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
>=Greater than or equal to
<=Less than or equal to
<> or !=Not equal to
LIKEString comparison test

1. SELECT Statement in SQL


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] ]