今天面试中遇到的几个sql查询问题

.请教一个面试中遇到的SQL语句的查询问题
表中有A B C三列,用SQL语句实现:当A列大于B列时选择A列否则选择B列,当B列大于C列时选择B列否则选择C列。
------------------------------------------
select (case when a>b then a else b end ),
(case when b>c then b esle c end)
from table_name

CREATE TABLE shuzi(
A INT,
B INT,
C INT
)

INSERT INTO shuzi (A,B,C) VALUE (29,25,36)
INSERT INTO shuzi (A,B,C) VALUE (29,25,3)
INSERT INTO shuzi (A,B,C) VALUE (4,25,3)
INSERT INTO shuzi (A,B,C) VALUE (4,2,3)
INSERT INTO shuzi (A,B,C) VALUE (1,2,3)

SELECT * FROM shuzi

SELECT (CASE WHEN a>b THEN a ELSE b END),(CASE WHEN b>c THEN b ELSE c END) FROM shuzi

SELECT (CASE WHEN a>b THEN a  
             WHEN a>c THEN a  
             WHEN b>c THEN b ELSE c  
             END)  
FROM shuzi


查询每门课程成绩都大于80分学生的学号
数据库 表 student
name score course
A 85 

语文
A 75  数学
A 82  英语
B   75  语文
B   89  数学
B   79  英语
C   90 语文
C   100 数学
C   100 英语

请找出每门课程都超过80分的那个人名字的SQL语句

SQL1:

select name from test.stu
group by name
having count(score) =sum(case  when score>80 then 1 else 0 end )

SQL2:

select name from stu
group by name
having name not in (
select name from stu
where score <80)

SQL3:

select name from test.stu
group by name
having min(score)>=80



================================================

查询课程001的成绩大于课程002成绩的学号

student表:sno(学号),sname(姓名),sex(性别),dept(系) 
course课程表:cno(课程号),课程名(cname) 
sc选课表:sno,cno,grade(成绩)

select cno from sc a inner join (select * from sc where cno=(select cno from course where cname='001')) as b on a.cno>o=(select cno from course where cname='002')






================================================

关于group by表内容:

2005-05-09 胜
2005-05-09 胜
2005-05-09 负
2005-05-09 负
2005-05-10 胜
2005-05-10 负
2005-05-10 负

如果要生成下列结果, 该如何写sql语句

            胜 负
2005-05-09  2  2
2005-05-10  1  2
--------------------------------------------------------
1) select rq,sum(case when shengfu='胜' then 1 else 0 end) as胜,sum(case when shengfu='负' then 1 else 0 end) as负from tab3 group by rq
2) select N.rq,N. 胜,M. 负 from
(select rq,count(*) 胜 from tab3 where shengfu='胜'group by rq)N inner join
(select rq,count(*) 负from tab3 where shengfu='负'group by rq)M on N.rq=M.rq
3) select a.rq,a. 胜  as胜,b.负  as  负from
(select rq,count(shengfu) 胜from tab3 where shengfu='胜' group by rq) a,
(select rq,count(shengfu) 负from tab3 where shengfu='负' group by rq) b
where a.rq=b.rq;
4)select time, sum(decode(status,'胜','')) 胜 ,sum(decode(status,'负','')) 负 from shengfu_table group by time;  

======================================================


表中有A B C三列,用SQL语句实现:当A列大于B列时选择A列否则选择B列,当B列大于C列时选择B列否则选择C列。
select (case when a>b then a else b end),(case when b>c then b else c end) from tab4


一个日期判断的sql语句请取出tab5表中日期(SendTime字段)为当天的所有记录 (SendTime字段为datetime型,包含日期与时间)
select * from tab5 t where to_char(t.SendTime,'yyyy-mm-dd')=to_char(sysdate,'yyyy-mm-dd')


有一张表,里面有3个字段:语文,数学,英语。其中有3条记录分别表示语文70分,数学80分,英语58分,请用一条sql语句查询出这三条记录并按以下条件显示出来(并写出您的思路): 
   大于或等于80表示优秀,大于或等于60表示及格,小于60分表示不及格。 
       显示格式: 
       语文              数学                英语 
       及格              优秀                不及格   
-------------------------------------------------------
select
(case when语文>=80 then '优秀' when语文>60 then '及格' else '不及格' end) as 语文,
(case when 数学>=80 then '优秀' when数学>60 then '及格' else '不及格' end) as数学,
(case when英语>=80 then '优秀' when英语>60 then '及格' else '不及格' end) as 英语
from tab5



==================================

请用一个sql语句得出结果
从table1,table2中取出如table3所列格式数据

table1

月份mon   部门dep   业绩yj
-------------------------------
一月份      01        10
一月份      02        10
一月份      03         5
二月份      02         8
二月份      04         9
三月份      03         8

table2

部门dep      部门名称depname
--------------------------------
      01      国内业务一部
      02      国内业务二部
      03      国内业务三部
      04      国际业务部

table3 (result)

部门dep     一月份      二月份      三月份
---------------------------------------------------
      01      10        null         null
      02      10         8           null
      03      5         null          8
      04      null       9           null
-------------------------------------------------------
1)
select t.depname,
(select yj from tab6 where mon='一月份' and dep=t.dep) 一月份,
(select yj from tab6 where mon='二月份' and dep=t.dep) 二月份,
(select yj from tab6 where mon='三月份' and dep=t.dep) 三月份
from tab7 t

---------------------
2)求总销售额
select
sum(case when t1.mon='一月份' then t1.yj else 0 end) 一月份,
sum(case when t1.mon='二月份' then t1.yj else 0 end) 二月份,
sum(case when t1.mon='三月份' then t1.yj else 0 end) 三月份
from tab7 t,tab6 t1 where t.dep=t1.dep


一个表中的Id有多个记录,把所有这个id的记录查出来,并显示共有多少条记录数。
-------------------------------------------
select id,count(*) from tab8 group by id having count(*)>1

select * from (select tab8,count(id) as num from tab8 group by id) t where t.num>1



一个叫department的表,里面只有一个字段name,一共有4条纪录,分别是a,b,c,d,对应四个球对,现在四个球对进行比赛,用一条sql语句显示所有可能的比赛组合.

select t.bh||'vs'||t1.bh from tab10 t,tab10 t1 where t.bh$amp;
select t.bh||'vs'||t1.bh from tab10 t,tab10 t1 where t.bh$amp;t1.bh这个是不分的



=================================
怎么把这样一个表儿
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

a):
select t.year,
(select a.amout from tab11 a where a.month=1 and a.year=t.year) m1,
(select b.amout from tab11 b where b.month=2 and b.year=t.year) m2,
(select c.amout from tab11 c where c.month=3 and c.year=t.year) m3,
(select d.amout from tab11 d where d.month=4 and d.year=t.year) m4
from tab11 t group by t.year


拷贝表(拷贝数据,源表名:a 目标表名:b)

SQL: insert into b(a, b, c) select d,e,f from b;

create table test as select * from dept; --从已知表复制数据和结构  

create table test as select * from dept where 1=2; --从已知表复制结构但不包括数据 



显示文章、提交人和最后回复时间

  select a.title,a.username,b.adddate from table a,(select max(adddate) adddate from table where table.title=a.title) b


日程安排提前五分钟提醒



两张关联表,删除主表中已经在副表中没有的信息
  delete from  fubiao a where a.fid not in(select id from zhubiao)


有两个表tab12和tab13,均有key和value两个字段,如果tab13的key在tab12中也有,就把tab13的value换为tab12中对应的value

update tab13 set value=(select value from tab12 where tab12.key=tab13.key)



原表:
courseid coursename score
-------------------------------------
   1       java      70
   2       oracle    90
   3       xml       40
   4       jsp       30
   5       servlet   80
-------------------------------------
为了便于阅读,查询此表后的结果显式如下(及格分数为60):
courseid coursename score mark
---------------------------------------------------
  1        java     70  pass
  2        oracle   90  pass
  3        xml      40  fail
  4        jsp      30  fail
  5        servlet  80  pass
---------------------------------------------------
select t.courseid,t.coursename,t.score,(case when score>60 then 'pass' else 'fail' end) mark from tab14 t


表15
a1   a2
1    a
1    b
2    x
2    y
2    z
用select能选成以下结果吗?
1 ab
2 xyz
SELECT a1, replace(max(sys_connect_by_path(a2, ' ')),' ','') NAME
  FROM (SELECT a1, a2, rn, LAG(rn) OVER(PARTITION BY a1 ORDER BY rn) rn1
          FROM (SELECT a1, a2, row_number() OVER(ORDER BY a1) rn FROM t) rn)
START WITH rn1 IS NULL
CONNECT BY rn1 = PRIOR rn
GROUP BY a1;


题为
有两个表, t1, t2,
Table t1:

SELLER | NON_SELLER
-----    -----
  A       B
  A       C
  A       D
  B       A
  B       C
  B       D
  C       A
  C       B
  C       D
  D       A
  D       B
  D       C

Table t2:

SELLER |  BAL
------  --------
  A       100
  B       200
  C       300
  D       400
要求用SELECT 语句列出如下结果:------如A的SUM(BAL)为B,C,D的和,B的SUM(BAL)为A,C,D的和.......
且用的方法不要增加数据库负担,如用临时表等
SELECT SELLER,a.total-t.BAL FROM t,(SELECT SUM(BAL) total FROM t)a;

原文地址:https://www.cnblogs.com/soul-mate/p/6438243.html