MySQL的一點小小總結

   數據類型

一、整型
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;
 
MySQL中的字符串處理函數

一、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'510);
 
最後作爲一個結束,介紹個MySql分頁存儲過程

DROP PROCEDURE IF EXISTS `PtBase`.`prPager`;
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;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章