數據庫的基本使用

mysql數據庫
    mysql常用語句
    連接數據庫:mysql -u root -p
    斷開數據庫: exit
    
    庫操作
    1)新增數據庫  create database 數據庫名稱 [庫選項];
    
    庫選項:用來約束數據庫    
    如:字符集設定   charset 具體字符集(數據存儲的編碼格式)常用GBK UTF8
        
       注意:數據庫名稱不能用關鍵字或保留字,若非要用關鍵字可以用反引號
    2)查看字符集編碼    echo $LANG
    3)查看數據庫
    <1>查看所有數據庫   show databases;
    
    <2>查看指定部分數據庫(模糊查詢) show databases like 'pattern'    (pattern是匹配模式,%表示匹配多個字符,_表示匹配一個字符)
    
    <3>查看數據庫的創建語句     show create database 數據庫名稱;
    
    4)更新數據庫(數據庫的名字不能修改,數據庫的修改僅限於庫選項
    alter database 數據庫名稱 [庫選項] charset 字符集;
    
    5)刪除數據庫    drop database 數據庫名稱;
    當執行這句話後, 1.數據庫內部看不到對應的數據庫
               2.對應的數據庫文件夾被刪除,級聯刪除,裏面的數據表全部被刪除(不要隨意刪除數據庫和修改)
    
   

    表操作
    在某個數據庫下建表,首先    use 數據庫名稱;
    
    1)新增表
    create table [if nei exits] 表名
   (
        字段名稱  類型,
        字段名稱  類型
    )[表選型];
    if not exits:如果表名不存在,就創建,否則不執行創建代碼,檢查功能
    表選型:控制表的表現
         charset  具體字符集;   保證表中數據存儲的字符集
         存儲引擎:engine 具體存儲引擎(innodb,myisam)
    例:  create table bit
         (    name varchar(10),
              room varchar(10)
          )charset utf8;
    
    2)查看數據表
    <1>查看所有表    show tables;
    
    <2>查看部分表    show tables like 'parrent'
    
    <3>查看錶的創建語句    show create table 表名\G
    
    <4>查看錶結構     desc 表名;
    
    3)修改數據表
    表本身存在,還包含了字段:表的修改分爲兩個部分:
    1>修改表本身
    修改表名     rename table  原本表名  to   新表名;
    
    修改表選項   alter  table  bit_student   charset gbk;
    
    修改表字段:新增,修改,重命名,刪除
    1.1 新增字段      alter table 表名  add 字段名   數據類型  [位置];
     位置:字段名可以放在表中的任意位置    first  第一個位置    after:在哪個字段之後
    
    1.2 修改字段:通常修改屬性或數據結構
        alter   table   表名   modify   字段名    數據類型 [屬性][位置]
    
    1.3 重命名字段: alter  table   表名   change   舊字段   新字段名  數據類型 [屬性][位置]
    
    1.4 刪除字段:alter table 表名 drop 字段名   (如果表中已經有數據,那麼刪除字段會清空該字段的所有數據)                 
    1.5 刪除表: drop table 表名1,表名2....   (可以一次性刪除多張表)
    
    2>數據操作
    新增數據:  insert into 表名[(列1,列2,...)] values(v1,v2...)     (非數值數據都要用單引號括起來)
    
    查看數據: select */字段列表  from 表名 [where條件列表]
    
    查找所有數據: select * from 表名
    
    更新數據: update 表名 set 字段=值 [where條件]
    
    刪除數據:delete from 表名 [where條件]  (刪除時不可逆的)
       
    查看服務器識別的字符集:  show charset;
    

    mysql的數據類型
    1)數值型
    整數型  tinyint(1字節)、smallint(2字節)、mediumint(3字節)、int(4字節)、bigint(8字節)
    小數型  浮點(小數點浮動,精度有限,會丟失精度) float、double  定點(小數點固定,精度固定,不會丟失精度) decimal      
    SQL中數值類型默認都是有符號的,當需要使用無符號數據,需要給數據類型限定如: int unsigned
    浮點型數據是一種精度型數據,因爲超出指定範圍後,會丟失精度(四捨五入)
    float:單精度,佔4字節,精度範圍7位左右
    double:雙精度,佔8字節,精度範圍15位左右
    浮點的使用方法:直接float表示沒有小數部分,float(M,D) M表示總長度,D表示小數部分  
    浮點數的插入:整數部分不能超出長度,但小數部分可以超出(因爲系統會自動四捨五入)
    定點型:絕對保證整數部分不會被四捨五入(不會丟失精度),小數部分有可能丟失
    DECIMAL:變長,大致每9個數字,採用4字節存儲
    DECIMAL(M,D):M最大是65,D最大是30 默認是(10,2)
    定點數的插入:定點數的整數部分不能超出長度,小數部分可以超出長度,系統自動四捨五入
    2)時間日期類型
    datetime:時間日期格式'yyyy-mm-dd HH:ii:ss' 表示範圍從1000到9999
    date:日期 'yyyy-mm-dd'
    time:時間段 指定某個區間之間  -時間   +時間
    timestamp:時間戳,從1970年開始的 yyyy-mm-dd HH:ii:ss 格式和datetime完全一致
    時間出:只要當前所在記錄被更新,該字段一定會自動更新成當前時間
    3)字符串類型
    定長字符串
    char:表在定義結構的時候,就已經確定了最終數據的存儲長度
    char(L):L達標length,可以存儲的長度,單位爲字符,最大長度值可以爲255
    如:char(4):在utf8環境下,需要4*3=12個字節
    變長字符串
    varchar,在分配空間的時候,按照最大的空間分配,但實際上最終用了多少根據具體的數據來確定
    varchar(L):L表示字符長度,理論長度65536個字符,但是,假設分配的長度是100,實際存放的是5個,那怎麼取得5個字符,它會多出一個表示實際上存儲多少個字符的長度成員。但實際上,文本長度超過255,既不是用定長也不是用變長,使用text
    如何選擇定長或變長字符串?
    定長的磁盤空間比較浪費,但是效率高;變長的磁盤空間比較節省,但是效率低
    文本字符串
    如果數據量非常大,通常超過255,就會使用文本字符串
    文本字符串根據存儲的數據格式進行分類:text和blob
    text:存儲文字
    blob:存儲二進制



    列屬性
    列屬性:真正約束字段的數據類型,但是數據類型約束很單一,需要一些額外的約束更好的保證數據的合法性
    列屬性有:NULL/not null,default,primary key,unique,auto_increment,comment

    數據庫默認字段基本都是字段爲空,但實際開發中,儘可能保證字段不爲空,因爲數據爲空沒有辦法參與運算

    列描述
    列描述:comment,沒有實際含義,專門用來描述字段,會根據表創建語句保存,用來給程序員或DBA來進行了解
                


    默認值 default
    默認值:某一種數據會經常出現某個具體的值,可以在一開始就指定好,在需要真實數據時,用戶可以選擇的使用默認值
    數據在插入的時候不給字段賦值,就使用默認值
   

    主鍵 primary key
    用某個字段來唯一表示所有記錄時,設置主鍵。用來唯一的約束該字段裏面的數據,不能重複,不能爲空  一個表中最多只能有一個主鍵
    1.增加主鍵
    1)創建表的時候直接在字段上指定主鍵
            
    2)在創建表的時候,在所有字段之後
   
    3)當表創建好以後,可以再次追加主鍵
   
    主鍵約束:主鍵對應的字段不能重複,一旦重複,操作失敗
    刪除主鍵:alter table 表名 drop primary key;
   
    



    自增長
    自增長:當對應的字段,不給值,會自動的被系統觸發,系統會從當前字段中已經有的最大值+1操作,得到一個新的不同的值,通常和主鍵搭配使用,作爲邏輯主鍵
    自增長的特點:auto_increment
    1.任何一個字段要做自增長,前提是本身是一個索引(key一欄有值)
    2.自增字段必須是整數
    3.一張表最多只能有一個自增長
    


    唯一鍵
    一張表中往往有很多字段需要唯一性,數據不能重複,但是一張表中只能有一個主鍵:唯一鍵就能解決表中有多個字段需要唯一性約束的問題
    唯一鍵的本質和主鍵差不多,唯一鍵允許爲空,而且可以多個爲空,空字段不做唯一性比較
    增加唯一鍵
    
    

    索引
    索引:系統根據某種算法,將已有的數據(未來可能新增的數據),單獨建立一個文件:文件能夠實現快速的匹配數據,並且能夠快速的找到對應的記錄。
    索引的意義:1.提升查詢數據的效率     2.約束數據的有效性(唯一性等)
    增加索引的前提條件:索引本身會產生索引文件(有時可能比數據文件還大),非常海飛磁盤空間
    如果某個字段經常作爲查詢字段,可以爲該字段建立索引
    如果某個字段需要進行數據的有效性約束,也需要使用索引(主鍵,唯一性)
    mysql中提供了多種索引:
    1.主鍵索引:primary key
    2.唯一索引:quique
    3.普通索引:index
    4.全局索引
    創建索引:create index index_name on tbl_name (index_col_name,...);
      
     
    索引的使用原則:
    1.在大表上建立索引纔有意義
    2.在where子句或是連接條件上經常使用的列上建立索引
    3.索引的層次不要超過4層
    索引的缺點
    1.建立索引,系統要佔用大約爲表的1.2倍的硬盤和內存空間來保存索引
    2.更新數據的時候,系統必須用額外的時間來對索引進行更新


    關係
    將實體與實體的關係反應到最終數據庫表的設計上,將表與表的關係分成三種:1對1,1對多,多對多
    一對一:一張表的一條記錄一定只能在另外一張表的一條記錄進行對應,反之亦然
    一對多:一張表中有一條記錄可以對應另外一張表中的多條記錄,但是反過來,另外一張表中的一條記錄只能對應第一張表的一條記錄,這種關係就是一對多
    多對多:一張表(A)中的一條記錄能夠對應另外一張表(B)中的多條記錄;同時B表中的一條記錄也能夠對應A表中的多條記錄,多對多的關係


    範式
    範式:Normal Format是離散數學上的概念,爲了解決一種數據的存儲與優化的問題,保證數據在存儲之後,凡是能夠通過關係尋找出來的,堅決不再重複存儲,終極目標是減少數據冗餘
    範式:是一種分層結構的規範,分爲6層,每一層比上一層更加嚴格,若要滿足下一層範式,前提是滿足上一層範式
    六層範式:1NF,2NF...6NF    1NF是最底層,要求最低,6NF是最高層,最嚴格
    範式在數據庫的設計中具有指導意義,但不是強制規範
    1NF:指數據庫表的每一列都是不可分割的基本數據項,同一列中不能有多個值,即實體中的某個屬性不能有多個值或者不能有重複的屬性
    2NF:是對記錄的唯一性約束,要求記錄有唯一標識
    3NF:要滿足第三範式,必須滿足第二範式。  第三範式,理論上說,應該一張表中的所有字段都依賴主鍵(邏輯主鍵除外),如果表設計中存在一個字段,並不直接依賴主鍵,而是通過某個非主鍵字段依賴,最終實現依賴主鍵:把這種不是直接依賴主鍵,而是依賴非主鍵字段關係稱之爲依賴傳遞。第三範式就是要解決傳遞依賴的問題


    數據的高級操作
    數據操作:增刪改查

    新增數據
    基本語法   insert into 表名 [(字段列表)] values(值列表);
    在數據插入的時候,假設主鍵對應的值已經存在:插入失敗
    主鍵衝突
    當主鍵存在衝突的時候(duplicate key),可以選擇性的進行處理:更新或替換
    1.主鍵衝突:更新操作
     insert into 表名(字段列表) values(值列表)on duplicate key update 字段=新值;
    
    
    2.主鍵衝突:替換
    replace into 表名(包含字段) values(值列表);  主鍵如果沒有衝突,就直接插入
    
    


    蠕蟲複製
    蠕蟲複製:從已有的數據中獲取數據,然後將數據又進行新增操作,將數據成倍增加
    表創建,從已有表創建新表(複製表結構,不復制數據)
    create table 表名 like 數據庫.表名;
    
    蠕蟲複製:先查出數據,然後將查出的數據新增一遍
    insert into 表名[(字段列表)] select 字段列表/* from 數據表名;
    
                 
       
    蠕蟲複製的意義:
    1.從已有表中拷貝數據到新表中
    2.可以迅速的讓表中的數據膨脹到一定的數量級,用來測試表的壓力及效率


    更新數據
    基本語法   update 表名 set 字段=值 [where 條件];
    高級新增語法  表名 set 字段=值 [where 條件] [limit 更新數量];
    


    刪除數據
    通過limit來限制刪除數量
    delete  from 表名 [where 條件] [limit 數量];
    
    如果表中存在主鍵自增長,當刪除後,自增長並不會還原,繼續按照原來的值增長
    思路:數據的刪除不會改變表結構,只能刪除表後,重建表
    truncate 表名;   --先刪除該表,後新增該表  清空表後
    
    

    查詢數據
    完整語法  select [select選項] 字段列表[字段別名]/* from 數據源 [where 條件] [group by 子句] [having 子句] [order by 子句] [limit 子句];
    slelect選項:select 對查出來的結果進行處理方式
                 all:默認的,保留所有結果
                 distinct:去重,查出來的結果,將重複(所有的字段都相同)結果去重
    
                 
       
    字段別名:當數據查詢出來的時候,有時候名字不一定滿足需求(多表查詢時,會有同名字段),需要對字段進行重命名,就叫別名
    語法
    字段名 [as] 別名    
               
    數據源
    數據的來源,關係型數據庫的來源都是數據表,本質上只要保證數據類似二維表,最終都可以作爲數據源
    數據源分爲多種:單表數據源,多表數據源,查詢語句
    從一張表中取出一條記錄,去另外一張表中匹配所有記錄,並且全部保留(記錄和字段),將這種結果稱爲:笛卡爾積
    子查詢:數據的來源是一條查詢語句(查詢的結果是二維表)
    select * from (select 語句) as 表名;
   

    where子句
    where子句用來判斷數據,篩選數據
    where子句返回結果,0或者1,0表示false,1表示true
    判斷條件:比較運算符:>,<,>=,<=,!=,<>,=,like,between and,in ,not in
              邏輯運算:&&   ||   !
    where原理:where是唯一一個直接從磁盤獲取數據的時候就開始判斷條件,從磁盤取出一條記錄,開始進行where判斷,判斷的結果如果成立就保存到內存,如果失敗就直接放棄
    select * from 表名 where 1;  表示所有條件都滿足
    

    group by 子句
    分組的意思:根據某個字段進行分組(相同的放一組,不同的分到不同的組)
    基本語法:group by 字段名;
    
    分組的意義是爲了統計數據(按組統計:按分組字段進行統計)
    SQL提供了一系列統計函數:count():統計分組後的記錄數,每一組多少條記錄
                             max():統計分組後,每組中的最大值
                             min():統計分組後,每組中的最小值
                             avg():統計分組後,每組中的平均值
                             sum():統計分組後,每組的和
    分組後自動排序:根據分組字段排序,默認是升序
    group by 字段[asc|desc];對分組的結果合併後的整體進行排序

    having 子句
    與where子句一樣,進行條件判斷
    where是針對磁盤數據進行判斷,進入內存之後會進行分組操作,分組結果需要having來處理

    order by 子句
    order by:排序,根據某個字段進行升序或降序排序
    基本語法: order by 字段名1,字段名2... [asc|desc]

    limit 子句
    1.limit 數量;  子句限制數據量
    2.limit 起始位置,長度;  經常用於分頁
    

    連接查詢
    連接查詢:將多張表(可以大於2張)記錄進行記錄的連接(按照某個指定的條件進行數據拼接)
    連接查詢的意義:在用戶查看數據的時候,需要顯示的數據來自多張表
    連接查詢分類:SQL中連接查詢分爲:內連接,外鏈接,自然連接和交叉連接

    交叉連接:cross join,從一張表中循環取出每一條記錄,每條記錄都從另外一張表中匹配,匹配一定保留,而連接本身字段會增加,最終形成的結果叫笛卡爾積
    基本語法:左表 cross join 右表;<----> from 左表,右表;
    select * from dept cross join dept;
    dept cross join dept是數據源。笛卡爾積沒有意義,所以交叉連接沒用,交叉連接存在的價值,保證連接結果的完整性
  
    內連接
    內連接:[inner] join,從左表中取每一條記錄,去右表中與所有的記錄進行匹配,匹配必須是某個條件在左表中與右表相同最終纔會保留結果,否則不保留
    基本語法:左表 [inner] join 右表 on 左表.字段=右表.字段
    on表示連接條件,條件字段就是代表相同業務含義
    字段別名以及表別名的使用,在查詢數據的時候,不同表有同名字段,這個時候需要加上表名才能區分,而表名太長,通常可以使用別名

    外連接
    外連接:outer join,以某張表爲主,取出裏面的所有記錄,然後每條與例外一張表進行連接;不管能不能匹配上條件,最終都會保留,能匹配正確保留,不能匹配,就將其他表中的字段都置爲NULL
    外連接分爲兩種:是已某張表爲主:有主表
                    left join:左外連接,以左表爲主表
                    right join:右外連接,以右表爲主表
    基本語法:左表 left/right join 右表 on 左表.字段=右表.字段;

    自然連接
    自然連接:natural join,自然連接就是自動匹配連接條件:系統以字段名字作爲匹配模式,同名字段就作爲條件,多個同名字段都作爲條件
    自然連接:分爲自然內連接和自然外連接
    select * from EMP natural join DEPT;--比較出EMP和DEPT中的同名字段相等的匹配出來,連接之後會合並同名字段
    基本上不用自然連接

    外鍵
    如果一個實體的某個字段,指向另外一個實體的主鍵,就稱這個實體的這個字段爲另外一個實體的外鍵
    基本語法:foregin key (本表字段) references 主鍵表(主鍵字段);

    級聯操作
    on update 主表更新時,從表的外鍵才做出相應的改變
    on delete 刪除時,從表的外鍵才做出相應的改變
    on後面表示級聯操作:在主表發生變化時,與之關聯的從表數據如何處理
    cascade,如果主表被刪除或更新,從表就做出相應的操作
    set null,設置爲null,表示從表不指向任何主表的記錄
    restrict,拒絕主表相關的操作


    視圖
    視圖是一個虛擬的表,其內容由查詢定義,視圖並不實際存在,行和列有定義視圖的查詢所引用的表
    創建視圖: create view 視圖名 ;
    刪除視圖: drop view 視圖名;
    視圖和表的區別:
    1.表要佔用磁盤空間,視圖不需要
    2.視圖不能添加索引
    3.使用視圖可以簡化查詢
    4.視圖可以提高安全性


    事務
    事務用於保證數據的一致性
    SQL執行分成兩步:1.執行階段  2.將結果提交到數據庫
    如果用戶選擇提交數據纔將數據提交到數據庫。默認是自動提交,關閉自動提交
    set autocommit=0;
    1.開啓事務:告訴系統一下寫操作不要直接寫入數據表,先存放到事務日誌
    start transction 提交失敗時回到start狀態
    2.進行事務操作,一些列操作
    3.提交事務或回滾事務
    commit    rollback


    變量定義
    1.set @name:='張三';    select @name;
    MYSQL中允許從表中獲取數據,然後賦值給變量
    select @變量:=字段名 from 數據源;    --從字段中取值賦給變量
    select 字段名 from 數據源 into @變量;

    2.declare 變量名 類型 [default 默認值];
    說明:1.它必須先定義     2.賦值 set 變量:=值;   3.它只能在編程環境下使用
    編程環境:存儲過程,函數,觸發器

    if判斷
    --單分支
    if 條件 then
       --代碼
    end if;

    --雙分支
    if 條件 then
       --代碼1
    else
       --代碼2
    end if;

    --多分支
    if 條件 then
       --代碼1
    elseif 條件 then
       --代碼2
    else
       --代碼3
    end if;
    存儲過程:類似函數,把一段代碼封裝起來,當要執行這段代碼時,調用存儲過程來實現
    語法:create procedure 過程名(參數,...)
          begin
               --代碼
          end‘’
    例:接收4個數字,如果輸入1則輸出spring,2summer,3autumn,4winter,輸入其他出錯
    
                  
       

   case判斷
    case 變量
    when 值 then 語句;
    when 值 then 語句;
    else 語句;
    end case;
    例:接收4個數字,如果輸入1則輸出spring,2summer,3autumn,4winter,輸入其他出錯
    
    
    

    循環
    MYSQL支持的循環有loop,while,repeat循環
    (1)loop循環
    標籤名:loop 
           leave 標籤名  --退出循環
           end loop;
    例:使用loop循環,計算1到n的和
    
    
        

    (2)while循環
    while 條件 do
          --代碼
    end while;
    例:使用while循環,計算1到n的和
    
    
    
       

    (3)repeat循環
    repeat
      --代碼
    until 條件 end repeat;
    例:使用repeat循環,計算1到n的和
    
    
          

    觸發器
    事先爲某張表綁定好一段代碼,當表中的某些內容發生改變時(增刪改)系統會自動觸發代碼
    觸發器:事件類型,觸發時間,觸發對象
    事件類型:增刪改
    觸發時間:before和after
    觸發對象:表中的每一行記錄

    創建觸發器:
    delimiter 自定義符號;後序代碼中只有碰到自定義符號纔算結束
    基本語法:
         create trigger 觸發器名字 觸發時間 事件類型 on 表名 for each row
         begin  --代表左括號
                --裏面是觸發器的內容,每行內容必須使用;結束
         end
     delimiter ;


    存儲過程
    存儲過程簡稱爲過程(procedure),是一種沒有返回值的函數
    創建存儲過程
        delimiter $$
        create procedure 過程名字([參數列表])
        begin
          --過程體
        end$$
        delimiter ;
    說明:(1)存儲過程中,可以有各種編程元素:變量,流程控制,函數調用
          (2)還可以有:增刪改查各種sql語句
          (3)其中select會作爲存儲過程之後的結果集返回
          (4)形參可以設定數據的進出方向
    查看存儲過程:show procedure status\G
    調用過程:call 過程名();
    刪除過程:drop procedure 名字;
   
    存儲過程參數
    過程的類型限定:
    in:數據只是從外部傳遞給內部使用(值傳遞),可以是數值也可以是變量,缺省是in
    Out:不允許過程內部使用(不用外部數據),給外部使用(引用傳遞,外部數據會被先清空纔會進入內部)
    inout:外部數據可以在內部使用,內部修改也可以給外部使用
    基本使用:
    create procedure 過程名(in 形參名字 數據類型,out 形參名字 數據類型,inout 形參名字 數據類型)
    begin
       ...
    end

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