“I saw the angel in the marble and carved until I set him free.”
- Michelangelo
The WHERE Clause here filters how many ROWS are coming back. In this example, I am asking for the report to only rows WHERE the first name is Henry.
“Write a wise saying and your name will live forever.”
- Anonymous
When you ALIAS a column, you give it a new name for the report header. A good rule of thumb is to refer to the column by the alias throughout the query. Whoever wrote the above quote was way off. "Write a wise alias and it will live until the query ends – bummer".
In the WHERE clause, if you search for Character data such as first name, you need single quotes around it. You Don’t single-quote integers.
Character data (letters) need single quotes, but you need NO Single Quotes for Integers (numbers). Remember, you never use double quotes except for aliasing.
Null values are an absence of a data value or indicate a column has no data.
NULL is a keyword that represents an unknown or non-existent value.
Null is NOT a data type or a characteristic of data.
If Null values are compressed, they occupy zero space in the row.
The above chart should help on any advanced NULL questions.
First thing you need to know about a NULL is it is unknown data. It is NOT a zero. It is missing data. Since we don’t know what is in a NULL, you can’t use an = sign. You must use IS NULL or IS NOT NULL.
If you are looking for a row that holds NULL value, you need to put ‘IS NULL’. This will only bring back the rows with a NULL value in it.
The same goes with = NOT NULL. We can’t compare a NULL with any equal sign. We can only deal with NULL values with IS NULL and IS NOT NULL.
SELECT*
FROM Student_Table
WHERE Class_Code IS NOT NULL ;
Much like before, when you want to bring back the rows that do not have NULLs in them, you put an ‘IS NOT NULL’ in the WHERE Clause.
The WHERE Clause doesn’t just deal with ‘Equals’. You can look for things that are GREATER or LESSER THAN along with asking for things that are GREATER/LESSER THAN or EQUAL to.
Notice the WHERE statement and the word AND. In this example, qualifying rows must have a Class_Code = ‘FR’ and also must have a First_Name of ‘Henry’. Notice how the WHERE and the AND clause are on their own line. Good practice!
What is going wrong here? You are using an AND to check the same column. What you are basically asking with this syntax is to see the rows that have BOTH a Grade_Pt of 3.0 and a 4.0. That is impossible, so no rows will be returned.
Notice above in the WHERE Clause we use OR. OR allows for either of the parameters to be TRUE in order for the data to qualify and return.
Notice above in the WHERE Clause we use OR. OR allows for either of the parameters to be TRUE in order for the data to qualify and return. The first example errors and is a common mistake. The second example is perfect.
This query errors! What is WRONG with this syntax? No Single quotes around SR.
Notice that AND separates two different columns. The data will come back if both are TRUE.
SELECT * FROM Student_Table
WHERE Grade_Pt = 4.0 OR Grade_Pt = 3.0
AND Class_Code = 'SR' ;
Which Seniors have a 3.0 or a 4.0 Grade_Pt average. How many rows will return?
A) 2 |
C) Error |
B) 1 |
D) 3 |
SELECT * FROM Student_Table
WHERE Grade_Pt = 4.0 OR Grade_Pt = 3.0
AND Class_Code = 'SR' ;
We had two rows return! Isn’t that a mystery? Why?
|
( ) |
|
NOT |
|
AND |
|
OR |
SELECT *
FROM Student_Table
WHERE Grade_Pt = 4.0 OR Grade_Pt = 3.0
AND Class_Code = 'SR' ;
Syntax has an ORDER OF PRECEDENCE. It will read anything with parentheses around it first. Then, it will read all the NOT statements. Next, the AND statements. FINALLY, the OR Statements. This is why the last query came out odd. Let’s fix it and bring back the right answer set.
This is the proper way of looking for rows that have both a Grade_Pt of 3.0 or 4.0 AND also having a Class_Code of ‘SR’. Only ONE row comes back. Parentheses are evaluated first, so this allows you to direct exactly what you want to work first.
Using an IN List is a great way of looking for rows that have both a Grade_Pt of 3.0 or 4.0 AND also have a Class_Code of ‘SR’. Only ONE row comes back.
The IN Statement avoids retyping the same column name separated by an OR. The IN allows you to search the same column for a list of values. Both queries above are equal, but the IN list is a nice way to keep things easy and organized.
The IN Statement avoids retyping the same column name separated by an OR. The IN allows you to search the same column for a list of values. Both queries above are equal, but the IN list is a nice way to keep things easy and organized.
The IN Statement avoids retyping the same column name separated by an OR. The IN allows you to search the same column for a list of values. This works with character data as long as you use single quotes.
“First you imitate, then you innovate.”
- Miles Davis
You can also ask to see the results that ARE NOT IN your parameter list. That requires the column name and a NOT IN. Neither the IN nor NOT IN can search for NULLs! Miles Davis got this IT quote all wrong. First you innovate, and then you sue anyone who imitates. Please make a note of it!
Few people know that when a NOT IN is used, and a null value is encountered, that no data returns. This is because a null value equals nothing so it can't compare and eliminate values.
This is a great technique to look for a NULL when using a NOT IN List.
SELECT *
FROM Student_Table
WHERE Grade_Pt BETWEEN 2.0 AND 4.0 ;
This is a BETWEEN. What this allows you to do is see if a column falls in a range. It is inclusive. In the example above, we will be getting the rows that also have a 2.0 and 4.0 in their column!
"The difference between genius and stupidity is that genius has its limits."
Albert Einstein
This is a NOT BETWEEN example. What this allows you to do is see if a column does not fall in a range. It is inclusive. In the example above, we will be getting no rows where the grade_pt is between a 2.0 and 4.0 in their column! The 2.0 and the 4.0 will also not return.
The wildcard percentage sign (%) is a wildcard for any number of characters. We are looking for anyone whose name starts with SM! In this example, the only row that would come back is ‘Smith’. The next page will show an example of underscore.
The _ underscore sign is a wildcard for any a single character. We are looking for anyone who has an 'a' as the second letter of their last name.
It is important that you know the data type of the column you are using with your LIKE command. VARCHAR and CHAR data differ slightly, but Oracle handles them both wisely.
This is a CHAR (20) data type. That means that any names under 20 characters will be padded with spaces behind them until they reach 20 characters. You will not get any rows back from this example because technically, no row ends in an ‘N’, but instead ends in a space.
SELECT *
FROMSample_Table
WHERE Column1 IS NULL
AND Column2 IS NULL ;
Which Column from the Answer Set could have a DATA TYPE of INTEGER, and which could have Character Data?
SELECT *
FROMSample_Table
WHERE Column1 IS NULL
AND Column2 IS NULL ;
All Integers will start from the right and move left. Thus, Col1 was defined during the table create statement to hold an INTEGER. The next page shows a clear example.
SELECT Employee_No, First_Name
FROM Employee_Table
WHERE Employee_No = 2000000;
All Integers will start from the right and move left. All Character data will start from the left and move to the right.
SELECT Student_ID, Last_Name
FROM Student_Table ;
This is how a standard result set will look. Notice that the integer type in Student_ID starts from the right and goes left. Character data type in Last_Name moves left to right like we are used to seeing while reading English.
Character data pads spaces to the right and Varchar uses a 2-byte VLI instead.
By using the TRIM command on the Last_Name column, you are able to trim off any spaces from the end. Once we use the TRIM on Last_Name, we have eliminated any spaces at the end, so now we are set to bring back anyone with a Last_Name that truly ends in ‘n’!
/* We just pretended to add a new row to the Student_Table */
/* Can you use the LIKE command to find S% above? */
Here you will have to utilize a Wildcard Escape Character. Turn the page for more.
Can you use the LIKE command to find S% above?
SELECT*
FROMStudent_Table
WHERE First_Name LIKE 'S@%' Escape '@';
We can pick our Escape character and we have chosen the @ sign. This turns the wildcard off for 1 character so we find ‘S%’, without bringing back Stanley or Susie.
Can you use the LIKE command to find the Last_Name of T_? (pronounced Tunderscore!)
This is a little trickier than you might think so be on your toes. . . . And get a haircut!
Can you use the LIKE command to find the Last_Name of T_? (pronounced Tunderscore!)
SELECT * FROM Student_Table
WHERE TRIM(Last_Name) LIKE 'T@_' Escape '@' ;
You didn’t really need to get a full haircut, but just a TRIM Command and the Escape!
DISTINCT eliminates duplicates from returning in the Answer Set.
Both examples produce the exact same result
Class_Code
FR
JR
SO
SR
?
Rules for Distinct Vs. GROUP BY
(1) Many Duplicates – use GROUP BY
(2) Few Duplicates – use DISTINCT
(3) Space Exceeded - use GROUP BY
Distinct and GROUP BY in the two examples return the same answer set.
How many rows will come back from the above SQL?
SELECT Distinct Class_Code, Grade_Pt
FROM Student_Table
ORDER BY Class_Code, Grade_Pt ;
How many rows will come back from the above SQL? 10. All rows came back. Why? Because there are no exact duplicates that contain a duplicate Class_Code and Duplicate Grade_Pt combined. Each row in the SELECT list is distinct.