SQL语法2

常见语法

排序

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
原文地址:https://www.cnblogs.com/yangfen/p/13923262.html