MySQL基礎第三課

回顧

   

字段類型(列類型): 數值型, 時間日期型和字符串類型php

   

數值型: 整型和小數型(浮點型和定點型)算法

時間日期型: datetime, date,time,timestamp, yearsql

字符串類型: 定長, 變長, 文件字符串(text和blob), 枚舉和集合數據庫

Mysql記錄長度: 65535個字節, varchar達不到理論長度, NULL佔用一個字節, text文本不佔用記錄長度(可是自己佔據十個字節)服務器

   

字段屬性: 空屬性, 列描述, 默認值ide

 

 

字段屬性

主鍵, 惟一鍵和自增加.函數

   

主鍵

主鍵: primary key,主要的鍵. 一張表只能有一個字段可使用對應的鍵, 用來惟一的約束該字段裏面的數據, 不能重複: 這種稱之爲主鍵.測試

一張表只能有最多一個主鍵.優化

   

增長主鍵

SQL操做中有多種方式能夠給表增長主鍵: 大致分爲三種.spa

   

方案1: 在建立表的時候,直接在字段以後,跟primary key關鍵字(主鍵自己不容許爲空)

-- 增長主鍵
create table my_prim1(
name varchar(20) not null comment '姓名',
number char(10) primary key comment '學號: itcast + 0000, 不能重複'
)charset utf8;
View Code

 

優勢: 很是直接; 缺點: 只能使用一個字段做爲主鍵

   

方案2: 在建立表的時候, 在全部的字段以後, 使用primary key(主鍵字段列表)來建立主鍵(若是有多個字段做爲主鍵,能夠是複合主鍵)

-- 複合主鍵
create table my_pri2(
number char(10) comment '學號: itcast + 0000',
course char(10) comment '課程代碼: 3901 + 0000',
score tinyint unsigned default 60 comment '成績',
-- 增長主鍵限制: 學號和課程號應該是對應的,具備惟一性
primary key(number,course)
)charset utf8;
View Code

 

方案3: 當表已經建立好以後, 額外追加主鍵: 能夠經過修改表字段屬性, 也能夠直接追加。

alter table 表名 add primary key(字段列表);

   

前提: 表中字段對應的數據自己是獨立的(不重複)

   

主鍵約束

主鍵對應的字段中的數據不容許重複: 一旦重複,數據操做失敗(增和改)

   

更新主鍵 & 刪除主鍵

沒有辦法更新主鍵: 主鍵必須先刪除,才能增長.

   

Alter table 表名 drop primary key;

   

主鍵分類

在實際建立表的過程當中, 不多使用真實業務數據做爲主鍵字段(業務主鍵,如學號,課程號); 大部分的時候是使用邏輯性的字段(字段沒有業務含義,值是什麼都沒有關係), 將這種字段主鍵稱之爲邏輯主鍵.

   

Create table my_student(

Id int primary key auto_increment comment '邏輯主鍵: 自增加',    -- 邏輯主鍵

Number char(10) not null comment '學號',

Name varchar(10) not null

)

   

 

自增加

自增加: 當對應的字段,不給值,或者說給默認值,或者給NULL的時候, 會自動的被系統觸發, 系統會從當前字段中已有的最大值再進行+1操做,獲得一個新的不一樣的字段.

   

自增加一般是跟主鍵搭配.

   

新增自增加

自增加特色: auto_increment

  1. 任何一個字段要作自增加必須前提是自己是一個索引(key一欄有值)

  2.自增加字段必須是數字(整型)

  3.一張表最多隻能有一個自增加

 

 

自增加使用

當自增加被給定的值爲NULL或者默認值的時候會觸發自動增加.

自增加若是對應的字段輸入了值,那麼自增加失效: 可是下一次仍是可以正確的自增加(從最大值+1)

如何肯定下一次是什麼自增加呢? 能夠經過查看錶建立語句看到.

以下圖:AUTO_INCREMENT=8 即表示該自增加的下一個值爲8

修改自增加

自增加若是是涉及到字段改變: 必須先刪除自增加,後增長(一張表只能有一個自增加)

修改當前自增加已經存在的值: 修改只能比當前已有的自增加的最大值大,不能小(小不生效)

Alter table 表名 auto_increment = 值;

向上修改能夠

思考: 爲何自增加是從1開始?爲何每次都是自增1呢?

全部系統的變量(如字符集,校對集)都是由系統內部的變量進行控制的.

查看自增加對應的變量: show variables like 'auto_increment%';

能夠修改變量實現不一樣的效果: 修改是對整個數據修改,而不是單張表: (修改是會話級)

會話級:表示只對當前本次有效,關閉了數據庫鏈接以後,就失效了

Set auto_increment_increment = 5; -- 一次自增5

測試效果: 自動使用自增加

刪除自增加

自增加是字段的一個屬性: 能夠經過modify來進行修改(保證字段沒有auto_increment便可)

Alter table 表名 modify 字段 類型;

惟一鍵

一張表每每有不少字段須要具備惟一性,數據不能重複: 可是一張表中只能有一個主鍵: 惟一鍵(unique key)就能夠解決表中有多個字段須要惟一性約束的問題.

惟一鍵的本質與主鍵差很少: 惟一鍵默認的容許自動爲空,並且能夠多個爲空(空字段不參與惟一性比較)

增長惟一鍵

基本與主鍵差很少: 三種方案

方案1: 在建立表的時候,字段以後直接跟unique/ unique key

方案2: 在全部的字段以後增長unique key(字段列表); -- 複合惟一鍵

方案3: 在建立表以後增長惟一鍵

惟一鍵約束

惟一鍵與主鍵本質相同: 惟一的區別就是惟一鍵默認容許爲空,並且是多個爲空.

若是惟一鍵也不容許爲空: 與主鍵的約束做用是一致的.

更新惟一鍵 & 刪除惟一鍵

更新惟一鍵: 先刪除後新增(惟一鍵能夠有多個: 能夠不刪除).

刪除惟一鍵

Alter table 表名 drop unique key; -- 錯誤: 惟一鍵有多個

Alter table 表名 drop index 索引名字; -- 惟一鍵默認的使用字段名做爲索引名字

索引

幾乎全部的索引都是創建在字段之上.

索引: 系統根據某種算法, 將已有的數據(將來可能新增的數據),單獨創建一個文件: 文件可以實現快速的匹配數據, 而且可以快速的找到對應表中的記錄.

索引的意義

 

  1. 提高查詢數據的效率
  2. 約束數據的有效性(惟一性等)

    增長索引的前提條件: 索引自己會產生索引文件(有時候有可能比數據文件還大) ,會很是耗費磁盤空間.

    若是某個字段須要做爲查詢的條件常用, 那麼可使用索引(必定會想辦法增長);

    若是某個字段須要進行數據的有效性約束, 也可能使用索引(主鍵,惟一鍵)

    Mysql中提供了多種索引

  3. 主鍵索引: primary key
  4. 惟一索引: unique key
  5. 全文索引: fulltext index
  6. 普通索引: index

    全文索引: 針對文章內部的關鍵字進行索引

    全文索引最大的問題: 在於如何肯定關鍵字

    英文很容易: 英文單詞與單詞之間有空格

    中文很難: 沒有空格, 並且中文能夠各類隨意組合(分詞: sphinx)

    關係

    將實體與實體的關係, 反應到最終數據庫表的設計上來: 將關係分紅三種: 一對一, 一對多(多對一)和多對多.

    全部的關係都是指的表與表之間的關係.

    一對一

    一對一: 一張表的一條記錄必定只能與另一張表的一條記錄進行對應; 反之亦然.

    學生表: 姓名,性別,年齡,身高,體重,婚姻情況, 籍貫, 家庭住址,緊急聯繫人

Id(P) 

姓名 

性別

年齡 

體重 

身高 

婚姻 

籍貫 

住址 

聯繫人 

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

   

表設計成以上這種形式: 符合要求. 其中姓名,性別,年齡,身高,體重屬於經常使用數據; 可是婚姻,籍貫,住址和聯繫人屬於不經常使用數據. 若是每次查詢都是查詢全部數據,不經常使用的數據就會影響效率, 實際又不用.

   

解決方案: 將經常使用的和不經常使用的信息分離存儲,分紅兩張表

經常使用信息表

Id(P) 

姓名 

性別 

年齡 

體重 

身高 

  

  

  

  

  

  

  

  

  

  

  

   

不經常使用信息表: 保證不經常使用信息與經常使用信息必定可以對應上: 找一個具備惟一性(肯定記錄)的字段來共同鏈接兩張表

Id(P) 

婚姻 

籍貫 

住址 

聯繫人 

  

  

  

  

  

  

  

  

   

一個經常使用表中的一條記錄: 永遠只能在一張不經常使用表中匹配一條記錄;反過來,一個不經常使用表中的一條記錄在經常使用表中也只能匹配一條記錄: 一對一的關係

   

一對多

一對多: 一張表中有一條記錄能夠對應另一張表中的多條記錄; 可是返回過, 另一張表的一條記錄只能對應第一張表的一條記錄. 這種關係就是一對多或者多對一.

   

母親與孩子的關係: 母親,孩子兩個實體

媽媽表

ID(P) 

名字 

年齡 

性別 

  

  

  

  

  

  

  

  

   

孩子表

ID(P) 

名字 

年齡 

性別 

  

  

  

  

  

  

  

  

   

以上關係: 一個媽媽能夠在孩子表中找到多條記錄(也有多是一條); 可是一個孩子只能找到一個媽媽: 是一種典型的一對多的關係.

   

可是以上設計: 解決了實體的設計表問題, 可是沒有解決關係問題: 孩子找不出媽,媽也找不到孩子.

   

解決方案: 在某一張表中增長一個字段,可以找到另一張表的中記錄: 應該在孩子表中增長一個字段指向媽媽表: 由於孩子表的記錄只能匹配到一條媽媽表的記錄.

   

媽媽表

ID(P) 

名字 

年齡

性別 

  

  

  

  

  

  

  

  

   

孩子表

ID(P) 

名字 

年齡 

性別 

媽媽ID

  

  

  

  

媽媽表主鍵 

  

  

  

  

  

   

   

多對多

多對多: 一張表中(A)的一條記錄可以對應另一張表(B)中的多條記錄; 同時B表中的一條記錄也能對應A表中的多條記錄: 多對多的關係

   

老師教學: 老師和學生

老師表

T_ID(P) 

姓名 

性別 

男 

女 

   

學生表

S_ID(P) 

姓名 

性別 

張三 

男 

小芳 

女 

   

以上設計方案: 實現了實體的設計, 可是沒有維護實體的關係.

一個老師教過多個學生; 一個學生也被多個老師教過.

   

解決方案: 在學生表中增長老師字段: 無論在哪張表中增長字段, 都會出現一個問題: 該字段要保存多個數據, 並且是與其餘表有關係的字段, 不符合表設計規範: 增長一張新表: 專門維護兩張表之間的關係

老師表

T_ID(P) 

姓名 

性別 

男 

女 

   

學生表

S_ID(P) 

姓名 

性別 

張三 

男 

小芳 

女 

   

中間關係表: 老師與學生的關係

ID 

T_ID(老師)

S_ID(學生)

4

  

  

   

增長中間表以後: 中間表與老師表造成了一對多的關係: 並且中間表是多表,維護了可以惟一找到一表的關係; 一樣的,學生表與中間表也是一個一對多的關係: 一對多的關係能夠匹配到關聯表之間的數據.

   

學生找老師: 找出學生id -> 中間表尋找匹配記錄(多條) -> 老師表匹配(一條)

老師找學生: 找出老師id -> 中間表尋找匹配記錄(多條) -> 學生表匹配(一條)

   

   

範式

範式: Normal Format, 是一種離散數學中的知識, 是爲了解決一種數據的存儲與優化的問題: 保存數據的存儲以後, 凡是可以經過關係尋找出來的數據,堅定再也不重複存儲: 終極目標是爲了減小數據的冗餘.

   

範式: 是一種分層結構的規範, 分爲六層: 每一次層都比上一層更加嚴格: 若要知足下一層範式,前提是知足上一層範式.

   

六層範式: 1NF,2NF,3NF...6NF, 1NF是最底層,要求最低;6NF最高層,最嚴格.

   

Mysql屬於關係型數據庫: 有空間浪費: 也是致力於節省存儲空間: 與範式全部解決的問題不謀而合: 在設計數據庫的時候, 會利用到範式來指導設計.

可是數據庫不單是要解決空間問題,要保證效率問題: 範式只爲解決空間問題, 因此數據庫的設計又不可能徹底按照範式的要求實現: 通常狀況下,只有前三種範式須要知足.

   

範式在數據庫的設計當中是有指導意義: 可是不是強制規範.

   

1NF

第一範式: 在設計表存儲數據的時候, 若是表中設計的字段存儲的數據,在取出來使用以前還須要額外的處理(拆分),那麼說表的設計不知足第一範式: 第一範式要求字段的數據具備原子性: 不可再分.

   

講師代課表

講師

性別

班級

教室

代課時間

代課時間(開始,結束)

朱元璋

Male

php0226

D302

30天

2014-02-27,2014-05-05

朱元璋

Male

php0320

B206

30天

2014-03-21,2014-05-30

李世民

Male

php0320

B206

15天

2014-06-01,2014-06-20

   

上表設計不存在問題: 可是若是需求是將數據查出來以後,要求顯示一個老師從何時開始上課,到何時節課: 須要將代課時間進行拆分: 不符合1NF, 數據不具備原子性, 能夠再拆分.

   

解決方案: 將代課時間拆分紅兩個字段就解決問題.

   

2NF

第二範式: 在數據表設計的過程當中,若是有複合主鍵(多字段主鍵), 且表中有字段並非由整個主鍵來肯定, 而是依賴主鍵中的某個字段(主鍵的部分): 存在字段依賴主鍵的部分的問題, 稱之爲部分依賴: 第二範式就是要解決表設計不容許出現部分依賴.

   

講師帶課表

   

以上表中: 由於講師沒有辦法做爲獨立主鍵, 須要結合班級才能做爲主鍵(複合主鍵: 一個老師在一個班永遠只帶一個階段的課): 代課時間,開始和結束字段都與當前的代課主鍵(講師和班級): 可是性別並不依賴班級, 教室不依賴講師: 性別只依賴講師, 教室只依賴班級: 出現了性別和教室依賴主鍵中的一部分: 部分依賴.不符合第二範式.

   

解決方案1: 能夠將性別與講師單獨成表, 班級與教室也單獨成表.

解決方案2: 取消複合主鍵, 使用邏輯主鍵

   

ID = 講師 + 班級(業務邏輯約束: 複合惟一鍵)

   

   

3NF

要知足第三範式,必須知足第二範式.

   

第三範式: 理論上講,應該一張表中的全部字段都應該直接依賴主鍵(邏輯主鍵: 表明的是業務主鍵), 若是表設計中存在一個字段, 並不直接依賴主鍵,而是經過某個非主鍵字段依賴,最終實現依賴主鍵: 把這種不是直接依賴主鍵,而是依賴非主鍵字段的依賴關係稱之爲傳遞依賴. 第三範式就是要解決傳遞依賴的問題.

   

講師帶課表

   

以上設計方案中: 性別依賴講師存在, 講師依賴主鍵; 教室依賴班級,班級依賴主鍵: 性別和教室都存在傳遞依賴.

   

解決方案: 將存在傳遞依賴的字段,以及依賴的字段自己單獨取出,造成一個單獨的表, 而後在須要對應的信息的時候, 使用對應的實體表的主鍵加進來.

講師代課表

講師表                                    班級表

   

講師表: ID = 講師                        班級表中: ID = 班級

   

逆規範化

   

有時候, 在設計表的時候,若是一張表中有幾個字段是須要從另外的表中去獲取信息. 理論上講, 的確能夠獲取到想要的數據, 可是就是效率低一點. 會刻意的在某些表中,不去保存另外表的主鍵(邏輯主鍵), 而是直接保存想要的數據信息: 這樣一來,在查詢數據的時候, 一張表能夠直接提供數據, 而不須要多表查詢(效率低), 可是會致使數據冗餘增長.

   

如講師代課信息表

   

逆規範化: 磁盤利用率與效率的對抗

   

   

數據高級操做

數據操做: 增刪改查

   

新增數據

基本語法

Insert into 表名 [(字段列表)] values (值列表);

   

在數據插入的時候, 假設主鍵對應的值已經存在: 插入必定會失敗!(由於主鍵值的惟一性)

   

主鍵衝突

當主鍵存在衝突的時候(Duplicate key),能夠選擇性的進行處理: 更新和替換

   

主鍵衝突: 更新操做

Insert into 表名[(字段列表:包含主鍵)] values(值列表) on duplicate key update 字段 = 新值;

   

主鍵衝突: 替換

Replace into 表名 [(字段列表:包含主鍵)] values(值列表);

   

蠕蟲複製

蠕蟲複製: 從已有的數據中去獲取數據,而後將數據又進行新增操做: 數據成倍的增長.

   

表建立高級操做: 從已有表建立新表(複製表結構)

Create table 表名 like 數據庫.表名;

   

蠕蟲複製: 先查出數據, 而後將查出的數據新增一遍

Insert into 表名[(字段列表)] select 字段列表/* from 數據表名;

   

蠕蟲複製的意義

  1. 從已有表拷貝數據到新表中(也能夠從本身的表中複製數據到本身表中,也就是自我複製,可是複製的時候不要複製主鍵,由於這會引發主鍵衝突)
  2. 能夠迅速的讓表中的數據膨脹到必定的數量級: 測試表的壓力以及效率

       

       

     

    更新數據

     

    基本語法

    Update 表名 set 字段 = 值 [where條件];

       

    高級新增語法

    Update 表名 set 字段 = 值 [where條件] [limit 更新數量];

       

     

    刪除數據

     

    與更新相似: 能夠經過limit來限制數量

    Delete from 表名 [where條件] [limit 數量];

       

    刪除: 若是表中存在主鍵自增加,那麼當刪除以後, 自增加不會還原

       

    思路: 數據的刪除是不會改變表結構, 只能刪除表後重建表

    Truncate 表名;    -- 先刪除改變,後新增改變

       

     

    查詢數據

     

    基本語法

    Select 字段列表/* from 表名 [where條件];

       

    完整語法

    Select [select選項] 字段列表[字段別名]/* from 數據源 [where條件子句] [group by子句] [having子句] [order by子句] [limit 子句];

       

     

    Select選項

     

    Select選項: select對查出來的結果的處理方式

    All: 默認的,保留全部的結果

    Distinct: 去重, 查出來的結果,將重複給去除(全部字段都相同)

       

     

    字段別名

     

    字段別名: 當數據進行查詢出來的時候, 有時候名字並必定就知足需求(多表查詢的時候, 會有同名字段). 須要對字段名進行重命名: 別名

       

    語法

    字段名 [as] 別名;

       

       

     

    數據源

     

    數據源: 數據的來源, 關係型數據庫的來源都是數據表: 本質上只要保證數據相似二維表,最終均可以做爲數據源.

       

    數據源分爲多種: 單表數據源, 多表數據源, 查詢語句

       

    單表數據源: select * from 表名;

       

    多表數據源: select* from 表名1,表名2...;

    從一張表中取出一條記錄,去另一張表中匹配全部記錄,並且所有保留:(記錄數和字段數),將這種結果成爲: 笛卡爾積(交叉鏈接): 笛卡爾積沒什麼卵用, 因此應該儘可能避免.

       

    子查詢: 數據的來源是一條查詢語句(查詢語句的結果是二維表)

    Select * from (select 語句) as 表名;

       

       

     

    Where子句

     

    Where子句: 用來判斷數據,篩選數據.

    Where子句返回結果: 0或者1, 0表明false,1表明true.

       

    判斷條件:

    比較運算符: >, <, >=, <= ,!= ,<>, =, like, between and, in/not in

    邏輯運算符: &&(and), ||(or), !(not)

       

    Where原理: where是惟一一個直接從磁盤獲取數據的時候就開始判斷的條件: 從磁盤取出一條記錄, 開始進行where判斷: 判斷的結果若是成立保存到內存;若是失敗直接放棄.

       

       

    條件查詢1: 要求找出學生id爲1或者3或者5的學生

       

    條件查詢2: 查出區間落在180,190身高之間的學生:

       

    Between自己是閉區間; between左邊的值必須小於或者等於右邊的值

       

     

    Group by子句

     

    Group by:分組的意思, 根據某個字段進行分組(相同的放一組,不一樣的分到不一樣的組)

       

    基本語法: group by 字段名;

       

    分組的意思: 是爲了統計數據(按組統計: 按分組字段進行數據統計)

    SQL提供了一系列統計函數

    Count(): 統計分組後的記錄數: 每一組有多少記錄

    Max():    統計每組中最大的值

    Min(): 統計最小值

    Avg(): 統計平均值

    Sum(): 統計和

       

    Count函數: 裏面可使用兩種參數: *表明統計記錄,字段名錶明統計對應的字段(NULL不統計)

       

       

    分組會自動排序: 根據分組字段:默認升序

    Group by 字段 [asc|desc];    -- 對分組的結果合併以後的整個結果進行排序

       

    多字段分組: 先根據一個字段進行分組,而後對分組後的結果再次按照其餘字段進行分組

       

    有一個函數: 能夠對分組的結果中的某個字段進行字符串鏈接(保留該組全部的某個字段): group_concat(字段);

       

    回溯統計: with rollup: 任何一個分組後都會有一個小組, 最後都須要向上級分組進行彙報統計: 根據當前分組的字段. 這就是回溯統計: 回溯統計的時候會將分組字段置空.

       

    多字段回溯: 考慮第一層分組會有此回溯: 第二次分組要看第一次分組的組數, 組數是多少,回溯就是多少,而後加上第一層回溯便可.

       

     

    Having子句

     

    Having子句: 與where子句同樣: 進行條件判斷的.

       

    Where是針對磁盤數據進行判斷: 進入到內存以後,會進行分組操做: 分組結果就須要having來處理.

       

    Having能作where能作的幾乎全部事情, 可是where卻不能作having能作的不少事情.

       

  3. 分組統計的結果或者說統計函數都只有having可以使用.

  4. Having可以使用字段別名: where不能: where是從磁盤取數據,而名字只多是字段名: 別名是在字段進入到內存後纔會產生.

       

     

    Order by子句

     

    Order by: 排序, 根據某個字段進行升序或者降序排序, 依賴校對集.

       

    使用基本語法

    Order by 字段名 [asc|desc]; -- asc是升序(默認的),desc是降序

       

    排序能夠進行多字段排序: 先根據某個字段進行排序, 而後排序好的內部,再按照某個數據進行再次排序:

       

       

     

    Limit子句

     

    Limit子句是一種限制結果的語句: 限制數量.

       

    Limit有兩種使用方式

       

    方案1: 只用來限制長度(數據量): limit 數據量;

       

    方案2: 限制起始位置,限制數量: limit 起始位置,長度;

       

    Limit方案2主要用來實現數據的分頁: 爲用戶節省時間,提交服務器的響應效率, 減小資源的浪費.

    對於用戶來說: 能夠點擊的分頁按鈕: 1,2,3,4

    對於服務器來說: 根據用戶選擇的頁碼來獲取不一樣的數據: limit offset,length;

       

    Length: 每頁顯示的數據量: 基本不變

    Offset: offset = (頁碼 - 1) * 每頁顯示量

 

對應sql腳本代碼:

-- 增長主鍵

 

create table my_pri1(

name varchar(20) not null comment '姓名',

number char(10) primary key comment '學號: itcast + 0000, 不能重複'

)charset utf8;

 

-- 複合主鍵

create table my_pri2(

number char(10) comment '學號: itcast + 0000',

course char(10) comment '課程代碼: 3901 + 0000',

score tinyint unsigned default 60 comment '成績',

-- 增長主鍵限制: 學號和課程號應該是個對應的,具備惟一性

primary key(number,course)

)charset utf8;

 

-- 追加主鍵

create table my_pri3(

course char(10) not null comment '課程編號: 3901 + 0000',

name varchar(10) not null comment '課程名字'

);

 

alter table my_pri3 modify course char(10) primary key comment '課程編號: 3901 + 0000';

alter table my_pri3 add primary key(course);

 

-- 向pri1表插入數據

insert into my_pri1 values('古學星','itcast0001'),('蔡仁灣','itcast0002');

insert into my_pri2 values('itcast0001','39010001',90),('itcast0001','39010002',85),('itcast0002','39010001',92);

 

-- 主鍵衝突(重複)

insert into my_pri1 values('劉輝','itcast0002'); -- 不能夠: 主鍵衝突

insert into my_pri2 values('itcast0001','39010001',100); -- 不能夠:衝突

 

-- 刪除主鍵

alter table my_pri3 drop primary key;

 

-- 自增加

create table my_auto(

id int primary key auto_increment comment '自動增加',

name varchar(10) not null

)charset utf8;

 

-- 觸發自增加

insert into my_auto(name) values('鄧立軍');

insert into my_auto values(null,'龔森');

insert into my_auto values(default,'張滔');

 

-- 指定數據

insert into my_auto values(6,'何思華');

insert into my_auto values(null,'陳少煉');

 

 

-- 修改表選項的值

alter table my_auto auto_increment = 4; -- 向下修改(小)

alter table my_auto auto_increment = 10; -- 向上修改

 

-- 查看自增加變量

show variables like 'auto_increment%';

 

-- 修改自增加步長

set auto_increment_increment = 5;

 

-- 插入記錄: 使用自增加

insert into my_auto values(null,'劉陽');

insert into my_auto values(null,'鄧賢師');

 

-- 刪除自增加

alter table my_auto modify id int primary key; -- 錯誤: 主鍵理論是單獨存在

alter table my_auto modify id int; -- 有主鍵的時候,千萬不要再加主鍵

 

-- 惟一鍵

create table my_unique1(

number char(10) unique comment '學號: 惟一,容許爲空',

name varchar(20) not null

)charset utf8;

 

create table my_unique2(

number char(10) not null comment '學號',

name varchar(20) not null,

-- 增長惟一鍵

unique key(number)

)charset utf8;

 

create table my_unique3(

id int primary key auto_increment,

number char(10) not null,

name varchar(20) not null)charset utf8;

 

-- 追加惟一鍵

alter table my_unique3 add unique key(number);

 

-- 插入數據

insert into my_unique1 values(null,'曾光'),('itcast0001','晁鬆'),(null,'李帥');

insert into my_unique1 values('itcast0001','周江');

 

-- 刪除惟一鍵

alter table my_unique3 drop index number;

 

-- 插入數據

insert into my_class values('PHP0810','B203');

insert into my_class values('PHP0810','B205');

insert into my_class values('PHP0710','B203');

 

-- 主鍵衝突: 更新

insert into my_class values('PHP0810','B205')

-- 衝突處理

on duplicate key update

-- 更新教室

room = 'B205';

 

-- 主鍵衝突:替換

replace into my_class values('PHP0710','A203');

replace into my_class values('PHP0910','B207');

 

-- 複製建立表

create table my_copy like my_gbk;

 

-- 蠕蟲複製

insert into my_copy select * from my_collate_bin;

insert into my_copy select * from my_copy;

 

 

-- 更新部分a變成c

update my_copy set name = 'c' where name = 'a' limit 3;

 

 

-- 刪除數據:限制記錄數爲10

delete from my_copy where name = 'b' limit 10;

 

-- 清空表: 重置自增加

truncate my_student;

 

-- select選項

select * from my_copy;

select all * from my_copy;

 

-- 去重

select distinct * from my_copy;

 

 

insert into my_student values(null,'itcast0001','張三',''),

(null,'itcast0002','李四',''),

(null,'itcast0003','王五',''),

(null,'itcast0004','趙六',''),

(null,'itcast0005','小明','');

 

-- 字段別名

select

id,

number as 學號,

name as 姓名,

sex 性別 from my_student;

 

-- 多表數據源

select * from my_student,my_class;

 

 

-- 子查詢

select * from (select * from my_student) as s;

 

-- 增長age和height字段

alter table my_student add age tinyint unsigned;

alter table my_student add height tinyint unsigned;

 

-- 增長值: rand取得一個0到1之間的隨機數, floor向下取整

update my_student set age=floor(rand() * 20 + 20),height = floor(rand()*20 + 170);

 

-- 找學生id爲1,3,5的學生

select * from my_student where id = 1 || id = 3 || id = 5; -- 邏輯判斷

select * from my_student where id in(1,3,5); -- 落在集合中

 

-- 找身高在180到190之間的學生

select * from my_student where height >= 180 and height <= 190;

select * from my_student where height between 180 and 190;

 

select * from my_student where height between 190 and 180;

 

-- 根據性別分組

select * from my_student group by sex;

 

-- 分組統計: 身高高矮,年齡平均和總年齡

select sex,count(*),max(height),min(height),avg(age),sum(age) from my_student group by sex;

select sex,count(*),count(age),max(height),min(height),avg(age),sum(age) from my_student group by sex;

select sex,count(*),count(age),max(height),min(height),avg(age),sum(age) from my_student group by sex desc;

 

-- 多字段分組: 先班級,後男女

select c_id,sex,count(*),group_concat(name) from my_student group by c_id,sex; -- 多字段排序

 

 

-- 統計

select c_id,count(*) from my_student group by c_id;

 

-- 回溯統計

select c_id,count(*) from my_student group by c_id with rollup;

 

-- 多字段分組回溯統計

select c_id,sex,count(*),group_concat(name) from my_student group by c_id,sex; -- 多字段排序

select c_id,sex,count(*),group_concat(name) from my_student group by c_id,sex with rollup;

 

 

-- 求出全部班級人數大於等於2的學生人數

select c_id,count(*) from my_student group by c_id having count(*) >= 2;

select c_id,count(*) from my_student where count(*) >= 2 group by c_id ;

 

select c_id,count(*) as total from my_student group by c_id having total >= 2;

select c_id,count(*) as total from my_student where total >= 2 group by c_id ;

 

-- 排序

select * from my_student group by c_id;

select * from my_student order by c_id;

 

-- 多字段排序: 先班級排序,後性別排序

select * from my_student order by c_id, sex desc;

 

-- 查詢學生: 前兩個

select * from my_student limit 2;

 

-- 查詢學生: 前兩個

select * from my_student limit 0,2; -- 記錄數是從0開始編號

select * from my_student limit 2,2;

select * from my_student limit 4,2;
View Code
相關文章
相關標籤/搜索