1.处理空值数据
select pk_id , ifnull ( f_num , 0 ) from t_test ;
判断 f_num 列的每一个值是否为null ,如果为 null 就用数字 0 来代替。
语法格式:
select 列1 , ifnull (列2 , A) from 表名 ; 为 null 就用 A 来代替。
2. 测试是否为空用 is null 。
判断是否不为空用 is not null 。
select 列A , 列B from 表名 where 列C is not null ;
3.多列排序是根据后面列名的顺序确定优先级。
默认排序为升序:asc 。
降序为: desc 。
select 列1 , 列2 from from 表名 order by 列3 , 列4 desc ;
4. 数据库建、用、删:
create database 数据库名 ;
use 数据库名 ;
drop database 数据库名 ;
5. 聚合函数:
sum 求和 、avg 求平均 、count 记录行的数目、 max 求最大值、min 最小值 。
用 as 取别名,别名直接跟在 as 后面。
使用 all 包含 null 值。
max、min 函数自动忽略 null 值。
select sum (all 列名) as 总和 from 表名 ;
select avg (all 列名) as 总和 from 表名 ;
select count ( * ) as 总和 from 表名 ;
select max ( 列名 ) as 总和 from 表名 ;
select min ( 列名 ) as 总和 from 表名 ;
6. select count ( * ) from 表名 ; 计数所有选择行,包括 null 值,包括重复 。
select count ( all 列名 ) from 表名 ;计数非 null 值,包括重复 。
select count ( all 列名 ) from 表名 ;查询列时,不计数 null 值,去掉重复 。
7. group by 分组:
select 列1 , 聚合函数 (聚合函数作用范围) from 表名 where 过滤条件 group by 列2 ;
select city , count ( * ) from t_temp where temp > 35 group by city ;
select 后面有聚合函数,也有非聚合函数 就需要分组。
8. having 过滤
having 后面跟的是聚合函数,有 having 必定有 group by 。
例:统计个城市高温天气(气温>35度)天数大于3天的城市:
select city , count ( * ) from t_temp where temp > 35 group by city having count ( * ) > 3 ;
9. sql 语句书写顺序:
select => from => where => group by => having => order by ;
执行顺序: from => where => group by => select => having => order by ;
10. 子查询:
非相关子查询可以单独运行。
从结果集中查询需要给结果集命名:
select * from ( select f_classname , f_teacher from t_class ) x ; 此句中 x 为别名。
11. where 子句中的子查询
select 列A from 表1 where 列B = (子查询);
返回多个结果的子查询:
select 列A , 列C from 表1 where 列B in(s0elect 列D from 表2);
12. 子查询中的运算符
1). exists后面必须跟子查询且必是非相关子查询,有返回行就为真,无返回行即为假。
exists语句通常写在where后面。
select * from t_class where exists ( select * from t_student ) ;
2). all 和 any :
select 列A from 表1 where 列B > ( 子查询语句 ) ;
比较运算符 = 、 > 、 < 、 >= 、 <=后面只能跟单个值。
如果有多个返回值就用 any 或者 all 。
> all 表示比最大值还大 。
>any 表示比最小值大 。
select 列A from 表1 where 列B > ( 子查询语句 ) ;
只要有一行满足就为真,所有行都不满足就为假。
13. union 运算符:
使用 union 查询多个表时,列数必须一致且所有对应列的数据类型也要一致。
select 列A , 列B from 表1 union all select 列C , 列D from 表2 ;
如果不写 all ,显示结果会自动去掉重复数据信息。
14. 联接
1). 相等联接
select 表1.列A , 表1.列A , 表1.列A from 表1 join 表2 on 表1.列m = 表2.列n ;
可多表联接
select * from 表1 join 表2 on 表1.列m = 表2.列n join 表3 on 表1.列A = 表3.列B ;
2). 非相等联接
select 表1.列A , 表1.列A , 表1.列A from 表1 join 表2 on 表1.列m > 表2.列n ;
使用别名:
select SE . examID , SE . mark , S.name as studentname from StudentExam as SE
join Student as S on SE . studentID = S . studentID order by examID ;
多个条件用 and 连接 :
select c . * , p . name from class c , professor p where c . professorID = p . professorID and c . professorID >= 2 ;
使用别名时 as 可以省略不写。
3). 外联接不能简写
left join ... on 此写法 join 左边的表会完整显示 。
reght join ... on 此写法 join 右边的表会完整显示 。