#把信息用CONCAT连接
SELECT CONCAT (id, ',', username, ',', PASSWORD) AS info FROM my_test;
#使用CONCAT_WS,分割符连接,第一个不会加上,最后一个也不会加上!
SELECT CONCAT_WS(',', id,username,PASSWORD) AS info FROM my_test;
#group by 性别,名字和id会显示不全,并且不能用select *
SELECT sex, id, username FROM my_test GROUP BY sex;
#GROUP_CONCAT解决上面的,按照性别分组后,想要选出这个性别下面的所有名字,可以采用这种方式:select要有sex 然后group by也是sex
#如果不用group by 只有n显示男的! 一般都是结合使用
#注意:GROUP_CONCAT里面可以写distinct order by 这些,还可以决定使用哪种分隔符:username separator ';'
SELECT sex, GROUP_CONCAT(id) AS ids, GROUP_CONCAT(DISTINCT username) AS NAMES FROM my_test GROUP BY sex;
顺序:先执行group by分组后再执行聚合函数进行对应的计算
#统计博客种类数量
SELECT username,COUNT(username) AS 数量 FROM my_test GROUP BY username
#统计日期归档数量
SELECT DATE_FORMAT(create_time,'%Y年%m月') AS 日期 ,COUNT(create_time) AS 数量 FROM my_test GROUP BY DATE_FORMAT(create_time,'%Y%m')
#计算小王所有成绩的的平均分
SELECT username,AVG(score) AS 平均分 FROM my_test GROUP BY username
Having过滤的是分组,Where过滤的是行,先过滤行,再进行分组,然后再过滤分组条件
SELECT DATE_FORMAT(create_time,'%Y年%m月') AS 日期 ,COUNT(create_time) AS 数量 FROM my_test GROUP BY DATE_FORMAT(create_time,'%Y%m')
SELECT DATE_FORMAT(create_time,'%Y年%m月') AS 日期 ,COUNT(create_time) AS 数量 FROM my_test GROUP BY DATE_FORMAT(create_time,'%Y%m') HAVING COUNT(create_time)>1
当一个查询语句同时出现了where,group by,having,order by的时候,执行顺序和编写顺序是:
查询选修了3门以上课程,且所有课程成绩都高于60分的学生学号及课程数
select sno , count(cno),sum(grade) sum_grade
from sc
where grade > 60
group by sno having count(cno) > 3
order by sum_grade desc
1.执行where xx对全表数据做筛选,返回第1个结果集。
2.针对第1个结果集使用group by分组,返回第2个结果集。
3.针对第2个结果集中的每1组数据执行select xx,有几组就执行几次,返回第3个结果集。
4.针对第3个结集执行having xx进行筛选,返回第4个结果集。
5.针对第4个结果集排序order by。
一条SQL语句个子句的先后作用过程:
from→where→group by→select(含聚合函数)→order by
按年月日分组:
使用场景:比如在开发自己博客的时候需要对时间归档,按照年和月份!
insert select
不用再加valuesINSERT INTO Customers(cust_ .id,cust_ contact,cust_ emai1,cust_ name,
cust_ address,cust_ city,cust_ state,cust_ zip,cust_ country)
SELECT cust_ _id,cust_ contact,cust_ email,cust_ name,
cust_ address,cust_ .city,cust_ state,cust_ zip,cust_ country
FROM Cus tNew;