select */字段列表/函数 from 表名; [where 检索条件] [group by 字段列表 [having 检索条件]] [order by 字段列表 asc/desc] [limit 分页参数]
子句 | 值 | 功能 |
---|---|---|
select | * / 字段列表 / 函数 | 返回被查询的字段列或表达式 |
from | 表名 | 选择被查询的表 |
where | 检索条件(and、or、like、in、between and) | 筛选、过滤数据 |
group by | 分组字段 [having 检索条件] | 根据指定字段对数据分组 |
having | 检索条件 | 筛选、过滤分组结果 |
order by | 排序字段 [desc / asc] | 根据指定字段对数据排序 |
limit | 分页参数 / 跳过参数,分页参数 | 分页查询数据行 |
(1).查询所有数据行的所有字段列 select * form users; (2).查询所有数据行的部分字段列 select id,name,pw from users;
- 可以在 where 子句中指定任何条件
- 可以使用 and 或 or 指定多个条件,两者同时使用时优先运算 and
- like 子句使用 % 或 _ 模糊搜索时,性能消耗大,所以尽量不要使用 % 和_
- where子句还可以用在 update 和 delete 语句中
(1).查询值在某个区间的数据 select * from users where age < 22 and age > 23; (2).查询值不在某个区间的数据 select * from users where age not between 22 and 23; (3).查询同时满足多个条件的数据, and 和 or 同时使用时要注意运算顺序 select * from users where age = 22 or age = 24 and sex = '女'; -- age=24且sex='女',或age=24 select * from users where (age = 22 or age = 24) and sex = '女'; -- age=22或age=24,且sex='女'
(1).一个 _ 表示一个任意字符 select * from users where name like '__'; -- name为两个任意字符的数据 select * from users where name like '_y'; select * from users where name like 'l_'; select * from users where name like '__y'; select * from users where name like 'l__'; (2). % 表示任意个任意字符 select * from users where name like '%q%'; -- name中任意位置含有 q 的数据 select * from users where name like 'q%'/'%q'; -- 以 q 开头/结尾的数据
max(), min(), sum(), avg(), count()
聚合函数通常搭配分组进行数据的统计
-- 计算表中最大score,最小score,score总和,平均score,score项数,并分别命名 select max(score) as s_max, min(score) as s_min, sum(score) as s_sum, avg(score) as s_avg, count(score) as s_count from users; select count(*) from users; -- count(*) 按照表中所有列进行统计,只要其中一列有数据,就会统计 -- count(字段) 按照指定字段进行统计,如果列中出现 null ,则这个数据不会被统计
- group by 语句根据一列或者多列字段对数据进行分组
- 通常配合聚合函数使用,可以对分组后的结果统计、求和、求平均等
- 使用 group by 时,除了聚合函数,其他在 select 后面出现的字段都需要写在 group by 后面
(1).根据两个字段对数据分组后,统计各组的总数 select classid,sex,count(*) as num from users group by classid,sex; -- 根据classid、sex字段对数据进行分组,然后使用 count(*) 统计各组的总数 (2).根据一个字段对数据分组后,求各组中另一个字段的平均值 select classid,avg(age) as AVGage from class group by classid; -- 根据classid字段对数据进行分组,然后使用 avg(age) 求各组中age的平均值 (3).根据两个个字段对数据分组后,先求各组中另一个字段的平均值,再对平均值的结果进行筛选 select age,sex,avg(score) as AVGscore from class group by age,sex having avg(score) >= 75; -- 根据age、sex字段对数据进行分组,然后使用 avg(score) 求各组中score的平均值,最后筛选出平均值在75及以上的组
- 在MySQL中使用select语句查询的结果是根据数据在底层文件中的结构来排序的
- 默认使用 asc ,即升序排列,使用 desc 为倒序排列
(1).根据多个字段对数据进行排序 select * from class order by classid,age desc,score desc; -- 先根据classid升序排列,classid相同时根据age降序排列,age相同时根据score降序排列
- limit 语句运用在数据分页,或查询排序后值为最大/最小的数据
- limit n : 查询表中前 n 条数据
- limit m,n : 跳过前 m 条数据,再查询 n 条数据
(1).查询表中前 n 条数据 select * from class limit 3; (2).在表中跳过前 m 条数据,再查询 n 条数据 select * from class limit 5,3; (3).查询表中某个字段值最大的 n 条数据 select * from class order by score desc limit 5;