單表查詢
單表查詢語(yǔ)句
執(zhí)行順序 | 表單查詢語(yǔ)句 | 各組成部分的作用 |
---|---|---|
1 | WHERE ... | 對(duì)表中記錄的第一次篩選 |
2 | GROUP BY ... | 分組 |
3 | SELECT ... (聚合函數(shù)) ...FROM 表名 | 基本結(jié)構(gòu)(對(duì)字段進(jìn)行聚合處理) |
4 | HAVING ... | 對(duì)表中記錄的進(jìn)一步篩選 |
5 | ORDER BY ... | 排序 |
6 | LIMIT ... ; | 截取部分記錄來(lái)顯示 |
· 聚合函數(shù)(對(duì)表中某個(gè)字段的數(shù)據(jù)進(jìn)行聚合操作)
種類:
代碼 語(yǔ)義 AVG(字段名) 求該字段的平均值 SUM(字段名) 求和 MAX(字段名) 最大值 MIN(字段名) 最小值 COUNT(字段名) 統(tǒng)計(jì)該字段記錄的個(gè)數(shù)(可統(tǒng)計(jì)空字符串搞疗,但是不統(tǒng)計(jì)NULL) 注意:聚合函數(shù)的結(jié)果為一個(gè)數(shù)值磷脯;一般與分組亲茅、HAVING等結(jié)構(gòu)配合使用,很少單獨(dú)使用
例子:查詢userlist表中最大年紀(jì)的用戶年齡 SELECT MAX(age) FROM userlist; 查詢userlist表中中國(guó)用戶的資產(chǎn)綜合 SELECT SUM(money) FROM userlist WHERE country='中國(guó)'; 統(tǒng)計(jì)name诈悍、id兩個(gè)字段分別有幾條記錄 SELECT COUNT(id),COUNT(name) FROM userlist; 統(tǒng)計(jì)中國(guó)用戶中通過(guò)實(shí)名認(rèn)證的用戶數(shù)量(AS author_count是別名,可以不寫) SELECT COUNT(*) AS author_count FROM userlist WHERE country='中國(guó)' AND author=true;
· ORDER BY:
作用:給查詢結(jié)果排序
格式:... ORDER BY 字段名 ASC/DESC(升序/降序)(不添加默認(rèn)為升序)
注意:對(duì)查詢結(jié)果進(jìn)行排序,并不會(huì)改變表中記錄的原始順序
例:查出用戶并按照id倒序排序 SELECT * FROM USERLIST ORDER BY id DESC; 找出國(guó)家為中國(guó)的用戶并按倒序排序 SELECT * FROM userlist WHERE country='中國(guó)' ORDER BY id DESC; 找出國(guó)家為中國(guó)和美國(guó)的用戶,并且名字為3個(gè)字符的用戶放妈,按照id為升序排序 SELECT * FROM userlist WHERE country IN('中國(guó)','美國(guó)') AND name LIKE '_ _ _' ORDER BY id ASC;
· LIMIT:(限制查詢記錄的顯示條數(shù))
兩種用法:
<1>LIMIT n (顯示n條記錄<前n條記錄>)
<2>LIMIT m,n (m:從第m+1條記錄開始顯示<計(jì)算機(jī)從0開始計(jì)數(shù)>;n:顯示n條記錄)
注意:LIMIT永遠(yuǎn)放在SQL查詢語(yǔ)句的最后寫
例:在國(guó)家為中國(guó)的用戶中找出id排名倒數(shù)第二到倒數(shù)第四的記錄 SELECT * FROM userlist WHERE country='中國(guó)' ORDER BY id ASC LIMIT 1,3; 找出日本用戶并且名字不為空并顯示id與姓名北救,正序排列取前3條記錄 SELECT id,name FROM userlist WHERE country='日本' AND name IS NOT NULL ORDER BY id ASC LIMIT 3;
使用LIMIT進(jìn)行分頁(yè):
每頁(yè)顯示5條記錄荐操,顯示第4頁(yè) LIMIT (m-1)*n,n;(m直接傳遞4即可查詢第四頁(yè)的5條)
· GROUP BY ...(按照某種規(guī)則對(duì)查詢結(jié)果進(jìn)行分組操作)
格式:...GROUP BY 字段名
注意:
· 只有分組時(shí)(沒(méi)有聚合函數(shù)、HAVING)珍策,先分組托启,后去重
· GOURP BY 后邊的字段必須與SELECT后面字段一致
· 分組、聚合同時(shí)存在時(shí)攘宙,先分組屯耸,后聚合拐迁,在去重
例子:查看有哪些國(guó)家(每個(gè)國(guó)家只出現(xiàn)一次) SELECT country FROM userlist GROUP BY country; 查看每個(gè)國(guó)家用戶的平均年齡 SELECT country,AVG(age) FROM userlist GROUP BY country; 查詢出所有國(guó)家中用戶最多的前兩名,顯示國(guó)家名稱和其數(shù)量 SELECT country,COUNT(id) FROM userlist GROUP BY country ORDER BY COUNT(id) DESC LIMIT 2;
· HAVING ...(對(duì)查詢結(jié)果進(jìn)行進(jìn)一步的篩選操作)
注意:
· WHERE只能操作表中實(shí)際存在的字段疗绣,HAVING可操作由聚合函數(shù)生成的顯示列
· 分組 + 聚合 + HAVING :HAVING語(yǔ)句通常和GROUP BY 語(yǔ)句聯(lián)合使用线召,過(guò)濾由GROUP BY 語(yǔ)句返回的記錄集
例子:查找出平均年齡>50,排名前2的國(guó)家多矮,顯示國(guó)家名和平均年齡 SELECT country,AVG(age) AS average_age FROM userlist GROUP BY country HAVING AVG(age)>50 ORDER BY DESC LIMIT 2;
· DISTINCT ...(不顯示字段的重復(fù)值)
格式:DISTINCT 字段名
注意:
· 只修飾普通的已存在字段
· 當(dāng)DISTINCT同時(shí)修飾多個(gè)字段時(shí)缓淹,所有字段的值都相同才回去重
· DISTINCT不能對(duì)任何字段做聚合處理
例子:查看表中有哪些國(guó)家 SELECT DISTINCT country FROM userlist; 計(jì)算表中一共有幾個(gè)國(guó)家(AS country_count 可省略,別名而已) SELECT COUNT(DISTINCT country) AS country_count FROM userlist;
· 查詢表記錄時(shí)做數(shù)學(xué)運(yùn)算
(+ - * / %)
例子:對(duì)查找出的用戶年齡進(jìn)行雙倍運(yùn)算處理 SELECT id,name,age*2 FROM userlist;