欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

MySQL数据库单表查询

程序员文章站 2024-03-08 14:45:23
...

查询语句

MySQL数据库单表查询
SELECT 语句用于 MySQL 从数据表中查询数据,还可以利用查询条件完成不同的项目需求。其基本语法格式如下:

SELECT  [DISTINCT] *|{字段名1, 字段名2, 字段名3,……}
FROM 表名
	[WHERE 条件表达式1]
	[GROUP BY 字段名 [HAVING 条件表达式2]]
	[ORDER BY 字段名 [ASC|DESC]]
	[LIMIT [OFFSET] 记录数]
组成部分 功能说明
DISTINCT 可选参数,用于剔除查询结果中重复的数据
* “*”是通配符,表示表中所有字段
{字段名1,……} 指定查询列表,与“*”为互斥关系,两者任选其一
FROM 用于指定待查询的数据表
WHERE 可选参数,用于指定查询条件
GROUP BY 可选参数,用于将查询结果按照指定字段进行分组,“HAVING”也是可选参数,用于对分组后的结果进行过滤
ORDER BY 可选参数,用于将查询结果按照指定字段进行排序。ASC表示升序,DESC表示降序
LIMIT 是可选参数,用于限制查询结果的数量。第1个参数表示偏移量,第2个参数设置返回查询记录的条数

字段查询

根据实际需求,通过字段可以实现所有字段或是指定字段的查询。下面以内容管理系统的栏目表 cms_category 为例,演示单表字段的查询。
——查询所有字段
在查询所有字段时,可以使用通配符(*),其语法格式如下:

SELECT * FROM 表名;

利用通配符(*)查询出的数据,只能按照字段在表中定义的顺序显示。

-- 查询所有字段(*表示所有)
select*from t_student;

需要注意的是,在项目开发时,除非需要获取表中所有字段的数据,否则最好不要使用通配符(*)进行数据查询,因为获取的数据过多会降低查询的效率。
——查询指定字段
查询数据时,最常用的是根据需求指定要查询的字段,这种方式只针对部分字段进行查询,不会查询所有字段,其语法格式如下所示:

SELECT 字段名1, 字段名2, …… FROM 表名;

在上述语法中,多个字段名称之间使用逗号“,”进行分隔,且查询出字段的顺序与表的定义顺序无关,只与查询时字段的编写顺序有关。


-- 查询指定字段()
select studentId from t_student;

在通过指定字段查询数据时,有时字段名称过长。为方便查询,可以通过AS子句来定义查询字段的别名,其语法如下:

SELECT 字段名称 [AS] 别名, 字段名2 [AS] 别名, …… FROM 表名;

在上述语法中,若别名是纯数字,或含有空格等特殊字符时,必须使用反引号“`”包裹。且在为字段定义别名时,AS可以省略使用空格代替。

-- 起别名 as可以省略
select studentId as '学号',stu_name as '姓名',sex as'性别',age as '年龄' from t_student;

数据库中包含大量的数据,很多时候需要根据需求获取指定的数据,或者对查询的数据重新进行排列组合,这时就要在 SELECT 语句中指定查询条件对查询结果进行过滤,接下来将对 SELECT 语句中使用的条件查询进行详细讲解。

——比较运算符
在 MySQL 中提供了一系列的比较运算符,用于 WHERE 子句的条件判断,完成对数据的过滤。常见的比较运算符如表所示。

比较运算符 含义 举例
= 等于 id = 9
<> 不等于 id <> 9
!= 不等于 id != 9
< 小于 id < 9
<= 小于等于 id <= 9
|>|   大于 |id > 9
|>=| 大于等于| id >= 9

– 条件查询

select*from t_student where age>20;
select*from t_student where age<20;
select*from t_student where age>45;

select studentId from t_student where age=48;

在使用WHERE进行查询时,也可以同时判断多列条件。


SELECT * FROM `cms_category` WHERE (`pid`, `sort`) = (2, 0);

上述 SQL 语句表示查询同时满足 pid 值为 2,sort 值为 0 的记录。

——带DISTINCT关键字查询
DISTINCT关键字用于去除查询结果中重复的记录,基本语法如下:
SELECT [DISTINCT] *|{字段名1, 字段名2, 字段名3, ……} FROM 表名

-- 去掉重复的组合字段
select distinct sex,age from t_student;

DISTINCT 还可以作用于多个字段,且仅一条记录中多个字段的值与另一条记录中对应字段的值都相同时,才被认为是重复记录。

——带IN关键字查询
IN 关键字,用于判断某个字段的值是否在指定集合中。若字段的值在集合中,则满足条件,该字段所在的记录将被查询出来。否则,不满足条件则不会被查询出来。其基本语法格式如下所示:

SELECT  *|{字段名1, 字段名2, 字段名3,……} 
FROM 表名
WHERE [NOT] IN(元素1, 元素2, ……)

在上述语法中,“元素1,元素2,……”用于指定查询的集合范围,当查询条件满足集合中任何一个值时都会被查询出。其中,NOT是可选参数,用于表示不在集合中,则满足查询条件。

select*from t_student where sex not in('男');

——带BETWEEN AND范围查询
BETWEEN AND用于判断某个字段的值是否在指定的范围之内,如果字段的值在指定范围内,则满足条件,该字段所在的记录将被查询出来,反之则不会被查询出来。其语法格式如下所示:


SELECT *|{字段名1, 字段名2, ……}
FROM 表名
WHERE 字段名 [NOT] BETWEEN 值1 AND 值2

在上面的语法格式中,“值1”表示范围条件的起始值,“值2”表示范围条件的结束值。NOT是可选参数,使用NOT表示查询指定范围之外的记录。

-- 查询年龄在18到41的姓名 年龄 性别
select stu_name,age,sex from t_student where age between 18 and 41;
select stu_name,age,sex from t_student where age between 18 and 41;

——带LIKE的字符匹配查询
在进行数据搜索时,更多的是对字符串进行模糊查询。例如:查询cms_category 表中 name 字段值中含有“书”的记录。为了完成这种功能,MySQL 中提供了 LIKE 关键字,可以判断两个字符串是否相匹配。

SELECT *|{字段名1, 字段名2, ……}
FROM 表名
WHERE 字段名 [NOT] LIKE '匹配字符串';

在上面的语法格式中,“匹配字符串”指定用来匹配的字符串,其值可以是一个普通字符串,也可以是一个含有通配符的字符串。关于通配符的内容如表所示。其中,NOT 是可选参数,表示查询与指定字符串不匹配的记录。
通配符 说明
% 可以匹配一个字符或多个字符,可代表任意长度的字符串,长度可以为0。例如,“书%”表示以“书”开头的字符串。
_ 仅可以匹配一个字符。例如,“书_”表示匹配字符串长度为2,以书开始的字符串。
通配符包含百分号(%)和下划线()的两种。其中,百分号(%)适用于不定长的模糊查询,下划线()适用于定长的查询。

select stu_name,age,sex from t_student where stu_name like '胖__';

——带AND的多条件查询
有时根据项目开发需要,为了使查询结果更加精确,需同时满足多个查询条件。MySQL 中提供的 AND 关键字可以用于连接两个或者多个查询条件,只有满足所有条件的记录才会被返回。其语法格式如下。

SELECT *|{字段名1, 字段名2, ……}
FROM 表名
WHERE 条件表达式1 AND 条件表达式2 […… AND 条件表达式n];

从上述语法可知,对于需要同时满足的条件,WHERE关键字后面的各表达式使用AND关键字分隔。

select * from t_student where stu_name='胖大海' and sex='女';

——带OR的多条件查询
OR 关键字也可以连接多个查询条件,但与 AND 不同的不同之处在于,使用 OR 关键字时,只要记录满足任意一个条件就会被查询出来。
其语法格式如下:

SELECT *|{字段名1, 字段名2, ……}
FROM 表名
WHERE 条件表达式1 OR 条件表达式2 […… OR 条件表达式n];
select * from t_student where stu_name='胖大海' or sex='男';

——ORDER BY排序查询
从表中查询出来的数据可能是无序的,或者其排列顺序不是用户期望的。为了使查询结果满足用户的要求,可以使用 ORDER BY 对查询结果进行排序,其语法格式如下所示:

SELECT 字段名1, 字段名2, ……
FROM 表名
ORDER BY 字段名1 [ASC | DESC] [, 字段名2 [ASC | DESC]……];

在上面的语法格式中,指定的字段名 1、字段名 2 等是对查询结果排序的依据。当有多个字段进行排序时,首先按照字段名 1 进行排序,当遇到字段 1值相同时,再按照字段 2 进行排序。其中,参数 ASC 表示按照升序进行排序,DESC 表示按照降序进行排序。默认情况下,按照 ASC 方式进行排序。
– 排序 按照年龄排序 asc默认升序 desc降序

select * from t_student order by age desc ;

——LIMIT限量查询
对于一次性查询出的大量记录,不仅不便于阅读查看,还会浪费系统效率。为此,MySQL 中提供了一个关键字 LIMIT,可以指定查询结果从哪一条记录开始,以及每次查询出的记录数量。其语法格式如下:

SELECT 字段名1, 字段名2, ……
FROM 表名
LIMIT [OFFSET, ] 记录数;

在上面的语法格式中,LIMIT 后面可以跟 2 个参数,第一个参数为可选值,默认值为 0,用于表示偏移量,如果偏移量为 0 则从查询结果的第一条记录开始,偏移量为 1 则从查询结果的第二条记录开始,以此类推;第二个参数“记录数”表示返回查询记录的条数。


-- 限量 第一个参数表示偏移量 第二个表示个数
select * from t_student limit 3,2;
-- 查询年龄在10到20之间性别为男的数据 id降序只显示前三条
select *from t_student where age between 10 and 20 and sex='男' limit 0,3;

需要注意的是,查询结果中记录的数量可以少于或等于设定的记录数。
——聚合函数
聚合函数就是把数据聚合起来的函数。通过聚合函数可以对查询结果进行数量统计、求和、求平均值等操作。MySQL中常用的聚合函数如表所示。

函数名 作用
COUNT() 计算表中记录的个数或者列中值的个数。
SUM() 获取符合条件所有结果的和。
AVG() 计算一列中数据值的平均值。
MAX() 获取查询数据中的最大值。
MIN() 获取查询数据中的最小值。

——GROUP BY分组查询
在对表中数据进行统计时,也可能需要按照一定的类别进行统计。例如,统计 cms_category 表中具有相同 pid 的分类各有多少个。在 MySQL 中,可以使用 GROUP BY 按某个字段或者多个字段中的值进行分组,字段中值相同的为一组,其语法格式如下:

SELECT 字段名1, 字段名2, ……
FROM 表名
GROUP BY 字段名1 [, 字段名2, …… [HAVING 条件表达式]];

在上面的语法格式中,指定的字段名1、字段名2等是对查询结果分组的依据。HAVING 关键字指定条件表达式对分组后的内容进行过滤。
值得一提的是,HAVING 与 WHERE 虽然作用相同,但是它们还是有一定的区别,HAVING 关键字后可以跟聚合函数,而 WHERE 则不可以。通常情况下,HAVING 关键字与 GROUP BY 一起使用,对分组后的结果进行过滤。
– 聚合函数和分组查询

-- 查询最大年龄 分组 选择性别,最大(年龄)从t_student组按性别;
select sex, max(age) from t_student group by sex;
select sex, max(age) from t_student group by sex;
-- 查询最小年龄 选择性别,最小(年龄)从t_student组按性别;
select sex,min(age) from t_student group by sex;

-- 选择性别,平均年龄(年龄)从t_student组按性别;
select sex,avg(age) from t_student group by sex;
-- 选择性别,计数(*)从t_student组按性别;
select sex,count(*) from t_student group by sex;

需要注意的是,使用 GROUP BY 直接进行分组查询后,显示的结果是分组后的第一条记录的值。因此,搭配 COUNT() 或 GROUP_CONCAT() 等聚合函数一起使用,才能获得每个组的查询结果。