來自菜鳥教程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安裝
- 從官網(wǎng)上下載最新的 MySQL Community Server
- 在解壓出來的文件夾中設(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);