《mysql必知必会》读书笔记(上)

mysql 必知必会

第四章

distinct
  1. 不能部分使用DISTINCT。DISTINCT关键字应用于所有列而不仅是前置它的列。就是被选中的两列要综合起来一起考虑,然后再进行去重。

  2. 案例如下。

        select *  from  message;
    

在这里插入图片描述

```shell
    select distinct from_id from  message;
```

在这里插入图片描述

```shell
    select distinct from_id,create_time from  message;
```

在这里插入图片描述

limit
  1. 检索出来的第一行为行0而不是行1。因此,LIMIT 1, 1将检索出第二行而不是第一行。

    # LIMIT 5指示MySQL返回不多于5行,LIMIT中指定要检索的行数为检索的最大行数。如果没有足够的行(例如,给出LIMIT 10, 5,但只有13行),MySQL将只返回它能返回的那么多行。
    select *  from  message limit 5;
    # LIMIT 5, 5指示MySQL返回从行5开始的5行。第一个数为开始位置,第二个数为要检索的行数
    select *  from  message limit 5,5;
    
    

第五章

order by
  1. order by 可以按照多个列进行排序
# 按其中两个列对结果进行排序——首先按价格,然后再按名称排序。
select * from table order by price,name;
# 下面的例子以降序排序产品(最贵的在最前面),然后再对产品名排序  DESC关键字只应用到直接位于其前面的列名。在上例中,只对
prod_price列指定DESC,对prod_name列不指定。因此,prod_price列以降序排序,而prod_name列(在每个价格内)仍然按标准
的升序排序。
select * from table order by price desc,name;

第六章

# 检查WHERE name=‘fuses’语句,它返回name的值为Fuses的一行。MySQL在执行匹配时默认不区分大小写,所以fuses与Fuses匹配。
select * from table where name = 'fuses';
# name不等于什么 !=
select * from table where name <> 'fuses';
# 检索价格在5美元和10美元之间的所有
select * from table where price BETWEEN 5 AND 10;
# 空值检查
select * from table where price IS NULL;

第七章

# SQL(像多数语言一样)在处理OR操作符前,优先处理AND操作符。当SQL看到上述WHERE子句时,它理解为由供应商1003制造的任何价格为10美元(含)以上的产品,或者由供应商1002制造的任何产品,而不管其价格如何
select * from product where id = 1002 or id = 1003 and price >= 10;
# 这条SELECT语句与前一条的唯一差别是,这条语句中,前两个条件用圆括号括了起来。因为圆括号具有较AND或OR操作符高的计算次序,DBMS首先过滤圆括号内的OR条件。
select * from product where (id = 1002 or id = 1003) and price >= 10;
# IN操作符用来指定条件范围,范围中的每个条件都可以进行匹配。IN取合法值的由逗号分隔的清单,全都括在圆括号中。
select * from product where id IN (1002,1003,1004);
# WHERE子句中的NOT操作符有且只有一个功能,那就是否定它之后所跟的任何条件。
# MySQL支持使用NOT对IN、BETWEEN和EXISTS子句取反
select * from product where id NOT IN (1002,1003,1004);

第八章

# 为在搜索子句中使用通配符,必须使用LIKE操作符。LIKE指示MySQL,后跟的搜索模式利用通配符匹配而不是直接相等匹配进行比较。
# 在搜索串中,%表示任何字符出现任意次数。例如,为了找出所有以词jet起头的产品,可使用以下SELECT语句:
select * from product where name LIKE 'jet%';
# 通配符可在搜索模式中任意位置使用,并且可以使用多个通配符。
# 通配符也可以出现在搜索模式的中间,虽然这样做不太有用。下面的例子找出以s起头以e结尾的所有产品:
select * from product where name LIKE 's%e';
# 除了一个或多个字符外,%还能匹配0个字符。%代表搜索模式中给定位置的0个、1个或多个字符。

# 另一个有用的通配符是下划线(_)。下划线的用途与%一样,但下划线只匹配单个字符而不是多个字符。
# 与%能匹配0个字符不一样,_总是匹配一个字符,不能多也不能少。
select * from product where name LIKE '_vil';

第九章

概念
  1. 正则表达式:正则表达式是用来匹配文本的特殊的串(字符集合)。
  2. MySQL用WHERE子句对正则表达式提供了初步的支持,允许你指定正则表达式,过滤SELECT检索出的数据。
基本字符匹配
# 这个语句告诉MySQL:REGEXP后所跟的东西作为正则表达式
# 检索列name字段值中包含文本 qhe 的所有行
select name from product where name REGEXP 'qhe' order by name;

# 这里使用了正则表达式.000。.是正则表达式语言中一个特殊的字符。它表示匹配任意一个字符,因此,1000和2000都匹配且返回。
# 检索列name字段值中包含文本*000的所有行

select name from product where name REGEXP '.000' order by name;

LIKE与REGEXP重要的差别
  • LIKE和REGEXP的不同在于,LIKE匹配整个串而REGEXP匹配子串
  • 使用like必须要使用通配符,否则将不会返回值。使用REGEXP则不必一定要使用通配符。
# 不返回数据  LIKE匹配整个列。如果被匹配的文本在列值中出现,LIKE将不会找到它,相应的行也不被返回(除非使用通配符)。
select name from product where name LIKE '1000' order by name;

# 返回数据 而REGEXP在列值内进行匹配,如果被匹配的文本在列值中出现,REGEXP将会找到它,相应的行将被返回。这是一个非常重要的差别。
select name from product where name REGEXP '1000' order by name;

进行OR匹配
  • 使用|从功能上类似于在SELECT语句中使用OR语句,多个OR条件可并入单个正则表达式。
# 为搜索两个串之一(或者为这个串,或者为另一个串),使用|
# 检索列name字段值中包含文本1000或者2000的所有行
select name from product where name REGEXP '1000|2000' order by name;

匹配几个字符之一
  • []是另一种形式的OR语句。事实上,正则表达式[123]Ton为[1|2|3]Ton的缩写,也可以使用后者。
# 这里,使用了正则表达式[123] Ton。[123]定义一组字符,它的意思是匹配1或2或3,因此,1 ton和2 ton,3 ton都匹配且返回。
select name from product where name REGEXP '[123] Ton' order by name;
# 字符集合也可以被否定,为否定一个字符集,在集合的开始处放置一个^即可。因此,尽管[123]匹配字符1、2或3,但[^123]却匹配除这些字符外的任何东西
匹配范围
  • 为简化集合,可使用-来定义一个范围。[0123456789] 可简化为 [0-9]。
  • 范围不一定只是数值的,[a-z]匹配任意字母字符。
# 这里使用正则表达式[1-5] Ton。[1-5]定义了一个范围,这个表达式意思是匹配1到5,因此返回3个匹配行。由于5 ton匹配,所以返回.5 ton。
select name from product where name REGEXP '[1-5] Ton' order by name;
匹配特殊字符
  • 为了匹配特殊字符,必须用\为前导。\-表示查找-,\.表示查找.
# \\.匹配.。这种处理就是所谓的转义(escaping),正则表达式内具有特殊意义的所有字符都必须以这种方式转义。
select name from product where name REGEXP '\\.' order by name;
# 匹配\ 为了匹配反斜杠(\)字符本身,需要使用\\\
匹配字符类
  • 为更方便工作,可以使用预定义的字符集,称为字符类。如:[:alnum:] 表示任意字母和数字(同[a-zA-Z0-9])。
匹配多个实例
  • 有时需要对匹配的数目进行更强的控制。例如,你可能需要寻找所有的数,不管数中包含多少数字,或者你可能想寻找一个单词并且还能够适应一个尾随的s(如果存在)。
  • 这是就要用正则表达式 重复元字符来完成。如 * 表示0个或多个匹配。?表示0个或1个匹配(等于{0,1})。{n}表示指定数目的匹配。
# \\用于转义(),[0-9]匹配任意数字,sticks?匹配stick和sticks。(s后的?使s可选,因为?匹配它前面的任何字符的0次或1次出现)。没有?,匹配stick和sticks会非常困难。

select name from product where name REGEXP '\\([0-9] sticks?\\)' order by name;

# [:digit:]匹配任意数字,因而它为数字的一个集合。{4}确切地要求它前面的字符(任意数字)出现4次,所以[[:digit:]]{4}匹配连在一起的任意4位数字
select name from product where name REGEXP '[[:digit:]]{4}' order by name;
# 这两句等价
select name from product where name REGEXP '[0-9][0-9][0-9][0-9]' order by name;

定位符
  • 为了匹配特定位置的文本,需要使用定位符。^ 表示 文本的开始。$表示文本的结尾。
# 简单搜索[0-9\\.](或[[:digit:]\\.])不行,因为它将在文本内任意位置查找匹配。
# 解决办法是使用^定位符。你想找出以一个数(包括以小数点开始的)开始的所有产品。
# ^匹配串的开始。因此,^[0-9\\.]只在.或任意数字为串中第一个字符时才匹配它们
select name from product where name REGEXP '^[0-9\\.]' order by name;

正则表达式测试
  • 简单的正则表达式测试 可以在不使用数据库表的情况下用SELECT来测试正则表达式。REGEXP检查总是返回0(没有匹配)或1(匹配)。
# 这个例子显然将返回0(因为文本hello中没有数字)。
select 'hello' REGEXP '[0-9]';

第十章

拼接字段
  • 存储在数据库表中的数据一般不是应用程序所需要的格式,因此就需要拼接字段。
  • 在MySQL的SELECT语句中,可使用Concat()函数来拼接两个列。
# Concat()拼接串,即把多个串连接起来形成一个较长的串。Concat()需要一个或多个指定的串,各个串之间用逗号分隔。下面的SELECT语句连接以下4个元素 
select Concat(name,'(',country,')') from ventors order by name;
# 通过删除数据右侧多余的空格来整理数据,这可以使用MySQL的RTrim()函数来完成,如
# RTrim()函数去掉值右边的所有空格。通过使用RTrim(),各个列都进行了整理
select Concat(RTrim(name),'(',RTrim(country),')') from ventors order by name;

# SQL支持列别名,别名用AS关键字赋予
select Concat(RTrim(name),'(',RTrim(country),')') AS title from ventors order by name;

执行算数计算
  • MySQL支持加减乘除等基本算数运算符。
# 输出中显示的sum_price列为一个计算字段,此计算为price*number。客户机应用现在可以使用这个新计算列,就像使用其他列一样
select id,price,number,price*number AS sum_price from product;
测试计算
  • 虽然SELECT通常用来从表中检索数据,但可以省略FROM子句以便简单地访问和处理表达式。
  • 例如,SELECT 3*2;将返回6,SELECT Trim(‘abc’);将返回abc,而SELECT Now()利用Now()函数返回当前日期和时间。
  • 22
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值