1. 程式人生 > >如鵬網學習筆記(五)MySql基礎

如鵬網學習筆記(五)MySql基礎

修改列 記錄 tex 令行 金額 升序 查詢 自動遞增 col

MySQL基礎

一、數據庫概念
  1,網友裝備信息、論壇帖子信息、QQ好友關系信息、學籍管理系統中的學生信息等都要“持久化”的保存到一個地方,
    如果通過IO寫到文件中,那麽會非常麻煩,而且不利於多人共享數據

  2,我們開發大部分軟件、網站都要大量用到書庫,甚至開發遊戲、手機App也要用到數據庫,公司面試的時候數據庫的考核在三分之一以上

  3,數據庫(DataBase)是保存數據的倉庫,可以方便的把數據放進去,並且把數據根據各種需要取出來。
    數據庫管理系統(Database Management SYSTEM,DBMS)是對數據庫進行管理(增刪改查等)的軟件,
    常用的DBMS有MYSQL、Oracle、DB2、MSSQLServer等。
    MYSQL是開源、免費的,因此應用最廣泛

  4,不同的DBMS用法大同小異,掌握了一個也就基本等於掌握了其他DBMS

二、數據庫、表、列

  1,Table(表):存放數據的“書架的格子”

  2,兩種叫法:列(column)/字段(Field)

三、MYSQL環境安裝

  1,下載
    http://www.mysql.com/downloads/ MySQL Enterprise Edition (commercial)、MySQL Cluster CGE (commercial)都是收費版;MySQL Community Edition 是開源免費版。

  2,添加系統服務
    以管理員身份運行命令行,cd到mysql的bin文件夾,執行“mysqlld -install”

    卸載服務:mysql -remove


四、MYSQL管理工具

  1,MYSQL管理工具用於對DBMS進行數據庫創建、表創建等管理。開發人員必裝。管理工具不是DBMS,DBMS不可少

  2,管理工具有很多:Navicat、Workbench(官方)、phpMyAdmin、SQLyog、MySQL-Front,用法大同小異。
    NaviCat lite是免費版,功能學習夠用了。

  3,安裝後在開始菜單的“PremiumSoft”中。
    主菜單“文件”→“新建連接”→“MYSQL”,“連接名”隨意,“主機名或IP地址”填MYSQLServer的IP地址或者主機名,

    裝在本機填127.0.0.1(本地回環地址),用戶名密碼都是root(生產環境中密碼要改的復雜一點)。

  4,如果連接不報錯,說明MYSQLServer和管理工具都安裝沒有問題


五、主鍵(PrimaryKey)

  1,主鍵就是數據行的唯一標識。不會重復的列才能當主鍵。一個表可以沒有主鍵,但是會非常難以處理,
    因此沒有特殊理由表都要設定主鍵

  2,主鍵有兩種選用策略:
    業務主鍵和邏輯主鍵

    業務主鍵就是使用有業務意義的字段做主鍵,比如身份證號、銀行賬號等

    邏輯主鍵是使用沒有任務業務意義的字段做主鍵,完全是給程序看的,業務人員不會看的數據。

    因為很難保證業務主鍵不會重復(身份證號重復)、不會變化(賬號升位),因此推薦用邏輯主鍵


六、表間關聯、外鍵(ForeignKey)

  1,一張表中的一個字段是指向了另一張表的主鍵,這樣就將兩張表的信息連接在一起了

  2,可以多張表“串聯”,也可以“多對多”的在兩張表之間存在一張關系表


七、建庫建表

  1,根節點點右鍵,新建數據庫,數據庫名字取得有意義,比如“study1”,字符集建議用UTF-8。

  2,在study1下的“表”節點下右鍵“新建表”,“欄位”其實指的就是列。

    Id(主鍵,潛規則的名稱,int、不允許為空、點右鍵“主鍵”)
    Name(nvarchar,長度為10,不允許為空)
    Gender(bit,不允許為空)
    保存為“T_Persons”

  3,建表常見錯誤:

    列名/表名不要用可能的關鍵字,不要有空格(包括前後)、不要有特殊字符

  4,MYSQL的存儲引擎有很多,最常用的是InnoDB和MyISAM,MyISAM效率較高,但是不支持事務、外鍵約束等特性,
    因此一般建議用InnoDB,新版本默認也是InnoDB。

    怎麽設:建表時“選項”→“引擎”。建好了如何看引擎:表上點右鍵“對象信息”。

  5,常用的數據類型
    文本:
    CHAR(*):最多255個字節的定長字符串,它的長度必須在創建時指定
    VARCHAR(*):最多255個字節的可變長度字符串,它的長度必須在創建時指定
    TEXT:最大長度為64K字符的變長文本
    TINYTEXT:最大長度為255字符的變長文本
    MEDUIMTEXT:最大長度為16K字符的變長文本
    LONGTEXT:最大長度為4GB字符的變長文本

    整數:(考慮數據取值後選擇盡可能小的類型)
    tinyint:1字節。有符號值:-128 到127;無符號值:0到255
    smallint:1字節。有符號值:-32768 到32767;無符號值:0到65535
    mediumint:3字節。
    int:4字節
    bigint:8字節

    小數:(需要指定長度和小數點,也就是顯示寬度和小數位數):
    decimal:精確存儲的小數,在內部用字符串存儲,適合金額等要求精確的類型。別名:NUMERIC
    float:4字節,單精度。會近似存儲(*),效率比decimal高。
    double:8字節,雙精度。會近似存儲(*),效率比decimal高。

    日期時間:
    DATE:4字節。範圍:1000-01-01——9999-12-31
    TIME:3字節。範圍:-838:59:59——838:59:59
    DATETIME:8字節。範圍:1000-01-01 00:00:00——9999-12-31 23:59:59

    二進制大數據:
    TITYBLOB:最大長度為255字節
    BLOB:最大長度為64KB
    MEDIUMBLOB:最大長度為16MB
    LONGBLOB:最大長度為4GB


八、SQL語句入門

  1,不能總是用鼠標點來點去手動管理數據,要能夠通過語言和數據庫自動交流,SQL語句就是和數據庫“交談”專用的語句

  2,SQL語句中字符串一般用單引號

  3,SQL語句是大小寫不敏感的

  4,NavCat中找到執行SQL語句的地方“查詢”——“新建查詢”,編寫SQL後點擊“運行”執行SQL語句

  5,最簡單的SQL:

    查看一個表的全部數據:select * from T_Persons

  6,Insert
    簡單的插入數據的SQL語句:
    insert into T_Persons (Id,Name,Age,Gender) values(5,‘jim‘,20,1)

    Insert語句可以省略表名後的列名,但是強烈不推薦

    如果插入的行中有些字段的值不確定,那麽Insert的時候不指定那些列即可。“不允許為空”的列在插入的時候不能省略

    自動遞增/自增(Auto Increment):字段自增可以避免並發等問題,不要程序員代碼控制自增。用自增字段在Insert的時候不用指定值。

  7,修改表結構的方法:點“設計表”

    1,把“允許為空”的字段修改為“不允許為空”,需要先給舊數據默認值(用Update語句),
      如果之前是測試數據無所謂,可以把舊數據都刪除(增加Height字段)

    2,修改列的數據類型要註意舊數據能否兼容轉換為新類型;修改數據的長度的時候也是如此

  8,數據更新

    更新一個列:
    update T_Persons Set Age=30

    更新多個列:
    update T_Persons s Set Age=30,Name=‘tom‘

    表達式:UPDATE T_Persons Set Age=Age+1

  9,條件數據更新

    更新一部分數據:
    UPDATE T_Persons Set Age=30 where Name=‘tom‘,用where語句表示只更新Name是‘tom‘的行,
    註意SQL中等於判斷用單個=,而不是==。

    Where中還可以使用復雜的邏輯判斷UPDATE T_Persons Set Age=30 where Name=‘tom‘ or Age<25,or相當於Java中的||

    where (Age>20 and Age<30) or(Age=80)

    Where中可以使用的其他邏輯運算符:or、and、not、<、>、>=、<=、!=(或<>)等

  10,數據刪除
    刪除表中全部數據:
    DELETE from T_Persons

    刪除表中部分數據
    Delete from T_Persons where Age>20

    DELETE只是刪除數據,表還在,

  11,刪除表
    Drop table T_Persons

九、數據檢索
  1,簡單的數據檢索:Select * from T_Persons

  2,只檢索需要的列:
    SELECT Number FROM T_Employees 、
    SELECT Name,Age FROM T_Employees

  3,列別名
    SELECT Number AS 編號,Name AS 姓名,Age AS Age111 FROM T_Employees
    寫不寫AS都行


  4,計算列
    SELECT Number 編號,Name 姓名,Age Age111,Age+10 十年後的年齡,1+1,now() FROM T_Employees

  5,使用where檢索復合條件的數據:
    SELECT Name FROM T_Employees WHERE Salary<5000

  6,還可以檢索不與任何表關聯的數據:
    select 1+1;
    select now();

十、數據匯總
  1,SQL聚合函數:
    MAX
    MIN
    AVG
    SUM
    COUNT
  2,大於25歲的員工的最高工資 :

    SELECT MAX(Salary) FROM T_Employees WHERE Age>25

  3,最低工資和最高工資:

    SELECT MIN(Salary),MAX(Salary) FROM T_Employees

  4,大於25歲的員工人數:

    SELECT COUNT(*) FROM T_Employees WHERE Age>25

  5,全體員工的工資總和平均工資:

    SELECT SUM(Salary),AVG (Salary) FROM T_Employees

十一、數據排序

  1,Order by子句位於Select語句的末尾,它允許執行按照一個列或者多個列進行排序,還可以指定排序方式是升序(ASC)還是降序(DESC)

  2,按照年齡升序排序所有員工信息的列表:
    SELECT * FROM T_Employees ORDER BY Age ASC

  3,按照年齡從大到小排序,如果年齡相同則按照工資從大到小排序 :
    SELECT * FROM T_Employees ORDER BY Age DESC,Salary DESC

  4,ORDER BY子句要放到WHERE子句之後 :
    SELECT * FROM T_Employees WHERE Age>23 ORDER BY Age DESC,Salary DESC


十二、通配符過濾

  1,通配符過濾使用like

  2,單字符匹配的通配符為半角下劃線“_”,它匹配單個出現的字符。
    以任意字符開頭,剩余部分為“erry”:
    Select * from T_Employees where Name like ‘_erry‘

  3,多字符匹配的通配符為半角百分號“%”,它匹配任意次數(0或者多個)出現的任意字符。
    k% 匹配以k開頭、任意長度的字符串
    檢索姓名中包含字母n的員工信息:
    select * from T_Employees where name like ‘%n%‘

  4,like性能較差,很容易造成全表掃描,謹慎使用。
    後面會講數據庫優化(索引等),項目中做搜索用全文索引


十三、空值處理

  1,數據庫中,一個列如果沒有指定值,那麽值就為null,數據庫中的null表示“不知道”,而不是表示沒有。
    因此select null+1結果是null,因為“不知道”加1的結果還是“不知道”

  2,Select * from T_Employees where name = null;
    select * from T_Employees where name!=null;
    都沒有任何返回結果,因為數據庫“也不知道”
    select name+"a" from T_Employees

  3,SQL中使用is null、is not null 來進行空值判斷
    SELECT * FROM T_Employees WHERE NAME is null ;
    SELECT * FROM T_Employees WHERE NAME is not null ;

十四、limit

  limit關鍵字用來限制返回的結果集,limit放在select語句的最後位置,
  語法為:limit 首行行號,要返回的結果集的最大數目

  比如下面的SQL語句將返回Name不為空的、按照工資降序排列的從第二行開始(行號從0開始)的最多五條記錄
  select 8 from T_Employees
  where Name is not null
  order by Salary desc
  limit 2,5

  註意:limit一定要放到所有的語句的最後

  使用場景:開發網站、開發手機程序的時候分頁用的非常多

十五、group by

  1,數據分組用來將數據分為多個邏輯組,從而可以對每個組進行聚合運算。
    SQL語句中使用group by子句進行分組,使用方式為“group by 分組字段”。
    分組一般和集合函數一起使用,group by子句負責將數據分成邏輯組,而聚合函數則對每個組進行統計計算

  2,查看公司員工有哪些年齡段的:
    select Age from T_Employees group by Age

  3,將Age相同的數據行放到一組,分組後的數據可以看作一個臨時的結果集,而SELECT Age語句則取出每組的Age字段的值,
    這樣我們就得到上表的員工年齡段表了。

  4,如果SELECT語句有WHERE子句,則GROUP BY子句必須放到WHERE語句的之後

  5,group by子句將檢索結果劃分為多個組,每個組是所有記錄的一個子集。

十六、group by與聚合函數

  1,分組後就可以對組內的數據采用聚合函數進行統計了;

    計算每個分組中員工的平均工資:
    select Age,avg(salary) from T_Employees
    group by Age

    查看每個年齡段的員工的人數:
    select Age,count(*) from T_Employees
    group by Age

十七、join
  1,真是的業務系統中,各個表之間都存在這種聯系,很少存在不與其他表存在關聯關系的表,
    而在實現業務功能的時候也經常需要從多個表中進行數據的檢索,而進行多表檢索最常用的技術就是表連接

  2,如果沒有表連接,那麽查詢每張訂單的客戶姓名就要先查詢訂單,再去查詢客戶表,麻煩而且效率低

  3,SQL中使用JOIN關鍵字來進行表連接。
    表連接有多種不同的類型,被主流數據庫系統支持的有交叉連接(CROSS JOIN)、內連接(INNER JOIN)、外連接(OUTTER JOIN)

    外連接分為:left join、right join。

十八、外鍵約束

  1,如果刪除/更新T_Customers一行記錄,那麽就可能會導致T_Orders中存在CustomerId為非法值的數據,使得程序邏輯錯誤。
    一般不會更新主鍵Id的值,所以談外鍵約束的時候只談“刪除T_Customers時”

  2,外鍵約束:當刪除T_Customer中一條數據的時候,如何處理T_Orders等存在指向T_Customers外鍵的行。外鍵約束建立在外鍵字段***Id的表上

  3,建外鍵約束的方法:新建或者修改表的時候“外鍵”→“添加外鍵”。
    名字:自動命名即可;欄位名:CustomerId;參考表:t_customers;外欄位名:Id;
    刪除時、更新時:一般默認RESTRICT(CASCADE:刪除T_Customers一行時把它的訂單也刪除了;
    SET NULL:刪除T_Customers一行時把它的訂單CustomerId設置為NULL;NO ACTION/RESTRICT:拒絕刪除)。


十九、擴展學習資料
  1,DDL:

  2,存儲過程、觸發器、約束、子查詢、處理left join之外其他的join


























如鵬網學習筆記(五)MySql基礎