SELECT select_list FROM table_list    # 选择的表和列
WHERE row_constraint # 行必须满足的条件
GROUP BY grouping_columns # 结果如何分组
ORDER BY sorting_columns # 结果如何排序
HAVING <EXPRESSION> [{<OPERATOR> <EXPRESSION>}] # 分组必须满足的条件
LIMIT [<OFFSET>,] <ROW COUNT> # 限制结果里的行数
  • GROUP BY grouping_columns:​告诉MySQL如何显示查询出来的数据,并按照指定的字段分组
  • ORDER BY sorting_columns:​将查询出来的结果按照后面的字段进行排序。默认为升序,可以进行的排序有:升序(ASC),降序(DESC)
  • LIMIT [<OFFSET>,] <ROW COUNT>:​告诉MySQL每次限时查询出来的数据条数


  • 建立一张表,作为下面查询的基础

CREATE TABLE fruits(
f_id CHAR(10) NOT NULL,
s_id INT NOT NULL,
f_name CHAR(255) NOT NULL,
f_price DECIMAL(8,2) NULL,
PRIMARRY KEY(f_id)
);


一、SELECT


查询所有字段

  • 方式1:

SELECT * FROM fruits;

  • 方式2:

SELECT f_id,s_id,f_name,f_price FROM fruits;



查询指定字段

  • 查找单个字段:

SELECT f_id FROM fruits;

  • 查找多个字段:

SELECT f_id, s_id FROM fruits;


二、WHERE条件查询

  • 根据WHERE子句中指定的搜索条件来​对结果进行过滤​。


演示案例

  • 根据s_id进行过滤查询。

MySQL表查询:SELECT、WHERE、BETWEEN、LIKE、IS NULL、IN/AND/OR、DISTINCT、ORDER BY、DESC、LIMIT、NOT、完全限定查询_操作符

  • 查询​价格小于​9.5的水果信息。

MySQL表查询:SELECT、WHERE、BETWEEN、LIKE、IS NULL、IN/AND/OR、DISTINCT、ORDER BY、DESC、LIMIT、NOT、完全限定查询_单表查询_02


四、BETWEEN AND查询

  • 查询在区间内的:
BETWEEN ... AND ...;
  • 查询不在区间内的:
NOT BETWEEN ... AND ...;


演示案例

  • 查询价格在5和10之间水果的信息:

MySQL表查询:SELECT、WHERE、BETWEEN、LIKE、IS NULL、IN/AND/OR、DISTINCT、ORDER BY、DESC、LIMIT、NOT、完全限定查询_偏移量_03

  • 查询价格不在5和10之间的水果的信息:

MySQL表查询:SELECT、WHERE、BETWEEN、LIKE、IS NULL、IN/AND/OR、DISTINCT、ORDER BY、DESC、LIMIT、NOT、完全限定查询_操作符_04


五、LIKE字符匹配查询

  • 语法格式:
  • 匹配:LIKE '***'
  • 不匹配:NOT LIKE '***'
  • 通配符:
  • %通配符:​代表任意长度的字符串。
  • _通配符:​一次只能代表一个字符。
  • 注意事项:
  • 从技术上说,like是谓词而不是操作符。
  • 如果MySQL的配置方式区分大小写,那么匹配就需要严格根据大小写。
  • 尾空格可能会干扰通配符匹配。​例如,在保存“apple ”时在尾部多个一个空格,那么like '%apple'将不会匹配到。为了解决这个错误,可以在搜索模式最后附加一个“%”,更好的办法是使用函数去掉首尾空格。
  • 注意NULL:​通配符不可以匹配NULL​。
  • 有的字符串中文占两个字符​,所以查询时一个中文需要两个_。
  • 相对于正则表达式regexp的缺点:​like省略通配符时查询失效,此时regexp不会(见正则表达式文章的演示案例:


演示案例

MySQL表查询:SELECT、WHERE、BETWEEN、LIKE、IS NULL、IN/AND/OR、DISTINCT、ORDER BY、DESC、LIMIT、NOT、完全限定查询_字段_05

  • 查询fname以“ert”结尾的数据

MySQL表查询:SELECT、WHERE、BETWEEN、LIKE、IS NULL、IN/AND/OR、DISTINCT、ORDER BY、DESC、LIMIT、NOT、完全限定查询_操作符_06

  • 查询中间含有“e”字符的行

MySQL表查询:SELECT、WHERE、BETWEEN、LIKE、IS NULL、IN/AND/OR、DISTINCT、ORDER BY、DESC、LIMIT、NOT、完全限定查询_操作符_07

  • 查询以“A”开头的以一个字符和二个字符结尾的行

MySQL表查询:SELECT、WHERE、BETWEEN、LIKE、IS NULL、IN/AND/OR、DISTINCT、ORDER BY、DESC、LIMIT、NOT、完全限定查询_单表查询_08

  • 查询“e”前面有三个字符,“e”后面有两个字符的行

MySQL表查询:SELECT、WHERE、BETWEEN、LIKE、IS NULL、IN/AND/OR、DISTINCT、ORDER BY、DESC、LIMIT、NOT、完全限定查询_操作符_09


六、查询空值:IS NULL

  • 语法格式:
  • 查询NULL值:​IS NULL。
  • 查询非NULL值:​IS NOT NULL。
  • MYSQL对NULL有特殊的处理,这两个特殊语法可以用来判断NULL字段。更多说明可以参阅​​​
  • 注意事项:​"IS NULL"与"= NULL"是不同的(前者是空的,后者是字段的值等于字符串"NULL")。


演示案例

  • 查询NULL值:

MySQL表查询:SELECT、WHERE、BETWEEN、LIKE、IS NULL、IN/AND/OR、DISTINCT、ORDER BY、DESC、LIMIT、NOT、完全限定查询_字段_10

  • 查询非NULL的列:

MySQL表查询:SELECT、WHERE、BETWEEN、LIKE、IS NULL、IN/AND/OR、DISTINCT、ORDER BY、DESC、LIMIT、NOT、完全限定查询_字段_11



演示案例

  • 查询所有列,可以看到其中有NULL列:

SELECT suffix FROM member;

MySQL表查询:SELECT、WHERE、BETWEEN、LIKE、IS NULL、IN/AND/OR、DISTINCT、ORDER BY、DESC、LIMIT、NOT、完全限定查询_单表查询_12

  • 查询所有不为NULL的列:

SELECT suffix FROM member WHERE suffix IS NOT NULL;

MySQL表查询:SELECT、WHERE、BETWEEN、LIKE、IS NULL、IN/AND/OR、DISTINCT、ORDER BY、DESC、LIMIT、NOT、完全限定查询_偏移量_13

  • 下面的语句是错误的,不能直接与NULL进行比较:

SELECT suffix FROM member WHERE suffix <> NULL;

MySQL表查询:SELECT、WHERE、BETWEEN、LIKE、IS NULL、IN/AND/OR、DISTINCT、ORDER BY、DESC、LIMIT、NOT、完全限定查询_字段_14


七、IN操作符查询

  • 语法格式:
  • 在范围内:IN()。
  • 不在范围内:NOT IN()。
  • IN操作符用来指定条件范围,范围中的每个条件都可以进行匹配。
  • IN操作符有时可以完成与OR相同的功能(见下面的演示案例)。
  • 使用IN操作符的优点:
  • 在使用长的合法选项清单时,IN操作符的语法更清楚且更直观。
  • 在使用IN时,计算的次序更容易管理(因为使用的操作符更少)。
  • IN操作符一般比OR操作符清单执行很快。
  • IN操作符最大优点是可以包含其他select语句,使得能够更动态地建立where子句(在后面的文章会有展示)。


演示案例

  • 查询名字为“apple”和“orange”的列,然后进行排序:

MySQL表查询:SELECT、WHERE、BETWEEN、LIKE、IS NULL、IN/AND/OR、DISTINCT、ORDER BY、DESC、LIMIT、NOT、完全限定查询_偏移量_15

  • 下面使用OR操作符完成与上面IN一样的结果:

MySQL表查询:SELECT、WHERE、BETWEEN、LIKE、IS NULL、IN/AND/OR、DISTINCT、ORDER BY、DESC、LIMIT、NOT、完全限定查询_单表查询_16


八、AND多条件查询

  • AND可以用在多个表达式之间,所有条件都满足才返回结果。并且and可以多次使用。
  • 如果与OR操作符进行使用,AND操作符的​优先级高于OR操作符​,因为为了防止查询的二义性,最好使用圆括号(OR操作符中有演示案例)。


  • 一个AND使用:

select f_id,f_name from fruits where s_id='101' and f_price>=5;

  • 多个AND使用:

select f_id,f_name from fruits where s_id='101' and f_price>=5 and f_name='apple';


九、OR多条件查询

  • 与and的使用原理相同。但是多个条件中,只要满足其中一个条件就可以返回结果。
  • 如果与or操作符进行使用,​and操作符的优先级高于or操作符​,因为为了防止查询的二义性,最好使用圆括号(见下面的演示案例)。
  • or可以完成与in一样的功能(见上面in操作符的演示案例)。


优先级演示案例

  • 下面的语句原本想要查询f_price的价格>=10的水果,但是由于and操作符的优先级高于or操作符,因此先执行“f_id=103 and f_price >=10”再去执行“f_id=101”,所以产生了如下的结果:

MySQL表查询:SELECT、WHERE、BETWEEN、LIKE、IS NULL、IN/AND/OR、DISTINCT、ORDER BY、DESC、LIMIT、NOT、完全限定查询_操作符_17

  • 根据上面的错误,我们可以加上圆括号来明确要查询的操作(圆括号的优先级高于一切运算符):

MySQL表查询:SELECT、WHERE、BETWEEN、LIKE、IS NULL、IN/AND/OR、DISTINCT、ORDER BY、DESC、LIMIT、NOT、完全限定查询_字段_18


十、DISTINCT查询结果不重复

  • 查询出来的结果,如果​有重复的只显示一条​。
  • 注意事项:
  • DISTINCT必须放在列名前面。
  • DISTINCT应用于所有的列,但不仅是其后面的列。
  • 另外,如果​查询多个列​,如果两个或多个列之间的值不同,那么所有的列都会被显示出来(见下面的演示案例)。
  • 对于多列的使用:
  • DISTINCT也可以用于多列。
  • 例如,下面表示[col1,col2,col3]这三列加在一起不重复。
SELECT DISTINCT col1, col2, col3 FROM table_name;


演示案例

  • 下面的distinctr对s_id起效:

MySQL表查询:SELECT、WHERE、BETWEEN、LIKE、IS NULL、IN/AND/OR、DISTINCT、ORDER BY、DESC、LIMIT、NOT、完全限定查询_操作符_19

  • 下面的查询,s_id和f_name的列都是相同的 ,因此都只显示一行:

MySQL表查询:SELECT、WHERE、BETWEEN、LIKE、IS NULL、IN/AND/OR、DISTINCT、ORDER BY、DESC、LIMIT、NOT、完全限定查询_单表查询_20

  • 下面的查询虽然s_id和f_name的值都是相同的,但是f_price不同,因此所有的结果都被显示出来了:

MySQL表查询:SELECT、WHERE、BETWEEN、LIKE、IS NULL、IN/AND/OR、DISTINCT、ORDER BY、DESC、LIMIT、NOT、完全限定查询_单表查询_21


十一、ORDER BY排序查询结果

  • 如果要对查询的结果​进行排序​,则可以使用“ORDER BY”关键字。
  • 注意事项:
  • order by默认为​升序排序​。
  • order by既可以根据单个列进行排序,也可以根据​多个列进行排序​(见下面的演示案例)。
  • 多列排列时,先对前面的列进行排序;前面的列排序完之后,再对后面的列进行排序。
  • 如果字段有NULL,则NULL​排在最前面​。


演示案例

MySQL表查询:SELECT、WHERE、BETWEEN、LIKE、IS NULL、IN/AND/OR、DISTINCT、ORDER BY、DESC、LIMIT、NOT、完全限定查询_偏移量_22

  • 下面根据f_price的值进行排序:

MySQL表查询:SELECT、WHERE、BETWEEN、LIKE、IS NULL、IN/AND/OR、DISTINCT、ORDER BY、DESC、LIMIT、NOT、完全限定查询_偏移量_23

  • 下面根据f_name和f_price进行排序:先对f_name进行排序,之后对f_price列排序时参照f_name进行排序。例如有2行apple,那么f_price则根据apple这两行进行排序,5.2比6.2大,则5.2在6.2之前;同理,banana也是如此。

MySQL表查询:SELECT、WHERE、BETWEEN、LIKE、IS NULL、IN/AND/OR、DISTINCT、ORDER BY、DESC、LIMIT、NOT、完全限定查询_字段_24


十一、DESC、ASC指定排序顺序

  • asc:​将排序结果进行升序排序(默认使用的)。
  • desc:​将排序结果进行降序排序。
  • 结果的排序通常配合“ORDER BY”使用。


演示案例

  • 下面的演示结果默认为升序排序,但是使用使用“DESC”之后,可以进行降序排序:

MySQL表查询:SELECT、WHERE、BETWEEN、LIKE、IS NULL、IN/AND/OR、DISTINCT、ORDER BY、DESC、LIMIT、NOT、完全限定查询_单表查询_25

  • 对多列进行不同的排序,根据f_name进行降序排序,然后根据f_price进行升序排序:

MySQL表查询:SELECT、WHERE、BETWEEN、LIKE、IS NULL、IN/AND/OR、DISTINCT、ORDER BY、DESC、LIMIT、NOT、完全限定查询_偏移量_26


十二、LIMIT限制查询行数


格式①

  • 从指定​“位置偏移量”​开始,显示多少行:

limit [位置偏移量,] 行数

格式②

  • 从​“位置偏移量”​开始,显示多少行:

limit [行数 offset] 位置偏移量


  • 注意:
  • 位置偏移量:代表从第几行开始查询,省略时从第一条开始。
  • 第一条记录的偏移量为0​...以此类推。
  • 行数:代表查询结果显示多少行。


演示案例

MySQL表查询:SELECT、WHERE、BETWEEN、LIKE、IS NULL、IN/AND/OR、DISTINCT、ORDER BY、DESC、LIMIT、NOT、完全限定查询_偏移量_27

  • 默认从第一行开始,查询3行:

MySQL表查询:SELECT、WHERE、BETWEEN、LIKE、IS NULL、IN/AND/OR、DISTINCT、ORDER BY、DESC、LIMIT、NOT、完全限定查询_字段_28

  • 从第二行开始,查询2行:

MySQL表查询:SELECT、WHERE、BETWEEN、LIKE、IS NULL、IN/AND/OR、DISTINCT、ORDER BY、DESC、LIMIT、NOT、完全限定查询_字段_29

  • 同上,从第二行开始,查询2行:

MySQL表查询:SELECT、WHERE、BETWEEN、LIKE、IS NULL、IN/AND/OR、DISTINCT、ORDER BY、DESC、LIMIT、NOT、完全限定查询_字段_30

  • 例如下面配合“order by”和“desc”使用来查询最贵的水果中的一个:

MySQL表查询:SELECT、WHERE、BETWEEN、LIKE、IS NULL、IN/AND/OR、DISTINCT、ORDER BY、DESC、LIMIT、NOT、完全限定查询_偏移量_31


十三、NOT操作符

  • NOT操作符有且只有一个功能,就是​否定之后所跟的任何条件​。
  • NOT可以与in、between ... and、like、exists、is null配合使用(其中部分在上面已经演示案例)。

十四、使用完全限定查询

  • 上面的查询,需要先选择一个数据库,然后对数据库中的表进行查询。如果我们为选择一个数据库,那么可以使用“完全限定”来查询指定的内容。
  • 完全限定可以用在表前,也可以用在字段前。


演示案例

  • 如果此时我们没有用use选择任何数据库,那么查询是失败的:

MySQL表查询:SELECT、WHERE、BETWEEN、LIKE、IS NULL、IN/AND/OR、DISTINCT、ORDER BY、DESC、LIMIT、NOT、完全限定查询_单表查询_32

  • 此时我们使用“完全限定”进行查询:

MySQL表查询:SELECT、WHERE、BETWEEN、LIKE、IS NULL、IN/AND/OR、DISTINCT、ORDER BY、DESC、LIMIT、NOT、完全限定查询_操作符_33

  • 我们也可以在字段前面使用“完全限定”:

MySQL表查询:SELECT、WHERE、BETWEEN、LIKE、IS NULL、IN/AND/OR、DISTINCT、ORDER BY、DESC、LIMIT、NOT、完全限定查询_操作符_34