切记where后面不能跟直接跟聚合函数
1,SELECT ,COUNT() FROM dept d LEFT JOIN emp e ON d.deptno=e.deptno WHERE e.sal<4000 GROUP BY d.deptno
查询部门工资低于4000的人数
2,
表数据
create table tb(姓名 varchar(10),课程 varchar(10),分数 int)
insert into tb values(‘张三’,‘语文’,74)
insert into tb values(‘张三’,‘数学’,83)
insert into tb values(‘张三’,‘物理’,93)
insert into tb values(‘李四’,‘语文’,74)
insert into tb values(‘李四’,‘数学’,84)
利用 if语句进行行转列
SELECT 姓名,SUM(IF(课程=“语文”,分数,0)) AS 语文,
SUM(IF(课程=“数学”,分数,0)) AS 数学,
SUM(IF(课程=“物理”,分数,0)) AS 物理 FROM tb GROUP BY 姓名
– 使用case when (SQL2000以上)
select 姓名,
max(case 课程 when ‘语文’ then 分数 else 0 end)语文,
max(case 课程 when '数学’then 分数 else 0 end)数学,
max(case 课程 when '物理’then 分数 else 0 end)物理
from tb
group by 姓名
员工表,查询入职满5年的员工
部门表
SELECT * FROM COM WHERE entry<=DATE_SUB(SYSDATE(),INTERVAL 5 YEAR);
统计各部门的的男女员工数
SELECT d.dname,
SUM(CASE WHEN sex = ‘女’ THEN 1 ELSE 0 END) 女,
SUM(CASE WHEN sex = ‘男’ THEN 1 ELSE 0 END) 男 FROM com c LEFT JOIN dept d ON d.id = c.deptId GROUP BY deptId
还有一个方法
SELECT d.id,d.dname,c.sex,COUNT(*) FROM com c ,dept d WHERE d.id=c.deptId GROUP BY c.deptId , c.sex
另外大家可以注意一下
CASE WHEN sex = ‘女’ THEN 1 ELSE 0 END
CASE 课程 when ‘语文’ then 分数 else 0 end
这两中不同写法
方法1:SELECT DISTINCT(NAME) FROM sc WHERE id NOT IN (SELECT DISTINCT(id) FROM sc WHERE score <60)
方法2
SELECT NAME FROM sc GROUP BY NAME HAVING MIN(score)>60
查询结果
根据出生日期计算年龄
SELECT *,TIMESTAMPDIFF(YEAR,entry,CURDATE())AS 年龄 FROM com
这是我找了好多根据出生日期计算年龄的sql,这个无疑是最优秀的一个,但是美中不足的是 当我把出生日期写成2018-11-25 11:26:51的时候计算的年龄为0,因为当前时间是2019-11-25 22:21:51这样按实际情况应该刚好一岁的,不过,把出生日期改为2018-11-24 11:26:51就是1了 也就是说有一天和实际情况不符合。如果您有更优的方案,希望不吝赐教,谢谢。
结束语:写的可能有点乱,请见谅。各位有不明白的地方可以给我留言。我一定会即使回复的。