資料庫學習的一些基礎知識及常用命令(部分)
阿新 • • 發佈:2018-12-19
【資料庫基本概念】
- 一個表只能有一個主鍵(primary key),主鍵列不允許為空值(null)
- 一個表中可以有多個列作為主鍵列,但需要考慮最少性和穩定性
- 外來鍵(foreign key):確保“從表”中的某個資料項在“主表”中必須存在
【基本術語】
- DB:資料庫
- DBA:資料庫管理員
- DBM:資料庫管理系統
- DBS:資料庫系統
【SQL分類】
- DDL:資料定義語言
用來建立資料庫中的各種物件-----表、檢視、索引、同義詞、聚簇等.----CREATE
- 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;
- DML:資料操縱語言
主要有三種形式:插入:INSERT;更新:UPDATE;刪除:DELETE
- DQL:資料查詢語言
資料查詢語言DQL基本結構是由SELECT子句,FROM子句,WHERE子句組成的查詢塊: SELECT <欄位名錶> FROM <表或檢視名> WHERE <查詢條件>
【資料庫索引】
- 索引簡介
索引是一種有效組合資料的方式,為快速查詢到指定記錄
-
索引作用
- 提高資料庫的檢索速度
- 改善資料庫效能
-
索引分類
- B樹索引:InnoDB、MyISAM均支援
- 雜湊索引
-
常用索引
- 普通索引:允許在定義索引的列中插入重複值和空值
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);
- 空間索引:對空間資料型別的列建立的索引
-
檢視和刪除索引
//檢視索引 SHOW INDEX FROM table_name; //檢視全部索引 SHOW INDEX FROM table_name\G; //刪除索引 DROP INDEX index_name ON table_name;
-
建立索引的指導
- 頻繁搜尋的列
- 經常用作查詢選擇的列
- 經常排序、分組的列
- 經常用作連線的列(主鍵/外來鍵)
- 僅包含幾個不同值或表內容僅有幾行不適合建立索引
-
注意事項
- 查詢時減少使用*返回全部列,不要返回不需要的列
- 索引應該儘量小,在位元組數小的列上簡歷索引
- WHERE子句中有多個表示式時,包含索引列的表示式應置於其他條件之前
- 避免在ORDER BY 子句中使用表示式
【資料庫事務】
-
事務的特性,簡稱ACID屬性
- 原子性(Atomicity)
事務是一個完整的操作,事務的各步操作是不可分的,要麼全執行,要麼都不執行
- 一致性(Consistency)
當事務完成時,資料必須處於一致狀態
- 隔離性(Isolation)
併發事務之間彼此隔離、獨立,它不應以任何方式依賴於或影響其他事務
- 永續性(Durability)
事務完成後,它對資料庫的修改被永久儲存
-
事務的操作(需要儲存引擎支援)
- 開始事務(BEGIN或START TRANSACTION)
- 提交事務(COMMIT)
- 回滾事務(ROLLBACK)
- 關閉/開啟自動提交狀態
- SET autocommit=0|1;(0為關閉,1為開啟,mysql預設開啟)
關閉自動提交後,從下一條語句開始則開啟新事務,需使用commit或rollback語句結束該事務(預設情況下,每條單獨的SQL語句視為一個事務)
【資料庫檢視】
- 檢視介紹
檢視是一張虛擬表,其結構和資料時簡歷在對錶的查詢基礎上,表示一張表的部分資料或多張表的綜合資料;檢視中不存放資料;一個原始表可以建立不同的檢視。
- 檢視的用途
- 篩選表中的行
- 防止未經許可的使用者訪問敏感資料
- 降低操作資料庫的複雜程度
- 將多個物理資料庫抽象為一個邏輯資料庫
- 檢視操作
- 建立檢視
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';
- 注意事項
- 檢視中可以使用多個表
- 一個檢視可以巢狀另一個檢視
- 對檢視資料進行新增、更新和刪除操作直接影響所引用表中的資料
- 當檢視資料來自多個表時,不允許新增和刪除資料
【資料庫定義/控制/操作語法】
- 新增資料庫
CREATE DATABASE testdatabase;
- 刪除資料庫
DROP DATABASE testdatabase;
- 新增資料表
CREATE TABLE test2(uid INT(4) PRIMARY KEY AUTO_INCREMENT,uname VARCHAR(20) NOT NULL);
//修改表名
ALTER TABLE old_table_name RENAME new_table_name;
- 刪除資料表
DROP TABLE test2;
- 新增資料:
INSERT INTO table[(列名列表)] VALUES(值列表);
//自增列不賦值,其他列一一對應;
- 批量新增
- 現有表插入新表,如新表已存在不能重複建立:
CREATE TABLE new_table_name(查詢語句)//一個表只能執行一次
create table phonelist(select stuno,stuphone from student);
- 插入多條資料:
INSERT INTO table[(列名列表)] VALUES(值列表1),(值列表2),...,(值列表n);
- 更新資料:
UPDATE table_name SET 列1=值,列2=值,...,列n=值 [WHERE 更新條件];
- 刪除資料:
DELETE FROM table_name [WHERE 刪除條件];//刪除表中資料
批量刪除:TRUNCATE TABLE table_name;
TRUNCATE TABLE注意:*如刪除所有資料,推薦使用此命令
1.刪除資料無法恢復
2.自增列重新計數
3.無法刪除有外來鍵關聯的主表
- 表字段操作
//新增欄位
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 from
(select column1,column2,rn from
(select column1,column2,rowNum rn from table)
where rn<=最大值)
where rn>最小值
- 高階查詢
- 表連線查詢(更適合檢視多表資料)
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`;
//所有的表連線查詢都可以用子查詢替換,反之不對。
- 模糊查詢
//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);
- 子查詢(適合作為增刪改查的條件)
可以出現在任何表示式可以出現的位置
//例如查詢年齡小於趙燕的使用者
SELECT userName FROM smbms_user
WHERE age<(SELECT age FROM smbms_user
WHERE userCode='zhaoyan');
//子查詢和比較運算子聯合使用時,必須保證子查詢返回的結果不能多於一個
【MySQL儲存引擎】
- InnoDB,適用多刪除、更新操作,安全性高,事務處理及併發控制
- MyISAM,不需要事務,空間小,以查詢為主
- 其他引擎(需查詢)
設定表的儲存引擎
CREATE TABLE testtable(
id int(10) primary key auto_increment
)ENGINE=InnoDB;
資料表的儲存位置,可檢視my.ini
【MySQL常用函式】
- 聚合函式
- 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(*)最優。
- 字串函式
- 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)
- 時間日期函式
- 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天后的日期
- 數學函式
- CEIL(X),取天花板值 select ceil(2.3) 返回3
- FLOOR(X),取地板值 select floor(2.3) 返回2
- RAND(),返回0-1之間的隨機數
【MySQL中常用命令】
- 連線MySQL
mysql -u[username] -p[password]
- 檢視所有資料庫
show databases;
- 轉換當前庫資料庫
use database_name;
- 展示當前庫所有表
show tables;
- 退出資料庫
exit
【MySQL的資料型別】
- 整數型別
- smallint, 2位元組
- int, 4位元組
- Integer, 同int,預設int(11)
- bigint, 8位元組 2.浮點數
- float, 4位元組
- double, 8位元組
- 字元型別
- char, 不可變長度
- varchar, 可變長度
- 日期型別
- data, yyyy-mm-dd
- datatime, yyyy-MM-dd hh:mm:ss
- time, hh:mm:ss
- timestamp, 更精確的時間
- year, yyyy
- 其他型別
- blob, 存放二進位制檔案
- text, 存放大量文字資訊