筆試題-sql語句

今天遇到了不熟練(不會)的查詢題目

  • 回來本身又作了一下,以下

建表語句


-- Table structure for score
-- ----------------------------
DROP TABLE IF EXISTS score;
CREATE TABLE score (
id int(11) DEFAULT NULL,
sno int(11) DEFAULT NULL,
name varchar(255) DEFAULT NULL,
subject varchar(255) DEFAULT NULL,
score varchar(255) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;mysql


-- Records of score
-- ----------------------------
INSERT INTO score VALUES ('1', '201201', '小明', 'math', '90');
INSERT INTO score VALUES ('2', '201202', '小李', 'math', '99');
INSERT INTO score VALUES ('3', '201203', '小紅', 'math', '43');
INSERT INTO score VALUES ('4', '201201', '小明', 'en', '66');
INSERT INTO score VALUES ('5', '201202', '小李', 'en', '56');
INSERT INTO score VALUES ('6', '201203', '小紅', 'en', '88');
INSERT INTO score VALUES ('7', '201201', '小明', 'computer', '99');
INSERT INTO score VALUES ('8', '201202', '小李', 'computer', '65');
INSERT INTO score VALUES ('9', '201203', '小紅', 'computer', '67');
INSERT INTO score VALUES ('11', '201204', '小白', 'sss', '99');
INSERT INTO score VALUES ('11111', '201203', '小紅', 'computer', '67');sql

  • 題目1:找到全部分數都及格(>=60)的學生。3d

    1. 查詢有科目分數小於 60 的, 而後 not in 便可
      select name from score where sno not in
      (select s.sno from score s where s.score < 60) GROUP BY snocode

    2. not exists 寫法
      select name from score s1 where not exists
      (select 1 from score s where s.score < 60 and s1.sno = s.sno) GROUP BY s1.snoblog

    3. having 篩選
      select * from score s GROUP BY s.sno having min(s.score) >= 60date

  • 題目2:表中有冗餘記錄,如何刪除?以下圖:select

分析:找到該數據對應的id,根據id刪除!im

select s.id from score s group by s.sno,s.name,s.subject,s.score -- 此結果不包含須要刪除的id
本覺得是:delete from score where id not in (select s.id from score s group by s.sno,s.name,s.subject,s.score )數據

  • 結果堅決果斷的拋出錯誤:
  • 查明緣由,mysql認爲delete/update 跟 子句裏面select到的不能是一張表查詢

  • 作出改進(表起別名,按照須要刪掉新插入的或者後插入的)

delete from score where id not in (select id from (select min(id) id from score s group by sno,name,subject,score )t)

相關文章
相關標籤/搜索