MySQL基础
一、數(shù)據(jù)庫(kù)概述
1、SQL分類
SQL,Structure Query Language,結(jié)構(gòu)化查詢語(yǔ)言,主要有下面三種:
一、數(shù)據(jù)定義語(yǔ)言 Data Defination Language (DDL)
數(shù)據(jù)庫(kù)定義語(yǔ)言定義了數(shù)據(jù)庫(kù)涉及的各種對(duì)象,定義數(shù)據(jù)的完整性約束、保密限制等約束。
二、數(shù)據(jù)操作語(yǔ)言 Data Manipulation Language (DML)
數(shù)據(jù)操作語(yǔ)言實(shí)現(xiàn)了對(duì)數(shù)據(jù)的操作。基本數(shù)據(jù)操作有兩類:檢索(查詢)和更新(插入、刪除和修改)。
三、數(shù)據(jù)控制語(yǔ)言 Data Control Language (DCL)
數(shù)據(jù)庫(kù)控制語(yǔ)言實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)的控制,包括數(shù)據(jù)完整性控制、數(shù)據(jù)安全性控制和數(shù)據(jù)庫(kù)恢復(fù)等。
2、MySQL歷史發(fā)展
1985年,David Axmark 、Allan Larsson 、 Michael Widenius 成立公司,該公司為 MySQL AB 的前身。
2000年4月,MySQL對(duì)搜索引擎進(jìn)行整理,命名為MyISAM。
2001年,InnoDB集成到MySQL。
2004年10月,MySQL 4.1 版本發(fā)布。
2005年10月,MySQL5.0版本發(fā)布。5.0加入了游標(biāo) 、存儲(chǔ)過(guò)程、觸發(fā)器、視圖和事務(wù)支持。
2008年1月16日,MySQL被SUN收購(gòu)。
2009年,SUN被Oracle收購(gòu)。
... ...
3、MySQL優(yōu)點(diǎn)
1、體積小
2、速度快
3、擁有成本低
4、開(kāi)放源碼
4、數(shù)據(jù)庫(kù)設(shè)計(jì)三大范式
1、原子性,字段不可再分割
比如:在user中有“聯(lián)系方式”字段,存儲(chǔ)內(nèi)容:“ 64558@163.com,15854215521 ”,就不符合原子性,要設(shè)計(jì)成:email、phone對(duì)郵箱和手機(jī)號(hào)分別進(jìn)行存儲(chǔ)。
不符合第一范式:
符合第一范式:
2、完全依賴,沒(méi)有部分依賴
比如:學(xué)生選課表的設(shè)計(jì):
這里可以通過(guò)(學(xué)生,課程)可以確定老師、教師、時(shí)間,可以把(學(xué)生,課程)作為主鍵。但是,教材并不完全依賴主鍵,教材可以根據(jù)課程直接確定。這就是出現(xiàn)了不完全依賴、部分依賴,這樣的設(shè)計(jì)就不符合第二范式。
符合第二范式的設(shè)計(jì):
選課表:
教材表:
3、沒(méi)有傳遞依賴
每個(gè)屬性要跟主鍵直接聯(lián)系,不能有傳遞關(guān)系。
比如,學(xué)生表:
學(xué)校的地址和學(xué)校的電話,就是和college有依賴關(guān)系,和student是沒(méi)有直接依賴關(guān)系,不符合第三范式。
符合第三范式的修改如下:
學(xué)生表:
學(xué)校表:
一般來(lái)講,范式越復(fù)雜,性能會(huì)越差。我們工作中滿足以上三大范式即可。
二、MySQL安裝和配置
1、MySQL下載
1、MySQL官方網(wǎng)站:http://www.mysql.com/
2、MySQL版本分類:社區(qū)版 Community 和 企業(yè)版 Enterprise。
社區(qū)辦支持只有下載,并且完全免費(fèi),官方不提供技術(shù)支持;
企業(yè)版不能自由下載并且收費(fèi),提供了更多的功能,享受完備的技術(shù)支持。
3、版本標(biāo)識(shí)說(shuō)明
GA:通用版本,官方推薦
RC:發(fā)布版
Alpha:內(nèi)測(cè)版
Bean:公測(cè)版
4、社區(qū)版下載:
進(jìn)入網(wǎng)站首頁(yè)——>Downloads——>Community——MySQL on Windows ——>MySQL Installer,進(jìn)入Windows版本下載頁(yè)面。
其中 1.7 M大小的mysql-installer-web-community 為在線安裝文件;
385M大小的mysql-installer-community 為本地安裝。
2、MySQL安裝
Typical:默認(rèn)安裝
Complete:完全安裝
Custom:自定義安裝
3、MySQL配置
配置文件為:C:ProgramData/MySQL/MySQL 5.6/my.ini
常用配置項(xiàng):
lower_case_table_names = 0 // 0 ,表名區(qū)分大小寫(xiě) ;1 , 表名不區(qū)分大小寫(xiě)
default_character_set = utf-8 // 客戶端字符編碼
character_set_server = utf-8 //服務(wù)端字符編碼
port = 3306 //端口號(hào)
default_storage_engin = INNODB //默認(rèn)存儲(chǔ)引擎
三、MySQL對(duì)象操作
1、數(shù)據(jù)庫(kù)操作
(1)創(chuàng)建數(shù)據(jù)庫(kù):
create database db_name;
(2)查看數(shù)據(jù)庫(kù):
show databases ;
(3)使用數(shù)據(jù)庫(kù):
use db_name;
(4)刪除數(shù)據(jù)庫(kù):
drop database db_name;
注意: SQL語(yǔ)句可以用 ; g G 三種方式結(jié)尾,其中 ; 和 g 效果相同 ; G 優(yōu)化結(jié)果顯示。
2、表操作
(1)創(chuàng)建表:
create table company ( company_id INT , company_name VARCHAR(20) , company_address VARCHAR(64));
(2)查看表結(jié)構(gòu):
describe company; --查看表定義
show create table company; --查看表詳細(xì)定義
(3)刪除表:
drop table company;
(4)修改表:
alter table company rename mycompany; --修改表名 alter table company add tel varchar(20); --增加字段 alter table company add desc varchar(32) first;--在表的第一個(gè)位置增加字段 alter table company add create_time varchar(32) after company_name; --在指定位置增加字段 alter table company drop company_name;--刪除字段
alter table company modify company_name varchar(128);--修改字段類型
alter table company modify company_name first;--調(diào)整字段順序到第一位
alter table company modify company_name after desc;--調(diào)整字段順序到desc后面
alter table company change company_name new_name varchar(128);--修改字段名和字段類型
(5)操作表約束:
數(shù)據(jù)的完整性是指數(shù)據(jù)的準(zhǔn)確性與一致性,完整性檢查是指檢查數(shù)據(jù)的準(zhǔn)確性和一致性。MySQL提供一致機(jī)制來(lái)檢查數(shù)據(jù)庫(kù)表中的數(shù)據(jù)是否滿足規(guī)定的條件,以保證數(shù)據(jù)庫(kù)表中數(shù)據(jù)的準(zhǔn)確性和一致性,這種機(jī)制就是約束。
MySQL支持的完整性約束:
NOT NULL(NK):約束字段的值不能為空
DEFAULT:設(shè)置字段的默認(rèn)值
UNIQUE KEY(UK):約束字段的值唯一
PRIMARY KEY(PK):約束字段為標(biāo)的主鍵,作為表記錄的唯一標(biāo)識(shí)
AUTO_INCREMENT:約束字段的值為自動(dòng)增加
FOREIGN KEY(FK):約束字段為表的外鍵
a、設(shè)置非空約束
create table member(member_id INT(11) NOT NULL, member_name VARCHAR(32) NOT NULL);
如果增加的記錄中,設(shè)置NK的字段沒(méi)有值,則數(shù)據(jù)庫(kù)管理系統(tǒng)會(huì)報(bào)錯(cuò)。
命令行錯(cuò)誤信息:
ERROR 1048 (23000) : Column 'member_name' cannot be null
管理工具錯(cuò)誤提示:
b、設(shè)置字段的默認(rèn)值
create table member(member_id INT(11) NOT NULL, member_name VARCHAR(32) DEFAULT 'huiyuan');
c、設(shè)置唯一約束(UK)
create table member(member_id INT(11) NOT NULL, member_name VARCHAR(32) UNIQUE);
對(duì)唯一字段插入相同記錄時(shí),提示信息:
d、設(shè)置主鍵約束
主鍵字段要滿足:唯一、非空,可以是單一字段,也可以是多個(gè)字段。
單字段主鍵的兩種方法:
create table member(member_id INT(11) PRIMARY KEY, member_name VARCHAR(32) UNIQUE, create_time varchar(32)); --(1)設(shè)置主鍵 create table member(member_id INT(11), member_name VARCHAR(32) UNIQUE, create_time varchar(32),
CONSTRAINT pk_menberid PRIMARY KEY (member_id)); -- (2)設(shè)置主鍵并定義主鍵名稱
多字段主鍵:
create table member(member_id INT(11), member_name VARCHAR(32) UNIQUE, create_time varchar(32),
CONSTRAINT pk_id_name PRIMARY KEY (member_id,member_name)); -- 設(shè)置主鍵并定義主鍵名稱
e、自增(AUTO INCREMENT)
一個(gè)數(shù)據(jù)庫(kù)只能有一個(gè)字段使用自增約束,而且該字段類型必須是整數(shù)類型。自增約束一般設(shè)置在主鍵上。
create table t_dept (deptno INT PRIMARY KEY auto_increment, dname VARCHAR(20) , loc VARCHAR(40));
f、外鍵(FOREIGN KEY)
描述兩個(gè)表之間的約束。子表中的某個(gè)字段的取值范圍由父表決定。比如 部門(mén) 和 雇員 表。
create table t_dept (deptno INT PRIMARY KEY auto_increment, dname VARCHAR(20) , loc VARCHAR(40)); --部門(mén)表
create table t_employee(employee_id INT PRIMARY KEY,e_name VARCHAR(32),create_time VARCHAR(32),
dept_no INT(11), CONSISTENT fk_deptno FOREIGN KEY(dept_no) REFERENCES t_tept(deptno));--雇員表
3、索引操作
數(shù)據(jù)庫(kù)的索引對(duì)象和書(shū)的目錄類似,主要是為了提高從表中檢索數(shù)據(jù)的速度(其次還可以保證字段唯一性,實(shí)現(xiàn)數(shù)據(jù)庫(kù)表的完整性)。按索引的存儲(chǔ)類型分類,可以分為:B型樹(shù)索引(BTREE)和哈希索引(HASH),其中,InnoDB和MyISAM存儲(chǔ)引擎支持BTREE索引,MEMORY支持HASH索引。
MySQL支持的索引有6種:普通索引、唯一索引、全文索引、單列索引、多列索引、空間索引
(1)索引的適用場(chǎng)景
以下情況適合創(chuàng)建索引:
經(jīng)常被查詢的字段,即在WHERE子句中出現(xiàn)的字段。
在分組的字段,即在 GROUP BY 子句中出現(xiàn)的字段。
存在依賴關(guān)系的子表和父表之間的聯(lián)合查詢,即主鍵和外鍵字段。
設(shè)置唯一完整性約束的字段。
以下情況不適合創(chuàng)建索引:
在查詢中很少被使用的字段。
擁有許多重復(fù)值的字段。
(2)創(chuàng)建索引
a、普通索引
普通索引:在創(chuàng)建索引時(shí),不附加任何限制條件(唯一、非空等限制)。該類型的索引可以創(chuàng)建在任何數(shù)據(jù)類型的字段上。
在創(chuàng)建索引時(shí),可以指定索引的長(zhǎng)度。這是因?yàn)椴挥玫拇鎯?chǔ)引擎定義了表的最大索引數(shù)和最大索引長(zhǎng)度。MySQL每個(gè)表至少支持16個(gè)索引,總索引長(zhǎng)度為256字節(jié)。
在創(chuàng)建索引時(shí),可以定義索引的長(zhǎng)度和排序。ASC 升序排列; DESC 降序排列
-- 創(chuàng)建表時(shí)創(chuàng)建普通索引 create table t_dept(deptno INT PRIMARY KEY,dname VARCHAR(20),loc VARCHAR(40), INDEX index_deptno(deptno)); -- 在已經(jīng)存在的表上創(chuàng)建索引 create INDEX index_deptno ON t_dept(deptno(16) ASC); -- 通過(guò)Alter table 創(chuàng)建索引 alter table t_dept add INDEX index_deptno(deptno);
b、唯一索引
唯一索引:創(chuàng)建索引時(shí),限制索引的值必須是唯一的。唯一索引可以更快速的查詢某條記錄。
-- 創(chuàng)建表時(shí)創(chuàng)建 唯一 索引 create table t_dept(deptno INT PRIMARY KEY,dname VARCHAR(20),loc VARCHAR(40), UNIQUE INDEX index_deptno(deptno)); -- 在已經(jīng)存在的表上創(chuàng)建 唯一 索引 create UNIQUE INDEX index_deptno ON t_dept(deptno(16) ASC); -- 通過(guò)Alter table 創(chuàng)建 唯一 索引 alter table t_dept add UNIQUE INDEX index_deptno(deptno);
c、全文索引
全文索引主要是關(guān)聯(lián)在數(shù)據(jù)類型為:CHAR 、VARCHAR 和 TEXT 的字段上,以便能夠更加快速的查詢數(shù)據(jù)量較大的字符串類型的字段。只能在存儲(chǔ)引擎為MyISAM的數(shù)據(jù)庫(kù)表上創(chuàng)建全文索引。默認(rèn)情況下,全文索引的搜索執(zhí)行方式 不區(qū)分大小寫(xiě),如果全文索引所關(guān)聯(lián)的字段為二進(jìn)制數(shù)據(jù)類型,則以區(qū)分大小寫(xiě)的搜索方式執(zhí)行。
-- 創(chuàng)建表時(shí)創(chuàng)建 全文 索引 create table t_dept(deptno INT PRIMARY KEY,dname VARCHAR(20),loc VARCHAR(40), FULLTEXT INDEX index_deptno(deptno)) ENGINE = MyISAM; -- 在已經(jīng)存在的表上創(chuàng)建 全文 索引 create FULLTEXT INDEX index_deptno ON t_dept(deptno(16) ASC); -- 通過(guò)Alter table 創(chuàng)建 全文 索引 alter table t_dept add FULLTEXT INDEX index_deptno(deptno);
d、多列索引
多列索引:創(chuàng)建索引時(shí),所關(guān)聯(lián)的字段不是一個(gè)字段,而是多個(gè)字段。只有查詢條件中使用了所關(guān)聯(lián)字段中的第一個(gè)字段,多列索引才被使用。
-- 創(chuàng)建表時(shí)創(chuàng)建 多列 索引 create table t_dept(deptno INT PRIMARY KEY,dname VARCHAR(20),loc VARCHAR(40), INDEX index_deptno(deptno,loc)); -- 在已經(jīng)存在的表上創(chuàng)建 多列 索引 create INDEX index_deptno ON t_dept(deptno,loc); -- 通過(guò)Alter table 創(chuàng)建 多列 索引 alter table t_dept add INDEX index_deptno(deptno,loc);
(3)刪除索引
-- 刪除索引 DROP INDEX index_dname_loc ON t_dept;
4、視圖操作
(1)視圖的特點(diǎn)
視圖的列可以來(lái)自不同的表,是表的抽象和在邏輯意義上建立的新關(guān)系。
視圖是由基本表(實(shí)表)產(chǎn)生的表(虛表)。
視圖的建立和刪除不影響基本表。
對(duì)視圖內(nèi)容的更新(添加、刪除和修改)直接影響基本表。
當(dāng)視圖來(lái)自多個(gè)基本表時(shí),不允許添加和刪除數(shù)據(jù)。
(2)創(chuàng)建視圖
基本表結(jié)構(gòu):
創(chuàng)建視圖:
CREATE VIEW view_selectproduct AS SELECT id,name FROM t_product;
注意:在SQL語(yǔ)句命名規(guī)范中,視圖一般用 view_xxx 或者 v_xxx 命名。
(2)使用視圖
視圖的使用和正常的表查詢一樣:
SELECT * FROM view_selectproduct;
(3)不同種類的視圖
a、常量視圖
CREATE VIEW view_pi AS SELECT 3.1415926;
b、封裝聚合函數(shù)(SUM/MIN/MAX/COUNT等)
CREATE VIEW view_count_name AS SELECT COUNT(name) FROM t_product;
c、封裝排序(order by)
CREATE VIEW view_order_by AS SELECT name FROM t_product ORDER BY id DESC;
d、封裝內(nèi)連接
CREATE VIEW view_inner_join AS SELECT s.name FROM t_student AS s,t_group as g WHERE s.group_id = g.id;
e、封裝外連接
CREATE VIEW view_left_join AS SELECT s.name FROM t_student AS s LEFT JOIN t_group AS g ON s.group_id = g.id;
其他 子查詢、聯(lián)合查詢的視圖創(chuàng)建方式相似。
(4)查看視圖
SHOW TABLES;
SHOW TABLES STATUS FROM DB_NAME; -- 查看視圖的詳細(xì)信息
SHOW CREATE VIEW viewname; -- 查看視圖的定義信息
(5)刪除視圖
DROP VIEW view_name1,view_name2; -- 可以同時(shí)刪除多個(gè)視圖
(6)視圖操作基本表數(shù)據(jù)
INSERT INTO view_product (id, name, price ,order_id) VALUES (11,"apple",6,54); -- 插入數(shù)據(jù) DELETE FROM view_product WHERE name = "apple"; -- 刪除數(shù)據(jù) UPDATE view_product SET price = 4 WHERE name = "apple"; -- 修改數(shù)據(jù)
5、觸發(fā)器操作
觸發(fā)器:在表發(fā)生更改時(shí),自動(dòng)進(jìn)行處理。
可以觸發(fā)器執(zhí)行的語(yǔ)句: delete 語(yǔ)句、insert 語(yǔ)句 、update 語(yǔ)句。
-- 觸發(fā)器
CREATE TRIGGER tri_diarytime
BEFORE INSERT ON t_dept FOR EACH ROW
INSERT INTO t_diary VALUES(null,"t_dept",NOW());
四、MySQL數(shù)據(jù)操作
1、增、改、刪操作
(1)插入數(shù)據(jù)
-- 插入一條完整記錄
INSERT INTO t_dept(deptno,dname,loc) VALUES (5,'開(kāi)發(fā)部','程序開(kāi)發(fā)'); -- 推薦使用
INSERT INTO t_dept VALUES (5,'開(kāi)發(fā)部','程序開(kāi)發(fā)');-- 缺省格式,不推薦使用
-- 插入一條部分記錄
INSERT INTO t_dept(dname) VALUES ('設(shè)計(jì)部');
-- 插入多條記錄
INSERT INTO t_dept(dname) VALUES ('設(shè)計(jì)部'),('產(chǎn)品部'),('市場(chǎng)部'),('行政部');
-- 插入查詢的結(jié)果
INSERT INTO t_dept(dname) SELECT dname FROM t_company;
(2)更新數(shù)據(jù)
UPDATE t_dept SET dname = '測(cè)試部門(mén)' ,loc = '' where deptno = 1;
(3)刪除
DELETE FROM t_dept WHERE deptno < 10;
2、單表查詢
原始表:
(1)簡(jiǎn)單數(shù)據(jù)記錄查詢
SELECT item_name,brand_id FROM z_item; -- 查詢商品名稱和品牌id SELECT * FROM z_item; -- 查詢商品表中的所有字段
a、去重 DISTINCT:
SELECT DISTINCT item_name ,brand_id FROM z_item; -- 去重會(huì)取并集,即 去重的 所有字段 都重復(fù) 才進(jìn)行 去重。
b、四則運(yùn)算:
MySQL支持的數(shù)學(xué)運(yùn)算符:
+ 加法 ; - 減法 ; * 乘法 ; / 除法 ;% 取余
SELECT price,(price+0.2) AS 'price+0.2',(price -0.2) AS 'price-0.2' , (price * 2) AS 'price * 2 ' , (price / 2) AS 'price/2',(price % 2 ) AS 'price % 2' FROM z_item ;
c、字符串連接CONCAT()
SELECT CONCAT('商品名稱是',item_name,'的商品,價(jià)格為',price) FROM z_item;
(2)條件查詢
a、MySQL支持的比較運(yùn)算符和邏輯運(yùn)算符
> 大于; < 小于 ; = 等于 ; != (<>) 不等于 ; >= 大于等于; <=小于等于;
AND(&&) 邏輯與 OR(||) 邏輯或 XOR 邏輯異或 NOT(!) 邏輯非
b、簡(jiǎn)單條件查詢
SELECT * FROM z_item WHERE item_name = '鞋子'; SELECT * FROM z_item WHERE item_id <= 10 AND price > 1000; SELECT * FROM z_item WHERE item_id <= 10 && price > 1000;
c、BETWEEN AND 關(guān)鍵字
SELECT * FROM z_item WHERE price BETWEEN 100 AND 1000; SELECT * FROM z_item WHERE price NOT BETWEEN 100 AND 1000;
d、NULL 和 NOT NULL
SELECT * FROM z_item WHERE item_name IS NULL; SELECT * FROM z_item WHERE item_name IS NOT NULL;
e、IN
SELECT * FROM z_item WHERE item_name = '冰箱' OR item_name = '空調(diào)' OR item_name = '洗衣機(jī)';
SELECT * FROM z_item WHERE item_name IN('冰箱','空調(diào)','洗衣機(jī)');
SELECT * FROM z_item WHERE item_name NOT IN('冰箱','空調(diào)','洗衣機(jī)');
注意:在具體使用IN 關(guān)鍵字時(shí),查詢的結(jié)果如果存在NULL,則不會(huì)影響查詢;如果使用關(guān)鍵字 NOT IN ,查詢的集合中如果存在NULL,則不會(huì)有任何的查詢結(jié)果。
f、LIKE
通配符:用來(lái)實(shí)現(xiàn)匹配部分值的特殊符號(hào)。
SELECT * FROM z_item WHERE item_name LIKE '%機(jī)'; SELECT * FROM z_item WHERE NOT item_name LIKE '%機(jī)'; SELECT * FROM z_item WHERE item_name NOT LIKE '%機(jī)'; SELECT * FROM z_item WHERE price LIKE '_9%';
g、ORDER BY
ASC 升序 DESC 降序
SELECT * FROM z_item ORDER BY price DESC , item_id ASC;
h、LIMIT
SELECT * FROM z_item LIMIT 1; SELECT * FROM z_item LIMIT 3,2; -- 第四條記錄開(kāi)始顯示,顯示2條
i、統(tǒng)計(jì)函數(shù)和分組函數(shù)
-- 統(tǒng)計(jì)函數(shù)經(jīng)常和分組一起使用 -- 統(tǒng)計(jì)條數(shù) COUNT(*),統(tǒng)計(jì)所有值,包括null值和非null值; count(price)指定之后不統(tǒng)計(jì)null值。 SELECT COUNT(*) FROM z_item ; -- 平均值 SELECT AVG(price) FROM z_item; -- 求和 SELECT SUM(price) FROM z_item; -- 最大值、最小值 SELECT MAX(price) FROM z_item; SELECT item_name,MIN(price) FROM z_item; -- 分組 SELECT *,SUM(price) FROM z_item WHERE is_delete = 0 GROUP BY brand_id; SELECT GROUP_CONCAT(item_name),SUM(price) FROM z_item WHERE is_delete = 0 GROUP BY brand_id,is_delete; SELECT GROUP_CONCAT(item_name),SUM(price) FROM z_item WHERE is_delete = 0 GROUP BY brand_id,is_delete HAVING AVG( price) > 1000;
注:資料來(lái)源為書(shū)籍《MySQL數(shù)據(jù)庫(kù)應(yīng)用從入門(mén)到精通》,本文為個(gè)人學(xué)習(xí)筆記。
總結(jié)
- 上一篇: Mybatis源码:Executor 模
- 下一篇: 基于机器学习的图像质量评价算法