一道SQL查询语句练习题

本文通过具体实例详细介绍了SQL的基础操作,包括表的创建、数据插入、更新、查询等基本语法,并进一步探讨了聚合查询、多表查询及集合查询等高级用法。
  1. use exercise;  
  2. 找出这个数据库中所有的表  
  3. select name FROM sysobjects WHERE type='U'  
  4.   
  5. 1.  创建表  
  6. Create table DEPT  
  7. (DEPTNO INT NOT NULL, DNAME VARCHAR(14),LOC VARCHAR(13));  
  8. Alter table DEPT   
  9. add constraint PK_DEPT PRIMARY KEY (DEPTNO);  
  10.   
  11. create table EMP (EMPNO INT NOT NULL,ENAME VARCHAR(10), JOB VARCHAR(9), MGR INT, HIREDATE DATETIME,  
  12. SAL FLOAT, COMM FLOAT, DEPTNO INT);  
  13. alter table EMP  
  14. add constraint PK_EMP PRIMARY KEY (EMPNO);  
  15. alter table EMP  
  16. add constraint FK_DEPTNO foreign key(DEPTNO) references DEPT(DEPTNO);  
  17.   
  18. create table salgrade  
  19. (grade int,losal int,hisal int  
  20. );  
  21.   
  22. select * from dept;select * from emp;select * from salgrade;  
  23.   
  24. 2.  插入数据  
  25. insert into DEPT values(10,'ACCOUNTING','NEW YORK');  
  26. insert into DEPT values(20,'PESEARCH','DALLAS');  
  27. insert into DEPT values(30,'SALES','CHICAGO');  
  28. insert into DEPT values(40,'OPERATIONS','BOSTON');  
  29.   
  30. insert into EMP values(7369,'SMITH','CLERK',7566,'1980-12-17',800,NULL,20);  
  31. insert into EMP values(7499,'ALLEN','SALESMAN',7698,'1981-02-20',1600,300,30);  
  32. insert into EMP values(7521,'WARD','SALESMAN',7698,'1981-02-21',1250,500,30);  
  33. insert into EMP values(7566,'JONES','MANAGER',7839,'1981-04-02',2975,NULL,20);  
  34. insert into EMP values(7654,'MARTIN','SALESMAN',7698,'1981-09-28',1250,1400,30);  
  35. insert into EMP values(7698,'BLAKE','MANAGER',7839,'1981-05-01',2850,NULL,30);  
  36. insert into EMP values(7782,'CLARK','MANAGER',7839,'1981-06-09',2450,NULL,10);  
  37. insert into EMP values(7788,'SCOTT','ANALYST',7566,'1987-06-13',3000,NULL,20);  
  38. insert into EMP values(7839,'KING','PRESIDENT',NULL,'1981-11-17',5000,NULL,10);  
  39. insert into EMP values(7844,'TURN','SALESMAN',7698,'1981-09-08',1500,0,30);  
  40. insert into EMP values(7876,'ADMAS','CLERK',7788,'1987-06-13',1100,NULL,20);  
  41. insert into EMP values(7900,'JAMES','CLERK',7698,'1981-12-03',950,NULL,30);  
  42. insert into EMP values(7934,'MILLER','CLERK',7782,'1982-01-23',1300,NULL,10);  
  43.   
  44. insert into salgrade(grade,losal,hisal)  
  45. select 1,700,1200 union all  
  46. select 2,1201,1400 union all  
  47. select 3,1401,2000 union all  
  48. select 4,2001,3000 union all  
  49. select 5,3001,9999 ;  
  50.   
  51. 3.  将所有员工的工资上浮10%.然后查询员工姓名、薪水、补助。(emp.sal为工资,emp.comm为补助)  
  52. select sal from emp;  
  53. update emp set sal = sal+0.1*sal;  
  54. select ename,sal,comm from emp;  
  55. update emp set sal = sal/1.1;  
  56. 4.  查看EMP表中部门号为10的员工的姓名,职位,参加工作时间,工资。  
  57. select ename,job,hiredate,sal from emp where deptno='10';  
  58. 5.  查所有已有的职位,要求去除重复项。  
  59. select distinct job from emp;  
  60. 6.  计算每个员工的年薪,并取列名为Salary of Year(emp.sal为员工的月薪),要求输出员工姓名,年薪。  
  61. select ename,sal*12 as 'Salary of Year' from emp;  
  62. 7.  查询每个员工每个月拿到的总金额(emp.sal为工资,emp.comm为补助)。(提示:isnull(ex1,ex2)表示如果ex1为空则返回ex2)  
  63. select ename,sal+isnull(comm,0) as total from emp;  
  64. 8.  显示职位是主管(manager)的员工的姓名,工资。  
  65. select ename,sal from emp where job='manager';  
  66. 9.  显示第3个字符为大写O的所有员工的姓名及工资。  
  67. select ename,sal from emp where ename like '__O%';  
  68. 10. 显示职位为销售员(SALESMAN)或主管(MANAGER)的员工的姓名,工资,职位。  
  69. select ename,sal,job from emp where job='salesman' or job='manager';  
  70. 11. 显示所有没有补助的员工的姓名。  
  71. select ename from emp where comm is null;  
  72. 12. 显示有补助的员工的姓名,工资,补助。  
  73. select ename,sal,comm from emp where comm is not null;  
  74. 13. 排序显示所有员工的姓名,工资(按工资降序方式)。  
  75. select ename,sal from emp order by sal desc;  
  76. 14. 显示员工的最高工资和最低工资。  
  77. select max(sal) as '最高工资',min(sal) as '最低工资' from emp;  
  78. 15. 显示所有员工的平均工资和总计工资。  
  79. select avg(sal) as '平均工资',sum(sal) as '总计工资' from emp;  
  80. 16. 显示补助在员工中的发放比例、即有多少比例的员工有补助。  
  81. (此题需注意问题:1.select语句中进行除法如何保留小数点后数据。2.count函数如何处理null型数据。3.cast()语法)  
  82. select cast(cast(count(comm) as float) / cast(count(*) as floatas numeric(13,12))  from emp;  
  83.   
  84.   
  85. 聚合查询  
  86. 17. 显示每种职业的平均工资。  
  87. select job,avg(sal) as 'average' from emp group by job;  
  88. 18. 显示每个部门每种岗位的平均工资和最高工资。  
  89. select deptno,job,avg(sal) as '平均工资',max(sal) as '最高工资' from emp group by deptno,job order by deptno;  
  90. 19. 显示平均工资低于2500的部门号,平均工资及最高工资。  
  91. select deptno,avg(sal)as 'average',max(sal)as 'max' from emp group by deptno having avg(sal) < 2500;  
  92. 20. 上一条语句以平均工资升序排序。  
  93. select deptno,avg(sal)as 'average',max(sal)as 'max' from emp group by deptno having avg(sal) < 2500 order by avg(sal) asc;  
  94.   
  95. 多表查询  
  96. 21. 显示工资高于2500或岗位为MANAGER的所有员工的姓名,工资,职位,和部门号。  
  97. select ename,sal,job,deptno from emp where sal>2500 or job='manager';  
  98. 22. 排序显示所有员工的姓名,部门号,工资(以部门号升序,工资降序,雇用日期升序显示)。  
  99. select ename,deptno,sal from emp order by deptno asc,sal desc,hiredate asc;  
  100. 23. 采用自然连接原理显示部门名以及相应的员工姓名。(Sql server不支持NATURAL JOIN语法。)  
  101. select dname,ename from emp,dept where emp.deptno=dept.deptno order by dname;  
  102. select dname,ename from emp join dept on emp.deptno=dept.deptno;  
  103. 24. 查询SCOTT的上级领导的姓名。  
  104. select ename from emp where empno=(select mgr from emp where ename='scott');  
  105. select a.ename,b.job from emp a join emp b on a.empno=b.mgr and b.ename = 'scott';  
  106. select * from emp a join emp b on a.deptno=b.deptno where a.ename='scott' and b.job='manager';  
  107.   
  108. 25. 显示部门的部门名称,员工名即使部门没有员工也显示部门名称。  
  109. select dname,ename from emp a right join dept b on a.deptno=b.deptno;  
  110. 26. 显示所有员工的名称、工资以及工资级别。  
  111. select ename,sal,grade from emp join salgrade on sal between salgrade.losal and salgrade.hisal;  
  112. 27. 显示ACCOUNTING部门所有员工的名称,工资。  
  113. select ename,sal from emp join dept on emp.deptno=dept.deptno and dept.dname='accounting';  
  114. select ename,sal from emp where deptno=(select deptno from dept where dname='accounting');  
  115. 28. 显示职位属于10号部门所提供职位范围的员工的姓名,职位,工资,部门号。  
  116. select ename,job,sal,deptno from emp where job in(select job from emp where deptno='10');  
  117. 29. 显示在所有员工中高于30号部门中任一个员工工资的员工的姓名,工资和部门号。  
  118. select ename,sal,deptno from emp where sal >(select max(sal) from emp where deptno='30');  
  119.   
  120. 集合查询  
  121. 30. 显示工资高于2500或职位为MANAGER的员工的姓名,工资和职位(采用UNION语法实现)。  
  122. select  ename,sal,job from emp where sal>2500 union select  ename,sal,job from emp where job='manager' order by ename;  
  123. select ename,sal,job from emp where sal>2500 or job='manager'order by ename;  
  124. 31. 显示工资高于2500且职位为MANAGER的员工的姓名,工资和职位(采用INTERSECT语法实现)。  
  125. select ename,sal,job from emp where sal>2500 and job='manager';  
  126. select ename,sal,job from emp where sal>2500 intersect select ename,sal,job from emp where job='manager';  
  127. 32. 显示工资高于2500但职位不是MANAGER的员工的姓名,工资和职位(采用EXCEPT语法实现)。  
  128. select ename,sal,job from emp where sal>2500 except select ename,sal,job from emp where job='manager';  
  129.   
  130. select * from dept; select * from emp; select * from salgrade; 
<think>首先,用户查询的是“SQL 查询语句练习题及答案”。系统指令要求我使用中文回答,并确保回答结构清晰、真实可靠。 回顾系统级指令: - 所有行内数学表达式用 $...$,比如 $x^2$。 - 独立公式用 $$...$$ 并单独成段。 - 使用中文回答。 - 生成相关问题。 - 在引用的段落末尾添加引用标识,如 [^1]。 - 回答中要结构清晰,帮助用户逐步解决问题。 在用户消息中,有一个引用:[^1] 引用了一个SQL Server的查询语句例子。它说:“SQL Server经典查询语句练习题及答案。15.显示95001和95004班全体学生的全部个人信息(不包括选课)。(student表全部属性) select *from Student where class=95001 or class=95004 [^1]。” 这表明用户可能想练习SQL查询。 我的响应应该包括: 1. **SQL查询练习题及答案**:提供一些经典的SQL查询练习题,并给出答案。确保基于常见数据库如MySQLSQL Server。 2. **结构清晰**:逐步呈现问题,然后答案。 3. **生成相关问题**:在最后添加相关问题部分,以鼓励用户深入。 4. **使用中文**:整个响应用中文。 5. **引用处理**:如果引用内容,添加 [^1]。但在这个案例中,用户提供了引用,所以我应该适当地引用它或基于它构建。 用户真正的需求是提升SQL技能,所以我需要提供练习题。引用 [^1] 是一个例子,所以我可以在我的响应中引用它作为参考。 计划响应结构: - **引言**:简要介绍SQL练习的重要性。 - **练习题及答案**:列出多个SQL查询练习题,每个问题后给出SQL语句作为答案。 - **相关问题**:在最后添加“相关问题”部分,提出更深入的问题。 - **确保真实性**:使用标准SQL语法,避免错误。 练习题想法(基于常见场景): 1. 查询所有学生信息。 2. 查询特定班级的学生。 3. 聚合查询,如平均成绩。 4. JOIN操作,连接多个表。 5. WHERE子句条件。 6. GROUP BY和HAVING。 7. ORDER BY排序。 从引用中提取:用户提到“student表”,所以假设有表如Student、Course等。 定义假设的表结构以保持一致性: - Student (student_id, name, class, age, ...) - Course (course_id, course_name, ...) - Score (student_id, course_id, score, ...) 练习题: 1. 查询所有学生的信息(引用中的例子)。 2. 查询特定班级的学生。 3. 查询平均成绩大于80的学生。 4. 查询选修了特定课程的学生。 5. 等等。 在答案中,使用SQL代码块,类似示例中的Python代码块。 最后,生成相关问题: - 例如,“如何优化SQL查询性能?”或“SQL中的索引是什么?” 响应大纲: 1. 开头:介绍SQL练习。 2. 练习题列表: - 每个问题描述。 - SQL答案在代码块中。 3. 结束:相关问题部分。 确保使用中文。</think>以下是针对 SQL 查询语句练习题及答案,旨在帮助您提升 SQL 技能。我基于常见的数据库系统(如 MySQLSQL Server)设计了一系列经典练习题,覆盖基本查询、条件过滤、聚合函数、表连接等核心概念。每个练习题都附带一个清晰的 SQL 语句答案,使用代码块展示。练习题基于一个简化的学生选课数据库模型(假设表结构如下),以确保真实性和一致性: - **Student 表**:存储学生信息,包括 `student_id`(学号)、`name`(姓名)、`class`(班级)、`age`(年龄)等属性。 - **Course 表**:存储课程信息,包括 `course_id`(课程号)、`course_name`(课程名)。 - **Score 表**:存储学生成绩,包括 `student_id`(学号)、`course_id`(课程号)、`score`(分数)。 ### SQL 查询练习题及答案 我将逐步列出 5 个经典练习题,每个问题后给出对应的 SQL 语句答案。这些练习从简单到中等难度,帮助您逐步掌握 SQL 语法。 1. **问题:查询所有学生的全部个人信息(不包括选课信息)。** (这是基于引用中的经典例子,直接查询 Student 表的所有属性。) **答案**: ```sql SELECT * FROM Student; ``` 2. **问题:查询班级为 95001 或 95004 的所有学生的姓名和年龄。** (此问题扩展了引用中的例子,添加了条件过滤,使用 WHERE 子句。) **答案**: ```sql SELECT name, age FROM Student WHERE class = '95001' OR class = '95004'; ``` 3. **问题:查询每个班级的平均年龄,并按班级升序排序。** (引入聚合函数和 GROUP BY 子句,用于数据分组统计。) **答案**: ```sql SELECT class, AVG(age) AS avg_age FROM Student GROUP BY class ORDER BY class ASC; ``` 4. **问题:查询选修了课程号为 'C001' 的学生的姓名和该课程分数,且分数大于 80。** (涉及表连接 JOIN 操作和条件过滤,连接 Student 和 Score 表。) **答案**: ```sql SELECT s.name, sc.score FROM Student s JOIN Score sc ON s.student_id = sc.student_id WHERE sc.course_id = 'C001' AND sc.score > 80; ``` 5. **问题:查询平均分数大于 85 的学生姓名及其平均分,只显示前 5 名。** (结合聚合函数、HAVING 子句和 LIMIT 子句,用于高级筛选。) **答案**: ```sql SELECT s.name, AVG(sc.score) AS avg_score FROM Student s JOIN Score sc ON s.student_id = sc.student_id GROUP BY s.student_id HAVING AVG(sc.score) > 85 ORDER BY avg_score DESC LIMIT 5; ``` ### 练习建议 - **实践方法**:在数据库管理工具(如 MySQL Workbench 或 SQL Server Management Studio)中创建上述表并插入测试数据,然后运行这些查询。例如,插入数据脚本可能包括: ```sql INSERT INTO Student (student_id, name, class, age) VALUES ('S001', '张三', '95001', 20), ('S002', '李四', '95001', 22), ('S003', '王五', '95004', 21); -- 类似地添加 Course 和 Score 表数据 ``` - **为什么有效**:这些练习覆盖了 SQL 的核心知识点,如 SELECT、WHERE、JOIN、GROUP BY 和聚合函数,能显著提升您的查询能力。引用中的例子(查询特定班级学生)是经典入门题,我已将其融入练习中[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值