MySQL——单表查询

单表查询


单表查询语句
执行顺序 表单查询语句 各组成部分的作用
1 WHERE ... 对表中记录的第一次筛选
2 GROUP BY ... 分组
3 SELECT ... (聚合函数) ...FROM 表名 基本结构(对字段进行聚合处理)
4 HAVING ... 对表中记录的进一步筛选
5 ORDER BY ... 排序
6 LIMIT ... ; 截取部分记录来显示

· 聚合函数(对表中某个字段的数据进行聚合操作)
种类:

代码 语义
AVG(字段名) 求该字段的平均值
SUM(字段名) 求和
MAX(字段名) 最大值
MIN(字段名) 最小值
COUNT(字段名) 统计该字段记录的个数(可统计空字符串,但是不统计NULL)

注意:聚合函数的结果为一个数值;一般与分组、HAVING等结构配合使用,很少单独使用
例子:

查询userlist表中最大年纪的用户年龄
SELECT MAX(age) FROM userlist;

查询userlist表中中国用户的资产综合
SELECT SUM(money) FROM userlist
WHERE country='中国';

统计name、id两个字段分别有几条记录
SELECT COUNT(id),COUNT(name) FROM userlist;

统计中国用户中通过实名认证的用户数量(AS author_count是别名,可以不写)
SELECT COUNT(*) AS author_count FROM userlist
WHERE country='中国' AND author=true;

· ORDER BY:
作用:给查询结果排序
格式:... ORDER BY 字段名 ASC/DESC(升序/降序)(不添加默认为升序)
注意:对查询结果进行排序,并不会改变表中记录的原始顺序
例:

查出用户并按照id倒序排序
SELECT * FROM USERLIST
ORDER BY id DESC;

找出国家为中国的用户并按倒序排序
SELECT * FROM userlist
WHERE country='中国'
ORDER BY id DESC;

找出国家为中国和美国的用户,并且名字为3个字符的用户,按照id为升序排序
SELECT * FROM userlist
WHERE country IN('中国','美国') AND name LIKE '_ _ _'
ORDER BY id ASC;

· LIMIT:(限制查询记录的显示条数)
两种用法:
<1>LIMIT n (显示n条记录<前n条记录>)
<2>LIMIT m,n (m:从第m+1条记录开始显示<计算机从0开始计数>;n:显示n条记录)
注意:LIMIT永远放在SQL查询语句的最后写
例:

在国家为中国的用户中找出id排名倒数第二到倒数第四的记录
SELECT * FROM userlist
WHERE country='中国'
ORDER BY id ASC
LIMIT 1,3;

找出日本用户并且名字不为空并显示id与姓名,正序排列取前3条记录
SELECT id,name FROM userlist
WHERE country='日本' AND name IS NOT NULL
ORDER BY id ASC
LIMIT 3;

使用LIMIT进行分页:

每页显示5条记录,显示第4页
LIMIT (m-1)*n,n;(m直接传递4即可查询第四页的5条)

· GROUP BY ...(按照某种规则对查询结果进行分组操作)
格式:...GROUP BY 字段名
注意:
· 只有分组时(没有聚合函数、HAVING),先分组,后去重
· GOURP BY 后边的字段必须与SELECT后面字段一致
· 分组、聚合同时存在时,先分组,后聚合,在去重
例子:

查看有哪些国家(每个国家只出现一次)
SELECT country FROM userlist
GROUP BY country;

查看每个国家用户的平均年龄
SELECT country,AVG(age) FROM userlist
GROUP BY country;

查询出所有国家中用户最多的前两名,显示国家名称和其数量
SELECT country,COUNT(id) FROM userlist
GROUP BY country
ORDER BY COUNT(id) DESC
LIMIT 2;

· HAVING ...(对查询结果进行进一步的筛选操作)
注意:
· WHERE只能操作表中实际存在的字段,HAVING可操作由聚合函数生成的显示列
· 分组 + 聚合 + HAVING :HAVING语句通常和GROUP BY 语句联合使用,过滤由GROUP BY 语句返回的记录集
例子:

查找出平均年龄>50,排名前2的国家,显示国家名和平均年龄
SELECT country,AVG(age) AS average_age FROM userlist
GROUP BY country
HAVING AVG(age)>50
ORDER BY DESC
LIMIT 2;

· DISTINCT ...(不显示字段的重复值)
格式:DISTINCT 字段名
注意:
· 只修饰普通的已存在字段
· 当DISTINCT同时修饰多个字段时,所有字段的值都相同才回去重
· DISTINCT不能对任何字段做聚合处理
例子:

查看表中有哪些国家
SELECT DISTINCT country FROM userlist;

计算表中一共有几个国家(AS country_count 可省略,别名而已)
SELECT COUNT(DISTINCT country) AS country_count FROM userlist;

· 查询表记录时做数学运算
(+ - * / %)
例子:

对查找出的用户年龄进行双倍运算处理
SELECT id,name,age*2 FROM userlist;

你可能感兴趣的:(MySQL——单表查询)