Files
databases.softwareshinobi.com/landing/docs/SQL-101/old/006-where.md

225 lines
8.0 KiB
Markdown
Raw Normal View History

2025-03-14 16:46:19 -04:00
# WHERE
The `WHERE` clause allows you to specify different conditions so that you could filter out the data and get a specific result set.
You would add the `WHERE` clause after the `FROM` clause.
The syntax would look like this:
```sql
SELECT column_name FROM table_name WHERE column=some_value;
```
## WHERE Clause example
If we take the example `users` table from the last chapter, let's say that we wanted to get only the active users. The SQL statement would look like this:
```sql
SELECT DISTINCT username, email, activem FROM users WHERE active=true;
```
Output:
```
+----------+---------------+--------+
| username | email | active |
+----------+---------------+--------+
| bobby | b@devdojo.com | 1 |
| tony | t@devdojo.com | 1 |
+----------+---------------+--------+
```
As you can see, we are only getting `tony` and `bobby` back as their `active` column is `true` or `1`. If we wanted to get the inactive users, we would have to change the `WHERE` clause and set the `active` to `false`:
```
+----------+---------------+--------+
| username | email | active |
+----------+---------------+--------+
| devdojo | d@devdojo.com | 0 |
+----------+---------------+--------+
```
As another example, let's say that we wanted to select all users with the username `bobby`. The query, in this case, would be:
```sql
SELECT username, email, active FROM users WHERE username='bobby';
```
The output would look like this:
```
+----------+---------------+--------+
| username | email | active |
+----------+---------------+--------+
| bobby | b@devdojo.com | 1 |
| bobby | b@devdojo.com | 1 |
+----------+---------------+--------+
```
We are getting 2 entries back as we have 2 users in our database with the username `bobby`.
## Operators
In the example, we used the `=` operator, which checks if the result set matches the value that we are looking for.
A list of popular operators are:
* `!=` : Not equal operator
* `>` : Greater than
* `>=` : Greater than or equal operator
* `<` : Less than operator
* `<=` : Less than or equal operator
For more information about other available operators, make sure to check the official documentation [here](https://dev.mysql.com/doc/refman/8.0/en/non-typed-operators.html).
## AND keyword
In some cases, you might want to specify multiple criteria. For example, you might want to get all users that are active, and the username matches a specific value. This could be achieved with the `AND` keyword.
Syntax:
```sql
SELECT * FROM users WHERE username='bobby' AND active=true;
```
The result set would contain the data that matches both conditions. In our case, the output would be:
```
+----+----------+-------+----------+--------+---------------+
| id | username | about | birthday | active | email |
+----+----------+-------+----------+--------+---------------+
| 2 | bobby | NULL | NULL | 1 | b@devdojo.com |
| 5 | bobby | NULL | NULL | 1 | b@devdojo.com |
+----+----------+-------+----------+--------+---------------+
```
If we were to change the `AND` statement to `active=false`, we would not get any results back as none of the entries in our database match that condition:
```sql
SELECT * FROM users WHERE username='bobby' AND active=false;
```
```
-- Output:
Empty set (0.01 sec)
```
## OR keyword
In some cases, you might want to specify multiple criteria. For example, you might want to get all users that are active, or their username matches a specific value. This could be achieved with the `OR` keyword.
As with any other programming language, the main difference between `AND` and `OR` is that with `AND`, the result would only return the values that match the two conditions, and with `OR`, you would get a result that matches either of the conditions.
For example, if we were to run the same query as above but change the `AND` to `OR`, we would get all users that have the username `bobby` and also all users that are not active:
```sql
SELECT * FROM users WHERE username='bobby' OR active=false;
```
Output:
```
+----+----------+-------+----------+--------+---------------+
| id | username | about | birthday | active | email |
+----+----------+-------+----------+--------+---------------+
| 2 | bobby | NULL | NULL | 1 | b@devdojo.com |
| 3 | devdojo | NULL | NULL | 0 | d@devdojo.com |
| 5 | bobby | NULL | NULL | 1 | b@devdojo.com |
| 6 | devdojo | NULL | NULL | 0 | d@devdojo.com |
+----+----------+-------+----------+--------+---------------+
```
## LIKE operator
Unlike the `=` operator, the `LIKE` operator allows you to do wildcard matching similar to the `*` symbol in Linux.
For example, if you wanted to get all users that have the `y` letter in them, you would run the following:
```sql
SELECT * FROM users WHERE username LIKE '%y%';
```
Output
```
+----+----------+-------+----------+--------+---------------+
| id | username | about | birthday | active | email |
+----+----------+-------+----------+--------+---------------+
| 2 | bobby | NULL | NULL | 1 | b@devdojo.com |
| 4 | tony | NULL | NULL | 1 | t@devdojo.com |
+----+----------+-------+----------+--------+---------------+
```
As you can see, we are getting only `tony` and `bobby` but not `devdojo` as there is no `y` in `devdojo`.
This is quite handy when you are building some search functionality for your application.
# IN operator
The `IN` operator allows you to provide a list expression and would return the results that match that list of values.
For example, if you wanted to get all users that have the username `bobby` and `devdojo`, you could use the following:
```sql
SELECT * FROM users WHERE username IN ('bobby', 'devdojo');
```
Output:
```
+----+----------+-------+----------+--------+---------------+
| id | username | about | birthday | active | email |
+----+----------+-------+----------+--------+---------------+
| 2 | bobby | NULL | NULL | 1 | b@devdojo.com |
| 3 | devdojo | NULL | NULL | 0 | d@devdojo.com |
| 5 | bobby | NULL | NULL | 1 | b@devdojo.com |
| 6 | devdojo | NULL | NULL | 0 | d@devdojo.com |
+----+----------+-------+----------+--------+---------------+
```
This allows you to simplify your `WHERE` expression so that you don't have to add numerous `OR` statements.
## IS operator
If you were to run `SELECT * FROM users WHERE about=NULL;` you would get an empty result set as the `=` operator can't be used to check for NULL values. Instead, you would need to use the `IS` operator instead.
The `IS` operator is only used to check `NULL` values, and the syntax is the following:
```sql
SELECT * FROM users WHERE about IS NULL;
```
If you wanted to get the results where the value is not NULL, you just need to change `IS` to `IS NOT`:
```sql
SELECT * FROM users WHERE about IS NOT NULL;
```
## BETWEEN operator
The `BETWEEN` operator allows to select value with a given range.The values can be numbers, text, or dates.
BETWEEN operator is inclusive: begin and end values are included.
For Example if you want to select those user which have id between 3 and 6.
```sql
SELECT * FROM users WHERE id BETWEEN 3 AND 6;
```
Output:
```
+----+----------+-------+----------+--------+---------------+
| id | username | about | birthday | active | email |
+----+----------+-------+----------+--------+---------------+
| 3 | devdojo | NULL | NULL | 0 | d@devdojo.com |
| 5 | bobby | NULL | NULL | 1 | b@devdojo.com |
| 6 | devdojo | NULL | NULL | 0 | d@devdojo.com |
+----+----------+-------+----------+--------+---------------+
```
## Conclusion
In this chapter, you've learned how to use the `WHERE` clause with different operators to get different type of results based on the parameters that you provide.
In the next chapter, we will learn how to order the result set.