SQL面试题(2006年11月13日之前总结)

 

1.显示数据库中的最后一条记录的所有字段(ID是自增的)

SELECT top 1 * FROM Table_Name ORDER BY ID DESC

或者

SELECTFROM 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

 

论坛回帖:

1select 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

 

2select Dept_ID,avg(Salary) as 平均工资

from t_Salary

group by Dept_ID

having avg(Salary)>3000

 

3select *

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

 

4select 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

 

5HAVING 子句对 GROUP BY 子句设置条件的方式与 WHERE 子句和 SELECT 语句交互的方式类似。WHERE 子句搜索条件在进行分组操作之前应用;而 HAVING 搜索条件在进行分组操作之后应用。HAVING 语法与 WHERE 语法类似,但 HAVING 可以包含聚合函数。HAVING 子句可以引用选择列表中出现的任意项。

 

6SELECT

 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.有两个表AB,均有keyvalue两个字段,如果BkeyA中也有,就把Bvalue换为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)

 

posted @ 2006-11-13 16:23  bobbychen  阅读(754)  评论(0)    收藏  举报