在任何一組東西中,最重 要的只占其中一小部分,約20%,其余80%盡管是多數(shù),卻是次要的,這就是大家所知道的** 二八原則 ,換句話說:可以用最少的時間和精力學習到最核心的知識,即用20%的時間和精力來做到80%的效果,這也是這篇文章的初衷。本文將總結(jié)出MySQL中最常用的知識,以此達到快速學習的目的。MySQL是一個實用性工具,學習的最好方式是實踐,實踐,實踐**。
本文主要分為下面幾部分:
- 數(shù)據(jù)庫中涉及到的基本概念
- MySql安裝與連接及工具
- 數(shù)據(jù)操作
- 索引的簡單介紹
1 基本概念
數(shù)據(jù)庫
- 按照數(shù)據(jù)結(jié)構(gòu)來組織、存儲和管理數(shù)據(jù)的倉庫,可以理解為一個文件夾或者是倉庫,里面存放各種有結(jié)構(gòu)的數(shù)據(jù)
表
- 某種特定類型數(shù)據(jù)的結(jié)構(gòu)化列表,類似于EXCEL中的表格
模式
- 關于數(shù)據(jù)庫或表的描述信息,如表包含哪些列,每列的數(shù)據(jù)是數(shù)字還是文本等
列
- 表中的一個字段。所有表都是由一個或多個列組成的,同一列數(shù)據(jù)類型相同
行
- 表中的一個記錄,MySQL 中以行的形式存儲數(shù)據(jù)
主鍵
- 表中能夠唯一標識每一行數(shù)據(jù)的的一列或多列,如登記學生的信息,學生都有唯一的學號,這個學號就可以設置為主鍵,當然也可以用身份證號
2 MySql的安裝與工具
MySql的安裝
-
mysql下載地址
訪問上述下載地址,根據(jù)自己的操作系統(tǒng)選擇對應的安裝包,目前最新的版本已經(jīng)到了8.0,但是現(xiàn)在好多公司還是使用5.7左右的版本,因此也說明了版本不是越新越好的。
連接工具
安裝mysql后,連接數(shù)據(jù)庫有多種方法:
- 命令行連接
> mysql -h 127.0.0.1 -u root -p
-- 使用root用戶登錄到本地3306端口上的數(shù)據(jù)庫,也可以登錄遠程的,只要把-h 后面地址改成遠程ip即可
- 使用工具連接
主要圖形化工具有
兩個都是可以通過圖形界面的形式訪問數(shù)據(jù)庫。可根據(jù)個人使用喜好選擇。
3 SQL 語法
SQL 用于訪問和處理數(shù)據(jù)庫的標準的計算機語言,主要操作包括對數(shù)據(jù)庫,表及表中記錄的 增刪改查(CRUD)。在我們新安裝的數(shù)據(jù)庫系統(tǒng)中,只有系統(tǒng)庫,需要新建數(shù)據(jù)庫才能進行后續(xù)操作,所以先學習數(shù)據(jù)庫 的CRUD操作。
數(shù)據(jù)庫的操作
- 增
create database db_name; - 刪
drop database db_name; - 改
RENAME DATABASE db_name TO new_db_name - 查
show databases;
以上是數(shù)據(jù)庫所有的命令,很簡單吧,需要注意的是 SQL 命令是不區(qū)分大小寫的,一般習慣 sql支持的命令名稱 用大寫,其他自定義名稱用小寫,;表示 一條命令的結(jié)束,命令行時要查詢哪個數(shù)據(jù)庫下的表有兩種方式,一是用use db_name;切到對應數(shù)據(jù)庫下,以后的操作就是針對這個數(shù)據(jù)庫下的操作,二是可以使用db_name.table_name的全限定的方式查詢對應表。
表的操作
表的操作也有CRUD,不過稍微復雜一點。
- 查
show tables; - 刪
drop table table_name; - 改
alter table old_table_name rename to new_table_name - 增
CREATE TABLE tablename
(
column1 datatype [NULL|NOT NULL] [CONSTRAINTS],
column2 datatype [NULL|NOT NULL] [CONSTRAINTS],
...,
primary key(column1 )
);
注, [ ] 表示這一項可寫可不寫。
舉個例子,建一個名稱為 student 的表,有姓名 name,年齡 age,性別sex三列,建表語句如下:
CREATE TABLE `student` (
`name` varchar(30) CHARACTER SET utf8 NOT NULL,
`age` int(11) DEFAULT NULL,
`sex` char(1) CHARACTER SET utf8 NOT NULL,
PRIMARY KEY (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ;
表中記錄的操作
插入 insert
為了能進行實操,先學習如何插入記錄到表中,上面的例子中已經(jīng)新建了表student,假設插入如下數(shù)據(jù)到表中
| 姓名 | 年齡 | 性別 |
|---|---|---|
| 張三 | 20 | 男 |
| 李四 | 18 | 男 |
| 王五 | 16 | 男 |
| 韓梅梅 | 14 | 女 |
| 李雷 | 14 | 男 |
插入語句為:
INSERT INTO student(name,age,sex) VALUES('張三',20,'男');
INSERT INTO student(name,age,sex) VALUES('李四',18,'男');
INSERT INTO student(name,age,sex) VALUES('王五',16,'男');
INSERT INTO student(name,age,sex) VALUES('韓梅梅',14,'女');
INSERT INTO student(name,age,sex) VALUES('李雷',14,'男');
這樣我們就得到了5條數(shù)據(jù),也可以指定部分列進行插入,后面的值要和列對應??梢钥闯鱿虮碇胁迦霐?shù)據(jù)的基本格式為:
INSERT INTO table_name (column1,column2,column3,...)
VALUES (value1,value2,value3,...);
// 如果插入所有字段,table_name 后面的列可以省略。
特別的,可以從別的表中查詢插入,如向student2(和student表結(jié)構(gòu)一致) 表插入數(shù)據(jù)年齡大于15的學生(關于如何查詢下章介紹),SQL如下:
INSERT INTO student2
SELECT name,age,sex
FROM student
WHERE age > 15;
// 語句形式為:Insert into Table2(字段1,字段2
,...) select 字段1,字段2,... from Table1;
檢索
從表中查詢需要的數(shù)據(jù)又稱為檢索,支持查詢,去重,排序,分組,統(tǒng)計等操作。
單列,多列,所有列的檢索
語法格式:
SELECT col1[,col2,col3...] FROM table_name;
或:
SELECT * FROM table_name;
上面一條語句可以選擇表中的一列或者多列進行展示,而第二條語句則進行所有列展示,可用于不知道表中字段情況查詢。
去重 distinct
- distinct 作用于所有的列
SELECT DISTINCT col1[,col2,col3...] FROM table_name;
限制結(jié)果 limit
有時不需要展示太多條數(shù)據(jù),可以使用limit進行限制,語法如下:
SELECT col1[,col2,col3...]
FROM table_name
LIMIT n[,m];
limit 后面可帶一個數(shù)字,表示取幾條數(shù)據(jù),也可以用逗號隔開的兩條數(shù)據(jù),表示從第n條開始取,取m條數(shù)據(jù)。
注釋
注釋主要用來備注說明,或者有時候忽略掉不需要的語句,主要有兩種方式:
- 行內(nèi)注釋 -- 或#
- 多行注釋 /* */
如:
-- 這是行注釋, 注意-- 后面是要有一個空格的
# 這也是行注釋
SELECT * FROM table_name ...;
...
/*
這是多行注釋,可以換行
*/
SQL語句...
排序 order by
如果需要對查詢結(jié)果進行排序(升序或者降序),可以使用order by 子句,order by子句一定是select的最后一條子句,其還有如下特點:
- 后可加 多列
- 可按照列位置排序 即order by 1,2(1,2 表示select 后字段位置序號)
- 可按非選擇列排序,即不在select 后展示的列
- 默認升序asc, 倒序用desc
條件過濾 where
當需要按照條件進行篩選數(shù)據(jù)時,可用where 子句,where子句一般跟在表名之后,
- 支持的操作符有: + ,<> ,!= ,<, <=, >, >= ,BETWEEN ... AND ...,IS NULL,IS NOT NULL, 注意,IS NULL 不能用 = NULL 去判斷
- 邏輯操作符 AND OR
- 邏輯操作符優(yōu)先級
- 通配符過濾 like
- % 表示 任何字符出現(xiàn)任何次數(shù),但不會匹配NULL
- _ 只匹配單個字符
- [] 指定一個字符集,匹配指定位置的一個字符,可使用[^ ] 來否定
字段的計算
有時需要對多列字段進行組合或者一些計算以達到目的,主要支持的計算有:
- 字段拼接 concate函數(shù)
- 去前后空格 trim
- 字段別名(或叫導出列) As
- 算術運算 +-*/
函數(shù)
函數(shù)是輔助字段計算的方式,一般給定一定個數(shù)輸入,函數(shù)會輸出一個值,主要可以分為以下幾類,
- 文本處理函數(shù)
CONCAT(str1, str2, ...):拼接字符串
CONCAT_WS(separator, str1, str2, ...):使用指定分隔符連接字符串
LEFT(str, length):從左截取指定長度的子字符串
RIGHT(str, length):從右截取指定長度的子字符串
SUBSTRING(str, index, length):從指定位置處開始截取指定長度的子字符串
LENGTH(str):返回字符串的長度
LOWER(str):將字符串轉(zhuǎn)換為小寫格式
UPPER(str):將字符串轉(zhuǎn)換為大寫格式
LTRIM(str):去除字符串左側(cè)的空格
RTRIM(str):去除字符串右側(cè)的空格
TRIM(str):去除字符串兩側(cè)的空格
FORMAT(X, D):按照指定的小數(shù)位數(shù)D將數(shù)值X轉(zhuǎn)化為字符串
LPAD(str, length, padStr):在字符串左側(cè)用padStr將原字符串填充至指定長度,當指定長度小于原字符串長度時,截斷原字符串
RPAD(str, length, padStr):在字符串右側(cè)用padStr將原字符串填充至指定長度,當指定長度小于原字符串長度時,截斷原字符串
REPLACE(str, from_str, to_str):將字符串中的所有匹配的字符串替換為新字符串
REVERSE(str):將字符串逆序輸出
- 日期和時間處理函數(shù)
NOW():返回當前的時間和日期
CURDATE():返回當前的日期
CURTIME():返回當前時間
DATE(dateAndTime):提取日期時間表達式中的日期部分
DAY():返回日期時間表達式中的天數(shù)部分
YEAR():返回日期時間表達式中的年部分
EXTRACT(unit FROM date):按照指定的時間單位從日期時間表達式中提取年、月、日、時間等部分
DATE_FORMAT(date, format):按照指定格式顯示時間日期
DATE_ADD(date, INTERVAL exp unit)、DATE_SUB(date, INTERVAL exp unit):日期和時間的加減操作。返回值是否包含時間取決于給定的時間日期的表達式和時間單位。
DATEDIFF(date1, date2):返回兩個日期的差值,會忽略表達式中的時間,僅對日期進行運算
ADDDATE(date, INTERVAL exp unit):等同于DATE_ADD()
ADDDATE(date, days):在給定的日期上加上給定的天數(shù)
ADDTIME(time1, time2):將兩個時間表達式相加
- 數(shù)值處理函數(shù)
ABS() 返回一個數(shù)的絕對值
COS() 返回一個角度的余弦
EXP() 返回一個數(shù)的指數(shù)值
PI() 返回圓周率
SIN() 返回一個角度的正弦
SQRT() 返回一個數(shù)的平方根
TAN() 返回一個角度的正切
數(shù)據(jù)匯總
- 聚集函數(shù):對某些行運行的函數(shù),計算并返回一個值
AVG() 返回某列的平均值
COUNT() 返回某列的行數(shù),使用COUNT(*)對表中行的數(shù)目進行計數(shù),不管表列中包含的是空值(NULL)還是非空值。
使用COUNT(column)對特定列中具有值的行進行計數(shù),忽略NULL值
MAX() 返回某列的最大值
MIN() 返回某列的最小值
SUM() 返回某列值之和
數(shù)據(jù)分組
分組即根據(jù)一列或者幾列,將一個數(shù)據(jù)集劃分成若干個“子集”,然后針對若干個“子集”進行數(shù)據(jù)處理
- 分組是使用SELECT語句的GROUP BY子句建立的
- 在非分組的列(即非group by 后面的列)上可以使用 COUNT, SUM, AVG,等函數(shù)
- 過濾分組 having,支持所有WHERE操作符
語法:
SELECT column_name, function1(col1[,col2...])[, function2(col3,col4...)]
FROM table_name
WHERE condition
GROUP BY column_name
SELECT子句順序
| 子 句 | 說 明 | 是否必須使用 |
|---|---|---|
| SELECT | 要返回的列或表達式 | 是 |
| FROM | 從中檢索數(shù)據(jù)的表 | 僅在從表選擇數(shù)據(jù)時使用 |
| WHERE | 行級過濾 | 否 |
| GROUP BY | 分組說明 | 僅在按組計算聚集時使用 |
| HAVING | 組級過濾 | 否 |
| ORDER BY | 輸出排序順序 | 否 |
修改 update
UPDATE table_name SET field = new_val[, field = new_val] [ WHERE condition1 [and condition2]]
刪除 delete
DELETE FROM table_name WHERE condition1 [and condition2]- 全表內(nèi)容刪除
DELETE FROM table_nameorTRUNCATE TABLE table_name
組合與連接 union / join
組合 UNION /UNION ALL
UNION/UNION ALL 操作符用于連接兩個以上的 SELECT 語句的結(jié)果組合到一個結(jié)果集合中。UNION多個 SELECT 語句會刪除重復的數(shù)據(jù),而UNION ALL多個 SELECT 語句不會刪除重復的數(shù)據(jù)。
語法:
SELECT expression1, expression2, ... expression_n
FROM tables
[WHERE conditions]
UNION [ALL | DISTINCT]
SELECT expression1, expression2, ... expression_n
FROM tables
[WHERE conditions];
連接JOIN
前面主要是在一張表中讀取數(shù)據(jù),但是在真正的應用中經(jīng)常需要從多個數(shù)據(jù)表中讀取數(shù)據(jù)。本節(jié)介紹多表關聯(lián)連接操作JOIN。在 SELECT, UPDATE 和 DELETE 語句中都可使用 JOIN 來聯(lián)合多表查詢。
JOIN 按照功能大致分為如下三類:
- INNER JOIN(內(nèi)連接,或等值連接):獲取兩個表中字段匹配關系的記錄。
- LEFT JOIN(左連接):獲取左表所有記錄,即使右表沒有對應匹配的記錄。
- RIGHT JOIN(右連接): 與 LEFT JOIN 相反,用于獲取右表所有記錄,即使左表沒有對應匹配的記錄。
語法:
SELECT col1,col2 ...
FROM table1
INNER|LEFT|RIGHT JOIN table2
ON condition1[,condition2,...]
INNER JOIN

INNER JOIN,內(nèi)連接,或等值連接,主要產(chǎn)生同時符合table1和table2的一組數(shù)據(jù)
LEFT JOIN

LEFT JOIN左連接以左表table1為主表,即以主表產(chǎn)生一套完整的記錄,去右表中匹配的記錄 .如果沒有匹配到,則置為null
RIGTH JOIN

RIGTH JOIN右連接和 LEFT JOIN 正好相反,以右表table2為主表,即以右表產(chǎn)生一套完整的記錄,去左表中匹配的記錄 .如果沒有匹配到,則置為null。如果把 LEFT JOIN 中table1和table2互換位置,則結(jié)果等價于 RIGTH JOIN。
4 MySQL索引操作
索引的知識可以寫成一本書,這里只簡單介紹一部分。索引是一種特殊的文件,它們包含著對數(shù)據(jù)表里所有記錄的引用指針。更通俗的說,數(shù)據(jù)庫索引好比是一本書的目錄,能加快數(shù)據(jù)庫的查詢速度。
直接創(chuàng)建索引
CREATE [UNIQUE] INDEX index_name ON table_name(column1(length)[,column2(length),...]) ;
修改表結(jié)構(gòu)的方式添加索引
ALTER TABLE table_name ADD [UNIQUE] INDEX index_name ON (column1(length)[,column2(length),...]);
創(chuàng)建表的時候同時創(chuàng)建索引
CREATE TABLE `table_name` (
`id` int(11) NOT NULL AUTO_INCREMENT ,
`name` varchar(50) NOT NULL ,
`sex` char(3) NULL ,
`age` int(11) NULL DEFAULT NULL ,
PRIMARY KEY (`id`),
[UNIQUE] INDEX index_name (name(length))
);
刪除索引
DROP INDEX index_name ON table_name;
幫助文檔使用
在 MySQL 使用過程中,可能經(jīng)常會遇到以下問題:
- 某個操作語法突然忘記了
- 當前版本上,都支持哪些函數(shù)?
- 當前版本上,是否支持某個功能?
當然我們可能想到查找 MySQL 的文檔。但是卻要耗費大量的時間和精力。 所以對于以上問題,最好的解決辦法是使用 MySQL 安裝后自帶的幫助文檔,在遇到問題時可以方便快捷地進行查詢
按照層次看幫助
如果不知道幫助能夠提供些什么,可以用?contents 或者 help contents命令來顯示所有可供查詢的的分類,然后對于列出的分類,可以使用help 類別名稱的方式針對用戶感興趣的內(nèi)容做進一步的查看。
快速查閱幫助
在實際應用當中,如果需要快速查閱某項語法時,可以使用關鍵字進行快速查詢。例如,想知道 show 命令都能看些什么東西,可以用如下命令:? show 或 help show
又如,想查看 CREATE TABLE 的語法,可以使用以下命令:
? CREATE TABLE 或 help CREATE TABLE
常用的網(wǎng)絡資源
https://www.mysql.com/ 是 MySQL 的官方網(wǎng)站,可以下載到各個版本的 MySQL 以及相關客戶端開發(fā)工具等,提供了目前最權(quán)威的 MySQL 數(shù)據(jù)庫及工具的在線手冊。
至此已經(jīng)把MySQL 中基礎部分總結(jié)完成,后續(xù)文章將總結(jié)MYSQL一些其他特性,如視圖,存儲過程,觸發(fā)器,事務,游標,索引原理,性能優(yōu)化等
<END>