查询语句是数据库操作中最为重要的一系列语法。查询关键字有 select、where、group、having、order by、imit。其中imit是MySQL的方言,只在MySQL适用。
数据库查询又分单表查询和多表查询,这里讲一下单表查询。
基础查询
# 查询指定列
SELECT * FROM 表名
# 查询所有列
SELECT 列名1,列名2,... FROM 表名
" * " 表示所有
条件查询
关键字WHERE
WHERE 筛选条件
NULL的特殊性
null数据在mysql中比较特殊,在值运算中,任何值与null进行运算结果都为null;在逻辑运算中,任何条件与null进行逻辑运算结果都为false。在逻辑运算中,如果想表示不为空或者为空,格式应当为: 值 IS NOT NULL 或 IS NULL。
运算符和关键字
= | 等于 |
!= | 不等于 |
<> | 不等于 |
< | 小于 |
<= | 小于等于 |
> | 大于 |
>= | 大于等于 |
BETWEEN a AND b | 在a和b之间,包含a和b |
IN(值1,值2,...) | 属于所举的值 |
IS NULL | 为空 |
AND、&& | 与 |
OR、|| | 或 |
NOT、! | 非 |
NOT一般和IS NULL 和 IN 搭配使用,组成IS NOT NULL 和 NOT IN,分别表示不为空和不属于
模糊查询
模糊查询可以在所有的字符串类型的数据的查询中使用。
模糊查询需要在WHERE语句中使用
通配符
关键字LIKE中,符号"_"用于表示任意的字符,10个连续的"_"就表示长度为10的任意字符串
关键字LIKE中,符号"%"用于表示0~n个任意的字符
下面举例说明
# 查询长度为6且第3和第4个字符为"5h"的字符串
WHERE str LIKE '__5h__';
# 查询以'@163.com'结尾的字符串
WHERE str LIKE '%@163.com';
# 查询包含子字符串"lai"的字符串
WHERE str LIKE '%lai%';
字段控制查询
去除重复记录
在一张表中某个字段有着重复的记录,要查询结果去除重复记录,需要使用关键字DISTINCT,字段名处可以为多个字段或"*"
# 查询student表的'name'字段并去除重复记录
SELECT DISTINCT name FROM student;
添加别名
添加别名需要使用关键字AS
查询数据时,不只能够查询已有的字段名,还可以以原有的字段为基础,添加新的列。
例:查询所有的员工信息,添加一行,其值为基础工资+奖金
SELECT *,sal+comm FROM emp;
像上例代码进行查询时,最终结果里最后一列上方的字段名为显示为sal+comm,这时候为了美观,就需要使用到关键字 AS 来添加别名。
# 设置别名时可以不添加'',使用''包围字符也不会有影响
SELECT *,sal+comm AS 总工资 FROM emp;
# 不只是自定义的字段才能用添加别名,添加别名时, AS 可以省略不写
SELECT name 姓名,id 学号 FROM student;
转换NULL
在运算中,如果碰到了NULL值会影响最终查询结果,这时需要使用运算式IFNULL(字段名,替换值),在查询时如果某条记录的"字段名"处的值为null,则将其替换为替换值进行匹配。
替换值只在进行匹配时使用,不会替换掉记录中的null值,也不会影响最终显示结果
# 查询所有字段并添加一行,其数据为sal + comm的值,若comm值为null,则替换为0进行运算
SELECT *,sal+IFNULL(comm,0) AS 总工资 FROM emp;
# 查询所有字段,条件是name的值不为空。若name值为空,则将null替换成'蒂蒂'进行逻辑运算
SELECT * FROM stu WHERE IFNULL(name,'蒂蒂') IS NOT NULL;
为了方便解释上方红色字体一行,这里放一下第二个例子的查询结果
排序
排序需要使用到关键字ORDER BY
其中ASC表示升序排序,也是默认值;DESC表示降序排序。
# 字段名1可以是字段2,升序排序,ASC是默认值,可以不写
SELECT 字段名1 FROM 表名 ORDER BY 字段名2 [ASC];
# 降序排序的DESC就不可以省略了
# 先按年龄降序排序,再按学号升序排序
SELECT * FROM student ORDER BY age DESC,id [ASC];
聚合函数
聚合函数是纵向计算的函数,一般在SELECT语句中使用
函数 | 描述 |
---|---|
COUNT() | 统计指定列不为NULL的记录行数 |
MAX() | 计算指定列的最大值,字符串类型列使用字符串排序运算 |
MIN() | 计算指定列的最小值,字符串类型列使用字符串排序运算 |
SUM() | 计算指定列的数值和,如果列类型不是数值类型,计算结果为0 |
AVG() | 计算指定列的平均值,如果列类型不是数值类型,计算结果为0 |
NULL值不参与所有的聚合函数计算,写语:
SELECT 聚合函数(字段列表) FROM 表名 ;
分组查询
分组查询需要使用GROUP BY关键字
聚合函数经常和分组查询GROUP BY 一起使用,而且聚合函数往往会在分组查询后才执行,这里关系到MySQL查询语句的执行顺序,具体可查看我的另一篇文章:查询语句的执行顺序
SELECT 字段列表 FROM 表名 [ WHERE 条件 ] GROUP BY 分组字段名 [ HAVING 分组 后过滤条件 ];
分页查询
分页操作在业务系统开发时,也是非常常见的一个功能,我们在网站中看到的各种各样的分页条,后台
都需要借助于数据库的分页操作。MySQL使用LIMIT用来限定查询结果的起始行,以及总行数。
语法:
SELECT 字段列表 FROM 表名 LIMIT 起始索引, 查询记录数 ;
注意事项:
起始索引从0开始,起始索引 = (查询页码 - 1)* 每页显示记录数。这里另外提一下,有关字符串的函数,它们对字符串的起始索引为1,也就是想要表示该字符串中的第一个字符,应当使用1表示,而不是0。
分页查询目前没有统一的关键字,都是数据库的方言来实现,MySQL中是LIMIT。
如果查询的是第一页数据,起始索引可以省略,直接简写为 limit 10。