1. 程式人生 > 實用技巧 >File 類

File 類

一 資料庫簡介

儲存資料的倉庫

本質上是一個檔案系統 以檔案的方式存在伺服器電腦上

所有關係型資料庫都可以使用通用的SQL語句進行管理

常見的資料庫軟體有 MySQL Oracle PostgreSQL...

二 MySQL簡介

開源免費的資料庫 小型資料庫 功能強大 已經被Oracle收購 MySQL6.x版本也開始收費

1. MySQL安裝

  Linux 安裝MySQL(使用Mac遠端訪問)

2. MySQL登入

  mysql -u使用者名稱 -p密碼

  mysql -hIP地址 -u使用者名稱 -p密碼

3. MySQL退出

  exit

  quit

4. MySQL常見資料型別

  INT 整數型別

  DOUBLE(X,Y) 小數型別 最多有X位 小數點後面保留Y位

  DATE 日期 只包含年月日 yyyy-MM-dd

  DATETIME 日期 包含年月日時分秒 yyyy-MM-dd HH:mm:ss

  TIMESTAMP 時間戳 預設使用當前的系統時間來自動賦值

  VARCHAR(X) 字串 最多有X個字元

三 SQL簡介

Structured Query Language 結構化查詢語言

定義了操作所有關係型資料庫的規則

通用的資料庫操作語言可以用在不同的資料庫中 不同的資料庫SQL語句有一些區別

四 SQL語句分類

1. DDL: Data Definition Language 資料定義語言 比如建庫 建表

2. DML:Data Manipulation Language 資料操作語言 比如對錶資料的增刪改

3. DQL:Data Query Language 資料查詢語言 比如對錶資料的查詢

4. DCL:Data Control Language 資料控制語言 比如對使用者許可權的設定

五 庫操作

建立資料庫

CREATE DATABASE 資料庫名稱;

建立資料庫 判斷不存在再建立

CREATE DATABASE IF NOT EXISTS 資料庫名稱;

建立資料庫 並指定預設編碼

CREATE DATABASE 資料庫名稱 CHARACTER SET utf8;

建立資料庫 判斷不存在再建立 並指定預設編碼

CREATE DATABASE IF NOT EXISTS 資料庫名稱 CHARACTER SET utf8;

刪除資料庫

DROP DATABASE 資料庫名稱;

刪除資料庫 判斷存在再刪除

DROP DATABASE IF EXISTS 資料庫名稱;

修改當前使用的資料庫

USE 資料庫名稱;

修改資料庫的字符集

ALTER DATABASE 資料庫名稱 CHARACTER SET utf8;

檢視當前使用的資料庫

SELECT DATABASE();

檢視所有資料庫

SHOW DATABASES;

檢視指定資料庫的定義資訊

SHOW CREATE DATABASE 資料庫名稱;

六 單表操作

建立表

CREATE TABLE account (
    aid INT,
    aname VARCHAR(100),
    amoney DOUBLE
);

建立表 指定主鍵 主鍵特點是非空且唯一

CREATE TABLE account (
    aid INT PRIMARY KEY,
    aname VARCHAR(100),
    amoney DOUBLE
);

建立表 指定主鍵 且主鍵自動增長

CREATE TABLE account (
    aid INT PRIMARY KEY AUTO_INCREMENT,
    aname VARCHAR(100),
    amoney DOUBLE
);

建立表 複製

CREATE TABLE account_new LIKE account;

刪除表

DROP TABLE account;

刪除表 判斷存在再刪除

DROP TABLE IF EXISTS account;

修改表名

ALTER TABLE account RENAME TO account_new;

修改表的字符集

ALTER TABLE account CHARACTER SET utf8;

修改表 新增列

ALTER TABLE account ADD asex INT;

修改表 修改列的型別 長度 約束

ALTER TABLE account MODIFY asex VARCHAR(1) NOT NULL;

修改表 修改列的名稱 型別 長度 約束

ALTER TABLE account CHANGE asex asex_new INT;

修改表 刪除列

ALTER TABLE account DROP asex_new;

檢視資料庫中的所有表

SHOW TABLES;

查看錶結構

DESC account;

檢視指定表的定義資訊

SHOW CREATE TABLE account;

七 單表資料操作

插入表紀錄

INSERT INTO account VALUES (1, '吃飯支出', 247);
INSERT INTO account (aid, aname, amoney) VALUES (2, '工資收入', 12345);
INSERT INTO account (aid, aname, amoney) VALUES (3, '服裝支出', 1000);
INSERT INTO account (aid, aname, amoney) VALUES (4, '吃飯支出', 325);
INSERT INTO account (aid, aname, amoney) VALUES (5, '股票收入', 8000);
INSERT INTO account (aid, aname, amoney) VALUES (6, '打麻將支出', 8000);
INSERT INTO account (aid, aname, amoney) VALUES (7, NULL, 5000);
INSERT INTO account (aid, aname, amoney) VALUES (8, '打麻將支出', 2000);

刪除所有記錄 一條一條刪除 不清空AUTO_INCREMENT記錄數

DELETE FROM account;

刪除所有記錄 直接將表刪除 重新建表 AUTO_INCREMENT歸零 效率更高

TRUNCATE TABLE account;

刪除指定記錄 一條一條刪除 不清空AUTO_INCREMENT記錄數

DELETE FROM account WHERE aid = 1;

修改所有記錄

UPDATE account SET aname = '錢都用光了';

修改指定記錄

UPDATE account SET aname = '撿到一袋子錢', amoney = 88888 WHERE aid = 1;

查詢語法

SELECT 欄位列表 FROM 表名列表 WHERE 條件列表 GROUP BY 分組欄位 HAVING 分組之後的條件 ORDER BY 排序 LIMIT 分頁

查詢所有欄位

SELECT * FROM account;

查詢指定欄位

SELECT aname, amoney FROM account;

查詢 去除重複記錄

SELECT DISTINCT amoney FROM account;

查詢 別名

SELECT * FROM account AS a;
SELECT * FROM account a;
SELECT aname, amoney AS money FROM account;
SELECT aname, amoney money FROM account;

查詢 運算

SELECT aname, amoney + 100 FROM account;

查詢 不等於

SELECT * FROM account WHERE aname <> '吃飯支出';

查詢 大於

SELECT * FROM account WHERE amoney > 1000;

查詢 之間

SELECT * FROM account WHERE amoney >= 2000 AND amoney <= 5000;
SELECT * FROM account WHERE amoney BETWEEN 2000 AND 5000;

查詢 或

SELECT * FROM account WHERE amoney = 1000 OR amoney = 3500 OR amoney = 5000;
SELECT * FROM account WHERE amoney IN (1000, 3500, 5000);

查詢 包含

SELECT * FROM account WHERE aname LIKE '%支出%';

查詢 字元長度匹配

SELECT * FROM account WHERE aname LIKE '_____';

查詢 不為NULL

SELECT * FROM account WHERE aname IS NOT NULL;
SELECT * FROM account WHERE NOT (aname IS NULL);

查詢 升序+降序

SELECT * FROM account ORDER BY amoney ASC, aid DESC;

查詢 條件+升序 排序必須放在最後

SELECT * FROM account WHERE aname LIKE '%支出%' ORDER BY amoney ASC;

查詢 求和 對錶中資料條數求和

SELECT COUNT(aid) FROM account;
SELECT COUNT(IFNULL(aname, 0)) FROM account;

查詢 求和 對錶中資料內容求和 一般是數值型

SELECT SUM(amoney) FROM account WHERE aname LIKE '%收入%';

查詢 最大值 一般是數值型

SELECT MAX(amoney) FROM account;

查詢 最小值 一般是數值型

SELECT MIN(amoney) FROM account;

查詢 平均值 一般是數值型

SELECT AVG(amoney) FROM account;

查詢 分組 必須跟隨聚合函式

SELECT aname, SUM(amoney) FROM account WHERE aname LIKE '%支出%' GROUP BY aname HAVING SUM(amoney) > 888 ORDER BY SUM(amoney) ASC;

查詢 分頁 引數一=開始索引 引數二=每頁顯示個數 pageSize

SELECT * FROM account LIMIT (N - 1) * pageSize, pageSize;
SELECT * FROM account LIMIT 0, 3;
SELECT * FROM account WHERE aname LIKE '%支出%' ORDER BY amoney ASC LIMIT 2, 2;

八 約束

對錶中的資料進行限定 保證資料的正確性 有效性和完整性

1. 主鍵約束 primary key

非空且唯一 一張表只能有一個欄位為主鍵 主鍵就是表中記錄的唯一標識

a. 在建立表時 新增主鍵約束

CREATE TABLE demo_primary_key (
    id INT PRIMARY KEY,
    name VARCHAR(20)
);

b. 刪除主鍵約束 刪除不了自動增長的主鍵

ALTER TABLE demo_primary_key DROP PRIMARY KEY;

c. 建立表後 新增主鍵約束

ALTER TABLE demo_primary_key MODIFY id INT PRIMARY KEY;

2. 非空約束 not null

值不能為null

a. 在建立表時 新增非空約束

CREATE TABLE demo_not_null (
    id INT,
    name VARCHAR(20) NOT NULL
);

b. 刪除非空約束

ALTER TABLE demo_not_null MODIFY name VARCHAR(20);

c. 建立表後 新增非空約束

ALTER TABLE demo_not_null MODIFY name VARCHAR(20) NOT NULL;

3. 唯一約束 unique

值不能重複

a. 在建立表時 新增唯一約束

CREATE TABLE demo_unique (
    id INT,
    name VARCHAR(20) UNIQUE
);

b. 刪除唯一約束

ALTER TABLE demo_unique DROP INDEX name;

c. 建立表後 新增唯一約束

ALTER TABLE demo_unique MODIFY name VARCHAR(20) UNIQUE;

4. 外來鍵約束 foreign key

讓表於表產生關係 從而保證資料的正確性

a. 在建立表時 新增外來鍵約束

CREATE TABLE 表名 (
    ...
    外來鍵列
    CONSTRAINT 外來鍵名稱 FOREIGN KEY (外來鍵欄位名稱) REFERENCES 主表名稱 (主表字段名稱)
);

b. 刪除外來鍵約束

ALTER TABLE 表名 DROP FOREIGN KEY 外來鍵名稱;

c. 建立表後 新增外來鍵約束

ALTER TABLE 表名 ADD CONSTRAINT 外來鍵名稱 FOREIGN KEY (外來鍵欄位名稱) REFERENCES 主表名稱 (主表字段名稱);

九 多表操作(一對多)

1. 表操作

建立表 一

CREATE TABLE category (
    cid VARCHAR(32) PRIMARY KEY,
    cname VARCHAR(100)
);

建立表 多

CREATE TABLE product (
    pid VARCHAR(32) PRIMARY KEY,
    pname VARCHAR(100),
    pprice DOUBLE,
    pcid VARCHAR(32)
);

新增外來鍵約束

ALTER TABLE product ADD CONSTRAINT product_fk FOREIGN KEY (pcid) REFERENCES category (cid);

刪除外來鍵約束

ALTER TABLE product DROP FOREIGN KEY product_fk;

2. 資料操作

插入表紀錄

INSERT INTO category VALUES ('c001', '家電');
INSERT INTO category VALUES ('c002', '服飾');
INSERT INTO category VALUES ('c003', '化妝品');
INSERT INTO product VALUES ('p001', '聯想', 5000, 'c001');
INSERT INTO product VALUES ('p002', '海爾', 3000, 'c001');
INSERT INTO product VALUES ('p003', '雷神', 5000, 'c001');
INSERT INTO product VALUES ('p004', 'JACK JONES', 800, 'c002');
INSERT INTO product VALUES ('p005', '真維斯', 200, 'c002');
INSERT INTO product VALUES ('p006', '花花公子', 440, 'c002');
INSERT INTO product VALUES ('p007', '勁霸', 2000, 'c002');
INSERT INTO product VALUES ('p008', '香奈兒', 800, 'c003');
INSERT INTO product VALUES ('p009', '相宜本草', 200, 'c003');

查詢 隱式內連線 兩表交集

SELECT * FROM category, product WHERE cid = pcid;

查詢 顯示內連線 兩表交集

SELECT * FROM category INNER JOIN product ON cid = pcid;

查詢 左外連線 左表全部和兩表交集

SELECT * FROM category LEFT JOIN product ON cid = pcid;

查詢 右外連線 右表全部和兩表交集

SELECT * FROM category RIGHT JOIN product ON cid = pcid;

查詢 子查詢 一條SELECT語句結果作為另一條SELECT語句一部分

SELECT * FROM product WHERE pcid = (SELECT cid FROM category WHERE cname = '化妝品');

十 多表操作(多對多)

建立表 多

CREATE TABLE goods (
    gid VARCHAR(32) PRIMARY KEY,
    gname VARCHAR(100),
    gprice DOUBLE
);

建立表 多

CREATE TABLE orders (
    oid VARCHAR(32) PRIMARY KEY,
    ototal_price DOUBLE
);

建立表 中間表

CREATE TABLE item (
    gid VARCHAR(32),
    oid VARCHAR(32)
);

新增外來鍵約束

ALTER TABLE item ADD CONSTRAINT item_goods_fk FOREIGN KEY (gid) REFERENCES goods (gid);
ALTER TABLE item ADD CONSTRAINT item_orders_fk FOREIGN KEY (oid) REFERENCES orders (oid);

刪除外來鍵約束

ALTER TABLE item DROP FOREIGN KEY item_goods_fk;
ALTER TABLE item DROP FOREIGN KEY item_orders_fk;

十一 資料庫設計正規化

設計資料庫時 需要遵循的一些規範 要遵循後邊的正規化要求 必須先遵循前邊的所有正規化要求

1. 第一正規化(1NF) 原子性

每一列都是不可分割的原子資料項

表中的每一列不可再拆分

2. 第二正規化(2NF) 不產生區域性依賴

在1NF的基礎上 非碼屬性必須完全依賴於碼

表中的每一列都完全依賴於主鍵

3. 第三正規化(3NF) 不產生傳遞依賴

在2NF的基礎上 任何非碼屬性不依賴於其它非碼屬性

表中的每一列都直接依賴於主鍵 而不是通過其它列來間接依賴於主鍵 資料不能存在傳遞關係

十二 資料庫命名規範

1. 採用26個英文字母(區分大小寫)和0-9的自然數(經常不需要)加上下劃線'_'組成 命名簡潔明確 多個單詞用下劃線'_'分隔

2. 全部小寫命名 禁止出現大寫

3. 禁止單獨使用資料庫關鍵字 比如name time password等等

4. 表名稱不應該取得太長(一般不超過三個英文單詞)

5. 用單數形式表示名稱 比如使用user而不是users

6. 表名 業務表字首business 系統表字首system

7. 如果該表主鍵需要作為別的多個表的外來鍵 需要有字首區分 並且命名一致 比如產品型別表business_product_type 表的主鍵會被產品表business_product和價格表business_price等多張表設為外來鍵 那麼business_product_type表的主鍵不能是id 應該是product_type_id 產品表business_product和價格表business_price的外來鍵命名也應該是product_type_id

十三 事務

1. 簡介

如果一個包含多個步驟的業務操作 被事務管理 那麼這些操作要麼同時成功 要麼同時失敗

2. 自動提交事務

MySQL預設每一條DML(增刪改)語句都是一個單獨的事務 每條語句都會自動開啟一個事務 語句執行完畢 自動提交事務 MySQL預設開啟自動提交事務

3. 手動提交事務

a. 執行成功的情況

  開啟事務 -> 執行多條SQL語句 -> 提交事務

  START TRANSACTION; -> SQL... -> COMMIT;

b. 執行失敗的情況

  開啟事務 -> 執行多條SQL語句 -> 回滾事務

  START TRANSACTION; -> SQL... -> ROLLBACK;

4. 修改事務提交方式

檢視事務提交方式

  SELECT @@autocommit; //0=手動提交 1=自動提交

修改事務提交方式

  set @@autocommit = 0; //0=手動提交 1=自動提交

5. 事務的四大特徵

原子性: 是不可分割的最小操作單位 要麼同時成功 要麼同時失敗

永續性: 當事務提交或回滾後 資料庫會持久化的儲存資料

隔離性: 多個事務之間 相互獨立

一致性: 事務操作前後 資料總量不變

6. 事務的隔離級別

多個事務之間保持隔離 互不影響 如果多個事務操作同一批資料 則會引發一些問題 設定不同的隔離級別就可以解決這些問題

a. 存在問題

1> 髒讀: 一個事務 讀取到另一個事務中沒有提交的資料

2> 不可重複讀(虛讀): 在一個事務中 兩次讀取到的資料內容不一樣 這是update時引發的問題

3> 幻讀: 在一個事務中 兩次讀取到的資料數量不一樣 這是insert或delete時引發的問題

b. 隔離級別

隔離級別越高 效能越差 安全性越高

1> read uncommitted 讀未提交

  產生的問題: 髒讀 不可重複讀 幻讀

2> read committed 讀已提交 Oracle預設

  產生的問題: 不可重複讀 幻讀

3> repeatable read 可重複讀 MySQL預設

  產生的問題: 幻讀

4> serializable 序列化

  可以解決所有的問題

c. 檢視資料庫隔離級別

檢視資料庫隔離級別

  select @@tx_isolation;

修改資料庫隔離級別 重新連線才會生效

  set global transaction isolation level 隔離級別字串;