导入数据
-- 员工表
CREATE TABLE `employees` (
`empid` int(10) NOT NULL,
`empname` varchar(20) NOT NULL,
`sex` varchar(4) DEFAULT NULL,
`deptid` int(20) DEFAULT NULL,
`jobs` varchar(20) DEFAULT NULL,
`politicalstatus` varchar(20) DEFAULT NULL,
`leader` int(10) DEFAULT NULL,
PRIMARY KEY (`empid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- 导入员工数据
INSERT INTO `text`.employees
(empid, empname, sex, deptid, jobs, politicalstatus, leader)
VALUES(1, '王昭君', '女', 1003, '开发', '群众', 9);
INSERT INTO `text`.employees
(empid, empname, sex, deptid, jobs, politicalstatus, leader)
VALUES(2, '诸葛亮', '男', 1003, '开发经理', '群众', NULL);
INSERT INTO `text`.employees
(empid, empname, sex, deptid, jobs, politicalstatus, leader)
VALUES(3, '张飞', '男', 1002, '测试', '团员', 4);
INSERT INTO `text`.employees
(empid, empname, sex, deptid, jobs, politicalstatus, leader)
VALUES(4, '白起', '男', 1002, '测试经理', '党员', NULL);
INSERT INTO `text`.employees
(empid, empname, sex, deptid, jobs, politicalstatus, leader)
VALUES(5, '大乔', '女', 1002, '测试', '党员', 4);
INSERT INTO `text`.employees
(empid, empname, sex, deptid, jobs, politicalstatus, leader)
VALUES(6, '孙尚香', '女', 1001, '市场', '党员', 12);
INSERT INTO `text`.employees
(empid, empname, sex, deptid, jobs, politicalstatus, leader)
VALUES(7, '百里玄策', '男', 1001, '市场', '团员', 12);
INSERT INTO `text`.employees
(empid, empname, sex, deptid, jobs, politicalstatus, leader)
VALUES(8, '小乔', '女', 1002, '测试', '群众', 4);
INSERT INTO `text`.employees
(empid, empname, sex, deptid, jobs, politicalstatus, leader)
VALUES(9, '百里守约', '男', 1003, '开发', '党员', 9);
INSERT INTO `text`.employees
(empid, empname, sex, deptid, jobs, politicalstatus, leader)
VALUES(10, '妲己', '女', 1003, '开发', '团员', 9);
INSERT INTO `text`.employees
(empid, empname, sex, deptid, jobs, politicalstatus, leader)
VALUES(11, '李白', '男', 1002, '测试', '团员', 4);
INSERT INTO `text`.employees
(empid, empname, sex, deptid, jobs, politicalstatus, leader)
VALUES(12, '孙膑', '男', 1001, '市场经理', '党员', NULL);
-- 部门表
CREATE TABLE `departments` (
`deptid` int(10) NOT NULL,
`deptname` varchar(20) NOT NULL,
PRIMARY KEY (`deptid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- 导入部门数据
INSERT INTO `text`.departments
(deptid, deptname)
VALUES(1001, '市场部');
INSERT INTO `text`.departments
(deptid, deptname)
VALUES(1002, '测试部');
INSERT INTO `text`.departments
(deptid, deptname)
VALUES(1003, '开发部');
-- 工资表
CREATE TABLE `salary` (
`sid` int(10) NOT NULL,
`empid` int(10) NOT NULL,
`salary` int(10) NOT NULL,
PRIMARY KEY (`sid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- 导入工资表数据
INSERT INTO `text`.salary
(sid, empid, salary)
VALUES(1, 7, 2100);
INSERT INTO `text`.salary
(sid, empid, salary)
VALUES(2, 6, 2000);
INSERT INTO `text`.salary
(sid, empid, salary)
VALUES(3, 12, 5000);
INSERT INTO `text`.salary
(sid, empid, salary)
VALUES(4, 9, 1999);
INSERT INTO `text`.salary
(sid, empid, salary)
VALUES(5, 10, 1900);
INSERT INTO `text`.salary
(sid, empid, salary)
VALUES(6, 1, 3000);
INSERT INTO `text`.salary
(sid, empid, salary)
VALUES(7, 2, 5500);
INSERT INTO `text`.salary
(sid, empid, salary)
VALUES(8, 5, 3500);
1.列出总人数大于4的部门号和总人数
SELECT deptid ,COUNT(empid) FROM employees group by deptid HAVING COUNT(empid) > 4;
解题思路:
SELECT deptid ,COUNT(empid) FROM -- 要看 总人数和部门号,总人数用count(empid)得出
employees group by deptid -- 需要将部门号进行分组
HAVING COUNT(empid) > 4; -- 条件 总人数大于4
2.列出开发部和测试部的职工号、姓名
SELECT empid ,empname FROM employees WHERE jobs IN ('测试','开发');
解题思路:
SELECT empid ,empname -- 看 职工号、姓名如果时单一的条件的话只需要jobs = 谁即可 这里查询的字段多个的话使用 in
FROM employees
WHERE
jobs IN ('测试','开发'); -- 如果时单一的条件的话只需要jobs = 谁即可 这里查询的字段内条件是多个的话使用 in
3.求出各部门党员的人数,要求显示部门名称
SELECT d.deptname ,COUNT(e.politicalstatus) from employees e inner join departments d on e.deptid = d.deptid
WHERE e.politicalstatus ='党员' GROUP BY d.deptname ;
解题思路: 要看各部门名称需要分组 --要党员的人数需要
SELECT d.deptname ,COUNT(e.politicalstatus) from -- 要显示 部门名称 党员人数
employees e inner join departments d on e.deptid = d.deptid -- 关联条件
WHERE e.politicalstatus ='党员' -- 条件筛选 需要是党员
GROUP BY d.deptname ; -- 部门 分组
4.列出市场部的所有女职工的姓名和政治面貌
SELECT e.empname ,e.politicalstatus FROM employees e inner join departments d on e.deptid = d.deptid
where e.sex ='女'and d.deptname ='市场部';
解题思路:
SELECT e.empname ,e.politicalstatus -- 要显示的 姓名和政治面貌
FROM employees e inner join departments d -- 内连接起别名
on e.deptid = d.deptid -- 关联关系
where
e.sex ='女'and d.deptname ='市场部'; -- 条件 性别女且部门为市场部
5.显示所有职工的姓名、部门名和工资数
SELECT e.empname ,d.deptname ,s.salary from employees e left join departments d on e.deptid = d.deptid
LEFT JOIN salary s on s.empid =e.empid ;
解题思路:需要三表关联 员工表 部门表 工资表
关系梳理:员工表的empid和工资表empid 员工表的deptid和部门表的deptid
SELECT e.empname ,d.deptname ,s.salary from -- 要显示的 职工的姓名、部门名和工资数
employees e
left join departments d on e.deptid = d.deptid -- 关联关系 起别名 员工表的deptid和部门表的deptid
LEFT JOIN salary s on s.empid =e.empid ; -- 关联关系 起别名 员工表的empid和工资表empid