SQL练习题

1 从titles表获取按照title进行分组

题目描述

从titles表获取按照title进行分组,每组个数大于等于2,给出title以及对应的数目t。
CREATE TABLE IF NOT EXISTS "titles" (
`emp_no` int(11) NOT NULL,
`title` varchar(50) NOT NULL,
`from_date` date NOT NULL,
`to_date` date DEFAULT NULL);

select title, count(*) as t from titles
group by title having count(*) >= 2;

2 从titles表获取按照title进行分组,注意对于重复的emp_no进行忽略

题目描述

从titles表获取按照title进行分组,每组个数大于等于2,给出title以及对应的数目t。
注意对于重复的emp_no进行忽略。
CREATE TABLE IF NOT EXISTS `titles` (
`emp_no` int(11) NOT NULL,
`title` varchar(50) NOT NULL,
`from_date` date NOT NULL,
`to_date` date DEFAULT NULL);

select title, count(distinct(emp_no)) from titles
group by title having count(distinct(emp_no)) >= 2;

3 统计出当前各个title类型对应的员工当前薪水对应的平均工资

题目描述

统计出当前各个title类型对应的员工当前(to_date='9999-01-01')薪水对应的平均工资。结果给出title以及平均工资avg。
CREATE TABLE `salaries` (
`emp_no` int(11) NOT NULL,
`salary` int(11) NOT NULL,
`from_date` date NOT NULL,
`to_date` date NOT NULL,
PRIMARY KEY (`emp_no`,`from_date`));
CREATE TABLE IF NOT EXISTS "titles" (
`emp_no` int(11) NOT NULL,
`title` varchar(50) NOT NULL,
`from_date` date NOT NULL,
`to_date` date DEFAULT NULL);

select title, avg(salary) from salaries, titles 
where salaries.emp_no = titles.emp_no
and salaries.to_date = '9999-01-01'
and titles.to_date = '9999-01-01'
group by title

4  统计各个部门的工资记录数

题目描述

统计各个部门的工资记录数,给出部门编码dept_no、部门名称dept_name以及次数sum
CREATE TABLE `departments` (
`dept_no` char(4) NOT NULL,
`dept_name` varchar(40) NOT NULL,
PRIMARY KEY (`dept_no`));
CREATE TABLE `dept_emp` (
`emp_no` int(11) NOT NULL,
`dept_no` char(4) NOT NULL,
`from_date` date NOT NULL,
`to_date` date NOT NULL,
PRIMARY KEY (`emp_no`,`dept_no`));
CREATE TABLE `salaries` (
`emp_no` int(11) NOT NULL,
`salary` int(11) NOT NULL,
`from_date` date NOT NULL,
`to_date` date NOT NULL,
PRIMARY KEY (`emp_no`,`from_date`));

select a.dept_no, a.dept_name, count(b.emp_no) as sum from 
departments as a, dept_emp as b, salaries as c
where a.dept_no = b.dept_no
and b.emp_no = c.emp_no
group by a.dept_no

5 查找排除当前最大、最小salary之后的员工的平均工资avg_salary

题目描述

查找排除当前最大、最小salary之后的员工的平均工资avg_salary。
CREATE TABLE `salaries` ( `emp_no` int(11) NOT NULL,
`salary` int(11) NOT NULL,
`from_date` date NOT NULL,
`to_date` date NOT NULL,
PRIMARY KEY (`emp_no`,`from_date`));

select avg(salary) as avg_salary from salaries 
where salary not in (select max(salary) as salary from salaries)
and salary not in (select min(salary) as salary from salaries)
and to_date = '9999-01-01' 

 

你可能感兴趣的:(SQL)