1.1 SQL答案
第一题
用聚合函数,分组可查出 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
signature:祸兮福所倚,福兮祸所伏