SQL读书笔记(二)

参考数据SQL必知必会

对于数据库来说我们可以想象,我们最需要的功能肯定是查询功能,这本书里大部分也在讲解查询功能,书上的讲解非常全面,大部分也是直接照搬过来,有些地方加点自己的理解

SELECT语句就是返回数据,无论什么时候都是返回检索的值,只要记住这点就不会,因为过长的代码而混乱

SELECT语句

检索单个列
SELECT prod_name FROM Products;

检检索多个列
SELECT prod_id, prod_name, prod_price FROM Products;

检检索所有列
SELECT * FROM Products;

检索不同的值

SELECT DISTINCT vend_id FROM Products;
不能部分使用DISTINCT DISTINCT关键字作用于所有的列,不仅仅是跟在其后的那一列。例如,你指定SELECT DISTINCT vend_id, prod_price,除非指定的两列完全相同,否则所有的行都会被检索出来。

限制结果
SELECT prod_name FROM Products LIMIT 5;

上述代码使用SELECT语句来检索单独的一列数据。LIMIT 5指示MySQL等DBMS返回不超过5行的数据。这个语句的输出参见下面的代码。 为了得到后面的5行数据,需要指定从哪儿开始以及检索的行数,像这样:

SELECT prod_name FROM Products LIMIT 5 OFFSET 5;

1、排序检索数据

SELECT prod_name FROM Products ORDER BY prod_name;
对prod_name列以字母顺序排序

ORDER BY子子句的位置句的位置 在指定一条ORDER BY子句时,应该保证它是SELECT语句中最后一条子句。如果它不是最后的子句,将会出现错误消息。

通通过非选择列进行排序 过非选择列进行排序 通常,ORDER BY子句中使用的列将是为显示而选择的列。但是,实际上并不一定要这样,用非检索的列排序数据是完全合法的。

按按多个列排序

SELECT prod_id, prod_price, prod_name FROM Products ORDER BY prod_price, prod_name;

按列位置排序

SELECT prod_id, prod_price, prod_name FROM Products ORDER BY 2, 3;

按按非选择列排序 非选择列排序 显然,当根据不出现在SELECT清单中的列进行排序时,不能采用这项技术。但是,如果有必要,可以混合匹配使用实际列名和相对列位置。

指定排序方向

SELECT prod_id, prod_price, prod_name FROM Products ORDER BY prod_price DESC;

降序排序,必须指定DESC关键字。

在多个列上降序排序 如果想在多个列上进行降序排序,必须对每一列指定DESC关键字。

2、过滤数据

SELECT prod_name, prod_price FROM Products WHERE prod_price = 3.49;

这条语句从products表中检索两个列,但不返回所有行,只返回prod_price值为3.49的行

WHERE子子句操作符

= 等于
< > 不等于
!= 不等于
< 小于
<= 小于等于
! 不小于

大于
= 大于等于
!> 不大于
BETWEEN 在指定的两个值之间
IS NULL 为NULL值

SELECT prod_name, prod_price FROM Products WHERE prod_price < 10;

范围值检查

SELECT prod_name, prod_price FROM Products WHERE prod_price BETWEEN 5 AND 10;

从这个例子可以看到,在使用BETWEEN时,必须指定两个值——所需范围的低端值和高端值。这两个值必须用AND关键字分隔。BETWEEN匹 配范围中所有的值,包括指定的开始值和结束值。

3、高级数据过滤

组合WHERE子句

SELECT prod_id, prod_price, prod_name FROM Products WHERE vend_id = ‘DLL01’ AND prod_price <= 4;

此SQL语句检索由供应商DLL01制造且价格小于等于4美元的所有产品的名称和价格。这条SELECT语句中的WHERE子句包含两个条件, 用AND关键字联结在一起。AND指示DBMS只返回满足所有给定条件的行。如果某个产品由供应商DLL01制造,但价格高于4美元,则不检索它。类似地,如果产品价格小于4美元,但不是由指定供应商制造的也不被检索。

OR操作符

SELECT prod_name, prod_price FROM Products WHERE vend_id = ‘DLL01’ OR vend_id = BRS01’;

此SQL语句检索由任一个指定供应商制造的所有产品的产品名和价格。OR操作符告诉DBMS匹配任一条件而不是同时匹配两个条件。如果这里 使用的是AND操作符,则没有数据返回(因为会创建没有匹配行的WHERE子句)

求值顺序

SELECT prod_name, prod_price FROM Products WHERE vend_id = ‘DLL01’ OR vend_id = ‘BRS01’ AND prod_price >= 10;

prod_name prod_price
——————- ———
Fish bean bag toy 3.4900
Bird bean bag toy 3.4900
Rabbit bean bag toy 3.4900
18 inch teddy bear 11.9900
Raggedy Ann 4.9900

返回的行中有4行价格小于10美元,显然,返回的行未按预期的进行过滤。为什么会这样呢?原因在于求值的顺序。 SQL(像多数语言一样)在处理OR操作符前,优先处理AND操作符。当SQL看到上述WHERE子句时,它理解为:由供应商BRS01制造的价格 为10美元以上的所有产品,以及由供应商DLL01制造的所有产品,而不管其价格如何。换句话说,由于AND在求值过程中优先级更高,操作符 被错误地组合了。 如下解决

SELECT prod_name, prod_price FROM Products WHERE (vend_id = ‘DLL01’ OR vend_id = ‘BRS01’) AND prod_price >= 10;

IN操作符

SELECT prod_name, prod_price FROM Products WHERE vend_id IN ( ‘DLL01’, ‘BRS01’ ) ORDER BY prod_name;

此SELECT语句检索由供应商DLL01和BRS01制造的所有产品。IN操作符后跟由逗号分隔的合法值,这些值必须括在圆括号中。
功能与OR一样

为什么要使用IN操作符?其优点为:
在有很多合法选项时,IN操作符的语法更清楚,更直观。 在与其他AND和OR操作符组合使用IN时,求值顺序更容易管理。 IN操作符一般比一组OR操作符执行得更快(在上面这个合法选项很少的例子中,你看不出性能差异)。 IN的最大优点是可以包含其他SELECT语句,能够更动态地建立WHERE子句。第11课会对此进行详细介绍。

NOT操作符

SELECT prod_name FROM Products WHERE NOT vend_id = ‘DLL01’ ORDER BY prod_name;

这里的NOT否定跟在其后的条件,因此,DBMS不是匹配vend_id为DLL01,而是匹配非DLL01之外的所有东西。

分析 为什么使用NOT?对于这里的这种简单的WHERE子句,使用NOT确实没有什么优势。但在更复杂的子句中,NOT是非常有用的。例如,在 与IN操作符联合使用时,NOT可以非常简单地找出与条件列表不匹配的行

5、用通配符进行过滤

LIKE操作符

百分号(%)通配符

SELECT prod_id, prod_name FROM Products WHERE prod_name LIKE ‘Fish%’;

在搜索串中,%表示任何字符出现任意次数。
此例子使用了搜索模式’Fish%’。在执行这条子句时,将检索任意以Fish起头的词。%告诉DBMS接受Fish之后的任意字符,不管它有多少字符

不要过度使用通配符。如果其他操作符能达到相同的目的,应该使用其他操作符。 在确实需要使用通配符时,也尽量不要把它们用在搜索模式的开始处。把通配符置于开始处,搜索起来是最慢的。 仔细注意通配符的位置。如果放错地方,可能不会返回想要的数据。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小疯疯0413

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值