注意事项
指令语法的优先级: where > group by >order by > limit
例:select count(id) as cnt,age from tablename where id > 6 group by age having cnt < 2 order by age desc limit 2,5
PS:查找tablename表中age列从id列大于6后面开始分组,且计算age值相同的数量,然后查询相同数量小于2的数据以age降序排列,且从第二行开始取值一页显示5条
通配符查询:like #数据库查询肯定用索引,所以这个知识只要了解即可
固定用法like + 条件
1、% 代表所有字符(like ‘n%’ ) #查询只要以n开头的
2、_ 代表一个字符(like 'n_') #查询只要字符串内有n都查询到
where后面可以跟比较运算符和逻辑运算符(=、<、>、!=、not、or、and)
PS:如果用like去搜索,就无法使用索引查询,索引查询的速度要快与通配符查询
限制符查询:limit
PS:应用在网页每页呈现多少数据
select * from tablename limit 5; #tablename就是表名,数字5就是要取几行数据
select * from tablename limit offset(4),5 #offset就是偏移量,意思就是从第几行开始,5就是要取几行
限制符查询实例:page=1 的时候取10条数据
思路:page=1的时候就取10条,就是从数据库中取10行(0-10),第二页就是要从数据库的10行开始取10条,以此类推
page = 1 limit 0,10
page = 2 limit 10,20
page = 3 limit 20,10
指令就是 page = n select * from tablename where 查询条件 limit (n-1)*10,10
排序查询
select * from tablename order by age; #将列表中的数据通过age来进行升序排序,后面有asc和desc两个参数,如果不写,默认按照升序进行排序
select * from tablename order by age asc; #acs就是按照升序 排列
select * from tablename order by age desc; #desc就是按照降序排列
select * from tablename order by age desc,id asc; #优先按照age降序排列,如果age有相同的,就按照id进行升序排列
分组查询(用到分组查询必须要有一个聚合函数这是一定的配套的)
PS:where 和having 的区别(都是用来过滤数据的),但是不同的where是过滤的原生的数据(没有经过处理的数据,比如分组等),having是过滤group by(分组)之后的数据进行二次筛选,这个程序设计者设计的,固定的
PS:where是可以和having配合使用的,但是必须在group by 分组之前使用,即select count(id) as cut,age from tablename where id > 6 group by age having cnt < 2 #查找tablename中age列下序号6以后的值,并且分组默认升序排列,且计算相同的数量,查找相同数量<2的数据
聚合函数:
count() #计数
max() #最大值
min() #最小值
avg() #去平均
sum() #求和
PS:sum和count是不同的,sum是做计算,count只是数个数
语法:
select 聚合函数 as name,条件1 from tablename group by 分组条件 #as name 是将聚合函数修改一个名字,能够更直观的在列表内呈现 group by 后面的就是以什么分组的条件 条件1就是列表内需要查询的列名
PS:条件1肯定是和分组条件一样的,否则会出现数据查询不完全
select count(id) as cnt,age from tablename group by age; #分组age并且计算这个组相同的条件的数量
select count(id) as cnt,age from tablename group by age having cnt < 2; #查询tablename表中age列然后计算相同age值的数量并且查找相同age数量<2的数据
where和having连用
select count(id) as cut,age from tablename where id > 6 group by age having cnt < 2 #查找tablename表中age列,且id列>6的值,并且分组,且计算相同的数量,查找相同数量<2的数据
子查询(sql语句套sql语句) #不建议用,使用子查询后无法用索引,而且效率比连表查询还慢
select * from tablename1 where 列名 in (select 列名 from tablename2);