面試常見SQL練習題
阿新 • • 發佈:2018-12-21
第一題
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;
後面持續更新…