1. 程式人生 > >mysql 語法統計

mysql 語法統計

mysql 語法統計

mysql數據庫具有開源,跨平臺性,免費使用, 功能強大且使用方便等眾多優點。了解它的語法是很有必要的。那麽咱們現在就來學習一下它的語法結構。

一:

創建數據庫:

create {database | schema} [if not exists] 庫名 [default] character set [=] charset_name


if not exists 如果存在,就忽略。

character set 默認字符集編碼。


創建數據庫: create database

修改數據庫: alter database

刪除數據庫: drop database


1、mysql常見的數據類型;


數據類型是指列、存儲過程參數、表達式和局部變量的數據特征,它決定了數據的存儲格式,代表了不同的信息類型。


整型:

數據類型 字節

tinyint 1

smallint 2

mediumint 3

int 4

bigint 8


浮點型:

float[(M,D)] M是數字總位數,D是小數點後面的位數。

如果M和D被省略,根據硬件允許的限制來保存值。單精度浮點數。


double[(M,D)]


日期時間型:

date 3字節 YYY-MMM-DD 日期值

time 3字節 HH:MM:SS 時間值

year 1字節 YYYY 年份值

datetime 8字節 YYYY-MM-DD 混合日期和時間值


timestamp 8字節 YYYYMMDDHHMMSS 混合日期和時間值,時間戳。


字符型:

char 0-255字節 定長字符串

varchar 0-65535字節 變長字符串

tinytext 短文本字符串

text 長文本數據

mediumtext 中等長度文本數據

longtext 極大文本數據

enum(‘value1‘,‘value2‘) 1或2個字節

取決於枚舉值的個數(最多65535個數).


set(‘value1‘,‘value2‘) , 1、2、3、4或8個字節,取決於set成員的數目u(最多64個成員)


打開數據庫:use 庫名;

驗證用戶打開的數據庫:

select database();


創建數據表:

create table [if not exists] 表名(列名稱 數據類型,...)


查看數據表列表

show tables [from 庫名] [like ‘pattern‘ | where expr]


查看數據表結構:

show columns from 表名; 或 desc 表名


插入記錄:

insert [into] 表名 [(字段名,...)] values(值,...);

insert 表名 values(值,...)


查找記錄

select 字段,........ from 表名;


mysql空值和非空:

空值與非空值

NULL: 表示字段可以為空

NOT NULL:表示字段不允許為空。


mysql自動編號:

自動編號,且必須和主鍵組合使用

默認情況下,起始值為1,每次增量為1. auto_increment



mysql主鍵約束:

primary key或key

主鍵約束特點:

每張數據表只能存在一個主鍵,

主鍵保證記錄的唯一性。

主鍵自動為not null


mysql唯一約束:

unique key

唯一約束特點:

唯一約束可以保證記錄的唯一性

唯一約束的字段可以為空值(null)

每張數據表可以存在多個唯一約束。


mysql默認約束:

default

默認值

當插入記錄時,如果沒有明確為字段賦值,則自動賦予默認值。


總結:

數字類型: 字符型,整型,浮點型, 日期時間型

數據表操作: 插入記錄,查找記錄。

記錄操作: 創建數據表,約束的使用。



二:

數據表操作:

如何創建數據表:

主鍵約束(primary key)

唯一約束(unique key)

默認約束(default)

非空約束(not null)


記錄插入

記錄查找


約束:

約束保證數據的完整性和一致性

約束分為表級約束和列級約束


約束類型包括:

主鍵約束(primary key)

唯一約束(unique key)

默認約束(default)

非空約束(not null)

外鍵約束(foreign key)


外鍵約束(foreign key)

保證數據一致性,完整性

實現一對一或一對多關系


外鍵約束的要求:

1、父表和子表必須使用相同的存儲引擎,而且禁止使用臨時表。

2、數據表的存儲引擎只能為INNODB。

3、外鍵列和參照列必須具有相似的數據類型。其中,數字的長度或是否有符號位必須相同,而字符的長度則可以不同。

4、外鍵列和參照列必須創建索引。如果外鍵列不存在索引的話,mysql將自動創建索引。


編輯數據表的默認存儲引擎:

mysql配置文件

Default-storage-engine=INNODB


查看表名所使用的引擎或表詳細結構: show create table 表名;

查看表的索引: show indexes from 表名\G

查看mysql下所有數據庫: show databases;

查看當前庫下所有的表: show tables;

查看視圖基本信息: desc 視圖名;

查看視圖基本信息: show table status like ‘視圖名‘;

查看視圖詳細信息: show create view 視圖名

查詢所有觸發器的信息: show triggers


查詢指定觸發器的詳細信息:

select * from information_schema.triggers where trigger_name=‘觸發器名‘;

查看存儲過程和函數的狀態:

show {查詢存儲過程 | 查詢存儲函數} status [like ‘pattern‘];

註意: like ‘pattern‘ : 匹配存儲過程或函數名稱。


查看存儲過程和函數狀態:

show create {procedure | function} sp_name;

procedure : 表示查詢存儲過程。

function : 表示查詢存儲函數。

sp_name : 表示存儲過程或函數名。

select * from information_schema.Routines WHERE routine_name=‘sp_name‘;

註意: routine_name : 存儲過程和函數名。

sp_name 存儲過程或函數名。



mysql 外鍵約束的參照操作:

1、cascade:從父表刪除或更新且自動刪除或更新子表中匹配的行。

2、set null:從父表刪除或更新行,並設置子表中的外鍵列為null.如果使用該選項,必須保證子表列沒有指定not null.

3、resttict:拒絕對父表的刪除或更新操作。

4、no action: 標準SQL的關鍵字,在mysql中restrict相同。



mysql表級約束和列級約束

列級約束:指對一個數據列建立的約束

表級約束:指對多個數據列建立的約束。

列級約束既可以在列定義時聲明,也可以在列定義後聲明。

表級約束只能在列定義後聲明。


mysql修改數據表--添加刪除列

修改數據表

添加單列:

alter table 表名 add [column] 列名 列定義 [first | after 列名]


列名(col_name)

列定義(column_definition)

添加多列:

alter table 表名 add [column] (列名 列定義,...)


刪除列:

alter table 表名 drop [列] 列名


添加主鍵約束:

alter table 表名 add [constraint [symbol]] primary key [index_type](index_col_name)


例如:

mysql> create table user2(

-> username varchar(10) not null,

-> pid smallint unsigned

-> );

Query OK, 0 rows affected (0.02 sec)


mysql> desc user2;

mysql> alter table user2 add id smallint unsigned;

mysql> alter table user2 add constraint pk_user2_id primary key(id);


添加唯一約束:

alter table 表名 add [constraint [symbol]] unique [index | key] [index_name] [index_type] (index_col_name,....)

例:

mysql> alter table user2 add unique(username);

mysql> desc user2;

mysql> alter table user2 add foreign key(pid) references provinces(id);


添加/刪除默認約束

alter table 表名 alter [column] col_name {set default literal | drop default}

例:

mysql> alter table user2 add age tinyint unsigned not null;

mysql> alter table user2 alter age set default 15;


mysql修改數據表---刪除約束

刪除主鍵約束

alter table 表名 drop primary key


例:

mysql> alter table user2 drop primary key;

mysql> desc user2;


刪除唯一約束:

alter table 表名 drop {index|key} index_name

例:

mysql> alter table user2 drop index username;


刪除外鍵約束:

alter table 表名 drop foreign key fk_symbol(外鍵約束名稱)

例如:

mysql> show create table user2;

mysql> alter table user2 drop foreign key user2_ibfk_1;

mysql> alter table user2 drop index pid;


mysql修改數據表---修改列定義和更名數據表

修改列定義:

alter table 表名 modify [column]

col_name col_definition [first | after col_name]

例如:

mysql> alter table user2 modify id smallint unsigned not null first;

mysql> show columns from user2;

mysql> alter table user2 modify id tinyint unsigned not null;


修改列名稱

alter table 表名 change [column] old_col_name new_col_name col_definition [first | after col_name]


例如:

mysql> desc user2;

mysql> alter table user2 change pid p_id tinyint unsigned not null;

mysql> desc user2;




數據表更名:

方法一:

alter table 表名 rename [to|as] new_tb1_name

方法二:

rename table 表名 to 新表名 [,表名2 to 新表名2]...

例如:

mysql> alter table user2 rename user3;

或:

mysql> rename table user3 to user2;


總結:

一、約束:

(1)按功能劃分:not null,primary key,unique key, default, foreign key

(2) 按數據列的數目劃分:表級約束,列級約束。


二、修改數據表;

(1)針對字段的操作:添加/刪除字段,修改列定義,修改列名稱等。

(2)針對約束的操作:添加/刪除各種約束。

(3)針對數據表的操作:數據表更名(兩種方式)


mysql 插入記錄insert


插入記錄:

insert [into] 表名 [(col_name,...)]

{values | value} {{expr | default},...),(...),....}


例如:

mysql> create table user(

-> id smallint unsigned primary key auto_increment,

-> username varchar(20) not null,

-> password varchar(30) not null,

-> age tinyint unsigned not null default 10,

-> sex boolean

-> );

mysql> insert user values(null,‘Tom‘,‘123‘,24,1);

mysql> insert user values(null,‘join‘,‘456‘,25,1);

mysql> insert user values(default,‘Tom‘,‘456‘,26,0);

mysql> insert user values(default,‘join‘,‘123‘,2*8+3,0),(null,‘jack‘,‘5678‘,default,0);


插入記錄:

insert [into] 表名 set col_name={expr | default}...

例如:

mysql> insert user set username=‘jack‘,password=‘123.cn‘;

插入記錄:

insert [into] 表名 [(col_name,...)] select ...


mysql單表更新update和刪除記錄delete

update

更新記錄(單表更新)

update [low_priority] [ignore] table_reference set col_name1={expr1 | default} [,col_name2={expr2 | default}]... [where where_condition]

例如:

mysql> update user set age=age+5;

mysql> update user set age=age-id,sex=0;

mysql> update user set age=age+5 where id%2=0;


delete

刪除記錄(單表刪除)

delete from 表名 [where 搜索條件]

例如:

mysql> delete from user where id=3;

mysql> insert user values(null,‘111‘,‘456‘,‘30‘,null);



select

查找記錄

select select_expr [.select_expr..]

[

from table_references

[where 條件表達式]

[group by {col_name | position} [asc | desc],...]

[having 條件表達式]

[order by {col_name | expr | position } [asc | desc],...]

[limit {[offset]row_count | row_count offset offset}]

]



查詢表達式

查詢表達式表示你想要的某一列,必須至少有一列

多個列之間用英文逗號分隔。

星號(*)表示所有列,tbl_name.*可以表示命名表的所有列


查詢表達式可以使用[AS]alias_name為其賦予別名。

別名可以用於group by,order by 或having子句。


where

條件表達式:

對記錄進行過濾,如果沒有指定where子句,則顯示所有記錄。

在where表達式中,可以使用mysql支持的函數或運算符。


group by

查詢結果分組

[group by {col_name | position} [asc | desc ],...]


例如:

mysql> select sex from user group by sex;


having

分組條件

[having 分組條件]


例如:

mysql> select age from user group by age having age>300;

mysql> select sex,age from user group by 1 having count(id)>=2;


order by

對查詢結果進行排序

[order by {col_name | expr |position } [asc | desc],....]


例如:

mysql> insert user values(null,‘123‘,‘234‘,‘30‘,1);

mysql> select * from user order by id asc;

mysql> select * from user order by age,id desc;


limit

限制查詢結果返回的數量

[LIMIT {[offset,]row_count | row_count OFFSET offset}]


例如:

mysql> select * from user limit 2,2;

mysql> select * from user limit 3;

mysql> create table test(

-> id tinyint unsigned primary key auto_increment,

-> username varchar(20)

-> );

mysql> insert test(username) select username from user where age >=30;

mysql> select * from test;




mysql三種常見的子查詢:

用any,some或all修飾的比較運算符:

operand comparison_operator any(subquery)

operand comparison_operator some(subquery)

operand comparison_operator all(subquery)


any,some,all關鍵字

運算符 any some all

>,>= 最小值 最小值 最大值

<,<= 最大值 最大值 最小值

= 任意值 任意值

<>,!= 任意值


例如:

mysql> select goods_id,goods_name,goods_price from tdb_goods where goods_price>any(select goods_price from tdb_goods where goods_cate=‘超級本‘);


使用[not] in的子查詢

語法:

operand comparison_operator [not] in (subquery)

=any 運算符與in等效

!=all 或<>all運算與not in等效。



例如:

創建商品分類:

mysql> create table if not exists tdb_goods_cates(

-> cate_id smallint unsigned primary key auto_increment,

-> cate_name varchar(40) not null

-> );

mysql> select goods_cate from tdb_goods group by goods_cate;

將這個插入到tdb_goods_cates

mysql> desc tdb_goods_cates;

mysql> insert tdb_goods_cates(cate_name) select goods_cate from tdb_goods group by goods_cate;

mysql> select * from tdb_goods_cates;



mysql多表更新

多表更新

update table_references

set col_name1(列)={表達式1 | default}

[,col_name2={表達式2 | default}]..

[where where_condition]


表的參照關系:

table_reference

{[inner內 | cross] join | {left|right} [outer] join}

table_reference

on conditional_expr 表的連接條件


連接類型:

inner join,內連接

在mysql中,join,cross join和inner join是等價的。

left [outer] join,左外連接。

right [outer] join,右外連接。


例如:

mysql> update tdb_goods inner join tdb_goods_cates on goods_cate=cate_name set goods_cate=cate_id;

create...select

創建數據表同時將查詢結果寫入到數據表

create table [if not exists] 表名

[(create_definition,....)]

select_statement


例如:

mysql> select brand_name from tdb_goods group by brand_name;

mysql> create table tdb_goods_brands(

-> brand_id smallint unsigned primary key auto_increment,

-> brand_name varchar(40) not null

-> )

-> select brand_name from tdb_goods group by brand_name;


mysql> select * from tdb_goods_brands;

mysql> update tdb_goods AS a inner join tdb_goods_brands AS b on a.brand_name=b.brand_name set a.brand_name=b.brand_id;


mysql> desc tdb_goods\G;

需要修改字段名和字段類型:

mysql> alter table tdb_goods

-> change goods_cate cate_id smallint unsigned not null,

-> change brand_name brand_id smallint unsigned not null;


mysql> insert tdb_goods_cates(cate_name) values

-> (‘路由器‘),(‘交換機‘),(‘網卡‘);

mysql> insert tdb_goods_brands(brand_name)values(‘海爾‘),(‘清華同方‘),(‘神舟‘);

mysql> insert tdb_goods(goods_name,cate_id,brand_id,goods_price)values(‘yuan 123.cn密碼集合‘,‘13‘,‘4‘,‘1849‘);


mysql內連接inner join

子查詢與連接:

連接

mysql的select語句,多表更新,多表刪除語句中支持join操作。

語法結構;

table_reference

{[inner |cross] join | {left | right} [outer] join}

table_reference

on conditional_expr 連接條件。


數據表參照:

table_reference

表名 [[as] alias] | table_subquery [as] alias

數據表可以使用:表名 AS 別名 或表名 別名 賦予別名

table_subquery可以作為子查詢使用在from子句中,這樣的子查詢必須為其賦予別名。


連接類型:

inner join, 內連接

在mysql中,join,cross join和inner join是等價的。

left [outer] join,左外連接。

right [outer] join,右外連接。


連接條件:

使用on關鍵字來設定連接條件,也可以使用where來代替。

通常使用on關鍵字來設定連接條件。

使用where關鍵字來進行結果集記錄的過濾。

內連接

顯示左表和右表符合連接條件的記錄。

例如:

mysql> select goods_id,goods_name,cate_name from tdb_goods inner join tdb_goods_cates on tdb_goods.cate_id=tdb_goods_cates.cate_id;

mysql外連接outer join


左外連接

顯示左表的全部記錄及右表符合連接條件的記錄


右外連接

顯示右表的全部記錄及左表符合連接條件的記錄。


左外連接:

例如:

mysql> select goods_id,goods_name,cate_name from tdb_goods left join tdb_goods_cates on tdb_goods.cate_id=tdb_goods_cates.cate_id;


右外連接:

mysql> select goods_id,goods_name,cate_name from tdb_goods right join tdb_goods_cates on tdb_goods.cate_id=tdb_goods_cates.cate_id\G;





mysql多表連接:

例如:

mysql> select goods_id,goods_name,cate_name,brand_name,goods_price from tdb_goods AS a inner join tdb_goods_cates AS b ON a.cate_id=b.cate_id

-> inner join tdb_goods_brands AS c ON a.brand_id=c.brand_id\G;


外連接:

A LEFT JOIN B join_condition


數據表B的結果集依賴數據表A

數據表A的結果集根據左連接條件依賴所有數據表(B表除外)

左外連接條件決定如何檢索數據表B(在沒有指定where條件的情況下)

如果數據表A的某條記錄符合where條件,但是在數據表B中不存在符合連接條件的記錄,將生成一個所有列為空的額外的B行。

外連接:

如果使用內連接查找的記錄在連接數據表中不存在,並且在where子句中嘗試以下操作:col_name is null時,如果col_name被定義為not null, mysql將在找到符合連接條件的記錄後停止搜索更多的行。





mysql無限級分類表設計:



無限級分類數據表的設計

例如:

mysql> create table tdb_goods_types(

-> type_id smallint unsigned primary key

-> auto_increment,

-> type_name varchar(20) not null,

-> parent_id smallint unsigned not null default 0);


parent_id 父類的ID。


mysql> select * from tdb_goods_types;

例如:

mysql> select s.type_id,s.type_name,p.type_name from tdb_goods_types AS s LEFT JOIN tdb_goods_types AS p ON s.parent_id=p.type_id;



mysql> select p.type_id,p.type_name,s.type_name from tdb_goods_types AS p LEFT JOIN tdb_goods_types AS s ON s.parent_id=p.type_id;


mysql> select p.type_id,p.type_name,s.type_name from tdb_goods_types AS p LEFT JOIN tdb_goods_types AS s ON s.parent_id=p.type_id GROUP BY p.type_name;


mysql> select p.type_id,p.type_name,s.type_name from tdb_goods_types AS p LEFT JOIN tdb_goods_types AS s ON s.parent_id=p.type_id GROUP BY p.type_name ORDER BY p.type_id;


mysql> select p.type_id,p.type_name,count(s.type_name) child_count from tdb_goods_types AS p LEFT JOIN tdb_goods_types AS s ON s.parent_id=p.type_id GROUP BY p.type_name ORDER BY p.type_id;


mysql多表刪除:

例如:

mysql> select goods_id,goods_name from tdb_goods group by goods_name;


mysql> select goods_id,goods_name from tdb_goods group by goods_name HAVING count(goods_name)>1;


mysql> DELETE t1 from tdb_goods AS t1 LEFT JOIN (SELECT goods_id,goods_name from tdb_goods GROUP BY goods_name HAVING count(goods_name)>1) AS t2 ON t1.goods_name=t2.goods_name WHERE t1.goods_id>t2.goods_id;


mysql> select * from tdb_goods\G




mysql字符函數:

運算符和函數

根據功能的不同可以劃分為:

1、字符函數

2、數值運算符與函數

3、比較運算與函數

4、日期時間函數

5、信息函數

6、聚合函數

7、加密函數


字符函數:

函數名

CONCAT( ) : 字符連接

CONCAT_WS( ) : 使用指定分隔符進行字符連接。

FORMAT( ) : 數字格式化

LOWER( ) : 轉換成小寫字母

UPPER( ) : 轉換成大寫字母

LEFT( ) : 獲取左側字符。

RIGHT( ) : 獲取右側字符。


例如:

mysql> select * from test;

mysql> select concat(‘yuan‘,‘_‘,‘MYSQL‘);

mysql> select * from user;


將兩個字段合並為一個字段。

mysql> select concat(username,age) as fullname from user;


mysql> select concat(‘dajiangtai‘,‘_‘,‘Mysql‘);



mysql> select concat_ws(‘@‘,‘a‘,‘b‘,‘c‘);

mysql> select format(12345.678,2);


mysql> select lower(‘ANXIAOYU‘);


mysql> select upper(‘anxiaoyu‘);

mysql> select left(‘DaJiangTai‘,3);


mysql> select lower(left(‘DaJiangTai‘,3));

mysql> select length(‘dajiangtai‘);


length() : 獲取字符串長度。

ltrim() : 刪除前導空格。

rtrim() : 刪除後續空格。

trim() : 刪除前導和後續空格。

substring() : 字符串截取。

[not] like : 模式匹配。

replace() : 字符串替換。


例如:

mysql> select ltrim(‘ dajiangtai ‘);

mysql> select length(ltrim(‘ dajiangtai ‘));


mysql> select trim(leading ‘@‘ from ‘@@@[email protected]@@@‘);

mysql> select trim(trailing ‘@‘ from ‘@@@[email protected]@@@‘);


mysql> select trim(both ‘@‘ from ‘@@@[email protected]@@@‘);

mysql> select replace(‘@@@[email protected]@[email protected]@@‘,‘@‘,‘‘);


mysql> select replace(‘@@@[email protected]@[email protected]@@‘,‘@‘,‘##‘);

mysql> select substring(‘dajiangtai‘,3,5);


mysql> select substring(‘dajiangtai‘,3);

mysql> select substring(‘dajiangtai‘,-3);


mysql> select ‘dajiangtai‘ like ‘d%‘;



mysql 數值運算符和函數


ceil() : 進一取整

div : 整數除法

floor() : 舍一取整

mod : 取余數(取模)

power() : 冪運算。

round() : 四舍五入

truncate() : 數字截取


例如:

mysql> select 1+2;

mysql> select ceil(3.14);


mysql> select floor(3.14);

mysql> select 1/2;


mysql> select 1 div 2;

mysql> select 4%3;


mysql> select 4 mod 3;

mysql> select 4.2 mod 3;


mysql> select power(2,3);

mysql> select round(3.1415,3);


mysql> select truncate(12.3456,2);

mysql> select truncate(12.3456,-1);


mysql比較運算符和函數


[not] between...and... : [不] 在範圍之內

[not] in() : [不] 在列出值範圍內。

is [not] null : [不]為空。


例如;

mysql> select 2 between 1 and 3;

mysql> select 1 between 2 and 3;


mysql> select 2 between 2 and 3;

mysql> select 1 in (1,2,3,4);


mysql> select null is null;

mysql> select ‘‘ is null;



mysql日期時間函數


日期時間函數:

now() : 當前日期和時間

curdate() : 當前日期

curtime() : 當前時間

date_add() : 日期變化。

datediff() : 日期差值。

date_format() :日期格式化。


例如:

mysql> select now();

mysql> select curdate();


mysql> select date_add(‘2015-1-1‘,interval 365 day);

mysql> select date_add(‘2015-1-1‘,interval -365 day);


mysql> select datediff(‘2015-1-2‘,‘2015-2-2‘);

mysql> select date_format(‘2015-5-5‘,‘%m/%d/%y‘);


mysql 信息函數


connection_id() : 連接ID

database() : 當前數據庫

last_insert_id() : 最後插入記錄的ID號。

user() : 當前用戶

version() : 版本信息。


例如:

mysql> select connection_id();

mysql> select database();


mysql> create table test(

-> id tinyint(3) unsigned not null primary key auto_increment,

-> username varchar(20) not null);


mysql> select last_insert_id();

mysql> insert test(username) values(‘join‘);


mysql> insert test(username) values(‘111‘);

mysql> insert test(username) values(‘123‘);


mysql> insert test(username) values(‘11‘);

mysql> insert test(username) values(‘22‘),(‘33‘);


mysql> select last_insert_id();

mysql> select user();


mysql> select version();



mysql 聚合函數:

avg() : 平均值

count() : 計數。

max() :最大值。

min() : 最小值。

sum() : 求和。


例如:

mysql> select avg(id) from test;

mysql> select count(id) from test;


mysql 加密函數:

MD5() : 信息摘要算法

PASSWORD() : 密碼算法


例如:

mysql> select md5(‘admin‘);

mysql> select PASSWORD(‘admin‘);

mysql> set PASSWORD=PASSWORD(‘root‘);



mysql自定義函數:

用戶自定義函數(UDF) 是一種對mysql擴展的途徑,其用法與內置函數相同。

自定義函數的兩個必要條件:

(1), 參數

(2), 返回值。


函數可以返回任意類型的值,同樣可以接收這些類型的參數。


創建自定義函數:

create function function_name

returns

{string | integer | real | decimal}

routine_body


關於函數體:

(1) 函數體由合法的SQL語句構成。

(2) 函數體可以是簡單的select或insert語句。

(3) 函數體如果為復合結構則使用begin....end語句。

(4) 復合結構可以包含聲明,循環,控制語句。


設置客戶端編碼為gbk :

mysql> set names gbk;

mysql> select date_format(now(),‘%Y年%m月%d日 %H點: %i分: %s秒‘);


mysql> create function f1()

-> returns varchar(30)

-> return date_format(now(),‘%Y年%m月%d日 %H點: %i分: %s秒‘);


mysql> CREATE FUNCTION Q1(num1 SMALLINT UNSIGNED,num2 SMALLINT UNSIGNED)

-> RETURNS FLOAT(10,2) UNSIGNED

-> RETURN (num1*num2)/2;

mysql> select Q1(3,4);


mysql> create function adduser(username VARCHAR(20))

-> RETURNS INT UNSIGNED

-> BEGIN

-> INSERT test(username) values(username);

-> RETURN LAST_INSERT_ID();

-> END

-> //

mysql> select adduser(‘hello‘);

-> //


刪除函數:

DROP FUNCTION [IF EXISTS] function_name



mysql存儲過程:

SQL命令----> mysql引擎---》語法分析----》 可執行命令---》執行結果----》 客戶端。


存儲過程:

存儲過程是SQL語句和控制語句的預編譯集合,以一個名稱存儲並作為一個單元處理。


存儲過程優點:

增強了SQL語句的功能和靈活性。

實現較快的執行速度。

減少網絡流量。


創建存儲過程的語法:

create

[DEFINER={USER | CURRENT_USER}]

PROCEDURE sp_name ([proc_parameter[,...]])

[characteristic ...] routine_body


proc_parameter:

[IN | OUT | INOUT ] param_name type

參數:

IN : 表示該參數的值必須在調用存儲過程中指定。

OUT : 表示該參數的值可以被存儲過程改變,並且可以返回。

INOUT : 表示該參數在調用時指定,並且可以被改變和返回。


過程體:

過程體由合法的SQL語句構成。

過程體可以是"任意"的SQL語句。

過程體如果為復合結構則使用BEGIN...END語句。

復合結構可以包含聲明,循環,控制結構。

例如:

mysql> create procedure sp1() select VERSION();

mysql> CALL sp1;


調用存儲過程:

CALL sp_name([parameter[,...]])

CALL sp_name[( )]


mysql創建帶有IN類型參數的存儲過程:


例如:

mysql> delimiter //

mysql>

mysql> create procedure removeTestByid(IN id INT unsigned)

-> BEGIN

-> DELETE FROM test where id=id;

-> END

-> //


修改存儲過程:

alter procedure sp_name

[characteristic ...]

COMMENT ‘string‘

| {CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL

DATA}

| SQL SECURITY {DEFINER | INVOKER}


刪除存儲過程:

drop procedure 名字;

例如:

mysql> insert user(username,password,age,sex) values(‘Tom1‘,‘123‘,21,1),(‘Tom2‘,

‘1234‘,22,1);


mysql> insert user(username,password,age,sex) values(‘Tom3‘,‘123‘,30,1),(‘Tom4‘,

‘1234‘,30,1);


mysql> insert user(username,password,age,sex) values(‘Tom5‘,‘12‘,20,1),(‘Tom6‘,‘

1234‘,32,1);


mysql> delimiter //

mysql> create procedure removeUserByid(IN p_id INT UNSIGNED)

-> BEGIN

-> DELETE FROM user where id=p_id;

-> END

-> //



mysql> delimiter ;

mysql> CALL removeUserByid(2);

mysql> SELECT * FROM user where id=2;





本文出自 “安然一笑” 博客,請務必保留此出處http://liyuanjie.blog.51cto.com/12877605/1959130

mysql 語法統計