1.1 SQL答案

心已入冬 提交于 2020-01-07 21:18:07

第一题

用聚合函数,分组可查出
select * FROM student GROUP BY name HAVING MIN(fenshu>=80)
用子查询先查出分数小于80的,在查出不在这其中的函数
SELECT distinct name from student where name not in(SELECT name from student where fenshu<=80)

第二题

--普通的查询You can't specify target table for update in FROM clause
--错误的意思是说,不能先select出同一表中的某些值,再update这个表(在同一语句中)
--必须搞一个虚表,
--也就是说将select出的结果再通过中间表select一遍,这样就规避了错误。
--注意,这个问题只出现于mysql,mssql和Oracle不会出现此问题。
--在select外边套一层,让数据库认为你不是查同一表的数据作为同一表的更新数据
delete from student2 where id not in
    (select min(id) from 
         (select * from student2 ) 
                     as t group by t.name);

第三题

--两张表的笛卡尔乘积,最终结果应该有 4*4=16条结果。
--现在在最终结果集上加了条件a.name < b.name,意味着进一步筛选,最终只有6条数据
--第一个球队的名字按照字母顺序应该小于第二个球队的名字。
--这样做的主要目的,是为了:
--1. 排除无意义的组合,如a a, b b, c c, d d
--2. 排除重复数据, 如 有了a b就不再需要b a,有了b d, 就不需要d b.
SELECT a.name,b.name from team a,team b
where a.name>b.name
--还可以加一个排序
SELECT a.name,b.name from team a,team b
where a.name<b.name ORDER BY a.name,b.name

第四题

--1.先查询101科目所对应的月份以及月份所对应的发生额
select occMonth,debitOccur from account where accID='101';
--2.接着查询account表中除了101科目外,月发生额比101对应月份的发生额高的科目信息
    where 条件  月份相同  a发生额比b表的发生额大
select a.* from account a,
    (select occMonth,debitOccur from account where accID='101') b 
        where a.occMonth=b.occMonth and a.debitOccur>b.debitOccur;
--3.最后去掉不是每一个月份的发生额都比101科目对应月份的发生额高的科目
--    搞个分组 having条件可有可无
select accID from 
    (
        select a.* from account a,
            (select occMonth,debitOccur from account where accID='101') b 
        where a.occMonth=b.occMonth and a.debitOccur>b.debitOccur
    ) c 
group by accID having count(occMonth)=12;

第五题

--一、行转列 即将原本同一列下多行的不同内容作为多个字段,输出对应内容。
--1、使用case...when....then 进行行转列
        
--        SUM() 是为了能够使用GROUP BY根据userid进行分组,因为每一个userid对应---的subject="语文"的记录只有一条,
--        所以SUM() 的值就等于对应那一条记录的score的值。
--        假如userid ='001' and subject='语文' 的记录有两条,则此时SUM() 的值将会---是这两条记录的和,
--        同理,使用Max()的值将会是这两条记录里面值最大的一个。但是正常情况下,
--        一个user对应一个subject只有一个分数,因此可以使用SUM()、MAX()、MIN()、AVG()等聚合函数都可以达到行转列的效果。
    
--    格式说明    
--    case 列名
--    when   条件值1   then  选择项1
--    when   条件值2    then  选项2.......
--    else     默认值      end
    
    SELECT userid,
max(CASE `subject` WHEN '语文' THEN score ELSE 1 END) as '语文',
max(CASE `subject` WHEN '数学' THEN score ELSE 0 END) as '数学',
SUM(CASE `subject` WHEN '英语' THEN score ELSE 0 END) as '英语',
SUM(CASE `subject` WHEN '政治' THEN score ELSE 0 END) as '政治' 
FROM tb_score 
GROUP BY userid

第六题

--如果A,B两个表中没有重复数据且表结构一样可以直接
insert into B select * from A
--如果结构不一样可以
insert into B(字段列表),select 字段列表 from A

第七题

-- ab表都有文章标题,以此作为内连接条件进行查询

第八题

--CURDATE() 函数返回当前的日期。
--DATE_SUB() 函数从日期减去指定的时间间隔。
--    date 参数是合法的日期表达式。expr 参数是您希望添加的时间间隔。
--    type 参数可以是下列值  例如 month day week 等等
SELECT * FROM 表名 where DATE_SUB(CURDATE(), INTERVAL 30 DAY) <= date(时间字段名)

第九题

--AVG 函数返回数值列的平均值。NULL 值不包括在计算中。
--SUM 函数返回数值列的总数(总额)。
--MAX 函数返回一列中的最大值。NULL 值不包括在计算中。
--MIN 函数返回一列中的最小值。NULL 值不包括在计算中。
--COUNT() 函数返回匹配指定条件的行数。
--    COUNT(column_name) 函数返回指定列的值的数目(NULL 不计入):
--    COUNT(*) 函数返回表中的记录数:

第十题

--自己写的,以第二题表数据为基础,
SELECT name from student GROUP BY name HAVING
COUNT(name)>=3
--二、
    SELECT * from (
        SELECT COUNT(name) as count,name from student GROUP BY name) t 
    WHERE t.count>=3
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!