1. 程式人生 > >面試常見SQL練習題

面試常見SQL練習題

第一題

CREATE TABLE `table1` (
  `name` VARCHAR(20) DEFAULT NULL,
  `kecheng` VARCHAR(20) DEFAULT NULL,
  `fenshu` INT(10) DEFAULT NULL
);

INSERT INTO table1(NAME,kecheng,fenshu) VALUES('張三','語文',81);
INSERT INTO table1(NAME,kecheng,fenshu) VALUES('張三','數學',75);
INSERT INTO table1(NAME,kecheng,fenshu) VALUES('李四','語文',76);
INSERT INTO table1(NAME,kecheng,fenshu) VALUES('李四','數學',76);
INSERT INTO table1(NAME,kecheng,fenshu) VALUES('王五','語文',81);
INSERT INTO table1(NAME,kecheng,fenshu) VALUES('王五','數學',100);

#求出每門課都大於80分的學生姓名

第一種方法:

SELECT NAME FROM table1 GROUP BY NAME 
HAVING MIN(fenshu)>80

第二種方法:

SELECT NAME FROM table1 GROUP BY NAME 
HAVING COUNT(1)=SUM(CASE WHEN fenshu>80 THEN 1 ELSE 0 END)

第三種方法:

SELECT NAME FROM table1 GROUP BY NAME 
HAVING NAME NOT IN (SELECT NAME FROM table1 WHERE fenshu<=80)

第二題

CREATE TABLE `table2` (
  `語文` INT(10) DEFAULT NULL,
  `數學` INT(10) DEFAULT NULL,
  `英語` INT(10) DEFAULT NULL
);
INSERT INTO table2(語文,數學,英語) VALUES(58,70,80);

有一張表,3個欄位是語文,數學,英語, 有1條記錄分別表示語文68,數學70,英語80, 得出結果分數變等級(>=80分是優秀, >=60分是及格, <60是不及格)

SELECT CASE WHEN 語文>=80 THEN '優秀' WHEN 語文>=60 THEN '及格' WHEN 語文<60 THEN '不及格' END 語文,
CASE WHEN 數學>=80 THEN '優秀' WHEN 數學>=60 THEN '及格' WHEN 數學<60 THEN '不及格' END 數學,
CASE WHEN 英語>=80 THEN '優秀' WHEN 英語>=60 THEN '及格' WHEN 英語<60 THEN '不及格' END 英語 
FROM table2

第三題

CREATE TABLE `table3` (
  `date` VARCHAR(20) DEFAULT NULL,
  `result` VARCHAR(10) DEFAULT NULL
)

#查詢出來的結果:
#date 勝 負
#2011-02-01 2 1
#2011-02-02 1 1

SELECT DATE, 
(SELECT COUNT(1) FROM table3 WHERE DATE=t.date AND result='勝') AS 勝, 
(SELECT COUNT(1) FROM table3 WHERE DATE=t.date AND result='負') AS 負
FROM table3 t GROUP BY DATE

第四題

#1 2005001 張三 0001 數學 69
#2 2005002 李四 0001 數學 89
#3 2005001 張三 0001 數學 69

CREATE TABLE IF NOT EXISTS `student_test` (
	id INT UNSIGNED AUTO_INCREMENT,
	stu_id VARCHAR(10) NULL,
	NAME VARCHAR(10) NULL,
	couser_id VARCHAR(10) NULL,
	couser VARCHAR(10) NULL,
	score DECIMAL(10,2) NULL,
	PRIMARY KEY (id) 
)
INSERT INTO student_test(id,stu_id,NAME,couser_id,couser,score) VALUES(NULL,'2005001','張三','0001','數學',69);
INSERT INTO student_test(id,stu_id,NAME,couser_id,couser,score) VALUES(NULL,'2005002','李四','0001','數學',89);
INSERT INTO student_test(id,stu_id,NAME,couser_id,couser,score) VALUES(NULL,'2005001','張三','0001','數學',69);

#刪除冗餘欄位, 保留ID最小的那個

DELETE FROM student_test WHERE id NOT IN (
 SELECT * FROM (
  SELECT MIN(id) FROM student_test GROUP BY stu_id,NAME,couser_id,couser,score
 ) s
)

第五題

CREATE TABLE IF NOT EXISTS `product` (
	id INT UNSIGNED AUTO_INCREMENT,
	NAME VARCHAR(10) NULL,
	STATUS VARCHAR(10) NULL,
	PRIMARY KEY (id)
)
INSERT INTO product(id,NAME,STATUS) VALUES(NULL,'蘋果','好吃');
INSERT INTO product(id,NAME,STATUS) VALUES(NULL,'梨','難吃');
INSERT INTO product(id,NAME,STATUS) VALUES(NULL,'橘子','好吃');
INSERT INTO product(id,NAME,STATUS) VALUES(NULL,'葡萄',NULL);

#現在需要把status的‘好吃’更新為‘0’,‘難吃’更新為‘1’

UPDATE product SET STATUS=(CASE WHEN STATUS='好吃' THEN '0' WHEN STATUS='難吃' THEN '1' END)

第六題

#1) 建立一張學生表,包含以下資訊,學號,姓名,年齡,性別,家庭住址,聯絡電話

CREATE TABLE IF NOT EXISTS `t_student` (
	stu_id INT UNSIGNED AUTO_INCREMENT,
	NAME VARCHAR(10) NULL,
	age INT NULL,
	gender VARCHAR(2) NULL,
	address VARCHAR(50) NULL,
	phone VARCHAR(11) NULL,
	PRIMARY KEY (stu_id)
);

#2) 修改學生表的結構,新增一列資訊,學歷

ALTER TABLE t_student ADD COLUMN `education` VARCHAR(20) NOT NULL;

#3) 修改學生表的結構,刪除一列資訊,家庭住址

ALTER TABLE t_student DROP COLUMN address;

#4) 向學生表新增如下資訊:

INSERT INTO t_student(stu_id,NAME,age,gender,phone,education) VALUES(NULL,'A',22,'男','123456','小學');
INSERT INTO t_student(stu_id,NAME,age,gender,phone,education) VALUES(NULL,'B',21,'男','119','中學');
INSERT INTO t_student(stu_id,NAME,age,gender,phone,education) VALUES(NULL,'C',23,'男','110','高中');
INSERT INTO t_student(stu_id,NAME,age,gender,phone,education) VALUES(NULL,'D',18,'女','114','大學');

#5) 修改學生表的資料,將電話號碼以11開頭的學員的學歷改為“大專”

UPDATE t_student SET education='大專' WHERE phone LIKE '11%';

#6) 刪除學生表的資料,姓名以C開頭,性別為‘男’的記錄刪除

DELETE FROM t_student WHERE NAME LIKE 'C%' AND gender='男';

#7) 查詢學生表的資料,將所有年齡小於22歲的,學歷為“大專”的,學生的姓名和學號示出來

SELECT stu_id,NAME FROM t_student WHERE age<22 AND education='大專'

#8) 查詢學生表的資料,查詢所有資訊,列出前25%的記錄

SELECT * FROM t_student WHERE stu_id<=(SELECT COUNT(*) FROM t_student)*0.25;

#9) 查詢出所有學生的姓名,性別,年齡降序排列

SELECT NAME,gender,age FROM t_student ORDER BY age DESC;

#10) 按照性別分組查詢所有的平均年齡

SELECT gender,AVG(age) FROM t_student GROUP BY gender;

後面持續更新…