Grundlegende MySQL-Datentypen und CRUD

Inhaltsverzeichnis

grundlegender Datentyp

Datenbankbefehl

Erstellen Sie Tabellen und Einschränkungen

Tisch bauen

Zwang

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 lang

varchar 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 Jahre

timestamp
    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
    : Sekunden

Datum
    JJJJ-MM-TT

Zeit
    HH:mm:ss

Kennung auswählen

  1. verwendet, um zu assoziieren
  2. als Fremdschlüssel in einer anderen Tabelle
  3. Ganzzahlen sind normalerweise die beste Wahl für Identitätsspalten
  4. Verwenden Sie denselben Datentyp in verknüpften Tabellen
  5. 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
  6.     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.
  7.     Logisch benachbarte Zeilen werden an verschiedenen Stellen auf der Festplatte und im Speicher verteilt, und die Auswahl ist langsam
  8.     MySQL-Abfrage-Cache ungültig machen
  9.     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;

Ich denke du magst

Origin blog.csdn.net/qq_64001795/article/details/125939431
Empfohlen
Rangfolge