students
courses
reports
在sql server中(不區分大小寫):
1.單表無條件查詢
select * from students;
查找students中的全部數據,*是全部的意思,可以換成表中的某一列或多列;
select sname,2016-sage birthyear,lower(sno) lsno from students;
查找的同時可以計算,重新命名,控制大小寫;
select distinct sage from students;
查找出不重復的數據;
select count(distinct sdept),min(sage),max(sage),avg(sage) from students;
聚合函數 count,sum,avg,min,max分別計算列上值的個數,數值總和,平均值,最小值,最大值。
2.單表帶條件查詢。
select sname from students where sage between 18 and 20;
select sname from students where sage in(18,19,20);```
帶條件查詢的三種寫法。
```select sname from students where sname like '王%';
select sname from students where sname like '王____';```
模糊字符匹配,查找姓王的同學的全名。通配符%代表一個任意長度的字符串,_代表單個字符,一個漢字由兩個字符組成,所以此處加了四個字符串。
```select sname from students where sname not like '王%'; ```
當然也可以利用字符匹配查找不姓王的數據,只需在like前面加not。用'='的地方可以like替換,不過效率會降低。
```select cname from courses where cname like 'DB\_設%' escape '\';```
當要查詢的數據中確切的部分中含有通配符則應用escape進行轉義,如果不進行轉義,就會查找出無用的數據,比如要查找以"DB_"開頭,且倒數第2個漢字字符為“設”的課程的詳細情況。如果不進行轉義,就會出現如下情況:

```select sno,cno from reports where grade is null;```
查找存在記錄但是空值的數據。這種方法不能全部找出沒有值的數據,因為沒有值也可能記錄成 'null'或'_'。
>3.分組查詢和排序查詢。
```select cno,avg(grade) from reports group by cno;```
group by 是分組查詢,把一個表按照一定列上值相等的原則分組,然后分別對每個組進行操作。分組查詢經常配合聚合函數一起使用,聚合函數在每個組中進行運算,然后每個組返回一個結果。
```select cno,avg(grade) group by cname having count(*)>=3;```
having子句用于group by后對每一組進行條件判斷,滿足having條件的組被選出來。
*【摘自網絡】*使用Group By子句的時候,一定要記住下面的一些規則:
1)不能Group By非標量基元類型的列,如不能Group By text,image或bit類型的列
2)**Select指定的每一列都應該出現在Group By子句中,除非對這一列使用了聚合函數;**
3)不能Group By在表中不存在的列;
4)進行分組前可以使用Where子句消除不滿足條件的行;
5)使用Group By子句返回的組沒有特定的順序,可以使用Order By子句指定次序。
```select * from students order by sdept asc,sage desc;```
order by查詢結果排序。查找所有學生信息,按系名升序,同一系的按年齡降序。desc是降序,asc是升序,沒寫的時候默認升序,升序把空值放在最后,降序把空值放在最前面。
>總結:無論怎樣寫查找語句,得到的結果都是一張表,所以寫語句時要注意你寫的能不能構成一張表。