首页 > 代码库 > #3 SQL多表查询

#3 SQL多表查询

 

经验:
1,where 和having的区别?
     where是用于原始字段的过滤,
     having主要用于聚合函数的汇总过滤,虽然这个原始字段也是可以用的,但是不推荐,因为效率比where低
     所以尽量少用having,能不用尽量不用(where 能实现的having 都能实现,但是效率低 )
 
2,count(*)和count(字段名)的差别
    第一个会输出全部的行,,而第二个如果遇到为Null的,就不会数出来,
 
3,还有一个要注意的.如果 我要查询一个   hehe_haha   ,hehe_xixi
这个怎么查询呢?
    where name  like ‘hehe[ _ ]%‘
    要用这样,因为[  _ ] 这个代表的是一个下划线字符
 


 

今天教了挺多数据库的东西,很多都是我不懂得。所以这一章必须要好好学习。。。(PS:那个时候对聚合函数还有一些常用的函数不了解,发出的感慨啊。 )

1,查询
模板:所有的SQL语句,都是按照这个规则来的,顺序也是这样的,我们不能随意变动这个顺序。比如 from放到前面来是不行的。
select 字段名.....
from 表名
where 条件(这里只能是字段名才可以,不可以是别名)
group  by 分组
     having 条件
order by 字段名/别名/字段名组合  desc(降序)
 
取别名的方法:
     1,select 别名=原始字段/字段组合/聚合函数 from 表名
     2,select 原始字段/字段组合/聚合函数 别名 from 表名
     3,select 原始字段/字段组合/聚合函数 as 别名 from 表名(Oracle不能加 AS)
 
怎么连接两个字段的值,
eg: 
select 姓+名 as 姓名 from 基本信息表
然后加可以用,加减乘除都是可以的,(能运算的只有整型)   除了+
 
SQL关键字:
top:取出查询出来的前几个值/前百分之几的值
用法:     select top 3/top 30 percent * from tablename  
 
between:  从n(小) and m(大)  (范围打击)
not:把这个条件取反
 
not between :不在..范围内(不单独使用)
 
 
in:在这几个值中的一个(定点打击 where name in(‘hehe‘,‘haha‘....)
 
distinct:查询的时候,只输出不重复的字段           eg:select distinct Id from tablename
 
like:模糊查找.(只针对于字符串)
select * from table
where name like ‘hehe%‘
 
like中有几个通配符:
1,%     代表任意个字符,  >=0    ‘hehe%y‘            与hehe开头,与y结尾
2,_     代表一个字符  ,   =1       ‘h_‘              两个字节
3,[]          代表括号内的一个    =1               [1-9]   1-9中的一个数
4,[^]       代表不在括号内的一个   =1          [^1,^3-9] 不是1,不是3-9中的一个,(如果取反.两个都要加^这个符号,要取反的加)
 
 
分组:这个是一个重点,.也是一个难点
 
格式:
group by 分组
     having  聚合函数的过滤
----------------------------------
注意事项:
1,select除了聚合函数外,其他字段都要跟在group by 分组中
2,对聚合函数进行过滤,用having 而不是用where
 
 
聚合函数:
1,MAX(字段/字段组合)  ---取最大值
2,MIN(字段/字段组合)  --- 取最小值
3,AVG(字段/字段组合)   ---取平均值
4,SUM(字段/字段组合)               ---求和
5,COUNT(字段/字段组合)          --计算行数
          
 
排序
 order by 字段名/字段组合  desc(降序,默认升序)
 
一些关于时间的函数,这个是最麻烦的.也是最难的....
getdate()     获取当前时间 ------>不确定函数,因为每次运行的结果是不一样的
year(time)     返回年
month(time)     返回月
day(time)          返回天数
 
datediff(类型(返回天(dy)还是年(yy)?),开始时间,结束时间)
 
convert(转换出来的类型,表达式,类型(看帮组文档))     
eg:convert(varchar(10), time,102(这个是YYYY.MM.DD))
 
datepart(类型,时间)          获取时间的一部分
这个类型可以查帮助文档