1. 程式人生 > >資料庫學習總結(四)——單表查詢

資料庫學習總結(四)——單表查詢

select語句單表查詢

1.簡單查詢

select語句的基本語法格式

select [distinct] *|欄位名1,欄位名2…
         from 表名
         [where 條件表示式1]
         [group by 欄位名 [having 條件表示式2]]
         [order by 欄位名 [ASC|DESC]]
         [limit [offset] 記錄數]

[ ] 是可選的,|是或者關係,是兩選一的,互斥的
解釋:
(1)distinct 剔除查詢結果中重複的資料
(2)” * “萬用字元,表示表中所有的欄位
(3)group by 用於將查詢結果按照指定欄位進行分組 having 用於對分組後的結果進行過濾,都是可選引數
(4)order by 將查詢結果按照指定欄位進行分組, ASC表示升序 DESC表示降序,如果不指定升序降序,則預設為升序
(5)limit用於限制查詢結果的數量,”offset“表示偏移量
偏移量為0,則從查詢結果第一條記錄開始
偏移量為1,則從查詢結果的第二天記錄開始
”記錄數“表示返回查詢記錄的條數

1.1查詢所有欄位

select *
from 表名;

” * “萬用字元來代替所有的欄位名

1.2查詢指定欄位

select 欄位名1,欄位名2,…
from 表名;

例題:列出XSB表中所有記錄的XM、XB和ZY列。
在查詢編輯器裡面輸入:

select xm,xb,zy  
form xsb;

select 後面跟查詢的欄位,也就是結果要顯示出來的欄位

2.按條件查詢

2.1 帶關係運算符的查詢

不等於 <>
不等於 !=
大於等於 >=
小於等於 <=
大於 >
小於 <
等於 =

where子句中可以使用關係運算符連線運算元作為查詢條件對資料進行過濾
例題:顯示CJB表中成績在60到80之間的所有記錄

select * form cjb where cj>=60 and cj<=80;

用and連線查詢條件 ,必須滿足兩邊的要求才會被查詢,是並且關係

顯示CJB表中成績為85,86或88的記錄。

select *
from cjb 
where cj=85 or cj=86 or cj=88;

用or連線查詢條件,只需要滿足其中的一個條件就可以被查找出,是或者關係
顯示XSB表中“計算機”專業或性別為“女”的同學記錄。

select * 
from xsb 
where zy='計算機' or xb='女'; 

欄位要加單引號

2.2 帶in關鍵字的查詢

in關鍵字用於判斷某個欄位值是否在指定集合中,滿足其中一個元素即可被查詢出來

select *|欄位名1,欄位名2…
from 表名
where 欄位名 [not] in (元素1,元素2…)

not為可選欄位,使用not表示查詢不在in關鍵字制定集合範圍中的記錄

例題:顯示CJB表中成績為85,86或88的記錄。

    select *
    from cjb 
    where cj in(85,86,88);

2.3 帶between and 關鍵字的查詢

between and 指定的是欄位範圍,在指定範圍內,則滿足條件,該欄位可被查詢出來,否則,不會被查詢出來

select *|欄位名1,欄位名2…
from 表名
where 欄位名 [not] between 值1 and 值2;

值1 表示範圍條件的起始值,值2 表示範圍條件的結束值

例題:顯示CJB表中成績在60到80之間的所有記錄

select *
from cjb 
where cj between 60 and 80;

2.4 空值查詢

空值不同於為0,也不同於空字串,空值為NULL

select *|欄位名1,欄位名2…
from 表名
where 欄位名 is [not] null; 

2.5 帶DISTINCT關鍵字的查詢

distinct 去除資料存在重複的值

select  distinct 欄位名
from 表名;

欄位名錶示要過濾重複記錄的欄位
例題:顯示所有的專業名稱即不重複的專業列

SELECT DISTINCT zy 
from xsb; 

distinct 後跟多個欄位名時,多個欄位值都相同才會被認作是重複記錄

2.6 帶like關鍵字的查詢

like 用於模糊查詢
”%“ 匹配任意長度的字元 例:”c%“ 可表示”ca“ “cap” “current”
“_” 匹配單個字元,若要匹配多個字元,需要打多個下劃線萬用字元
例“c__" 可表示”cat“ “cod”

select *|欄位名1,欄位名2…
from 表名
where 欄位名 [not]  like '匹配字串';

例題:顯示xsb中xm為”劉某某“的全部資訊

select * from xsb where xm like '劉__';

2.7 帶and關鍵字的多條件查詢

對條件進行and連線時,必須滿足所有條件記錄才會被返回

select *|欄位名1,欄位名2…
from 表名
where 條件表示式1 and 條件表示式2…;

2.7 帶or關鍵字的多條件查詢

使用or關鍵字連線多個查詢條件時,只要記錄滿足任意一個條件就會被查詢出來

select *|欄位名1,欄位名2…
from 表名
where 條件表示式1 or 條件表示式2…;

and與or也可一起使用,and優先順序高於or,因此當兩者一起使用時,應該先運算and兩邊的條件表示式,再運算or兩邊的條件表示式

3.高階查詢

3.1 聚合函式

聚合函式用於對一組值進行統計,並返回唯一值

count 返回某列的行數
sum 返回某列值得和
avg 返回某列的平均值
max 返回某列的最大值
min 返回某列的最小值

count函式

用來統計記錄的條數

selec count(*)
from 表名;

例題:顯示“計算機”專業的學生人數。

select count(*) from xsb where zy='計算機';

sum函式

用於求出表中某個欄位所有值的總和

select sum(欄位名)
from 表名;

avg函式

用於求出某個欄位所有值的平均值

select avg(欄位名)
from 表名;

max函式

用於求出某個欄位的最大值

select max(欄位名)
from 表名;

min函式

用於求出某個欄位的最小值

select min(欄位名)
from 表名;

3.2 對查詢結果排序

select 欄位名1,欄位名2,…
from 表名
order by 欄位名1 [ASC|DESC],欄位名2 [ASC|DESC]…;

先按照欄位名1升序或降序,當欄位名1的返回值相同時,再按照欄位2進行排序
ASC 升序 DESC 降序
預設為升序
例題:查詢student表中的所有記錄,按照gender欄位的升序和grade欄位的降序進行排列

select *
from student
order by gender asc,grade desc;

3.3分組查詢

分組查詢使用group by語句,一般與聚合函式一起使用
根據group by後的欄位名進行分組,地段名相同的為一組,只會返回出一條記錄,如果沒有使用聚合函式(即有多條返回值時),該欄位顯示的是分組後的第一條記錄的值,這樣的查詢結果意義不大

select 欄位名1,欄位名2
from 表名
group by 欄位名1,欄位名2,…[having 條件表示式];

在分組前的篩選用where ,不可以跟聚合函式
分組後的篩選用having,對分組後的結果進行過濾,可以跟聚合函式

例題:請統計各專業姓王的男女生人數,只顯示人數多於2人的

select zy,xb,count(xh)
from xsb
where xm like '王%'
group by zy,xb,
having count(*)>=2;

如果有group by,則select 後只能放分組相關的列及統計函式,否則會出錯或無意義;
如果有統計函式,且統計函式值可能多於一個,此時必須用group by

例題:顯示最低分大於70,最高分小於90 的XH。

select xh
from cjb
group by xh
having max(cj)<=90 and min(cj)>=70;

3.4 使用limit限制查詢結果的數量

limit 可以指定查詢結果從哪一條記錄開始以及一共查詢多少條資訊
offset“表示偏移量
偏移量為0,則從查詢結果第一條記錄開始
偏移量為1,則從查詢結果的第二天記錄開始
”記錄數“表示返回查詢記錄的條數

select 欄位名1,欄位名2…
from 表名
limit [offset,] 記錄數

例題1:查詢student表中的前四條記錄

select * 
from student
limit 4

offset 可省略,預設為從第一條記錄開始,一共返回4條記錄

例題2:查詢student表中的第5條到第8條記錄

select * 
from student
limit 4,4

偏移量為4,即從第5條記錄開始查詢,一共返回4條記錄

3.5 函式

數學函式

函式名稱 作用
ABS(X) 返回x的絕對值
SQRT(X) 返回x的非負2次方根
MOD(x, y) 返回x被y除後的餘數
ROUND(X, y) 對x進行四捨五入操作小數點後保留y位
CEILING(x) 返回不小於x的最小整數
FLOOR(x) 返回不大於x的最大整數
TRUNCATE(X, y) 含去x中小數點y位後面的數
SIGN(x) 返回x的符號, -1、 0或者1

字串函式

函式名稱 作用
LENGTH(str) 返回字串str的長度
CONCAT(SI, s2, … ) 返回一個或者多個字串連線產生的新的字串
TRIM(str) 刪除字串兩側的空格
REPLACE(str,s1,s2) 使用字串s2替換字串str 中所有的字串sl
SUBSTRING(str.n,len) 返回字串str的子串,起始位置為n,長度為len
REVERSE(str) 返回字串反轉後的結果
LOCATE(sl,str) 返回子串s1在字串str中的起始位置

日期和時間函式

函式名稱 作用
CURDATE() 獲取系統當前日期
CURTIME() 獲取系統當前時間
SYSDATE() 獲取當前系統日期和時間
TIME_TO_SEC() 返回將時間轉換成秒的結果
ADDDATE() 執行日期的加運算
SBUDATE() 執行日期的減運算
DATE FORMAT() 格式化輸出日期和時間值

條件判斷函式

函式名稱 作用
IF(expr,v1,v2) 如果expr表示式為true返回v1,否則返回v2
IFNULL(v1,v2) 如果v1不為NULL返回v1,否則返回v2
CASE expr WHEN v1 THEN rl[WHEN v2 THEN r2…] [ELSE rn] END 如果 expr值等於vl、v2等,則返回對應位置then後面的結果,否則返回ELSE後的結果rn

加密函式

函式名稱 作用
MD5(str) 對字串str進行MD5加密
ENCODE(str,pwd_ str) 使用pwd作為密碼加密字串str
DECODE(str,pwd_ str) 使用pwd作為密碼解密字串str

4 為表和欄位名取別名

在查詢資料時,可以為表和欄位取別名,這個別名可以代替其指定的表和欄位

4.1為表取別名

select * 
from 表名
[AS] 別名;

as可以省略不寫

4.2為欄位取別名

select 欄位名 [AS] 別名
from 表名

AS可以省略不寫,所以在select後看到欄位名後跟了其他字母其實就是給它取別名啦~(另一個欄位名開始之前)
查詢結果中顯示的是指定的別名而不是student表中的欄位名