常见语法
排序
1位按年龄升序
2为按年龄降序
3为按年龄升序,遇到年龄的值相同时再按id降序
4位按年龄升序,遇到相同年龄值时再按id升序
select*from root order by age
select*from root order by age desc
select*from root order by age,id desc
select*from root order by age,id
聚合函数
min:最小 max:最大 sum:总和 avg:平均
第一条意为查询root表的name字段的所有值得数量(null的值不会被算上),name也可以换成其他字段,也可以换成“*”代表这张表有多少行的值,
第二条意为查询年龄的平均值,也可加上某个字段的个别值的再得出年龄的平均,其他函数一样这样套,灵活使用
第三条意为各个班级的最小的年龄
注:如果需要留两位小数,那就书写成round(avg(age),2),如果只加round就是四舍五入进一位变成整数
select count(name) from root
select avg(age) from root
select count(class),min(age)from root group by class
分组后过滤
意为查询男生的总数,下面是两个方案都可采用
select count(*) from root where gender=‘男‘
select gender,count(*) from root group by gender having gender=‘
对比where与having
*where是对from后面指定的表进行数据筛选,属于对原始数据的筛选
*having是对group by的结果进行筛选
设置分页
给root表中的age升序进行分页,前面数字代表位置,后面数字代表展示的数据数量
也可以用写一个数字,那就会展示这张表原始的数据,例如4,就会出现从头开始的截至4条数据显示
注:下面的0,5意思为从0位置获取5条数据;5,5是从第五个开始,取5条数据
例如有12条数据,每页展示5条 12/5 2*1
select * from root order by age limit 0,5或者limit 5
select * from root order by age limit 5,5
select * from root order by age limit 10,5
连接查询
可以实现多个表的连接查询,首先得有个共同的值对应同一个用户,来让表进行连接
以下的id是能够让两张表共同有联系的,都是同一个用户的数据,如果不加上id,那么数据的左右边数据一行里不是同一个用户,加上id,就能让同一id的用户出现在一行中
方式一:等值连接
select * from 表名1,表名2 where 表名1.字段1=表名2.字段2
会产生临时表,占内存,如果还需要加条件,在后面加where 表名.字段名=数值
如果有三个表的话,在最后加个and 表名2.字段2=表3.字段3
注意,两张表一定要有一个有关联性的字段
select * from root,root_copy1 where root.id=root_copy1.id
方式二:内连接
select * from 表名1 inner join 表名2 on 表名1.表名1=表名2.表名2
不会产生临时表,不占内存,如果还需要加条件,在后面加where 表名.字段名=数值
会根据同一个id的所有数据之后放在一起,不会错行
如果有三张表的话,在加一句inner join 表名2 on 表名2.字段2=表名3.字段3,
select * from root
inner join root_copy1 on root.id=root_copy1.id
左、右连接
把inner改为left,就是把左边表一的数据全部展示出来,右边第二个表的数据会找到与表一的那个关系连成一行有用的数据,右边没有数据的会显示null
把inner改为right,跟left的意思同等
select * from 表名1 left join 表名2 on 表名1.字段=表名2.表名2
left前面的表示左边表后面的是右边表
select * from root
left join root_copy1 on root.id=root_copy1.id
自关联查询
例如地址栏选择的时候,就像上下级的关系,一个选择一个,这个时候为了方便可以放于两张表中,但需要2个id来区分谁是谁的上下级
有两种方法可以查询某个省的一些市,一种是再复制一张表,另一种是查询两边同一个表但一定要把字段名改了才能查询2次一张表
注:如果超过三级以上,就跟前面的一样加上and 表名.字段名=表名.字段名
select * from root,root_copy1 where root.aid=root_copy1.aid and root.atitle=‘湖南‘
标量子查询
select里面再包括select用括号括起,主查询主要用*,子查询直接书写要查的字段,当不知道值为多少的时候,可以加个括号再加个select语句
可以先把主查询的所有数据先查出,子查询在查所要的条件
以下的意思为查询root_copy1表里大于平均年龄的数据
select * from root_copy1 where age>(select avg(age) from root_copy1)
列子查询
就是查询一列多行的数据,把=换成in
=只是查询某一个值,in是可以查询多个值
注:in 范围
格式:主查询 where 条件 in (列子查询)
any | some 任意一个
格式:主查询 where 条件=any(列子查询),=换成“><”也可以,唯独“!=”不行
all
格式:主查询 where 列=all(列子查询):等于里面所有,=换成“<>”也可以
格式:主查询 where 列<>all(列子查询):不等一其中所有
select * from root where name in(select age from root_copy1 where atitle=‘河南‘)
行子查询
就是查询一行多列的数据
例:
select * from root where id=101 and name=‘小样‘
select * from root where (id,name)=(101,‘小样‘)
以上的查询方式如果用行子查询那就变成
select * from root where (id,name)=(select id,name from........)
表子查询
子查询返回的结果是一个表,多行多列
把查询出来的结果当做数据源使用放在inner join后面
as a是把表的表名改成a,on后面的是过渡语句,把除掉小陈和小样的数据都拿出来
select * from root inner join (select * from root where name in(‘小陈‘,‘小样‘)) as a on root.name=a.name