SQL數據查詢
文章目錄
1 select語法
select all|distinct <目標**列**表達式> 【列】
from <表名或視圖名>(select語句)as <別名>
where<條件表達式>【行】
--只有符合having條件的組纔可以輸出
group by <列名1> HAVEING<條件表達式>
with {CUBE|ROLLUP}
order by<列名2>[ASC|DESC]
目標列表達式可以爲列名,算數表達式,函數,字符串等。
where子句作用於基本表或者視圖,從中選擇滿足條件的元組
having子句從group後的組中選擇滿足條件的組
總結一下自己的理解:
select相當於關係代數中的映射,是對列的操作,除了top 5 * 以外
where相當於關係代數裏的選擇操作,是對行的操作,where後邊不可以使用聚集函數,having處和select處纔可以使用聚集函數
group 是按指定列的值分組,比如,把學號相同的記錄分爲一個組,where篩選掉不需要參加分組的記錄,
having時對分組後的記錄進行篩選
order by 列名 ASC DESC默認升序
順序:where-----group-----having
2 查詢條件where
比較:
= 、>=、<=、<>
確定範圍
between and (閉區間) not between and
確定集合
IN NOT IN
字符匹配
like not like
_匹配一個任意字符,包括一個漢字
%匹配0至多個任意字符
[]:指定範圍內的任意單個字符,例如 LIKE’[CK]’,表示CK中的一個字符
[^ ] 和正則表達式一樣的。
數據庫字符集爲ASCII 時一個漢字需要兩個_,當字符集爲GBK時只需要一個_
轉義匹配,如果查詢含有_的字符串 ,在前邊加一個反斜槓 \
[not] like<匹配串> [escape換碼字符’]
空值匹配
is null
is not nul
多重條件匹配
and , or , not
限制結果返回行數top
--選擇前五行
select top 5 stu_no 學號,stu_name 姓名
FROM Student;
--3~5行記錄---嵌套查詢
select TOP 3* FROM student
where stu_no NOT IN (SELECT TOP 2 stu_no FROM student)
--集合的差 except
SELECT TOP 5 * FROM student
EXCEPT
SELECT TOP 2 * FROM student
---注意select * 代表選擇所有列,即一行記錄的所有屬性,此時的select對行和列都進行了篩選,只是
行只能選擇顯示幾行。
3 聚集函數
聚集函數只能用於select子句和group子句的having子句中
COUNT(*) | 統計元組個數 |
---|---|
COUNT([distinct|all]<列名>) | 統計一列中值的個數 |
SUM([distinct|all]<列名>) | 統計一列值的總和,must數值型 |
AVG([distinct|all]<列名>) | 統計一列值的平均值,must數值型 |
MAX([distinct|all]<列名>) | 求一列中的最大值 |
MIN([distinct|all]<列名>) | 求一列中的最小值 |
avg(),count()在統計時,會忽略爲null的值。比如
在統計某學生選了多少門選課時,應該用count(cou_no),而不能用count(grade)
因爲如果他缺考,成績爲null的話,這們選課就count()不到。
count(stu_no)統計學生人數時,也不會去掉相同學號的記錄,就是說,count()不是集合操作,它只是數數符合條件的記錄有幾條。count(distinct stu_no)
4 字符串函數
CHARINDEX
用來尋找一個指定的字符串在另一個字符串中的起始位置
LEN
MySQL中爲length
返回傳遞給它的字符串長度。
SELECT LEN(‘SQL SERVER課程’) ,返回12,空格也算哦
LOWER
把傳遞給它的字符串轉換爲小寫
UPPER
把傳遞給它的字符串轉換爲大寫
LTRIM
清除字符左邊的空格,右邊的不清除。
5 日期函數
6 數學函數
7 系統函數
注意CONVERT轉換數據類型
MySQL·使用CAST
8例題:一組變一行
列用CASE語句表示,相當於把group後的一組數據變爲一行數據
MAX使用原因,比如一個同學同一門課程考過兩次(補考),也就是說符合學號和課程號的記錄可能有多條,系統不知道選哪一條給我們看(二義性),或者使用MIN()也可以。
9 case用法
select Stu_no 學號,Cou_no 課程號,grade 成績,case
when grade>=90 then '優秀'
when grade>=80 then '良好'
when grade>=70 then '中等'
when grade>=60 then '及格'
when grade is null then '缺考'
else '不及格'
end as '等級'
FROM SC
--注意case的用法。