文章目录
查询数据
数据库管理系统的一个重要功能是数据查询,数据查询不应只是简单返回数据库中存储的数据,还应该根据需要对数据进行筛选,以及确定数据以什么样的格式显示。mysql提供了功能强大、灵活的语句来实现这些操作。本章将介绍如何使用SELECT语句查询数据表中的一列或多列数据、使用集合函数显示查询结果、连接查询、子查询以及使用正则表达式进行查询等。
一、基本查询语句
mysql从数据表中查询数据的基本语句为select语句。select语句的基本格式是:
- {* | <字段列表>}包含星号通配符和字段列表,表示查询的字段,其中字段列至少包含一个字段名称,如果要查询多个字段,多个字段之间用逗号隔开,最后一个字段后不要加逗号。
- FROM <表1>,<表2>…, 表1和表2表示查询数据的来源,可以是单个或者多个。
- WHERE子句是可选项,如果选择该项,将限定查询行必须满足的查询条件。
- GROUP BY <字段>,该子句告诉mysql如何显示查询出来的数据,并按照字段分组。
- [ORDER BY <字段>],该子句告诉mysql按什么样的顺序显示查询出来的数据,可以进行的排序有升序(ASC)和降序(DESC)。
- [LIMIT [< offset >, ] < row count >],该子句告诉mysql每次显示查出来的数据条数。
二、单表查询
单表查询是指从一张表数据中查询所需的数据。本节将介绍单表查询中的各种基本的查询方式,主要有查询所有字段、查询指定字段、查询指定记录、查询空值、多条件的查询、对查询结果莒南县排序等。
1、查询所有字段
①在select语句中使用星号(*)通配符查询所有字段
②在select语句中指定所有字段
注意:一般情况下,除非需要使用表中所有的字段数据,最好不要使用通配符“*”。使用通配符虽然可以节省输入查询语句的时间,但是获取不需要的列数据通常会降低查询和锁使用的应用程序的效率。通配符的优势是,当不知道所需要的列的名称时,可以通过通配符获取他们。
2、查询指定字段
①查询单个字段
②查询多个字段
注意:mysql中的sql语句是不区分大小写的,因此select和SELECT的作用时一样的。但是,许多开发人员习惯将关键字使用大写,而数据列和表名使用小写,读者也应该养成一个良好的编程习惯。
3、查询指定记录
4、带IN关键字的查询
IN操作符用来查询满足指定范围的条件的记录,使用IN操作符将所有检索条件用括号括起来,检索条件之间用逗号分隔开,满足条件范围的值即为匹配项。
相反的,也可以使用关键字NOT来检索不在条件范围内的记录。
5、带BETWEEN AND的范围查询
BETWEEN AND用来查询某个范围内的值,该操作符需要两个参数,即范围的开始值和结束值,若字段值满足指定的范围查询条件,则这些记录被返回。
6、带LIKE的字符匹配查询
①百分号通配符“%”匹配任意长度的字符,甚至包括零字符
②下划线通配符“_”一次只能匹配任意一个字符
7、查询空值
创建数据表的时候,设计者可以指定某列中是否可以包含空值(NULL)。空值不同于0,也不同于空字符串。空值一般表示数据未知、不适用或将在以后添加数据。在SELECT语句中使用IS NULL子句可以查询某字段内容为空记录。
8、带AND的多条件查询
9、带OR的多条件查询
10、查询结果不重复
11、对查询结果进行排序
①单列排序
②多列排序
③指定排序方法![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/032a75464e6533210699ef4f9f479838.png)
12 、分组查询
①创建分组
GROUP BY关键字通常和集合函数一起使用,例如MAX()、MIN()、COUNT()、SUM()、AVG()。例如,要返回每个水果供应商提供的水果种类,这时就要在分组过程中用到COUNT()函数,把数据分为多个逻辑组,并对每个组进行集合计算。
②使用HAVING过滤分组
GROUP BY可以和HAVING一起限定显示记录所需满足的条件,只有满足条件的分组才会被显示。
注意:HAVING关键字和WHERE关键字都是用来过滤数据的,两者有什么区别呢?其中重要的一点是,HAVING在数据分组之后进行过滤来选择分组,而WHERE在分组之前用来选择记录。另外,WHERE排除的记录不再包括在分组中
。
③在GROUP BY 子句中使用WITH ROLLUP
使用WITH ROLLUP关键字之后,在所有查询出的分组记录之后增加一条记录,该记录计算查询出的所有记录的综合,即统计记录数量。
④多字段分组
使用GROUP BY可以对多个字段进行分组,GROUP BY关键字后面跟需要分组的字段,mysql根据多字段的值来进行层次分组,分组层次从左到右,即先按第一个字段分组,然后在第一个字段值相同的记录中,再根据第二个字段进行分组,以此类推。
⑤GROUP BY和ORDER BY一起使用
某些情况下需要对分组进行排序,在前面的介绍中,ORDER BY用来对查询的记录排序,如果和GROUP BY一起使用,可以完成对分组的排序。
注意:当使用ROLLUP时,不能同时使用ORDER BY子句进行结果排序,即ROLLUP和ORDER BY 是互相排斥的。
13、使用LIMIT限制查询结果的数量
SELECT返回所有匹配的行,有可能是表中所有的行,若仅需要返回第一行或者前几行,则使用LIMIT关键字,基本语法格式如下:
第一个参数“未知偏移量”指示mysql从哪一行开始显示,是一个可选参数,如果不指定“位置偏移量”,将会从表中第一条记录开始(第一条记录的位置偏移量是0,第二条记录的位置偏移量是1,以此类推);第二个参数“行数”指示返回的记录条数。
三、使用集合函数查询
有时并不需要返回实际表中的数据,而只是对数据进行总结。mysql提供一些查询功能,可以对获取的数据进行分析和报告。这些函数的功能右计算数据表中记录行数的总数,计算某个字段列下数据的总和,以及计算表中某个字段下的最大值、最小值或者平均值。
1、COUNT()函数
COUNT()函数统计数据表中包含的记录行的总数,或者根据查询结果返回列中包含的数据行数。其使用方法有两种
- COUNT(*)计算表中总的行数,无论某列有数值还是空值。
- COUNT(字段名)计算指定列下总的行数,计算时将忽略空值的行。
2、SUM()函数
- SUM()是一个求综合的函数,返回指定列值的总和。
3、AVG()函数
- AVG()函数通过计算返回的行数和每一行数据的和求得指定数据得平均值。
4、MAX()函数
- MAX()函数返回指定列中的最大值。
5、MIN()函数
- MIN()返回查询列中的最小值。
四、连接查询
连接是关系数据库模型的主要特点。连接查询是关系数据库中最主要的查询,主要包括内连接、外连接等。通过连接运算符可以实现多个表查询。在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在一个表中。当查询数据时,通过连接操作查询出存放在多个表中的不同实体的信息。当两个或多个表中存在相同意以的字段时,便可以通过这些字段对不同的表进行连接查询。
1、内连接查询
内连接(INNER JOIN)使用比较运算符进行表间某些列数据的比较操作,并列出这些表中与连接条件匹配的数据行,组合成新的记录。也就是说,在内连接查询中,只有满足条件的记录才能出现在结果关系中。
2、外连接查询
外连接查询将查询多个表中的相关联的行,内连接时,返回查询结果集合中的仅是符合查询条件和连接条件的行。但有时需要包含没有关联的行中的数据,即返回查询结果集合中不仅包含符合连接条件的行,还包括左表(左外连接或左连接)、右表(右外连接或右连接)或两个边接表(全外连接)中所有的数据行。外连接分为左外连接(左连接)和右外连接(右连接):
- LEFT JOIN(左连接):返回包含左表中的所有记录和右表中连接字段相等的记录。
- RIGHT JOIN(右连接):返回包括右表中的所有记录和左表中连接字段相等的记录。
①LEFT JOIN(左连接)
左连接的结果包括LEFT OUTER子句中指定的左表的所有行,而不仅仅是连接列所匹配的行。若左表的某行在右表中没有匹配行,则在相关联的结果行中,右表的所有选择列表列均为空值。
②RIGHT JOIN(右连接)
右连接是左连接的反向连接,将返回右表的所有行。如果右表的某行在左表中没有匹配行,那么左表将返回空值。
③复合条件连接查询
复合条件连接查询是在连接查询到过程中通过添加过滤条件限制查询的结果,使查询的结果更加准确。
五、子查询
子查询指一个查询语句嵌套在另一个查询语句内部的查询,这个特性从mysql4.1开始引入。在SELECT子句中先计算子查询,子查询结果作为外层另一个查询的过滤条件,查询可以基于一个表或者多个表。子查询中常用的操作符有ANY(SOME)、ALL、IN、EXISTS。子查询可以添加到SELECT、UPDATE和DELETE语句中,而且可以进行多层嵌套。子查询中也可以使用比较运算符,如< > = <= >= !=
等。
1、带ANY、SOME关键字的子查询
ANY和SOME关键字是同义词,表示满足其中任一条件,它们允许创建一个表达式对子查询的返回值列表进行比较,只要满足内层子查询中的任何一个比较条件,就返回一个结果作为外层查询的条件。
2、带ALL关键字的查询
ALL关键字与ANY和SOME不同,使用ALL时需要同时满足所有内层查询的条件。
ALL关键字接在一个比较操作符的后面,表示与子查询所有的返回值比较为TRUE,则返回TRUE。
3、带EXISTS关键字的子查询
EXISTS关键字后面的参数是一个任意的子查询,系统对子查询进行运算以判断它是否返回行,如果至少返回一行,那么EXISTS的结果为TRUE,此时外层查询语句将进行查询;如果子查询没有返回任何行,那么EXISTS返回的结果为FALSE,此时外层语句将不进行查询。
4、带IN关键字的子查询
IN关键字进行子查询,内层查询语句仅返回一个数据列,这个数据列里的值将提供给外层查询语句进行比较操作。
5、带比较运算符的子查询
在前面介绍带ANY、ALL关键字的子查询时使用了”>“比较运算符,子查询时还可以使用其他比较运算符,如<、<=、=、>=、!=
等。
六、合并查询结果
利用UNION关键字可以给出多条SELECT语句,并将他们的结果组合成当个结果集。合并时,两个表对应的列数和数据类型必须相同。各个SELECT语句之间使用UNION或UNION ALL关键字分隔。UNION不使用关键字ALL,执行的时候删除重复的记录,所有返回的行都是唯一的。使用关键字ALL的作用是不删除重复行,也不对结果进行自动排序。基本语法格式如下:
注意:UNION 和 UNION ALL的区别:使用UNION ALL的功能是不删除重复行,加上ALL关键字语句执行时所需要的资源少,所以尽可能地使用它。在知道有重复行但是想保留这些行,确定查询结果中不会有重复数据或者不需要去掉重复数据的时候,应该使用UNION ALL以提高查询效率。
七、为表和字段取名
在前面介绍了分组查询、集合函数查询和嵌套子查询时,读者注意到有的地方使用了AS关键字为查询结果中的某一列指定一个特定的名字。在介绍内连接查询时,则对相同的表fruits分别指定两个不同的名字,这里可以为字段或者表取一个别名,在查询时,使用别名替代其指定的内容。
1、为表取别名
当表名字很长或者执行一些特殊查询时,为了方便操作或者需要多次使用相同的表时,可以为表指定别名,用这个别名替代表原来的名称。为表取别名的基本语法格式为:
表名为数据库中存储的数据表的名称,表别名为查询时指定的表的新名称,AS关键字为可选参数。
注意:为表取别名时,要保证不能与数据库中的其他表的名称冲突。
2、为字段取别名
八、使用正则表达式查询
正则表达式通常被用来检索或替换那些符合某个模式的文本内容,根据指定的匹配模式匹配文本中符合要求的特殊字符串。例如从一个文本文件中提取电话号码,查找一篇文章中重复的单词或者替换用户输入的某些敏感词语等,这些地方都可以使用正则表达式。正则表达式强大而且灵活,可以应用于非常复杂的查询。
mysql中使用REGEXP关键字指定正则表达式的字符匹配模式。
1、查询以特定字符或字符串开头的记录
2、查询以特定字符或字符串结尾的记录
3、用符号“.”替代字符串中任意一个字符
4、使用“*”和“+”来匹配多个字符
5、匹配指定字符串
6、匹配指定字符中的任意一个
7、匹配指定字符以外的字符
8、使用{n, }或者{n, m}指定字符串连续出现的次数