MySQL知識總結

IT小黑發表於2018-04-08

1.MySQL資料庫
    MySQL是一種關聯式資料庫管理系統,關聯式資料庫將資料儲存在不同的表中,從而增加了速度並提高了靈活性。
    MySQL所使用的 SQL 語言是用於訪問資料庫的最常用標準化語言,由於其體積小、速度快、總體擁有成本低,尤其是開放原始碼這一特點,一般中
  小型網站的開發都選擇 MySQL 作為網站資料庫,搭配 PHP 和 Apache 可組成良好的開發環境。
2.MySQL儲存方式
    一臺資料庫伺服器中會建立很多資料庫,在資料庫中會建立很多張表,在表中會有很多記錄。
3.SQL結構化查詢語言
     SQL是高階的非過程化程式語言,是一種資料庫查詢和程式設計語言,用於存取資料以及查詢、更新和管理關聯式資料庫系統;同時也是資料庫腳
  本檔案的副檔名,可以巢狀,具有極大的靈活性和強大的功能。
4.SQL語言的分類
    (1)DDL(資料定義語言)
    (2)DML(資料操作語言)
    (3)DCL(資料控制語言)
    (4)DQL(資料查詢語言)
5.MySQL資料庫的建立、修改和刪除
    (1)建立資料庫
        語法: create database 資料庫名稱 [character set 字符集 collate 字符集校對規則](一般忽略);
    (2)檢視資料庫
      檢視所有資料庫:
        語法: show databases;
      檢視某個資料庫:
        語法: show create database 資料庫名稱;
    (3)修改資料庫:
        語法:alter database 資料庫名稱 [character set 字符集 collate 字符集校對規則](一般忽略);
    (4)刪除資料庫:
        語法:drop database 資料庫名稱;
    (5)使用或者切換資料庫:
        語法:use 資料庫名稱;
6.MySQL表的建立、修改和刪除
    (1)建立表
        語法:create table 表名(
            資料名稱 資料型別(長度) 約束,
            …….
        );
        注:括號內的語句用逗號進行多次建立,最後的語句不加任何標點符號
        資料型別:(MySQL所對應的Java型別)
         Java中的型別                        MySQL中的型別
            byte/short/int/long             tinyint/smallint/int/bigint
            float                            float
            double                            ouble
            boolean                            bit
            char/String                        char和varchar型別
                                             char和varchar的區別:
                                              char代表是固定長度的字元或字串。
                                               定義型別char(8),向這個欄位存入字串hello,那麼資料庫使用三個空格將其補全。
                                              varchar代表的是可變長度的字串。
                                               定義型別varchar(8), 向這個欄位存入字串hello,那麼存入到資料庫的就是hello。
            Date                            date/time/datetime/timestamp
                                             datetime和timestamp區別
                                              datetime就是既有日期又有時間的日期型別,如果沒有向這個欄位中存值,資料庫使用null存入
                                              到資料庫中
                                              timestamp也是既有日期又有時間的日期型別,如果沒有向這個欄位中存值,資料庫使用當前的
                                              系統時間存入到資料庫中。
            File                            BLOB/TEXT
        約束:
          約束作用:保證資料的完整性
          單表約束:
            主鍵約束:primary key (主鍵約束預設就是唯一 非空的)
            唯一約束:unique
            非空約束:not null
    (2)檢視錶
        檢視一個資料庫下的所有的表:
          語法:show tables;
        檢視單獨一個表:
          語法:desc 表名;
    (3)刪除表
          語法:drop table 表名;
    (4)修改表
        增添列:
          語法: alter table 表名 add 列名 資料型別(長度) 約束;
        修改列型別,長度和約束:
          語法: alter table 表名 modify 列名 資料型別(長度) 約束;
        刪除列:
          語法: alter table 表名 drop 列名;
        修改列名稱:
          語法: alter table 表名 change 舊列名 新列名 資料型別(長度) 約束;
        修改表名:
          語法: rename table 表名 to 新的表名;
        修改表的字符集:
          語法: alter table 表名 character set 字符集;
7.MySQL資料的增刪改查
    (1)新增表記錄
        向表中插入某些列:
          語法: insert into 表名 (列名1,列名2,列名3…) values (值1,值2,值3…);
        向表中插入所有列:
          語法: insert into 表名 values (值1,值2,值3…);
      注意:
        1.值的型別與資料庫中表列的型別一致;
        2.值的順序與資料庫中表列的順序一致;
        3.值的最大長度不能超過列設定最大長度;
        4.值的型別是字串或者是日期型別,使用單引號引起來。
    (2)修改表記錄
          語法: update 表名 set 列名=值,列名=值 [where 條件];
      注意:
        1.值的型別與列的型別一致;
        2.值的最大長度不能超過列設定的最大長度;
        3.字串型別和日期型別新增單引號。
    (3)刪除表記錄
          語法: delete from 表名 [where 條件];(或者truncat from 表名;)<注:truncat刪除表資料無法恢復>
      注意:
        1.刪除表的記錄,指的是刪除表中的一行記錄;
        2.刪除如果沒有條件,預設是刪除表中的所有記錄。
    (4)檢視錶記錄
          語法: select  *(或者列名) from 表 [條件];
8.MySQL解決向資料庫中插入中文記錄會出現錯誤
    解決方法:
        需要將MySQL資料庫伺服器中的客戶端部分的字符集改為gbk,找到MySQL的安裝路徑:my.ini檔案,修改檔案中[client]下的字符集,將
      [default-charaacter-set=ISO-8895-1]改成[default-charaacter-set=gbk],然後再重新啟動MySQL的伺服器。
9.按不同方式檢視錶記錄
    (1)按條件查詢:
        使用where 字句
         > ,< ,<= , >= , <> *不等 , =
        like:模糊查詢 , in:範圍 查詢 ,  條件關聯:and or not
        查詢李四資訊: select * from 表名 where 列名[name = 李四] = `李四`;
        查詢李四資訊並且英語大於90: select * from 表名 where 列名[name = 李四] =`李四` and 列名[Englist]>90;
        在lik可以使用: _ , %  _只能帶表一個字元 %帶表多個字元  * %王% 帶表中間包含著個字就行
        查詢姓李的學生資訊: select * from 表名 where name like `%李%`
        查詢英語成績是69,75,89的學生: select * form 表名 where 列名[english] in (69 , 75 , 89);
    (2)查詢排序:
        使用order by 欄位名稱 asc/desc; *預設是用asc , 倒序desc;
        查詢學生資訊按成績排: selech * from order by 列名[english];
        查詢學生成績按倒序: selech * from order by 列名[english] desc;
        查詢學生按語文成績倒序再按英語升序排列: select * from order by  列名[chinese] desc, 列名[english] asc;
        查詢姓李的學生,英語按倒序排列: select * from 表名 where 列名[name] like `李%` order by 列名[english] desc;
    (3)分組統計查詢:
        聚合函式:
          sum(); 獲得總數: count();*個數;  最大值:max() 最小值:min() 平均值:avg;
            獲得所有成績的和: select sum(exam)from 表名;
          count();
            獲得所有的計數: select count(*) from 表名;
          max()/min();
            獲得某門考試的最大和最小成績: select max(math) from 表名;/select min(math) from 表名;
          avg()
            獲得平均數:select avg(chinese) from 表名;
        分組查詢
          語法:使用group by 欄位名稱;
           按商品名稱統計,每類商品所花費的總金額:select product,sum(price) from orderitem group by product;
         注意:
            where的子句後面不能跟著聚合函式。如果現在使用帶有聚合函式的條件過濾(分組後條件過濾)需要使用一個關鍵字HAVING;
            例:select product,sum(price) from orderitem  group by product having sum(price) > 5000 order by sum(price) asc;
10.單表查詢的執行順序流程
    select … from … where …  group by … having …order by …;
11.多表查詢
      表與表之間的關係-外來鍵
        作用:保證多張表之間的資料如果有關聯,則關聯的資料的完整性。
      設計與建表原則
        一對多:將外來鍵設定在多的一方,指向一的主鍵
        多對多:必須有第三張表,這張表中最少會有兩個欄位作為外來鍵,指向多對多的兩張表的主鍵
        一對一:唯一外來鍵約束
                主鍵對應:
                  實質就是建立外來鍵並且讓這個外來鍵唯一。
      查詢:
        準備環境:多表分析建立
        連線查詢:關聯條件就是外來鍵
            內連線:交集, select * from 表1, 表2 where 條件
            左外連線:左表的資料和交集資料
                select * from 表1 left join 表2 on 條件
            右外連線:右表的資料和交集資料
                select * from 表1 right join 表2 on 條件
        子查詢
12.分頁查詢
    select * from 表名 limit begin, length  :begin 從0開始,表示索引;length:表示查詢多少條記錄
    select * from 表名 limit number; 從第一條資料開始,總共查詢number條資料。
13.MySQL常見bug
     select * from 表名 where score = `80abc` 實質就是:SELECT * FROM stu where score = 80, 會將不能轉化為數值的字元捨棄
     select * from 表名 where NAME = `abC` :MySQL查詢的時候不區分大小寫      
        解決方法:
            select * from stu where BINARY NAME = `Abc`