6、null(没有值 空值)
零和null 是不一样的null表示空值没有值,零表示一个确定的值
null 不参与<> 、!=、= 运算但可以参与is 或is not运算
任何数字与null参与数学运算结果为null
任何类型的数据都可以为null。如:
create table t1
( name nvarchar(20), cnt int, riqi datetime
);
insert into t1 values (null,null,null);
select * from t1;
drop table t1;
--输出奖金非空的员工的所有信息
select * from emp
where comm is not null;--null 不参与<> 、!=、= 运算但可以参与is 或is not运算
--输出每个员工的姓名、年薪(包括奖金)假设comm为一年的奖金
select empno,ename,sal*12+comm as "年薪" from emp;--error
-- null 不能参与任何数学运算否则结果永远为null
select empno,ename,sal*12 + isnull(comm,0)as "年薪" from emp;
--isnull(comm,0)如果comm为null返回零否则返回comm
7、order by
select * from emp order by sal;--默认升序
select * from emp order by sal desc;
select * from emp order by deptno,sal;--先按deptno升序排序如果deptno相同在按sal升序排序
select * from emp order by deptno desc,sal;--deptno降序排,sal升序排
8、模糊查询(搜索时经常使用)
格式:
select 字段的集合 from 表名 where 某个字段名字 like 匹配的字符;
匹配的条件通常含有通配符;
通配符:
% 任意零个或多个字符;
_下划线 表示任意单个字符;
[a-f] a到f的任意单个字符;
[a,f] a或f;
[^a-c] 不是a不是b也不是c的任意单个字符;
匹配条件必须用单引号括起;
通配符当做普通字符的使用
create table student
(name varchar(20) null,
age int,
);
insert into student values('张三',88);
insert into student values('Tom',66);
insert into student values('a_b',22);
insert into student values('c%d',44);
insert into student values('abc_fe',56);
insert into student values('haobin',38);
insert into student values('c%',65);
insert into student values('long"s',88);
select * from student where name like '%\%%' escape '\';--把name中含有%的输出
select * from student where name like '%\_%' escape '\';--把name中含有_的输出
escape '\'表示把'\'当做转意字符的标志(开始)sql中可以把把任意字符当做转意字符的标志
9、聚合函数(多行记录返回一个值通常用于统计组内的信息)
函数分类
单行函数
每行返回一个值
多行函数
多行返回一个值
聚合函数是多行函数
例子:
select lower(ename) from emp;-- 最终返回的是行,low是单行函数
select max(sal) from emp; --返回时一行max()是多行函数
聚合函数是多行函数
聚合函数分类:
max()
min()
avg() 平均值
count()求个数
count(*)
返回表中所有记录的个数
select count(*) from emp;--返回emp表所有记录的个数
count(字段名)
返回字段值非空的记录的个数,重复记录也会被当做有效记录
select count(deptno) from emp;--返回值是这说明deptno重复记录也被当作有效记录
select count(comm) from emp;--返回值是这说明comm为null的记录不会被当做有效记录
count(distinct 字段名)
返回字段名不重复,并且非空的字段的记录
select count(distinct deptno) from emp;--返回值是三,统计deptno不重复的记录
注意的问题:判断下面sql语句是否正确
select max(sal),min(sal),count(*) from emp;--OK
select max(sal) "最高工资",min(sal)"最低工资",count(*)"员工人数" from emp;--ok
select max(sal),lower(ename) from emp;--error单行函数和多行函数不能混用
10、group by
格式:
group by 字段的集合
功能:
把表中的记录按照字段分成不同的组
例子:
查询不同部门的平均工资;
注意:理解group by a,b,c的用法
先按a分组,如果a相同在按b分组,如果b相同在按c分组,最后统计的是最小分组的信息
一定要知道下面语句为什么是错误的
use scott;
--输出每个部门的编号和该部门的平均工资
select deptno "部门",avg(sal) "部门平均工资"
from emp
group by deptno;
--判断下面语句是否正确
select deptno "部门",avg(sal) "部门平均工资",ename
from emp
group by deptno;-- error
--判断下面语句是否正确
select deptno ,ename
from emp
group by deptno;-- error
--总结:使用了group by以后select中只能出现分组后的整体信息,不能出现组内详细信息