File 類
一 資料庫簡介
儲存資料的倉庫
本質上是一個檔案系統 以檔案的方式存在伺服器電腦上
所有關係型資料庫都可以使用通用的SQL語句進行管理
常見的資料庫軟體有 MySQL Oracle PostgreSQL...
二 MySQL簡介
開源免費的資料庫 小型資料庫 功能強大 已經被Oracle收購 MySQL6.x版本也開始收費
1. MySQL安裝
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 隔離級別字串;