Drill down to specifically explain NULL in SQL

Source: Internet
Author: User
Tags case statement

NULL in the computer and programming world represents an unknown, indeterminate. Although the Chinese translation is empty, this empty (null) is not Pethin (empty). Null represents an unknown state. In the future, I don't know how much money I have in the Fangxiaoming pocket, but I'm not sure if it's 0, then NULL is used in the computer to represent the unknown and indeterminate.

Although the person who is proficient in SQL will not have any questions about NULL, but the very whole article is very difficult to find, see an English version, feel good.

Tony Hoare invented the null reference in 1965 and felt it was "a billions of dollar mistake" he had made. Even today, 50 years later, a null value in SQL is the culprit for many common mistakes.

Let's look at the most shocking cases together.

Null does not support size/equality inference

The following 2 queries, regardless of users how many records are in the table, return a record of 0 rows:

select * from users where deleted_at = null;

–result:0 rows

select * from users where deleted_at != null;

–result:0 rows

How could it be like this? All because null it is a type that represents an "unknown". Other words. It is meaningless to compare the other values with the regular comparison operator (normal conditional operators) null . Nullnor is it equal Null to (Approximate understanding: An unknown value cannot be equal to an unknown value.) The relationship between the two is also unknown. Otherwise the math and logic will be messed up).

Note : The following SQL is suitable for MySQL, assuming Oracle, you need to add ... from dual;

select null > 0;

–result:null

select null < 0;

–result:null

select null = 0;

–result:null

select null = null;

–result:null

select null != null;

–result:null

The correct way to compare a value to another null is to use is keyword, as well as the is not operator:

select * from userswhere deleted_at is null;

–result: All users who have not been deleted

select * from userswhere deleted_at is not null;

–result: Users who are all marked for deletion

Suppose you want to infer that the values of two columns are not the same, you can use is distinct from :

select * from userswhere has_address is distinct from has_photo

–result: Address or photograph (photo) Only one of the users

Not in and Null

Sub-query (subselect) is a very convenient way to filter data. For example, if you want to query a user who doesn't have any packages, you can write a query like this:

select * from users where id not in (select user_id from packages)

But at this point, if there packages is a row in the table user_id null . Here's the problem: The return result is empty! To understand why this weird thing happens, we need to understand what the SQL compiler is doing. The following is a simpler example of a demo:

select * from users where id not in (1, 2, null)

This SQL statement will be converted to:

select * from users where id != 1 and id != 2 and id != null

We know. id != nullThe result is an unknown value null . The random values and the results of the null and operation are null , therefore, equivalent to no other conditions. The reason for such a result is that null the logical value is not true .

If the condition is reversed, the query results will be no problem. We now look for users with a package.

select * from users where id in (select user_id from packages)

The same we can use simple examples:

select * from users where id in (1, 2, null)

This SQL is converted to:

select * from users where id = 1 or id = 2 or id = null

Because the where clause is a string of or conditions, one of the results is null irrelevant. The non-True (non-true) value does not affect the results of the other parts of the clause, which is equivalent to being ignored.

Null and sort

When sorting, null values are thought to be the largest. When sorting in descending order (descending) This will make you very big, because the null value is first.

The following query is to show the rank of the user based on the score, but it ranks the user without scoring to the front!

select name, pointsfrom usersorder by 2 desc;

–points null records are queued before all records!

There are two ways to solve this kind of problem.

The simplest is to use coalesce to eliminate the effect of NULL:

– Convert null to 0 on output:

select name, coalesce(points, 0)from usersorder by 2 desc;

– The output retains null, but is converted to 0 when sorted:

select name, pointsfrom usersorder by coalesce(points, 0) desc;

Another way to do this is to have the database support, specifying whether the null value is placed first or last in the sort order:

select name, coalesce(points, 0)from usersorder by 2 desc nulls last;

Of course, NULL can also be used to prevent errors, such as dealing with a 0-divisor math error.

be removed by 0

A divisor of 0 is a very egg-painfull error. Yesterday also executed a good SQL. All of a sudden it was 0 apart and suddenly it went wrong. A frequently used workaround is to use the case statement to infer whether the denominator (denominator) is 0 and then divide.

select case when num_users = 0 then 0 else total_sales/num_users end;

The way the case statement is actually very ugly, and the denominator is reused.

Assuming that the simple case is OK, assuming that the denominator is a very complex expression, then the tragedy comes: very difficult to read, very difficult to maintain and change, accidentally is a bunch of bugs.

At this time we can look at null the advantages. Use nullif to make the denominator 0 o'clock null . This will no longer cause an error, and the num_users = 0 returned result becomes null.

select total_sales/nullif(num_users, 0);

nullifis to convert the other values to NULL, while Oracle nvl converts null to a different value.

Suppose you do not want NULL, but instead want to convert to 0 or another number, you can use the function on the basis of the previous SQL coalesce :

select coalesce(total_sales/nullif(num_users, 0), 0);

Null and then convert back to 0

Conclusion

Tony Hoare may regret his mistake, but at least the null problem is very easy to conquer. So go and practice the new big tricks now. From this null dug out of the void Big Pit (nullifying)!

Original link: Understanding SQL ' s Null

Original date: March 17, 2015

Translation Date: March 18, 2015

Translators: Anchor Http://blog.csdn.net/renfufei

Drill down to specifically explain NULL in SQL

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.