1. 用一条SQL 语句 查询出每门课都大于80 分的学生姓名
name kecheng fenshu
张三 语文 81
张三 数学 75
李四 语文 76
李四 数学 90
王五 语文 81
王五 数学 100
王五 英语 90
Answer:
①select distinct name from table where name not in (select distinct name from table where fenshu<=80)
②select name from table group by name having min(fenshu)>80
2. 学生表 如下:
自动编号 学号 姓名 课程编号 课程名称 分数
1 2005001 张三 0001 数学 69
2 2005002 李四 0001 数学 89
3 2005001 张三 0001 数学 69
删除除了自动编号不同, 其他都相同的学生冗余信息
Answer:
①delete from table where 自动编号 not in (select nin(自动编号) from table group by 学号, 姓名 ,课程编号,课程名称,分数)
3. 面试题:怎么把这样一个表儿(aaa)
year month amount
1991 1 1.1
1991 2 1.2
1991 3 1.3
1991 4 1.4
1992 1 2.1
1992 2 2.2
1992 3 2.3
1992 4 2.4
查成这样一个结果
year m1 m2 m3 m4
1991 1.1 1.2 1.3 1.4
1992 2.1 2.2 2.3 2.4
Answer:
①:select year ,
(select amount from aaa m where month=1 amd m.year=aaa.year) as m1,
(select amount from aaa m where month=2 amd m.year=aaa.year) as m2,
(select amount from aaa m where month=3 amd m.year=aaa.year) as m3,
(select amount from aaa m where month=4 amd m.year=aaa.year) as m4
from aaa
group by year
4. 说明:拷贝表( 拷贝数据, 源表名:a 目标表名:b)
Answer:
①:insert into b(a,b,c) select d,e,f from a
5.有一张表,里面有3个字段:语文,数学,英语。其中有3条记录分别表示语文70分,数学80分,英语58分,请用一条sql语句查询出这三条记录并按以下条件显示出来(并写出您的思路):
大于或等于80表示优秀,大于或等于60表示及格,小于60分表示不及格。
显示格式:
语文 数学 英语
及格 优秀 不及格
Answer:
①:select
(case when 语文>=80 then '优秀' when 语文>=60 then '及格' else '不及格') AS 语文,
(case when 数学>=80 then '优秀' when 数学>=60 then '及格' else '不及格') AS 数学,
(case when 英语>=80 then '优秀' when 英语>=60 then '及格' else '不及格') AS 英语
from table
6、编写SQL语句
1) 创建一张学生表,包含以下信息,学号,姓名,年龄,性别,家庭住址,联系电话
2) 修改学生表的结构,添加一列信息,学历
3) 修改学生表的结构,删除一列信息,家庭住址
4) 向学生表添加如下信息:
学号 姓名年龄性别联系电话学历
1 A 22 男 123456 小学
2 B 21 男 119 中学
5) 修改学生表的数据,将电话号码以11开头的学员的学历改为“大专”
6) 删除学生表的数据,姓名以C开头,性别为‘男’的记录删除
7) 查询学生表的数据,将所有年龄小于22岁的,学历为“大专”的,学生的姓名和学号示出来
8) 查询学生表的数据,查询所有信息,列出前25%的记录
9) 查询出所有学生的姓名,性别,年龄降序排列
10) 按照性别分组查询所有的平均年龄
Answer:
1)create table stu (学号 int,姓名 varchar(10),年龄 int ,性别 varchar(4) ,家庭住址 varchar(50),联系电话 int)
2)alter table stu add 学历 varchar(5)
3)alter table stu drop column 家庭住址
4)insert into stu values(1 ,'A' ,22, '男' ,123456, '小学'),(2 ,'B' ,21 ,'男' ,119 ,'中学')
5)update stu set 学历='大专' where 联系电话 like '11%'
6)delect from stu where 姓名 like 'C%' and 性别=‘男’
7)select 姓名 ,学号 from stu where 学历='大专' and 年龄<22
8)select top 25 percent * from stu
9)select 姓名,性别 from stu order by 年龄 desc
10)select avg(年龄) from stu group by 性别
7、查询A(ID,Name)表中第31至40条记录,ID作为主键可能是不是连续增长的列,完整的查询语句如下:
Answer:
①:select * from A limit 30,10
②:select top 10 * from A where ID >(select max(ID) from (select top 30 ID from A order by A ) T) order by A---怀疑
8、查询表A中存在ID重复三次以上的记录,完整的查询语句如下
Answer:
①:select * from A where ID in (select ID from A group by ID having count(ID)>3)
②:select b.id,b.name,(select ID,Name,ROW_NUMBER() over(partition by ID) '排名'from A) b where b.排名>3---仅SQL SEVER
9、说出以下聚合数的含义:avg ,sum ,max ,min , count ,count(*)
Answer:
AVG:求平均值
SUM:求和
MAX:求最大值
MIN:求最小值
10、说明:随机取出10条数据
Answer:
select top 10 * from tablename order by newid()---SQL SEVER
11、查询平均成绩大于60分的同学的学号和平均成绩;
Answer:
select id,avg(score) from stu group by id having avg(score) >60
12、解释名词
事务 Transaction 触发器 TRIGGER 继续 continue 唯一 unqiue
主键 primary key 标识列 identity 外键 foreign key 检查 check
约束 constraint
补充:
1. 不使用 min,找出表 ppp 中 num(列)最小的数
select num from ppp where num <= all(select num from ppp);
不可以使用 min 函数,但可以实用 order by 和 limit 相组合呀;
select * from ppp order by num desc limit 1;
自然,不使用 max,找出表 ppp 中 num 最大的数:
select num from ppp where num >=all(select num from ppp);
select num from ppp order by num limit1;
2. 选择表 ppp 中的重复记录
select * from ppp
where num in (select num from ppp group by num having count(num) > 1);
只返回单独的一条记录
select * from ppp group by num having count(num) = 1;
查询表中出现 四 次的记录,group by having
select * from ppp
where num in (select num from ppp group by num having count(num) = 4);
3. 影分身,一表当做两表用
表形式如下:
Year Salary
2000 1000
2001 2000
2002 3000
2003 4000
想得到如下形式的查询结果
Year Salary
2000 1000
2001 3000
2002 6000
2003 10000
sql语句怎么写?
select b.year, sum(a.salary) from hell0 a, hello b where a.year <= b.year group by b.year;
网友评论