Mysql必知必会重点整理(4-10章)

chap4 检索数据

4.SELECT语句

4.1 检索单个列

SELECT prod_name FROM products;

:养成习惯,对SQL关键字用大写,对所有的列名和表名用小写

4.2 检索多个列

在SELECT关键字后给出多个列,列名之间以逗号分隔

SELECT prod_id,prod_name,prod_price FROM products;

4.3 检索所有列

在实际列名位置使用*号来达到

SELECT * FROM products;

4.4 检索不同的行

DISTINCT关键字指示MySQL只返回不同的值

SELECT DISTINCT vend_id FROM products;

4.5 限制结果

SELECT 语句返回所有匹配的行,为了返回第一行或前几行,可使用LIMIT子句

SELECT prod_name FROM products LIMIT 5;

为得到下一个5行,可使用如下语句:

SELECT prod_name FROM products LIMIT 5,5;

以上语句表示从第6行开始的下5行

**LIMIT 3,4 等同于 LIMIT 4 OFFSET 3**

4.6 使用完全限定的表名

SELECT products.prod_name FROM products;

表名也可以是完全限定的,如下所示:

SELECT products.prod_name FROM `mysql必知必会`.products;

chap 5 排序检索数据

如何使用SELECT语句的ORDER BY句子,根据需要排序检索出数据
ORDER BY 子句取一个或多个列的名字,据此对输出进行排序

5.1 排序数据

SELECT products.prod_name FROM products ORDER BY prod_name;

5.2 按多个列排序

为了按多个列排序,只要指定列名,列名之间用逗号分开即可

SELECT products.prod_id,products.prod_price,products.prod_name FROM products ORDER BY prod_price,prod_name;       **首先按价格,其次按名称排序**

在按多个列排序时,排序完全按规定的顺序进行,如上文,仅在多个行具有相同的prod_price值时才对产品按prod_name进行排序,如果prod_price值都是唯一的,则不会按prod_name进行排序

5.3 指定排序方向

5.3.1 按单列降序

DESC表明按照降序排列,按单列降序,示例如下:

SELECT products.prod_id,products.prod_price,products.prod_name FROM products ORDER BY prod_price DESC;

5.3.2 用多个列降序:

SELECT products.prod_id, products.prod_price, products.prod_name FROM products ORDER BY prod_price DESC, prod_name;

DESC关键字只应用到直接位于其前面的列名,因此上例只对prod_price进行了降序排序
如果想在多个列上进行降序排序,必须对每个列以降序排序
DES的相反为ASC即升序,升序为默认

3.3 最高或最低值查找

SELECT products.prod_price FROM products ORDER BY prod_price DESC LIMIT 1;

注:ORDER BY 子句应位于FROM子句之后,而LIMIT应位于ORDER BY之后

chap6 过滤数据

本章将讲授使用SELECT语句的WHERE子句指定搜索条件

6.1 使用WHERE子句

在SELECT语句中,数据根据WHERE子句中指定的搜索条件进行过滤
WHERE 子句在表名(FROM)之后给出

SELECT products.prod_name,products.prod_price from products WHERE prod_price=2.5;

注:在同时使用ORDER BY和WHERE子句时,应该让ORDER BY 位于WHERE 之后,否则将产生错误

6.2 WHERE子句操作符

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

6.2.1 检查单个值

SELECT products.prod_name,products.prod_price FROM products WHERE prod_name='fuses';  #单引号用来限定字符串
SELECT products.prod_name,products.prod_price FROM products WHERE prod_price<10;

6.2.2 不匹配检查

SELECT products.vend_id,products.prod_name FROM products WHERE vend_id <>1003;

6.2.3 范围值检查

检查某个范围的值,使用BETWEEN操作符

SELECT products.prod_name,products.prod_price FROM products WHERE prod_price BETWEEN 5 AND 10;

6.2.4 空值检查

SELECT products.prod_name,products.prod_price FROM products WHERE prod_price BETWEEN 5 AND 10;

chap7 数据过滤

7.1 组合WHERE子句

这些子句可以两种方式使用:以AND子句的方式或OR子句的方式使用、

7.1.1 AND操作符

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

7.1.2 OR操作符

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

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

7.1.3 计算次序

在处理OR操作符前,优先处理AND操作符,因此需要使用圆括号来解决次序问题,比较下面两个结果:

SELECT products.prod_name,products.prod_price FROM products WHERE vend_id=1002 OR vend_id=1003 AND prod_price>=10;
SELECT products.prod_name,products.prod_price FROM products WHERE (vend_id=1002 OR vend_id=1003) AND prod_price>=10;

7.2 IN操作符

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

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

7.3 NOT操作符

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

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

chap8 用通配符进行过滤

介绍什么是通配符、如何使用通配符以及怎样使用LIKE操作符进行通配搜索,以便对数据进行复杂过滤

LIKE 操作符

通配符:用来匹配值的一部分的特殊字符
通配符本身是WHERE子句中有特殊含义的字符
搜索模式:由字面值、通配符或两者组合构成的搜索条件
为在搜索子句中使用通配符,必须使用LIKE操作符。LIKE指示MySQL,后跟的搜索模式利用通配符匹配而不是直接相等匹配进行比较。

8.1 百分号(%)通配符

%:表示任何字符出现的任意次数

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

'jet%':表明接受jet之后的任意字符,不管它有多少字符
:搜索区分大小写
通配符可在搜索模式中任意位置使用,并且可以使用多个通配符

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

8.2 下划线(_)通配符

下划线只匹配单个字符而不是多个

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

chap9 用正则表达式搜索

WHERE ... REGEXP.....

9.1 正则表达式介绍

正则表达式是用来匹配文本的特殊的串。
可以从文本文件中提取电话号码,可以查找名字中间有有数字的所有文件,可以在一个文本块中找到所有重复的词,可以替换一个页面中的所有URL为实际的HTM链接。
所有种类的程序设计语言、文本编译器、操作系统等都支持正则表达式。

9.2 基本字符匹配

检索prod_name列包含文本1000的所有行:
SELECT products.prod_name FROM products WHERE prod_name REGEXP '1000' ORDER BY prod_name;
SELECT products.prod_name FROM products WHERE prod_name REGEXP '.000' ORDER BY prod_name;

.是正则表达式语言中一个特殊的字符,表示匹配任意一个字符
LIKE 与 REGEXP的区别:
LIKE 匹配整个列,而REGEXP在列值内进行匹配

9.3 进行OR匹配

为搜索两个串之一

SELECT products.prod_name FROM products WHERE prod_name REGEXP '1000|2000' ORDER BY prod_name;

|为正则表达式or的操作
两个以上的or 条件:‘1000|2000|3000’

9.4 匹配几个字符之一

如果想匹配特定的字符,可通过指定一组用[]括起来的字符来完成,[]也表示或的意思

[123]表示匹配1或2或3
SELECT products.prod_name FROM products WHERE prod_name REGEXP '[123] Ton' ORDER BY prod_name;

[]是另一种形式的OR语句
字符串的否定:[^123]为匹配除这些字符外的任意东西

9.5 匹配范围

[123456789]=[1-9]

SELECT products.prod_name FROM products WHERE prod_name REGEXP '[1-5] Ton' ORDER BY prod_name;

9.6 匹配特殊字符

9.6.1 "."匹配符

"."匹配任意字符,因此下面这个例子所有的行都被检索出来

SELECT vendors.vend_name FROM vendors WHERE vend_name REGEXP '.' ORDER BY vend_name;
9.6.2 “\”匹配符

为了匹配特殊字符,必须用“\\”为前导,\\-表示查找-,\\。表示查找.
下例为查找表中名字带.的名字按名字顺序排序

SELECT vendors.vend_name FROM vendors WHERE vend_name REGEXP '\\.' ORDER BY vend_name;

\也可以用来引用元字符(具有特殊含义的字符)
空白元字符:

元字符 说明
\\f 换页
\\n 换行
\\r 回车
\\t 制表
\\v 纵向制表

9.7 匹配字符类

字符类:

说明
[:alnum:] 任意字母和数字(同[a-zA-Z0-0])
[:alpha:] 任意字符(同[a-zA-Z])
[:blank:] 空格和制表(同[\\t])
[:cntrl:] ASCII控制字符
[:digit:] 任意数字(同[0-9])
[:graph:] 与[:print:]相同,但不包括空格
[:lower:] 任意小写字母(同[a-z])
[:print:] 任意可打印字符
[:punct:] 既不在[:alnum:]又不在[:cntrl:]中的任意字符
[:space:] 包括空格在内的任意空白字符
[:upper:] 任意大写字母(同[A-Z])
[:xdigit:] 任意十六进制数字(同[a-fA-F0-9])

9.8 匹配多个实例

使用重复元字符来实现多次出现的匹配
下表:重复元字符

元字符 说明
* 0个或多个匹配
+ 1个或多个匹配 (等于{1,})
? 0个或1个匹配 (等于{0,1})
{n} 指定数目的匹配
{n,} 不少于指定数目的匹配
{n,m} 匹配数目的范围(m不超过255)

元字符?举例

SELECT products.prod_name FROM products WHERE prod_name REGEXP '\\([0-9] sticks?\\)' ORDER BY prod_name;
sticks?表示:匹配stick和sticks; ?表示匹配它前面任何字符的0次或1次出现

字符类[:digit:]举例:匹配任意数字

{4}:指定匹配为4位数

SELECT products.prod_name FROM products WHERE prod_name REGEXP '[[:digit:]]{4}' ORDER BY prod_name;  #表明匹配连在一起的任意4位数字
代码同:
SELECT products.prod_name FROM products WHERE prod_name REGEXP '[0-9][0-9][0-9][0-9]' ORDER BY prod_name;

9.9 定位符

目前为止的所有例子都是匹配一个串中任意位置的文本,为了匹配特定位置的文本,需要使用定位符。
表:定位元字符

元字符 说明
^ 文本的开始
$ 文本的结尾
[[:<:]] 词的开始
[[:>:]] 词的结尾

举例:

SELECT products.prod_name FROM products WHERE prod_name REGEXP '^[0-9\\.]' ORDER BY prod_name;    #找出以一个数(包括小数点开始的数)开始的所有产品

chap10 创建计算字段

10.1 计算字段定义

需要直接从数据库中检索出转换、计算或格式化过的数据;而不是检索出数据,然后再在客户机应用程序或报告程序中重新格式化

10.2 拼接字段

使用Concat()函数
拼接(concatenate)将值接到一起构成单个值,使用联接函数来拼接两个列
举例:

SELECT CONCAT(vendors.vend_name,' (',vendors.vend_country,')') FROM vendors ORDER BY vend_name;

结果如下所示:


1.png

Concat()拼接串,即把多个串连接起来形成一个较长的串,并且用来连接多个时,中间用逗号隔开

使用RTrim()函数来删除右方多余的空格来整理数据
举例:

SELECT CONCAT(RTRIM(vendors.vend_name),'(',RTRIM(vendors.vend_country),')') FROM vendors ORDER BY vend_name;

结果如上图,与上图结果一样
:RTrim():去掉 串右边的空格
LTrim():去掉串左边的空格

10.3 使用别名

别名用AS关键字赋予
一个未命名的列不能用于客户机应用中,因为客户机没办法引用它
别名(alias)是一个字段或值的替换名
举例:将该列用别名替代

SELECT CONCAT(RTRIM(vendors.vend_name),'(',RTRIM(vendors.vend_country),')') AS vend_title FROM vendors ORDER BY vend_name; 

结果如下图所示:


2.png

10.4 执行算术计算

计算字段的另一种常见用途是对检索的数据进行算术计算
举例:

检索订单号20005中的所有物品
SELECT products.prod_id,orderitems.quantity,orderitems.item_price FROM products,orderitems WHERE order_num=20005;

结果如下图所示:


3.png

下面汇总物品的价格(单价乘以订购数量)作为新的一列,利用AS函数

SELECT products.prod_id,orderitems.quantity,orderitems.item_price,
orderitems.item_price*orderitems.quantity AS expanded_price FROM products,orderitems WHERE order_num=20005;

结果如下图:


4.png

如上图所示利用函数形成了一个新的字段

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

推荐阅读更多精彩内容