1、用一條SQL 語句 查詢出每門課都大於80 分的學生姓名 name course grade 張三 語文 81 張三 數學 75 李四 語文 76 李四 數學 90 王五 語文 81 王五 數學 100 王五 英語 90
/*創建表*/
CREATE TABLE stu(
stu_name VARCHAR(255),
Course CHAR(2),
grade INT);
/*插入數據*/
INSERT INTO stu VALUES('張三','語文',81);
INSERT INTO stu VALUES('張三','數學',75);
INSERT INTO stu VALUES('李四','語文',76);
INSERT INTO stu VALUES('李四','數學',90);
INSERT INTO stu VALUES('王五','語文',81);
INSERT INTO stu VALUES('王五','數學',100);
INSERT INTO stu VALUES('王五','英語',90);
/*查詢*/
SELECT DISTINCT stu_name FROM stu
WHERE stu_name NOT IN(SELECT stu_name FROM stu WHERE grade<=80);
/*
分析:
先查出成績小於80的學生姓名,再查出不在成績小於80的學生姓名中的學生(去除重復記錄),即可
*/
2、現有學生表如下: 自動編號 學號 姓名 課程編號 課程名稱 分數 1 2005001 張三 0001 數學 69 2 2005002 李四 0001 數學 89 3 2005001 張三 0001 數學 69 刪除除了自動編號不同, 其他都相同的學生冗余信息
/*創建表*/
CREATE TABLE stu(
id INT(7) PRIMARY KEY AUTO_INCREMENT,
number INT(7),
stu_name VARCHAR(255),
course_id INT(7),
course_name VARCHAR(255),
score INT(7));
/*插入數據*/
INSERT INTO stu VALUES(NULL,2005001,'張三',0001,'數學',69);
INSERT INTO stu VALUES(NULL,2005002,'李四',0002,'數學',89);
INSERT INTO stu VALUES(NULL,2005001,'張三',0001,'數學',69);
/*刪除重復數據*/
DELETE FROM stu
WHERE stu.`id` NOT IN(SELECT `mid` FROM
(SELECT MIN(id) `mid` FROM stu
GROUP BY stu.`stu_name`,stu.`number`,stu.`course_id`,stu.`course_name`,stu.`score`) t);
/*
分析:
先按學號 姓名 課程編號 課程名稱 分數分組,
然后查出分組中的最小id(如果滿足刪除條件則id重復,取最小即可)
得到最小id的集合,然后刪除id不在集合中的數據(id不在集合中說明滿足刪除條件,即數據重復)
*/
3、一個叫 team 的表,里面只有一個字段name, 一共有4 條紀錄, 分別是a,b,c,d, 對應四個球對,現在四個球對進行比賽,用一條sql 語句顯示所有可能的比賽組合
SELECT t1.`t_name`, t2.`t_name`
FROM team t1,team t2
WHERE t1.`t_name`<t2.`t_name`;
/*
參考資料:https://blog.csdn.net/qq_37958608/article/details/87531029
*/
4、怎么把這樣一個數據表 year month amount 1991 1 1.1 1991 2 1.2 1991 3 1.3 1991 4 1.4 1992 1 2.1 1992 2 2.2 1992 3 2.3 1992 4 2.4 查成這樣一個結果? year m1 m2 m3 m4 1991 1.1 1.2 1.3 1.4 1992 2.1 2.2 2.3 2.4
/*創建date表*/
CREATE TABLE DATE(
YEAR VARCHAR(20),
MONTH INT(10),
amount VARCHAR(20)
);
/*插入數據*/
INSERT INTO DATE VALUES('1991', 1, '1.1');
INSERT INTO DATE VALUES('1991', 2, '1.2');
INSERT INTO DATE VALUES('1991', 3, '1.3');
INSERT INTO DATE VALUES('1991', 4, '1.4');
INSERT INTO DATE VALUES('1992', 1, '2.1');
INSERT INTO DATE VALUES('1992', 2, '2.2');
INSERT INTO DATE VALUES('1992', 3, '2.3');
INSERT INTO DATE VALUES('1992', 4, '2.4');
/*查詢*/
SELECT YEAR,
(SELECT amount FROM `date` d WHERE MONTH=1 AND d.year=date.year) AS m1,
(SELECT amount FROM `date` d WHERE MONTH=2 AND d.year=date.year) AS m2,
(SELECT amount FROM `date` d WHERE MONTH=3 AND d.year=date.year) AS m3,
(SELECT amount FROM `date` d WHERE MONTH=4 AND d.year=date.year) AS m4
FROM DATE GROUP BY YEAR
/*參考資料:https://blog.csdn.net/vivian_python/article/details/102793872*/
5、創建數據表(學生表 Student、教師表 Teacher、成績表 SC)
/*學生表 Student*/
CREATE TABLE Student(Sid VARCHAR(6), Sname VARCHAR(10), Sage DATETIME, Ssex VARCHAR(10));
INSERT INTO Student VALUES('01' , '趙雷' , '1990-01-01' , '男');
INSERT INTO Student VALUES('02' , '錢電' , '1990-12-21' , '男');
INSERT INTO Student VALUES('03' , '孫風' , '1990-05-20' , '男');
INSERT INTO Student VALUES('04' , '李雲' , '1990-08-06' , '男');
INSERT INTO Student VALUES('05' , '周梅' , '1991-12-01' , '女');
INSERT INTO Student VALUES('06' , '吳蘭' , '1992-03-01' , '女');
INSERT INTO Student VALUES('07' , '鄭竹' , '1989-07-01' , '女');
INSERT INTO Student VALUES('08' , '王菊' , '1990-01-20' , '女')
/*成績表 SC*/
CREATE TABLE SC(Sid VARCHAR(10), Cid VARCHAR(10), score DECIMAL(18,1));
INSERT INTO SC VALUES('01' , '01' , 80);
INSERT INTO SC VALUES('01' , '02' , 90);
INSERT INTO SC VALUES('01' , '03' , 99);
INSERT INTO SC VALUES('02' , '01' , 70);
INSERT INTO SC VALUES('02' , '02' , 60);
INSERT INTO SC VALUES('02' , '03' , 80);
INSERT INTO SC VALUES('03' , '01' , 80);
INSERT INTO SC VALUES('03' , '02' , 80);
INSERT INTO SC VALUES('03' , '03' , 80);
INSERT INTO SC VALUES('04' , '01' , 50);
INSERT INTO SC VALUES('04' , '02' , 30);
INSERT INTO SC VALUES('04' , '03' , 20);
INSERT INTO SC VALUES('05' , '01' , 76);
INSERT INTO SC VALUES('05' , '02' , 87);
INSERT INTO SC VALUES('06' , '01' , 31);
INSERT INTO SC VALUES('06' , '03' , 34);
INSERT INTO SC VALUES('07' , '02' , 89);
INSERT INTO SC VALUES('07' , '03' , 98)
/*教師表 Teacher*/
CREATE TABLE Teacher(Tid VARCHAR(10),Tname VARCHAR(10));
INSERT INTO Teacher VALUES('01' , '張三');
INSERT INTO Teacher VALUES('02' , '李四');
INSERT INTO Teacher VALUES('03' , '王五')
需求1:查詢” 01 “課程比” 02 “課程成績高的學生的信息及課程分數
SELECT s.*,sc.`score` FROM student s
NATURAL JOIN sc
WHERE s.sid IN
(SELECT t1.sid FROM
(SELECT * FROM sc WHERE cid=01) t1,
(SELECT * FROM sc WHERE cid=02) t2
WHERE t1.sid=t2.sid AND t2.score>t1.score);
/*參考資料:https://www.cnblogs.com/ql70me/p/10329630.html*/
需求2:查詢平均成績大於等於 60 分的同學的學生編號和學生姓名和平均成績
SELECT student.sid,student.sname,a.avg_score FROM student
INNER JOIN(SELECT Sid,AVG(score) avg_score FROM sc
GROUP BY sid
HAVING AVG(score )>=60) a
ON student.sid=a.sid
/*
分析:
先按sid分組查詢出sid和平均成績avg_score得到新表a(注意:必須取別名),
然后將學生表和a表內連接查詢出sid相等的學生即可
*/
需求3:查詢在 SC 表存在成績的學生信息
SELECT * FROM student
WHERE sid IN(SELECT sid FROM sc GROUP BY sid) t;
需求4:查詢所有同學的學生編號、學生姓名、選課總數、所有課程的總成績(沒成績的顯示為 null )
SELECT s.sid,s.sname,a.cid_count FROM student s LEFT OUTER JOIN (SELECT sid ,COUNT(cid) cid_count FROM sc GROUP BY sid) a ON s.`Sid`=a.sid;
需求5:查有成績的學生信息
SELECT * FROM student WHERE sid IN (SELECT sid FROM sc GROUP BY sid);