數據庫SQL---查詢

一、查詢全部列數據庫

      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五、鏈接查詢

1)定義:將兩個表或者兩個以上的表以必定的鏈接條件鏈接起來,從中檢索出知足條件的數據。
2)分類:
(1)內鏈接
          select ... from A,B 的用法
                產生的結果:行數是A和B的乘積,列數是A和B之和,即把A表的每一條記錄都和B表的每一條記錄組合在一塊兒,造成笛卡爾積,即把B表的每一條記錄都和A表的每一條記錄組合在一塊兒,造成笛卡爾積。
                 注意:select * from A,B輸出結果和select * from B,A同樣,即AB能夠互換。
          select ... from A,B where ...的用法
                 產生的笛卡爾積,用where中的條件進行過濾
          select ... from A join B on...的用法
                  join是鏈接,AB互換結果不變。
          SQL92和SQL99標準的區別
                  select ... from A,B where ...是SQL92標準
                  select ... from A join B on...是SQL99標準
                         輸出結果同樣
                   推薦使用SQL99標準:容易理解;on和where能夠作不一樣的分工:on指定鏈接條件,where對鏈接以後臨時表的數據進行過濾。
           例如:把工資大於2000的員工的姓名和部門的名稱輸出和工資的等級
                      SQL99標準
                              select "E".ename,"D".dname,"S".grade from emp "E" join dept "D"
                              on "E".deptno="D".deptno join salgrade "S"
                              on "E".sal>="S".losal and "E".sal<="S".hisal
                              where "E".sal>2000
                      SQL92標準
                               select "E".ename,"D".dname,"S".grade from emp "E", dept "D",salgrade "S"
                               where "E".sal>2000 and "E".deptno="D".deptno and ("E".sal>="S".losal and "E".sal<="S".hisal)
(2)自鏈接:一張表本身和本身鏈接起來查詢數據。
        select * from emp a,emp b where b.ename='張三' and a.deptno=b.deptno;--在員工表中查找與張三在同一個部門的員工的信息。

(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)例子:輸出每一個員工的姓名、工資、上司的姓名
                 select "E1".ename,"E1".sal,"E2".ename "上司的姓名" from emp "E1" join emp "E2"
                 on "E1".mgr="E2".empno
                 union
                 select ename,sal,'已經是最大老闆' from emp where mgr is null
2)若干個select子句要聯合成功的話,必須知足兩個條件:
(1)若干個select子句輸出的列數必須是相等的;
(2)若干個select子句輸出列的數據類型至少是兼容的。

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);

相關文章
相關標籤/搜索