1. 程式人生 > 其它 >資料庫學習筆記

資料庫學習筆記

技術標籤:sqlmysqlsql

資料庫

1. 基本概念

  1. 效據庫( Database)是按照欻據結構來組織、儲存和管理據的建立在計算機儲存裝置上的倉
    放據庫;儲存資料的倉庫

  2. 分類:

    • 網路資料庫
    • 層級資料庫:層次結構模型實質上是一種有根結點的定向有序樹(在數學中"樹"被定義為一個無回的連通圖)
    • 關係資料庫:關係資料庫,是建立在關係模型基礎上的資料庫,藉助於集合代數等數學概念和方法來處理資料庫中的資料。
    • 資料庫的另外一種區分方式:基於儲存介質
      • 儲存介質分為兩種:磁碟和記憶體
        • 關係型資料庫:儲存在磁碟中
        • 關係型資料庫:儲存在記憶體中
  3. 關係型資料庫

    1. 關係資料庫,是建立在關係模型

      基礎上的資料庫,藉助於集合代數等數學概念和方法來處理
      資料庫中的資料。現實世界中的各種實體以及實體之間的各種聯絡均用關係模型來表示。關
      系模型是由埃德加・科德於1970年首先提出的,並配合“科德十二定律”。現如今雖然對此
      模型有一些批評意見,但它還是資料儲存的傳統標準。關係模型由關係資料結構關係操作集合關係完整性約束三部分組成。

    2. 關係資料結構:指的資料以什麼方式來儲存,是一種二維表的形式儲存

      • 本質:二維表
      姓名年齡身高體重
      張三3018770
      李四4017560
    3. 關係操作集合:如何來關聯和管理對應的儲存資料,SQL指令

      • 獲取張三的年級:已知條件為姓名

        Select 年齡 from 二維表 where 姓名=張三;

    4. 關係完整性約束: 資料內部有對應的關聯關係,以及資料與資料之前也有對應的關聯關係

      • 表內約束:對應的具體列只能放對應的資料(不能亂放)
      • 表間約束:自然界各實體都是有著對應的關聯關係(外來鍵)
  4. 經典關係資料庫

    Oracle、DB2、 Microsoft SQL Server、 Microsoft Access、 MYSQL、 Sqlite.

    • 小型關係型資料庫: Microsoft Access, SQLite
    • 中型關係型資料庫: Spl Server ,Mysql
    • 大型關係型資料庫: Oracle,DB2

2.SQL介紹

  1. 基本介紹:結構化查詢語言( Structured Query Language)簡稱SQL,是一種特殊目的的

    程式設計語言,是一種資料庫査詢和程式設計語言,用於存取資料以及查詢、更新和管理關係資料庫系統;同時也
    是資料庫指令碼檔案的副檔名。

    SQL就是專門為關係型資料庫而設計出來的

  2. SQL分類:

    • 資料查詢語言(DL: Data Query Language):
      • 其語句,也稱為“資料檢索語句”,用以從表中獲得資料,確定資料怎樣在應用程式給出。
        保留字 SELECT是DQL(也是所有SQL)用 得最多的動詞,其他DQL常用的保留字有 WHERE
        ORDER BY, GROUP BY和 HAVING。這些DQL保留字常與其他型別的SQL語句一起使用。
        專門用於査詢資料:代表指令 select/show
    • 資料操作語言(DML: Data Manipulation Language):
      • 其語句包括動詞 INSERT, UPDATE和 DELETE。它們分別用於新增,修改和刪剛除表中的行。也 稱為動作查詢語
        專門用於寫資料:代表指令為insert,update,delete
    • 事務處理語言(TPL)
      • 它的語句能確保被DML語句影響的表的所有行及時得以更新。TPL語句包括 BEGIN
        TRANSACTION, COMMIT和 ROLLBACK.(不是所有的關係型資料庫都提供事務安全處理)
        專門用於事務安全處理:transaction
    • 資料控制語言(DCL):
      • 它的語句通過 GRANT或 REVOKE獲得許可, 確定單個使用者和使用者組對資料庫物件的訪問。
        某些 RDBMS可用 GRANT或 REVOKE控制對錶單個列的訪問。
        專門用於許可權管理:代表指令為 grant和 revoke.
    • 資料定義語言(DDL):
      其語句包括動詞 CREATE和DROP。在資料庫中建立新表或冊除表( CREAT TABLE或DROP
      TABLE);為表加入索引等。DDL包括許多與人資料庫目錄中獲得資料有關的保留字。它也是
      動作查詢的一部分
      專門用於結構管理:代表指令 create和drop(alter)

3.MySQL基本介紹

  1. MYSQL是一個關係型資料庫管理系統,由瑞典 My SQL AB公司開發,目前屬於 Oracle旗
    產品。MySQL是最流行的關係型資料庫管理系統之一,在WEB應用方面,MySQL是最好的
    RDBMS( Relational Database Management System,關係資料庫管理系統)應用軟體

  2. 特點:

    1. Mysql是一種開源免費的資料庫產品
      Mysql對PHP的支援是最好(wamp或者lamp)
    2. Mysal中用到的操作指令就是SQL指令
  3. 登入和退出MySL系統

    • 通過客戶端( mysql.exe)與伺服器進行連線認證,就可以進行操作
      通常:服務端與客戶端不在同一臺電腦上

    • 登入

      1. 找到mysql.exe(通過cmd控制檯:如果在安裝的時侯指定了mysql.exe所在的路徑為環
        境變數,就可以直接訪;如果沒有,那麼就必須進入到mysql.exe所在路徑)
      2. 輸入對應的伺服器地址:-h: host -h[IP地址/域名]
      3. 輸入伺服器中ys監聽的埠:-P:port -P:3306
      4. 輸入使用者名稱:-u: username -u:root
      5. 輸入密碼:-p: password -p:root
      6. 連線認證基本語法:Mysql.exe/mysql -h 主機地址 - P埠 -u使用者名稱 -p 密碼
    • 退出

      斷開與伺服器的連線:通常Mysql提供的伺服器數量有限,一旦客戶端用完,建議就應該斷
      開連線。
      建議方式:使用SOL提供的指令
      Exit; //exit帶分號
      \q; //qut縮寫
      Quit:

4.Mysql服務架構

  1. Mysql服務端架構有以下幾層構成:

    • 資料庫管理系統(最外層):DBMS,專門管理伺服器端的所有內容
    • 資料庫(第二層):DB,專門用於儲存資料的倉庫(可以有很多個)
    • 二維資料表(第三層): Table,專門用於儲存具體實體的資料
    • 欄位(第四層):Field,具體儲存某種型別的資料(實際儲存單元)
  2. 資料庫中常用的幾個關鍵字

    row(行)

    column(列->field)

5.SQL基本操作

1. 資料庫基本操作:

1.庫操作

  1. 建立資料庫:

    基本語法:create database 資料庫名字[庫選項]

    --我是註釋
    -- 建立資料庫
    CREATE DATABASE mydatabase --建立資料庫mydatabase
    

    庫選項:資料庫的相關屬性

    字符集:charset 字符集,代表著當前資料庫下的所有表儲存的資料預設指定的字符集(如果當前不指定,那麼採用DBMS預設的字符集)

    CREATE DATABASE mydatabase CHARSET gbk;
    
  2. 顯示資料庫

    • 每當使用者通過SQL指令建立一個數據庫,那麼系統就會產生一個對應的儲存資料的資料夾

      其實,每個資料庫資料夾下都有一個opt檔案,儲存的是對應的資料庫選項。

    • 顯示所有資料庫

      SHOW DATABASES;
      

      在這裡插入圖片描述

    • 顯示部分

      基本語法:show databases like`匹配模式`;

      _ :匹配當前位置單個字元
      %:匹配指定位置多個字元

      獲取以my開頭的全部資料庫:‘my%;
      獲取m開頭,後面第一個字母不確定,最後為 database的資料庫;’ m_database;
      獲取以 database結尾的資料庫:’%database’,;

      -- 獲取以my開頭的資料庫:
      SHOW DATABASES LIKE 'my%';
      
    • 顯示資料庫建立語句

      語法:```show create database 資料庫名字

      -- 檢視mydatabase資料庫建立語句
      SHOW CREATE DATABASE mydatabase
      
  3. 選擇資料庫

    基本語法:use 資料庫名字

    -- 選擇mydatabase資料庫
    USE mydatabase 
    
  4. 修改資料庫

    • 修改資料庫字符集(庫選項)

      基本語法:alter database 資料庫名字 charset =字符集

      -- 將mydatabse資料庫的字符集設定為gbk
      ALTER DATABASE mydatabase CHARSET gbk;
      

      一旦修改成功,那麼對應的opt檔案中就會體現

    • 是否可以修改資料庫名字?mysq15.5之前是可以修改的 rename命令;但是5.5之後就不可以了

  5. 刪除資料庫

    基本語法:drop database 資料庫名字

    -- 刪除一個名為a的資料庫
    DROP DATABASE a
    

    刪除雖簡單,但是切記要做好安全操作:確保裡面資料沒有間題。(重要)

    刪除資料庫之後:對應的儲存資料庫的資料夾也被會刪除

2.表操作

  1. 建立資料表

    • 普通建立表

      基本語法:create table表名(欄位名 欄位型別 [欄位屬性],欄位名 欄位型別 [欄位屬性],…)[表選項]

      -- 建立一個班級表
      CREATE TABLE class(
      -- 欄位名 欄位型別
      -- 欄位與表其實是分不開
      NAME VARCHAR(10) -- 10個字元(不能超過)
      );
      

      將表掛入到指定的資料庫下的兩種方法:

      • 在資料表名字前面加上資料庫名字,用.連結 即資料庫.資料表

        -- 將建立的表掛到mydatabase資料庫
        create table mydatabase.class(
         name varchar(10);
      • 在建立資料表之前先進入到某個具體的資料庫

        use mydatabase -- 先進入到mydatabase資料庫
        -- 建立表
        CREATE TABLE class(
        NAME VARCHAR(10) -- 10個字元(不能超過)
        );
        

      表選項:

      • Engine:儲存引擎,mysql提供的具體儲存方式,預設有一個innodb(5.5以前預設是myisam)
      • Charset:字符集,只對當前自己表有效(級別比資料庫高)
      • Collate:校對集
      CREATE TABLE class(
      -- 欄位名 欄位型別
      -- 欄位與表其實是分不開
      NAME VARCHAR(10) -- 10個字元(不能超過)
      )engine [=] innodb/myisam charset gbk collate;
      
    • 複製已有表結構

      從已經存在的表複製一份(只複製結構:如果表中有資料不復制)
      基本語法: create table 新表名 Ilke 表名;

      只要使用資料庫.表名就可以在任何資料庫下訪問其他資料庫的表名

      -- 在 a資料庫中建立一個與mydatabase資料庫的class表結構相同的class2表
      USE a
      CREATE TABLE class2 LIKE mydatabase.class;
      
  2. 多維度顯示資料表

    1. 顯示資料表:

      • 每當一張資料表建立,那麼就會在應的資料庫下建立一些檔案(與儲存引擎有關)
        在這裡插入圖片描述

      • 顯示所有表

        基本語法:show tables

      • 顯示匹配表

        基本語法:show tables like ’匹配模式‘

        SHOW TABLES LIKE 'c%' --顯示以c開頭的表
        
    2. 顯示錶結構

      1. 本質含義:顯示錶中所包含的欄位資訊(名字,型別,屬性等)

      2. 方式:

        • describe 表名
        • desc 表名
        • show columns for 表名

在這裡插入圖片描述

  • 查看錶結構建立語句

       -- 檢視資料表建立時的語句:此語句看到的結果已經不是使用者之前自己輸入的
       SHOW CREATE TABLE class
    
    1. 設定表屬性

      表屬性指的就是表選項: engine, charset 和 collate
      基本語法: alter table 表名 表選項 值;

      -- 將class表的字符集修改為gbk
      ALTER TABLE class CHARSET gbk
      
  1. 修改表結構

    • 修改表名字:rename table 舊錶名 to 新表名

      RENAME TANLE class TO my_class;
      
    • 新增欄位:alter table 表名 add column 新欄位名 列型別 [列屬性] [位置 first/after 欄位名]

      ALTER TABLE my_class ADD id INT FIRST
      
      • 預設是加到表後面

      • 欄位位置:欄位想要存放的位置

        first:在某某之前(最前面),第一個欄位

        after 欄位名:放在某個具體的欄位之後(預設的)

    • 修改欄位名:alter table 表名 change 舊欄位名 新欄位名 欄位型別【列屬性】【新位置】

      ALTER TABLE my_class CHANGE NAME sex INT
      
      • 欄位名的型別是必須的否則會報錯
    • 修改欄位型別(屬性)alter table表名 modify 欄位名 新型別【新屬性】【新位置】

      ALTER TABLE my_class MODIFY sex VARCHAR(20)
      
    • 刪除欄位:alter table 表名 drop 欄位名

      ALTER TABLE my_class DROP sex
      
    1. 刪除表結構:

      drop table 表名 [,表名2…]

      DROP TABLE homan;
      -- 批量刪除
      DROP TABLE homan,teacher;
      

3.資料操作

  1. 插入操作

    • 本質含義:將資料以SQL的形式儲存到指定的資料表(欄位)

    • 插入方式:

      • insert into 表名 (欄位列表) values (對應欄位列表)

        -- 向表中指定欄位插入資料
        INSERT INTO my_teacher(NAME,age) VALUES('lihua',30);
        
        • 注意:後面( values中)對應的值列表只需要與前面的欄位列表相對應即可(不一定與表結構完全一致)
        • 欄位列表並不一定非要有所有的表中欄位
      • insert into 表名 values (對應表結構)

        -- 向表中所有欄位插入資料
        INSERT INTO my_teacher VALUES('xiaoming',20);
        
        • 值列表必須與欄位列表一致
  2. 查詢操作

    • 查詢表中所有資料:select * from 表名 (* 表示匹配所有欄位)

      SELECT * FROM my_teacher;
      
    • 查詢表中部分欄位:select 欄位列表 from 表名

      -- 查詢一個
      SELECT NAME FROM my_teacher;
      -- 查詢多個
      SELECT NAME,age FROM my_teacher;
      
    • 簡單條件查詢資料:select 欄位列表/* from 表名 where 欄位名 = 值

      -- 獲取年齡為30歲的人的名字
      SELECT NAME FROM my_teacher WHERE age = 30;
      
      • mysql 中沒有==符號
  3. 刪除操作

    • 基本語法:delete from 表名 [where 條件];

      -- 刪除年齡為30的老師
      DELETE FROM my_teacher WHERE age=30;
      
      • 如果沒有where 條件,意味著系統會自動刪除該表所有資料(慎用)
  4. 更新操作(修改資料)

    • 基本語法:update 表名 set 欄位名 = 新值 [where 條件];

      -- 更新xiaoming年齡為20
      UPDATE my_teacher SET age=20 WHERE NAME='xioaming';
      
      • 如果沒有where 條件,那麼所有的表中對應的那個欄位都會被修改成統一值

2.字符集

1.欄位集介紹

  1. 字元編碼
    • 字元( Character)是各種文字和符號的總稱,包括各國家文字、標點符號、圖形符號、數字等
      • 在計算機中所看到的任何內容都是字元構成的
    • 字元編碼( character code)是計算機針對各種符號,在計算機中的一種二進位制儲存代號
  2. 字符集概念
    • 概念:字符集( Char acter set)是多個字元的集合,字符集種類較多,每個字符集包含的字元個數不同
    • 常見字符集名稱: ASCII字符集、GB2312字符集、BIG5字符集、GB18030字符集、 Unicode字符集等。計算機要準確的處理各種字符集文字,需要進行字元編碼,以便計算機能夠識別和儲存各種文字。中文文字數目大,而且還分為簡體中文和繁體中文兩種不同書寫規則的文字,而計算機最初是按英語單位元組字元設計的,因此,對中文字元進行編碼,是中文資訊交流的技術基礎

2.mysql字符集設定

  • 如果直接通過cmd下的 mysql.exe進行中文資料插入,那麼可能出錯

  • 出錯原因:

    1. 使用者是通過 mysql.exe來操作 mysqld.exe
    2. 真正的SQL執行是 Mysqld. exe來執行
    3. mysql.exe將資料傳入 mysqld.exe的時候,沒有告知其對應的符號規則(字符集),而mysqld也沒有能力自己判斷
  • 解決方案:mysql.exe客戶端在進行資料操作之前將自己所使用的字符集告訴 mysqld

    • cmd下的mysql.exe 預設只有一個字符集:GBK

    • Mysql. exe如果告知 Mysqld.exe對應的字符集型別為gbk?

      • 快捷方式: set names 字符集

        set names gbk;
        
      • 深層原理:客戶端,服務端,連線層( show variables like ‘character_set_%’)

        Mysql.exe與 Mysqld.exe之間的處理關係一共分為三層
        客戶端傳入資料給服務端:client
        服務端返回資料給客戶端: server

        客戶端與服務端之間的連線:collection

        Set names字符集的本質。就是一次性打通三層關係的字符集,變得一致

  • 檢視系統儲存的三種關係處理字符集

    show variables like character set%
    
  • 檢視一個新的客戶端的對應的字符集

    show variables like 'cgaracter_set%'
    
  • 修改伺服器端變數的名:set 變數名 = 值

    set character_set=gbk
    

3.列型別

1.整型

  1. 分類:整數型別,Tinyint(迷你整形,系統採用一個位元組來儲存的整形:一個位元組=8位,最大能表示的數值是0-255),Smallint(小整形,系統採用兩個位元組來儲存的整形;能表示0-6555之間),Mediumint(中整形,採用三個位元組來儲存資料),Int(整形(標準整形),採用四個位元組來儲存資料),Bigint(大整形,採用八個位元組來儲存資料),

  2. 無符號標識設定:

    基本語法:在型別後面加上一個 unsigned

  3. 顯示長度:指資料(整型)在資料顯示的時候,到底可以顯示多長位。

    • 顯示長度只是代表了資料是否可以達到指定的長度,但是不會自動滿足到指定長度:如果想要資料顯示的時侯,保持最高位(顯示長度),那麼還需要給欄位増加一個 zerofill屬性オ可
      以。
    • Zerofill:從左側開始填充0(左側不會改變數值大小),所以負數的時候就不能使用 zerofill
      旦使用 zerofill就相當於確定該欄位為 unsigned

2.小數型別

  1. 分類:浮點型,定點型

  2. 浮點型:

    • 浮點型又稱之為精度型別:是一種有可能丟失精度的資料型別,資料有可能不那麼準確(由
      其是在超出範圍的時候)
    • float:Float又稱之為單精度型別:系統提供4個位元組用來儲存資料,但是能表示的資料範圍比整
      型大的多,大概是10^438;只能保證大概7個左右的精度(如果資料在7位數以內,那麼基
      本是準確的,但是如果超過7位數,那麼就是不準確的)
    • double:Double又稱之為雙精度:系統用8個位元組來儲存資料,表示的範圍更大,10^308次方,但
      是精度也只有15位左右。
  3. 定點數:

    • 定點數:能夠保證資料精確的小數(小數部分可能不精確,超出長度會四捨五入)整數部分一定精確

    • Decimal:

      Decimal定點數:系統自動根據儲存的資料來分配儲存空間,每大概9個數就會分配四個位元組來進行儲存,同時小數和整數部分是分開的。

      • Decimal(M,D):M表示總長度,最大值不能超過65,D代表小數部分長度,最長不能超過30

3.時間日期型別

  1. 分類:Date,Time,Date,time,Timestamp,Year

  2. Date:

    日期型別:系統使用三個位元組類儲存資料,對應的格式為:YYY-mm-dd,能表示的範圍是
    從1000-01-01到9999-12-12,初始值為0000-00-00

  3. Time:

    時間型別:能夠表示某個指定的時間,但是系統同樣是提供3個位元組來儲存,對應的格式為:
    HH:ii:ss,但是 mysql中的time型別能夠表示時間範圍要大的多,能表示從
    -838:59:59~838:59:59,在 mysql中具體的用處是用來描述時間段

  4. Datetime

    日期時間型別:就是將前面的date和time合併起來,表示的時間,使用8個位元組儲存資料,
    格式為 YYYY-mm-dd HH:ii:ss,,能表示的區間1000-01-01 00:00:00到9999-12-12 23:59:59,其
    可以為0值:00000-0000:00:00

  5. Timestamp:

    時間戳型別:mysql中的時間戩只是表示從格林威治事件開始,但是其格式依然是
    YYYY-mm-dd HH: ii: ss

  6. Year:

    年型別:佔用一個位元組來儲存,能表示19002155年,但是year有兩種資料插入方式:099
    和四位數的具體年

4.字串型別

  1. 分類:Char,Varchar,Text,Enum

  2. Char:

    定長字元:指定長度之後,系統一定會分配指定的空間用於儲存資料

    基本語法:char(L),L代表字元數(中文與英文字母一樣),L長度為0到255

  3. Varchar:

    變長字元:指定長度之後,系統會根據實際儲存的資料來計算長度,分配合適的長度(資料沒有超出長度)

    基本語法: Varchar(L),L代表字元,L的長度理論值位0到65535

    • 因為 varchar I要記錄資料長度(系統根據資料長度自動分配空間),所以每個 varchar資料產
      生後,系統都會在資料後面增加1-2個位元組的額外開銷:是用來儲存資料所佔用的空間長度
      如果資料本身小於127個字元:額外開銷一個位元組;如果大於127個,就開銷兩個位元組
  4. Text

    • 文字型別:本質上mysql提供了兩種文字型別:

      • Text:儲存昔通的字元文字
      • Blob:儲存二進位制文字(圖片,檔案),一般都不會使用blob來儲存檔案本身,通常是使用一個連結來指向對應的檔案本身。
    • Text:系統中提供的四種text

      • Intext:系統使用一個位元組來儲存,實際能夠儲存的資料為:2^8+1
      • Text:使用兩個位元組儲存,實際儲存為:2^16+2
      • Mediumtext:使用三個位元組儲存,實際儲存為:2^24+3
      • Longtext:使用四個位元組儲存,實際存備為:2^32+4
    • 注意:

      1. 在選擇對應的儲存文字的時候,不用刻意去選擇text型別,系統會自動根據儲存的資料長度來選擇合適的文字型別。
      2. 在選擇字元儲存的時候,如果資料超過255個字元,那麼一定選擇text儲存
  5. Enum:

    • 列舉型別:在資料插入之前,先設定幾個項,這幾個項就是可能最終出現的資料結果。
      • 如果確定某個欄位的資料只有那麼幾個值:如性別,男、女、保密,系統就可以在設定欄位
        的時候規定當前欄位只能存放固定的幾個值:使用列舉
      • 基本語法:enum (效據值1,資料值2)
      • 系統提供了1到2個位元組來儲存列舉資料:通過計算enum列舉的具體值來選擇實際的儲存
        空間:如果資料值列表在255個以內,那麼一個位元組就夠,如果超過255但是小於65535,
        那麼系統採用兩個位元組儲存。
  6. Set

    集合:是一種將多個數據選項可以同時儲存的資料型別,本質是將指定的項按照對應的二進位制位來進行控制:1表示該選項被選中,0表示該選項沒有被選中

    基本語法:基本語法:set(‘值1’,‘值2’,‘值3’…)

    • 系統為set提供了多個位元組進行儲存,但是系統會自動計算來選擇具體的儲存單元
      • 1個位元組:set只能有8個選項
      • 2個位元組:set只能有16個選項
      • 3個位元組:set只能表示24個選項
      • 8個位元組:set可以表示64個選項
    • set和enumー樣,最終儲存到資料欄位中的依然是數字而不是真實的字串
  7. Mysql 記錄長度:

    • 在 mysql a中,有一項規定:mvsq인的記錄長度( record=行row)總長度不能超過655355個位元組。

    • Varchar I能夠儲存的理論值為65535個字元:字元在不同的字符集下可能佔用多個位元組。

      • Ut8最多隻能儲存21844個字元
      • GBK最多隻能儲存32766個字元

5.列屬性: