zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    sql: update from
    sql: 查询,select
    english: 遭遇
    sql: sybase与oracle中insert into select和select into的用法
    lcd参数解释及刷新率计算,LCD时序
    Camera Binning Mode
    页框分配器【转】
    (一)洞悉linux下的Netfilter&iptables:什么是Netfilter?
    网络中的NAT模式
    组播、单播、多播
  • 原文地址:https://www.cnblogs.com/yangfen/p/13923262.html
Copyright © 2011-2022 走看看