一小時教程 MySQL從安裝到使用 詳細步驟 完整圖文示例練習教程 學習筆記
一、寫在最前面
【2018.11.12 11:44 重新排版】
此教程是北大地理資訊系統資料庫概論專業課,前兩週課程自學內容整理。
注意:資料庫概論課程作業要求只需要掌握在MySQL客戶端輸入SQL語句進行操作即可,不包括命令列部分。所以步驟1234已經涵蓋課程基礎要求。安裝windows和mac版本步驟沒有大差別。mac可以直接進行步驟2。
具體推薦的學習步驟如下:
# 建立資料表的時候可能會對collation、engine等選項感到困惑,先直接使用預設選項。
Learn more(可以跳過):
3.閱讀正文:正文23部分(正文01可以跳過)。
4.繼續閱讀正文剩餘部分456...的筆記。同時可參照下方連結每個頁面的前面部分:
# 如對網站上的例項訓練有疑問,可看正文的01部分。
5.閱讀上方連結的後面部分(如下圖)。
常用單詞提示
(R)DBMS (關係型)資料庫管理系統;
Database schema 資料庫架構;Tables 資料表;
Columns 列;Indexes 索引;Views 檢視;Events 事件;Fields 欄位;
Engine 儲存引擎(資料表型別,如InnoDB);Collation 字符集(儲存格式,如utf-8);
Duplicate entry 重複錄入;Syntax 語法;
屬性(Attribute):表中的一列即一個屬性,通常稱為欄位(Field);
二、正文部分
簡單介紹:
MySql資料庫是開放原始碼的關係型資料庫。它可以提供的功能有:支援sql語言、子查詢、儲存過程、觸發器、檢視、索引、事務、鎖、外來鍵約束和影像複製等。
MySQL 具有一套對字元、單詞以及特殊符號的使用規定,MySQL 通過執行 SQL 指令碼來完成對資料庫的操作,該指令碼由一條或多條 MySQL語句(SQL語句 + 擴充套件語句)組成,儲存時指令碼檔案字尾名一般為.sql。在控制檯下,MySQL 客戶端也可以對語句進行單句執行而不用儲存為.sql檔案(mysql 命令提示視窗)。
- MySQL語法對大小寫不敏感,但是大寫更容易看出,建議使用大寫。
- 但是所有的資料庫名,表名,表字段都是區分大小寫的。所以使用SQL命令時需要輸入正確的名稱。
- 如果一條SQL語句太長,可以通過回車鍵建立一個新行,SQL語句的命令結束符為分號。
0.可以跳過:從命令列中連線mysql伺服器的步驟:
(使用root使用者登入,擁有最高許可權)
1.開啟命令列,進入安裝路徑C:\Program Files\MySQL\MySQL Server 5.7\bin。
2.輸入mysql -u root -p,回車。輸入密碼,回車。
3.登入成功,出現 mysql> 命令提示視窗,可以在上面執行SQL語句。
(之後和在MySQL客戶端輸入SQL語句是類似的)
1.可以跳過:命令列中MySQL資料庫命令
注意:在安裝路徑C:\Program Files\MySQL\MySQL Server 5.7\bin輸入以下命令(需要輸密碼)。
mysqladmin -u root -p create RUNOOB
建立 MySQL 資料庫 RUNOOB。
mysqladmin -u root -p drop RUNOOB
刪除資料庫RUNOOB,執行後會出現一個提示框,來確認是否真的刪除資料庫。
2.牢牢記住:管理MySQL的SQL語句
以下列出了使用Mysql資料庫過程中常用的命令(SQL語句):
(作為示範,資料庫名可以選擇world,資料表名可以選擇city)
CREATE SCHEMA 資料庫名;
建立 MySQL 資料庫 RUNOOB。
DROP SCHEMA 資料庫名;
刪除資料庫RUNOOB。
<分割線,補充幾句>
注意:重新整理之後才可以看到Navigator列表的相應變化。
</分割線,補充幾句>
USE 資料庫名;
選擇要操作的Mysql資料庫,使用該命令後所有Mysql命令都只針對該資料庫。
SHOW DATABASES;
列出 MySQL 資料庫管理系統的資料庫列表。
SHOW TABLES;
顯示指定資料庫的所有表,使用該命令前需要使用 use 命令來選擇要操作的資料庫。
SHOW COLUMNS FROM 資料表名;
顯示資料表的屬性,屬性型別,主鍵資訊 ,是否為 NULL,預設值等其他資訊。
SHOW INDEX FROM 資料表名;
顯示資料表的詳細索引資訊,包括PRIMARY KEY(主鍵)。
SHOW TABLE STATUS [FROM db_name] [LIKE 'pattern'] [\G];
該命令將輸出Mysql資料庫管理系統的效能及統計資訊。
- SHOW TABLE STATUS FROM 資料庫名;
顯示資料庫中所有表的資訊。
- SHOW TABLE STATUS FROM 資料庫名 LIKE 'c%';
顯示錶名以c開頭的表的資訊。
- SHOW TABLE STATUS FROM 資料庫名 LIKE 'c%'\G;
加上 \G,查詢結果按列列印。
3.瞭解一下:MySQL 資料型別
MySQL 有三大類資料型別, 分別為數字、日期\時間、字串, 這三大類中又更細緻的劃分了許多子型別:
數字型別
整數:tinyint、smallint、mediumint、int、bigint
浮點數:float、double、real、decimal
日期和時間
date、time、datetime、timestamp、year
字串型別
字串:char、varchar
文字:tinytext、text、mediumtext、longtext
二進位制(可用來儲存圖片、音樂等):tinyblob、blob、mediumblob、longblob
Learn more:
<分割線,補充幾句>
按照最開頭的5min入門連結,應該就可以建立如上的Schema(student)和Table(student_table1)並檢視。
實際上之前圖形介面的操作都會有對應的SQL語句顯示,所以按照那個學語法應該會比較簡單。
Anyway,下面就用這個Table來做演示。
</分割線,補充幾句>
4.牢牢記住:SQL語句——資料處理
插入資料:
INSERT INTO 資料表名 ( field1, field2,...fieldN )
VALUES ( value1, value2,...valueN );
示例:
INSERT INTO student_table1 (name, id, age, class )
VALUES (1, 2, 3, 4);
查詢資料:(SQL SELECT語句使用WHERE 子句)
SELECT column_name,column_name
FROM table_name
[WHERE Clause]
[LIMIT N][ OFFSET M];
Learn more:
示例:
SELECT * from student_table1 WHERE name=1;
查詢資料通用句式:
SELECT field1, field2,...fieldN FROM 資料表名1, 資料表名2...
[WHERE condition1 [AND [OR]] condition2.....;
Learn more:
示例:
SELECT * from student_table1 WHERE name=1;
修改資料:(SQL UPDATE語句使用WHERE 子句)
UPDATE 資料表名 SET field1=new-value1, field2=new-value2
[WHERE Clause];
示例:
UPDATE `student`.`student_table1` SET `class`=NULL WHERE `name`='1' and`id`='2' and`age`='3' and`class`='4';
刪除資料:
DELETE FROM 資料庫名.資料表名 [WHERE Clause];
Learn more:
示例:
DELETE FROM `student`.`student_table1` WHERE `name`='2' and`id`='3' and`age`='4' and`class`='5';
不完全匹配查詢資料:
SELECT field1, field2,...fieldN FROM 資料表名
WHERE field1 LIKE condition1 [AND [OR]] filed2 = 'somevalue';
# SQL LIKE 子句中使用百分號 %字元來表示任意字元,類似於UNIX或正則表示式中的星號 *。
# 如果沒有使用百分號 %, LIKE 子句與等號 = 的效果是一樣的。
示例:
SELECT * from student_table1 WHERE name LIKE '%1';
條件組合查詢資料:
SELECT expression1, expression2, ... expression_n
FROM tables [WHERE conditions]
UNION [ALL | DISTINCT]
SELECT expression1, expression2, ... expression_n
FROM tables [WHERE conditions];
# UNION 操作符用於連線兩個以上的 SELECT 語句的結果組合到一個結果集合中。多個 SELECT 語句會刪除重複的資料。
排序資料:(SELECT 語句使用 ORDER BY 子句將查詢資料排序後再返回)
SELECT field1, field2,...fieldN table_name1, table_name2...
ORDER BY field1, [field2...] [ASC [DESC]];
# 讀取表中指定資料並按指定欄位欄位的升序/降序排列。
Learn more:
示例:
SELECT * from student_table1 ORDER BY name ASC;
分組資料:
SELECT column_name, function(column_name) FROM table_name
WHERE column_name operator value GROUP BY column_name;
Learn more:
示例:
請照著上面連結的例項做,依次執行語句即可。注意!第一段語句前加上:
CREATE SCHEMA RUNOOB;
USE RUNOOB;
多資料表查詢資料:(在SELECT, UPDATE和DELETE語句中使用JOIN子句)
Learn more:
示例:
請照著上面連結的例項做,下載資料庫並依次執行語句即可。
NULL 值處理:
IS NULL:當列的值是 NULL,此運算子返回 true。
IS NOT NULL:當列的值不為 NULL, 運算子返回 true。
<=>:比較操作符(不同於=運算子),當比較的的兩個值為 NULL 時返回 true。
# 查詢條件欄位為 NULL 時,命令可能無法正常工作。
# 關於 NULL 的條件比較運算比較特殊的。不能使用 = NULL 或 != NULL 在列中查詢 NULL 值 。
# NULL 值與任何其它值的比較(即使是 NULL)永遠返回 false,即 NULL = NULL 返回false 。
正則表示式:
5.理解一下:MySQL的事務概念
- 事務(transaction)是使用者定義的一個數據庫操作序列,這些操作要麼全做要麼全不做,是一個不可分割的工作單位(保證成批的 SQL 語句要麼全部執行,要麼全部不執行)。
- MySQL 事務主要用於處理操作量大,複雜度高的資料。
- 事務的四個特性(ACID):原子性(A),一致性(C),隔離性(I),永續性(D)
事務控制語句:
BEGIN或START TRANSACTION;
顯式地開啟一個事務。
COMMIT;
也可以使用COMMIT WORK,不過二者是等價的。COMMIT會提交事務,並使已對資料庫進行的所有修改稱為永久性的。
ROLLBACK;
有可以使用ROLLBACK WORK,不過二者是等價的。回滾會結束使用者的事務,並撤銷正在進行的所有未提交的修改。
SAVEPOINT identifier;
SAVEPOINT允許在事務中建立一個儲存點,一個事務中可以有多個SAVEPOINT。
RELEASE SAVEPOINT identifier;
刪除一個事務的儲存點,當沒有指定的儲存點時,執行該語句會丟擲一個異常。
ROLLBACK TO identifier;
把事務回滾到標記點。
SET TRANSACTION;
用來設定事務的隔離級別。InnoDB儲存引擎提供事務的隔離級別有READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ和SERIALIZABLE。
MYSQL 事務處理實現:
1、用 BEGIN, ROLLBACK, COMMIT來實現
BEGIN 開始一個事務
ROLLBACK 事務回滾
COMMIT 事務確認
2、直接用 SET 來改變 MySQL 的自動提交模式:
SET AUTOCOMMIT=0 禁止自動提交
SET AUTOCOMMIT=1 開啟自動提交
Learn more:
6.牢牢記住:SQL語句——ALTER命令(資料表&欄位)
刪除、新增欄位:
ALTER TABLE 資料表名 DROP i;
ALTER TABLE 資料表名 ADD 新欄位名 欄位型別 [FIRST[AFTER 已有欄位名]];
修改欄位名稱、型別
ALTER TABLE 資料表名 CHANGE 欄位名 新欄位名 新欄位型別;
指定、修改、刪除欄位預設值:
ALTER TABLE 資料表名 MODIFY 欄位名 欄位型別 NOT NULL DEFAULT 預設值;
ALTER TABLE 資料表名 ALTER 欄位名 SET DEFAULT 預設值;
ALTER TABLE 資料表名 ALTER 欄位名 DROP DEFAULT;
示例:
ALTER TABLE student_table1 MODIFY id int NOT NULL DEFAULT 100;
INSERT INTO `student`.`student_table1` (`age`, `class`) VALUES ('1', '11');
INSERT INTO `student`.`student_table1` (`age`, `class`) VALUES ('1', '111');
INSERT INTO `student`.`student_table1` (`age`, `class`) VALUES ('1', '1111');
SELECT * FROM student.student_table1;
修改資料表型別:
ALTER TABLE 資料表名 ENGINE = 新資料表型別;
# 檢視資料表型別可以使用 SHOW TABLE STATUS 語句。
修改資料表名:
ALTER TABLE 資料表名 RENAME TO 新資料表名;