English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
在本教程中,您将学习如何使用IN和BETWEEN运算符并与WHERE子句一起使用。
在上一章中,我们学习了如何使用AND和OR运算符组合多个条件。但是,有时这是不够的,例如,如果您必须检查位于一个范围或一组值中的值。
这里出现了IN和BETWEEN操作符,它允许您定义一个独占范围或一组值,而不是组合单独的条件。
IN运算符是逻辑运算符,用于检查一组值中是否存在特定值。其基本语法可以通过以下方式给出:
SELECT column_list FROM table_name WHERE column_name IN (value1, value1,...);
在这里,column_list是要获取其值的数据库表的列/字段的名称,例如name,age,country等。好吧,让我们看看一些实例。
考虑我们在数据库中有一个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 الجملة ستعود فقطdept_id为1或3的雇员。
SELECT * FROM employees WHERE dept_id IN (1, 3);
بعد تنفيذ الاستعلام، ستحصل على مجموعة النتائج التالية:
+--------+--------------+------------+--------+---------+ | 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运算符,它与IN运算符完全相反。以下SQL语句将返回除dept_id除了1或3以外的所有雇员。
SELECT * FROM employees WHERE dept_id NOT IN (1, 3);
بعد تنفيذ الاستعلام، هذه المرة ستحصل على مجموعة النتائج التالية:
+--------+--------------+------------+--------+---------+ | 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 | +--------+--------------+------------+--------+---------+
إذا كانت القيمة في العمود تقع في نطاق معين، قد ترغب في اختيار سطر واحد. هذا النوع من الشروط شائع عند التعامل مع البيانات الرقمية.
لتنفيذ هذا النوع من الشروط في الاستعلام، يمكنك استخدام عمودي BETWEEN. إنه عمود منطقي، يسمح لك بتحديد النطاق الذي تريد اختباره، مثلما يلي:
SELECT column1_name, column2_name, columnN_name FROM table_name WHERE column_name BETWEEN min_value AND max_value;
لنقم بناءً علىالموظفين (employees)بناء وتنفيذ شروط النطاق على الجدول واستعلامات البحث.
التالي SQL الجملة ستعود فقطemployeesالموظفين في الجدول الذين يتراوح راتبهم بين 7000 و9000.
SELECT * FROM employees WHERE salary BETWEEN 7000 AND 9000;
بعد التنفيذ، سيحصلون على النتيجة التالية:
+--------+--------------+------------+--------+---------+ | 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 مع قيم التاريخ أو الوقت، استخدم دالة CAST لتحويل هذه القيم بشكل واضح إلى النوع البياني المطلوب للحصول على أفضل النتائج. على سبيل المثال، إذا كنت تقارن النصوص مثل “ 2016-12-31” مع DATE، فتحولها إلى DATE كما يلي:
التالي SQL الجملة اختار جميع الموظفين الذين تم توظيفهم بين 1 يناير 2006 (أي “ 2006-01-01”) و31 ديسمبر 2016 (أي “ 2016-12-31”):
SELECT * FROM employees WHERE hire_date BETWEEN CAST('2006-01-01' AS DATE) AND CAST('2016-12-31' AS DATE);
بعد تنفيذ الاستعلام، ستحصل على مجموعة النتائج التالية:
+--------+--------------+------------+--------+---------+ | 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 | +--------+--------------+------------+--------+---------+
على الرغم من أن تواريخ والرقم في النطاق هي الأكثر شيوعًا، يمكنك أيضًا إنشاء شروط للبحث في نطاق النصوص. التالي SQL الجملة اختار جميع الموظفين الذين تبدأ أسمائهم بأي حرف بين “ O” و“ Z”:
SELECT * FROM employees WHERE emp_name BETWEEN 'O' AND 'Z';
بعد التنفيذ، سيحصلون على النتيجة التالية:
+--------+--------------+------------+--------+---------+ | 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 | +--------+--------------+------------+--------+---------+