为何需要过滤数据?
select关键字查询数据,可以指定所需要查询的列(*表示查询所有列),但查询结果将会包括所有的行。在数据库中,一张数据表(table)可能会包含数百万行之多,这之中有很多数据往往我们并不需要,因此需要对数据添加条件筛选。
SQL如何实现过滤?
在 SELECT 语句中,数据根据 WHERE 子句中指定的搜索条件进行过滤。 WHERE 子句在表名(FROM 子句)之后给出。
例:查询Products表中,生产价格(prod_price)为3.49的数据
SELECT prod_name, prod_price FROM Products WHERE prod_price = 3.49;
注:WHERE后跟条件,表示需要满足价格=3.49,在相等的时,注意该列的数据类型,prod_price数据是数值形型,因此等号后面直接跟数字即可。
例2:查询Products表中,生产名称(prod_name)为“milk”的数据。
SELECT prod_name, prod_price FROM Products WHERE prod_name = 'milk';
注:
1.WHERE后跟条件,表示需要名称=milk,在相等的时,注意该列的数据类型,prod_name数据是字符串类型,因此等号后面直接跟字符串,不能跟数字。
2.SQL中用英文单引号扩起来表示字符串,字符串内可以随便写,如;'123'、'abcd'、'1@3'、'牛奶111111' 等,都是字符串
3.SQL中的分号、引号等必须采用英文状态标点符号,区别中文和英文符号等区别在于中文字符更宽,因此中文字符又称为全角字符,英文字符称为半角字符。如;(中)和;(英)、‘’(中)和''(英)
如何进行其他条件筛选?
在实际应用中,我们可能还需要查询大于某个值或不等于某个值的条件,对于不同条件,where后跟不同条件即可,where后支持的条件如下。
例:查询价格小于10的数据
SELECT prod_name, prod_price FROM Products WHERE prod_price < 10;
例2:查询有不是供应商 DLL01 制造的产品:
SELECT vend_id, prod_name FROM Products WHERE vend_id <> 'DLL01';
如何筛选多个条件(AND关键字)?
实际应用中,我们往往需要筛选多个条件,and关键字用来解决此类问题。
例:查询价格10-20的数据
SELECT prod_name, prod_price FROM Products
WHERE prod_price >= 10 AND prod_price <= 20;
例2:查询名称为牛奶,并且价格大于10的数据
SELECT prod_name, prod_price FROM Products
WHERE prod_name = '牛奶' AND prod_price >= 10;
例3:查询名称为牛奶,并且价格在10-20之间的数据
SELECT prod_name, prod_price FROM Products
WHERE prod_name = '牛奶' AND prod_price >= 10 AND prod_price <= 20;
注:如果需要更多条件,继续增加AND即可。
如何筛选多个条件(OR关键字)?
AND连接的条件表示,需要同时满足。OR连接到条件,需要满足一个即可。
例:查询价格小于10或者,大于20的数据
SELECT prod_name, prod_price FROM Products
WHERE prod_price < 10 OR prod_price > 20;
例2:查询名称为牛奶,或者价格小于10或者,价格大于20的数据
SELECT prod_name, prod_price FROM Products
WHERE prod_name = '牛奶' OR prod_price < 10 OR prod_price > 20;
注:如果需要更多条件,继续增加OR即可。
AND和OR关键字能一起用吗?
可以一起使用。AND表示与的关系,OR表示或的关系,但一起使用往往会导致逻辑复杂,往往会采用IN关键字代替OR。
例:查询价格等于10的牛奶或价格等于20的牛奶。
写法1:
SELECT prod_name, prod_price FROM Products
WHERE (prod_name = '牛奶' AND prod_price = 10) OR (prod_name = '牛奶' AND prod_price = 20)
注:
1.此写法表示,查询出价格等于10的牛奶,或查询出价格等于20的牛奶,两个条件满足一个即可。
2.()必须使用英文括号,关键字(AND、OR)识别顺序和数学的运算顺序一样,有括号先算括号里面的,没有括号,从左向右识别。系统的识别顺序为:条件1(prod_name = '牛奶' AND prod_price = 10) ,条件2(prod_name = '牛奶' AND prod_price = 20),结果需要满足:条件1 OR 条件2.
写法2:
SELECT prod_name, prod_price FROM Products
WHERE prod_name = '牛奶' AND (prod_price = 10 OR prod_price = 20)
注:
1.此写法表示,查询出名称为牛奶,并且,价格等于10或价格等于20,也能查出同样的效果
2.()必须使用英文括号,关键字(AND、OR)识别顺序和数学的运算顺序一样,有括号先算括号里面的,没有括号,从左向右识别。系统的识别顺序为:条件1 prod_name = '牛奶' ,条件2(prod_price = 10 OR prod_price = 20),结果需要满足,条件1 AND 条件2
写法3:
SELECT prod_name, prod_price FROM Products
WHERE prod_name = '牛奶' AND prod_price IN (10, 20)
1.此写法表示,查询出名称为牛奶,并且,价格等于10或者20的数据,IN关键字,能够代替OR和=,prod_price IN (10, 20)代替(prod_price = 10 OR prod_price = 20),可以看出,采用IN关键字,程序阅读性更好,更容易理解。IN() 括号中的数值,可以有任意多个,如prod_price IN (10, 20, 30, 40)等价于 (prod_price = 10 OR prod_price = 20 OR prod_price = 30 OR prod_price = 40)
3.()必须使用英文括号,这个关键字(AND、IN)没有被括号括起来,因此识别顺序从左向右。系统的识别顺序为:条件1 prod_name = '牛奶' ,条件2prod_price IN (10, 20),结果需要满足,条件1 AND 条件2
如何进行空值检查?
数据库中的数据往往是不完整的,如果数据库某列的某些数据为空,数据库会标记为关键字NULL,因此为了提取有用的数据,我们往往需要筛选不为空的数据。
例:查询客户名称不为空的数据。
SELECT cust_name FROM CUSTOMERS WHERE cust_email IS NOT NULL;
例2:查询客户名称为空的数据。
SELECT cust_name FROM CUSTOMERS WHERE cust_email IS NULL;
注:NULL关键字的判定比较特殊,禁止使用=或!=判断是否为空,否则会导致数据查询错误(程序并不抱错,但是结果往往不是想要的)。
错误示范:
SELECT cust_name FROM CUSTOMERS WHERE cust_email = NULL;
SELECT cust_name FROM CUSTOMERS WHERE cust_email != NULL;
如何对筛选结果进行排序?
SQL查询过程的执行顺序是:查询->筛选->排序,因此,关键字的书写顺序往往也需要按照SELECT、WHERE、ORDER BY顺序进行,否则程序会抱错。
例:查询名称为牛奶,并且价格大于10的数据,并将结果按照价格从大到小排序。
SELECT prod_name, prod_price FROM Products
WHERE prod_name = '牛奶' AND prod_price >= 10 ORDER BY prod_price DESC;