next up previous contents index
Next: Range of Values Up: Customizing Queries Previous: Comments

    
AND/OR Usage

Until now, we have used only simple WHERE clause tests. In the following sections, we will demonstrate how to perform more complex WHERE clause testing.

Complex WHERE clause tests are done by connecting simple tests using the words AND and OR. For illustration, new people have been inserted into the friend table, as shown in Figure [*].  

        test=> DELETE FROM friend;
        DELETE 6
        test=> INSERT INTO friend
        test-> VALUES ('Dean', 'Yeager', 'Plymouth', 'MA', 24);
        INSERT 19744 1
        test=> INSERT INTO friend
        test-> VALUES ('Dick', 'Gleason', 'Ocean City', 'NJ', 19);
        INSERT 19745 1
        test=> INSERT INTO friend
        test-> VALUES ('Ned', 'Millstone', 'Cedar Creek', 'MD', 27);
        INSERT 19746 1
        test=> INSERT INTO friend
        test-> VALUES ('Sandy', 'Gleason', 'Ocean City', 'NJ', 25);
        INSERT 19747 1
        test=> INSERT INTO friend
        test-> VALUES ('Sandy', 'Weber', 'Boston', 'MA', 33);
        INSERT 19748 1
        test=> INSERT INTO friend
        test-> VALUES ('Victor', 'Tabor', 'Williamsport', 'PA', 22);
        INSERT 19749 1
        test=> SELECT * FROM friend ORDER BY firstname;
            firstname    |       lastname       |      city       | state | age 
        -----------------+----------------------+-----------------+-------+-----
         Dean            | Yeager               | Plymouth        | MA    |  24
         Dick            | Gleason              | Ocean City      | NJ    |  19
         Ned             | Millstone            | Cedar Creek     | MD    |  27
         Sandy           | Gleason              | Ocean City      | NJ    |  25
         Sandy           | Weber                | Boston          | MA    |  33
         Victor          | Tabor                | Williamsport    | PA    |  22
        (6 rows)
 

Selecting certain rows from the table will require more complex WHERE conditions. For example, if we wanted to select Sandy Gleason by name, it would be impossible using only one comparison in the WHERE clause. If we tested for firstname = 'Sandy', we would select both Sandy Gleason and Sandy Weber. If we tested for lastname = 'Gleason', we would get both Sandy Gleason and her brother Dick Gleason. The proper approach is to use AND to test both firstname and lastname. This query is shown in Figure [*].  

        test=> SELECT * FROM friend
        test-> WHERE firstname = 'Sandy' AND lastname = 'Gleason';
            firstname    |       lastname       |      city       | state | age 
        -----------------+----------------------+-----------------+-------+-----
         Sandy           | Gleason              | Ocean City      | NJ    |  25
        (1 row)
 

The AND combines the two needed comparisons.

A similar comparison could be used to select friends living in Cedar Creek, Maryland. Other friends could live in Cedar Creek, Ohio, so the comparison city = 'Cedar Creek' is not enough. The proper test is city = 'Cedar Creek' AND state = 'MD'.

Another complex test would be to select people who live in the state of New Jersey (NJ) or Pennsylvania (PA). Such a comparison requires the use of OR. The test state = 'NJ' OR state = 'PA' would return the desired rows, as shown in Figure [*].  

        test=> SELECT * FROM friend
        test-> WHERE state = 'NJ' OR state = 'PA' 
        test-> ORDER BY firstname;
            firstname    |       lastname       |      city       | state | age 
        -----------------+----------------------+-----------------+-------+-----
         Dick            | Gleason              | Ocean City      | NJ    |  19
         Sandy           | Gleason              | Ocean City      | NJ    |  25
         Victor          | Tabor                | Williamsport    | PA    |  22
        (3 rows)
 

An unlimited number of AND and OR clauses can be linked together to perform complex comparisons. When ANDs are linked with other ANDs, there is no possibility for confusion. The same is true of ORs. On the other hand, when ANDs and ORs are both used in the same query, the results can be confusing. Figure [*] shows such a case.  

        test=> SELECT * FROM friend
        test-> WHERE firstname = 'Victor' AND state = 'PA' OR state = 'NJ'
        test-> ORDER BY firstname;
            firstname    |       lastname       |      city       | state | age 
        -----------------+----------------------+-----------------+-------+-----
         Dick            | Gleason              | Ocean City      | NJ    |  19
         Sandy           | Gleason              | Ocean City      | NJ    |  25
         Victor          | Tabor                | Williamsport    | PA    |  22
        (3 rows)
 

You might suspect that it would return rows with firstname equal to Victor and state equal to PA or NJ. In fact, the query returns rows with firstname equal to Victor and state equal to PA, or state equal to NJ. In this case, the AND is evaluated first, then the OR. When mixing ANDs and ORs, it is best to collect the ANDs and ORs into common groups using parentheses. Figure [*] shows the proper way to enter this query.  

        test=> SELECT * FROM friend
        test-> WHERE firstname = 'Victor' AND (state = 'PA' OR state = 'NJ')
        test-> ORDER BY firstname;
            firstname    |       lastname       |      city       | state | age 
        -----------------+----------------------+-----------------+-------+-----
         Victor          | Tabor                | Williamsport    | PA    |  22
        (1 row)
 

Without parentheses, it is very difficult to understand a query with mixed ANDs and ORs.    

 
Table: Comparison operators
Comparison Operator 
less than <
less than or equal <=
equal =
greater than or equal >=
greater than >
not equal <> or !=



next up previous contents index
Next: Range of Values Up: Customizing Queries Previous: Comments
Bruce Momjian
2001-05-09