mysql的 表的创建以及 按条件查询(排序 分组 左右链接 子查询)

-- 8.25 作业
-- 第一题


CREATE TABLE tutors (
    id INT PRIMARY KEY,
    NAME VARCHAR(255) NOT NULL,
    title VARCHAR(255),
    researchfield VARCHAR(255)
);

CREATE TABLE students (
    id INT PRIMARY KEY,
    NAME VARCHAR(255) NOT NULL,
    gender VARCHAR(10),
    admissiondate DATE,
    tutor_id INT,
    FOREIGN KEY (tutor_id) REFERENCES Tutors(id)
);
-- 插入导师信息
INSERT INTO tutors (id, NAME, title, researchfield) VALUES
(1, '张伟', '教授', '计算机科学'),
(2, '王伟', '副教授', '数据分析'),
(3, '李伟', '助理教授', '网络安全'),
(4, '刘洋', '教授', '量子物理'),
(5, '张敏', '教授', '生物工程');
INSERT INTO tutors (id, NAME, title, researchfield) VALUES
(6, '诸葛孔明', '教授', '计算机科学');

-- 插入研究生信息
INSERT INTO students (id, NAME, gender, admissiondate, tutor_id) VALUES
(101, '王芳', '女', '2021-09-01', 1),
(102, '李娜', '女', '2020-01-15', 2),
(103, '张涛', '男', '2021-03-01', 3),
(104, '刘超', '男', '2021-07-10', 1),
(105, '李静', '女', '2020-09-05', 4),
(106, '王静', '女', '2019-02-20', 5),
(107, '刘阳', '男', '2018-11-15', 2),
(108, '张艳', '女', '2020-06-06', 3),
(109, '李勇', '男', '2021-05-10', 4),
(110, '王艳', '女', '2019-09-09', 5);
INSERT INTO students (id, NAME, gender, admissiondate, tutor_id) VALUES (111, '王艳', '女', '2019-09-09', 5);






-- 1.请查出每个导师所带研究生的姓名。
SELECT  t.name '导师姓名',s.`NAME` '学生姓名'
FROM tutors t, students s
WHERE s.`tutor_id` = t.`id`
ORDER BY t.`NAME`;

-- 2.清查出特定姓名的导师所带研究生的姓名。
SELECT  t.name '导师姓名',s.`NAME` '学生姓名'
FROM tutors t, students s
WHERE s.`tutor_id` = t.`id` AND t.`NAME` = '刘洋';


-- 3.请查出每个导师所带研究生的数量。
SELECT  t.name '导师姓名',COUNT(s.`id`) '所带学生数量'
FROM tutors t
LEFT JOIN students s
ON s.`tutor_id` = t.`id`
GROUP BY t.`id`;


-- 4.请查出每个导师所带的男研究生的数量。

SELECT  t.name '导师姓名',COUNT(s.`id`) '所带学生数量'
FROM tutors t 
LEFT JOIN students s
ON s.`tutor_id` = t.`id` AND s.`gender` = '男'
GROUP BY t.`id`;


-- 5.请找出选择哪个研究方向的导师最多。
SELECT  t.`researchfield` '研究方向',COUNT(t.`id`) '老师数量'
FROM tutors t
GROUP BY t.`researchfield`
ORDER BY  COUNT(t.`id`) DESC
LIMIT 1;


-- 6.请找统计不同职称的导师的个数。

SELECT title,COUNT( id)
FROM tutors
GROUP BY title;




-- 第二题

CREATE TABLE dept 
( 
deptno VARCHAR(10) PRIMARY KEY, 
dname VARCHAR(10) 
); 


CREATE TABLE emp 
( 
empno VARCHAR(10) PRIMARY KEY, 
ename VARCHAR(10), 
job VARCHAR(10), 
mgr VARCHAR(10), 
sal FLOAT, 
deptno VARCHAR(10) REFERENCES dept(deptno) 
); 

 
INSERT INTO dept VALUES ('1','事业部'); 
INSERT INTO dept VALUES ('2','销售部'); 
INSERT INTO dept VALUES ('3','技术部'); 
 
INSERT INTO emp VALUES ('01','jacky','clerk','tom','1000','1'); 
INSERT INTO emp VALUES ('02','tom','clerk','','2000','1'); 
INSERT INTO emp VALUES ('07','biddy','clerk','','2000','1'); 
INSERT INTO emp VALUES ('03','jenny','sales','pretty','600','2'); 
INSERT INTO emp VALUES ('04','pretty','sales','','800','2'); 
INSERT INTO emp VALUES ('05','buddy','jishu','canndy','1000','3'); 
INSERT INTO emp VALUES ('06','canndy','jishu','','1500','3'); 
SELECT * FROM dept; 
SELECT * FROM emp;


 
-- 1 列出emp表中各部门的部门号,最高工资,最低工资

SELECT deptno  '部门号' , MIN(sal)  '最低工资',MAX(sal)  '最高工资'
FROM  emp 
GROUP BY deptno;



 
-- 2  列出emp表中各部门job为'CLERK'的员工的最低工资,最高工资

SELECT deptno '部门号' , MIN(sal)  '最低工资',MAX(sal)  '最高工资'
FROM emp 
WHERE job = 'CLERK'
GROUP BY deptno;
 
-- 3 对于emp中最低工资小于2000的部门,列出job为'CLERK'的员工的部门号,最低工资,最高工资 
SELECT deptno '部门号' , MIN(sal)  '最低工资',MAX(sal)  '最高工资'
FROM emp 
WHERE job = 'CLERK'  
GROUP BY deptno
HAVING MIN(sal)<2000;

 
-- 4 根据部门号由高而低,工资有低而高列出每个员工的姓名,部门号,工资
SELECT ename '员工姓名', deptno  '部门号' , sal '工资'
FROM emp 
ORDER BY deptno DESC ,sal;


 
-- 5 列出'buddy'所在部门中每个员工的姓名与部门号
SELECT ename '员工姓名', deptno  '部门号' 
FROM emp 
WHERE deptno = (
	SELECT deptno
	FROM emp
	WHERE ename = 'buddy'
	);


 
-- 6 列出每个员工的姓名,工作,部门号,部门名

SELECT e.`ename` '员工姓名',e.`job` '工作', d.`deptno`AS '部门号' , d.`dname` '部门名'
FROM dept d 
LEFT JOIN emp e
ON e.`deptno` = d.`deptno`

-- 7 列出emp中工作为'CLERK'的员工的姓名,工作,部门号,部门名
SELECT e.`ename` '员工姓名',e.`job` '工作', d.`deptno`AS '部门号' , d.`dname` '部门名'
FROM dept d 
LEFT JOIN emp e
ON e.`deptno` = d.`deptno`
WHERE e.`job` = 'CLERK';


-- 8 对于emp中有管理者的员工,列出姓名,管理者姓名(管理者外键为mgr)
SELECT ename '姓名', mgr '管理者姓名'
FROM emp
WHERE mgr !='' ;



 
-- 9 对于dept表中,列出所有部门名,部门号,同时列出各部门工作为'CLERK'的员工名与工作
SELECT d.`deptno`AS '部门号' , d.`dname` '部门名',e.`ename` '员工姓名',e.`job` '工作'
FROM dept d  
LEFT JOIN  emp e  
ON e.`deptno` = d.`deptno` AND e.`job` = 'CLERK'
ORDER BY d.`deptno`;

 
-- 10 对于工资高于本部门平均水平的员工,列出部门号,姓名,工资,按部门号排序
SELECT e.deptno '部门号', e.ename '姓名' , e.sal '工资'
FROM emp e
WHERE sal > (
	SELECT AVG(sal)
	FROM emp e2
	WHERE e.`deptno` = e2.`deptno` )
ORDER BY e.deptno;

-- 11 对于emp,列出各个部门中工资高于本部门平均工资的员工数和部门号,按部门号排序

SELECT e.deptno '部门号', COUNT(e.`empno`) '员工数量' 
FROM emp e
WHERE sal > (
	SELECT AVG(sal)
	FROM emp e2
	WHERE e.`deptno` = e2.`deptno` )
GROUP BY e.deptno
ORDER BY deptno;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

杪秋

一个计算机小白,期待您的鼓励

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值