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)等属性。需要自己用"alter"添加,而且容易搞错。
(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#;
分析:先

浙公网安备 33010602011771号