數據類型
1、BIGINT
語法:BIGINT [(display_size)] [AUTO_INCREMENT] [UNSIGNED] [ZEROFILL]
存儲:8字節。
描述:最大的整數類型,支持的整數範圍是:-9 223 372 036 854 775 808 ~ 9 223 372 036 854 775 807(UNSIGNED時爲:0 ~ 18 446 744 073 709 551 615)。
2、INT
語法:INT [(display_size)] [AUTO_INCREMENT] [UNSIGNED] [ZEROFILL]
存儲:4字節。
描述:範圍爲:-2 147 483 648 ~ 2 147 483 647(UNSIGNED時爲:0 ~ 4 294 967 295)的基本整數。有同義語法:INTEGER。
3、MEDIUMINT
語法:MEDIUMINT [(display_size)] [AUTO_INCREMENT] [UNSIGNED] [ZEROFILL]
存儲:3字節
描述:範圍爲:-8 388 608 ~ 8 388 607(UNSIGNED時爲:0 ~ 16 777 215)的基本整數。
4、SMALLINT
語法:SMALLINT [(display_size)] [AUTO_INCREMENT] [UNSIGNED] [ZEROFILL]
存儲:2字節
描述:範圍爲:-32768 ~ 32767(UNSIGNED時爲:0 ~ 65535)的基本整數。
5、TINYINT
語法:TINYINT [(display_size)] [AUTO_INCREMENT] [UNSIGNED] [ZEROFILL]
存儲:1字節
描述:範圍爲:-128 ~ 127(UNSIGNED時爲:0 ~ 255)的基本整數。
二、字符型
1、CHAR
語法:CHAR(size) [BINARY]
存儲:size字節
大小:範圍爲:0 ~ 255
描述:固定長度的文本字段,字符比列大小小的字符串將用空格填充在右邊,右邊的填充在從數據庫中檢索該值時被刪除。有同義語法:NCHAR、NATIONAL CHAR、CHARACTER。
2、VARCHAR
語法:VARCHAR(size) [BINARY]
存儲:值的長度 +1 字節。
大小:由size值指定,5.0以上版本支持範圍爲:0 ~ 65535
描述:存儲可變長度的文本,VARCHAR值中的尾隨空格在存儲到數據庫中時將被刪除,這與ANSI規範相沖突。
3、TEXT
語法:TEXT
存儲:值的長度+2字節
大小:0 ~ 65535
描述:儲存大文本值,不接收默認值。
三、日期/時間型
在定義表時,各字段上通過DEFAULT子句指定的默認值必須是個常數,不可以是個函數,所以DATATIME colname DEFAULT NOW();這樣的定義是錯誤的,但有個例外,就是TIMESTAMP類型。
如果表中只有一個TIMESTAMP列:在定義的時候可以設置爲TIMESTAMP colname DEFAULT CURRENT_TIMESTAMP,這樣,在添加新記錄的時候把這個字段設置爲當前時間,但以後修改記錄時該TIMESTAMP字段不再更新;在定義的時候設置爲TIMESTAMP colname NOT NULL,這樣每次記錄更新該列都會重置爲當前時間。如果表中有多個TIMESTAMP列:僅第一個TIMESTAMP會自動更新。
1、YEAR
語法:YEAR
格式:YYYY (2001)
存儲:1字節
描述:存儲1900年 ~ 2155年之間的公曆年份。
2、DATE
語法:DATE
格式:YYYY-MM-DD (2001-01-01)
存儲:3字節
描述:存儲範圍爲1000年1月1日('1000-01-01') ~ 9999年12月31日('9999-12-31')的公曆日期。
3、TIME
語法:TIME
格式:hh:mm:ss (06:00:00)
存儲:3字節
描述:存儲範圍在子夜('00:00:00')到子夜前一秒('23:59:59')。
4、DATETIME
語法:DATETIME
格式:YYYY-MM-DD hh:mm:ss (2001-01-01 01:00:00)
存儲:8字節
描述:存儲範圍爲1000年1月1日上午12:00:00('1000-01-01 00:00:00') ~ 9999年12月31日下午11:59:59('9999-12-31 23:59:59')的公曆日期。
5、TIMESTAMP
語法:TIMESTAMP [(display_size)]
格式:YYYYMMDDhhmmss (20010101060000)
存儲:4字節
描述:範圍在1970年1月1日子夜到2037年12月31日子夜前一分鐘之間某時刻的簡單表示形式,精確到秒。它的主要用途是保持對錶更新的記錄。當向TIMESTAMP列中插入NULL值時,它將用當前的日期和時間替代插入。當在具有TIMESTAMP列的行中修改任何值時,第一個TIMESTAMP列將自動用當前的日期和時間更新。
1. 創建實例數據庫
create database db5;
use db5;
2.創建一個簡單的工作表,並插入數據
create table t(s1 int);
insert into t values(5);
3.創建程序實例 create procedure Example
create procedure p1() select * from t;
SQL語句存儲過程的第一部分是 create procedure
第二部分是過程名:上面新存儲過程的名字是p1。
第三部分書參數列表(),第四部分是程序的主體,“select * from t”
*****什麼樣的MySQL語句在存儲過程體中是合法的?
在存儲過程體中可以包含所有的合法SQL數據庫定義語言,insert,update,delete,drop,create,replace等等語句
包括(set,commit,rollback)但是,在代碼中如果包含MYSQL的擴充功能,那麼代碼將不能移植。
4. 調用存儲過程,所需要輸入的就是call和你過程名以及一個括號。
call p1();
5.過程中的特徵子句
create procedure p2()language SQL
NOT DETERMINISTIC
SQL SECURITY DEFINER
COMMENT ''
select current_date,rand() from t;
6.Parameters參數
create procedure p5()------; //參數列表是空的
create procedure p5([IN] name data-type)---- //輸入參數in可選,默認爲參數爲in
create procedure p5(out name data-type)----- //輸出參數out
create procedure p5(inout 那麼data-type)----- //即可以做輸入參數也可以做輸出參數
----輸入參數in 例子。
create procedure p5(p int) set @x=p;
call p5(12345);
select @x;
----輸出參數out 例子
create procedure p6(out p int)set p=-5;
call p6(@y);
select @y;
7. 複合語句:如果你的過程中有多條語句,那麼你需要begin/end塊。在這裏你可以進行變量的定義和流程的控制
首先執行命令 delimiter //
create procedure p7()
BEGIN
set @a=6;
set @b=5;
insert into t values (@a);
select s1 * @a from t where s1>= @b;
END;//
-----在複合語句中申明變量
create procedure p8()
begin
DECLARE a INT;
DECLARE b INT;
SET a=5;
SET b=5;
insert into t values (a);
select s1*a from t where s1>=b;
end;//
含有default默認語句舌設定語句的例子
create procedure p9()
begin
declare a ,b int default 5;
insert into t values(a);
select s1*a from t where s1>=b;
end;//
8. scope作用域的問題:內部的變量在其作用域範圍內享有更高的優先權,當執行到end
變量時,內部變量消失,此時已經在其作用域外,變量不再可見了,應爲在存儲
過程外再也不能找到這個申明的變量,但是你可以通過out參數或者將其值指派
給會話變量來保存其值。
create procedure p11()
begin
declare x1 char(5) default 'outer';
begin
declare x1 char(5) default 'inner';
select x1;
end;
select x1;
end;//
/********************************* 存儲過程中的條件式語句 ***************************************/
1. if-then -else語句
create procedure p12(in parameter int)
begin
declare var int;
set var=parameter+1;
if var=0 then
insert into t values(17);
end if;
if parameter=0 then
update t set s1=s1+1;
else
update t set s1=s1+2;
end if;
end;//
2. case指令:如果需要進行更多條件真假的判斷我們可以使用case語句
create procedure p13(in parameter int)
begin
declare var int;
set var=parameter+1;
case var
when 0 then insert into t values(17);
when 1 then insert into t values(18);
else insert into t values(19);
end case;
end;//
/***************************** 循環語句 ************************************/
1. while ···· end while; 循環語句
create procedure p14()
begin
declare var int;
set var=0;
while var<6 do
insert into t values(var);
set var=var+1;
end while;
end;//
2. repeat···· end repeat ;它在執行操作後檢查結果,而while則是執行前進行檢查
create procedure p15()
begin
declare v int;
set v=0;
repeat
insert into t values(v);
set v=v+1;
until v>=5
end repeat;
end;//
3. loop ·····end loop; loop 循環不需要初始條件,這點和while 循環相似,同時和repeat
循環一樣不需要結束條件, leave語句的意義是離開循環,
create procedure p16()
begin
declare v int;
set v=0;
LOOP_LABLE:loop
insert into t values(v);
set v=v+1;
if v >=5 then
leave LOOP_LABLE;
end if;
end loop;
end;//
4. LABLES 標號:標號可以用在begin repeat while 或者loop 語句前,語句標號只能在
合法的語句前面使用。可以跳出循環,使運行指令達到複合語句的最後一步。
DROP FUNCTION IF EXISTS myDataBase.fcMyFunction;
CREATE FUNCTION myDataBase.fcMyFunction() RETURNS BIGINT
BEGIN
DECLARE _s BIGINT DEFAULT 0;
SELECT _s + 1 INTO _s;
RETURN _s;
END;
一、LOCATE
LOCATE(substr, str);
返回子串substr在字符串str第一個出現的位置,如果substr不是在str裏面,返回0。
如下示例,返回結果:5
*/
SELECT LOCATE('5', '1234567890');
二、LENGTH
SELECT LENGTH(str);
三、CONCAT
字符串連接函數
如下示例結果:'abc123def'
*/
SELECT CONCAT('abc', 123, 'def');
四、REPLACE
字符串替換函數
如下示例結果:'123def'
*/
SELECT REPLACE('abcdef', 'abc', '123');
五、SUBSTRING
字符串截取函數 SUBSTRING(str, begin, end);
截取字符串str,從第begin位到end位
如下示例結果:'567890'
*/
SELECT SUBSTRING('1234567890', 5, 10);
CREATE PROCEDURE `PtBase`.`prPager`(
OUT oRowsTotal INT, --輸出記錄總數
IN iTableName VARCHAR(800), --表名
IN iFields VARCHAR(800), --查詢字段
IN iPageSize INT, --每頁記錄數
IN iPageNow INT, --當前頁
IN iOrderString VARCHAR(100), --排序條件
IN iWhereString VARCHAR(800) --WHERE條件
)
NOT DETERMINISTIC
SQL SECURITY DEFINER
COMMENT ''
BEGIN
DECLARE _beginRow INT DEFAULT 0;
DECLARE _mainString VARCHAR(8000);
DECLARE _limitString VARCHAR(100);
DECLARE _countString VARCHAR(8000);
SET _beginRow = (iPageNow - 1) * iPageSize;
SET _limitString = CONCAT(' LIMIT ', beginRow, ', ', iPageSize);
SET _countString = CONCAT('SET oRowsTotal = SELECT COUNT(*) FROM ', iTableName, ' WHERE ', iWhereString);
SET _mainString = CONCAT('SELECT ', iFields, ' FROM ', iTableName, ' WHERE ', iWhereString, iOrderString, _limitString);
SET @countStr = _countString;
PREPARE countStmt FROM @countStr;
EXECUTE countStmt;
DEALLOCATE PREPARE countStmt;
SET @mainStr = _mainString;
PREPARE mainStmt FROM @mainStr;
EXECUTE mainStmt;
DEALLOCATE PREPARE mainStmt;
END;