MySQL基礎學習筆記

1、數據庫基本概念

1.1 數據庫 - Database

從字面意思看,數據庫就是一個存儲數據的倉庫。從計算機的角度來說,數據庫(Datebase)是按照數據結構來組織、存儲和管理數據的倉庫。html

簡單來講,能夠將數據庫視爲電子化的一個文件櫃。用戶能夠對文件中的數據進行新增、更新和刪除等操做。mysql

數據庫中的一些常見術語:redis

  • 實體與實體集:客觀存在並相互區別的事物。可客觀理解爲相似於面向對象中的對象,但又不徹底相同。而實體集就是這些事物的集合。
  • 屬性:實體所具備的某一特性。可類比於面向對象中對象的屬性,即對象的成員變量。
  • 聯繫與聯繫集:實體與實體之間的關係,而聯繫集就是這些關係的集合。
    • 聯繫通常分爲三種,分別爲一對一,一對多和多對多
    • 好比學生實體與班級實體,就是一對多,即一個學生只屬於一個班級,而一個班級裏有多個學生

1.2 數據庫管理系統 - DBMS

管理關係型數據庫的計算機軟件就是關係數據庫管理系統。經常使用的關係數據庫管理軟件有Oracle、MySQL、SQL Server等。sql

這裏以MySQL的學習爲主。數據庫

1.3 關係型數據庫 - RDBMS

所謂關係型數據庫,是創建在關係模型基礎上的數據庫,藉助於集合代數等數學概念和方法來處理數據庫中的數據。現實世界中的各類實體以及實體之間的各類聯繫均用關係模型來表示。簡單說:關係型數據庫是由多張能互相聯接的二維行列表格組成的數據庫。編程

基於關係型數據庫的管理系統,咱們稱之爲關係數據庫管理系統(RDBMS)。安全

RDBMS的特色:微信

  • 數據以表格的形式出現
  • 每行爲各類記錄名稱
  • 每列爲記錄名稱所對應的數據域
  • 許多的行和列組成一張表單
  • 若干的表單組成database

RDBMS中的一些常見術語:數據結構

  • 數據表、列、行:以下圖一個簡單的學生表所示

  • 數據庫:相似於上圖中學生表同樣的不少個表的集合。數據庫設計

  • 冗餘:存儲兩倍的數據,冗餘下降了性能,但提升的數據的安全性。

  • 主鍵惟一標識數據表的一列或多列的組合。

  • 外鍵:關聯其餘表的列。

  • 索引:用於提升訪問數據庫表中特定信息的速度。索引是對數據庫表中一列或多列的值進行排序的一種結構。可類比於書籍中的目錄,可提升咱們查詢的效率。

2、E-R 模型

實體 - 聯繫模型,就是 E-R 模型。它給咱們提供了一種不受任何 DBMS 約束的面向用戶的表達方法。在數據庫設計中被普遍用做數據建模的工具。

E-R 模型的構成成分是實體集、屬性和聯繫集。經過 E-R 模型,咱們能獲得一個較爲清晰的關於整個數據結構的關係圖,由於 E-R 模型也稱爲 E-R 圖。

E-R 模型的表示方法:

  • 矩形框表示實體,實體名寫在矩形框內。
  • 橢圓表示實體的屬性,屬性名寫在橢圓內,並用無向邊,即直線與其對應的實體鏈接。
  • 菱形表示實體間的聯繫,聯繫名寫在菱形框內,將有聯繫的兩個實體分別用無向邊與菱形相連,並在連線上標明聯繫類形,即 1 - 一、 1 - N、M - N 。

簡單 E-R 圖示例:

3、SQL 語句簡介

3.1 什麼是 SQL

SQL,全稱是 Structured Query Language,即結構化查詢語言,它是一種特殊的編程語言,專用於對數據庫進行操做而設計的,用於對數據庫進行增、刪、改、查等操做。

3.2 SQL 分類

  • 數據定義語言,簡稱爲 DDL(Data Definition Language) ,用來定義數據庫對象,如數據庫表、列等。關鍵字包括:create,alter,drop 等。
  • 數據操做語言,簡稱爲 DML(Data Manipulation Language) ,用來對數據庫表進行操做。關鍵字包括:insert,delete,update 等。
  • 數據控制語言,簡稱爲 DCL(Data Control Language) ,用來定義數據庫的訪問權限和安全級別以及建立用戶。
  • 數據查詢語言,簡稱爲 DQL(Data Query Language) ,用來查詢數據庫表的記錄。關鍵字包括:select,from,where等。

3.3 SQL 的通用語法

  • SQL 語句一般以分號結尾,它能夠單行或多行進行書寫
  • 可使用 /**/、—、#的方式進行註釋

4、MySQL

MySQL是當前最流行的關係型數據庫管理系統之一。

3.1 mac 下 MySQL 的安裝

mac下安裝軟件通常有兩種方式,一是在官網上下載安裝包,像安裝普通軟件同樣進行安裝;另外一種則是使用 mac 上的包管理器 homebrew 來進行安裝。

兩種安裝方式可參考:

https://www.jianshu.com/p/fd3aae701db9

安裝完後輸入:mysql -u root -p,回車後輸入密碼便可登陸 MySQL 命令行界面。

3.2 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

3.3 簡單的 SQL 語句

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 關鍵字能夠對字符串進行模糊查詢
-- 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;
-- 回車後輸入密碼

3.4 聚合函數

使用聚合函數的基礎就是使用分組語句,使用語法以下:

-- 語法 SELECT f1,f2.. , function(fn) FROM ... WHERE ... GROUP BY f1,f2...
-- 注意 SELECT 後的屬性要和 GROUP BY 中的一致,只能比後面的少,不能超過,不然會報錯
-- 查詢學生信息中有哪些年齡段的學生
SELECT age FROM student GROUP BY age;

常見的聚合函數以下幾種:

  • AVG:求平均值
-- 在 GROUP BY 語句中,SELECT 後能夠接受 function(fn) 
-- 這裏的 function 就是聚合函數
-- function 後接受的屬性能夠是任意屬性
-- 求不一樣性別學生年齡的平均值
SELECT gender, AVG(age) FROM student GROUP BY gender;
  • COUNT:求總個數
-- 求不一樣性別學生的總人數
SELECT gender, count(*) FROM student GROUP BY gender;
  • MIN / MAX:求最小或最大值
-- 求不一樣性別下最大的年齡
SELECT MAX(age),gender FROM student GROUP BY gender;
  • SUM:求和
-- 求不一樣性別下的年齡總和
SELECT SUM(age), gender FROM student GROUP BY gender;

3.5 表關聯查詢

準備數據,上面已經創建了一個學生表,學生應該隸屬於一個班級,咱們再創建一個班級表 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);
  • 內聯 - INNER JOIN
-- 內聯的意思是 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;
  • 左關聯與右關聯 - LEFT JOIN or REIGHT JOIN
-- 左關聯的意思是 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;

3.6 子查詢

子查詢的概念就是查詢嵌套,簡單說就是 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

相關文章
相關標籤/搜索