如鵬網.Net基礎2 第六章:MYSQL

一、可以建立數據庫表,建立字段,設置合適的字段數據類型。html

二、什麼是主鍵,主鍵通常用什麼類型?什麼是自動增加?mysql

三、select、insert、update、delete;程序員

四、where條件;sql

五、聚合函數:Max、Min、AVG、Count數據庫

六、order by;like;group by瀏覽器

七、null是什麼?null=null嗎?null!=null嗎?如何判斷是null?服務器

八、如何獲取第3行到第9行的數據?架構

九、left join聯合查詢;併發

------------------------------------------------函數

第 0 節: 爲何這章只有一節?

  SQLserver不是惟一

   .net+MySQL .net+Oracle

  成本和架構角度:

    1.正版成本。

    2.SQLServer不適合創建集羣;MySQL Oracle很方便;

    3.SQLServer(大)併發性能比MySQL Oracle差。

  MySQL開源免費,並且比SQLServer更適合大型網站架構

  如鵬網:.net+MySQL

  學習角度:(安裝簡單)

    SQLServer的兼容性很麻煩(特別在win8下面);

    MySQL綠色版;

  一通百通:

    Mysql,SQLServer學習起來區別很小,語法基本如出一轍;管理工具大同小異,ADO.net鏈接和

MySQL和鏈接SQLServer敢幾乎同樣;

    後面會安排一些SQLServer(安裝配置,ado.net 鏈接SQLServer)項目

------------------------------------------------

第 1 節 數據庫簡介

  有用的數據要長期的持久化保存信息

  信息寫入到磁盤文件中缺點:

    1.數據類型不一樣,結構不一樣

    2.不利於多人的共享數據

  數據庫(Database):是保存數據的倉庫中,能夠方便的把數據放進去,而且把數據根據各類須要取出來。

  數據庫管理系統(Database Management System,DBMS):是對數據庫進行管理(增刪改查等)的軟件。 

  經常使用的DBMS有:MySQL,Oracle,DB2,MSSQLServer等。

  MYSQL是免費、開源的,所以應用最普遍。

  有的場所下的「數據庫」其實指是DBMS。哪一個是:「大家用的是什麼數據庫?」,「你會用什麼數據庫?」,「你把數據庫刪了?!」

  SQL:一種語法或(MSSQLServer 或mysql數據庫),本身說的要標準一點。

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

------------------------------------------------

第 2 節 庫表列和系統的基本架構介紹

  數據庫:一些有關係的數據的集合

  表(Table):數據格式一致的相關數據的集合

  列(Column)/字段(Filed):每一列數據,一種類型

  服務器:數據庫服務器(MYSQL),網站服務器

  小軟件直接鏈接到數據庫,網站瀏覽器會鏈接到網站服務器上,而後網站服務器鏈接到數據庫服務器上的。 

------------------------------------------------
第 3 節 MYSQL服務器的管理工具的安裝

  一、MYSQL官方版下載地址(不推薦初學者使用):http://www.mysql.com/downloads/

  二、如鵬網版綠色免安裝版MYSQL(推薦初學者使用):http://pan.baidu.com/s/1c0m3xIw 提取碼:m9sn

     綠色版MYSQL Server的安裝:

     1)解壓到沒有中文、空格的文件夾下

     2)雙擊mysqld.exe,若是進程中有了mysqld.exe就ok了

     3)上面的方式須要每次重啓電腦都要手動運行,特別是若是運行在服務器上,那麼不能在登陸前就啓動。能夠註冊爲系統服務:以管理員身份運行命令行,cd到mysql的bin文件夾,執行「mysqld -install」;卸載服務:mysqld -remove。

     如鵬綠色版MYSQL的用戶名、密碼都是:root

  三、NaviCat lite 

   1)下載地址:http://www.cr173.com/soft/44816.html

   2)其餘下載地址:百度搜索「NaviCat lite 」

    鏈接服務器:地址:127.0.0.1

         用戶名,密碼

         端口 3306

------------------------------------------------
第 4 節 主鍵(業務主鍵和邏輯主鍵)和外鍵的概念

  1.主鍵是數據行的惟一的標識。不會重複的列才能當主鍵。一個表能夠沒有主鍵,可是會很是難以處理,所以沒有特殊理由表都要設定主鍵。

  主鍵(惟一性)有兩種選用策略:業務主鍵和邏輯主鍵。

    業務主鍵是使用有業務意義的字段作主鍵,好比身份證號、銀行帳號等;

    邏輯主鍵是使用沒有任何業務意義的字段作主鍵,徹底給程序看的,業務人員不會看的數據。由於很難保證業務主鍵不會重複(身份證號重複)、不會變化(賬號升位),所以推薦用邏輯主鍵。

    建議:統一用邏輯主鍵作主鍵,確定不會重複 

    2.表間的關聯、外鍵(ForeignKey):指向外部表主鍵的字段     

------------------------------------------------
第 5 節 建數據庫創建表的方法  

  一、根節點點右鍵「新建數據庫」,數據庫名字取得有意義,好比「study1」、字符集建議用"UTF-8"。複習:讀寫編碼一致就不會亂碼。

  二、在study1下的「表」節點下點右鍵「新建表」,「欄位」其實指的就是列(Column)/列,翻譯的很差。Id(主鍵,潛規則的名稱,int、不容許爲空、點右鍵「主鍵」)、Name(varchar,長度爲10,不容許爲空)、Gender(bit,不容許爲空),保存爲「T_Persons」(我習慣的表命名規則T_名詞複數)

  三、建表常見錯誤:列名/表名不要用可能的關鍵字、不要有空格(包括先後,一不當心輸錯試試)、不要有特殊字符

雙擊生成的表,手工插入兩條數據,注意點「提交」按鈕

  四、MYSQL的存儲引擎有不少,最經常使用的是InnoDB和MyISAM,MyISAM效率較高,可是不支持事務、外鍵約束等特性,所以通常建議用InnoDB,新版本默認也是InnoDB。怎麼設:建表時「選項」→「引擎」。建好了如何看引擎:表上點右鍵「對象信息」。  

------------------------------------------------
第 6 節 MYSQL經常使用數據類型

  文本:

    CHAR(*):最多255個字節的定長字符串,它的長度必須在建立時指定(長度不夠,空格來湊合)

    VARCHAR(*):最多255個字節的可變長度字符串,它的長度必須在建立時指定

    TEXT:最大長度爲64K字符的變長文本

    TINYTEXT:最大長度爲255字符的變長文本

    MEDUIMTEXT:最大長度爲16K字符的變長文本

    LONGTEXT:最大長度爲4GB字符的變長文本

   整數(考慮數據取值後選擇儘量小的類型:有符號,無符號)

    tinyint:1字節。有符號值:-128 到127;無符號值:0到255

    smallint:2字節。有符號值:-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

  在開發網站系統時,將圖片,視頻等大的數據單獨的放在靜態文件服務器上的。

經過數據庫中只保存文件的路徑

------------------------------------------------
第 7 節 SQL簡介(Select和Insert)

  一、SQL語句中字符串通常用單引號

  二、SQL語句是大小寫不敏感的。

  三、NavCat中找到執行SQL語句的地方「查詢」→「新建查詢」,編寫SQL後點擊【運行】執行SQL語句。

  補充:若是隻想執行NavCat中編寫的一部分代碼,而不是執行所有代碼,只要選中要執行的代碼,點擊鼠標右鍵,選擇「運行已經選擇的」便可。

  四、最簡單的SQL:查看一個表的所有數據:select * from T_Persons

  五、簡單的插入數據的SQL語句:INSERT INTO T_Persons(Id,Name,Age,Gender) VALUES(5,'Jim',20,1)

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

  六、若是插入的行中有些字段的值不肯定,那麼Insert的時候不指定那些列便可。不「容許爲空」的列在插入時不能省略

  七、自動遞增/自增(Auto Increment):字段自增能夠避免併發等問題,不要程序員代碼控制自增。用自增字段在Insert的時候不用指定值。修改表結構的方法【設計表】。

------------------------------------------------
第 8 節 自動遞增列和修改列的數據類型注意的陷阱

  自動遞增/自增(Auto Increment):字段自增能夠避免併發等問題,不要程序員代碼控制自增。用自增字段在Insert的時候不用指定值。修改表結構的方法【設計表】。

   修改表結構(設計表)注意

  1.把「容許爲空」的改爲「不容許爲空」,須要先給舊數據默認值(可用update語句),或刪除以前沒用的數據;

  2.修改列的數據類型時要注意舊數據可否兼容轉換爲新類型,修改數據長度時也是如此。

------------------------------------------------
第 9 節 Update數據更新

  一、更新一個列:UPDATE T_Persons Set Age=30

  二、更新多個列: UPDATE T_Persons Set Age=30,Name='tom'

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

  4更新一部分數據: 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數據刪除 

  刪除表中所有數據:DELETE FROM T_Persons。

  Delete 也能夠帶where子句來刪除一部分數據:DELETE FROM T_Persons WHERE Age > 20

  Delete只是刪除數據,表還在。

  (*)Drop table T_Persons 刪除整個表(表不在了)

      is null:判斷是空值

------------------------------------------------
第 11 節 數據初始化和Select語法1

  1.數據初始化

    INSERT INTO T_Employees(Number,Name,Age,Salary) VALUES('DEV001','Tom',25,8300);     INSERT INTO T_Employees(Number,Name,Age,Salary) VALUES('DEV002','Jerry',28,9300.80);     INSERT INTO T_Employees(Number,Name,Age,Salary) VALUES('SALES001','John',23,5000);     INSERT INTO T_Employees(Number,Name,Age,Salary) VALUES('SALES002','Kerry',28,6200);     INSERT INTO T_Employees(Number,Name,Age,Salary) VALUES('SALES003','Stone',22,1200);     INSERT INTO T_Employees(Number,Name,Age,Salary) VALUES('HR001','Jane',23,2200.88);     INSERT INTO T_Employees(Number,Name,Age,Salary) VALUES('HR002','Tina',25,5200.36);     INSERT INTO T_Employees(Number,Name,Age,Salary) VALUES('IT001','Smith',28,3900);     INSERT INTO T_Employees(Number,Age,Salary) VALUES('IT002',27,2800);

  2.數據檢索

    一、簡單的數據檢索 :SELECT * FROM T_Employees

    二、只檢索須要的列 :SELECT Number FROM T_Employees 、SELECT Name,Age FROM T_Employees

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

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

    五、使用where檢索符合條件的數據:SELECT Name FROM T_Employees WHERE Salary<5000。故事:新員工的數據檢索噩夢

    六、還能夠檢索不與任何表關聯的數據:select 1+1;select now();

------------------------------------------------
第 12 節 聚合函數(數據彙總)

  一、SQL聚合函數:MAX(最大值)、MIN(最小值)、AVG (平均值)、SUM (和)、COUNT(數量)

  二、大於25歲的員工的最高工資 :SELECT MAX(Salary) FROM T_Employees WHERE Age>25 

  三、最低工資和最高工資:SELECT MIN(Salary),MAX(Salary) FROM  T_Employees

  四、大於25歲的員工人數:SELECT COUNT(*) FROM  T_Employees  WHERE Age>25 

  五、全體員工的工資總和平均工資:SELECT SUM(Salary),AVG (Salary) FROM  T_Employees

------------------------------------------------
第 13 節 OrderBy排序

  一、ORDER BY子句位於SELECT語句的末尾,它容許指定按照一個列或者多個列進行排序,還能夠指定排序方式是升序(從小到大排列,ASC)仍是降序(從大到小排列,DESC) 

  二、按照年齡升序排序全部員工信息的列表:SELECT * FROM  T_Employees ORDER BY Age ASC 

  三、按照年齡從大到小排序,若是年齡相同則按照工資從大到小排序 :SELECT * FROM  T_Employees ORDER BY Age DESC,Salary DESC

  四、RDER BY子句要放到WHERE子句以後 :SELECT * FROM T_Employees WHERE Age>23 ORDER BY Age DESC,Salary DESC 

  經驗:在寫order by age  ASC,ASC升序時,必須寫(明確,代碼表達意思清楚)

   order by 必定在where 以後

------------------------------------------------
第 14 節 Like模糊匹配

   通配符過濾使用LIKE 。

   一、單字符匹配的通配符爲半角下劃線「_」,它匹配單個出現的字符。以任意字符開頭,剩餘部分爲「erry」 :SELECT * FROM T_Employees WHERE Name LIKE '_erry' 

   二、多字符匹配的通配符爲半角百分號「%」,它匹配任意次數(零或多個)出現的任意字符。 「k%」匹配以「k」開頭、任意長度的字符串。檢索姓名中包含字母「n」的員工信息 :SELECT * FROM T_Employees WHERE Name LIKE '%n%' 

   三、Like性能較差,很容易形成全表掃描,謹慎使用。後面會講數據庫優化(索引等),項目中作搜索用全文檢索。

------------------------------------------------
第 15 節 null不知道 

  一、數據庫中,一個列若是沒有指定值,那麼值就爲null,數據庫中的null表示「不知道」,而不是表示沒有。所以select null+1結果是null,由於「不知道」加1的結果仍是「不知道」。

  二、SELECT * FROM T_Employees WHERE NAME=null ; SELECT * FROM T_Employees WHERE NAME!=null ;都沒有任何返回結果,由於數據庫也「不知道」。

  三、提問:若是T_Employees表中Name列的值是null的話,那麼下面查詢結果是什麼?Select Name+"a" FROM T_Employees 。

            答案:仍是null,由於null和任何的東西作任何的運算都是null,null+"a"仍是null。

    select 'b'+'a' :0   select null +'a'  :null

  四、SQL中使用is null、is not null來進行空值判斷: 

    SELECT * FROM T_Employees WHERE NAME is null ; 

    SELECT * FROM T_Employees WHERE NAME is not null ;

------------------------------------------------
第 16 節 limit獲取部分結果集 (只有mysql 支持)

  一、LIMIT關鍵字用來限制返回的結果集, LIMIT放在SELECT語句的最後位置,語法爲「LIMIT  首行行號要返回的結果集的最大數目」 。好比下面的SQL語句將返回Name不爲空的、按照工資降序排列的從第二行開始(行號從0開始)的最多五條記錄:

       SELECT * FROM T_Employees  where Name is not null 

       ORDER BY Salary DESC  

       LIMIT 2,5

   二、limit必定要放到全部的語句的最後。

------------------------------------------------
第 17 節 Groupby分組查詢

   一、數據分組用來將數據分爲多個邏輯組,從而能夠對每一個組進行聚合運算。SQL語句中使用GROUP BY子句進行分組,使用方式爲「GROUP BY  分組字段」。分組語句通常和聚合函數一塊兒使用,GROUP BY子句負責將數據分紅邏輯組,而聚合函數則對每個組進行統計計算。

   二、查看公司員工有哪些年齡段的:

       SELECT Age FROM T_Employees GROUP BY Age 

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

   三、若是SELECT語句有WHERE子句,則GROUP BY子句必須放到WHERE語句的以後。

   四、GROUP  BY子句將檢索結果劃分爲多個組,每一個組是全部記錄的一個子集。上面的SQL例子在執行的時候數據庫系統將數據分紅了下面的分組:

   五、分組後就能夠對組內的數據採用聚合函數進行統計了:

       1)計算每一個分組中的員工平均工資

        SELECT Age,AVG(Salary) FROM T_Employees GROUP BY Age

       2)查看每一個年齡段的員工的人數:

         SELECT Age,COUNT(*)  FROM T_Employees GROUP BY Age 

------------------------------------------------
第 18 節 left join聯合查詢

  1.初始化數據

    INSERT INTO T_Customers(Id,Name,Age) VALUES(1,'TOM',21);                    

    INSERT INTO T_Customers(Id,Name,Age) VALUES(2,'MIKE',24);

    INSERT  INTO  T_Customers(Id, Name ,Age)  VALUES (3, 'JACK' ,30);
    INSERT  INTO  T_Customers(Id, Name ,Age)  VALUES (4, 'TOM' ,25);
    INSERT  INTO  T_Customers(Id, Name ,Age)  VALUES (5, 'LINDA' ,30);
 
    INSERT  INTO  T_OrderTypes(Id, Name VALUES (1, '現貨訂單' );
    INSERT  INTO  T_OrderTypes(Id, Name VALUES (2, '預訂訂單' );
    INSERT  INTO  T_OrderTypes(Id, Name VALUES (3, '預購訂單' );
    INSERT  INTO  T_OrderTypes(Id, Name VALUES (4, '內部' );
 
    INSERT  INTO  T_Orders(Id,Number,Price,CustomerId, TypeId)  VALUES (1, 'K001' ,100,1,1);
    INSERT  INTO  T_Orders(Id,Number,Price,CustomerId, TypeId)  VALUES (2, 'K002' ,200,1,1);
    INSERT  INTO  T_Orders(Id,Number,Price,CustomerId, TypeId)  VALUES (3, 'T003' ,300,1,2);
    INSERT  INTO  T_Orders(Id,Number,Price,CustomerId, TypeId)  VALUES (4, 'N002' ,100,2,2);
    INSERT  INTO  T_Orders(Id,Number,Price,CustomerId, TypeId)  VALUES (5, 'N003' ,500,3,4);
    INSERT  INTO  T_Orders(Id,Number,Price,CustomerId, TypeId)  VALUES (6, 'T001' ,300,4,3);
    INSERT  INTO  T_Orders(Id,Number,Price,CustomerId, TypeId)  VALUES (7, 'T002' ,100,1,1);
 
   外鍵:引用其餘表最好經過主鍵,這樣保證惟一性:****Id(命名潛規則)就是指向其餘表的外鍵(ForeignKey)。
  建立外鍵約束,保證數據的完整性。
   join:聯合查詢,(進行多個表檢索最經常使用的技術就是錶鏈接。)
    交叉鏈接:(cross join)
    內鏈接: (inner join)
    外鏈接: (outter join)
        外鏈接又會爲:
          Left join(等值鏈接)
          Right join
   

  一、查詢每張訂單的訂單號、價格、對應的客戶姓名以及客戶年齡

    SELECT o.Number,o.Price,c.Name,c.Age

    FROM T_Orders o

    LEFT JOIN T_Customers c

    ON o.CustomerId=c.Id

  二、添加where語句(顯示價格>=150元的訂單)

    SELECT o.Number,o.Price,o.CustomerId,

    c.Name,c.Age  FROM T_Orders o

    LEFT JOIN T_Customers c  ON o.CustomerId=c.Id

    WHERE o.Price>=150

  三、能夠join多張表:

    SELECT o.Number 訂單號,o.Price 價格, c.Name 客戶姓名,c.Age 客戶年齡,t.Name 訂單類型  FROM     T_Orders o

    LEFT JOIN T_Customers c  ON o.CustomerId=c.Id

    LEFT JOIN T_OrderTypes t ON o.TypeId=t.Id

------------------------------------------------
第 19 節 外鍵約束(初學時加上外鍵,公司看要求)

   一、若是刪除/更新T_Customers一行記錄,那麼就可能會致使T_Orders中存在CustomerId爲非法值的數據,使得程序邏輯錯誤。通常不會更新主鍵Id的值,因此談外鍵約束的時候只談「刪除T_Customers時」。

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

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

   四、有的公司不習慣建外鍵,而是經過程序進行數據合法性控制,對於初學者先不建議這樣,都把外鍵加上。

   外鍵在哪一個表 就改哪一個表的外鍵設置

  約束策略:

    刪除時 和 更新時

    RESTRICT:限制主鍵表刪除(更新),不容許直接刪除父表的該值;

    NO ACTION:拒絕刪除

    CASCADE:級連,主鍵表刪除,對應的記錄也所有刪除

    SET NULL:設置爲NULL

 擴展學習:

  DDL:drop table,create table alter table....

  存儲過程,觸發器,結束,子查詢,除了left join 外的其餘join

 

如鵬網:http://www.rupeng.com

相關文章
相關標籤/搜索