单表查询
单表查询语句
执行顺序 | 表单查询语句 | 各组成部分的作用 |
---|---|---|
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;