SQL面试题(2006年11月13日之前总结)
1.显示数据库中的最后一条记录的所有字段(ID是自增的)
SELECT top 1 * FROM Table_Name ORDER BY ID DESC
或者
SELECT * FROM Table_Name WHERE ID=(SELECT MAX (ID) FROM Table_Name)
2.显示数据库中的最后十条记录的所有字段(ID 时自增的 DESC 做降序 ASC 做升序)
SELECT top 10 * FROM Table_Name ORDER BY ID DESC
3. t_Salary(ID,Dept_ID,Name,Salary) 工资表
t_Dept(ID,Dept_Name) 部门表
求:1.显示出员工的平均工资大于3000元的部门名称(用SQL语句)
SELECT "平均工资大于3000的部门"=Dept_Name
FROM t_Dept
WHERE ID in (SELECT Dept_ID
FROM t_Salary
GROUP BY Dept_ID——————————————对部门分组(即:相同部门的,进行同一操作)
Having avg(Salary)>3000)
2.显示出部门员工的平均工资大于3000元的部门
SELECT ID,Dept_Name,Salary
FROM t_Dept
INNER JOIN (SELECT Dept_ID,avg(Salary) as Salary
FROM t_Salary
GROUP BY Dept_ID
HAVING avg(Salary)>3000) B ON ID=Dept_ID
论坛回帖:
1.select A.* ,B.Salary from t_Dept A
inner join
(select Dept_ID,avg(Salary) as Salary from t_Salary group by Dept_ID having avg(Salary)>3000) B
on A.ID=B.Dept_ID
2.select Dept_ID,avg(Salary) as 平均工资
from t_Salary
group by Dept_ID
having avg(Salary)>3000
3.select *
from
(
select Dept_ID,avg(Salary)
from t_Salary
group by Dept_ID
having avg(Salary)>3000
) TS
inner join t_Dept TD
on TS.Dept_ID=TD.ID
4.select b.Dept_Name as 部门,avg(a.Salary) as 平均工资 from t_Salary a
left join t_Dept b on a.Dept_ID = b.ID
group by b.Dept_Name having avg(a.Salary) >= 3000
5.HAVING 子句对 GROUP BY 子句设置条件的方式与 WHERE 子句和 SELECT 语句交互的方式类似。WHERE 子句搜索条件在进行分组操作之前应用;而 HAVING 搜索条件在进行分组操作之后应用。HAVING 语法与 WHERE 语法类似,但 HAVING 可以包含聚合函数。HAVING 子句可以引用选择列表中出现的任意项。
6.SELECT
A.ID,
A.DEPT_NAME,
'平均工资'=SUM(B.SALARY)/COUNT(B.ID)
FROM
T_DEPT A LEFT JOIN T_SALARY B ON A.ID=B.DEPT_ID
GROUP BY
A.ID,
A.DEPT_NAME
HAVING
COUNT(B.ID)<>0
AND SUM(B.SALARY)/COUNT(B.ID)>3000
------------------------------------------------
要注意可能存在科室没有工资信息的情况
4.有两个表A和B,均有key和value两个字段,如果B的key在A中也有,就把B的value换为A中对应的value ,这道题的SQL语句怎么写?
推荐:
UPDATE b SET b.value=( SELECT a.value FROM a WHERE a.key=b.key)
WHERE b.id in (SELECT b.id FROM b,a WHERE b.key=a.key);
或者
UPDATE b SET value=(SELECT a.value FROM a WHERE b.key=a.key)
5.数据库Test 表t_Salary
(1).找出公司里收入最高的前三名员工:
SELECT top 3 *
FROM t_Salary
WHERE by Salary DESC
(2).找出表中的某一行或某几行的数据:
(1)找出表中第三行数据:
SELECT top 1 *
FROM t_Salary
WHERE ID IN (SELECT top 3 ID FROM t_Salary ORDER BY ID ASC)
ORDER BY ID DESC
(2)找出第三行到第五行之间的数据:
SELECT top 3 *
FROM t_Salary
WHERE ID IN (SELECT top 5 ID FROM t_Salary ORDER BY ID ASC)
ORDER BY ID DESC
(3).找出那些工资高于他们所在部门的平均工资的员工。
解法一:(查询速度较快)
SELECT name,dept_id, salary
FROM t_Salary ts
WHERE salary>(SELECT avg(salary)
FROM t_salary
WHERE Dept_ID=ts.Dept_ID)
注意:
此题不能用GROUP BY字句
SELECT name,dept_id, salary
FROM t_Salary ts
WHERE salary>(SELECT avg(salary)
FROM t_salary
GROUP BY Dept_ID)
因为SELECT字句返回的值多于一个,在判断的时候就会出错。
还有
SELECT name,dept_id, salary
FROM t_Salary ts
WHERE salary>(SELECT avg(salary)
FROM t_salary
WHERE Dept_ID=1)
这样也不能取得想要的答案,因为子查询中的条件没有关联外部查询的条件,
所以查询结果返回了t_Salary表中大于部门1平均工资的所有员工的信息,
而不是大于部门1平均工资的该部门员工的信息。
解法二:(符合思考规律)
SELECT ts.Name,ts.Dept_ID,ts.Salary
FROM t_Salary ts,(SELECT "Dept_ID"=Dept_ID,"avgSalary"=avg(Salary)
FROM t_Salary
GROUP BY Dept_ID) b
WHERE ts.Dept_ID=b.Dept_ID AND ts.Salary>b.avgSalary
(4).找出那些工资高于他们所在部门的平均工资的员工以及他所在部门的平均工资。
SELECT *
FROM t_Salary ts,(SELECT "Dept_ID"=Dept_ID,"avgSalary"=avg(Salary)
FROM t_Salary
GROUP BY Dept_ID) b
WHERE ts.Dept_ID=b.Dept_ID AND ts.Salary>b.avgSalary
(4).找出那些工资高于他们所在部门的manager的工资的员工。
SELECT id, last_name, salary, manager_id
FROM s_emp a
WHERE salary>(SELECT salary
FROM s_emp
WHERE id=a.manager_id)
(5).找出部门工资排名第二,三的员工
SELECT name,salary,deptno from (
SELECT concat(last_name,first_name) name,salary,department_id deptno,
rank() over (partition by department_id ORDER BY salary DESC) rnk
from employees) WHERE rnk=2 or rnk=3
6.有三张表分别是
TabStudent ( StudentID,StudentName)
TabSubject ( SubjectID,SubjectName)
TabStudentGrade (StudentID,SubjectID,Grade)
(1).显示出所有学生的信息
(2).按学号显示所有学生的信息
(3).显示出学生各科成绩是“及格”还是“不及格”
(4).显示出选了两门以上课程的学生
7.写出一条SQL语句:取出表A中第31条到第40条记录(SQLServer,以自动增长的ID为主键,注意:ID可能不是连续的。)
SELECT top 10 * FROM A WHERE ID not in (SELECT top 30 id FROM A)

浙公网安备 33010602011771号