MySQL新手入門(mén)進(jìn)階語(yǔ)句匯總
引言
對(duì)MySQL數(shù)據(jù)庫(kù)的查詢(xún),除了基本的查詢(xún)外,有時(shí)候需要對(duì)查詢(xún)的結(jié)構(gòu)集進(jìn)行處理。例如只取10條數(shù)據(jù),對(duì)查詢(xún)結(jié)果進(jìn)行排序或分組等等
一、常用查詢(xún)
1.1、order by按關(guān)鍵字排序
實(shí)用select語(yǔ)句可以講需要的數(shù)據(jù)從mMySQL數(shù)據(jù)庫(kù)中查詢(xún)出來(lái),如果對(duì)插敘的結(jié)果進(jìn)行排序,可以實(shí)用order by語(yǔ)句來(lái)對(duì)語(yǔ)句實(shí)現(xiàn)排序,并最終講排序的結(jié)果返回給用戶(hù),這個(gè)語(yǔ)句的排序不光可以針對(duì)某一個(gè) 字段,也可以針對(duì)多個(gè)字段
語(yǔ)法:
select 字段1,字段2... from 表名 order by 字段1,字段2... asc #查詢(xún)結(jié)果以升序方式顯示,asc可以省略 select 字段1,字段2... from 表名 order by 字段1,字段2,... desc #查詢(xún)結(jié)果以降序方式顯示
1、ASC是按照升序進(jìn)行排序,是默認(rèn)的排序方式,即ASC可以省略。
2、select語(yǔ)句中如果沒(méi)有制定具體的排序方式,即默認(rèn)按ASC方式進(jìn)行排序
3、DESC是按照降序方式進(jìn)行排列,當(dāng)然order by前面也可以實(shí)用where子句對(duì)查詢(xún)結(jié)果進(jìn)一步過(guò)濾。
升序排序
select name,power from name order by power;
降序排序
select name,power from name order by power desc;
結(jié)合where進(jìn)行條件過(guò)濾在排序
select name,power,phone from name where phone=1234566777 order by power;
多字段排序
ORDER BY語(yǔ)句也可以使用多個(gè)字段來(lái)進(jìn)行排序,當(dāng)排序的第一個(gè)字段相同的記錄有多條的情況下,這些多條的記錄再按照第二個(gè)字段進(jìn)行排序,ORDER BY后面跟多個(gè)字段時(shí),字段之間使用英文逗號(hào)隔開(kāi),優(yōu)先級(jí)是按先后順序來(lái)定,但是order by之后的第一個(gè)參數(shù)只有再出現(xiàn)相同值時(shí),第二個(gè)字段才有意義。
select name,power,phone from name order by phone,power desc;
1.2、and/or判斷
在大型數(shù)據(jù)庫(kù)中,有時(shí)查詢(xún)數(shù)據(jù)需要數(shù)據(jù)符合某些特定條件
AND/OR且/或和shell腳本中一樣的使用方法
and/or使用
mysql> select name,address,power from name where power>66 and power<999; select name,address,power from name where power>66 or power<999;
1.3、distinct查詢(xún)不重復(fù)記錄
select distinct 字段 from 表名﹔ distinct 必須放在最開(kāi)頭 distinct 只能使用需要去重的字段進(jìn)行操作 distinct 去重多個(gè)字段時(shí),含義是:幾個(gè)字段同時(shí)重復(fù)時(shí)才能被過(guò)濾,會(huì)默認(rèn)按左邊第一個(gè)字段為依據(jù)。
1.4、GROUP BY對(duì)結(jié)果進(jìn)行分組
通過(guò)SQL查詢(xún)出來(lái)的結(jié)果,還可以對(duì)其進(jìn)行分組,使用GROUP BY語(yǔ)句來(lái)實(shí)現(xiàn),GROUP BY通常都是結(jié)合聚合函數(shù)一起使用的,常用的聚合函數(shù)包括:計(jì)數(shù)(COUNT)、求和(SUM)、求平均數(shù)(AVG)、最大值(MAX)、最小值(MIN),GROUP BY分組的時(shí)候可以按一個(gè)或多個(gè)字段對(duì)結(jié)果進(jìn)行分組處理
1、對(duì)group by后面的字段的查詢(xún)結(jié)果進(jìn)行匯總分組,通常是結(jié)合聚合函數(shù)一起使用的
2、group by有一個(gè)原則,就是select后面的所有列中,沒(méi)有使用聚合函數(shù)的列必須出現(xiàn)在group by的后面
select 字段,聚合函數(shù) from 表名 (where 字段名(匹配) 數(shù)值) group by 字段名;
1.5、limit限制結(jié)果條目
limit限制輸出的結(jié)果記錄
在使用MySQL select語(yǔ)句進(jìn)行查詢(xún)時(shí),結(jié)果集返回的是所有匹配的記錄(行)。有時(shí)候僅需要返回第一行或者前幾行,這時(shí)候就需要limit子句
語(yǔ)法格式: select 字段 from 表名 limit [offset,] number limit 的第一個(gè)參數(shù)是位置偏移量(可選參數(shù)),是設(shè)置 mysql 從哪一行開(kāi)始 如果不設(shè)定第一個(gè)參數(shù),將會(huì)從表中的第一條記錄開(kāi)始顯示。 第一條偏移量是0,第二條為1 offset 為索引下標(biāo) number 為索引下標(biāo)后的幾位
1.6、設(shè)置別名(alias-as)
在mysql查詢(xún)時(shí),當(dāng)表的名字比較長(zhǎng)或者表內(nèi)某些字段比較長(zhǎng)時(shí),為了方便書(shū)寫(xiě)或者多次使用相同的表,可以給字段列或表設(shè)置別名,方便操作,增強(qiáng)可讀性
列的別名 select 字段 as 字段別名 表名
表的別名 select 別名.字段 from 表名 as 別名
as 可以省略
使用場(chǎng)景:
對(duì)復(fù)雜的表進(jìn)行查詢(xún)時(shí),別名可以縮短查詢(xún)語(yǔ)句的長(zhǎng)度
奪標(biāo)相連查詢(xún)的時(shí)候(通俗易懂,減短sql語(yǔ)句)
在為表設(shè)置別名時(shí),要保證別名不能與數(shù)據(jù)庫(kù)中的其他表的名稱(chēng)沖突
列的別名在結(jié)果中有顯示的,而表的別名在結(jié)果中沒(méi)有顯示,只在執(zhí)行查詢(xún)時(shí)使用
查詢(xún)表的記錄數(shù)量,以別名顯示
利用as,將查詢(xún)的數(shù)據(jù)導(dǎo)入另一個(gè)表內(nèi)
create table test2 as select * from name; select * from test2; select * from name;
這里as起到的作用
1、創(chuàng)建了一個(gè)新表,并定義表結(jié)構(gòu),插入表數(shù)據(jù)(與school表相同)
2、但是約束沒(méi)有被完全復(fù)制過(guò)來(lái),但是如果原表設(shè)置了主鍵,那么附表的:default字段會(huì)默認(rèn)設(shè)置一個(gè)0
1.7、通配符
1、通配符主要用于替換字符串中的部分字符,通過(guò)部分字符的匹配將相關(guān)結(jié)果查詢(xún)出來(lái)
2、通常通配符都是跟LIKE一起使用的,并協(xié)同WHERE
3、子句共同來(lái)完成查詢(xún)?nèi)蝿?wù),常用的通配符有兩個(gè),分別為
%:百分號(hào)表示零個(gè)、一個(gè)或多個(gè)字符
_:下劃線(xiàn)表示單個(gè)字符
二、子查詢(xún)
1、自查詢(xún)也被稱(chēng)作內(nèi)查詢(xún)或者嵌套查詢(xún),是指在一個(gè)查詢(xún)語(yǔ)句里面還嵌套著另一個(gè)查詢(xún)語(yǔ)句
2、子查詢(xún)語(yǔ)句是先于主查詢(xún)進(jìn)行下一步的查詢(xún)過(guò)濾
3、在自查詢(xún)中可以與主語(yǔ)句查詢(xún)相同的表,也可以是不同的表‘
2.1、select查詢(xún)
子語(yǔ)句可以與主語(yǔ)句所查詢(xún)的表相同,也可以是不同表
語(yǔ)法格式
select 字段1,字段2 from 表名1 where 字段 in (select 字段 from 表名 where 條件);
主語(yǔ)句:select 字段1,字段2 from 表名1 where 字段
in:將主表和子表關(guān)聯(lián)/連接的語(yǔ)法
子語(yǔ)句(集合):select 字段 from 表名 where 條件
相同表查詢(xún)
select name,address from test2 where id in (select id from test2 where power>0);
多表查詢(xún)
select name,power from test2 where id in (select id from test1 where power<100);
NOT取反,將子查詢(xún)的結(jié)果,進(jìn)行取反操作
select name,power from test2 where id not in (select id from test1 where power<100);
2.2、insert插入
子查詢(xún)還可以用在insert語(yǔ)句中,子查詢(xún)的結(jié)果集可以通過(guò)insert語(yǔ)句插入到其它表中
create table test3 like test2; desc test3; insert into test3 select * from test2 where id in (select id from test2 where power<100);
2.3、update更新
update語(yǔ)句也可以使用子查詢(xún),update內(nèi)的子查詢(xún),在set更新內(nèi)容時(shí),可以是單獨(dú)的一列,也可以是多列
update test2 set power=555 where id in (select id from test3 where power<0);
2.4、delete刪除
selete也使用與子查詢(xún)
delete from test2 where id in (select id from test3 where power<50);
2.5、exists
exists這個(gè)關(guān)鍵字在子查詢(xún)時(shí),主要用于判斷子查詢(xún)的結(jié)果集是否為空,如果不為空,則返回ture,反之則返回false
注:在使用exists時(shí),當(dāng)子查詢(xún)有結(jié)果時(shí),不關(guān)心子查詢(xún)的內(nèi)容,執(zhí)行主查詢(xún)操作,當(dāng)子查詢(xún)沒(méi)有結(jié)果時(shí),則不執(zhí)行主查詢(xún)操作
三、MySQL視圖
視圖是一張?zhí)摂M表,這張?zhí)摂M表中不包含真實(shí)數(shù)據(jù),只是做了真實(shí)數(shù)據(jù)的映射
功能:
1、簡(jiǎn)化查詢(xún)結(jié)果集、靈活查詢(xún),可以針對(duì)不同用戶(hù)呈現(xiàn)不同結(jié)果集,相對(duì)有更高的安全性
2、本質(zhì)而言,視圖是一種select(結(jié)果集的呈現(xiàn))
注意:視圖適合于多表瀏覽時(shí)使用,不適合增,刪,改
3.1、視圖與表的區(qū)別
- 視圖是語(yǔ)句編譯好的sql語(yǔ)句,而表不是
- 視圖沒(méi)有實(shí)際的物理記錄,而表有
- 表占用物理空間而視圖不占用物理空間
- 視圖只是邏輯概念的存在,表可以及時(shí)對(duì)它進(jìn)行修改,但視圖只能有創(chuàng)建的語(yǔ)句來(lái)修改
- 視圖是查看數(shù)據(jù)表的一種方法,可以查詢(xún)數(shù)據(jù)表中某些字段構(gòu)成的數(shù)據(jù),只是一些sql語(yǔ)句的集合
- 從安全的角度說(shuō),視圖可以不給用戶(hù)接觸數(shù)據(jù)表,從而不知道表結(jié)構(gòu)
- 表屬于全局模式中的表,是實(shí)表;視圖屬于局部模式的表,是虛表
- 視圖的建立和刪除只影響視圖本身,不影響對(duì)應(yīng)的基本表。(但是更新視圖數(shù)據(jù),是會(huì)影響到基本表的)
3.2、視圖與表的聯(lián)系
- 視圖(view)是在基本表之上建立的表,它的結(jié)構(gòu)(即定義的列)和內(nèi)容(即所有數(shù)據(jù)行)都來(lái)自基本表
- 一個(gè)視圖可以對(duì)應(yīng)一個(gè)基本表,也可以對(duì)應(yīng)多個(gè)基本表
- 視圖是基本表的抽象和在邏輯意義上建立的新關(guān)系。
#創(chuàng)建視圖 create view 視圖表名 sa select * from 表名 where 條件; #查看視圖 select * from 視圖表名 #查看表狀態(tài) show table status\G #查看視圖結(jié)構(gòu) desc 視圖表名
修改視圖表數(shù)據(jù)
當(dāng)數(shù)據(jù)發(fā)送變化時(shí),若數(shù)據(jù)與之前創(chuàng)建視圖表時(shí)的關(guān)聯(lián)條件不一致時(shí),視圖表的數(shù)據(jù)將會(huì)發(fā)送改變
update name_view set power=300 where id=4; select * from name_view; select * from name;
更改源表數(shù)據(jù)
update name_view set power=100 where id=2; select * from name_view; select * from name;
四、NULL值
在SQL語(yǔ)句使用過(guò)程中,接觸會(huì)碰到NULL這幾個(gè)字符。通常使用NULL來(lái)表示缺失的值,也就是在表中該字段是沒(méi)有值的。如果在創(chuàng)建表時(shí),限制某些字段不為空,則可以使用NOT NULL關(guān)鍵字,不使用則默認(rèn)可以為空。在向表內(nèi)插入記錄或者更新記錄或者更新記錄時(shí),如果該字段沒(méi)有NOT NULL并且沒(méi)有值,這時(shí)候新記錄的該字段將被保存為NULL。需要注意的是,NULL值與數(shù)字0或者空白(spaces)的字段是不同的,值為NULL的字段是沒(méi)有值的。在SQL語(yǔ)句中,使用IS NULL可以判斷表內(nèi)的某個(gè)字段是不是NULL值,相反的用IS NOT NULL可以判斷不是NULL值。
4.1、NULL值與空值區(qū)別
- 空值長(zhǎng)度為0,不占空間,NULL值得長(zhǎng)度為null,占用空間
- is null無(wú)法判斷空值
- 空值使用"=“或者”<>"來(lái)處理(!=)
- count()計(jì)算時(shí),NULL會(huì)忽略,空值會(huì)加入計(jì)算
注:NULL是占用內(nèi)存空間的,而空值則不占用內(nèi)存空間
alter table name add card char(10); select * from name; select count(card) from name;
update name set card=' ' where id=3; select * from name; select count(card) from name;
4.2、查詢(xún)空值與非空值
select * from name where card is null; select * from name where card is not null;
五、連接查詢(xún)
MySQL 的連接查詢(xún),通常都是將來(lái)自?xún)蓚€(gè)或多個(gè)表的記錄行結(jié)合起來(lái),基于這些表之間的 共同字段,進(jìn)行數(shù)據(jù)的拼接。首先,要確定一個(gè)主表作為結(jié)果集,然后將其他表的行有選擇 性的連接到選定的主表結(jié)果集上。
使用較多的連接查詢(xún)包括:內(nèi)連接、左連接和右連接
5.1、內(nèi)連接
- MySQL中的內(nèi)連接就是兩種或多張表中同時(shí)符合某種條件的數(shù)據(jù)記錄的組合
- 通常在FROM子句中使用關(guān)鍵子INNER JOIN來(lái)連接多張表,并使用ON子句設(shè)置連接條件,
- 內(nèi)連接是系統(tǒng)默認(rèn)的表連接,所以在 FROM 子句后可以省略 INNER 關(guān)鍵字,只使用 關(guān)鍵字 JOIN。
- 同時(shí)有多個(gè)表時(shí),也可以連續(xù)使用 INNER JOIN 來(lái)實(shí)現(xiàn)多表的內(nèi)連接。
- 不過(guò)為了更好的性能,建議最好不要超過(guò)三個(gè)表。
內(nèi)連查詢(xún):通過(guò)inner join的方式將兩張表指定的相同字段的記錄行輸出出來(lái)
select 表名1.字段1,表名1.字段2 from 表名1 inner join 表名2 on 表名1.字段 = 表名2.字段; select name.id,name.name,name.address from name inner join test2 on name.id=test2.id;
5.2、左連接
- 左連接也可以被稱(chēng)為左外連接,在FROM 子句中使用 LEFT JOIN 或者 LEFT OUTER JOIN 關(guān)鍵字來(lái)表示。
- 左連接以左側(cè)表為基礎(chǔ)表,接收左表的所有行,并用這些行與右側(cè)參考表中的記錄進(jìn)行匹配,也就是說(shuō)匹配左表中的所有行以及右表中符合條件的行。
select * from name left join test2 on name.id=test2.id;
5.3、右連接
- 右連接也被稱(chēng)為右外連接,在FROM 子句中使用 RIGHT JOIN 或者 RIGHT OUTER JOIN 關(guān)鍵字來(lái)表示。
- 右連接跟左連接正好相反,它是以右表為基礎(chǔ)表,用于接收右表中的所有行,并用這些記錄與左表中的行進(jìn)行匹配。
總結(jié)
在MySQL中,視圖表與索引一樣,都是MySQL數(shù)據(jù)庫(kù)的一種優(yōu)化,其可以加快查詢(xún)速度,但需要注意的時(shí),視圖表一般只作查詢(xún)使用,不對(duì)其進(jìn)行增、刪、改;視圖表并不占用實(shí)際內(nèi)存
在表中的NULL值與空值,NULL值是占用內(nèi)存空間,但是不計(jì)入數(shù)據(jù)統(tǒng)計(jì),而空值是不占內(nèi)存空間,但是算數(shù)據(jù),計(jì)入數(shù)據(jù)統(tǒng)計(jì)的。
內(nèi)連接inner join,顯示的數(shù)據(jù)為左右表都同時(shí)滿(mǎn)足條件。
左連接 left join ,是以左表為基礎(chǔ)顯示,右表需滿(mǎn)足條件。
右連接right join ,是以右表為基礎(chǔ)顯示,左表需滿(mǎn)足條件。
到此這篇關(guān)于MySQL進(jìn)階語(yǔ)句的文章就介紹到這了,更多相關(guān)MySQL進(jìn)階語(yǔ)句內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
教你巧用mysql位運(yùn)算解決多選值存儲(chǔ)的問(wèn)題
如果你不知道什么是位運(yùn)算的話(huà),那么請(qǐng)你先去看看基礎(chǔ)的C語(yǔ)言教程吧,下面這篇文章主要給大家介紹了關(guān)于如何巧用mysql位運(yùn)算解決多選值存儲(chǔ)問(wèn)題的相關(guān)資料,需要的朋友可以參考下2022-02-02簡(jiǎn)單解析MySQL中的cardinality異常
這篇文章主要介紹了簡(jiǎn)單解析MySQL中的cardinality異常,這個(gè)異常會(huì)導(dǎo)致索引無(wú)法使用,需要的朋友可以參考下2015-05-05詳解Mysql自動(dòng)備份與恢復(fù)的幾種方法(圖文教程)
本篇文章主要介紹了Mysql 自動(dòng)備份與恢復(fù),主要有三種方法,有需要的可以了解一下。2016-11-11Mysql優(yōu)化order by語(yǔ)句的方法詳解
本篇文章我們將了解ORDER BY語(yǔ)句的優(yōu)化,在文中給大家提到了mysql中的兩種排序方式,需要的朋友參考下吧2018-08-08導(dǎo)致MySQL索引失效的一些常見(jiàn)寫(xiě)法總結(jié)
這篇文章主要給大家介紹了關(guān)于導(dǎo)致MySQL索引失效的一些常見(jiàn)寫(xiě)法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09mysql DBA:mysqladmin常用命令總結(jié)
mysqladmin是MySQL一個(gè)重要的客戶(hù)端,最常見(jiàn)的是使用它來(lái)關(guān)閉數(shù)據(jù)庫(kù),除此,該命令還可以了解MySQL運(yùn)行狀態(tài)、進(jìn)程信息、進(jìn)程等,本文介紹一下如何使用mysqladmin extended-status(因?yàn)闆](méi)有"歧義",所以可以使用ext代替)了解MySQL的運(yùn)行狀態(tài)2014-03-03使用use index優(yōu)化sql查詢(xún)的詳細(xì)介紹
本篇文章是對(duì)使用use index優(yōu)化sql查詢(xún)進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06