SQL必知必会——高级数据过滤

Wesley13
• 阅读 514

1、组合where子句

为了进行更强的过滤控制,sql允许给出多个where子句,这些子句有两种使用方式,即以and子句或or子句的方式使用。

注意:
1、操作符:用来联结或改变where子句中的子句的关键字,也称为逻辑操作符

1.1、and操作符

#检索由供应商DLL01制造且价格小于等于4美元的所有产品的名称和价格;
SELECT prod_id , prod_price , prod_name
FROM products
WHERE vend_id = 'DLL01' AND prod_price <= 4 ;
1
2
3
4
1.2 、or操作符

#检索由供应商DLL01或者BRS01制造的所有产品的产品名和价格;
SELECT prod_name ,prod_price
FROM products
WHERE vend_id = 'DLL01' OR vend_id = 'BRS01' ;
1
2
3
4
1.3、求值顺序

列出价格为10美元及以上,且有DLL01或BSR01制造的产品。

输入:

SELECT prod_name,prod_price
FROM Products
WHERE vend_id = 'DLL01' OR vend_id = 'BRS01'
AND prod_price >= 10;
#错误
1
2
3
4
5
输出:

分析:
返回的行中由四行价格小于10美元,显然返回的行未按预期的进行过滤。原因就是AND操作符的优先级比OR操作符的优先级高,所有这里理解为:由供应商BRS01制造的价格为10美元以上的所有产品,以及由供应商制造的所有产品而且不管其价格如何。

输入:

SELECT prod_name,prod_price
FROM Products
WHERE (vend_id = 'DLL01' OR vend_id = 'BRS01')
AND prod_price >= 10;
#正确
#正确的语句和前一条的唯一差别就是,将前两个条件用圆括号括了起来
1
2
3
4
5
6
输出:

注意:
1、任何时候使用具有and和or操作符的whereziju,都应该使用圆括号明确的分组操作符。不要过分依赖默认求值顺序,即使他确实如你希望的那样。使用圆括号没有什么坏处,他能消除歧义。

2、in操作符

IN:
WHERE子句中用来指定要匹配值的清单的关键字,功能与OR相当。

SELECT prod_name,prod_price
FROM products
WHERE vend_id IN ('DLL01','BRS01')
ORDER BY prod_name ;
1
2
3
4
SELECT prod_name,prod_price
FROM products
WHERE vend_id = ’DLL01‘ OR vend_id = 'BRS01'
ORDER BY prod_name ;
1
2
3
4
为什么要使用IN操作符
1、再由很多合法选项时,IN操作符的语法更清楚,更直观。
2、在与其他AND和OR操作符组合使用IN时,求职顺序更容易管理。
3、IN操作符一般比一组OR操作符执行的更快。
4、IN的最大优点是可以包含其他SELECT语句,能够更动态的建立WHERE子句。

3、not操作符

WHERE子句中的NOT操作符由且只有一个功能,那就是否定其后所更的任何条件。

SELECT prod_name
FROM produtcts
WHERE NOT vend_id = 'dll01'
ORDER BY prod_name ;
1
2
3
4
分析:
这里的NOT否定跟在其后的条件,因此,DBMS不是匹配vend_id为DLL01,而是匹配非DLL01之外的所有东西。

#以上的例子也可以使用<>操作符来完成
SELECT prod_name
FROM Products
WHERE vend_id <> 'DLL01'
ORDER BY prod_name ;
1
2
3
4
5
分析:
为什么使用NOT?对于这里的这种简单的WHERE子句,使用NOT确实没有什么优势。但在更复杂的子句中,NOT是非常有用的。
---------------------

点赞
收藏
评论区
推荐文章
待兔 待兔
3个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Wesley13 Wesley13
3年前
SQL语句优化方式
不要使用\号进行查询操作,使用具体字段.索引在where子句和orderby涉及的字段上合理的添加索引.where子句优化避免在where子句中对null值进行判断,应对字段设置默认值Selectidfromt
Wesley13 Wesley13
3年前
SQL优化的一些实用方法
1、任何在where子句中使用isnull或isnotnull的语句优化器是不允许使用索引的。因为只有该字段中有null值,即使创建了索引其实也是没有用的,所以创建索引应该在有值的字段上创建;2、使用该sql语句将不会使用索引:select\fromemployeewherelast\_namelike‘%cliton%';
Wesley13 Wesley13
3年前
mysql——GROUP BY和HAVING
GROUPBY语法可以根据给定数据列的每个成员对查询结果进行分组统计,最终得到一个分组汇总表。select子句中的列名必须为分组列或列函数,列函数对于groupby子句定义的每个组返回一个结果。某个员工信息表结构和数据如下:  id  name  dept  salary  edlevel     hiredate   1  张
Wesley13 Wesley13
3年前
MySQL 常用30种SQL查询语句优化方法
1、应尽量避免在where子句中使用!或<操作符,否则将引擎放弃使用索引而进行全表扫描。2、对查询进行优化,应尽量避免全表扫描,首先应考虑在where及orderby涉及的列上建立索引。3、应尽量避免在where子句中对字段进行null值判断,否则将导致引擎放弃使用索引而进行全表扫描。如:selectidfromt
Wesley13 Wesley13
3年前
mysql性能优化之数据库级别优化
一 优化SELECT语句1.1WHERE子句优化  本文暂时只讨论可以处理WHERE子句的优化,下面的一些实例使用SELECT语句,但是相同的优化同样适用DELETE和UPDATE语句中的WHERE子句,同样文中有些作者也不理解的地方,希望路过的大神指教 你或许会重写你的查询来让计算操作更快,或许会牺牲一些可读性.你通常可以不用浪费这个时间,
Wesley13 Wesley13
3年前
MySQL基础命令与案列解析
SQL的基本语法规范1、sql不区分大小写,但是习惯上关键字、系统保留字、函数名称大写,表名和列名小写;2、sql使用空格或者回车来分隔每个单词都一样,习惯上每个子句换行,WHERE子句中的每个条件占一行,子查询单独占一行;3、复杂的语句最好加上注释进行说明;4、sql语句中使用分号作为分隔符,系统读取到分号才会执行语句。
小万哥 小万哥
11个月前
SQL DELETE 语句:删除表中记录的语法和示例,以及 SQL SELECT TOP、LIMIT、FETCH FIRST 或 ROWNUM 子句的使用
SQLDELETE语句SQLDELETE语句用于删除表中的现有记录。DELETE语法sqlDELETEFROM表名WHERE条件;注意:在删除表中的记录时要小心!请注意DELETE语句中的WHERE子句。WHERE子句指定应删除哪些记录。如果省略WHERE
小万哥 小万哥
11个月前
SQL 中的运算符与别名:使用示例和语法详解
SQL中的IN运算符IN运算符允许您在WHERE子句中指定多个值,它是多个OR条件的简写。示例:获取您自己的SQLServer返回所有来自'Germany'、'France'或'UK'的客户:sqlSELECTFROMCustomersWHERECount
小万哥 小万哥
11个月前
SQL HAVING 子句详解:在 GROUP BY 中更灵活的条件筛选
SQLHAVING子句HAVING子句被添加到SQL中,因为WHERE关键字不能与聚合函数一起使用。HAVING语法sqlSELECTcolumnname(s)FROMtablenameWHEREconditionGROUPBYcolumnname(s)H