mysql 普通sql流程控制,【mysql的编程专题①】流程控制与其他语法
流程控制與內(nèi)置函數(shù),一般用在select的field字段上,或者用在函數(shù),存儲(chǔ)過(guò)程,觸發(fā)器中;
如果用在select上就會(huì)隨著query出來(lái)的row來(lái)隱式迭代;
注釋與語(yǔ)句結(jié)束符
語(yǔ)句結(jié)束符
默認(rèn)有兩個(gè):; 和 \g(只能在命令行中使用)
可以使用delimiter 命令來(lái)修改語(yǔ)句結(jié)束符,例如: delimiter $$(注意,一般手工修改結(jié)束符后再手工改回原來(lái)默認(rèn)值 ;)
注釋
行注釋: # 和 --[空格]
塊注釋: /* */
變量的定義與輸出
定義變量
MySQL中可以使用DECLARE關(guān)鍵字來(lái)定義變量。定義變量的基本語(yǔ)法如下:
DECLARE var_name[,...] type [DEFAULT value]
其中, DECLARE關(guān)鍵字是用來(lái)聲明變量的;var_name參數(shù)是變量的名稱(chēng),這里可以同時(shí)定義多個(gè)變量;type參數(shù)用來(lái)指定變量的類(lèi)型;DEFAULT value子句將變量默認(rèn)值設(shè)置為value,沒(méi)有使用DEFAULT子句時(shí),默認(rèn)值為NULL。只能用在存儲(chǔ)過(guò)程或者函數(shù)內(nèi)部
在過(guò)程中定義的變量并不是真正的定義,你只是在BEGIN/END(即復(fù)合語(yǔ)句)塊內(nèi)定義了而已。注意這些變量和會(huì)話變量不一樣,不能使用修飾符@你必須清楚的在BEGIN/END塊中聲明變量和它們的類(lèi)型。變量一旦聲明,你就能在任何能使用會(huì)話變量、文字、列名的地方使用。還需要注意的一點(diǎn)是,在一個(gè)塊內(nèi),我們需要把所有要使用的變量先聲明,才能在后面使用,并且不能在聲明變量的語(yǔ)句間夾雜其他使用變量的語(yǔ)句,否會(huì)報(bào)語(yǔ)法錯(cuò)誤。
CREATE PROCEDURE P5()
BEGIN
DECLARE a INT;
DECLARE b INT;
SET a = 5;
SET b = 5;
INSERT INTO t VALUES(a);
SELECT s1 FROM t WHERE s1>= b;
END;
-------------------------------------------------
mysql> CALL p5();
+----+
| s1 |
+----+
| 5 |
| 5 |
+----+
2 rows in set
Query OK, 0 rows affected
MySQL中可以使用SET關(guān)鍵字來(lái)為變量賦值。SET語(yǔ)句的基本語(yǔ)法如下:
SET var_name = expr [, var_name = expr] ...
MySQL中還可以使用SELECT…INTO語(yǔ)句為變量賦值。其基本語(yǔ)法如下:
SELECT col_name[,…] INTO var_name[,…]
FROM table_name WEHRE condition
其中,col_name參數(shù)表示查詢(xún)的字段名稱(chēng);var_name參數(shù)是變量的名稱(chēng);table_name參數(shù)指表的名稱(chēng);condition參數(shù)指查詢(xún)條件。
-- 查看系統(tǒng)變量 show variables [like pattern]
show variables like "innodb%";
-- set 變量名=變量值; 注意:為了區(qū)分用戶(hù)自定義變量和系統(tǒng)變量,需要在用戶(hù)自定義變量名稱(chēng)前加@符號(hào)。例如 set @name=’John’;
-- 如果在存儲(chǔ)過(guò)程或者函數(shù)中用DECLARE來(lái)預(yù)先定義了某個(gè)變量,后面的set可以不用加@,詳見(jiàn)后文例子;
set @userTotel = (select count(*) from users); -- Set賦值用法的變量值也可是標(biāo)量查詢(xún)的結(jié)果
-- select 字段 from 表名 into @變量名
select nickname from users ORDER BY user_money desc limit 1 into @richName;
SELECT id,data INTO x,y FROM test.t1 LIMIT 1; -- 這個(gè)SELECT語(yǔ)法把選定的列直接存儲(chǔ)到變量。因此,只有單一的行可以被取回
-- select @變量名:=變量值 與 select @變量名=變量值
set @who = 'zhouzhou';
select @who='小李'; -- 注意:此處不是賦值操作,而是變量的判斷,如果@who變量是已經(jīng)存在了,那就判斷@who中的值是否等于'小李',返回0或1;如果@who的變量不存在就返回NULL;
注意
變量的有效期為會(huì)話結(jié)束后,變量就失效(即斷開(kāi)連接后,變量失效)!
變量的作用域: 用戶(hù)定義的變量是全局的。但在函數(shù)內(nèi)定義的變量則是局部的。
變量的數(shù)據(jù)類(lèi)型與字段的數(shù)據(jù)類(lèi)型一致!
輸出變量
select @who;
分支語(yǔ)句
IF
語(yǔ)法
IF search_condition THEN statement_list
[ELSEIF search_condition THEN statement_list] ...
[ELSE statement_list]
END IF;
statement_list: 多條語(yǔ)句由;號(hào)隔開(kāi)
實(shí)例
delimiter $
CREATE PROCEDURE `hd`(IN `arg` TINYINT)
BEGIN
DECLARE `age` TINYINT DEFAULT 0;
SET `age` = `arg`;
IF `age`<20 THEN
SELECT "年輕人";
ELSEIF `age`<40 THEN
SELECT "青年人";
ELSELF
SELECT "OLD MAN";
END IF;
END$
create procedure proc_getGrade
(stu_no varchar(20),cour_no varchar(10))
begin
declare stu_grade float;
select grade into stu_grade from grade where student_no=stu_no and course_no=cour_no;
if stu_grade>=90 then
select stu_grade,'a';
elseif stu_grade<90 and stu_grade>=80 then
select stu_grade,'b';
elseif stu_grade<80 and stu_grade>=70 then
select stu_grade,'c';
elseif stu_grade<70 and stu_grade>=60 then
select stu_grade,'d';
else
select stu_grade,'e';
end if;
end
三元表達(dá)式
SELECT IF(@a=1,'真','失敗');
IFNULL(字段,值)
select age,ifnull(age,"空") from c; -- 如果age的值為null就返回空;
NULLIF(expr1,expr2)
-- 如果表達(dá)式1=表達(dá)式2,則返回null,否則返回第1個(gè)表達(dá)式
SELECT NULLIF(5,5); -- null
SELECT NULLIF(10,4); -- 10
case
CASE case_value
WHEN when_value THEN statement_list
[WHEN when_value THEN statement_list] ...
[ELSE statement_list]
END CASE
或者
CASE
WHEN search_condition THEN statement_list
[WHEN search_condition THEN statement_list] ...
[ELSE statement_list]
END CASE
Example1
delimiter $
CREATE PROCEDURE `pro2`(INOUT `arg` INT)
BEGIN
DECLARE `i` INT DEFAULT 0;
SET `i` = `arg`;
CASE `i`
WHEN 1 THEN
SELECT "sina";
WHEN 2 THEN
SELECT "baidu";
ELSE
SELECT "163";
END CASE;
END;
$
delimiter ;
Example2
delimiter $
CREATE PROCEDURE `pro3`(INOUT `arg` INT)
BEGIN
DECLARE `i` INT DEFAULT 0;
SET `i` = `arg`;
CASE
WHEN i = 1 THEN
SELECT "sina";
WHEN i = 2 THEN
SELECT "baidu";
ELSE
SELECT "163";
END CASE;
END;
$
delimiter ;
循環(huán)
leave
退出循環(huán)
LEAVE label -- 退出循環(huán),注意如果要使用leave的話,循環(huán)就必須得帶上leave;
while
[begin_label:] WHILE search_condition DO
statement_list
END WHILE [end_label]
Example1
delimiter $
CREATE PROCEDURE `createstu`(IN `num` INT)
BEGIN
DECLARE `i` INT DEFAULT 0;
DECLARE `yeard` DATE;
WHILE `num`>0 DO
SET `yeard` = DATE_SUB("2000-1-1",INTERVAL `i` DAY);
INSERT INTO `test` (`sname`,`birthday`) VALUES(MD5(`i`),`yeard`);
SET `i`=`i`+1;
SET `num`=`num`-1;
END WHILE;
END$
loop
[begin_label:] LOOP
statement_list
END LOOP [end_label]
Example1
delimiter $
create procedure t_loop()
begin
declare i int;
set i = 0;
loop_label:loop
insert into test(sname,birthday) values(md5(i),2005);
set i = i + 1;
if i > 100 then
leave loop_label; -- 注意這里的label是必須的哦;
end if;
end loop;
end$
delimiter ;
loop是在執(zhí)行后檢查結(jié)果,while是在執(zhí)行前檢查結(jié)果
repeat
[begin_label:] REPEAT
statement_list
UNTIL search_condition -- REPEAT語(yǔ)句內(nèi)的語(yǔ)句或語(yǔ)句群被重復(fù),直至search_condition 為真。
END REPEAT [end_label]
Example1
delimiter $
create procedure t_repeat()
begin
declare i int;
set i = 100;
repeat
insert into test(sname,birthday) values(md5(i),1988);
set i = i + 5;
until i > 10000 -- 注意until此處沒(méi)有分號(hào),是為和下面的end鏈接一起的;
end repeat;
end;$
其他
INSERT INTO SELECT
語(yǔ)法
Insert into Table2(field1,field2,...) select value1,value2,... from Table1
要求目標(biāo)表Table2必須存在,如果目標(biāo)table2已經(jīng)存在了,并且和table1的結(jié)構(gòu)一樣的話,可以直接 Insert into Table2 select * from Table1,如果結(jié)構(gòu)不一樣,就要Table2的字段對(duì)應(yīng)Table1的字段
SELECT INTO FROM
語(yǔ)法
SELECT vale1, value2 into Table2 from Table1
要求目標(biāo)表Table2不存在,因?yàn)樵诓迦霑r(shí)會(huì)自動(dòng)創(chuàng)建表Table2,并將Table1中指定字段數(shù)據(jù)復(fù)制到Table2中。
注意: MySQL不支持Sybase SQL擴(kuò)展:SELECT ... INTO TABLE ....。只支持select 字段 from 表名 into @變量名。
replace into
replace into table (id,name) values('1','aa'),('2','bb') -- 此語(yǔ)句的作用是向表table中插入兩條記錄。如果主鍵id為1或2不存在就相當(dāng)于insert into table (id,name) values('1','aa'),('2','bb') ,如果存在相同的值則不會(huì)插入數(shù)據(jù)
create...select
-- 創(chuàng)建表并插入它表的數(shù)據(jù)進(jìn)來(lái);
CREATE TABLE tdb_goods_brands (
brand_id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
brand_name VARCHAR (40) NOT NULL
) ENGINE = INNODB AUTO_INCREMENT = 1 DEFAULT CHARSET = utf8 COMMENT = '用戶(hù)信息表' SELECT
brand_name
FROM
tdb_goods
GROUP BY
brand_name;
總結(jié)
以上是生活随笔為你收集整理的mysql 普通sql流程控制,【mysql的编程专题①】流程控制与其他语法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: php上传文件 不移动,move_upl
- 下一篇: mysql脚本简书,mysql一键安装脚