在本教程中,您將學(xué)習(xí)如何使用 IN 和 BETWEEN運(yùn)算符并與WHERE子句一起使用。
在上一章中,我們學(xué)習(xí)了如何使用AND和OR運(yùn)算符組合多個(gè)條件。但是,有時(shí)這是不夠的,例如,如果您必須檢查位于一個(gè)范圍或一組值中的值。
這里出現(xiàn)了IN和BETWEEN操作符,它允許您定義一個(gè)獨(dú)占范圍或一組值,而不是組合單獨(dú)的條件。
IN運(yùn)算符是邏輯運(yùn)算符,用于檢查一組值中是否存在特定值。 其基本語(yǔ)法可以通過(guò)以下方式給出:
SELECT column_list FROM table_name WHERE column_name IN (value1, value1,...);
在這里,column_list是要獲取其值的數(shù)據(jù)庫(kù)表的列/字段的名稱(chēng),例如name,age,country等。好吧,讓我們看看一些實(shí)例。
考慮我們?cè)跀?shù)據(jù)庫(kù)中有一個(gè)employees表,該表具有以下記錄:
+--------+--------------+------------+--------+---------+ | emp_id | emp_name | hire_date | salary | dept_id | +--------+--------------+------------+--------+---------+ | 1 | Ethan Hunt | 2001-05-01 | 5000 | 4 | | 2 | Tony Montana | 2002-07-15 | 6500 | 1 | | 3 | Sarah Connor | 2005-10-18 | 8000 | 5 | | 4 | Rick Deckard | 2007-01-03 | 7200 | 3 | | 5 | Martin Blank | 2008-06-24 | 5600 | NULL | +--------+--------------+------------+--------+---------+
以下SQL語(yǔ)句將僅返回dept_id為1或3的那些雇員。
SELECT * FROM employees WHERE dept_id IN (1, 3);
執(zhí)行查詢(xún)后,您將獲得如下結(jié)果集:
+--------+--------------+------------+--------+---------+ | emp_id | emp_name | hire_date | salary | dept_id | +--------+--------------+------------+--------+---------+ | 2 | Tony Montana | 2002-07-15 | 6500 | 1 | | 4 | Rick Deckard | 2007-01-03 | 7200 | 3 | +--------+--------------+------------+--------+---------+
同樣,您可以使用NOT IN運(yùn)算符,則該運(yùn)算符與IN運(yùn)算符完全相反。以下SQL語(yǔ)句將返回除dept_id不是1或3的那些雇員以外的所有雇員。
SELECT * FROM employees WHERE dept_id NOT IN (1, 3);
執(zhí)行查詢(xún)后,這次您將獲得如下結(jié)果集:
+--------+--------------+------------+--------+---------+ | emp_id | emp_name | hire_date | salary | dept_id | +--------+--------------+------------+--------+---------+ | 1 | Ethan Hunt | 2001-05-01 | 5000 | 4 | | 3 | Sarah Connor | 2005-10-18 | 8000 | 5 | +--------+--------------+------------+--------+---------+
如果列中的值落在特定范圍內(nèi),有時(shí)您想選擇一行。處理數(shù)字?jǐn)?shù)據(jù)時(shí),這種類(lèi)型的條件很常見(jiàn)。
要基于這種條件執(zhí)行查詢(xún),您可以利用BETWEEN運(yùn)算符。它是一個(gè)邏輯運(yùn)算符,可讓您指定要測(cè)試的范圍,如下所示:
SELECT column1_name, column2_name, columnN_name FROM table_name WHERE column_name BETWEEN min_value AND max_value;
讓我們根據(jù)雇員(employees)表上的范圍條件構(gòu)建和執(zhí)行查詢(xún)。
以下SQL語(yǔ)句將僅返回employees表中薪水在7000到9000之間的那些雇員。
SELECT * FROM employees WHERE salary BETWEEN 7000 AND 9000;
執(zhí)行后,您將獲得如下輸出:
+--------+--------------+------------+--------+---------+ | emp_id | emp_name | hire_date | salary | dept_id | +--------+--------------+------------+--------+---------+ | 3 | Sarah Connor | 2005-10-18 | 8000 | 5 | | 4 | Rick Deckard | 2007-01-03 | 7200 | 3 | +--------+--------------+------------+--------+---------+
將BETWEEN運(yùn)算符與日期或時(shí)間值一起使用時(shí),請(qǐng)使用CAST()函數(shù)將這些值顯式轉(zhuǎn)換為所需的數(shù)據(jù)類(lèi)型,以獲得最佳結(jié)果。例如,如果在與DATE的比較中使用諸如“ 2016-12-31”之類(lèi)的字符串,則將其轉(zhuǎn)換為DATE,如下所示:
以下SQL語(yǔ)句選擇2006年1月1日(即“ 2006-01-01”)至2016年12月31日(即“ 2016-12-31”)之間雇用的所有雇員:
SELECT * FROM employees WHERE hire_date BETWEEN CAST('2006-01-01' AS DATE) AND CAST('2016-12-31' AS DATE);
執(zhí)行查詢(xún)后,您將獲得如下結(jié)果集:
+--------+--------------+------------+--------+---------+ | emp_id | emp_name | hire_date | salary | dept_id | +--------+--------------+------------+--------+---------+ | 4 | Rick Deckard | 2007-01-03 | 7200 | 3 | | 5 | Martin Blank | 2008-06-24 | 5600 | NULL | +--------+--------------+------------+--------+---------+
雖然日期和數(shù)字范圍是最常見(jiàn)的,但您也可以建立條件來(lái)搜索字符串范圍。以下SQL語(yǔ)句選擇名稱(chēng)以“ O”和“ Z”之間的任何字母開(kāi)頭的所有雇員:
SELECT * FROM employees WHERE emp_name BETWEEN 'O' AND 'Z';
執(zhí)行后,您將獲得如下輸出:
+--------+--------------+------------+--------+---------+ | emp_id | emp_name | hire_date | salary | dept_id | +--------+--------------+------------+--------+---------+ | 2 | Tony Montana | 2002-07-15 | 6500 | 1 | | 3 | Sarah Connor | 2005-10-18 | 8000 | 5 | | 4 | Rick Deckard | 2007-01-03 | 7200 | 3 | +--------+--------------+------------+--------+---------+