Dieser Artikel vermittelt Ihnen relevantes Wissen über benutzerdefinierte Variablen und Anweisungsendebegrenzer in MySQL. Ich hoffe, er wird Ihnen hilfreich sein.
Manchmal ist es notwendig, viele Anweisungen auszuführen, um eine gemeinsame Funktion auszuführen. Es ist sehr ärgerlich, jedes Mal so viele Anweisungen einzeln in den Client einzugeben. Der Onkel, der MySQL
entworfen hat, hat uns sehr sorgfältig eine sogenannte gespeicherte Prozedur
zur Verfügung gestellt. Diese sogenannte gespeicherte Prozedur
kann aus gekapselten Anweisungen bestehen Bieten Sie dem Benutzer eine einfache Möglichkeit, diese gespeicherte Prozedur aufzurufen, um diese Anweisungen indirekt auszuführen. Je nach Aufrufmethode können wir gespeicherte Prozeduren
in gespeicherte Routinen
, Trigger
und Ereignisse
unterteilen. Unter diesen können gespeicherte Routinen
in gespeicherte Funktionen
und gespeicherte Prozeduren
unterteilt werden. Zeichnen wir ein Bild, um es auszudrücken: MySQL
的大叔非常贴心的给我们提供了一种称之为存储程序
的东东,这个所谓的存储程序
可以封装一些语句,然后给用户提供一种简单的方式来调用这个存储程序,从而间接地执行这些语句。根据调用方式的不同,我们可以把存储程序
分为存储例程
、触发器
和事件
这几种类型。其中,存储例程
又可以被细分为存储函数
和存储过程
。我们画个图表示一下:
别看出现了很多陌生的概念,别怕,我们后边会各个击破的。不过在正式介绍存储程序
之前,我们需要先了解一下MySQL
中的自定义变量和语句结束分隔符的概念。
生活中我们经常会遇到一些固定不变的值,比如数字100
、字符串'你好呀'
,我们把这些值固定不变的东东称之为常量
。可是有时候为了方便,我们会使用某一个符号来代表一个值,它代表的值是可以变化的。比方说我们规定符号a
代表数字1
,之后我们又可以让符号a
代表数字2
,我们把这种值可以发生变化的东东称之为变量
,其中符号a
就称为这个变量的变量名
。在MySQL
中,我们可以通过SET
语句来自定义一些我们自己的变量,比方说这样:
mysql> SET @a = 1; Query OK, 0 rows affected (0.00 sec) mysql>
上边的语句就表明我们定义了一个称之为a
的变量,并且把整数1
赋值给了这个变量。不过大家需要注意一下,设计MySQL的大叔规定,在我们的自定义变量前边必须加一个@
符号(虽然有点儿怪,但这就是人家规定的,大家遵守就好了)。
如果我们之后想查看这个变量的值的话,使用SELECT
语句就好了,不过仍然需要在变量名称前加一个@
符号:
mysql> SELECT @a; +------+ | @a | +------+ | 1 | +------+ 1 row in set (0.00 sec) mysql>
同一个变量也可以存储存储不同类型的值,比方说我们再把一个字符串值赋值给变量a
:
mysql> SET @a = '哈哈哈'; Query OK, 0 rows affected (0.01 sec) mysql> SELECT @a; +-----------+ | @a | +-----------+ | 哈哈哈 | +-----------+ 1 row in set (0.00 sec) mysql>
除了把一个常量赋值给一个变量以外,我们还可以把一个变量赋值给另一个变量:
mysql> SET @b = @a; Query OK, 0 rows affected (0.00 sec) mysql> select @b; +-----------+ | @b | +-----------+ | 哈哈哈 | +-----------+ 1 row in set (0.00 sec) mysql>
这样变量a
和b
就有了相同的值'哇哈哈'
!
我们还可以将某个查询的结果赋值给一个变量,前提是这个查询的结果只有一个值:
mysql> SET @a = (SELECT m1 FROM t1 LIMIT 1); Query OK, 0 rows affected (0.00 sec) mysql>
还可以用另一种形式的语句来将查询的结果赋值给一个变量:
mysql> SELECT n1 FROM t1 LIMIT 1 INTO @b; Query OK, 1 row affected (0.00 sec) mysql>
因为语句SELECT m1 FROM t1 LIMIT 1
和SELECT n1 FROM t1 LIMIT 1
的查询结果都只有一个值,所以它们可以直接赋值给变量a
或者b
。我们查看一下这两个变量的值:
mysql> SELECT @a, @b; +------+------+ | @a | @b | +------+------+ | 1 | a | +------+------+ 1 row in set (0.00 sec) mysql>
如果我们的查询结果是一条记录,该记录中有多个列的值的话,我们想把这几个值分别赋值到不同的变量中,只能使用INTO
语句了:
mysql> SELECT m1, n1 FROM t1 LIMIT 1 INTO @a, @b; Query OK, 1 row affected (0.00 sec) mysql>
这条查询语句的结果集中只包含一条记录,我们把这条记录的m1
列的值赋值到了变量a
中,n1
列的值赋值到了变量b
中。
在MySQL
客户端的交互界面处,当我们完成键盘输入并按下回车键时,MySQL
客户端会检测我们输入的内容中是否包含;
、g
或者G
这三个符号之一,如果有的话,会把我们输入的内容发送到服务器。这样一来,如果我们想一次性给服务器发送多条的话,就需要把这些语句写到一行中,比如这样:
mysql> SELECT * FROM t1 LIMIT 1;SELECT * FROM t2 LIMIT 1;SELECT * FROM t3 LIMIT 1; +------+------+ | m1 | n1 | +------+------+ | 1 | a | +------+------+ 1 row in set (0.00 sec) +------+------+ | m2 | n2 | +------+------+ | 2 | b | +------+------+ 1 row in set (0.00 sec) +------+------+ | m3 | n3 | +------+------+ | 3 | c | +------+------+ 1 row in set (0.00 sec) mysql>
造成这一不便的原因在于,MySQL
客户端检测输入结束用的符号和分隔各个语句的符号是一样的!其实我们也可以用delimiter
命令来自定义MySQL
的检测语句输入结束的符号,也就是所谓的语句结束分隔符
gespeicherte Prozeduren
offiziell einführen, müssen wir zunächst die Konzepte von benutzerdefinierten Variablen und Anweisungsendebegrenzern in MySQL
verstehen. 🎜🎜Einführung in benutzerdefinierte Variablen🎜🎜Im Leben stoßen wir oft auf feste Werte, wie die Zahl 100
, die Zeichenfolge 'Hallo'
, wir Diese Dinge sind fest Werte werden Konstanten
genannt. Aber manchmal verwenden wir der Einfachheit halber ein bestimmtes Symbol, um einen Wert darzustellen, und der Wert, den es darstellt, kann sich ändern. Beispielsweise geben wir an, dass das Symbol a
die Zahl 1
darstellt, und dann können wir das Symbol a
die Zahl 2 darstellen lassen
. Solche Dinge, deren Wert sich ändern kann, werden Variable
genannt, und das Symbol a
wird als Variablenname
bezeichnet Variable. In MySQL
können wir einige unserer eigenen Variablen über die SET
-Anweisung anpassen, zum Beispiel: 🎜mysql> delimiter $ mysql> SELECT * FROM t1 LIMIT 1; -> SELECT * FROM t2 LIMIT 1; -> SELECT * FROM t3 LIMIT 1; -> $ +------+------+ | m1 | n1 | +------+------+ | 1 | a | +------+------+ 1 row in set (0.00 sec) +------+------+ | m2 | n2 | +------+------+ | 2 | b | +------+------+ 1 row in set (0.00 sec) +------+------+ | m3 | n3 | +------+------+ | 3 | c | +------+------+ 1 row in set (0.00 sec) mysql>
a
und die Ganzzahl 1
wird dieser Variablen zugewiesen. Allerdings muss jeder aufpassen. Der Onkel, der MySQL entworfen hat, hat festgelegt, dass wir vor unseren benutzerdefinierten Variablen ein @
-Symbol hinzufügen müssen (obwohl es etwas seltsam ist, haben andere es so festgelegt, also jeder kann mich einfach daran halten). 🎜🎜Wenn wir den Wert dieser Variablen später überprüfen möchten, verwenden Sie einfach die SELECT
-Anweisung, aber wir müssen noch ein @
-Symbol vor dem Variablennamen hinzufügen: 🎜mysql> delimiter EOF mysql> SELECT * FROM t1 LIMIT 1; -> SELECT * FROM t2 LIMIT 1; -> SELECT * FROM t3 LIMIT 1; -> EOF +------+------+ | m1 | n1 | +------+------+ | 1 | a | +------+------+ 1 row in set (0.00 sec) +------+------+ | m2 | n2 | +------+------+ | 2 | b | +------+------+ 1 row in set (0.00 sec) +------+------+ | m3 | n3 | +------+------+ | 3 | c | +------+------+ 1 row in set (0.00 sec) mysql>
a
einen String-Wert zuweisen: 🎜mysql> delimiter ;
a
und b
den gleichen Wert 'Wahaha'
! 🎜🎜Wir können das Ergebnis einer Abfrage auch einer Variablen zuweisen, sofern das Ergebnis der Abfrage nur einen Wert hat: 🎜rrreee🎜Wir können auch eine andere Form der Anweisung verwenden, um das Ergebnis der Abfrage einer Variablen zuzuweisen: 🎜 rrreee 🎜Da die Abfrageergebnisse der Anweisungen SELECT m1 FROM t1 LIMIT 1
und SELECT n1 FROM t1 LIMIT 1
nur einen Wert haben, können sie direkt der Variablen a oder b
. Überprüfen wir die Werte dieser beiden Variablen: 🎜rrreee🎜Wenn unser Abfrageergebnis ein Datensatz mit mehreren Spaltenwerten im Datensatz ist, möchten wir diese Werte verschiedenen Variablen zuweisen. Wir können nur den INTO
-Anweisung wird verwendet: 🎜rrreee🎜Die Ergebnismenge dieser Abfrageanweisung enthält nur einen Datensatz. Wir weisen den Wert der Spalte m1
dieses Datensatzes der Variablen zu
, der Wert der Spalte n1
wird der Variablen b
zugewiesen. 🎜🎜Anweisungsende-Begrenzer🎜🎜Wenn wir in der interaktiven Schnittstelle des MySQL
-Clients die Tastatureingabe abschließen und die Eingabetaste drücken, erkennt der MySQL
-Client unsere Eingabe Enthält der Inhalt eines der drei Symbole ;
, g
oder G
? Wenn ja, wird der von uns eingegebene Inhalt an den Server gesendet . Wenn wir also mehrere Anweisungen gleichzeitig an den Server senden möchten, müssen wir diese Anweisungen in einer Zeile schreiben, etwa so: 🎜rrreee🎜Der Grund für diese Unannehmlichkeiten ist, dass der MySQL
client Das zum Erkennen des Endes der Eingabe verwendete Symbol ist dasselbe wie das Symbol, das die einzelnen Anweisungen trennt! Tatsächlich können wir auch den Befehl delimiter
verwenden, um das Symbol für MySQL
anzupassen, um das Ende der Anweisungseingabe zu erkennen, das sogenannte end-of -Anweisungstrennzeichen
, wie zum Beispiel dieses :🎜mysql> delimiter $ mysql> SELECT * FROM t1 LIMIT 1; -> SELECT * FROM t2 LIMIT 1; -> SELECT * FROM t3 LIMIT 1; -> $ +------+------+ | m1 | n1 | +------+------+ | 1 | a | +------+------+ 1 row in set (0.00 sec) +------+------+ | m2 | n2 | +------+------+ | 2 | b | +------+------+ 1 row in set (0.00 sec) +------+------+ | m3 | n3 | +------+------+ | 3 | c | +------+------+ 1 row in set (0.00 sec) mysql>
delimiter $
命令意味着修改语句结束分隔符为$
,也就是说之后MySQL
客户端检测用户语句输入结束的符号为$
。上边例子中我们虽然连续输入了3个以分号;
结尾的查询语句并且按了回车键,但是输入的内容并没有被提交,直到敲下$
符号并回车,MySQL
客户端才会将我们输入的内容提交到服务器,此时我们输入的内容里已经包含了3个独立的查询语句了,所以返回了3个结果集。
我们也可以将语句结束分隔符
重新定义为$
以外的其他包含单个或多个字符的字符串,比方说这样:
mysql> delimiter EOF mysql> SELECT * FROM t1 LIMIT 1; -> SELECT * FROM t2 LIMIT 1; -> SELECT * FROM t3 LIMIT 1; -> EOF +------+------+ | m1 | n1 | +------+------+ | 1 | a | +------+------+ 1 row in set (0.00 sec) +------+------+ | m2 | n2 | +------+------+ | 2 | b | +------+------+ 1 row in set (0.00 sec) +------+------+ | m3 | n3 | +------+------+ | 3 | c | +------+------+ 1 row in set (0.00 sec) mysql>
我们这里采用了EOF
作为MySQL
客户端检测输入结束的符号,是不是很easy啊!当然,这个只是为了方便我们一次性输入多个语句,在输入完成之后最好还是改回我们常用的分号;
吧:
mysql> delimiter ;
小贴士: 我们应该避免使用反斜杠(\)字符作为语句结束分隔符,因为这是MySQL的转义字符。
推荐学习:mysql视频教程
Das obige ist der detaillierte Inhalt vonLassen Sie uns über die Grundlagen der benutzerdefinierten MySQL-Variablen und Anweisungsendebegrenzer sprechen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!