1. 程式人生 > >資料庫學習的一些基礎知識及常用命令(部分)

資料庫學習的一些基礎知識及常用命令(部分)

【資料庫基本概念】

  1. 一個表只能有一個主鍵(primary key),主鍵列不允許為空值(null)
  2. 一個表中可以有多個列作為主鍵列,但需要考慮最少性和穩定性
  3. 外來鍵(foreign key):確保“從表”中的某個資料項在“主表”中必須存在

【基本術語】

  • DB:資料庫
  • DBA:資料庫管理員
  • DBM:資料庫管理系統
  • DBS:資料庫系統

【SQL分類】

  1. DDL:資料定義語言

用來建立資料庫中的各種物件-----表、檢視、索引、同義詞、聚簇等.----CREATE

  1. DCL:資料控制語言

用來授予或回收訪問資料庫的某種特權,並控制資料庫操縱事務發生的時間及效果,對資料庫實行監視等

1) GRANT:授權。
2) ROLLBACK [WORK] TO [SAVEPOINT]:回退到某一點。
回滾---ROLLBACK
回滾命令使資料庫狀態回到上次最後提交的狀態。其格式為:
SQL>ROLLBACK;
3) COMMIT [WORK]:提交。
    在資料庫的插入、刪除和修改操作時,只有當事務在提交到資料
庫時才算完成。在事務提交前,只有操作資料庫的這個人才能有權看
到所做的事情,別人只有在最後提交完成後才可以看到。
提交資料有三種類型:顯式提交、隱式提交及自動提交。下面分
別說明這三種類型。
(1) 顯式提交
用COMMIT命令直接完成的提交為顯式提交。其格式為:
SQL>COMMIT;
(2) 隱式提交
用SQL命令間接完成的提交為隱式提交。這些命令是:
ALTER,AUDIT,COMMENT,CONNECT,CREATE,DISCONNECT,DROP,
EXIT,GRANT,NOAUDIT,QUIT,REVOKE,RENAME。
(3) 自動提交
若把AUTOCOMMIT設定為ON,則在插入、修改、刪除語句執行後,
系統將自動進行提交,這就是自動提交。其格式為:
SQL>SET AUTOCOMMIT ON;
  1. DML:資料操縱語言

主要有三種形式:插入:INSERT;更新:UPDATE;刪除:DELETE

  1. DQL:資料查詢語言

資料查詢語言DQL基本結構是由SELECT子句,FROM子句,WHERE子句組成的查詢塊: SELECT <欄位名錶> FROM <表或檢視名> WHERE <查詢條件>

【資料庫索引】

  1. 索引簡介

索引是一種有效組合資料的方式,為快速查詢到指定記錄

  1. 索引作用

    • 提高資料庫的檢索速度
    • 改善資料庫效能
  2. 索引分類

    • B樹索引:InnoDB、MyISAM均支援
    • 雜湊索引
  3. 常用索引

    • 普通索引:允許在定義索引的列中插入重複值和空值
    ALTER TABLE table_name ADD INDEX index_name (column_name); 
    
    • 唯一索引:索引列資料不重複,允許有空值
    ALTER TABLE table_name ADD UNIQUE (column_name);
    
    • 主鍵索引:主鍵將自動建立索引,每個值是非空、唯一的
    ALTER TABLE table_name ADD PRIMARY KEY (column_name); 
    
    • 複合索引/多列索引:將多個列組合作為索引
    ALTER TABLE table_name ADD INDEX index_name(column1,column2,...);
    
    • 全文索引:支援值的全文查詢,允許重複值和空值
    ALTER TABLE table_name ADD FULLTEXT (column_name); 
    
    • 空間索引:對空間資料型別的列建立的索引
  4. 檢視和刪除索引

    //檢視索引
    SHOW INDEX FROM table_name;
    //檢視全部索引
    SHOW INDEX FROM table_name\G;
    //刪除索引
    DROP INDEX index_name ON table_name;
    
  5. 建立索引的指導

    • 頻繁搜尋的列
    • 經常用作查詢選擇的列
    • 經常排序、分組的列
    • 經常用作連線的列(主鍵/外來鍵)
    • 僅包含幾個不同值或表內容僅有幾行不適合建立索引
  6. 注意事項

    • 查詢時減少使用*返回全部列,不要返回不需要的列
    • 索引應該儘量小,在位元組數小的列上簡歷索引
    • WHERE子句中有多個表示式時,包含索引列的表示式應置於其他條件之前
    • 避免在ORDER BY 子句中使用表示式

【資料庫事務】

  1. 事務的特性,簡稱ACID屬性

    • 原子性(Atomicity)

    事務是一個完整的操作,事務的各步操作是不可分的,要麼全執行,要麼都不執行

    • 一致性(Consistency)

    當事務完成時,資料必須處於一致狀態

    • 隔離性(Isolation)

    併發事務之間彼此隔離、獨立,它不應以任何方式依賴於或影響其他事務

    • 永續性(Durability)

    事務完成後,它對資料庫的修改被永久儲存

  2. 事務的操作(需要儲存引擎支援)

    • 開始事務(BEGIN或START TRANSACTION)
    • 提交事務(COMMIT)
    • 回滾事務(ROLLBACK)
    • 關閉/開啟自動提交狀態
      • SET autocommit=0|1;(0為關閉,1為開啟,mysql預設開啟)

關閉自動提交後,從下一條語句開始則開啟新事務,需使用commit或rollback語句結束該事務(預設情況下,每條單獨的SQL語句視為一個事務)

【資料庫檢視】

  1. 檢視介紹

檢視是一張虛擬表,其結構和資料時簡歷在對錶的查詢基礎上,表示一張表的部分資料或多張表的綜合資料;檢視中不存放資料;一個原始表可以建立不同的檢視。

  1. 檢視的用途
    • 篩選表中的行
    • 防止未經許可的使用者訪問敏感資料
    • 降低操作資料庫的複雜程度
    • 將多個物理資料庫抽象為一個邏輯資料庫
  2. 檢視操作
    • 建立檢視
    CREATE VIEW view_name AS SELECT (值列表) FROM table_name;
    
    • 刪除檢視
    DROP VIEW [IF EXISTS] view_name;
    //用if exists 關鍵字判斷檢視是否存在
    
    • 檢視檢視
    SELECT (值列表) FROM view_name;
    //檢視所有檢視
    SHOW TABLE STATUS WHERE COMMENT='view';
    
  3. 注意事項
    • 檢視中可以使用多個表
    • 一個檢視可以巢狀另一個檢視
    • 對檢視資料進行新增、更新和刪除操作直接影響所引用表中的資料
    • 當檢視資料來自多個表時,不允許新增和刪除資料

【資料庫定義/控制/操作語法】

  1. 新增資料庫
CREATE DATABASE testdatabase;
  1. 刪除資料庫
DROP DATABASE testdatabase;
  1. 新增資料表
CREATE TABLE test2(uid INT(4) PRIMARY KEY AUTO_INCREMENT,uname VARCHAR(20) NOT NULL);

//修改表名
ALTER TABLE old_table_name RENAME new_table_name;
  1. 刪除資料表
DROP TABLE test2;
  1. 新增資料:
INSERT INTO table[(列名列表)] VALUES(值列表)//自增列不賦值,其他列一一對應;
    - 批量新增
        - 現有表插入新表,如新表已存在不能重複建立:
        CREATE TABLE new_table_name(查詢語句)//一個表只能執行一次
        create table phonelist(select stuno,stuphone from student);
        - 插入多條資料:
        INSERT INTO table[(列名列表)] VALUES(值列表1)(值列表2)...,(值列表n);
  1. 更新資料:
UPDATE table_name SET1=值,列2=值,...,列n=[WHERE 更新條件];
  1. 刪除資料:
DELETE FROM table_name [WHERE 刪除條件];//刪除表中資料
    批量刪除:TRUNCATE TABLE table_name; 
    TRUNCATE TABLE注意:*如刪除所有資料,推薦使用此命令
        1.刪除資料無法恢復
        2.自增列重新計數
        3.無法刪除有外來鍵關聯的主表
  1. 表字段操作
//新增欄位
ALTER TABLE table_name ADD column1_name column1_type,...;

//刪除欄位:
ALTER TABLE table_name DROP COLUMN column_name;

//修改欄位:
ALTER TABLE table_name ALTER COLUMN column_name column_type;

//修改欄位名
ALTER TABLE table_name CHANGE column_name new_name column_type;

//組合主鍵
ALTER TABLE table_name ADD CONSTRAINT primary_key_name PRIMARY KEY table_name(column1,column2,...);

//新增外來鍵
ALTER TABLE foreign_table_name ADD CONSTRAINT foreign_key_name FOREIGN KEY (column_name) REFERENCES primary_table_name(column_name);

//刪除外來鍵
ALTER TABLE foreign_table_name DROP FOREIGN KEY foreign_key_name;

【資料查詢語法】

  • 基本語法
    SELECT */列名列表 FROM table [WHERE 查詢條件]
    select * from user where id=1;
  • 分組,用在WHERE 之後
    GROUP BY (column1[,column2,...])
    //select後的表示式對每一個分組只能返回一個值
    SELECT * FROM user where id>20 GROUP BY gender;
  • 分組後篩選,用在GROUP BY 之後
    HAVING 篩選條件(只能是聚合函式的形式)
    //將使用聚合函式計算並分組後的資料按條件篩選
    SELECT *,COUNT(score) FROM user where id>20 GROUP BY name HAVING COUNT(score)>60;
  • 排序
    ORDER BY (colunm1 [ASC/DESC],column2 [ASC/DESC],...) 
    //ASC預設升序/DESC降序
    SELECT *,COUNT(score) FROM user where id>20 GROUP BY name HAVING COUNT(score)>60 ORDER BY id DESC;
  • 分頁
    MySQL分頁:
    LIMIT [起始值(下標從0開始)]頁容量;
    
    Oracle分頁:
    select column1,column2 fromselect column1,column2,rn from
            (select column1,column2,rowNum rn from table) 
        where rn<=最大值)
    where rn>最小值
  • 高階查詢
  1. 表連線查詢(更適合檢視多表資料)
    1.內連線(等值連線/取交集)
    SELECT u.*,r.roleName FROM smbms_user u 
    INNER JOIN smbms_role r ON u.`userRole`=r.`id`
    INNER JOIN ...  ON  ...
    [WHERE 查詢條件];
    2.外連線(以左/右表為主,未匹配的欄位為null) 
    SELECT u.*,r.roleName FROM smbms_user u RIGHT [OUTER] JOIN smbms_role r ON u.`userRole`=r.`id`;
    
    //所有的表連線查詢都可以用子查詢替換,反之不對。
  1. 模糊查詢
    //LIKE :一般與字串欄位配合使用
    萬用字元:%(匹配N多字元)
            _(匹配一個字元)
            [](該位置取值在給定範圍內)
            [^](取值不在給定範圍內)
    SELECT *
    FROM smbms_user
    WHERE userName LIKE '%張%'
    WHERE userName LIKE '張_'
    WHERE phone LIKE '13[5-9]%'
    
    //between:取值是連續的區間
    SELECT *
    FROM smbms_user
    WHERE birthday BETWEEN '1971-1-1' AND '1999-12-12';
    
    //IN / NOT IN:取值為集合,可以跟隨返回多條記錄的子查詢
    SELECT * FROM smbms_user where id IN(1,2,3);
    SELECT * FROM smbms_user where id NOT IN(SELECT id FROM smbms_user WHERE userRole>1);
  1. 子查詢(適合作為增刪改查的條件)
    可以出現在任何表示式可以出現的位置
    //例如查詢年齡小於趙燕的使用者
    SELECT userName FROM smbms_user 
        WHERE age<(SELECT age FROM smbms_user 
            WHERE userCode='zhaoyan');
    //子查詢和比較運算子聯合使用時,必須保證子查詢返回的結果不能多於一個
    
    

【MySQL儲存引擎】

  1. InnoDB,適用多刪除、更新操作,安全性高,事務處理及併發控制
  2. MyISAM,不需要事務,空間小,以查詢為主
  3. 其他引擎(需查詢)

設定表的儲存引擎

CREATE TABLE testtable(
    id int(10) primary key auto_increment
)ENGINE=InnoDB;

資料表的儲存位置,可檢視my.ini

【MySQL常用函式】

  1. 聚合函式
    • AVG(),返回某欄位的平均值
    • COUNT(),返回某欄位的行數
    • MAX(),返回某欄位的最大值
    • MIN(),返回某欄位的最小值
    • SUM(),返回某欄位的和
count(*)包括了所有的列,相當於行數,在統計結果的時候,不會忽略列值為NULL  
count(1)包括了忽略所有列,用1代表程式碼行,在統計結果的時候,不會忽略列值為NULL  
count(列名)只包括列名那一列,在統計結果的時候,某個欄位值為NULL時,不統計。
列名為主鍵,count(列名)會比count(1)快  
列名不為主鍵,count(1)會比count(列名)快  
如果表多個列並且沒有主鍵,則 count(1) 的執行效率優於 count(*)  
如果有主鍵,則 select count(主鍵)的執行效率是最優的  
如果表只有一個欄位,則 select count(*)最優。
  1. 字串函式
    • CONCAT(str1,str2),字串連結
    • INSERT(str,index,len,newstr),將字串str中起始位置為index且長度為len的字串替換為newstr(index起始值1)
    • LOWER(str),將字串轉為小寫
    • UPPER(str),將字串轉為大寫
    • SUBSTRING(str,index,len),從str中擷取起始位置index且長度為len的字串(index起始值1)
  2. 時間日期函式
    • CURDATE(),獲取當前日期 2018-11-1
    • CURTIME(),獲取當前時間 20:32:30
    • NOW(),獲取當前日期和時間 2018-11-1 20:32:50
    • WEEK(date),返回日期date為一年中的第幾周
    • YEAR(date),返回日期date中的年份
    • HOUR(date),返回date中的小時值
    • MINUTE(date),返回date中的分鐘值
    • DATEDIFF(date1,date2),返回日期之間相隔的天數date1>date2
    • ADDDATE(date,n),返回date加上n天后的日期
  3. 數學函式
    • CEIL(X),取天花板值 select ceil(2.3) 返回3
    • FLOOR(X),取地板值 select floor(2.3) 返回2
    • RAND(),返回0-1之間的隨機數

【MySQL中常用命令】

  1. 連線MySQL
mysql -u[username] -p[password]
  1. 檢視所有資料庫
show databases;
  1. 轉換當前庫資料庫
use database_name;
  1. 展示當前庫所有表
show tables;
  1. 退出資料庫
exit

【MySQL的資料型別】

  1. 整數型別
    • smallint, 2位元組
    • int, 4位元組
    • Integer, 同int,預設int(11)
    • bigint, 8位元組 2.浮點數
    • float, 4位元組
    • double, 8位元組
  2. 字元型別
    • char, 不可變長度
    • varchar, 可變長度
  3. 日期型別
    • data, yyyy-mm-dd
    • datatime, yyyy-MM-dd hh:mm:ss
    • time, hh:mm:ss
    • timestamp, 更精確的時間
    • year, yyyy
  4. 其他型別
    • blob, 存放二進位制檔案
    • text, 存放大量文字資訊