從字面意思看,數據庫就是一個存儲數據的倉庫。從計算機的角度來說,數據庫(Datebase)是按照數據結構來組織、存儲和管理數據的倉庫。html
簡單來講,能夠將數據庫視爲電子化的一個文件櫃。用戶能夠對文件中的數據進行新增、更新和刪除等操做。mysql
數據庫中的一些常見術語:redis
管理關係型數據庫的計算機軟件就是關係數據庫管理系統。經常使用的關係數據庫管理軟件有Oracle、MySQL、SQL Server等。sql
這裏以MySQL的學習爲主。數據庫
所謂關係型數據庫,是創建在關係模型基礎上的數據庫,藉助於集合代數等數學概念和方法來處理數據庫中的數據。現實世界中的各類實體以及實體之間的各類聯繫均用關係模型來表示。簡單說:關係型數據庫是由多張能互相聯接的二維行列表格組成的數據庫。編程
基於關係型數據庫的管理系統,咱們稱之爲關係數據庫管理系統(RDBMS)。安全
RDBMS的特色:微信
RDBMS中的一些常見術語:數據結構
數據庫:相似於上圖中學生表同樣的不少個表的集合。數據庫設計
冗餘:存儲兩倍的數據,冗餘下降了性能,但提升的數據的安全性。
主鍵:惟一標識數據表的一列或多列的組合。
外鍵:關聯其餘表的列。
索引:用於提升訪問數據庫表中特定信息的速度。索引是對數據庫表中一列或多列的值進行排序的一種結構。可類比於書籍中的目錄,可提升咱們查詢的效率。
實體 - 聯繫模型,就是 E-R 模型。它給咱們提供了一種不受任何 DBMS 約束的面向用戶的表達方法。在數據庫設計中被普遍用做數據建模的工具。
E-R 模型的構成成分是實體集、屬性和聯繫集。經過 E-R 模型,咱們能獲得一個較爲清晰的關於整個數據結構的關係圖,由於 E-R 模型也稱爲 E-R 圖。
E-R 模型的表示方法:
簡單 E-R 圖示例:
SQL,全稱是 Structured Query Language,即結構化查詢語言,它是一種特殊的編程語言,專用於對數據庫進行操做而設計的,用於對數據庫進行增、刪、改、查等操做。
MySQL是當前最流行的關係型數據庫管理系統之一。
mac下安裝軟件通常有兩種方式,一是在官網上下載安裝包,像安裝普通軟件同樣進行安裝;另外一種則是使用 mac 上的包管理器 homebrew 來進行安裝。
兩種安裝方式可參考:
https://www.jianshu.com/p/fd3aae701db9
安裝完後輸入:mysql -u root -p,回車後輸入密碼便可登陸 MySQL 命令行界面。
MySQL 中常見數據類型以下表所示:
類型 | 大小 | 範圍(有符號) | 範圍(無符號) | 用途 |
---|---|---|---|---|
TINYINT | 1字節 | (-128, 127) | (0, 255) | 小整數值 |
INT | 4字節 | (-2^31, 2^31-1) | (0, 2^32-1) | 較大整數值 |
BIGINT | 8字節 | (-2^65, 2^65-1) | (0, 2^64-1) | 大整數值 |
FLOAT | 4字節 | 浮點數 | ||
DOUBLE | 8字節 | 浮點數 | ||
DATE | 3字節 | YYYY-MM-DD | ||
TIME | 3字節 | HH:MM:SS | ||
VARCHAR | 0-65535字節 | 可變長度字符串 | ||
ENUM | 枚舉類型 |
詳細可參考:
http://www.runoob.com/mysql/mysql-data-types.html
MySQL中的SQL語句是不區分大小寫的,推薦 SQL 關鍵字使用大寫。
這裏以在一個 test 數據庫中建立一個學生表爲例。學生有學號、姓名、性別、年齡四個屬性。
-- 語法:CREATE DATABSE database_name; CREATE DATABASE test;
SHOW DATABASE;
-- 語法:USE database_name; USE test;
-- 第一種方式 SELECT DATABASE(); -- 第二種方式,在命令行模式下輸入 status; -- 會顯示當前 MySQL 的一些基本狀況,包括鏈接信息等 -- 其中有一項是 Current database 表示當前數據庫
-- 語法:CREATE TABLE table_name (col_name1 col_type1, ... col_namen col_typen ) -- ENGINE(引擎)=InnoDB DEFAULT CHARSET=utf8 可省略 -- 在建立數據表時,最好指定表的編碼 CREATE TABLE student ( -- INT UNSIGNED 表示無符號整數,即只有正整數和0 -- AUTO_INCREMENT 表示自動增加,即咱們在插入數據時不用指定這個屬性的值,指定了也沒用 -- PRIMARY KEY 指定主鍵 id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, name VARCHAR(20), gender ENUM('男', '女', '保密'), age INT ); INSERT INTO test(id, k, v) VALUES(1, 'a', '0'), (1, 'b', 'x'), (1, 'c', '9'), (1, 'ab', 'c'), (1, 'set', 'aweg');
-- 語法:SHOW CREATE TABLE table_name; -- 會顯示錶的建立語句 SHOW CREATE TABLE student; -- 語法:DESC table_name; -- 會以表格的形式展現表中的字段及字段的類型等信息 DESC student;
-- ALTER TABLE tabel_name operation[ADD, MODIFY, CHANGE, DROP, CHARACTER SET] -- 給學生表添加列 班級號 - ADD -- 語法:ALTER TABLE table_name ADD new_col_name type; ALTER TABLE student ADD class_id int; -- 修改學生表中學生名字字段的類型,並添加約束不能爲空 - MODIFY -- 語法:ALTER TABLE table_name MODIFY col_name new type or new retriction; ALTER TABLE student MODIFY name VARCHAR(50) NOT NULL; -- 修改學生表中的表名,將 class_id 改成 cls_id - CHANGE -- 語法:ALTER TABLE table_name change old_col_name new_col_name new_col_type; ALTER TABLE student CHANGE class_id cls_id INT UNSIGNED; -- 刪除學生中的班級號 cls_id 列 -- 語法:ALTER TABLE table_name DROP col_name; ALTER TABLE student DROP cls_id; -- 修改表的字符集 -- 語法:ALTER TABLE table_name CHARACTER SET new_character; ALTER TABLE student CHARACTER SET gbk;
-- 語法:INSERT INTO table_name (field1, field2,...fieldn) VALUES (v1, v2,...vn), (vv1, vv2,...,vvn); INSERT INTO student(name, gender, age) VALUES('Demon', '男', 18), ('Semon', '女', 18) ,('haha', '男', 16), ('hehe', '男', 17), ('aaa', '女', 26);
-- SELECT v1, v2... FROM table_name WHERE conditions; -- * 表示查詢全部字段,通常建議寫出查詢的字段名稱,這樣更加容易閱讀 SELECT * FROM student; -- 查詢性別爲男的學生 SELECT * FROM student WHERE gender = '男'; -- 查詢語句是 SQL 語句中最複雜的,咱們通常在編寫 SQL 語句時都是寫的查詢語句
-- 使用 LIKE 關鍵字能夠對字符串進行模糊查詢 -- LIKE '_XXX'; 其中下劃線 _ 佔位,表示任意一個字符 -- 查詢學生表中以任意一個字符開頭,可是以 'emon' 結尾的學生信息 SELECT * FROM student WHERE name LIKE '_semon'; -- LIKE '%XXX'; 其中 % 表示任意一串字符,% 是與 LIKE 關鍵字最經常使用的組合 -- 查詢學生表中姓名包含 'mo' 的學生信息 SELECT * FROM student WHERE name LIKE '%mo%';
-- 大於(>),小於(<),大於等於(>=),不等於(!=)或(<>) -- 使用 AND 表示與 -- 查詢學生表中性別爲男而且年齡大於18的學生信息 SELECT * FROM student WHERE gender = '男' AND age > 18; -- 使用 OR 表示或 -- 查詢學生表中性別爲女或者年齡不等於17的學生信息 SELECT * FROM student WHERE gender = '女' OR age <> 17; SELECT * FROM student WHERE gender = '女' OR age != 17;
-- UPDATE table_name SET f1 = v1, f2 = v2... WHERE conditions; -- 將性別爲男的學生的年齡修改成20 UPDATE student SET age = 20 WHERE gender = '男';
-- 語法:SELECT f1,f2.. FROM table_name WHERE condifitons ORDER BY f1,f2.. [ASC [DESC]] -- ASC 表示升序,DESC 表示降序,默認是 ASC,可省略。 -- 將學生數據信息按照年齡升序排序 SELECT * FROM student ORDER BY age [ASC]; -- 降序 SELECT * FROM student ORDER BY age DESC;
-- 語法:DELETE FROM table_name WHERE conditions; -- 刪除性別爲男的學生 DELETE FROM student WHERE gender = '男';
RENAME TABLE old_table_name TO new_table_name;
DROP TABLE table_name;
-- 在已經登陸 MySQL 後: DROP DATABASE database_name; -- 若是沒登陸前: mysqladmin -u root -p drop database_name; -- 回車後輸入密碼
使用聚合函數的基礎就是使用分組語句,使用語法以下:
-- 語法 SELECT f1,f2.. , function(fn) FROM ... WHERE ... GROUP BY f1,f2... -- 注意 SELECT 後的屬性要和 GROUP BY 中的一致,只能比後面的少,不能超過,不然會報錯 -- 查詢學生信息中有哪些年齡段的學生 SELECT age FROM student GROUP BY age;
常見的聚合函數以下幾種:
-- 在 GROUP BY 語句中,SELECT 後能夠接受 function(fn) -- 這裏的 function 就是聚合函數 -- function 後接受的屬性能夠是任意屬性 -- 求不一樣性別學生年齡的平均值 SELECT gender, AVG(age) FROM student GROUP BY gender;
-- 求不一樣性別學生的總人數 SELECT gender, count(*) FROM student GROUP BY gender;
-- 求不一樣性別下最大的年齡 SELECT MAX(age),gender FROM student GROUP BY gender;
-- 求不一樣性別下的年齡總和 SELECT SUM(age), gender FROM student GROUP BY gender;
準備數據,上面已經創建了一個學生表,學生應該隸屬於一個班級,咱們再創建一個班級表 class ,班級表的字段有班級編號、班級名稱。
-- 建立班級數據庫表 CREATE TABLE class (id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, name VARCHAR(20)); -- 插入數據 INSERT INTO class(name) VALUES ('班級一'), ('班級三'), ('班級二'), ('班級四'); -- 設置外鍵 ALTER TABLE student ADD CONSTRAINT FK_ID FOREIGN KEY(class_id) REFERENCES class(id); -- 清空學生表的數據,並從新插入測試數據 DELETE FROM student; INSERT INTO student(name, gender, age, class_id) VALUES('Demon', '男', 18, 1), ('Semon', '女', 18, 1) ,('haha', '男', 16, 2), ('hehe', '男', 17, 3), ('aaa', '女', 26, 3); INSERT INTO student(name, gender, age) VALUES('eee', '男', 18);
-- 內聯的意思是 A 與 B 關聯,A 與 B 都有的數據 -- 語法:SELECT ... FROM A INNER JOIN B ON conditions WHERE conditions; -- INNER 能夠省略 -- 查詢學生分別在哪些班級 -- AS 表示別名 SELECT s.id AS '學號', s.name AS '學生姓名', c.name AS '班級名稱' FROM student AS s JOIN class AS c ON s.class_id = c.id;
-- 左關聯的意思是 A 與 B 關聯,則以 A 中的數據爲主,A的數據會顯示完整 -- 右關聯的意思是 A 與 B 關聯,則以 B 中的數據爲主,B的數據會顯示完整 -- 查詢班級的分配狀況,這樣不管班級有沒有安排學生,都須要顯示 SELECT c.id AS '班級編號', c.name AS '班級名稱', s.name AS '學生姓名' FROM class AS c LEFT JOIN student AS s ON c.id = s.class_id; SELECT c.id AS '班級編號', c.name AS '班級名稱', s.name AS '學生姓名' FROM student AS s RIGHT JOIN class AS c ON c.id = s.class_id;
子查詢的概念就是查詢嵌套,簡單說就是 SELECT 後或者 WHERE 條件後依然嵌套有 SELECT 語句。其實也很好理解,由於 FROM 關鍵字後面接受的是一個表,而一個表其實就是一個數據集,而咱們使用 SELECT 語句查詢獲得就是一個數據集。因此咱們只須要簡單地將子查詢裏的 SELECT 語句單獨當作一個數據表就能簡化整個查詢語句了。
-- 一個簡單的例子 -- 查詢年齡最大的那個學生的姓名 /* 由於使用 MAX() 函數以後,不能再查詢其餘的字段,和分組的狀況同樣 因此咱們須要分兩步來實現: 1. 先查詢出最大的學生年齡 2. 而後在查詢條件里加上年齡等於查詢出的最大年齡 */ -- 查詢出最大的學生年齡 SELECT MAX(age) FROM student; -- 查詢年齡等於最大年齡的學生姓名 SELECT name FROM student WHERE age = (SELECT MAX(age) FROM student);
後面會繼續更新 MySQL 高級,包括函數、視圖、存儲過程等。還有 Python 與 MySQL 的交互。MongoDB與redis等。 若有問題,可加小編微信 Demon-5203