sql语句练习的一些笔记

单表查询练习

  1. 找出部门编号为10中所有经理,和(and)部门编号为20中所有销售员的详细资料。
SELECT *
FROM emp
WHERE (deptno=10 AND job='经理') OR (deptno=20 AND job='销售员')
  1. 找出部门编号为10中所有经理,部门编号为20中所有销售员,还有即不是(not in)经理又不是销售员但其工资大或等于20000的所有员工详细资料。
SELECT *
FROM emp
WHERE (deptno=10 AND job='经理') OR (deptno=20 AND job='销售员') OR (job NOT IN ('经理', '销售员') AND sal >= 20000)
  1. 无奖金(is null)或奖金低于1000的员工。
WHERE comm IS NULL OR comm < 1000

查询所有员工详细信息,用编号升序(order by)排序

SELECT * 
FROM emp
ORDER BY empn

查询所有员工详细信息,用工资降序排序,如果(,)工资相同使用入职日期升序排序

SELECT *
FROM emp
ORDER BY sal DESC, hiredate ASC

查看雇员的月薪与佣金之和(comm列有很多记录的值为NULL,因为任何东西与NULL相加结果还是NULL,所以结算结果可能会出现NULL。下面使用了把NULL转换成数值0的函数IFNULL

SELECT *,sal+IFNULL(comm,0) FROM emp;

在上面查询中出现列名为sal+IFNULL(comm,0),这很不美观,现在我们给这一列给出一个别名,为total

SELECT *, sal+IFNULL(comm,0) AS total FROM emp;
给列起别名时,是可以省略AS关键字的:
SELECT *,sal+IFNULL(comm,0) total FROM emp;

查询性别非男的学生记录

SELECT * 
FROM stu
WHERE gender!='male';
或者
SELECT * 
FROM stu
WHERE gender<>'male';
或者
SELECT * 
FROM stu
WHERE NOT gender='male';
  • 聚合函数练习(聚合函数是用来做纵向运算的函数)
    统计月薪与佣金之和大于2500元的人数
SELECT COUNT(*) AS cnt FROM emp WHERE sal+IFNULL(comm,0) > 2500;

查询有佣金的人数,以及有领导的人数

SELECT COUNT(comm), COUNT(mgr) FROM emp;

查询所有雇员月薪+佣金和

SELECT SUM(sal+IFNULL(comm,0)) FROM emp;
  • 分组查询,关键字眼,每个
    查询每个部门的部门编号和每个部门的工资和
SELECT deptno, SUM(sal)
FROM emp
GROUP BY deptno;

查询每个部门的部门编号以及每个部门的人数

SELECT deptno,COUNT(*)
FROM emp
GROUP BY deptno;

查询每个部门的部门编号以及每个部门工资大于1500的人数

SELECT deptno,COUNT(*)
FROM emp
WHERE sal>1500
GROUP BY deptno;
  • HAVING子句
    WHERE是对分组前记录的条件,如果某行记录没有满足WHERE子句的条件,那么这行记录不会参加分组;而HAVING是对分组后数据的约束。
    查询工资总和大于9000的部门编号以及工资和
SELECT deptno, SUM(sal)
FROM emp
GROUP BY deptno
HAVING SUM(sal) > 9000;

多表查询练习

  1. 查出至少有一个员工的部门。显示部门编号、部门名称、部门位置、部门人数(group by)。
    列:d.deptno, d.dname, d.loc, 部门人数
    表:dept d, emp e
    条件:e.deptno=d.deptno
SELECT d.*, z1.cnt 
FROM dept d, (SELECT deptno, COUNT(*) cnt FROM emp GROUP BY deptno) z1
WHERE d.deptno = z1.deptno

  1. 列出所有(left outer join)员工的姓名及其直接上级的姓名(自身多表连接)。
    列:员工姓名、上级姓名
    表:emp e, emp m
    条件:员工的mgr = 上级的empno
SELECT e.ename, IFNULL(m.ename, 'BOSS') 领导
FROM emp e LEFT OUTER JOIN emp m
ON e.mgr=m.empno
  1. 列出受雇日期早于直接上级的所有员工的编号、姓名、部门名称。
    列:e.empno, e.ename, d.dname
    表:emp e, emp m, dept d
    条件:e.hiredate<m.hiredate
    思路:
    先不查部门名称,只查部门编号!
    列:e.empno, e.ename, e.deptno
    表:emp e, emp m
    条件:e.mgr=m.empno, e.hiredate<m.hireadate
SELECT e.empno, e.ename, d.dname
FROM emp e, emp m, dept d
WHERE e.mgr=m.empno AND e.hiredate<m.hiredate AND e.deptno=d.deptno
  1. 列出部门名称和这些部门的员工信息,同时列出那些没有员工的部门。
SELECT *
FROM emp e RIGHT OUTER JOIN dept d
ON e.deptno=d.deptno
  1. 列出最低薪金大于15000的各种工作及从事此工作的员工人数。
列:job, count(*)
表:emp e
条件:min(sal) > 15000
分组:job
*/
SELECT job, COUNT(*)
FROM emp e
GROUP BY job
HAVING MIN(sal) > 15000
  1. 列出在销售部工作的员工的姓名,假定不知道销售部的部门编号。
列:e.ename
表:emp
条件:e.deptno=(select deptno from dept where dname='销售部')
*/

SELECT *
FROM emp e
WHERE e.deptno=(SELECT deptno FROM dept WHERE dname='销售部')
  1. 列出薪金高于公司平均薪金的所有员工信息,所在部门名称,上级领导,工资等级。
列:* 
表:emp e
条件:sal>(查询出公司的平均工资)
*/
SELECT e.*, d.dname, m.ename, s.grade
FROM emp e, dept d, emp m, salgrade s
WHERE e.sal>(SELECT AVG(sal) FROM emp) AND e.deptno=d.deptno AND e.mgr=m.empno AND e.sal BETWEEN s.losal AND s.hisal

---------------

SELECT e.*, d.dname, m.ename, s.grade
FROM 
  emp e LEFT OUTER JOIN dept d ON e.deptno=d.deptno
        LEFT OUTER JOIN emp m ON e.mgr=m.empno
        LEFT OUTER JOIN salgrade s ON e.sal BETWEEN s.losal AND s.hisal
WHERE e.sal>(SELECT AVG(sal) FROM emp)


SELECT * FROM emp;
SELECT * FROM dept;
SELECT * FROM salgrade;

10.列出与庞统从事相同工作的所有员工及部门名称。

SELECT e.*, d.dname
FROM emp e, dept d
WHERE e.deptno=d.deptno AND job=(SELECT job FROM emp WHERE ename='庞统')

11.列出薪金高于在部门30工作的所有员工的薪金的员工姓名和薪金、部门名称。

列:e.ename, e.sal, d.dname
表:emp e, dept d
条件;sal>all (30部门薪金)
*/
SELECT e.ename, e.sal, d.dname
FROM emp e, dept d
WHERE e.deptno=d.deptno AND sal > ALL (SELECT sal FROM emp WHERE deptno=30)

13.查出年份、利润、年度增长比

SELECT y1.*, IFNULL(CONCAT((y1.zz-y2.zz)/y2.zz*100, '%'), '0%') 增长比
FROM tb_year y1 LEFT OUTER JOIN tb_year y2
ON y1.year=y2.year+1;
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值