推薦你看看這一本 名字叫《mysql數(shù)據(jù)庫應(yīng)用從入門到精通》,這本書從數(shù)據(jù)庫的基礎(chǔ)、SQL語句開發(fā)、數(shù)據(jù)庫管理和維護3個方面對MySQL進行了詳細的介紹,其中每一部分都獨立成篇。本書內(nèi)容實用,覆蓋廣泛,講解由淺入深、循序漸進,適合于各個層次的讀者。

成都創(chuàng)新互聯(lián)是一家集成都網(wǎng)站建設(shè)、做網(wǎng)站、網(wǎng)站頁面設(shè)計、網(wǎng)站優(yōu)化SEO優(yōu)化為一體的專業(yè)網(wǎng)站制作公司,已為成都等多地近百家企業(yè)提供網(wǎng)站建設(shè)服務(wù)。追求良好的瀏覽體驗,以探求精品塑造與理念升華,設(shè)計最適合用戶的網(wǎng)站頁面。 合作只是第一步,服務(wù)才是根本,我們始終堅持講誠信,負責任的原則,為您進行細心、貼心、認真的服務(wù),與眾多客戶在蓬勃發(fā)展的市場環(huán)境中,互促共生。
MySQL是一個關(guān)系型數(shù)據(jù)庫管理系統(tǒng),由瑞典MySQL AB公司開發(fā),屬于Oracle旗下產(chǎn)品,是最流行的關(guān)系型數(shù)據(jù)庫管理系統(tǒng)之一。
端口是3306。
表很多時,使用linux腳本,需要根據(jù)需要修改一下:
和創(chuàng)建一樣,可以加上 if exists
可兩篇文章:
如:
用于在已有的表中添加、刪除或修改列。
添加 ADD
或
默認是添加到最后,但可以指定位置。 FIRST :添加最前
AFTER 字段名 :添加指定字段之后
例子:
刪除 DROP
修改 MODIFY 主要修改原列的類型或約束條件 同樣可以用 FIRST 和 AFTER 字段名 ,代表的是修改到哪里。
修改字段名 CHANGE
可以把表2的數(shù)據(jù)復制到表1中,但 不能復制約束性條件 。
單行
多行,注意 只有一個VALUES :
不寫 (行1, 行2...) 這一部分的話,默認一一對應(yīng)
除了以上方法外,還可以用SET為每一行附上相應(yīng)的值。
假如沒有篩選的話,就給全部都修改了。可以用 WHERE 篩選。
假如 沒有篩選的話,就給全部刪除了 。相當于清空。
清空
先把表刪除,然后再建一個。與 DELETE FROM 相比, TRUNCATE 的效率更快,因為 DELETE FROM 是把記錄逐條刪除的。
查詢執(zhí)行的順序
FROM -- WHERE -- SELECT -- GROUP BY -- HAVING -- ORDER BY -- LIMIT
注意
當數(shù)據(jù)很大,上百萬的時候,使用LIMIT ... OFFSET ..的方式進行分頁十分浪費資源且耗時長。最好是結(jié)合WHERE使用,如:
REGEXP 使用正則表達進行匹配。 查詢時,需要搭配WHERE或HAVING使用 。
兩個表之間有交集且要用到兩個表的數(shù)據(jù)時,可以使用內(nèi)連接查詢。
LEFT JOIN 關(guān)鍵字從左表(table1)返回所有的行,即使右表(table2)中沒有匹配。如果右表中沒有匹配,則結(jié)果為 NULL。
用法:
RIGHT JOIN 關(guān)鍵字從右表(table2)返回所有的行,即使左表(table1)中沒有匹配。如果左表中沒有匹配,則結(jié)果為 NULL。 把LEFT JOIN的表1、表2調(diào)換順序,就是REGHT JOIN 。
FULL OUTER JOIN 關(guān)鍵字只要左表(table1)和右表(table2)其中一個表中存在匹配,則返回行. 相當于結(jié)合了 LEFT JOIN 和 RIGHT JOIN 的結(jié)果。
但 MySQL中不支持 FULL OUTER JOIN 。
即SELECT嵌套。
IN 一個查詢結(jié)果作為另一個查詢的條件。 如:
EXISTS 用于判斷查詢子句是否有記錄,如果有一條或多條記錄存在返回 True,否則返回 False。True時執(zhí)行。 如:
索引的本質(zhì)是一種排好序的數(shù)據(jù)結(jié)構(gòu)。利用索引可以提高查詢速度。
常見的索引有:
MySQL通過外鍵約束來保證表與表之間的數(shù)據(jù)的完整性和準確性。 外鍵的使用條件:
外鍵的好處:可以使得兩張表關(guān)聯(lián),保證數(shù)據(jù)的一致性和實現(xiàn)一些級聯(lián)操作。
對已有的兩個表增加外鍵 比如:主表為A,子表為B,外鍵為aid,外鍵約束名字為a_fk_b
為子表添加一個字段,當做外鍵
為子表添加外鍵約束條件
假如刪除記錄報錯: [Err] 1451 -Cannot deleteorupdatea parent row: aforeignkeyconstraintfails (...)
這是因為MySQL中設(shè)置了foreign key關(guān)聯(lián),造成無法更新或刪除數(shù)據(jù)。可以通過設(shè)置 FOREIGN_KEY_CHECKS 變量來避免這種情況。 第一步:禁用外鍵約束,我們可以使用: SETFOREIGN_KEY_CHECKS=0; 第二步:刪除數(shù)據(jù) 第三步:啟動外鍵約束,我們可以使用: SETFOREIGN_KEY_CHECKS=1; 查看當前FOREIGN_KEY_CHECKS的值,可用如下命令: SELECT @@FOREIGN_KEY_CHECKS;
使用 UNION 來組合兩個查詢,如果第一個查詢返回 M 行,第二個查詢返回 N 行,那么組合查詢的結(jié)果一般為 M+N 行。
每個查詢必須包含相同的列、表達式和聚集函數(shù)。
默認會去除相同行,如果需要 保留 相同行,使用 UNION ALL 。
只能包含一個 ORDER BY 子句,并且必須位于語句的最后 。
內(nèi)置函數(shù)很多, 見: MySQL 函數(shù)
我們一般使用 START TRANSACTION 或 BEGIN 開啟事務(wù), COMMIT 提交事務(wù)中的命令, SAVEPOINT : 相當于設(shè)置一個還原點, ROLLBACK TO : 回滾到某個還原點下
一般的使用格式如下:
開啟事務(wù)時, 默認加鎖
根據(jù)類型可分為共享鎖(SHARED LOCK)和排他鎖(EXCLUSIVE LOCK)或者叫讀鎖(READ LOCK)和寫鎖(WRITE LOCK)。
根據(jù)粒度劃分又分表鎖和行鎖。表鎖由數(shù)據(jù)庫服務(wù)器實現(xiàn),行鎖由存儲引擎實現(xiàn)。
除此之外,我們可以顯示加鎖
加鎖時, 如果沒有索引,會鎖表,如果加了索引,就會鎖行
InnoDB默認支持行鎖,獲取鎖是分步的,并不是一次性獲取所有的鎖,因此在鎖競爭的時候就會出現(xiàn)死鎖的情況
解決方法:
即ACID特性:
由于并發(fā)事務(wù)會引發(fā)上面這些問題, 我們可以設(shè)置事務(wù)的隔離級別解決上面的問題.
MySQL的默認隔離級別(可重復讀)
查看當前會話隔離級別
方式1
方式2
設(shè)置隔離級別
主從集群的示意圖如下:
主要涉及三個線程: binlog 線程、 I/O 線程和 SQL 線程。
同步流程:
由于MySQL主從集群只會從主節(jié)點同步到從節(jié)點, 不會反過來同步, 所以需要讀寫分離
讀寫分離需要在業(yè)務(wù)層面實現(xiàn) , 寫數(shù)據(jù)只能在主節(jié)點上完成, 而讀數(shù)據(jù)可以在主節(jié)點或從節(jié)點上完成
索引是幫助MySQL高效獲取數(shù)據(jù)的排好序的數(shù)據(jù)結(jié)構(gòu)
MySQL的索引有
推薦兩個在線工具:
簡單來說, B樹是在紅黑樹(一個平衡二叉樹)的基礎(chǔ)上將一個節(jié)點存放多個值, 實現(xiàn)的, 降低了樹的高度, 每個節(jié)點都存放索引及對應(yīng)數(shù)據(jù)指針, 同一層的節(jié)點是遞增的
而B+樹在B樹的基礎(chǔ)上進行優(yōu)化, 非葉子節(jié)點存放 子節(jié)點的開始的索引, 葉子節(jié)點存放索引和數(shù)據(jù)的指針, 且葉子節(jié)點之間有雙向的指針
如下示意圖:
不同的引擎, 主鍵索引存放的數(shù)據(jù)也不一樣, 比如常見的 MyISAM 和 InnoDB
MyISAM 的B+樹葉子節(jié)點存放表數(shù)據(jù)的指針, InnoDB 的B+樹葉子節(jié)點存放處主鍵外的數(shù)據(jù)
其他的:
即多個列組成一個索引, 語法:
由于聯(lián)合索引的B+樹的結(jié)構(gòu), 根據(jù)列建立, 所以我們的查找條件也要根據(jù)索引列的順序( where column1=x, column2=y,columnN... ), 否則會全表掃描
如果你對列進行了 (+,-,*,/,!) , 那么都將不會走索引。
OR 引起的索引失效
OR 導致索引是在特定情況下的,并不是所有的 OR 都是使索引失效,如果OR連接的是 同 一個字段,那么索引 不會失效 , 反之索引失效 。
這個我相信大家都明白,模糊搜索如果你前綴也進行模糊搜索,那么不會走索引。
這兩種用法,也將使索引失效。另 IN 會走索引,但是當IN的取值范圍較大時會導致索引失效,走全表掃描, 見: MySQL中使用IN會不會走索引
不走索引。
走索引。
所以設(shè)計表的時候, 建議不可為空, 而是將默認值設(shè)置為 "" ( NOT NULL DEFAULT "" )
/*語法:
select 分組函數(shù) 列(要求出現(xiàn)在group by的后面)
from 表
【where 篩選條件】
group by 分組的列表
[order by 子句]
注意:查詢列表必須特殊,要求是分組函數(shù)和group by 后出現(xiàn)的字段
特點:
1.分組查詢中篩選條件分為兩類:
數(shù)據(jù)源 位置 關(guān)鍵字
分組前篩選 原始表 group by子句的前面 where
分組后篩選 分組后的結(jié)果集 group by子句的后面 having
1.分組函數(shù)做條件肯定是放在having子句中
2.能用分組前篩選的,優(yōu)先考慮使用分組前篩選
2.group by 子句支持單個字段、多個字段分組(用逗號隔開沒有順序要求)表達式或函數(shù)(用的較少)
3.也可以添加排序(放在整個group by子句之后)
*/
count(1),其實就是計算一共有多少符合條件的行。
1并不是表示第一個字段,而是表示一個固定值。
其實就可以想成表中有這么一個字段,這個字段就是固定值1,count(1),就是計算一共有多少個1.
同理,count(2),也可以,得到的值完全一樣,count('x'),count('y')都是可以的。一樣的理解方式。在你這個語句理都可以使用,返回的值完全是一樣的。就是計數(shù)。
count(*),執(zhí)行時會把星號翻譯成字段的具體名字,效果也是一樣的,不過多了一個翻譯的動作,比固定值的方式效率稍微低一些。
in 操作符允許我們在 WHERE 子句中規(guī)定多個值。
where 字段名 in (值1,值2,值3....)
示例: where age in (20,21,25);
age 字段的值 只要是 20或者21或者25 的數(shù)據(jù) 都滿足條件
where not in (值1,值2,值3....)/pre
示例: where age in (20,21,25);
age 字段的值 只要 不是 20或者21或者25 的數(shù)據(jù) 都滿足條件
select *
from sc
where score in (70,80,90);
select *
from sc
where score not in (70,80,90);
select *
from student
where birthday in ('1990-01-01','1990-12-21','2017-12-20','2012-06-06');/pre
select *
from student
where birthday not in ('1990-01-01','1990-12-21','2017-12-20','2012-06-06');
MySQL中的分頁查詢, limit 通常放在sql 語句的最末尾
limit 4
查詢前4條數(shù)據(jù)
limit 4,3
從第4條數(shù)據(jù)之后開始,查詢3條數(shù)據(jù)
也就是 第5,6,7條的數(shù)據(jù)
limit 4 offset 10;
offset后面的數(shù)字是指記錄數(shù)
從第10條 之后的數(shù)據(jù)開始 查詢4條數(shù)據(jù)
也就是 第 11,12,13,14條數(shù)據(jù)
select * from student limit 5;
select * from student limit 9,6;
select * from student limit 6 offset 9;
查詢成績表中 前7條的數(shù)據(jù);
select * from sc limit 7;
查詢成績表中 第 5到10 條的數(shù)據(jù)
select * from sc limit 4,6;
查詢成績表中 第 3到8 條的數(shù)據(jù);
select * from sc limit 2 , 6;
如果字段沒有要求非空,則字段值 可以為空,就是null值。如果要查詢某個 字段 為 null的數(shù)據(jù),不能使用 字段名=null,要用 字段名 is null;
where 字段名 is null;
字段名 為空的符合條件
where 字段名 is not null;
字段名 不為空的符合條件
1.查詢teacher表,給tid 起別名為 教師編號,tname 起別名為 教師姓名
select tid as 教師編號,tname as 教師姓名 from teacher
2.查詢 sc 表, 給 cid 起別名為 課程編號,sid 起別名為 學生編號, score起別名為分數(shù);
select cid 課程編號 ,sid 學生編號,score 分數(shù) from sc
3.查詢 course 表,給表起別名為 c,使用 c.字段查詢 表數(shù)據(jù)
select c.* from course as c ;
起別名是為了后續(xù)學習多表聯(lián)查 做鋪墊,語法十分簡單
比如查詢 student 表的 學生姓名 和 生日 的sql語句:
select sname,birthday from student;
給 sname,birthday字段 起別名 ,改為中文
select sname as 姓名,birthday as 生日 from student;
起了別名后,查出來的字段會以別名展示。
as 關(guān)鍵字也可以省略,字段名 和 別名之間 用空格隔開即可
select sname 姓名, birthday 生日 from student;
例子:
select a.sname, a.birthday from student as a;
給表 起別名 同樣是 使用 as關(guān)鍵字(可以使用空格隔開代替as關(guān)鍵字), a 就代表 student表,查詢字段時,可以 使用 a.sname 代表 student的sname字段。
給表起別名 通常用在 多表查詢,本次使用演示,先熟悉語法。
在某些復雜的場景下,可能需要多條sql 才能查詢出想要的數(shù)據(jù),把多條sql拼接起來 就是嵌套查詢
句式1
select XXX from A表 where xx =/in (select XXX from B表)
句式2
select XXX from (select XXX from XXXX)b
句式3
select XXX from A表 a
join (select XXX from B表)b on a.xx = b.xx
select * from sc where sid = (select sid from student where sname = '周梅');
select * from sc where sid in (select sid from student where sex='女');
select a.sname,b.score,c.score from student a
inner join (select sid,score from sc where cid =1) b on a.sid = b.sid
inner join (select sid,score from sc where cid = 2) c on a.sid = c.sid
where b.score ? c.score;
聚合函數(shù)對一組值執(zhí)行計算,并返回單個值,也被稱為組函數(shù)。
就是sql提供的一種查詢方法,比如查詢 最大值,最小值,總數(shù),平均等等。
聚合函數(shù)不能寫在where的查詢條件里面
查詢 最小值
select min(字段) from 表;
查詢 最大值
select max(字段) from 表;
select max(tid) from teacher;
select min(tid) from teacher;
select max(a.score) ,b.cname from sc a
inner join course b on a.cid=b.cid
where a.sid =(select sid from student where sname='周梅') group by b.cname limit 1 ;
查詢 該字段的 總數(shù)
select sum(字段) from 表
查詢 該字段的 平均數(shù)
select avg(字段) from 表
select avg(score) from sc;
select avg(s.score) from student a inner join sc s on a.sid = s.sid
where a.sex ='女';
查詢 數(shù)據(jù) 總條數(shù)
count( ) 是查詢總共有多少條數(shù)據(jù)
count(字段) 是查詢該字段 不為 null的 總共有多少條數(shù)據(jù)
例:
select count( ) from 表
去重,查詢數(shù)據(jù)時,相同的數(shù)據(jù)只展示 一條
語法:
select distinct 字段 from 表;
例:去重查詢學生表中的生日字段
select distinct birthday from student;
分享題目:mysql數(shù)據(jù)庫怎么進階 mysql進階知識
網(wǎng)址分享:http://chinadenli.net/article20/dojioco.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站制作、做網(wǎng)站、網(wǎng)站收錄、網(wǎng)站制作、動態(tài)網(wǎng)站、關(guān)鍵詞優(yōu)化
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)