天天看點

SQL server資料查詢筆記資料查詢

資料查詢

一、單表查詢

二、連接配接查詢

三、嵌套查詢

四、集合查詢

五、基于派生表的查詢

一、單表查詢

1.列查詢

select [all|distinct] <表達式> [别名] [,<表達式> [别名]]...
from <表名|視圖名> [,<表名|視圖名>]...|(<select語句>) [as] <别名>
[where <條件表達式>]
[group by <列名1> [having <條件表達式>]]
[order by <列名2> [asc|desc]];
           
注:預設情況下select all
SQL server資料查詢筆記資料查詢
SQL server資料查詢筆記資料查詢

2.元組查詢

  • 限定all或distinct
  • 增加where限定條件

where子句常用字元

查詢條件 謂詞 比較 =,>,<,>=,<=,!= 确定範圍 between and,not between and 确定集合 in,not in 字元比對 like,not like 空值 is null,is not null 邏輯運算 and,or,not

1.比大小

2.确定範圍

between and包括兩端的值

3.确定集合

SQL server資料查詢筆記資料查詢

4.字元比對

格式:

[not] like '<比對串>' [escape '<換碼字元>']
           
%代表任意長度字元串,_代表任意單個字元
  • 聚集函數

聚集函數

count(*) 元組個數 count([all|distict] <列名>) 該列值個數 sum([all|distict] <列名>) 該列值綜合 avg([all|distict] <列名>) 該列平均值 max([all|distict] <列名>) 該列最大值 min([all|distict] <列名>) 該列最小值

注:聚集函數隻能用于select子句和group by的having子句中,預設為all

  • group by子句
作用:細化聚集函數的作用範圍

3.order by

SQL server資料查詢筆記資料查詢

2.連接配接查詢

  • 等值連接配接與非等值連接配接

等值連接配接:連接配接運算符為=

非等值連接配接:連接配接運算符不為=

連接配接查詢的兩種形式:

[<表1>.]<列名1> <比較運算符> [<表2>.]<列名2>
           
[<表1>.]<列1> between [<表2>.]<列2> and [<表2>.]<列3>
           

注:連接配接字段必須可比

Ex:查詢選修2号課程且成績在90分上所有學生的學号和姓名

SQL server資料查詢筆記資料查詢
注:先輸入其他條件再輸入連接配接條件執行效率更高 
  • 自身連接配接
EX:查詢每一門課的先修課的先修課
SQL server資料查詢筆記資料查詢
  • 外連接配接
EX:查詢每個學生的選課資訊時,預設情況下要是有學生沒選課,那麼這個學生的資訊就不顯示了,現在要求把沒選課的學生也顯示出來
SQL server資料查詢筆記資料查詢
  • 多表連接配接

3.嵌套查詢

查詢塊:一個select-from-where語句塊

嵌套查詢:查詢塊嵌入到另一個查詢塊的where或having子句中的查詢

相關查詢:子查詢的查詢條件依賴于父查詢

不相關查詢:子查詢的查詢條件不依賴于父查詢

EX:查詢和劉晨在同一個系中學習的學生

  • 使用in來完成嵌套查詢
select Sno,Sname,Sdept
from Student
where Sdept in
    (
        select Sdept
        from Student
        where Sname='劉晨'
    );
           
  • 使用比較運算符來完成嵌套查詢(得确切知道内層查詢隻有一個值了)
select Sno,Sname,Sdept
from Student
where Sdept=
    (
        select Sdept
        from Student
        where Sname='劉晨'
    );
           
 EX:找出每個學生超過他自己選修課程平均成績的課程号
select Sno,Cno
from SC x
where Grade>=
    (
        select avg(Grade)
        from SC y
        where y.Sno=x.Sno
    );
           
注:這裡為了區分子查詢和父查詢中的SC,分别對SC取不同的别名來訓示。
  • 帶有any(some)或all謂詞的子查詢
注:用聚集函數實作子查詢比直接用any或all查詢效率要高。
  • 帶有exists謂詞的子查詢

注:

1.由exists引出的子查詢,其目标清單達式通常用*,因為帶exists的子查詢隻傳回真或假值,給出列名無實際意義。

2.SQL中沒有全稱量詞,隻能用exists/not exists來代替。

EX:查詢選修了全部課程的學生姓名

select Sname
from Student
where not exists
    (
        select *
        from Course
        where not exists
            (
                select *
                from SC
                where Sno=Student.Sno and Cno=Course.Cno
            )
    )
           
注:按照SQL沒有全稱量詞的尿性,隻能用沒有一門課程是他不選修的來代替。

4.集合查詢

集合操作:并(union)、交(intersect)、差(except)

5.基于派生表的查詢

子查詢不僅可以在where和having子句,也插入在from子句中,以此生成一個派生表并成為主查詢的查詢對象

EX:查詢所有選修了1号課程的學生姓名

select Sname
from Student, (select Sno from SC where Cno='1') as SC1
where Student.Sno=SC1.Sno;
           
注:這裡的as可以省略,SC1就是個派生表,現在SC1就可以當個普通的表來查詢了

繼續閱讀