【SQL必知必会】学习笔记day2

第五章-第八章

第五章 排序检索数据

本章将讲授如何使用SELECT语句的ORDER BY子句,根据需要排序检索出的数据。

排序数据

为了明确地排序用SELECT语句检索出的数据,可使用ORDER BY子句。ORDER BY子句取一个或多个列的名字,据此对输出进行排序。

请看下面的例子:

SELECT prod_name
FROM products
ORDER BY prod_name;
排序结果.png

分析:这条语句除了指示MySQL对prod_name列以字母顺序排序数据的ORDER BY字句外,与前面的语句相同。

多个列排序
为了按多个列排序,只要指定列名,列名之间用逗号分开即可(就像选择多个列时所做的那样)。

例子如下:

SELECT prod_id,prod_price,prod_name
FROM products
ORDER BY prod_price,prod_name;
多列排序结果.png

分析:在按多个列排序时,排序完全按所规定的顺序进行。对于上述例子中的输出,仅在多个行具有相同的prod_price值时才对产品按prod_name进行排序。如果prod_price列中所有的值都是唯一的,则不会按prod_name排序。

指定方向排序

数据排序不限定于升序排序(从A到Z)。这只是默认的顺序,还可以使用ORDER BY字句以降序(从Z到A)顺序排序。为了进行降序排序,必须制定DESC关键字。

下面的例子按价格以降序排序产品(最贵的排在最前面):

SELECT prod_id,prod_price,prod_name
FROM products
ORDER BY prod_price DESC;
价格降序.png

如果对多个列排序 (最贵的排在前,然后再对产品名字排序)

SELECT prod_id,prod_price,prod_name
FROM products
ORDER BY prod_price DESC,prod_name;
多列排序.png

分析:DESC关键字只应用到直接位于其前面的列名。上述例子中只对prod_price列指定DESC,对prod_name列不指定。因此,prod_price以降序排序,而prod_name仍按默认的升序排序。

与DESC相反的关键字是升序ASC(ASCENDING),在升序排序时可以指定它。但实际上,ASC没有多大用处,因为升序是默认的(如果既不指定ASC也不指定DESC,则假定为ASC)。

第五章小结:

本章学习了如何用SELECT语句的ORDER BY子句对检索出的数据进行排序。这个子句必须是SELECT语句中的最后一条子句。可根据需要,利用它在一个或多个列上对数据进行排序。

第六章 过滤数据

使用WHERE子句

在SELECT语句中,数据根据WHERE子句中指定的搜索条件过滤数据。

SELECT prod_name,prod_price
FROM products
WHERE prod_price = 2.50;
过滤结果.png

WHERE子句的操作符

操作符 说明
= 等于
<> 不等于
!= 不等于
< 小于
<= 小于等于
> 大于
> = 大于等于
BETWEEN 在指定的两个值之间

不匹配检查

SELECT vend_id,prod_name
FROM products
WHERE vend_id <>1003;
不匹配检查结果.png

空值检查

SELECT语句有一个特殊的WHERE子句,可用来检查具有NULL值的列。这个WHERE子句就是IS NULL子句。

SELECT cust_id
FROM  customers
WHERE cust_email IS NULL;
结果.png

第六章小结

本章介绍了如何用SELECT语句的WHERE子句过滤返回的数据。我们学习了如何对相等、不相等、大于、小于、值的范围以及NULL值等进行测试。

第七章 数据过滤

AND操作符

为了通过不止一个列进行过滤,可使用AND操作符给WHERE子句附加条件。

SELECT prod_id,prod_price,prod_name
FROM products
WHERE vend_id = 1003 AND prod_price <= 10;

AND筛选结果.png

分析:此SQL语句检索由供应商1003制造且价格小于等于10美元的所有产品的名称和价格。
这条SELECT语句中的WHERE子句包含两个条件,并且用AND关键字联结它们。AND指示DBMS只返回满足所有给定条件的行。

OR操作符

OR操作符与AND操作符不同,它指示MySQL检索匹配任一条件的行。

SELECT prod_id,prod_price,prod_name
FROM products
WHERE vend_id = 1002 OR vend_id = 1003;

OR检索结果.png

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

计算次序

WHERE可包含任意数目的AND和OR操作符。允许两者结合以进行复杂和高级的过滤。

假如需要列出价格为10美元(含)以上且由1002或1003制造的所有产品。

SELECT prod_id,prod_price,prod_name
FROM products
WHERE (vend_id = 1002 OR vend_id = 1003) AND prod_price >= 10;
复杂筛选.png

分析:这条SELECT语句与前一条的唯一差别是,这条语句中,前两个条件用圆括号括了起来。因为圆括号具有较AND或OR操作符高的计算次序,DBMS首先过滤圆括号内的OR条件。

IN操作符

IN操作符用来指定条件范围,范围中的每个条件都可以进行匹配。IN取合法值的由逗号分隔的清单,全都括在圆括号中。

SELECT prod_name,prod_price
FROM products
WHERE vend_id  IN (1002,1003)
ORDER BY prod_name;

IN操作结果.png

分析:此SELECT语句检索供应商1002和1003制造的所有产品。IN操作符后跟由逗号分隔的合法值清单,整个清单必须括在圆括号中。

SELECT prod_name,prod_price
FROM products
WHERE vend_id  = 1002 OR vend_id = 1003
ORDER BY prod_name;

IN和OR.png

IN操作符优点如下:
 在使用长的合法选项清单时,IN操作符的语法更清楚且更直观。
 在使用IN时,计算的次序更容易管理(因为使用的操作符更少)。
 IN操作符一般比OR操作符清单执行更快。
 IN的最大优点是可以包含其他SELECT语句,使得能够更动态地建立WHERE子句。第14章将对此进行详细介绍。

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

例子:列出除1002和1003之外的所有供应商制造的产品

SELECT prod_name,prod_price
FROM products
WHERE vend_id  NOT IN (1002,1003)
ORDER BY prod_name;
NOT.png

分析:这里的NOT否定跟在它之后的条件,因此,MySQL不是匹配1002和1003的vend_id,而是匹配1002和1003之外供应商的vend_id。

在更复杂的子句中,NOT是非常有用的。

MySQL中的NOT
MySQL支持使用NOT对IN、BETWEEN和EXISTS子句取反,这与多数其他DBMS允许使用NOT对各种条件取反有很大的差别。

第七章小结

本章讲授如何用AND和OR操作符组合成WHERE子句,而且还讲授了如何明确地管理计算的次序,如何使用IN和NOT操作符。

第八章 用通配符进行过滤

like操作符

通配符(wildcard) 用来匹配值的一部分的特殊字符。
搜索模式(search pattern)由字面值、通配符或两者组合构成的搜索条件。

为在搜索子句中使用通配符,必须使用LIKE操作符。LIKE指示MySQL,后跟的搜索模式利用通配符匹配而不是直接相等匹配进行比较。

百分号(%)通配符

最常使用的通配符是百分号(%)。

SELECT prod_id,prod_name
FROM products
WHERE prod_name  LIKE 'jet%';

LIKE和%.png

分析:此例子使用了搜索模式'jet'。在执行这条句子时,将检索任意以jet开头的词。%告诉哦MySQL接受jet之后的任意字符,不管它有多少字符。

通配符可在搜索模式中任意位置使用,并且可以使用多个通配符。下面的例子使用两个通配符,它们位于模式的两端:

SELECT prod_id,prod_name
FROM products
WHERE prod_name  LIKE '%anvil%';

任意字符匹配.png

分析:搜索模式 '%anvil%'表示匹配任何位置包含文本anvil的值,而不论它之前或之后出现什么字符。

通配符也可以出现在搜索模式的中间,虽然这样做不太有用。下面的例子找出以s起头以e结尾的所有产品:

SELECT  prod_name
FROM products
WHERE prod_name  LIKE 's%e';

请注意:除了一个或多个字符外,%还能匹配0个字符。%代表搜索模式中给定位置的0个、1个或多个字符。

下划线(_)通配符

下划线的用途与%一样,但下划线只匹配单个字符而不是多个字符。

SELECT prod_id,prod_name
FROM products
WHERE prod_name  LIKE '_ton anvil';
下划线_.png

分析:此WHERE子句中的搜索模式给出了后面跟有文本的两个通配符。结果只显示匹配搜索模式的行:第一行下划线匹配1,第二行下划线匹配2。.5 ton anvil产品没有匹配,因为搜索模式要求匹配两个通配符而不是一个。

SELECT prod_id,prod_name
FROM products
WHERE prod_name  LIKE '%ton anvil';

%匹配符.png

与%能匹配0个字符不一样,_总是匹配一个字符,不能多也不能少。

使用通配符的技巧

 不要过度使用通配符。如果其他操作符能达到相同的目的,应该使用其他操作符。
 在确实需要使用通配符时,除非绝对有必要,否则不要把它们用在搜索模式的开始处。把通
配符置于搜索模式的开始处,搜索起来是最慢的。
 仔细注意通配符的位置。如果放错地方,可能不会返回想要的数据。
总之,通配符是一种极重要和有用的搜索工具,以后我们经常会用到它。

第八章小结

本章介绍了什么是通配符以及如何在WHERE子句中使用SQL通配符,并且还说明了通配符应该细心使用,不要过度使用。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343