MySQL 學(xué)習(xí)筆記

來自菜鳥教程MySQL教程


一些名詞

  • 數(shù)據(jù)庫: 數(shù)據(jù)庫是一些關(guān)聯(lián)表的集合。
  • 數(shù)據(jù)表: 表是數(shù)據(jù)的矩陣。在一個(gè)數(shù)據(jù)庫中的表看起來像一個(gè)簡單的電子表格。
  • 列: 一列(數(shù)據(jù)元素) 包含了相同的數(shù)據(jù), 例如郵政編碼的數(shù)據(jù)。
  • 行:一行(=元組,或記錄)是一組相關(guān)的數(shù)據(jù),例如一條用戶訂閱的數(shù)據(jù)。
  • 冗余:存儲(chǔ)兩倍數(shù)據(jù),冗余降低了性能,但提高了數(shù)據(jù)的安全性。
  • 主鍵:主鍵是唯一的。一個(gè)數(shù)據(jù)表中只能包含一個(gè)主鍵。你可以使用主鍵來查詢數(shù)據(jù)。
  • 外鍵:外鍵用于關(guān)聯(lián)兩個(gè)表。
  • 復(fù)合鍵:復(fù)合鍵(組合鍵)將多個(gè)列作為一個(gè)索引鍵,一般用于復(fù)合索引。
  • 索引:使用索引可快速訪問數(shù)據(jù)庫表中的特定信息。索引是對(duì)數(shù)據(jù)庫表中一列或多列的值進(jìn)行排序的一種結(jié)構(gòu)。類似于書籍的目錄。
  • 參照完整性: 參照的完整性要求關(guān)系中不允許引用不存在的實(shí)體。與實(shí)體完整性是關(guān)系模型必須滿足的完整性約束條件,目的是保證數(shù)據(jù)的一致性。


    image
  • 表頭(header): 每一列的名稱;
  • 列(col): 具有相同數(shù)據(jù)類型的數(shù)據(jù)的集合;
  • 行(row): 每一行用來描述某條記錄的具體信息;
  • 值(value): 行的具體信息, 每個(gè)值必須與該列的數(shù)據(jù)類型相同;
  • 鍵(key): 鍵的值在當(dāng)前列中具有唯一性。

Windows下的MySQL安裝

  1. 從官網(wǎng)上下載最新的 MySQL Community Server
  2. 在解壓出來的文件夾中設(shè)置my.ini配置文件
[mysql]
# 設(shè)置mysql客戶端默認(rèn)字符集
default-character-set=utf8
 
[mysqld]
# 設(shè)置3306端口
port = 3306
# 設(shè)置mysql的安裝目錄
basedir=C:\\web\\mysql-8.0.11
# 設(shè)置 mysql數(shù)據(jù)庫的數(shù)據(jù)的存放目錄,MySQL 8+ 不需要以下配置,系統(tǒng)自己生成即可,否則有可能報(bào)錯(cuò)
# datadir=C:\\web\\sqldata
# 允許最大連接數(shù)
max_connections=20
# 服務(wù)端使用的字符集默認(rèn)為8比特編碼的latin1字符集
character-set-server=utf8
# 創(chuàng)建新表時(shí)將使用的默認(rèn)存儲(chǔ)引擎
default-storage-engine=INNODB

3.啟動(dòng)(在文件夾的bin目錄下以管理員權(quán)限打開命令行)

//初始化數(shù)據(jù)庫,輸入后會(huì)告知root初始密碼
mysqld --initialize --console
//安裝命令
mysqld install
//啟動(dòng)命令
net start mysql
//登錄命令(前三步只有第一次需要)
mysql -u root -p
//會(huì)得到響應(yīng)Enter password:

4.更改密碼

//登錄成功后做操作會(huì)提示你
//ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.
//更改密碼 user()表示當(dāng)前用戶吧
alter user user() identified by 'yourpassword';

MySQL 管理

同樣是在bin目錄下

//啟動(dòng)
mysqld --console
//關(guān)閉
mysqladmin -uroot shutdown

MySQL 建庫

CREATE DATABASE 數(shù)據(jù)庫名;

MySQL 刪庫

drop database 數(shù)據(jù)庫名;

MySQL 選擇數(shù)據(jù)庫

mysql> use 數(shù)據(jù)庫名;

MySQL 數(shù)據(jù)類型

數(shù)據(jù)類型
類型 大小 范圍(有符號(hào)) 范圍(無符號(hào)) 用途
INYINT 1 字節(jié) (-128,127) (0,255) 小整數(shù)值
SMALLINT 2 字節(jié) (-32 768,32 767) (0,65 535) 大整數(shù)值
MEDIUMINT 3 字節(jié) (-8 388 608,8 388 607) (0,16 777 215) 大整數(shù)值
INT或INTEGER 4 字節(jié) (-2 147 483 648,2 147 483 647) (0,4 294 967 295) 大整數(shù)值
BIGINT 8 字節(jié) (-9,223,372,036,854,775,808,9 223 372 036 854 775 807) (0,18 446 744 073 709 551 615) 極大整數(shù)值
FLOAT 4 字節(jié) (-3.402 823 466 E+38,-1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38) 0,(1.175 494 351 E-38,3.402 823 466 E+38) 單精度,浮點(diǎn)數(shù)值
DOUBLE 8 字節(jié) (-1.797 693 134 862 315 7 E+308,-2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) 0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) 雙精度,浮點(diǎn)數(shù)值
DECIMAL 對(duì)DECIMAL(M,D) ,如果M>D,為M+2否則為D+2 依賴于M和D的值 依賴于M和D的值 小數(shù)值
日期和時(shí)間類型

表示時(shí)間值的日期和時(shí)間類型為DATETIME、DATE、TIMESTAMP、TIME和YEAR。
每個(gè)時(shí)間類型有一個(gè)有效值范圍和一個(gè)"零"值,當(dāng)指定不合法的MySQL不能表示的值時(shí)使用"零"值。
TIMESTAMP類型有專有的自動(dòng)更新特性,將在后面描述。

類型 大小(字節(jié)) 范圍 格式 用途
DATE 3 1000-01-01/9999-12-31 YYYY-MM-DD 日期值
TIME 3 '-838:59:59'/'838:59:59' HH:MM:SS 時(shí)間值或持續(xù)時(shí)間
YEAR 1 1901/2155 YYYY 年份值
DATETIME 8 1000-01-01 00:00:00/9999-12-31 23:59:59 YYYY-MM-DD HH:MM:SS 混合日期和時(shí)間值
TIMESTAMP 4 1970-01-01 00:00:00/2038,結(jié)束時(shí)間是第 2147483647 秒,北京時(shí)間 2038-1-19 11:14:07,格林尼治時(shí)間 2038年1月19日 凌晨 03:14:07 YYYYMMDD HHMMSS 混合日期和時(shí)間值,時(shí)間戳
字符串類型

字符串類型指CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET。該節(jié)描述了這些類型如何工作以及如何在查詢中使用這些類型。

類型 大小 用途
CHAR 0-255字節(jié) 定長字符串
VARCHAR 0-65535 字節(jié) 變長字符串
TINYBLOB 0-255字節(jié) 不超過 255 個(gè)字符的二進(jìn)制字符串
TINYTEXT 0-255字節(jié) 短文本字符串
BLOB 0-65 535字節(jié) 二進(jìn)制形式的長文本數(shù)據(jù)
TEXT 0-65 535字節(jié) 長文本數(shù)據(jù)
MEDIUMBLOB 0-16 777 215字節(jié) 二進(jìn)制形式的中等長度文本數(shù)據(jù)
MEDIUMTEXT 0-16 777 215字節(jié) 中等長度文本數(shù)據(jù)
LONGBLOB 0-4 294 967 295字節(jié) 二進(jìn)制形式的極大文本數(shù)據(jù)
LONGTEXT 0-4 294 967 295字節(jié) 極大文本數(shù)據(jù)

CHAR 和 VARCHAR 類型類似,但它們保存和檢索的方式不同。它們的最大長度和是否尾部空格被保留等方面也不同。在存儲(chǔ)或檢索過程中不進(jìn)行大小寫轉(zhuǎn)換。
BINARY 和 VARBINARY 類似于 CHAR 和 VARCHAR,不同的是它們包含二進(jìn)制字符串而不要非二進(jìn)制字符串。也就是說,它們包含字節(jié)字符串而不是字符字符串。這說明它們沒有字符集,并且排序和比較基于列值字節(jié)的數(shù)值值。
BLOB 是一個(gè)二進(jìn)制大對(duì)象,可以容納可變數(shù)量的數(shù)據(jù)。有 4 種 BLOB 類型:TINYBLOB、BLOB、MEDIUMBLOB 和 LONGBLOB。它們區(qū)別在于可容納存儲(chǔ)范圍不同。
有 4 種 TEXT 類型:TINYTEXT、TEXT、MEDIUMTEXT 和 LONGTEXT。對(duì)應(yīng)的這 4 種 BLOB 類型,可存儲(chǔ)的最大長度不同,可根據(jù)實(shí)際情況選擇。

MySQL 建表

create table table_name (column name column_type);
栗子

CREATE TABLE IF NOT EXISTS `runoob_tbl`(
   `runoob_id` INT UNSIGNED AUTO_INCREMENT,
   `runoob_title` VARCHAR(100) NOT NULL,
   `runoob_author` VARCHAR(40) NOT NULL,
   `submission_date` DATE,
   PRIMARY KEY ( `runoob_id` )
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
  • 如果你不想字段為 NULL 可以設(shè)置字段的屬性為 NOT NULL, 在操作數(shù)據(jù)庫時(shí)如果輸入該字段的數(shù)據(jù)為NULL ,就會(huì)報(bào)錯(cuò)。
  • AUTO_INCREMENT定義列為自增的屬性,一般用于主鍵,數(shù)值會(huì)自動(dòng)加1。
  • PRIMARY KEY關(guān)鍵字用于定義列為主鍵。 可以使用多列來定義主鍵,列間以逗號(hào)分隔。
  • ENGINE 設(shè)置存儲(chǔ)引擎,CHARSET 設(shè)置編碼。

注意:建表語句中的column name 和table_name都是用反引號(hào)<`>引起來的。

MySQL 刪表

drop table table_name;
栗子
drop table runoob_tbl;

MySQL 插入數(shù)據(jù)

INSERT INTO table_name (field1, field2, ... ,fieldN)
                        VALUES
                        (value1,value2, ... ,valueN)

栗子

mysql> INSERT INTO runoob_tbl 
    -> (runoob_title, runoob_author, submission_date)
    -> VALUES
    -> ("學(xué)習(xí) PHP", "菜鳥教程", NOW());

MySQL 查詢數(shù)據(jù)

SELECT column_name,column_name
FROM table_name
[WHERE Clause]
[LIMIT N][ OFFSET M]
  • 查詢語句中你可以使用一個(gè)或者多個(gè)表,表之間使用逗號(hào)(,)分割,并使用WHERE語句來設(shè)定查詢條件。
  • SELECT 命令可以讀取一條或者多條記錄。
  • 你可以使用星號(hào)(*)來代替其他字段,SELECT語句會(huì)返回表的所有字段數(shù)據(jù)
  • 你可以使用 WHERE 語句來包含任何條件。
  • 你可以使用 LIMIT 屬性來設(shè)定返回的記錄數(shù)。
  • 你可以通過OFFSET指定SELECT語句開始查詢的數(shù)據(jù)偏移量。默認(rèn)情況下偏移量為0。

MySQL Where子句

  • 查詢語句中你可以使用一個(gè)或者多個(gè)表,表之間使用逗號(hào), 分割,并使用WHERE語句來設(shè)定查詢條件。
  • 你可以在 WHERE 子句中指定任何條件。
    你可以使用 AND 或者 OR 指定一個(gè)或多個(gè)條件。
  • WHERE 子句也可以運(yùn)用于 SQL 的 DELETE 或者 UPDATE 命令。
  • WHERE 子句類似于程序語言中的 if 條件,根據(jù) MySQL 表中的字段值來讀取指定的數(shù)據(jù)。

使用主鍵來作為 WHERE 子句的條件查詢是非常快速的。如果給定的條件在表中沒有任何匹配的記錄,那么查詢不會(huì)返回任何數(shù)據(jù)。

MySQL UPDATE

UPDATE table_name SET field1=new-value1, field2=new-value2
[WHERE Clause]

`field1 = new-value1//可以是一個(gè)賦值語句,比如field1 = field1+1`
//批量修改字符串
UPDATE table_name SET field=REPLACE(field, 'old-string', 'new-string') 
[WHERE Clause]

MySQL DELETE

DELETE FROM table_name [WHERE Clause]

如果沒有指定 WHERE 子句,MySQL 表中的所有記錄將被刪除。

MySQL刪除行為總結(jié)

1.delete 和 truncate 僅僅刪除表數(shù)據(jù),drop 連表數(shù)據(jù)和表結(jié)構(gòu)一起刪除,打個(gè)比方,delete 是單殺,truncate 是團(tuán)滅,drop 是把電腦摔了。
2.delete 是 DML 語句,操作完以后如果沒有不想提交事務(wù)還可以回滾,truncate 和 drop 是 DDL 語句,操作完馬上生效,不能回滾,打個(gè)比方,delete 是發(fā)微信說分手,后悔還可以撤回,truncate 和 drop 是直接扇耳光說滾,不能反悔。
3.執(zhí)行的速度上,drop>truncate>delete,打個(gè)比方,drop 是神舟火箭,truncate 是和諧號(hào)動(dòng)車,delete 是自行車。

刪除的幾種情況

1.drop table table_name : 刪除表全部數(shù)據(jù)和表結(jié)構(gòu),立刻釋放磁盤空間,不管是 Innodb 和 MyISAM;
實(shí)例,刪除學(xué)生表:
drop table student;
2.truncate table table_name: 刪除表全部數(shù)據(jù),保留表結(jié)構(gòu),立刻釋放磁盤空間 ,不管是 Innodb 和 MyISAM;
實(shí)例,刪除學(xué)生表:
truncate table student;
3.delete from table_name: 刪除表全部數(shù)據(jù),表結(jié)構(gòu)不變,對(duì)于 MyISAM 會(huì)立刻釋放磁盤空間,InnoDB 不會(huì)釋放磁盤空間;
實(shí)例,刪除學(xué)生表:
delete from student;
4.delete from table_name where xxx : 帶條件的刪除,表結(jié)構(gòu)不變,不管是 innodb 還是 MyISAM 都不會(huì)釋放磁盤空間;
實(shí)例,刪除學(xué)生表中姓名為 "張三" 的數(shù)據(jù):
delete from student where T_name = "張三";
5.delete 操作以后,使用 optimize table table_name會(huì)立刻釋放磁盤空間,不管是 innodb 還是 myisam;
實(shí)例,刪除學(xué)生表中姓名為 "張三" 的數(shù)據(jù):
delete from student where T_name = "張三";
實(shí)例,釋放學(xué)生表的表空間:
optimize table student;
6.delete from表以后雖然未釋放磁盤空間,但是下次插入數(shù)據(jù)的時(shí)候,仍然可以使用這部分空間。

MySQL LIKE 子句

我們知道在 MySQL 中使用 SQL SELECT 命令來讀取數(shù)據(jù), 同時(shí)我們可以在 SELECT 語句中使用 WHERE 子句來獲取指定的記錄。
WHERE 子句中可以使用等號(hào) = 來設(shè)定獲取數(shù)據(jù)的條件,如 "runoob_author = 'RUNOOB.COM'"。
但是有時(shí)候我們需要獲取 runoob_author 字段含有 "COM" 字符的所有記錄,這時(shí)我們就需要在 WHERE 子句中使用 SQL LIKE 子句。
SQL LIKE 子句中使用百分號(hào) %字符來表示任意字符,類似于UNIX或正則表達(dá)式中的星號(hào) *。
如果沒有使用百分號(hào) %, LIKE 子句與等號(hào) = 的效果是一樣的。

SELECT field1, field2,...fieldN 
FROM table_name
WHERE field1 LIKE condition1 [AND [OR]] filed2 = 'somevalue'

栗子
mysql> SELECT * from runoob_tbl WHERE runoob_author LIKE '%COM';

MySQL UNION 操作符

MySQL UNION 操作符用于連接兩個(gè)以上的 SELECT 語句的結(jié)果組合到一個(gè)結(jié)果集合中。多個(gè) SELECT 語句會(huì)刪除重復(fù)的數(shù)據(jù)。

SELECT expression1, expression2, ... expression_n
FROM tables
[WHERE conditions]
UNION [ALL | DISTINCT]
SELECT expression1, expression2, ... expression_n
FROM tables
[WHERE conditions];
  • expression1, expression2, ... expression_n: 要檢索的列。
  • tables: 要檢索的數(shù)據(jù)表。
  • WHERE conditions: 可選, 檢索條件。
  • DISTINCT: 可選,刪除結(jié)果集中重復(fù)的數(shù)據(jù)。默認(rèn)情況下 UNION 操作符已經(jīng)刪除了重復(fù)數(shù)據(jù),所以 DISTINCT 修飾符對(duì)結(jié)果沒啥影響。
  • ALL: 可選,返回所有結(jié)果集,包含重復(fù)數(shù)據(jù)。

MySQL 排序

如果我們需要對(duì)讀取的數(shù)據(jù)進(jìn)行排序,我們就可以使用 MySQL 的 ORDER BY 子句來設(shè)定你想按哪個(gè)字段哪種方式來進(jìn)行排序,再返回搜索結(jié)果。

SELECT field1, field2,...fieldN table_name1, table_name2...
ORDER BY field1 [ASC [DESC][默認(rèn) ASC]], [field2...] [ASC [DESC][默認(rèn) ASC]]
  • 你可以使用任何字段來作為排序的條件,從而返回排序后的查詢結(jié)果。
  • 你可以設(shè)定多個(gè)字段來排序。
  • 你可以使用 ASC 或 DESC 關(guān)鍵字來設(shè)置查詢結(jié)果是按升序或降序排列。 默認(rèn)情況下,它是按升序排列。
  • 你可以添加 WHERE...LIKE 子句來設(shè)置條件。

Attention

MySQL 拼音排序
如果字符集采用的是 gbk(漢字編碼字符集),直接在查詢語句后邊添加 ORDER BY:

SELECT * 
FROM runoob_tbl
ORDER BY runoob_title;

如果字符集采用的是 utf8(萬國碼),需要先對(duì)字段進(jìn)行轉(zhuǎn)碼然后排序:

SELECT * 
FROM runoob_tbl
ORDER BY CONVERT(runoob_title using gbk);
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 什么是數(shù)據(jù)庫? 數(shù)據(jù)庫是存儲(chǔ)數(shù)據(jù)的集合的單獨(dú)的應(yīng)用程序。每個(gè)數(shù)據(jù)庫具有一個(gè)或多個(gè)不同的API,用于創(chuàng)建,訪問,管理...
    chen_000閱讀 4,055評(píng)論 0 19
  • 數(shù)據(jù)庫 數(shù)據(jù)庫介紹 之前通過IO流操作文件保存數(shù)據(jù)弊端1、效率低2、一般只能保存少量的數(shù)據(jù)3、只能保存文本數(shù)據(jù) 什...
    沉浮_0644閱讀 813評(píng)論 0 0
  • 一、MySQL介紹及安裝 1. 相關(guān)定義和特點(diǎn) 數(shù)據(jù)(Database,簡稱DB):描述事物的基本符號(hào)。在現(xiàn)實(shí)生活...
    漫漫Maris123閱讀 254評(píng)論 0 1
  • 目錄 MySQL簡介 基本輸入查詢 創(chuàng)建并使用數(shù)據(jù)庫 SELECT語句 選擇特殊行 條件 通配符 選擇特殊列 排序...
    鬼宇書生閱讀 1,038評(píng)論 2 1
  • 這是本顛覆了老式教育觀念的育兒書,告訴我們可以不再需要“克制”自己,自然而然地“出乎本能”地改變和孩子之間的相處模...
    喬斤閱讀 246評(píng)論 0 0