Inhaltsverzeichnis
Erstellen Sie Tabellen und Einschränkungen
Grundlegende Datenmanipulation (CRUD)
grundlegender Datentyp
Ganzzahl: optionale vorzeichenlose Änderung
intyint 8 Bit (-128 - 127)
smallint 16 Bit (-32768 - 32767)
mediumint 24 Bit (-8388608 - 8388607)
int 32 Bit etwa plus oder minus 2,1 Milliarden
bigint 64 Bit
Reelle Zahlen (mit Dezimalpunkt): Annäherungsrechnungen mit Standard-Gleitkommaarithmetik
Float 4 Bytes
Double 8 Bytes
Dezimal erlaubt bis zu 65 Stellen
Beispiel: decimal(5,2), Beschreibung: 5 Stellen Länge, 2 Dezimalstellen Genauigkeit, wenn der ganzzahlige Teil + 2 Dezimalstellen zu lang ist, wird ein Fehler ausgegeben gemeldet, wenn Nur wenn der Dezimalteil 2 überschreitet, wird auf zwei Dezimalstellen gerundet
Schnur
char : feste Länge: msql weist entsprechend der Länge der definierten Zeichenfolge auf einmal genügend Speicherplatz zu
. Anwendbare Szenarien: kürzere Zeichenfolgen und alle Werte sind nahezu gleich langvarchar Zeichenfolge mit variabler Länge
- Spart Platz im Vergleich zu Typen mit fester Länge
- Aber ROW_FOMAT=FIXED verwendet eine feste Länge für jede Zeile
- Anwendbare Szenarien: Die maximale Länge der Zeichenfolge ist viel größer als die Auswertungslänge, und die Spalte wird weniger aktualisiert
- Nachteile: Bei häufigen Änderungen und großen Längenänderungen der Zeichenkette kann es zu einer Seitenaufteilung kommen
- Geben Sie nicht blind übermäßige Länge an
- Kann in temporären Tabellen oder beim Sortieren auf Speicherprobleme bei der maximalen Längenzuordnung stoßen
Text, Klecks
1. Beide sind zum Speichern großer Daten ausgelegt
. 2. Anders als andere Daten werden sie als unabhängige Objekte gespeichert
. 3. Wenn der Wert zu groß ist, verwenden Sie den externen Speicherbereich zum Speichern, verwenden Sie nur 1-4 Bytes für jede zu speichernde Zeile ein Zeiger
text speichert Zeichendaten : tinytext
smalltext
text
mediumtext
longtext
Blobs speichern binäre Daten : tinyblob
smallblob
blob
mediumblob
longblob
Terminzeit
datetime
Genauigkeit: Sekunden
unabhängig von der Zeitzone, 8 Bytes Speicherbereich
: 1001 bis 9999 Jahretimestamp
speichert die Anzahl der Sekunden seit Mitternacht am 1. Januar 1970,
belegt 4 Bytes Speicherplatz
Bereich: 1970 bis 2038
bezieht sich auf die Zeitzone
Standard ist NOT NULL
Versuchen Sie normalerweise, die Genauigkeit des Zeitstempels zu verwenden
: SekundenDatum
JJJJ-MM-TTZeit
HH:mm:ss
Kennung auswählen
- verwendet, um zu assoziieren
- als Fremdschlüssel in einer anderen Tabelle
- Ganzzahlen sind normalerweise die beste Wahl für Identitätsspalten
- Verwenden Sie denselben Datentyp in verknüpften Tabellen
- Versuchen Sie, Zeichenfolgen als Identitätsspalten zu vermeiden, insbesondere zufällig generierte Zeichenfolgen (z. B.: uuid) führen dazu, dass sowohl Einfügen als auch Auswählen langsam sind
- Eingefügte Werte werden zufällig an verschiedene Positionen des Index geschrieben.Einfügungen sind langsam und führen leicht zu Seitenteilungen und zufälligen Lesevorgängen auf der Festplatte.
- Logisch benachbarte Zeilen werden an verschiedenen Stellen auf der Festplatte und im Speicher verteilt, und die Auswahl ist langsam
- MySQL-Abfrage-Cache ungültig machen
- Wenn Sie uuid speichern müssen, sollten Sie "-" entfernen
(Einfügewerte werden zufällig an verschiedene Positionen im Index geschrieben, das Einfügen ist langsam und es kann leicht zu Seitenaufteilungen kommen, zufällige Lesevorgänge auf der
Festplatte, logisch benachbarte Zeilen werden an verschiedenen Stellen auf der Festplatte und im Speicher verteilt, die langsame Auswahl
führt zu einer mysql-Abfrage im Cache ungültig .
Wenn Sie uuid speichern müssen, sollte "-" entfernt werden)
Datenbankbefehl
Erstellen Sie die Datenbank:
create database 数据库名 create database if not exists 数据库名 default charset utf8 collate utf8_general_ci; //默认的数据库编码集:utf8 //collate表示校验规则为utf8_general_ci //常用排序类型 //utf8_general_cs(区分大小写) //utf8_genera_ci(不区分大小写)
Alle Datenbanken anzeigen:
show databases
Datenbank löschen:
drop database 数据库名
Hinweis: Das Löschen der Datenbank ist ein gefährlicher Vorgang. Wenn Sie sie löschen möchten, wird empfohlen, sie zuerst zu sichern
Erstellen Sie Tabellen und Einschränkungen
Tisch bauen
Befehlsformat: Tabelle Tabellenname erstellen (
Spaltenname 1 Datentyp nicht null,
Spaltenname 2 Datentyp,
Spaltenname 3 Datentyp,
eindeutig (Spaltenname 1 [, Spaltenname 2, ..., Spaltenname N])
)Beispiel:
create table t_student ( sid int not null comment '学号', sname varchar(60) not null comment '姓名', sex tinyint not null default 1 comment '性别:1男, 2女', age tinyint not null comment ' 年龄', icard varchar(18) not null comment '身份证,唯一约束', primary key (sid), unique key AK_Key_2 (icard) ) comment '学生信息表';
Zwang
Primärschlüsseleinschränkung: Primärschlüssel Primärschlüssel
hinzufügen (Tabelle ändern Tabellenname Primärschlüssel hinzufügen (Primärschlüsselname))
Primärschlüssel löschen (Warntabelle Tabellenname Primärschlüssel löschen)
Nicht leere Einschränkung:sid int not null comment'学号',
Einschränkungen für Fremdschlüssel:
create table t_score ( id int not null comment'记录流水号', sid int not null comment'学号', cid int not null comment'课程ID', score float comment'成绩', primary key(id), foreign key(sid) references t_student (sid) on delete restrict on update redtrict , unique key ak_key_2(sid, cid) ); //说明: sid为本表的外键,关联t_student表中的的sid主键,on delete restrict on update redtrict说明在本表有数据的情况下,主表的关联键不能删除或更新。
Primärschlüssel hinzufügen (Warntabelle Tabellenname Fremdschlüssel hinzufügen (Fremdschlüsselname) verweist auf Haupttabellenname (Primärschlüsselname))
Löschen Sie den Primärschlüssel (Warnung Tabelle Tabellenname Drop Foreign Key Constraint Name)
Eindeutige Einschränkung: Name der eindeutigen Schlüsselbeschränkung (Feld)
Eindeutigkeitsbeschränkung erstellen: Alarmtabelle Tabellenname eindeutig hinzufügen (Spaltenname 1[, Spaltenname 2, ..])
Erstellen Sie einen eindeutigen Index UserNameIndex für 't_user' ('Benutzername')
Eindeutigkeitsbeschränkung löschen: Warnungstabelle Tabellenname Löschindex eindeutiger Beschränkungsinbegriffsname
Einschränkung des Standardwerts: default
Grundlegende Datenmanipulation (CRUD)
Datenaufbereitung
create database db_t281
use db_t281
-- 1.学生表-t_student
-- sid 学生编号,sname 学生姓名,sage 学生年龄,ssex 学生性别
create table t_student
(
sid int not null auto_increment comment '学号',
sname varchar(40) not null comment '名称',
birthday date not null comment '年龄',
ssex tinyint not null default 1 comment '1男,2女',
primary key (sid)
);
INSERT INTO t_student VALUES(1, '赵雷' , '1990-01-01' , 1);
INSERT INTO t_student VALUES(2 , '钱电' , '1990-12-21' , 1);
INSERT INTO t_student VALUES(3 , '孙风' , '1990-12-20' , 1);
INSERT INTO t_student VALUES(4 , '李云' , '1990-12-06' , 1);
INSERT INTO t_student VALUES(5 , '周梅' , '1991-12-01' , 2);
INSERT INTO t_student VALUES(6 , '吴兰' , '1992-01-01' , 2);
INSERT INTO t_student VALUES(7 , '郑竹' , '1989-01-01' , 2);
INSERT INTO t_student VALUES(9 , '张三' , '2017-12-20' , 2);
INSERT INTO t_student VALUES(10 , '李四' , '2017-12-25' , 2);
INSERT INTO t_student VALUES(11 , '李四' , '2012-06-06' , 2);
INSERT INTO t_student VALUES(12 , '赵六' , '2013-06-13' , 2);
INSERT INTO t_student VALUES(13 , '孙七' , '2014-06-01' , 2);
-- 2.教师表-t_teacher
-- tid 教师编号,tname 教师名称
CREATE TABLE t_teacher
(
tid INT NOT NULL AUTO_INCREMENT COMMENT '教师ID',
tname VARCHAR(40) NOT NULL COMMENT '教师名称',
PRIMARY KEY (tid)
);
INSERT INTO t_teacher VALUES(1 , '张五哥');
INSERT INTO t_teacher VALUES(2 , '李卫');
INSERT INTO t_teacher VALUES(3 , '年羹尧');
-- 3.课程表-t_course
-- cid 课程编号,cname 课程名称,tid 教师名称
CREATE TABLE t_course
(
cid INT NOT NULL COMMENT '课程ID',
cname VARCHAR(50) COMMENT '课程名称',
tid INT COMMENT '教师id',
PRIMARY KEY (cid)
);
INSERT INTO t_course VALUES(1 , '语文' , 2);
INSERT INTO t_course VALUES(2 , '数学' , 1);
INSERT INTO t_course VALUES(3 , '英语' , 3);
-- 4.成绩表-t_score
-- sid 学生编号,cid 课程编号,score 成绩
CREATE TABLE t_score
(
sid INT NOT NULL COMMENT '学号,外键',
cid INT NOT NULL COMMENT '课程id',
score decimal(5,2) COMMENT '成绩',
UNIQUE KEY ak_key_sid_cid (sid, cid)
);
INSERT INTO t_score VALUES(1 , 1 , 80);
INSERT INTO t_score VALUES(1 , 2 , 90);
INSERT INTO t_score VALUES(1 , 3 , 99);
INSERT INTO t_score VALUES(2 , 1 , 70);
INSERT INTO t_score VALUES(2 , 2 , 60);
INSERT INTO t_score VALUES(2 , 3 , 80);
INSERT INTO t_score VALUES(3 , 1 , 80);
INSERT INTO t_score VALUES(3 , 2 , 80);
INSERT INTO t_score VALUES(3 , 3 , 80);
INSERT INTO t_score VALUES(4 , 1 , 50);
INSERT INTO t_score VALUES(4 , 2 , 30);
INSERT INTO t_score VALUES(4 , 3 , 20);
INSERT INTO t_score VALUES(5 , 1 , 76);
INSERT INTO t_score VALUES(5 , 2 , 87);
INSERT INTO t_score VALUES(6 , 1 , 31);
INSERT INTO t_score VALUES(6 , 3 , 34);
INSERT INTO t_score VALUES(7 , 2 , 89);
INSERT INTO t_score VALUES(7 , 3 , 98);
select * from t_student;
select * from t_teacher;
select * from t_course;
select * from t_score;
Die Datentabelle ist wie folgt:
t_student Schülertisch t_teacher Lehrertisch
t_course Lehrplan t_score Punktetabelle
1) Informationen und Kursnoten von Studenten abfragen, deren Noten im Kurs „1“ besser sind als die im Kurs „2“.
SELECT stu.sid,stu.sname,stu.ssex,c1.cid, c1.score, c2.cid, c2.score FROM t_student stu INNER JOIN (SELECT t1.sid, t1.cid, t1.score FROM t_score t1 WHERE t1.cid = 1 ) c1 ON stu.sid = c1.sid INNER JOIN (SELECT t2.sid, t2.cid, t2.score FROM t_score t2 WHERE t2.cid = 2) c2 ON stu.sid = c2.sid WHERE c1.score > c2.score
2) Fragen Sie die Informationen von Studenten ab, die sowohl "1"-Kurse als auch "2"-Kurse belegen
//方法一 SELECT stu.sid,stu.sname,stu.ssex,c1.cid, c1.score, c2.cid, c2.score FROM t_student stu INNER JOIN (SELECT t1.sid, t1.cid, t1.score FROM t_score t1 WHERE t1.cid = 1 ) c1 ON stu.sid = c1.sid INNER JOIN (SELECT t2.sid, t2.cid, t2.score FROM t_score t2 WHERE t2.cid = 2) c2 ON stu.sid = c2.sid //方法二 SELECT stu.`sid`,stu.`sname`, stu.`ssex`, tmp.c1num, tmp.c2num FROM t_student stu INNER JOIN ( SELECT t.`sid`, SUM(CASE WHEN t.cid = 1 THEN t.`score` ELSE 0 END) c1num, SUM(CASE WHEN t.cid = 2 THEN t.`score` ELSE 0 END) c2num FROM t_score t GROUP BY t.`sid` ) tmp ON stu.sid = tmp.sid AND tmp.c1num > 0 AND tmp.c2num > 0;
3) Erkundigen Sie sich nach Wahlfächern „1“, aber nicht nach Wahlfächern „2“.
SELECT stu.* FROM t_student stu WHERE stu.sid IN(SELECT t1.sid FROM t_score t1 WHERE t1.cid = 1) AND stu.sid NOT IN (SELECT t1.sid FROM t_score t1 WHERE t1.cid = 2) SELECT stu.`sid`,stu.`sname`, stu.`ssex`, tmp.c1num, tmp.c2num FROM t_student stu INNER JOIN ( SELECT t.`sid`, SUM(CASE WHEN t.cid = 1 THEN t.`score` ELSE 0 END) c1num, SUM(CASE WHEN t.cid = 2 THEN t.`score` ELSE 0 END) c2num FROM t_score t GROUP BY t.`sid` ) tmp ON stu.sid = tmp.sid AND tmp.c1num > 0 AND tmp.c2num = 0;
4) Frage den Fall ab, wo "1"-Kurs nicht existiert, aber "2"-Kurs existiert
SELECT t1.sid,t1.cid,t1.score FROM t_score t1 WHERE t1.cid = 2 AND t1.sid NOT IN (SELECT t2.sid FROM t_score t2 WHERE t2.cid = 1);
Abfrage der höchsten Punktzahl, niedrigsten Punktzahl und durchschnittlichen Punktzahl jedes Fachs:
1) Anzeigespalte: Kurs-ID, Name des Kurses, höchste Punktzahl, niedrigste Punktzahl, durchschnittliche Punktzahl, Anzahl der Wahlfächer, Bestehensquote, durchschnittliche Bewertung, ausgezeichnete Bewertung
2) Die ausgezeichnete Rate ist >=60, mittel: 70-80, ausgezeichnet: 80-90, ausgezeichnet: >=90
3) Die Abfrageergebnisse müssen absteigend nach Personenzahl sortiert sein.SELECT t2.cid '课程ID', t2.cname '课程名称', MAX(t1.score) '最高分', MIN(t1.score) '最低分', ROUND(AVG(t1.score), 2) '平均分', COUNT(t1.sid) '选修人数', ROUND(SUM(CASE WHEN t1.score >= 60 THEN 1 ELSE 0 END) / COUNT(t1.sid), 2) '及格率', ROUND(SUM(CASE WHEN t1.score >=70 AND t1.score < 80 THEN 1 ELSE 0 END)/COUNT(t1.sid),2) '中等率', ROUND(SUM(CASE WHEN t1.score >=80 AND t1.score < 90 THEN 1 ELSE 0 END)/COUNT(t1.sid),2) '优良率', ROUND(SUM(CASE WHEN t1.score >= 90 THEN 1 ELSE 0 END)/COUNT(t1.sid), 2) '优秀率' FROM t_score t1 INNER JOIN t_course t2 ON t1.cid = t2.cid GROUP BY t2.cid, t2.cname ORDER BY COUNT(t1.sid) DESC, t2.cid ASC;