mysql复杂查询教程_mysql 复杂查询

本文详细介绍了SQL中的聚合函数,如COUNT、SUM、AVG、MAX和MIN,以及如何进行分组查询、子查询和多表查询。还提到了日期函数YEAR和MONTH的用法,并展示了LEFT JOIN、RIGHT JOIN和UNION操作的实际应用。

聚合函数

函数是一个功能体,提供若干数据,产出结果-饺子机

COUNT(...)数量

SUM(...) 求和

AVG(...)平均

MAX (...)最大

MIN(...) 最小

聚合查询/分组查询

查询出所有员工的数量

SELECT COUNT(eid) FROM emp;

SELECT COUNT(*) FROM emp; #推荐写法;

查询出工资8000以上女员工姓名性别生日按工资降序排列,取前三个人

SELECT ename,sex,birthday,salary FROM emp WHERE salary >8000 AND sex=0

ORDER BY salary DESC

LIMIT 0,3;

查询所有员工的工资总和

SELECT SUM(salary) FROM emp;

查询所有员工的平均工资

SELECT SUM(salary)/COUNT(*) FROM emp;

SELECT AVG(salary) FROM emp;

查询男员工工资最高的

SELECT ename,MAX(salary) FROM emp WHERE sex=1;

查询出年龄最大的员工

SELECT MIN(birthday),ename FROM emp;

分组查询:只能查询分组条件和聚合函数

*查询男女员工的平均工资,最高工资

SELECT sex,AVG(salary),MAX(salary) FROM emp  GROUP BY sex;

查询每个部门的员工数量,最高工资,最低工资;

SELECT deptId,COUNT(*),MAX(salary),MIN(salary) FROM emp GROUP BY deptId ;

函数补充

YEAR() 获取日期中的年份

MONTH() 获取日期中的月份

查询出1993年出生的员工所有列

SELECT*FROM emp WHERE YEAR(birthday)=1993;

查询5月出生的所有列

SELECT*FROM emp WHERE MONTH(birthday)=5;

子查询

查询出研发部员工所有的列

SELECT * FROM emp WHERE deptId=(SELECT did FROM dept WHERE dname='研发部');

查询出比tom工资高的员工有哪些;

SELECT * FROM emp WHERE salary>(SELECT salary FROM emp WHERE ename='tom');

查询出和TOM同一年的员工

SELECT*FROM emp WHERE YEAR(birthday)=(SELECT YEAR(birthday) FROM emp WHERE ename='tom' );

多表查询

查询所有员工姓名及其部门名称;

SELECT ename,dname FROM emp,dept WHERE did=deptId;

上述多表查询语法是SQL-92中的,无法查询出没有部门的员工,也没法查出没有员工的部门。

SQL-99中提出了新的多表查询语法

内连接INNER JOIN ...ON

SELECT ename,dname FROM emp INNER JOIN dept ON deptId=did;

左外连接LEFT OUTER JOIN ..ON

SELECT ename,dname FROM emp LEFT OUTER JOIN dept ON deptId= did;

查询结果是左侧所有的记录都显示;

OUTER 可以省略

SELECT ename,dname FROM emp LEFT JOIN dept ON deptId =did;

右外连接RIGHT OUTER JOIN...ON

SELECT ename,dname FROM emp RIGHT OUTER JOIN dept ON deptId=did;

查询右侧所有的记录都显示;

全连接FULL JOIN

显示左侧和右侧所有的记录--mysql 不支持

UNION 合并相同的项

UNION ALL 不合并相同的项

(select ename,dname from emp left join dept on deptid=did)

UNION ALL

(SELECT ename,dname FROM emp RIGHT OUTER JOIN dept ON deptId=did);

这个出来的有重复项,是左外连接和右外连接合并的

(select ename,dname from emp left join dept on deptid=did)

UNION

(SELECT ename,dname FROM emp RIGHT OUTER JOIN dept ON deptId=did);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值