一、查詢全部列數據庫
select *from emp;--*表示全部的,from emp表示從emp表中查詢。函數
二、查詢指定列排序
select empno,ename from emp;
select 888 from emp;--ok,輸出的行數是emp表的行數,每行只有一個字段,值是888。
select 5;--OK,不推薦。
三、消除重複元祖:distinct字符串
select distinct deptno from emp;--distinct deptno會過濾掉重複的deptno,也能夠過濾掉null,即若是有多個null只輸出一個。
select distinct comm,deptno from emp;--把comm和deptno的組合進行過濾。數學
select deptno,distinct comm from emp;--error,邏輯上有衝突。io
四、給屬性列取別名:astable
select ename,sal*12 as "年薪" from emp;--as能夠省略。date
五、查詢通過計算的列select
select ename,sal*12 as "年薪" from emp;--as能夠省略。分頁
lower()將大寫字母改成小寫字母;upper()將字符串轉換爲大寫字母。
六、比較運算:>,>=,<,<=,!=(<>),=(等值鏈接)
select * from emp where sal>=1500 and sal<=3000;--查找工資在1500到3000之間含二者的全部員工的信息。
select * from emp where sal<>1500 and sal<>3000 and sal<>5000----把sal既不是1500也不是3000也不是5000的記錄輸出,數據庫中不等於有兩種表示:!= <>推薦使用第二種,對或取反是而且,對而且取反是或。
七、範圍查詢:between...and;not between...and
select * from emp where sal between 1500 and 3000--查找工資在1500到3000之間含二者的全部員工的信息。
select * from emp where sal not between 1500 and 3000--查找工資在1500到3000之間不含二者的全部員工的信息。
八、集合查詢:in(屬於若干個孤立的值)
select * from emp where sal in (1500,3000,5000);
select * from emp where sal not in (15000,3000,5000);--把sal既不是1500也不是3000也不是5000的記錄輸出
九、空值查詢:null(沒有值,空值)
1)零和null是不同的,null表示空值,沒有值,零表示一個肯定的值。
2)null不能參加的運算:<> != =
3)null能夠參與的運算:is not is
select * from emp where comm is null;---輸出獎金爲空的員工信息
select * from emp where comm is not null;---輸出獎金不爲空的員工信息
select * from emp where comm <> null;---錯,輸出爲空
select * from emp where comm != null;---錯,輸出爲空
select * from emp where comm = null;---錯,輸出爲空
4)任何類型的數據都容許爲null
create table t1 (name nvarchar(20),cnt int,riqi datetime);
insert into t1 values (null,null,null);---正確
5)任何數字與null參與數學運算的結果永遠是null
---輸出每一個員工的姓名年薪(包含獎金)comm假設是一年的獎金。
select empno,ename,sal*12+comm "年薪" from emp;---錯,null不能參與任何數據運算不然結果爲空。
---正確的寫法:
select ename,sal*12+isnull(comm,0) "年薪" from emp;---isnull(comm,0)若是comm是null就返回零不然返回comm的值。
十、字符匹配查詢(模糊查詢)
1)格式:select 字段的集合 from 表名 where 某個字段的名字 like 匹配的條件。匹配額條件一般含有通配符。
2)通配符:
(1)%---表示任意0個或多個字符
select * from emp where ename like '%A%'---ename只要含有字母A就輸出。
select * from emp where ename like 'A%'---ename只要首字母爲A就輸出。
select * from emp where ename like '%A'---ename只要尾字母爲A就輸出。
(2)_(下劃線)---表示任意單個字符
select * from emp where ename like '_A%'---ename只要第二個字母爲A就輸出。
[a-f]---表示a到f中的熱任意單個字符,只能是abcdef中的任意一個字符
select * from emp where ename like '_[A-F]%'---把ename中第二個字符是A或B或C或D或E或F的記錄輸出
[a,f]---表示a或f
[^a-c]---表示不是a也不是b也不是c的任意單個字符
select * from emp where ename like '_[^A-F]%'---把ename中第二個字符不是A也不是B也不是C也不是D也不是E也不是F的記錄輸出
(3)匹配的條件必須用單引號括起來,不能省略,也不能改用雙引號
(4)通配符做爲不一樣字符使用的問題
預備操做: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',99);
insert into student values ('haobin',77);
insert into student values ('HaoBin',55);
insert into student values ('c%',33);
insert into student values ('long''s',100);
select * from student;
select * from student where name like '%\%%' escape '\'---把name中包含有%的輸出
select * from student where name like '%\_%' escape '\'---把name中包含有_的輸出
十一、邏輯查詢:and or not
select * from emp where sal=1500 or sal=3000 or sal=5000;
十二、排序運算:order by(以某個字段排序),asc是升序默承認以不寫,desc是降序
1)order by a,b---a和b都是升序,若是不指定排序的標準,則默認是升序,升序用asc表示,默承認以不寫。
2)order by a,b desc---a升序,b降序,爲一個字段指定的排序標準並不會對另外一個字段產生影響。
3)order by a desc,b---a降序,b升序
4)order by a desc,b desc---a和b都降序,建議爲每一個字段指定排序的標準。
5)例子:asc是升序的意思默承認以不寫,desc是降序
select * from emp order by sal;--默認升序排列
select * from emp order by deptno,sal;---先按照deptno升序排列,若是deptno相同,再按照sal升序排列
select * from emp order by deptno desc,sal;---先按照deptno降序排列,若是deptno相同,再按照sal升序排列。desc只對deptno產生影響不會對後面的sal產生影響。
select * from emp order by deptno,sal desc;---先按照deptno升序排列,若是deptno相同,再按照sal降序排列,desc只對sal產生影響不會對deptno產生影響。
1三、聚合查詢(多行記錄返回一個值,一般用於統計分組的信息)
1)函數的分類:
(1)單行函數:每一行返回一個值
(2)多行函數:多行返回一個值
(3)聚合函數是多行函數
select lower(ename) from emp;---最終返回的是行lower()是單行函數
select max(sal) from emp;---返回行max()是多行函數
2)聚合函數分類:
(1)max()
(2)min()
(3)avg()---平均值
(4)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不重複的記錄的個數
3)注意的問題:
select max(sal),min(sal),count(*) from emp;---正確
select max(sal) "",min(sal) "",count(*) "" from emp;---正確
select max(sal),lower(ename) from emp;---錯誤,單行函數和多行函數不能混用
select max(sal) from emp;---正確,默認把全部的信息當作一組
1四、分組聚合
1)group by
(1)格式:group by 字段的集合
(2)功能:把表中的記錄按照字段分紅不一樣的組。
(3)例子:查詢不一樣部門的平均工資
select deptno,avg(sal) as "部門平均工資" from emp group by deptno
(4)理解group by a,b,c 的用法:先按a分組,若是a相同,再按b分組,若是b相同,再按c分組,最終統計的是最小分組的信息。
(5)使用了group by 以後 select 中只能出現分組以後的總體信息,不能出現組內的詳細信息。
2)having(對分組以後的信息進行過濾)
(1)having子句是用來對分組以後的數據進行過濾,所以使用having時一般會先使用group by。
(2)若是沒使用group by 但使用了having,則意味着having 把全部的記錄當作一組來進行過濾,極少用。
select count(*) from emp having avg(sal)>1000
(3)having子句出現的字段必須是分組以後的組的總體信息,不容許出現組內的詳細信息。
(4)儘管select 字段中能夠出現別名,但having子句中不能出現字段的別名,只能使用字段最原始的名字。
(5)having 和where 的異同
相同:都是對數據進行過濾,只保留有效的數據;都不容許出現字段的別名,只容許出現最原始的字段的名字。
不一樣:where 是對原始的記錄過濾,having是對分組以後的記錄過濾。
where必須寫在having前面,順序不可顛倒,不然運行出錯。
例子:把工資大於2000,統計輸出部門平均工資大於3000的部門的部門編號、部門的平均工資
select deptno ,avg(sal)"平均工資",count(*)"部門人數",max(sal)"部門的最高工資"
from emp where sal>2000---where是對原始記錄進行過濾
group by deptno having avg(sal)>3000---對分組以後的記錄進行過濾
其中不能夠將where 寫在having後面
1五、鏈接查詢
(3)外鏈接
select * from emp,dept where emp.deptno=dept.deptno;
(4)左外鏈接
select * from emp left outer join dept on emp.deptno=dept.deptno;
(5)右外鏈接
select * from emp right outer join dept on emp.deptno=dept.deptno;
(6)全外鏈接
select * from emp full outer join dept on emp.deptno=dept.deptno;
1六、聯合:表和表之間的數據以縱向的方式鏈接在一塊兒,前面均是橫向鏈接在一塊兒。1七、top(最前面的若干個記錄,專屬於SqlServer的語法,不可移植到其餘數據庫)
select top 5 * from emp;
select top 15 percent * from emp;
select top 5 from emp;---錯的
1八、複雜查詢:select\from\where\join\on\group\order\top\having的混合使用
1)查詢的順序:
select top...
from A
join B
on...
join C
on...
where...
group by...
having...
order by...
2)例子:把工資大於1500的全部員工按部門分組把部門平均工資大於2000的最高的前2個部門的編號、部門的名稱、部門平均工資的等級
(1)第一種寫法:
select "T".*,"D".dname,"S".grade from dept "D"
join(select top 2 "E".deptno,avg(sal) "avg_sal" from emp "E" join dept "D"
on "E".deptno="D".deptno join salgrade "S"
on "E".sal between "S".losal and "S".hisal
where "E".sal>1500
group by "E".deptno
having avg("E".sal)>2000
order by avg("E".sal) desc
) "T"
on "D".deptno ="T".deptno inner join salgrade 「S」
on "T"."avg_sal" between "S".losal and "S".hisal
(2)第二種寫法:
select "T".*,"D".dname,"S".grade from dept "D"
join(select top 2 "E".deptno,avg(sal) "avg_sal" from emp
where sal>1500
group by deptno
having avg(sal)>2000
order by "avg_sal" desc
) "T"
on "D".deptno ="T".deptno join salgrade 「S」
on "T"."avg_sal" between "S".losal and "S".hisal
1九、分頁查詢
假設每頁顯示n條記錄,當前要顯示的是第m頁,表名是A,主鍵是A_id
select top n * from A where A_id not in (select top (m-1)*n A_id from emp);
20、嵌套子查詢
1)使用in的子查詢
select ename from emp where deptno in (select deptno from dept);
2)使用比較運算符的子查詢
select empno,ename from where sal>=all (select sal from sal where ename='張三');
3)使用存在量詞exists的子查詢
select ename from emp where exists (select * from dept);