sql常见面试题分析及解答

Sql常见面试题(总结)

1.

用一条SQL语句 查询出每门课都大于80分的学生姓名 

name   kecheng   fenshu 
张三     语文       81
张三     数学       75
李四     语文       76
李四     数学       90
王五     语文       81
王五     数学       100
王五     英语       90

sql:select distinct name from table  where  name not in (select distinct name from table where fenshu<=80)

所有distinct的name 减去至少有一个kecheng的fenshu小于等于80,剩下的就是题目要求的了

 

 

2.

学生表 如下:
自动编号   学号   姓名 课程编号 课程名称 分数
1        2005001  张三  0001      数学    69
2        2005002  李四  0001      数学    89
3        2005001  张三  0001      数学    69
删除除了自动编号不同,其他都相同的学生冗余信息

A: delete tablename where 自动编号 not in(select min(自动编号) from tablename group by 学号,姓名,课程编号,课程名称,分数)

delete   from   blur_article    where   id   not   in(select   min(id)   from  blur_article    group   by   title)报错
错误消息:
#1093 - You can't specify target table 'blur_article' for update in FROM clause 
mysql中不能这么用。 (等待mysql升级吧)
错误提示就是说,不能先select出同一表中的某些值,再update这个表(在同一语句中)

替换方案:
create table tmp as select min(id) as col1 from blur_article group by title;
delete from blur_article where id not in (select col1 from tmp);
drop table tmp;


3.

一个叫team的表,里面只有一个字段name,一共有4条纪录,分别是a,b,c,d,对应四个球对,现在四个球对进行比赛,用一条sql语句显示所有可能的比赛组合.
你先按你自己的想法做一下,看结果有我的这个简单吗?

答:select a.name, b.name 
from team a, team b 
where a.name < b.name

输出结果为:

name | name |
+------+------+
| a | b |
| a | c |
| b | c |
| a | d |
| b | d |
| c | d

 

 

4

(1)复制表结构和数据(自动创建表,并且复制表)

create table t3 as select * from department

create table t3 select * from Student;

这种方法的一个最不好的地方就是新表中没有了旧表的primary key、Extra(auto_increment)等属性。需要自己用&quot;alter&quot;添加,而且容易搞错。

(2)只复制表结构到新表

CREATE TABLE 新表SELECT * FROM 旧表WHERE 1=2

这种方法的一个不好的地方就是新表中没有了旧表的primary key、Extra(auto_increment)等属性
CREATE TABLE 新表LIKE 旧表

这种方法的一个好的地方就是新表中也有了旧表的primary key、Extra(auto_increment)等属性

 
(3)复制旧表的数据到新表(假设两个表结构一样)
INSERT INTO 新表SELECT * FROM 旧表
 
 
(4)复制旧表的数据到新表(假设两个表结构不一样)
INSERT INTO 新表(字段1,字段2,.......) SELECT 字段1,字段2,...... FROM 旧表
 
 
(5)可以将表1结构复制到表2
SELECT * INTO 表2 FROM 表1 WHERE 1=2
 
 
(6)可以将表1内容全部复制到表2
SELECT * INTO 表2 FROM 表1
 
 
(7) show create table 旧表;
这样会将旧表的创建命令列出。我们只需要将该命令拷贝出来,更改table的名字,就可以建立一个完全一样的表
 
 
(8)mysqldump
用mysqldump将表dump出来,改名字后再导回去或者直接在命令行中运行

 

 

 

Student(S#,Sname,Sage,Ssex) 学生表  --------     S#:学号;Sname:学生姓名;Sage:学生年龄;Ssex:学生性别
Course(C#,Cname,T#) 课程表          --------          C#,课程编号;Cname:课程名字;T#:教师编号
SC(S#,C#,score) 成绩表              --------               S#:学号;C#,课程编号;score:成绩
Teacher(T#,Tname) 教师表            --------            T#:教师编号; Tname:教师名字

问题:
1、查询“001”课程比“002”课程成绩高的所有学生的学号;
  select a.S# from (select s#,score from SC where C#='001') a,(select s#,score
  from SC where C#='002') b
  where a.score>b.score and a.s#=b.s#;

分析:先

posted @ 2014-07-21 21:28  爱的叹息  阅读(194)  评论(0)    收藏  举报