Grundlegende Konzepte und Operationen von MySQL

MySQL

Hinweis: In diesem Artikel werden die Notizen von Java Crazy God angezeigt. Interessierte können auf die URL klicken:
https://www.bilibili.com/video/BV1NJ411J79W?from=search&seid=1914316698934444374&spm_id_from=333.337.0.0

Was ist eine Datenbank?

Abkürzung: DB (DataBase)

Konzept: Data Warehouse, Software, auf dem Betriebssystem (Windows, Linux, Mac) installiert, hauptsächlich SQL lernend, das eine große Datenmenge speichern kann.

Rolle: Daten speichern, Daten verwalten

Wo die Datenbank im physischen Raum vorhanden ist

Alle Datenbankdateien werden im Datenverzeichnis gespeichert und ein Ordner entspricht einer Datenbank

Im Wesentlichen handelt es sich immer noch um einen Dateispeicher

Klassifizierung der Datenbank

Relationale Datenbank: (SQL)

  • MySQL, Oracle, SQL, DB2, SQLlite
  • Daten werden durch die Beziehung zwischen Tabellen und Tabellen, Zeilen und Spalten gespeichert.

Nicht relationale Datenbank: (NoSQL ----- nicht nur SQL)

  • Redis、MongDB
  • Durch Objektspeicherung, bestimmt durch die eigenen Attribute des Objekts

DBMS (Datenbankverwaltungssystem)

  • Datenbankverwaltungssoftware, wissenschaftliche und effektive Verwaltung, Wartung und Datenerfassung

MySQL

  • Relationales Datenbank Management System,
  • Eine der besten RDBMS-Anwendungssoftware
  • Open-Source-Datenbanksoftware
  • Kleine Größe, hohe Geschwindigkeit, niedrige Kosten

MySQL wird über das cmd-Fenster gestartet und heruntergefahren

Schließung:

​ net stop mysql (das ist Ihr Dienstname)

anmachen

​ net start mysql (wie oben)

Abfrage des Dienstnamens:

  1. Klicken Sie mit der rechten Maustaste auf diesen Computer
  2. verwalten
  3. Dienste und Anwendungen
  4. Aufschlag
  5. Finden Sie MySQL (oder ein anderes, normalerweise MySQL+...)

Stellen Sie eine Verbindung zur Datenbank her

mysql -u root -p(密码)		————cmd连接数据库
    
update mysql.user set authentication_string=password('密码') where user='root' and Host = 'localhost';
																		————修改用户密码
————————————————————————————————————————————————
	1. 在cmd中,使用数据库的所有语句必须使用";"结尾
    2. show databases;		————查看所有数据库
    3. 输入: user school	  ————切换数据库 user 数据库名
       下一行跳出: Database changed
    4. show tables;			————查看数据库所有表
    5. describe *****(表的名字)————显示数据库中表的所有信息
    6. cerate database ****(数据库的名字)————创建一个数据库
    7. exit;				————退出连接
    8. "--"	单行注释
    9. "/**/" 多行注释    

Betreiben Sie die Datenbank

**MySQL-Schlüsselwörter unterscheiden nicht zwischen Groß- und Kleinschreibung**

Datenbank erstellen

CREATE DATABASE [IF NOT EXISTS] ***(库名)
[]内的是可选的

Datenbank löschen

DROP DATABASE [IF EXISTS] ****(库名)

Datenbank verwenden

-- "`",tab键的上面,如果表明或者字段名是一个特殊字符,需要带"`"
USER `***(库名)`

Datenbank ansehen

SHOW DATABASES 		查看所有的数据库

Spaltentypen in der Datenbank

Wert:

  • tinyint ——— sehr kleine Daten, die ein Byte belegen
  • smallint ———— Kleinere Daten, die 2 Bytes belegen
  • mediumint ——— mittelgroße Daten, die 3 Bytes belegen
  • int ——— Standard-Ganzzahl, 4 Bytes
  • big ———— Größere Daten, die 8 Bytes belegen
  • float ——— Gleitkommazahl, belegt 4 Bytes
  • double ——— Gleitkommazahl, belegt 8 Bytes
  • Dezimalzahl ———— Gleitkommazahl in Form einer Zeichenfolge, die häufig in Finanzberechnungen verwendet wird

Zeichenfolge:

  • char ——— String mit fester Größe (0-255)
  • varchar ——— variable Zeichenfolge (0-65535), häufig verwendete variable Zeichenfolge
  • tinytext ----- winziger Text, 2^8-1
  • text ——— Textzeichenfolge, 2^16-1 , großen Text speichern

Datum (und Uhrzeit:

  • Datum ————JJJJ-MM–TT, Datumsformat
  • Zeit ——— HH:mm:ss, Zeitformat
  • Datum ————JJJJ-MM-TT-HH:mm:ss, das am häufigsten verwendete Zeitformat
  • Zeitstempel ——— Zeitstempel, die Anzahl der Millisekunden von 1970.1.1 bis heute! (weltweit vereinheitlicht), häufiger verwendet
  • Jahr - Jahr

Null:

  • kein Wert, unbekannt
  • ==Achtung, nicht NULL zur Berechnung verwenden, sonst muss das Ergebnis NULL sein

Eigenschaften von Datenbankfeldern

Abmelden

  • unsigniertes Zertifikat
  • Erklären Sie, dass die Spalte nicht als negativ deklariert werden kann

Nullfüllung

  • 0 füllen
  • Unzureichende Ziffern werden mit 0, int(3[hier gibt die Länge an]), 5——>005 aufgefüllt

Selbsterhöhung

  • Wird normalerweise als Selbstinkrement verstanden und fügt automatisch 1 basierend auf dem vorherigen Datensatz hinzu (Standard).
  • Wird normalerweise zum Entwerfen eines eindeutigen Primärschlüsselindex verwendet, der ein ganzzahliger Typ sein muss
  • Sie können den Startwert und die Schrittgröße mithilfe der automatischen Inkrementierung des Primärschlüssels anpassen

Nicht leer (NUll nicht null)

  • Angenommen, es ist auf nicht null gesetzt. Wenn ihm kein Wert zugewiesen wird, wird ein Fehler gemeldet
  • NULL, wenn nicht gefüllt, ist der Standardwert null

Standard

  • Standard festlegen
  • Beispiel: Geschlecht, der Standardwert ist männlich. Wenn Sie den Wert dieser Spalte nicht angeben, wird ein Standardwert angezeigt

Jede Tabelle muss die folgenden 5 Felder (Elemente) enthalten.

  1. id-----Primärschlüssel
  2. " version" -------- Optimistische Sperre
  3. is_delect-------pseudo-delete
  4. gmt_create------Erstellungszeit
  5. gmt_update------Änderungszeit

Erstellen Sie eine Datenbanktabelle

Tabellenname: Student

Schülernummer: int, Name: varchar, Geschlecht, Geschlecht, Geburtsdatum, Geburtstag

CREATE TABLE IF NOT EXISTS `student` (
`ID` INT(15) NOT NULL AUTO_INCREMENT COMMENT '学号',
`NAME` VARCHAR(30) NOT NULL DEFAULT '匿名' COMMENT '姓名',
`sex` VARCHAR(2) NOT NULL DEFAULT '女' COMMENT '性别',
`birthday` DATETIME DEFAULT NULL COMMENT '出生日期', 
PRIMARY KEY(`ID`)
)ENGINE`student`=INNODB DEFAULT CHARSET=utf8

Format:

格式:
CREATE TABLE [IF NOT EXISTS] `表名`(
`字段名` 列类型 [属性] [索引] [注释],
`字段名` 列类型 [属性] [索引] [注释],
    ······
`字段名` 列类型 [属性] [索引] [注释]
)[表类型] [字符集设置][注释]

Allgemeine Befehle

SHOW CREATE DATABASE ****(数据库名称)-- 查看创建数据库的语句
SHOW CREATE TABLE ****(表名) --查看student数据表的定义语句
DESC ****(表名) -- 显示表的结构

Über den Typ der Datenbanktabelle

Über die Engine der Datenbank

INNODB

  • standardmäßig verwenden
  • Platz sparen
  • Schneller

MYISAM (in früheren Jahren verwendet)

  • in früheren Jahren verwendet
  • hohe Sicherheit
  • Transaktionsverarbeitung, Mehrtabellen-Mehrbenutzerbetrieb
MYISAM INNODB
Transaktionsunterstützung nicht unterstützt Unterstützung
Datenzeilensperre Nicht unterstützt (Tabellensperre) Unterstützung
Unbekannter Schlüssel nicht unterstützt Unterstützung
Volltextindex Unterstützung nicht unterstützt
Tabellenbereichsgröße kleiner Größer, etwa doppelt so groß wie MYISAM

Der Unterschied zwischen der MYSQL-Engine und der physischen Datei

  • INNODB hat nur eine *.frm in der Datenbanktabelle und die ibdata-Datei im Verzeichnis der oberen Ebene.
  • MYISAM entsprechende Datei
    • *.frm – Tabellenstruktur-Definitionsdatei
    • *.MYD-Datendatei (Daten)
    • *.MYL-Indexdatei (Index)

Legen Sie die Zeichensatzkodierung der Datenbanktabelle fest

CHARSET=UTF8
  • Wenn nicht festgelegt, handelt es sich um die Standardzeichensatzkodierung von MySQL – (Chinesisch wird nicht unterstützt)
  • Die Standardcodierung von MySQL ist Latin1, die kein Chinesisch unterstützt
  • Konfigurieren Sie die Standardkodierung in my.ini

Zeichen -set-server= utf8

Tabelle ändern, löschen

Überarbeiten

  • Tabellennamen ändern
ALTER TABLE 旧表名 RENAME AS 新表名
  • Tabellenfelder hinzufügen
ALTER TABLE 表名 ADD 字段名 列属性
  • Tabellenfelder ändern (umbenennen, Einschränkungen ändern!)
ALTER TABLE *****(表名) MODIFY **(字段名) **(列属性) ---修改约束
ALTER TABLE *****(表名) CHANGE ***(旧名字) ***(新名字) ***(列属性)  --字段重命名

Fazit:

  • CHANGE wird zum Umbenennen von Feldern verwendet, Feldtypen und Einschränkungen können nicht geändert werden

  • MODIFY kann nicht für Felder verwendet werden, nur Feldtypen und Einschränkungen können geändert werden

  • Tabellenfelder löschen
ALTER TABLE ***(表名) DROP ***(列属性)
  • Tabelle löschen
DROP TABLE IF EXISTS ****(表名)
创建和删除操作尽量加上判断,以免报错

wichtiger Punkt

  • „Feldname, zum Umbrechen verwenden.“
  • Kommentare: „ - “, /**/
  • SQL-Groß- und Kleinschreibung wird nicht beachtet
  • Alle Symbole sind auf Englisch

MySQL-Datenverwaltung

Fremdschlüssel (Physische Fremdschlüssel – Datenbankebene)

Methode eins

Beim Erstellen von Tabellen Einschränkungen hinzufügen (mühsam, kompliziert)

CREATE TABLE `grade`(
`gradeid` INT(10) NOT NULL AUTO_INCREMENT COMMENT '年级id',
`gradename` VARCHAR(50) NOT NULL COMMENT '年级名称',
PRIMARY KEY(`gradeid`)
)ENGINE=INNODB DEFAULT CHARSET=utf8


CREATE TABLE `student`(
`ID` INT(15) NOT NULL AUTO_INCREMENT COMMENT '学号',
`NAME` VARCHAR(30) NOT NULL DEFAULT '匿名' COMMENT '姓名',
`SEX` VARCHAR(2) NOT NULL DEFAULT '女' COMMENT '性别',
`BIRTHDAY` DATETIME DEFAULT NULL COMMENT '出生日期', 
`gradeid` INT(10) NOT NULL COMMENT '学生的年级',
PRIMARY KEY(`ID`),
KEY `FK_gradeid` (`gradeid`),
CONSTRAINT `FK_gradeid` FOREIGN KEY (`gradeid`) REFERENCES `grade`(`gradeid`) 
)ENGINE=INNODB DEFAULT CHARSET=utf8

Wenn Sie eine Tabelle mit einer Fremdschlüsselbeziehung löschen, müssen Sie zuerst die Tabelle löschen, die auf andere verweist (Slave-Tabelle), und dann die referenzierte Tabelle (Primärtabelle) löschen.

Weg zwei

Fügen Sie nach erfolgreicher Erstellung der Tabelle Fremdschlüsseleinschränkungen hinzu

创建表是没有外键,后续添加外键关系公式:
ALTER TABLEADD CONSTRAINT 约束名 FOREIGN KEY(作为外键的列) REFERENCES `哪一个表名`(`哪个字段`)

Empfohlene Vorgehensweise:

  • Eine Datenbank ist eine einfache Tabelle, die nur zum Speichern von Daten verwendet wird, also nur Zeilen (Daten) und Spalten (Daten).
  • Möchten Sie die Daten mehrerer Tabellen verwenden, möchten Sie Fremdschlüssel verwenden (durch das Programm erreichen)

DML-Sprache

ergänzen

Definition: Datenmanipulationssprache

-- 插入语句语法:
INSERT INTO 表名([字段名1,字段2,字段3])VALUES('值1'),('值2'),('值3')

Vorsichtsmaßnahmen:

  • Felder werden durch Kommas getrennt
  • Felder können weggelassen werden, die folgenden Werte müssen jedoch eins zu eins übereinstimmen
  • Es können mehrere Daten gleichzeitig eingefügt werden. Die Werte nach VALUES müssen in englische Klammern eingeschlossen werden und die Klammern müssen durch englische Kommas S getrennt werden

Überarbeiten

Wen ändert das Update? (Bedingung) alten Wert setzen = neuen Wert

-- 语法:
UPDATE `表名` SET COLNUM_NAME = VALUE,[COLNUM_NAME=VALUE....] WHERE [条件]

Bedingung: Where-Klausel-Operator, zum Beispiel: ID ist gleich einem bestimmten Wert, größer als ein bestimmter Wert, innerhalb eines bestimmten Bereichs geändert ...

Der Operator gibt einen booleschen Wert zurück

Operator Bedeutung Umfang Ergebnis
= gleich 5=6 FALSCH
<> oder != Nicht gleichzusetzen mit 5<>3 WAHR
> mehr als die 5>3 WAHR
< weniger als 5<3 FALSCH
<= Gleich oder kleiner als 2<=3 WAHR
>= größer oder gleich 3>=2 WAHR
ZWISCHEN UND innerhalb eines bestimmten Bereichs [2,5]
UND && (ich und Du) 5>1und1>2 FALSCH
ODER ||(ich oder du) 5>1 oder 1>2 WAHR

Vorsichtsmaßnahmen:

  • colnum_name ist die Spalte der Datenbank, versuchen Sie, `` zu bringen
  • Bedingung, Filterbedingung: Wenn nicht angegeben, werden alle Spalten geändert
  • Wert ist ein spezifischer Wert, er kann auch eine Variable sein
  • Trennen Sie die Attribute mehrerer Einstellungen durch Kommas

löschen

DELETE-Befehl

Grammatik:

DELETE FROM ***(Tabellenname) [WHERE-Bedingung]

TRUNCATE-Befehl

Grammatik:

TRUNCATE ***(Tabellenname)

Wirkung:

Wenn Sie eine Datenbanktabelle vollständig löschen, bleiben die Struktur- und Indexbeschränkungen der Tabelle unverändert!

Der Unterschied zwischen DELETE und TRUNCATE

  • Gleicher Punkt:
    • Daten können beim letzten Mal gelöscht werden
    • Beides löscht nicht die Struktur der Tabelle
  • Unterschied
    • TRUNCATE setzt die selbstinkrementierende Spalte zurück und der Zähler kehrt auf 0 zurück
    • TRUNCATE hat keinen Einfluss auf Transaktionen
CREATE TABLE `teacher`(
`id` INT(8) NOT NULL AUTO_INCREMENT,
`name` VARCHAR(20) NOT NULL,
PRIMARY KEY(id)
)ENGINE=INNODB DEFAULT CHARSET=utf8

INSERT INTO `teacher`(`name`) VALUE('1'),('2'),('3')

DELETE FROM `teacher`    --不会影响自增

TRUNCATE TABLE `teacher`   --自增归0

Das Problem des DELETE-Löschens und das Phänomen des Neustarts der Datenbank:

  • INNODB, die selbstinkrementierende Spalte beginnt bei 1 (im Speicher gespeichert, geht beim Ausschalten verloren)
  • MyISAM, beginnen Sie weiterhin mit dem letzten Selbstinkrement (existiert in der Datei und geht nicht verloren).

DQL

DQL-Abfragedaten

Anfragen
  • Alle Abfragevorgänge verwenden es
  • Es können sowohl einfache als auch komplexe Abfragen bearbeitet werden
  • Die Kernsprache und Anweisung in der Datenbank
  • Am häufigsten verwendete Aussage
查询全部字段:
SELECT * FROM *****(表名)
查询指定字段
SELECT ` * `(表中字段),` * `,.... FROM ***(表名)
别名,给结果起一个名字(字段或表)
SELECT ` * `(表中字段) AS ***(别名),` * ` AS ***(别名),.... FROM ***(表名) AS ****(别名)
函数 CONCAT(A,B)
SELECT CONCAT('**(连接的字符串)',****(表中字段)) AS ***(别名) FROM ****(表名)
注意:
起别名只在自己展示界面窗口那边展示别名,但是重新打开表后,展示的不是别名而是自己刚开始定义的变量名;也就是说,别名只是我们在查询的时候看的。
CONCAT中的A,使用英文单引号框起来的,不是``!。
语法:
SELECT ***(字段) .....FROM ****(表)
有的时候,列名字不是那么见名知意,我们起别名 AS: 字段名 AS 别名 表名 AS 别名
Deduplizierung weit entfernt
作用:
去除SELECT查询结果中重复的数据
语法:
SELECT DISTANCT `表中字段` FROM `表名`
SELECT * FROM `result`     --查询全部

SELECT `studentno` FROM result		--查询某一列

SELECT DISTINCT `studentno` FROM result   --去重
数据列的表达式:
SELECT VERSION()   --查询系统版本(函数)
SELECT 100*3-1 AS 计算结果   --用于计算(表达式)
SELECT @@AUTO_INCREMENT_INCREMENT --查询自增步长
SELECT `表中字段`+1  AS '别名' FROM 表名

Ausdrücke in der Datenbank:

  • Textwert
  • Aufführen
  • NULL
  • Funktion
  • Berechnungsausdruck
  • Systemvariable

SELECT + Ausdruck

where-Bedingungssatz

Rolle: Abrufen der zulässigen Werte in den Daten

Das Suchergebnis besteht aus einem oder mehreren Ausdrücken! Ergebnis boolesch

Logische Operatoren:

Operator Grammatik beschreiben
Und && A und B A&&B Logisches UND, beides ist wahr, das Ergebnis ist wahr
oder || A oder BA||B Logisches ODER, wenn eines wahr ist, ist das Ergebnis wahr
Nicht ! KEIN !A Logisch nicht, wahr ist falsch, falsch ist wahr
Fuzzy-Abfrage

Vergleichsoperator

Operator Grammatik beschreiben
IST NULL A IST NULL Wenn der Operator NULL ist, ist das Ergebnis wahr
IST NICHT NULL A IST NICHT NULL Wenn der Operator nicht NULL ist, ist das Ergebnis wahr
ZWISCHEN A ZWISCHEN B UND C Das Ergebnis ist wahr, wenn A zwischen B und C liegt
WIE A WIE B SQL stimmt überein. Wenn A mit B übereinstimmt, ist das Ergebnis wahr
IN A IN(A1,A2,A3…) Angenommen, a liegt in a1 oder a2 ... einem der Werte, dann ist das Ergebnis wahr

' **% ** ' ' _ ':

  • %: steht für 0 für jedes Zeichen
  • _: repräsentiert ein Zeichen
SELECT `表中字段`, `表中字段` ,....FROM `表名`
WHERE `表中字段` LIKE '*(模糊查询的内容)%'
注:出现的内容为以*开头,后面的长度不限


SELECT `表中字段`, `表中字段` ,....FROM `表名`
WHERE `表中字段` LIKE '*(模糊查询的内容)_'
注:出现的内容以*开头,后面只有一个字符,如果后面又两个字符则用两个__,或者用%

说明:
_    % 可以放在模糊查询的前面,也可以放在后面,根据自己的需求进行代码的书写。

IN :

  • gefolgt von einem oder mehreren spezifischen Werten
SELECT `表中字段`, `表中字段` FROM `表名`
WHERE `表中字段` IN ('***(查询的具体内容)',`****`.....);

NULL NICHT NULL

查询表中字段1为空的值
SELECT `表中字段`, `表中字段` FROM `表名`
WHERE 表中字段1='' OR 表中字段1 IS NULL

查询表中字段1不为空的值
SELECT `表中字段`, `表中字段` FROM `表名`
WHERE 表中字段1 IS NOT NULL
Join-Tabellenabfrage

Bild

arbeiten beschreiben
INNER JOIN Wenn es mindestens eine Übereinstimmung in der Tabelle gibt, wird die Zeile zurückgegeben
LINKS BEITRETEN gibt alle Werte aus der linken Tabelle zurück, auch wenn in der rechten Tabelle keine Übereinstimmung vorhanden ist
RICHTIG BEITRETEN gibt alle Werte aus der rechten Tabelle zurück, auch wenn in der linken Tabelle keine Übereinstimmung vorhanden ist

JOIN (verbundene Tabelle) ON (Beurteilungsbedingung) – Abfrage verbinden

WHERE – äquivalente Abfrage

selbst beitreten

Definition: Verbinde dich mit deinem eigenen Tisch

Kern: Teilen Sie eine Tabelle in zwei identische Tabellen auf

Kategorie ID Kategoriename
2 Informationstechnologie
3 Software-Entwicklung
5 Kunstdesign
pid Kategorie ID Kategoriename
3 4 Datenbank
2 8 Büroinformationen
3 6 Web Entwicklung
5 7 PS-Technologie

Fragen Sie die Beziehung zwischen Freys entsprechenden Unterklassen ab

Vater Unterklasse
Informationstechnologie Büroinformationen
Software-Entwicklung Datenbank
Software-Entwicklung Web Entwicklung

SELECT-Syntax:

SELECT [ALL | DISTINCT]
{
    
    * | TABLE.* | [TABLE.FIELD1[AS ALIAS1][,TABLE.FIELD2[AS ALIAS2]][,......]]
FROM TABLE_NAME [AS TABLE_ALIAS]
	[LEFT | RIGHT | INNER JOIN TABLE_NAME2]
	[WHERE....] ---指定结果需满足的条件
	[GROUP BY ....]  ---指定结果按照那几个字段来分组
	[HAVING] --- 过滤分组的记录必须满足的次件
	[ORDER BY.....] --指定查询记录按一个或多个条件排序
	[LIMIT {
    
    [OFFSET,]ROW_COUNTOFFSET OFFSET}];
	--指定查询记录从那条到那条
}
上述顺序不能变

Hinweis: []: bedeutet optional, {}: bedeutet erforderlich

Wählen Sie das Feld aus dem Tabellennamen der wichtigen Abfrage aus (Tabellen und Felder können mit Aliasnamen versehen werden).

XX JOIN-Tabelle, die aufgrund der Äquivalenzbeurteilung verknüpft werden soll

wo (spezifischer Wert, Unterabfrageanweisung)

gruppieren nach (gruppieren nach diesem Feld)

haben (filtern Sie die gruppierten Informationen, die Bedingung ist die gleiche wie wo, aber der Ort ist anders)

Sortieren nach ... (nach diesem Feld sortieren) [aufsteigend/absteigend]

Begrenzen Sie die Seitengröße des Startindex

--测试代码:
CREATE TABLE `test`(
`categoryid` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`pid` INT(10) NOT NULL,
`categoryName` VARCHAR(50) NOT NULL,
PRIMARY KEY (`categoryid`)
)ENGINE=INNODB DEFAULT CHARSET=utf8

SELECT t.`categoryName`, s.`categoryName` 
FROM `test` AS t, `test` AS s
WHERE s.pid=t.categoryid
Paginierung und Sortierung

Sortiere nach:

**Aufsteigende Reihenfolge:**ASC

**Absteigende Reihenfolge:**DESC

Grammatik:

ORDER BY `表中字段` ASC[DESC]

Seitennummerierung:

Rolle: Entlastung der Datenbank, bessere Benutzererfahrung und Vermeidung von Wasserfallflüssen

Grammatik:

LIMIT 起始值, 页面大小(pageSize)
计算:
--【pageSize:页面大小】
--【(n-1)*passageSize:起始值】
--【n:当前页】
--【数据总数/页面大小=总页数】
Unterabfrage

WHERE (这个值是计算出来的)

本质:

在WHERE语句中嵌套一个子查询语句

WHERE(SELECT FROM *)

由里及外

MySQL函数

常用函数

**常用函数:**
数学运算:
SELECT ABS(-8)     --取绝对值

SELECT CEILING(9.4)   --向上取整

SELECT FLOOR(9.4)    --向下取整

SELECT RAND()   --返回一个0-1之间的随机数

SELECT SIGN(0)   --判断一个数的符号,负数返回-1,正数返回1

字符串函数
SELECT CHAR_LENGTH('*****')   --字符串长度

SELECT CONCAT('**','**','**')   --拼接字符串

SELECT INSERT('****',1,2,'***')   --查询,从某个位置开始替换某个长度

SELECT LOWER('ADSAFSF')    --转换成小写

SELECT UPPER('qadaddf')    --转换成大写

SELECT INSER('***','*')    --返回第一次出现的子串的索引、

SELECT REPLACE('*****','****1','****2')  --替换出现的指定字符串

SELECT SUBSTR('******',4(开始位置),2(截取长度))  --截取原字符串

SELECT REVERSE('********')  --反转

时间和日期函数:
SELECT CURRENT_DATE()  --获取当前日期

SELECT CURDATE()  --获取当前日期

SELECT NOW()   --获取当前时间

SELECT LOCALTIME()  --返回本地时间

SELECT SYSDATE()   --返回系统时间

SELECT YEAR(NOW())
SELECT MONTH(NOW())
SELECT DAY(NOW())
SELECT HOUR(NOW())
SELECT MINUTE(NOW())
SELECT SECOND(NOW())

系统:
SELECT SYSTEM_USER()
SELECT USER()
SELECT VERSION()

聚合函数

函数名称 描述
SUM() 求和
COUNT() 计数
AVG() 平均数
MAX() 最大值
MIN() 最小值
其他
SELECT COUNTz(指定列,表中字段) FROM ***(表名)   --会忽略所有的null值

SELECT COUNT(*) FROM ***(表名)   --不会忽略null值,本质:计算行数

SELECT COUNT(1) FROM ***(表名)   --不会忽略所有的null值,本质:计算行数

数据库级别的MD5加密

MD5:增强算法复杂度和不可逆性

破解原理:网站后有一个字典,MD5加密后的值,加密的前值

CREATE TABLE `test`(
 `id` int(4) NOT NULL,
 `name` VARCHAR(20) NOT NULL,
 `pwd` VARCHAR(20) NOT NULL,
 PRIMARY KEY(`id`)
)ENGINE=INNODB DEFAULT CHARSET=utf8

--明文密码
INSERT INTO test VALUES(1,'张','123456'),(2,'李','123456'),
(3,'王','123456')

--加密
UPDATE test SET pwd=MD5(pwd) WHERE id=1

UPDATE test SET pwd=MD5(pwd)---加密全部的密码
--插入时加密
INSERT INTO test VALUES(4,'XX',MD5('123456'))
-- 校验:将用户传递的密码进行MD5加密,然后比对加密后的值
SELECT * FROM test WHERE `name`='XX' AND pwd=MD5('123456')

事务

什么是事务:要么都成功,要么都失败

事务原则:

  • ACID原则(如下)
  • 原子性:两个步骤一起成功或者一起失败,不能只发生其中一个动作(要么都成功,要么都失败)
  • 一致性:针对一个事务操作前与操作后的状态一致
  • 隔离性:多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰
  • 持久性:事务结束后数据不会随着外界原因导致数据丢失,事务没有提交,便恢复到原状;事务提交便持久化到数据库中。事务一旦提交不可逆。

脏读:

定义:一个事务读取了另外一个事务未提交的数据

不可重复读:

定义:在一个事务内读取表中的某一行数据,多次读取结果不同(不一定错,场合不对)

虚读(幻读):

定义:一个事务内读取到别的事务插入的数据,导致前后读取不一致

MySQL默认开启事务自动提交
SET autocommit = 0    /*关闭*/
SET autocommit = 1    /*开启*/

--手动处理事务
START TRANSACTION   --标记一个事务的开始,从这个之后的sql都在同一个事务当中
INSERT XX
INSERT XX
(上面两行都成功才算成功,否则是失败的)

--提交:持久化(成功!)
COMMIT
--回滚:回到原来的样子(失败!)
ROLLBACK

--事务结束
SET autocommit = 1   --开启自动提交

SAVEPOINT 保存点名   --设置一个事物的保存点
ROLLBACK TO SAVEPOINT 保存点名  --回滚到保存点
RELEASE SAVEPOINT 保存点名  --撤销保存点

索引

定义:帮助MySQL高效获取数据的数据结构,提取句子主干,九二一获得索引的本质:索引就是数据结构

索引的分类:

  • 主键索引:PRIMARY KEY
    • 唯一标识,不可重复,只能有一个列作为主键
  • 唯一索引:UNIQUE KEY
    • 避免重复的列出现,可以重复,多个列都可以标识位唯一索引
  • 常规索引:KEY/INDEX
    • 默认的,index、key关键字来设置
  • 全文索引:FULLTEXT
    • 在特定的数据库引擎下才有,MyISAM
    • 快速定位数据
--显示所有的索引信息:
SHOW INDEX FROM ***(表名)

--增加一个全文索引
ALTER TABLE ***(库名).****(表名) ADD FULLTEXT INDEX `******(索引名)`(`****(列名)`)

--EXPLAIN 分析sql执行状况
EXPLAIN SELECT * FROM ****(表名)   --非全文索引

EXPLAIN SELECT * FROM ***(表名) WHERE MATCH(****(列名)) AGAINST('全文索引')

索引测试


索引在小数据量师,用处差别不大,在大数据时差别很明显。

索引原则

  • 索引不是越多越好
  • 不要对经常变动的数据加索引
  • 小数据量的表不需要加索引
  • 索引一般用来常用来查询的字段上!

索引的数据机构:

  • Hash类型的索引
  • Btree:INNODB的默认数据结构

权限管理和备份

用户管理

SQL命令操作:

用户表:mysql.user

本质:对这张表进行增删改查

--创建用户 
CREATE USER ***(用户名) IDENTIFIED BY '密码'
--修改当前用户的密码
SET PASSWORD = PASSWORD('******(密码)')
--修改指定用户的密码
SET PASSWORD FOR *****(用户名)= PASSWORD('******(密码)')

--用户重命名
RENAME USER ****(原名) TO *****(新名)
--用户授权命令,授予全部的权限,库.表(一般不用,用勾选),不能给别人授权
GRANT ALL PRIVILEGES ON *.*
--查询权限(指定用户)
SHOW GRANTS FOR ****(用户名)
SHOW GRANTS FOR root@localhost
--撤销权限  REVOKE 那些权限 在那个库 给谁撤销
REVOKE ALL PRIVILEGES ON *.*(指定的,否则是全局的) FROM ****(用户名)
--删除用户
DROP USER ****(用户名)

数据库的备份

  • 保证重要数据不丢失
  • 数据转移A–>B

MySQL数据库备份的方式:

  • 拷贝物理文件
  • 在可视化工具中手动导出
    • 在想要导出的库/表,右键选择备份
  • 使用命令行导出(mysqldump)
mysqldump -hlocalhost -uroot -p******(密码) **(库名) **(表名)>D:/...(导出位置)
mysqldump -h(主机) -u(用户名) -p(密码) 数据库 表1 表2 表3 ... >物理磁盘位置/文件名
#不加表名就是导出数据库

#导入
#登录的情况下,切换到指定的数据库
source ****(备份文件)

mysql -u用户名 -p密码 库名< 备份文件

数据库的设计

糟糕的数据库:

  • 数据冗余,浪费空间
  • 数据库插入和删除比较复杂,容易出现异常(屏蔽使用物理外键)
  • 程序的性能差

良好的数据库设计:

  • 节省内存空间、
  • 保证数据的完整性
  • 方便开发系统

三大范式

为什么:

  • 信息重复
  • 更新异常
  • 插入异常
    • 无法正常显示异常
  • 删除异常
    • 丢失有效信息

三大范式

  • 第一范式
    • 原子性:保证每一列不可再分
  • 第二范式
    • 前提满足第一范式
    • 每张表只描述一件事情
  • 第三范式
    • 前提满足第二范式
    • 确保数据表中每一列数据和主键直接相关,而不能间接相关

规范和性能的问题:

关联查询的表不能超过3张表

  • 考虑商业化的需求和目标(成本和目标体验),数据库的性能更重要
  • 在规范性能的问题的时候,适当考虑一下规范性
  • 故意增加某些表的冗余字段(从多张表查询变成单表查询)
  • 故意增加一些计算列(从大数据量降低为小数据量的查询:索引)

JDBC操作

定义:java数据库的连接,是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法。JDBC时Sun Microsystem的商标。通常说JDBC是面向关系型数据库的。

第一个JDBC程序

import java.sql.*;
public class test {
    
    
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
    
    
        //1.加载驱动
        Class.forName("com.mysql.jdbc.Driver");      //固定写法,加载驱动

        //2.用户信息和url                    school:这个是数据库
        String url="jdbc:mysql://localhost:3306/school?useUnicode=true&characterEncoding=utf8&useSSL=true";
        String username="root";
        String password="123456";
        //3.连接成功,数据库对象,Connection 代表数据库
        Connection connection=DriverManager.getConnection(url,username,password);
        //4.执行SQL的对象statement   执行sql的对象
        Statement statement=connection.createStatement();
        //5.执行SQL对象
        String sql="SELECT * FROM test";
        ResultSet resultSet=statement.executeQuery(sql);//返回结果集
        while(resultSet.next()){
    
    
            System.out.println("categoryid="+resultSet.getObject("categoryid"));
            System.out.println("pid="+resultSet.getObject("pid"));
            System.out.println("categoryName="+resultSet.getObject("categoryName"));
        }
    }
}

步骤总结:

  • 加载驱动
  • 连接数据库DriverManager
  • 获得执行sql对象 Statement
  • 获得返回的结果集
  • 释放连接

DriverManager:

//DriverManager.registerDriver(new com.mysql.jdbc.Driver());   //不推荐,这样的话会注册两次
Class.forName("com.mysql.jdbc.Driver");      //固定写法,加载驱动
//connection:代表数据库
connection.rollback();
connection.commit();
connection.setAutoCommit();

URL

 String url="jdbc:mysql://localhost:3306/school?useUnicode=true&characterEncoding=utf8&useSSL=true";

//mysql   默认端口号:3306
//jbdc:mysql(协议)://主机地址:端口号/数据库名?参数1&参数2&参数3

//oralce   默认端口号:1521
//jbdc:oracle:thin:@localhost:1521:sid

Statement执行SQL的对象 PrepareStatement执行SQL对象

String sql="SELECT * FROM test";//编写SQL

statement.excuteQuery();//查询操作,返回一个ResultSet(结果集)
statement.excute();//执行任何SQL

statement.executeUpdate();//更新、插入、删除、都用这个,返回一个受影响的函数

ReseltSet查询结果集:封装了所有的查询结果

获得指定的数据类型:

resultset.getobject();//在不知道的情况下使用
//如果知道列的类型使用指定的类型
resultset.getString();
resultset.getInt();
resultset.getFloat();
resultset.getDate();
...
    //遍历,指针
resultSet.beforeFirst(); //	移动到最前面
resultSet.afterLast();   //	移动到最后面
resultSet.next();        //	移动到下一个数据
resultSet.previous();    //	移动到前一行
resultSet.absolute(row); //	移动到指定行

释放资源

//释放连接
resultSet.close();
statement.close();
connection.close();//耗费资源,用完关闭

Statement对象

定义:jdbc中的statement对象用于向数据库发送SQL语句,想完成对数据库的增删改查,只需要通过这个对象向数据库发送增删改查语句即可。

Die Methode des Anweisungsobjekts:

  • executeUpdate() wird verwendet, um SQL-Anweisungen zum Hinzufügen, Löschen und Ändern an die Datenbank zu senden. Nach der Ausführung vonexecuteUpdate() wird eine Ganzzahl zurückgegeben (d. h. die Additions-, Lösch- und Änderungsanweisung verursachte Änderungen in mehreren Datenzeilen in). die Datenbank).
  • Die Methode „executeQuery()“ wird zum Senden einer Abfrageanweisung an die Datenbank verwendet. Die Methode „executeQuery“ gibt ein ResultSet-Objekt zurück, das das Abfrageergebnis darstellt.
  • Verwenden Sie die Methode „executeUpdate(String sql)“, um den Vorgang zum Hinzufügen von Daten abzuschließen:
statement st=connection.creatstatement();
String sql="insert into user(...) values(...)";
int num=st.executeUpdate(sql);
if(num>0){
    
    
    System.out.println("success");
}
  • Verwenden Sie die Methode „executeUpdate(String sql)“, um den Datenlöschvorgang abzuschließen:
statement st=connection.creatstatement();
String sql="delect from user where id=1";
int num=st.executeUpdate(sql);
if(num>0){
    System.out.println("success");
}
  • Verwenden Sie die Methode „executeUpdate(String sql)“, um den Datenänderungsvorgang abzuschließen:
statement st=connection.creatstatement();
String sql="update user set name='***' where name='***'";
int num=st.executeUpdate(sql);
if(num>0){
    System.out.println("success");
}
  • Verwenden Sie die Methode „executeUpdate(String sql)“, um den Datenabfragevorgang abzuschließen:
statement st=connection.creatstatement();
String sql="select * from user where id=1";
ResultSet re=st.executeQuery(sql);
where(rs.next()){
    //根据获取的数据类型,分别调用rs相应方法映射到java对象中。
}

//插入
public class TestInsert {
    public static void main(String[] args) throws SQLException {
        Connection conn=null;//获取数据库的连接
        Statement st=null;//获取sql的执行对象
        ResultSet rs=null;
        try {
            conn=JdbcUtils.getConnection();
            st=conn.createStatement();
            String sql="INSERT INTO test(categoryid,pid,categoryName)" +
                    "VALUES (10,4,'美术')";
            int i=st.executeUpdate(sql);     //受影响的行数
            if(i>0){
                System.out.println("Success");
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            JdbcUtils.release(conn,st,rs);
        }
    }
}

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/school?useUnicode=true&characterEncoding=utf8&useSSL=true
username=root
password=123456

SQL-Injektion

Es gibt Lücken in SQL, die angegriffen werden können und zu Datenlecks führen, und SQL wird gespleißt

PreparedStatement-Objekt

Das Wesentliche bei der Verhinderung von SQL-Injection: Behandeln Sie die übergebenen Parameter als Zeichen. Wenn ein Zeichen darin enthalten ist, wird es direkt maskiert, wodurch SQL-Injection effektiv vermieden werden kann.

Ich denke du magst

Origin blog.csdn.net/weixin_51961968/article/details/122767210
Empfohlen
Rangfolge