第一题
用聚合函数,分组可查出 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
来源:https://www.cnblogs.com/xnuuuu/p/12163551.html