MySQL之sql子句

一、sql子句
   1、作用
      <1> select:基本的查询语句,用来表中查询数据,确定结果集的内容。
      <2> from(join):确定数据的来源,生成相应的临时表
      <3> where:对from子句得到的临时表进行条件筛选,得到相应的临时表
      <4> group by:把条件筛选后的结果进行分组
      <5> having:与where子句作用类似,但是只作用于分组后的数据。对分组后的数据进行相关判断。
      <6> order by:对生成的结果集进行相应的排序。
      <7> limit:指定返回的结果集的行数。
 
    2、执行顺序
          from -> where -> select -> group by -> having -> order by -> limit
         注:1、where中不能使用聚合函数,因为聚合函数针对结果集。
                2、where中不能使用select中创建的别名,因为where在select前执行。
                3、group by后的每个分组只会返回一条记录,对于多个值可在select中使用聚合函数进行合并
                4、group by开始可以使用select中创建的别名。
 
    3、实例
1 select a.user_id as uid,count(a.id) as count
2 from application as a
3 where a.created_at > '20180101'
4 group by uid
5 having count > 0
6 limit 8
 
二、union 和 in 
   1、union:总是会创建一个临时表,然后再将数据返回给用户。且不加all时会进行去重,影响效率
 1 (select a.id,a.user_id
 2  from application as a
 3  limit 20
 4 )
 5 union all
 6 (select a.id,a.user_id
 7  from application as a
 8  limit 20
 9 )
10 limit 50
    注:limit 20是对两个select语句分别limit,最后的limit对union all形成的临时表进行limit。虽然使用了limit 50,但临时表实际只有40条数据。
 
   2、in:可在where子句中规定多个值。
    注:1、in() 关联子查询效率比较差,避免使用。
           2、避免使用多个范围条件,即where中使用多个in,会导致无法完全使用多列索引
 
三、count
    作用:1、使用count(*)统计行数
              2、使用count(col)统计某个列值的数量,但是要求这个列值是非空的(不统计null)
     注:count(*) 会忽略所有的列而直接统计行数,而不会扩展为所有的列。
 
四、group by 和 distinct
   1、group by:聚合函数,根据不同的列进行分组。但只会返回每个分组的一条记录,故可以实现去重的效果。
   2、distinct:用于去重。
select count(distinct a.id)              select distinct a.id, a.uer_id                    select a.id, distinct a.user_id
from application as a                    from applicatin as a                              from application as a
# 对id进行去重后count                      # 对id、user_id去重                                # 语法错误
  注:group by的效率低于distinct
 
 
 
 
 
 
 

猜你喜欢

转载自www.cnblogs.com/yuluodisuihe/p/9671853.html