欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

mysql數(shù)據(jù)庫怎么進階 mysql進階知識

想系統(tǒng)學習一下mysql,想知道進階階段要看哪些書。

推薦你看看這一本 名字叫《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使用基礎(chǔ)、進階分享

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 "" )

mysql進階5:分組查詢

/*語法:

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í)行時會把星號翻譯成字段的具體名字,效果也是一樣的,不過多了一個翻譯的動作,比固定值的方式效率稍微低一些。

數(shù)據(jù)庫表查詢進階(1)

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)

外貿(mào)網(wǎng)站制作