超全mysql 5min命令查詢

原文鏈接:https://www.cnblogs.com/lamdong/p/8431625.html

一、命令行操作

1、顯示所有庫:

        show databases;

2、要操作某個庫,比如庫名:

        db_book:use db_book;

3、查看錶的基本結構,比如表名:

        t_book:desc t_book;

4、查看某個表的創建sql語句:

        show create table t_book;

 

二、數據類型

1、char和varchar的區別:

        char是定長的,比如char(10)如果存的2位字符,給該字段分配的空間還是10個字符,varchar(10)存的就是2個字符,char性能好耗空間,varchar空間好耗性能

2、BLOB:

        如果數據庫要存圖片和視頻,用BLOB數據類型

3、int:

        10億級別的數據量是可以承載的,如果大於10億就要用BIGINT,看項目大小

4、decimal(5,2):

        表示有5位數字,其中小數位2位

 

三、表操作

1、創建表:

CREATE TABLE `sign_guest` (

  `id` INT(11) NOT NULL AUTO_INCREMENT,

  `realname` VARCHAR(64) NOT NULL,

  `phone` VARCHAR(16) NOT NULL,

  `email` VARCHAR(254) NOT NULL,

  `sign` TINYINT(1) NOT NULL,

  `create_time` TIMESTAMP  NULL  DEFAULT CURRENT_TIMESTAMP COMMENT '創建時間' ,

  `event_id` INT(11) NOT NULL,

  PRIMARY KEY (`id`),

  KEY `sign_guest_event_id_fa7638b3_fk_sign_event_id` (`event_id`),

  CONSTRAINT `sign_guest_event_id_fa7638b3_fk_sign_event_id` FOREIGN KEY (`event_id`) REFERENCES `sign_event` (`id`),

  UNIQUE KEY (`phone`,`event_id`)    -----兩個字段聯合添加唯一性約束,(應用場景:一場發佈會不能有相同的號碼,不同的發佈會可以有相同的號碼)

) ENGINE=INNODB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;

 

2、如何寫外鍵關聯兩個表

CREATE TABLE t_book(

        id int primary key auto_increment,   ----auto_increment表示自增,一般聲明主鍵時用到

        bookName varchar(20),

        author varchar(10),

        price decimal(6,2),

        bookTypeId int,

        constraint `fk` foreign key (`bookTypeId`) references `t_bookType`(`id`)   ----聲明外鍵,這裏不能用單引號和雙引號,要用tab鍵上面的那個鍵

)

 

3、修改表:

    1> 修改表給某個字段加上唯一性約束:

    ALTER TABLE `sign_guest` ADD UNIQUE(`phone`);

    2> 修改表名:

    alter table t_book rename t_book2;  ----把t_book表名字從t_book改成t_book2

    3> 修改字段:

    alter table t_book change author newAuthor varchar(20);  ---舊字段名author,改成新字段名newAuthor再給新字段名加屬性

    4> 增加字段:

    alter table t_book add publishDate date not null first; -----加個字段,字段要有數據類型,這裏給了date,再給上完整性約束條件(是否主外鍵,是否自增,是否唯一非空等),first表示在第一行插入

    alter table t_book add publishDate date not null after price; ---after price表示在price字段後面插入

    5> 刪除字段:

    alter table t_book drop author;

 

4、查詢表:

1> 常用條件有

1) IN 和 NOT IN

2) between A and B

3) Like 和 not like   %匹配多個字符   _匹配單個字符

4) is null 和 is not null

5) distinct

2> 重點是掌握group by:

    2.1> 跟group_concat()函數一起使用:

         select gradeName, group_concat(stuName) From t_student group by gradeName; ----根據年級名稱分組後把每個年級的學生名字全部列出來

    2.2> 跟having一起使用:

        select gradeName , count(stuName) from t_student group by gradeName having  count(stuName)>3;

    2.3> 使用with rollup在最後加一行合計行

        select gradeName , count(stuName) from t_student group by gradeName having  count(stuName)>3 with rollup;

 

3> 分頁查詢:

    select * from t_student limit 0, 5; ----0是初始位置的下標,表示查第一條數據(id爲1),5表示每頁多少條

 

4> 連接查詢:

    4.1>內連接:

        select * from t_book, t_bookType where t_book.bookTypeId=t_bookType.id;

    4.2> 外連接:

         select * from t_book left join t_bookType on t_book.bookTypeId = t_bookType.id  -----左連接查出表1的全部的數據,查出表2根據條件匹配的數據

         select * from t_book right join t_bookType on t_book.bookTypeId = t_bookType.id  ------右連接查出表2的全部的數據,查出表1根據條件匹配的數據

 

5> Exists關鍵字:

如果子查詢查詢到有記錄,則執行外查詢 ,not exist則相反

select * from t_book where exists (select * from t_bookType);

 

6> Any關鍵字:

    滿足任意一個條件都可以  

     select * from t_book where price >= any (select price from t_pricelevel); ------子查詢查出來的結果是價格的集合,本來不能用>=跟集合來比較,但是加個any後,意思成了跟任意一個集合裏的價格進行比較,只要滿足 條件的記錄外查詢都查詢出來

 

7> All關鍵字:

    要滿足所有條件 

     select * from t_book where price >= all (select price from t_pricelevel); ------子查詢查出來的結果是價格的集合,本來不能用>=跟集合來比較,但是加個all後,意思成了跟集合裏所有的價格逐個進行比較,要滿足所 有條件的記錄外查詢才查詢出來

 

8> union 和 union all:

    把兩條查詢語句的查詢結果合併,union在合併後會distinct,union all顯示合併結果不distinct

 

四、索引

    索引由表中一列或多列組合而成,作用提高查詢速度;分爲普通索引、唯一性索引(unique)、全文索引(fulltext)、單列索引、多列索引和空間索引(spatial)

1、創建索引:

    1.1> 創建表的時候創建索引

語法: CREATE TABLE 表名(屬性名   數據類型[完整性約束條件],

                          .....

                          [UNIQUE|FULLTEXT|SPATIAL]|INDEX|KEY[別名](屬性名[(長度)][ASC|DESC]));

        CREATE TABLE t_user (id int,

                              userName varchar(20),

                              index(userName)  -----創建單列索引,字段用的是userName

                              );

        CREATE TABLE t_user (id int,

                              userName varchar(20),

                              unique index index_userName(userName)  -----創建唯一索引,字段用的是userName,同時給userName取了別名index_userName

                              );

        CREATE TABLE t_user (id int,

                              userName varchar(20),

                              index index_userName_password(userName,password)  -----創建多列索引

                              );                     

 

    1.2> 表已經存在,給表創建索引:

        CREATE index index_userName on t_user(userName);  ----在表t_user的字段userName上創建索引同時取別名 index_userName

        CREATE unique index index_userName on t_user(userName);  ---在index全面加unique創建唯一索引

        CREATE index index_userName_password on t_user(userName,password);  ---創建多列索引

 

    1.3> 更改表的時候創建索引:

        ALTER TABLE t_user Add index index_userName(userName);  ---創建單列索引,字段用的是userName

        ALTER TABLE t_user Add unique index index_userName(userName); ---唯一索引

        ALTER TABLE t_user Add index index_userName_password(userName,password);  ---多列索引

 

2、刪除索引:

    drop index 索引名 on 表名;

 

 

五、編碼

操作修改默認編碼方式

1、顯示編碼方式:

    show variables like 'character%';

2、修改編碼方式:

    要保證客戶端,服務器和連接過程編碼都一樣

SET character_set_client = utf8 ; 

SET character_set_connection = utf8 ;   

SET character_set_database = utf8 ;   

SET character_set_results = utf8 ;   

SET character_set_server = utf8 ;

3、重啓mysql服務

    停止:net stop mysql 

    啓動:net start mysql

 

六、視圖

創建語法:

CREATE [ALGORITHM={UNDEFIEND|MERGE|TEMPTABLE}]

       VIEW 視圖名 [(屬性清單)]

       AS SELECT 語句

       [WITH [CASCADED|LOCAL] CHECK OPTION];

 

describe 視圖名; ---查看視圖基本信息

show table status 視圖名; ---查看錶(包括視圖)基本信息

show create view 視圖名; ----查看錶或視圖的詳細信息

 

1、修改視圖

    1.1> CREATE OR REPLACE VIEW語句:

CREATE OR REPLACE [ALGORITHM={UNDEFIEND|MERGE|TEMPTABLE}]

       VIEW 視圖名 [(屬性清單)]

       AS SELECT 語句

       [WITH [CASCADED|LOCAL] CHECK OPTION];

 

    1.2> ALTER語句

ALTER [ALGORITHM={UNDEFIEND|MERGE|TEMPTABLE}]

       VIEW 視圖名 [(屬性清單)]

       AS SELECT 語句

       [WITH [CASCADED|LOCAL] CHECK OPTION];

 

2、視圖是虛擬的表,數據來源於原表,對視圖當作表來執行insert into、update和delete語句操作的是原表的數據

 

3、刪除視圖:DROP VIEW [IF EXISTS] 視圖名列表 [RESTRICT|CASCADE];

 

七、觸發器

1、創建只有一個執行語句的觸發器:

CREATE trigger 觸發器名  before | after 觸發事件

            on 表名 for each row 執行語句

 

示例:create trigger trig_book after insert  ------觸發事件有insert 、 update和delete,這裏用insert觸發

              on t_book for each row

                  update t_bookType set bookNum = bookNum+1 where new.bookTypeId = t_booktype.id;  -----過渡變量有new 和 old, insert和update操作使用new,表示更新的那條數據,delete操作用old,表示刪除的那條數據

 

2、創建有多個執行語句的觸發器:

CREATE trigger 觸發器名 before | after 觸發事件

            on 表名 for each row

            begin

                執行語句

            end

 

示例:

delimiter |   -----delimiter的作用是防止mysql遇到第一個分號就當作一個語句開始執行

create trigger trig_book2 after delete

        on t_book for each row

        begin

          update t_bookType set bookNum = bookNum -1 where old.bookTypeId = t_bookType.id;

          insert into t_log values(null,now(),'在book表裏刪除了一條數據');

          delete from t_test where old.bookTypeId = t_test.id;

        end

|

delimiter ;

 

3、查看觸發器:

    3.1> show triggers;  

    3.2> 在系統庫information_schema的triggers表裏面查看

 

4、刪除觸發器:

    drop trigger 觸發器名 ; 

 

八、Mysql常用函數

1、日期和時間函數:

        curdate() ---返回當前日期

        curtime() --返回當前時間

        month(date) ---返回date中的月份,範圍是1~12

2、字符串函數 : 

        char_length(str) --返回字符串str長度

        upper(str)   ---返回str全部大寫

        lower(str)  ---返回str全部小寫

3、數學函數: 

        ABS(X)  ---求X的絕對值

        SQRT(x)  ---求x的平方根

        MOD(x) ---求x的餘數

4、加密函數:

        PASSWORD(str) ---一般對用戶的密碼加密  不可逆

        MD5(str)   ---普通加密  不可逆

        ENCODE(str, pswd_str)  ---加密函數,結果是一個二進制數,必須使用BLOB類型的字段來保存它

        DECODE(crypt_str,pswd_str) ---解密函數   加解密要用同一個pswd_str

 

九、存儲過程和函數

1、創建存儲過程:

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

    [characteristic ...] routine_body

 

存儲過程示例:

delimiter &&

create procedure pro_book (in bT int, out count_num int)

       reads sql data

       begin

         select count(*) from t_book where bookTypeId=bT;

       end

       &&

delimiter;

 

call procedure(1,@total)  ----調用存儲過程,@total指明是全局變量,不指明就是局部變量

 

2、創建函數:

CREATE FUNCTION sp_name ([func_parameter[,...]])

    RETURNS type

    [characteristic ...] routine_body

 

    proc_parameter:

    [ IN | OUT | INOUT ] param_name type

 

    func_parameter:

    param_name type

 

type:

    Any valid MySQL data type

 

characteristic:

    LANGUAGE SQL

  | [NOT] DETERMINISTIC

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

  | SQL SECURITY { DEFINER | INVOKER }

  | COMMENT 'string'

 

routine_body:

    Valid SQL procedure statement or statements

 

函數示例:

delimiter &&

create procedure func_book (bookId, int)

       returns varchar(20)

       begin

         return (select bookName from t_book where id=bookId);

       end

       &&

delimiter;

 

select func_book(1);  ---調用函數

 

 

3、查看存儲過程和函數

    3.1> show status語句查看狀態

    show {procedure|function} status [like 'pattern'];

    3.2> show create語句查看定義

    show create {procedure|function} sp_name;

 

4、刪除存儲過程和函數

    drop {procedure|function} sp_name;

 

十、變量

1、變量的使用:

DECLARE var_name[,.....] type[default value]

示例:

delimiter&&

CREATE PROCEDURE pro_user()

    BEGIN

      declare a, b varchar(20);

      insert into t_user values(null, a, b);

    END

&&

delimiter ;

 

2、爲變量賦值:

    2.1> 方式1:

    SET var_name = expr[,var_name=expr]...

    示例:

delimiter&&

CREATE PROCEDURE pro_user()

    BEGIN

      declare a, b varchar(20);

      set a='good good study', b='day day up';

      insert into t_user values(null, a, b);

    END

&&

delimiter ;

 

    2.2> 方式2:

    SELECT col_name[,...] INTO var_name[,...] FROM table name where condition

    示例:

delimiter&&

CREATE PROCEDURE pro_user()

    BEGIN

      declare a, b varchar(20);

      select userName2,password2 into a, b from t_user2 where id2=1;

      insert into t_user values(null, a, b);

    END

&&

delimiter ;

 

十一、遊標

1、使用過程爲聲明--》打開---》使用---》關閉

    1.1> 聲明:

    DECLARE cursor_name CURSOR FOR select_statement;

    1.2> 打開:

    OPEN cursor_name;

    1.3> 使用:

    FETCH cursor_name INTO var_name[,var_name.....];

    1.4> 關閉遊標:CLOSE cursor_name;

 

2、示例:

delimiter&&

CREATE PROCEDURE pro_user()

    BEGIN

      declare a, b varchar(20);

      declare cursor_user_2 cursor for select userName2,password2 from t_user2;   ---聲明遊標

      open cursor_user_2;                                                         ---打開遊標

      fetch cursor_user_2 into a, b;                                              ---通過遊標取數據賦值給變量

      insert into t_user values(null, a, b);

      close cursor_user_2;

    END

&&

delimiter ;

 

十二、流程控制

1、IF語句:

IF search_condition THEN statement_list

      [ELSEIF search_condition THEN statement_list]...

      [ELSEIF statement_list]

END IF

 

示例:

delimiter &&

create procedure pro_user5(IN bookId int)

       begin

       select count(*) into @num from t_user where id = bookId;

       if @num>0 then update t_user set userName='lower' where id= bookId;

       else

          insert into t_user values(null,'hkdfd','dsfs');

        end if;

       end

&&

delimiter ;

 

2、CASE語句:

CASE case_value

    WHEN when_value THEN statement_list

    [WHEN when_value THEN statement_list]....

    [ELSE statement_list]

END CASE

 

示例:

delimiter &&

create procedure pro_user5(IN bookId int)

       begin

       select count(*) into @num from t_user where id = bookId;

       case @num

            where 1 then update t_user set userName='lower' where id= bookId;

            where 0 then insert into t_user values(null,'hkdfd','dsfs');

            else insert into t_user values(null,'hkdfd','dsfs');

       end case;

       end

&&

delimiter ;

 

3、LOOP, LEAVE語句

[begin_label:]LOOP

     statement_list

END LOOP[end_label]

 

LEAVE label   ----跳出循環

 

示例:

delimiter &&

create procedure pro_user5(IN totalNum int)

       begin

       loop1:loop

          set totalNum=totalNum-1;

          if totalNum=0 then leave loop1;

          else insert into t_user values(totalNum,'hkdfd','dsfs');

          end if;

       end loop loop1;

       end

&&

delimiter ;

 

4、iterate語句 跳出本次循環,直接執行下一次循環

delimiter &&

create procedure pro_user5(IN totalNum int)

       begin

       loop1:loop

          set totalNum=totalNum-1;

          if totalNum=0 then leave loop1;

          elseif totalNum=3 then iterate loop1;

          end if;

          insert into t_user values(totalNum,'hkdfd','dsfs');

       end loop loop1;

       end

&&

delimiter ;

 

5、repeat語句:重複執行語句直到滿足某個條件後跳出循環

[begin_label:]repeat

            statement_list

            until search_condition

end repeat[end_label]

 

示例:

delimiter &&

create procedure pro_user5(IN totalNum int)

       begin

       repeat

       set totalNum=totalNum-1;

       into t_user values(totalNum,'hkdfd','dsfs');

       until totalNum=1;

       end repeat;

       end

&&

delimiter ;

 

6、 while語句:

[begin_label]while search_condition do

    statement_list

end while[end_label]

 

示例:

delimiter &&

create procedure pro_user5(IN totalNum int)

       begin

       while totalNum>0 do

       into t_user values(totalNum,'hkdfd','dsfs');

       set totalNum=totalNum-1;

       end while;

 

       end

&&

delimiter ;

 

十三、Mysql設置時間類型的字段默認值爲系統時間的方法

1、方法一:把字段類型設置爲timestamp,再把值設置成默認的current_timestamp,示例如下

    1.1> 添加CreateTime 設置默認時間 CURRENT_TIMESTAMP

ALTER TABLE `table_name`

ADD COLUMN  `CreateTime` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創建時間' ;

 

    1.2> 修改CreateTime 設置默認時間 CURRENT_TIMESTAMP

ALTER TABLE `table_name`

MODIFY COLUMN  `CreateTime` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創建時間' ;

 

    1.3> 添加UpdateTime 設置 默認時間 CURRENT_TIMESTAMP   設置更新時間爲 ON UPDATE CURRENT_TIMESTAMP (修改記錄時,該字段值自動更新爲系統時間)

ALTER TABLE `table_name`

ADD COLUMN `UpdateTime` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '創建時間' ;

 

    1.4> 修改 UpdateTime 設置 默認時間 CURRENT_TIMESTAMP   設置更新時間爲 ON UPDATE CURRENT_TIMESTAMP

ALTER TABLE `table_name`

MODIFY COLUMN `UpdateTime` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '創建時間' ;

 

2、方法二:使用觸發器

    create table test_time (   

     id int(11),   

     create_time datetime   

    );   

    delimiter |   

    create trigger default_datetime before insert on test_time   

      for each row   

        if new.create_time is null then   

          set new.create_time = now();   

        end if;|   

    delimiter ;   

 

十四、數據備份和還原

1、數據備份

方式一:使用mysqldump命令備份(命令行切換目錄到mysql安裝目錄的bin目錄,該目錄下有mysqldump.exe可執行文件)

mysqldump -u username -p dbname table1,table2...  > BackUpName.sql

方式二:使用sqlyon圖形工具

 

2、數據還原

方式一:mysql -u username -p [dbname] < backup.sql

 

十五、Mysql數據庫的各種事務

1、SET AUTOCOMMIT=0     -----取消事務自動提交處理,開啓事務處理

2、SET AUTOCOMMIT=1     -----打開事務自動提交處理,關閉事務處理

3、START TRANSACTION    -----啓動事務

4、BEGIN                -----啓動事務, 跟START TRANSACTION 相當

5、COMMIT               -----提交事務

6、ROLLBACK             -----回滾全部事務

7、SAVEPOINT 事務保存點名稱      --------設置事務保存點

8、ROLLBACK TO SAVEPOINT 保存點名稱    ---------回滾操作到保存點

 

十六、安裝卸載

1、安裝比較簡單,注意安裝mysql時字符編碼格式要選擇utf8

2、完全卸載mysql方法:

    2.1>先在程序管理卸載mysql,

    2.2>在regedit註冊表以下兩個路徑把mysql文件夾內容刪除:

    HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\Eventlog\Application\MySQL

    HKEY_LOCAL_MACHINE\SYSTEM\ControlSet002\Services\Eventlog\Application\MySQL

    2.3>刪除安裝目錄下所有文件 

    2.4> 刪除C:\ProgramData\MySQL文件夾下文件

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章