SQL-grundlegende Anweisungsübungen

Der Hauptzweck besteht darin, eine vorläufige Zusammenfassung einiger häufig vorkommender SQL-Anweisungen zu erstellen. Sie können den Grad des SQL-Lernens überprüfen und die SQL-Anweisung weiter konsolidieren und stärken.

Bereit zu arbeiten

  • Zunächst müssen Sie vier Tabellen erstellen: Schüler (Schülertabelle), Lehrer (Lehrertabelle), Punktzahl (Punktetabelle), Kurs (Kurstabelle)
  • Tabellenerstellung SQL und anfängliche Datenvoreinstellung
  • Schüler:
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for student
-- ----------------------------
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student`  (
  `stuNo` int(10) NOT NULL,
  `stuName` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
  `stuSex` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
  `stuAge` int(255) DEFAULT NULL,
  PRIMARY KEY (`stuNo`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of student
-- ----------------------------
INSERT INTO `student` VALUES (1, '张一', '男', 15);
INSERT INTO `student` VALUES (2, '张二', '女', 35);
INSERT INTO `student` VALUES (3, '张三', '女', 27);
INSERT INTO `student` VALUES (4, '张四', '男', 15);

SET FOREIGN_KEY_CHECKS = 1;
  • Lehrer:
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for teacher
-- ----------------------------
DROP TABLE IF EXISTS `teacher`;
CREATE TABLE `teacher`  (
  `teaNo` int(11) NOT NULL,
  `teaName` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
  PRIMARY KEY (`teaNo`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of teacher
-- ----------------------------
INSERT INTO `teacher` VALUES (1, '孙一');
INSERT INTO `teacher` VALUES (2, '孙二');

SET FOREIGN_KEY_CHECKS = 1;
  • Ergebnis:
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for score
-- ----------------------------
DROP TABLE IF EXISTS `score`;
CREATE TABLE `score`  (
  `id` int(11) NOT NULL,
  `stuNo` int(11) DEFAULT NULL,
  `cNo` int(11) DEFAULT NULL,
  `score` int(255) DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of score
-- ----------------------------
INSERT INTO `score` VALUES (1, 1, 1, 60);
INSERT INTO `score` VALUES (2, 1, 2, 25);
INSERT INTO `score` VALUES (3, 1, 3, 56);
INSERT INTO `score` VALUES (4, 1, 4, 100);
INSERT INTO `score` VALUES (5, 1, 5, 63);
INSERT INTO `score` VALUES (6, 2, 1, 5);
INSERT INTO `score` VALUES (7, 2, 2, 29);
INSERT INTO `score` VALUES (8, 2, 3, 59);
INSERT INTO `score` VALUES (9, 2, 4, 60);
INSERT INTO `score` VALUES (10, 2, 5, 65);
INSERT INTO `score` VALUES (11, 3, 1, 60);
INSERT INTO `score` VALUES (12, 3, 2, 100);
INSERT INTO `score` VALUES (13, 3, 3, 88);
INSERT INTO `score` VALUES (14, 3, 4, 75);
INSERT INTO `score` VALUES (15, 3, 5, 65);
INSERT INTO `score` VALUES (16, 4, 1, 60);
INSERT INTO `score` VALUES (17, 4, 2, 57);
INSERT INTO `score` VALUES (18, 4, 3, 86);
INSERT INTO `score` VALUES (19, 4, 4, 73);
INSERT INTO `score` VALUES (20, 4, 5, 62);

SET FOREIGN_KEY_CHECKS = 1;
  • Kurs:
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for course
-- ----------------------------
DROP TABLE IF EXISTS `course`;
CREATE TABLE `course`  (
  `cNo` int(11) NOT NULL,
  `cName` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
  `cTeacher` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
  PRIMARY KEY (`cNo`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of course
-- ----------------------------
INSERT INTO `course` VALUES (1, '数学', '1');
INSERT INTO `course` VALUES (2, '语文', '1');
INSERT INTO `course` VALUES (3, '英语', '2');
INSERT INTO `course` VALUES (4, '美术', '2');
INSERT INTO `course` VALUES (5, '音乐', '2');

SET FOREIGN_KEY_CHECKS = 1;

Tabellenbeschreibung

Die Attribute der vier oben erstellten Tabellen werden erläutert.

  • Schülertabelle: Die vier Hauptattribute StuNo (Primärschlüssel) Schülernummer des Schülers, Name des Schülers stuName, Geschlecht des Schülers stuSex, Alter des Schülers stuAge
    Bild
  • Lehrer Lehrertabelle: hauptsächlich zwei Attribute: teaNo (Primärschlüssel) die Jobnummer des Lehrers, teaName der Name des Lehrers
    Bild
  • Bewertungstabelle: Es gibt hauptsächlich vier Attribute: ID (Primärschlüssel), stuNo (mit der Schülertabelle verknüpft), Schülernummer, cNo (mit dem Lehrplan verknüpft) Kursnummer, Bewertungsbewertung
    Bild
  • Kurskurstabelle: cNo (Primärschlüssel) Kursnummer, cName Kursname, cTeacher (mit Lehrertabelle verknüpft) Lehrerjobnummer
    Bild

Klassische SQL-Anweisungsübungen

Es wird empfohlen, dass Sie zuerst versuchen, es selbst zu lösen, und dann die Analyse und den spezifischen Code betrachten, wenn Sie auf Schwierigkeiten stoßen. Wenn Sie bessere Ideen oder unterschiedliche Meinungen haben, können Sie diese gerne im Kommentarbereich diskutieren.

  • Fragen Sie den Studentenausweis aller Studenten ab, deren Noten im Kurs "1" höher sind als die im Kurs "2"
select a.stuNo from score a,score b where a.cNo='1'and b.cNo='2' and  a.stuNo=b.stuNo and a.score>b.score;

Dies ist relativ einfach. Es liest hauptsächlich Daten aus zwei Tabellen und durchsucht dieselbe Schülernummer.

  • Fragen Sie den Studentenausweis und die durchschnittliche Punktzahl der Studenten mit einer durchschnittlichen Punktzahl von mehr als 60 Punkten ab
select stuNo,AVG(score) from score group by stuNo  having avg(score)>60  ;

Verwenden Sie zuerst die AVG-Funktion, um den Durchschnitt zu ermitteln, und verwenden Sie dann Gruppe für Gruppe

  • Fragen Sie den Studentenausweis, den Namen, die Anzahl der Kurse und die Gesamtpunktzahl aller Studenten ab
select a.stuNo,a.stuName,count(cNo),sum(score) from student a,score b  where a.stuNo=b.stuNo  group by a.stuNo,a.stuName  ;

Verwenden Sie ähnlich wie oben hauptsächlich count, um zu zählen, und summen Sie für die Summe

  • Fragen Sie die Anzahl der Lehrer mit dem Nachnamen "Sun" ab.
SELECT count(teaName) ,'孙'as 'Name'from teacher WHERE teaName like '孙%'

Verwenden Sie hauptsächlich ähnliche Abfragen und% zur Anpassung und zur Anzeige

  • Fragen Sie den Studentenausweis und den Namen der Studenten ab, die die Klasse "Sun Yi" nicht studiert haben.
select stuName from student where stuNo not in (select stuNo from score where cNo in(select a.cNo from course a,teacher b where b.teaNo=a.cTeacher and b.teaName ='孙一'))

Es ist hauptsächlich in drei Schritte unterteilt: Fragen Sie zuerst ab, welche Lektionen Sun Yi unterrichtet, und fragen Sie dann ab, welche Schüler an diesen Kursen teilgenommen haben, und verwenden Sie dann nicht, um die Schüler abzufragen, die nicht in ihnen enthalten sind.

  • Fragen Sie den Studentenausweis und den Namen aller Studenten ab, deren Noten der Kursnummer "2" niedriger sind als die der Kursnummer "1".
方法一:
SELECT a.stuNo,a.stuName from student a,score b ,score c WHERE a.stuNo=b.stuNo and a.stuNo=c.stuNo and b.cNo='2'and c.cNo='1'and b.score <  c.score;
方法二:
select stuNo,stuName from student  where stuNo in   (select a.stuNo from score a,score b  where a.cNo='1' and b.cNo='2' and a.stuNo=b.stuNo and a.score>b.score)

Die erste Methode ähnelt der ersten. Es geht nur darum, die Ergebnisse zu vergleichen

Die zweite Methode besteht darin, den Wortlaut zu ändern, um zu funktionieren

  • Fragen Sie den Studentenausweis und den Namen der Studenten ab, die nicht alle Kurse studiert haben
SELECT  a.stuNO,a.stuName FROM student a, score b WHERE a.stuNo=b.stuNo  group by b.stuNo having count(b.cNo)<(select count(cNo) from course)

Es wird die Gesamtzahl der von den Studenten ausgewählten Kurse mit der Gesamtzahl der Kurse verglichen.

  • Fragen Sie den Studentenausweis und den Namen mindestens eines Kurses ab, der mit dem Studenten identisch ist, dessen Studentenausweis "1" ist.
select distinct a.stuNo,stuName from student a,score b  where a.stuNo=b.stuNo and cNo in (select cNo from score where stuNo='1')

Finden Sie zuerst die vom Studenten ausgewählten Kurse mit dem Studenten Nummer eins heraus und suchen Sie dann

  • Fragen Sie die höchsten und niedrigsten Punktzahlen jedes Fachs ab: Anzeige im folgenden Format: Kurs-ID, höchste Punktzahl, niedrigste Punktzahl
select  cNo,max(score) as 最高分,min(score) as 最低分 from score  group by cNo
  • Löschen Sie die "1" -Kursnoten des Klassenkameraden "2"
delete from score where stuNo='2' and cNo='1'
  • Fragen Sie die Informationen anderer Schüler ab, die dieselben Kurse wie die Schüler mit "01" lernen.
SELECT * from student WHERE stuNo in (SELECT  stuNo FROM score WHERE cNo in(SELECT distinct cNo FROM score WHERE stuNo='01')and stuNo<>'01'GROUP BY stuNo having count(cNo)>=4);
  • Fragen Sie den Studentenausweis, den Namen und die Durchschnittsnote der Studenten ab, die zwei oder mehr Kurse nicht bestanden haben
select a.stuNo,a.stuName,b.平均成绩 FROM student a right join (select stuNo,AVG(score)平均成绩 from score where score<60 group by stuNo having COUNT(score)>=2)b on a.stuNo=b.stuNo;
  • Fragen Sie die höchste Punktzahl, die niedrigste Punktzahl und die durchschnittliche Punktzahl jedes Fachs ab: Anzeige in der folgenden Form: Kurs-ID, Kursname, höchste Punktzahl, niedrigste Punktzahl, durchschnittliche Punktzahl, Erfolgsquote, mittlere Quote, hervorragende Quote, exzellente Quote> = 60 , Mittel: 70-80, Ausgezeichnet: 80-90, Ausgezeichnet:> = 90
select distinct A.cNo,cName,最高分,最低分,平均分,及格率,中等率,优良率,优秀率 from score A
left join Course on A.cNo=course.cNo
left join (select cNo,MAX(score)最高分,MIN(score)最低分,AVG(score)平均分 from score group by cNo)B on A.cNo=B.cNo
left join (select cNo,(((sum(case when score>=60 then 1 else 0 end)*1.00)/COUNT(*))*100)及格率 from score group by cNo)C on A.cNo=C.cNo
left join (select cNo,(((sum(case when score >=70 and score<80 then 1 else 0 end)*1.00)/COUNT(*))*100)中等率 from score group by cNo)D on A.cNo=D.cNo
left join (select cNo,(((sum(case when score >=80 and score<90 then 1 else 0 end)*1.00)/COUNT(*))*100)优良率 from score group by cNo)E on A.cNo=E.cNo
left join (select cNo,(((sum(case when score >=90 then 1 else 0 end)*1.00)/COUNT(*))*100)优秀率 
from score group by cNo)F on A.cNo=F.cNo
  • Sortieren Sie nach den Bewertungen der einzelnen Themen und zeigen Sie die Rangfolge an. Wenn die Bewertung wiederholt wird, wird die freie Stelle reserviert (nicht reserviert).
保留
select *,RANK()over(order by score desc)排名 from score;
不保留
select *,DENSE_RANK()over(order by score desc)排名 from score
  • Fragen Sie die Gesamtpunktzahl des Schülers ab und bewerten Sie sie. Wenn die Gesamtpunktzahl wiederholt wird, bleibt die Rangliste frei
select *,RANK()over(order by 总成绩 desc)排名 from(
select stuNo,SUM(score)总成绩 from score group by stuNo)A
  • Fragen Sie die drei wichtigsten Datensätze jedes Betreffs ab
select * from(select *,rank()over (partition by stuNo order by score desc)A from score)B where B.A<=3
select * from score a where (select COUNT(*) from score where cNo=a.cNo and score>a.score)<3 order by a.cNo,a.score desc

So verbessern Sie die Effizienz der SQL-Suche

  • Vermeiden Sie die Verwendung von * in der select-Klausel

    • Darüber hinaus wird select * für Verbindungen mit mehreren Tabellen verwendet, was zu einem höheren Kostenaufwand führt
  • Die where-Klausel vergleicht die linke Seite des Symbols, um die Funktion zu vermeiden, und verschiebt sie nach rechts

  • Vermeiden Sie die Verwendung von in und nicht von

  • Vermeiden Sie stattdessen die Verwendung von oder und verwenden Sie union

  • Nutzen Sie die Limit-Klausel, um die Anzahl der zurückgegebenen Datenzeilen zu begrenzen

Wenn Sie interessiert sind, werden im Follow-up mehrere Artikel für SQL optimiert.

Zu guter Letzt

  • Wenn Sie das Gefühl haben, nach dem Lesen belohnt zu werden, hoffe ich, mir einen Daumen hoch zu geben. Dies ist die größte Motivation für mich, ein Update durchzuführen. Vielen Dank für Ihre Unterstützung.
  • Begrüßen Sie alle, um auf mein öffentliches Konto [Java Fox] zu achten, das sich auf die Grundkenntnisse von Java und Computer konzentriert. Ich verspreche, dass Sie nach dem Lesen etwas bekommen, wenn Sie mir nicht glauben, schlagen Sie mich
  • Wenn Sie nach dem Lesen andere Meinungen oder Vorschläge haben, kommentieren Sie diese bitte und teilen Sie sie uns mit. Vielen Dank für Ihre Unterstützung und Liebe.

Bild

Ich denke du magst

Origin blog.csdn.net/issunmingzhi/article/details/110918192
Empfohlen
Rangfolge