前言
近期在补SQL的基础,特别整理了一下SQL的一些查询练习语句,边学边笔记,持续更新~
数据库
查询案例
1. 查询工资最低的员工信息: last_name, salary
#①查询最低的工资SELECT MIN(salary)FROM employees#②查询last_name,salary,要求salary=①SELECT last_name,salaryFROM employeesWHERE salary=(SELECT MIN(salary)FROM employees);
2. 查询平均工资最低的部门信息
#方式一:#①各部门的平均工资SELECT AVG(salary),department_idFROM employeesGROUP BY department_id#②查询①结果上的最低平均工资SELECT MIN(ag)FROM (SELECT AVG(salary) ag,department_idFROM employeesGROUP BY department_id) ag_dep#③查询哪个部门的平均工资=②SELECT AVG(salary),department_idFROM employeesGROUP BY department_idHAVING AVG(salary)=(SELECT MIN(ag)FROM (SELECT AVG(salary) ag,department_idFROM employeesGROUP BY department_id) ag_dep);#④查询部门信息SELECT d.*FROM departments dWHERE d.`department_id`=(SELECT department_idFROM employeesGROUP BY department_idHAVING AVG(salary)=(SELECT MIN(ag)FROM (SELECT AVG(salary) ag,department_idFROM employeesGROUP BY department_id) ag_dep));#方式二:#①各部门的平均工资SELECT AVG(salary),department_idFROM employeesGROUP BY department_id#②求出最低平均工资的部门编号SELECT department_idFROM employeesGROUP BY department_idORDER BY AVG(salary)LIMIT 1;#③查询部门信息SELECT *FROM departmentsWHERE department_id=(SELECT department_idFROM employeesGROUP BY department_idORDER BY AVG(salary)LIMIT 1);
3. 查询平均工资最低的部门信息和该部门的平均工资
#①各部门的平均工资SELECT AVG(salary),department_idFROM employeesGROUP BY department_id#②求出最低平均工资的部门编号SELECT AVG(salary),department_idFROM employeesGROUP BY department_idORDER BY AVG(salary)LIMIT 1;#③查询部门信息SELECT d.*,agFROM departments dJOIN (SELECT AVG(salary) ag,department_idFROM employeesGROUP BY department_idORDER BY AVG(salary)LIMIT 1) ag_depON d.`department_id`=ag_dep.department_id;
4. 查询平均工资最高的 job 信息
#①查询最高的job的平均工资SELECT AVG(salary),job_idFROM employeesGROUP BY job_idORDER BY AVG(salary) DESCLIMIT 1#②查询job信息SELECT *FROM jobsWHERE job_id=(SELECT job_idFROM employeesGROUP BY job_idORDER BY AVG(salary) DESCLIMIT 1);
5. 查询平均工资高于公司平均工资的部门有哪些?
#①查询平均工资SELECT AVG(salary)FROM employees#②查询每个部门的平均工资SELECT AVG(salary),department_idFROM employeesGROUP BY department_id#③筛选②结果集,满足平均工资>①SELECT AVG(salary),department_idFROM employeesGROUP BY department_idHAVING AVG(salary)>(SELECT AVG(salary)FROM employees);
6. 查询出公司中所有 manager 的详细信息.
#①查询所有manager的员工编号SELECT DISTINCT manager_idFROM employees#②查询详细信息,满足employee_id=①SELECT *FROM employeesWHERE employee_id =ANY(SELECT DISTINCT manager_idFROM employees);
7. 各个部门中 最高工资中最低的那个部门的 最低工资是多少
#①查询各部门的最高工资中最低的部门编号SELECT department_idFROM employeesGROUP BY department_idORDER BY MAX(salary)LIMIT 1#②查询①结果的那个部门的最低工资SELECT MIN(salary) ,department_idFROM employeesWHERE department_id=(SELECT department_idFROM employeesGROUP BY department_idORDER BY MAX(salary)LIMIT 1);
8. 查询平均工资最高的部门的 manager 的详细信息: last_name, department_id, email, salary
#①查询平均工资最高的部门编号SELECTdepartment_idFROMemployeesGROUP BY department_idORDER BY AVG(salary) DESCLIMIT 1#②将employees和departments连接查询,筛选条件是①SELECTlast_name, d.department_id, email, salaryFROMemployees eINNER JOIN departments dON d.manager_id = e.employee_idWHERE d.department_id =(SELECTdepartment_idFROMemployeesGROUP BY department_idORDER BY AVG(salary) DESCLIMIT 1) ;
student数据库
查询练习
一、查询每个专业的学生人数SELECT majorid,COUNT(*)
FROM studentGROUP BY majorid;
二、查询参加考试的学生中,每个学生的平均分、最高分
SELECT AVG(score),MAX(score),studentnoFROM resultGROUP BY studentno;
三、查询姓张的每个学生的最低分大于60的学号、姓名
SELECT s.studentno,s.`studentname`,MIN(score)FROM student sJOIN result rON s.`studentno`=r.`studentno`WHERE s.`studentname` LIKE '张%'GROUP BY s.`studentno`HAVING MIN(score)>60;
四、查询每个专业生日在“1988-1-1”后的学生姓名、专业名称
SELECT m.`majorname`,s.`studentname`FROM student sJOIN major mON m.`majorid`=s.`majorid`WHERE DATEDIFF(borndate,'1988-1-1')>0GROUP BY m.`majorid`;
五、查询每个专业的男生人数和女生人数分别是多少
SELECT COUNT(*),sex,majoridFROM studentGROUP BY sex,majorid;
六、查询专业和张翠山一样的学生的最低分
#①查询张翠山的专业编号SELECT majoridFROM studentWHERE studentname = '张翠山'#②查询编号=①的所有学生编号SELECT studentnoFROM studentWHERE majorid=(SELECT majoridFROM studentWHERE studentname = '张翠山')#②查询最低分SELECT MIN(score)FROM resultWHERE studentno IN(SELECT studentnoFROM studentWHERE majorid=(SELECT majoridFROM studentWHERE studentname = '张翠山'))
七、查询大于60分的学生的姓名、密码、专业名
SELECT studentname,loginpwd,majornameFROM student sJOIN major m ON s.majorid= m.majoridJOIN result r ON s.studentno=r.studentnoWHERE r.score>60;
八、按邮箱位数分组,查询每组的学生个数
SELECT COUNT(*),LENGTH(email)FROM studentGROUP BY LENGTH(email);
九、查询学生名、专业名、分数
SELECT studentname,score,majornameFROM student sJOIN major m ON s.majorid= m.majoridLEFT JOIN result r ON s.studentno=r.studentno
十、查询哪个专业没有学生,分别用左连接和右连接实现
#左SELECT m.`majorid`,m.`majorname`,s.`studentno`FROM major mLEFT JOIN student s ON m.`majorid` = s.`majorid`WHERE s.`studentno` IS NULL;#右SELECT m.`majorid`,m.`majorname`,s.`studentno`FROM student sRIGHT JOIN major m ON m.`majorid` = s.`majorid`WHERE s.`studentno` IS NULL;
十一、查询没有成绩的学生人数
SELECT COUNT(*)FROM student sLEFT JOIN result r ON s.`studentno` = r.`studentno`WHERE r.`id` IS NULL
