1 基本查询语句
MySQL从数据表中查询数据的基本语句为SELECT语句。SELECT语句的基本格式是:
2 单表查询
2.1 查询所有字段
SELECT * FROM 表名;
2.2 在SELECT语句中指定所有字段
SELECT f_id, s_id ,f_name, f_price FROM fruits;
2.3 查询单个字段
SELECT 列名FROM 表名;
2.4 查询多个字段
SELECT 字段名1,字段名2,…,字段名n FROM 表名;
2.5 查询指定记录
SELECT 字段名1,字段名2,…,字段名n
FROM 表名
WHERE 查询条件
2.6 带IN关键字的查询
IN操作符用来查询满足指定范围内的条件的记录,使用IN操作符,将所有检索条件用括号括起来,检索条件之间用逗号分隔开,只要满足条件范围内的一个值即为匹配项。
SELECT s_id,f_name, f_price FROM fruits WHERE s_id IN (101,102);
SELECT s_id,f_name, f_price FROM fruits WHERE s_id NOT IN (101,102);
2.7 带BETWEEN AND的范围查询
SELECT f_name, f_price FROM fruits WHERE f_price BETWEEN 2.00 AND 10.20;
2.8 带LIKE的字符匹配查询
百分号通配符‘%’,匹配任意长度的字符,甚至包括零字符;下划线通配符‘_’,一次只能匹配任意一个字符。
2.9 查询空值
在SELECT语句中使用IS NULL子句,可以查询某字段内容为空记录。
2.10 带AND的多条件查询
SELECT f_id, f_price, f_name FROM fruits WHERE s_id = '101' AND f_price >=5;
2.11 带OR的多条件查询
SELECT s_id,f_name, f_price FROM fruits WHERE s_id = 101 OR s_id = 102;
2.12 查询结果不重复
SELECT DISTINCT 字段名 FROM 表名;
2.13 对查询结果排序-单列排序
select 字段名 From 表名 order by 字段名;
2.13 对查询结果排序-多列排序
在对多列进行排序的时候,首先排序的第一列必须有相同的列值,才会对第二列进行排序。如果第一列数据中所有值都是唯一的,将不再对第二列进行排序。
select 字段名 From 表名 order by 字段名,字段名;
2.13 对查询结果排序-指定排序方向
默认情况下,查询数据按字母升序进行排序(A~Z),但数据的排序并不仅限于此,还可以使用ORDER BY对查询结果进行降序排序(Z~A)。
SELECT f_name, f_price FROM fruits ORDER BY f_price DESC;//降序
SELECT f_name, f_price FROM fruits ORDER BY f_price ASC;//升序
SELECT f_name, f_price FROM fruits ORDER BY f_price DESC,f_price1;//降序
//DESC排序方式只应用到直接位于其前面的字段上
2.14 分组查询
MySQL中使用GROUP BY关键字对数据进行分组,基本语法形式为:
[GROUP BY 字段] [HAVING <条件表达式>]
字段值为进行分组时所依据的列名称;“HAVING <条件表达式>”指定满足表达式限定条件的结果将被显示。
2.15 创建分组
GROUP BY关键字通常和集合函数一起使用,比如MAX()、MIN()、COUNT()、SUM()、AVG()。
在MySQL中,可以在GROUP BY子句中使用GROUP_CONCAT()函数,将每个分组中各个字段的值显示出来。
SELECT s_id, GROUP_CONCAT(f_name) AS Names FROM fruits GROUP BY s_id;
2.16 使用HAVING过滤分组
GROUP BY可以和HAVING一起限定显示记录所需满足的条件,只有满足条件的分组才会被显示。
SELECT s_id, GROUP_CONCAT(f_name) AS Names
FROM fruits
GROUP BY s_id HAVING COUNT(f_name) > 1;
HAVING关键字与WHERE关键字都是用来过滤数据的,两者有什么区别呢?其中重要的一点是,HAVING在数据分组之后进行过滤来选择分组,而WHERE在分组之前来选择记录。另外,WHERE排除的记录不再包括在分组中。
2.17 在GROUP BY子句中使用WITH ROLLUP
使用WITH ROLLUP关键字之后,在所有查询出的分组记录之后增加一条记录,该记录计算查询出的所有记录的总和,即统计记录数量。
2.18 多字段分组
使用GROUP BY可以对多个字段进行分组,GROUP BY关键字后面跟需要分组的字段,MySQL根据多字段的值来进行层次分组,分组层次从左到右,即先按第1个字段分组,然后在第1个字段值相同的记录中再根据第2个字段的值进行分组,以此类推。
mysql> SELECT * FROM fruits group by s_id,f_name;
两个字段是一个组合,是一个分组结果,第一个字段分组完成后,再分组第二个字段,查询出的顺序会发生变化。
2.19 GROUP BY和ORDER BY一起使用
2.20 使用LIMIT限制查询结果的数量
SELECT返回所有匹配的行,有可能是表中所有的行,若仅仅需要返回第一行或者前几行,可使用LIMIT关键字,基本语法格式如下:
LIMIT [位置偏移量,] 行数
第一个“位置偏移量”参数指示MySQL从哪一行开始显示,是一个可选参数,如果不指定“位置偏移量”,将会从表中的第一条记录开始(第一条记录的位置偏移量是0,第二条记录的位置偏移量是1,以此类推);第二个参数“行数”指示返回的记录条数。
MySQL 8.0中可以使用“LIMIT 4 OFFSET 3”,意思是获取从第5条记录开始后面的3条记录,和“LIMIT 4,3;”返回的结果相同。
3.使用集合函数查询
● COUNT(*)计算表中总的行数,不管某列是否有数值或者为空值。
● COUNT(字段名)计算指定列下总的行数,计算时将忽略空值的行。
● SUM()函数在计算时,忽略列值为NULL的行。
● MAX()函数除了用来找出最大的列值或日期值之外,还可以返回任意列中的最大值,包括返回字符类型的最大值。MIN()函数与MAX()函数类似,不仅适用于查找数值类型,也可应用于字符类型。
3.连接查询
连接是关系数据库模型的主要特点。连接查询是关系数据库中最主要的查询,主要包括内连接、外连接等。通过连接运算符可以实现多个表查询。
3.1 内连接查询
内连接(INNER JOIN)使用比较运算符进行表间某(些)列数据的比较操作,并列出这些表中与连接条件相匹配的数据行,组合成新的记录,也就是说,在内连接查询中,只有满足条件的记录才能出现在结果关系中。
3.2 外连接查询
外连接查询将查询多个表中相关联的行,内连接时,返回查询结果集合中仅是符合查询条件和连接条件的行。有时候需要包含没有关联的行中数据,即返回查询结果集合中不仅包含符合连接条件的行,还包括左表(左外连接或左连接)、右表(右外连接或右连接)或两个边接表(全外连接)中的所有数据行。外连接分为左外连接或左连接和右外连接或右连接:
● LEFT JOIN(左连接):返回包括左表中的所有记录和右表中连接字段相等的记录。
● RIGHT JOIN(右连接):返回包括右表中的所有记录和左表中连接字段相等的记录。
左连接的结果包括LEFT OUTER子句中指定的左表的所有行,而不仅仅是连接列所匹配的行。如果左表的某行在右表中没有匹配行,则在相关联的结果行中,右表的所有选择列表列均为空值。
右连接是左连接的反向连接,将返回右表的所有行。如果右表的某行在左表中没有匹配行,左表将返回空值。
3.3 复合条件连接查询
复合条件连接查询是在连接查询的过程中,通过添加过滤条件限制查询的结果,使查询的结果更加准确。
4 子查询
子查询指一个查询语句嵌套在另一个查询语句内部的查询,子查询中常用的操作符有ANY(SOME)、ALL、IN、EXISTS。子查询可以添加到SELECT、UPDATE和DELETE语句中,而且可以进行多层嵌套。子查询中也可以使用比较运算符,如“<”“<=”“>”“>=”和“!=”等。
4.1 ANY(SOME)
ANY和SOME关键字是同义词,表示满足其中任一条件,它们允许创建一个表达式对子查询的返回值列表进行比较,只要满足内层子查询中的任何一个比较条件,就返回一个结果作为外层查询的条件。
4.2 带ALL关键字的子查询
ALL关键字与ANY和SOME不同,使用ALL时需要同时满足所有内层查询的条件。例如,修改前面的例子,用ALL关键字替换ANY
4.3 带EXISTS关键字的子查询
EXISTS关键字后面的参数是一个任意的子查询,系统对子查询进行运算以判断它是否返回行,如果至少返回一行,那么EXISTS的结果为true,此时外层查询语句将进行查询;如果子查询没有返回任何行,那么EXISTS返回的结果是false,此时外层语句将不进行查询。
EXISTS关键字可以和条件表达式一起使用。
EXISTS和NOT EXISTS的结果只取决于是否会返回行,而不取决于这些行的内容,所以这个子查询输入列表通常是无关紧要的。
4.4 带IN关键字的子查询
IN关键字进行子查询时,内层查询语句仅仅返回一个数据列,这个数据列里的值将提供给外层查询语句进行比较操作。SELECT语句中可以使用NOT IN关键字,其作用与IN正好相反。
4.5 带比较运算符的子查询
子查询时还可以使用其他的比较运算符,如“<”“<=”“=”“>=”和“!=”等。
5 合并查询结果
利用UNION关键字,可以给出多条SELECT语句,并将它们的结果组合成单个结果集。合并时,两个表对应的列数和数据类型必须相同。各个SELECT语句之间使用UNION或UNION ALL关键字分隔。UNION不使用关键字ALL,执行的时候删除重复的记录,所有返回的行都是唯一的;使用关键字ALL的作用是不删除重复行也不对结果进行自动排序。基本语法格式如下:
SELECT column,... FROM table1
UNION [ALL]
SELECT column,... FROM table2
先显示完第一个查询再显示第二个查询
6 为表和字段取别名
6.1 为表取别名
当表名字很长或者执行一些特殊查询时,为了方便操作或者需要多次使用相同的表时,可以为表指定别名,用这个别名替代表原来的名称。为表取别名的基本语法格式为:
表名 [AS] 表别名
在为表取别名时,要保证不能与数据库中其他表的名称冲突。
6.2 为字段取别名
在有些情况下,显示的列的名称会很长或者名称不够直观,MySQL可以指定列别名,替换字段或表达式。为字段取别名的基本语法格式为:
列名 [AS] 列别名
7 使用正则表达式查询
MySQL中使用REGEXP关键字指定正则表达式的字符匹配模式。
字符‘^’匹配以特定字符或者字符串开头的文本。
8 MySQL 8.0的新特性1 GROUP BY不再隐式排序
MySQL对GROUP BY字段不再隐式排序。如果确实需要排序,必须加上ORDER BY子句。