1. 程式人生 > >風起何緣的專欄

風起何緣的專欄

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中只能出現分組後的整體資訊,不能出現組內詳細資訊