排序 select 語(yǔ)句的order by 子句墓赴,根據(jù)需要排序檢索出的數(shù)據(jù)
asc(升序) desc(降序)
升序排列
select age from 表名 order by 字段名 asc笑撞;
select 字段名 from 表名 order by 字段名 desc;
多列排序(并指定方向)
select 字段名 。 from 表名 order by 字段排序级乐,字段排序。
為了按多個(gè)列排序,只要指定列名抡爹,列名之間用逗號(hào)分開即可(就 像選擇多個(gè)列時(shí)所做的那樣)。 下面的代碼檢索3個(gè)列芒划,并按其中兩個(gè)列對(duì)結(jié)果進(jìn)行排序——首先按年齡冬竟,然后再按名稱排序。
中文字段排序 腊状。 select * from 表名 order by convert(字段 using gbk) desc(順序)诱咏;
現(xiàn)將要排序的字段指明為中文編碼
限制查詢
指定返回的行數(shù)
限定查詢
SELECT語(yǔ)句返回所有匹配的行,它們可能是指定表中的每個(gè)行缴挖。為了返回第一行或前幾行袋狞,可使用LIMIT子句。下面舉一個(gè)例子:
select name from 表名 limit m映屋;
從開頭位置檢索m 行 內(nèi)容苟鸯;
select 字段名 from 表名 limit start ,count棚点。
從start的后一位置起檢索 count行早处。
1.如果limit 后面只跟了一個(gè)數(shù)字,
已知:每頁(yè)顯示m條數(shù)據(jù)瘫析,當(dāng)前顯示第n頁(yè)求第n頁(yè)的數(shù)據(jù)
SELECT * FROM sudents WHERE is_delete=0 LIMIT (n-1)*m,m
AVG() 返回某列的平均值
COUNT() 返回某列的行數(shù)
MAX() 返回某列的最大值
MIN() 返回某列的最小值
SUM() 返回某列值之和
AVG() 函數(shù)
VG()通過(guò)對(duì)表中行數(shù)計(jì)數(shù)并計(jì)算特定列值之和砌梆,求得該列的平均 值。 AVG()可用來(lái)返回所有列的平均值贬循,也可以用來(lái)返回特定列或行的平均值
select avg(字段名) as 別名 from 表名咸包;起一個(gè)別名并求此列的數(shù)據(jù)的平均值
count()函數(shù)
COUNT()函數(shù)進(jìn)行計(jì)數(shù)≌认海可利用COUNT()確定表中行的數(shù)目或符合特定條件的行的數(shù)目烂瘫。 COUNT()函數(shù)有兩種使用方式。 使用COUNT(*)對(duì)表中行的數(shù)目進(jìn)行計(jì)數(shù)奇适, 不管表列中包含的是空值( NULL)還是非空值坟比。
select count(*) from 表名;
使用COUNT(column)對(duì)特定列中具有值的行進(jìn)行計(jì)數(shù)嚷往,忽略 NULL值葛账。 SELECT COUNT(name) FROM customers;
MAX()函數(shù)
MAX()返回指定列中的最大值。 MAX()要求指定列名皮仁,如下所示
SELECT MAX(age) FROM customers;
MIN()函數(shù)
MIN()的功能正好與MAX()功能相反注竿,它返回指定列的最小值.如下所示
SELECT MIN(age) FROM customers;
SUM()函數(shù)
SUM()用來(lái)返回指定列值的和(總計(jì))茄茁。如下所示
SELECT SUM(age) as sum_age from customers;
聚集不同值
下面的例子使用AVG()函數(shù)返回同學(xué)的平均價(jià)格。 它與上面的SELECT語(yǔ)句相同巩割,但使用了DISTINCT參數(shù)裙顽,因此平均值只考慮各個(gè)不同的年齡:
SELECT AVG(DISTINCT age) from customers;
組合聚集函數(shù)
上面所有聚集函數(shù)例子都只涉及單個(gè)函數(shù)。但實(shí)際上SELECT語(yǔ)句可根據(jù)需要包含多個(gè)聚集函數(shù)宣谈。請(qǐng)看下面的例子:
SELECT COUNT(*) as total, MIN(age) as min_age, MAX(age) as max_age, AVG(age) as avg_age FROM customers;groub by 分組的含義
將查詢結(jié)果按照1個(gè)或多個(gè)字段進(jìn)行分組愈犹,字段值相同的為一組
可用于單個(gè)字段分組,也可用于多個(gè)字段分組
group by 單獨(dú)使用的意義不大
group by + 集合函數(shù)
通過(guò)的聚合函數(shù)闻丑,我們既然可以統(tǒng)計(jì)出每個(gè)分組的某字段的值的集合漩怎,也可以通過(guò)集合函數(shù)來(lái)對(duì)這個(gè)值的集合做一些操作
SELECT COUNT(*) AS totalnum,age from customers group by age;
根據(jù)age分組顯示age列表 并顯示分組里的數(shù)據(jù)個(gè)數(shù) 并命名為totalnum 字段
[圖片上傳失敗...(image-a56337-1534077722652)]
SELECT count(gender),gender FROM studentinfo GROUP BY gender;
SELECT avg(age),gender FROM studentinfo GROUP BY gender;
group by + group_concat()
group_concat(字段名)可以作為一個(gè)輸出字段來(lái)使用,
表示分組之后嗦嗡,根據(jù)分組結(jié)果勋锤,使用group_concat()來(lái)放置每一組的某字段的值的集合
SELECT gender,group_concat(student_name) FROM studentinfo GROUP BY gender;
[圖片上傳失敗...(image-23c438-1534077722652)]
group by + group_concat() + 集合函數(shù)
SELECT avg(age),gender,group_concat(student_name) FROM studentinfo GROUP BY gender;
group by + with rollup
with rollup的作用是:在最后新增一行,來(lái)記錄當(dāng)前列里所有記錄的總和
SELECT gender,count(*) FROM studentinfo GROUP BY gender with rollup;
在我們使用GROUP BY 時(shí)需要知道的一些規(guī)矩:
GROUP BY子句可以包含任意數(shù)目的列(可以根據(jù)多個(gè)列進(jìn)行分組)侥祭。這使得能對(duì)分組進(jìn)行嵌套叁执,為數(shù)據(jù)分組提供更細(xì)致的控制。如果在GROUP BY子句中嵌套了分組矮冬,數(shù)據(jù)將在最后規(guī)定的分組上進(jìn)行匯總谈宛。換句話說(shuō),在建立分組時(shí)胎署,指定的有列都起計(jì)算(所以不能從個(gè)別的列取回?cái)?shù)據(jù))吆录。
GROUP BY子句中列出的每個(gè)列都必須是檢索列或有效的表達(dá)式(但不能是聚集函數(shù))。如果在SELECT中使用表達(dá)式琼牧,則必須在GROUP BY子句中指定相同的表達(dá)式恢筝。不能使用別名。
除聚集計(jì)算語(yǔ)句外巨坊, SELECT語(yǔ)句中的每個(gè)列都必須在GROUP BY子句中給出撬槽。
如果分組列中具有NULL值,則NULL將作為一個(gè)分組返回抱究。如果列中有多行NULL值恢氯,它們將分為一組带斑。
GROUP BY子句必須出現(xiàn)在WHERE子句之后鼓寺, ORDER BY子句之前
如何過(guò)濾分組?勋磕?妈候?
MySQL還允許過(guò)濾分組,規(guī)定包括哪些分組挂滓,排除哪些分組苦银。例如,可能想要列出至少有兩個(gè)相同地區(qū)以上的用戶。為得出這種數(shù)據(jù)幔虏,必須基于完整的分組而不是個(gè)別的行進(jìn)行過(guò)濾
HAVING
HAVING子句纺念。 HAVING非常類似于WHERE。事實(shí)上想括,目前為止所學(xué)過(guò)的所有類型的WHERE子句都可以用HAVING來(lái)替代陷谱。唯一的差別是WHERE過(guò)濾行,而HAVING過(guò)濾分組瑟蜈。
having 條件表達(dá)式:用來(lái)分組查詢后指定一些條件來(lái)輸出查詢結(jié)果
having作用和where類似烟逊,但having只能用于group by
SELECT COUNT(),age,adress FROM customers GROUP BY age,adress HAVING COUNT() >= 2;
SELECT COUNT(*),age,adress FROM customers GROUP BY age,adress HAVING age >= 2;
SELECT COUNT(*),age,adress FROM customers GROUP BY age,adress HAVING age >= 2 and adress LIKE '%搜索關(guān)鍵字%';
HAVING和WHERE的差別 這里有另一種理解方法,WHERE在數(shù)據(jù)分組前進(jìn)行過(guò)濾,HAVING在數(shù)據(jù)分組后進(jìn)行過(guò)濾铺根。這是一個(gè)重要的區(qū)別宪躯, WHERE排除的行不包括在分組中。這可能會(huì)改變計(jì)算值位迂,從而影響HAVING子句中基于這些值過(guò)濾掉的分組访雪。
SELECT COUNT(),age,adress FROM customers WHERE adress LIKE '北%' GROUP BY age,adress HAVING COUNT() >= 2;
查詢語(yǔ)句的順序
select
列,列
表名
where
條件
group by
列囤官,列冬阳,
HAVING
條件
order by
列 (desc| asc)
limit srart,count