Mysql的查询语句

Mysql的查询语句

例如:有以下表
在这里插入图片描述
SQL语句

CREATE DATABASE mydb;

USE mydb;

CREATE TABLE dept( 
deptno	INT PRIMARY KEY, 
dname	VARCHAR(50), 
loc	VARCHAR(50) 
);

CREATE TABLE emp( 
empno		INT PRIMARY KEY, 
ename		VARCHAR(50), 
job		VARCHAR(50), 
mgr		INT, 
hiredate	DATE, 
sal		DECIMAL(7,2), 
comm		DECIMAL(7,2), 
deptno		INT, 
CONSTRAINT fk_emp FOREIGN KEY(mgr) REFERENCES emp(empno) 
);

CREATE TABLE salgrade( 
grade	INT	PRIMARY KEY, 
losal	INT, 
hisal	INT 
);

INSERT INTO dept VALUES (10, '教研部', '北京'); 
INSERT INTO dept VALUES (20, '学工部', '上海'); 
INSERT INTO dept VALUES (30, '销售部', '广州'); 
INSERT INTO dept VALUES (40, '财务部', '武汉');

INSERT INTO emp VALUES (1009, '曾阿牛',	'董事长', NULL, '2001-11-17',	50000, NULL, 10); 
INSERT INTO emp VALUES (1004, '刘备',	'经理',   1009, '2001-04-02',	29750, NULL, 20); 
INSERT INTO emp VALUES (1006, '关羽',	'经理',   1009, '2001-05-01',	28500, NULL, 30); 
INSERT INTO emp VALUES (1007, '张飞',	'经理',	  1009, '2001-09-01',	24500, NULL, 10); 
INSERT INTO emp VALUES (1008, '诸葛亮', '分析师', 1004, '2007-04-19',	30000, NULL, 20); 
INSERT INTO emp VALUES (1013, '庞统',	'分析师', 1004, '2001-12-03',	30000, NULL, 20); 
INSERT INTO emp VALUES (1002, '黛绮丝', '销售员', 1006, '2001-02-20',	16000, 3000, 30); 
INSERT INTO emp VALUES (1003, '殷天正', '销售员', 1006, '2001-02-22',	12500, 5000, 30); 
INSERT INTO emp VALUES (1005, '谢逊',	'销售员', 1006, '2001-09-28',	12500, 14000,30); 
INSERT INTO emp VALUES (1010, '韦一笑', '销售员', 1006, '2001-09-08',	15000, 0,    30); 
INSERT INTO emp VALUES (1012, '程普',	'文员',   1006, '2001-12-03',	9500,  NULL, 30); 
INSERT INTO emp VALUES (1014, '黄盖',	'文员',   1007, '2002-01-23',	13000, NULL, 10); 
INSERT INTO emp VALUES (1011, '周泰',	'文员',   1008, '2007-05-23',	11000, NULL, 20); 
INSERT INTO emp VALUES (1001, '甘宁',	'文员',   1013, '2000-12-17',	8000,  NULL, 20);

INSERT INTO salgrade VALUES (1, 7000,  12000); 
INSERT INTO salgrade VALUES (2, 12010, 14000); 
INSERT INTO salgrade VALUES (3, 14010, 20000); 
INSERT INTO salgrade VALUES (4, 20010, 30000); 
INSERT INTO salgrade VALUES (5, 30010, 99990);

一、单表练习

having的用法

having字句可以让我们筛选成组后的各种数据,
where字句在聚合前先筛选记录,也就是说作用在group by和having字句前。
而 having子句在聚合后对组记录进行筛选。

显示非销售人员工作名称以及从事同一工作雇员的月工资的总和,并且要满足从事同一工作的雇员的月工资合计大于50000,输出结果按月工资的合计升序排列

SELECT job, SUM(sal) sall FROM emp WHERE job <> '销售员' GROUP BY job
HAVING sall > 50000 ORDER BY sall ASC

1.查询出部门编号为30的所有员工

SELECT * FROM `emp` where deptno='30'

2.所有销售员的姓名、编号和部门编号。

 select ename,deptno,empno from emp where job='销售员'

3.找出奖金高于工资的员工。

 select * FROM emp WHERE comm>sal

4.找出奖金高于工资60%的员工。

 SELECT * FROM emp WHERE comm > sal * 0.6

5.找出部门编号为10中所有经理,和部门编号为20中所有销售员的详细资料。

 select *  from emp where deptno=10 and job='经理' or deptno=20 and job='销售员'

6.找出部门编号为10中所有经理,部门编号为20中所有销售员,

还有即不是经理又不是销售员但其工资大或等于20000的所有员工详细资料

 SELECT * FROM emp WHERE deptno = 10 AND job = '经理'
OR deptno = 20 AND job = '销售员'
or job not in ('经理','销售员') and sal>20000

7.有奖金的工种。

 SELECT DISTINCT job FROM emp WHERE comm IS NOT NULL

8.无奖金或奖金低于1000的员工。

select ename from emp where comm is null  or comm<1000

9.查询名字由三个字组成的员工。

 select * from emp where ename LIKE '___'     //下划线是英文状态下

10.查询2000年入职的员工。

SELECT * FROM emp WHERE YEAR(hiredate) = 2000

11.查询所有员工详细信息,用编号升序排序

SELECT * FROM emp ORDER BY empno ASC

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

SELECT * FROM emp ORDER BY sal DESC, hiredate ASC

13.查询每个部门的平均工资

SELECT deptno, AVG(sal) FROM emp GROUP BY deptno

14.求出每个部门的雇员数量。

select deptno,COUNT(1) from emp GROUP BY deptno

15.查询每种工作的最高工资、最低工资、人数

select job, MAX(SAL),MIN(sal),count(*) from emp GROUP BY job

16.显示非销售人员工作名称以及从事同一工作雇员的月工资的总和,并且要满足从事同一工作的雇员的月工资合计大于50000,输出结果按月工资的合计升序排列

 SELECT job, SUM(sal) sall FROM emp WHERE job <> '销售员' GROUP BY job
HAVING sall > 50000 ORDER BY sall ASC

二、子查询练习

1.查出至少有一个员工的部门。 显示部门编号、部门名称、部门位置、部门人数。

SELECT	T1.*,
	T2.cnt
FROM 	dept T1
JOIN 	(SELECT deptno, COUNT(1) cnt FROM emp GROUP BY deptno HAVING cnt >= 1) T2
ON 	T1.deptno = T2.deptno

2.列出薪金比关羽高的所有员工。

用查出来关羽的薪资作为where 条件

SELECT * FROM emp WHERE sal > (
SELECT sal FROM emp WHERE ename = '关羽')

三、多表查询练习

1. 列出所有员工的姓名及其直接上级的姓名。


SELECT t1.ename empname,
t2.ename mgrname
from 
emp t1
left JOIN 
emp t2
on t1.mgr=t2.empno

2. 列出受雇日期早于直接上级的所有员工的编号、姓名、部门名称。

SELECT 
		T1.empno, T1.ename, D.dname
FROM    	emp T1
JOIN    	emp T2
ON 		T1.mgr = T2.empno AND T1.hiredate < T2.hiredate
JOIN 		dept D
ON 		T1.deptno = D.deptno

3.列出部门名称和这些部门的员工信息,同时列出那些没有员工的部门。

select T1.*,
T2.*
from
emp T1
left JOIN
dept T2
on
T2.deptno=T1.deptno

4.列出最低薪金大于15000的各种工作及从事此工作的员工人数。

SELECT job, COUNT(1) FROM emp GROUP BY job HAVING MIN(sal) > 15000

5. 列出在销售部工作的员工的姓名,假定不知道销售部的部门编号。

SELECT * FROM emp WHERE deptno = 
(SELECT deptno FROM dept WHERE dname = '销售部')

6.列出薪金高于公司平均薪金的所有员工信息,所在部门名称,上级领导,工资等级。

1.公司平均薪金

SELECT AVG(sal) from emp

在这里插入图片描述
2.列出薪金高于公司平均薪金的所有员工信息

select * from emp where sal >(SELECT AVG(sal) from emp)

在这里插入图片描述
3.所在部门名称,上级领导

select e1.empno, e1.ename, e2.mgr as '上级',d.dname
  from emp e1, emp e2, dept d
 where e1.mgr = e2.empno
   and e1.deptno = d.deptno;

在这里插入图片描述
4.员工工资等级。

select T1.grade,
	 t2.ename,
	 t2.empno
	 from
	 salgrade T1,emp t2
	 where t2.sal
	 BETWEEN 	T1.losal AND T1.hisal

5.全部整合

select 
T1.empno, T1.ename, d.dname, T1.sal, sg.grade
from 
emp T1, emp T2, dept d, salgrade sg
where 
T1.sal > (select avg(sal) from emp)
   and T1.mgr = T2.empno
   and T1.deptno = d.deptno
   and T1.sal between losal and hisal
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值