MySQL新手入門進階語句匯總
引言
對MySQL數(shù)據(jù)庫的查詢,除了基本的查詢外,有時候需要對查詢的結構集進行處理。例如只取10條數(shù)據(jù),對查詢結果進行排序或分組等等
一、常用查詢
1.1、order by按關鍵字排序
實用select語句可以講需要的數(shù)據(jù)從mMySQL數(shù)據(jù)庫中查詢出來,如果對插敘的結果進行排序,可以實用order by語句來對語句實現(xiàn)排序,并最終講排序的結果返回給用戶,這個語句的排序不光可以針對某一個 字段,也可以針對多個字段
語法:
select 字段1,字段2... from 表名 order by 字段1,字段2... asc #查詢結果以升序方式顯示,asc可以省略 select 字段1,字段2... from 表名 order by 字段1,字段2,... desc #查詢結果以降序方式顯示
1、ASC是按照升序進行排序,是默認的排序方式,即ASC可以省略。
2、select語句中如果沒有制定具體的排序方式,即默認按ASC方式進行排序
3、DESC是按照降序方式進行排列,當然order by前面也可以實用where子句對查詢結果進一步過濾。
升序排序
select name,power from name order by power;

降序排序
select name,power from name order by power desc;

結合where進行條件過濾在排序
select name,power,phone from name where phone=1234566777 order by power;

多字段排序
ORDER BY語句也可以使用多個字段來進行排序,當排序的第一個字段相同的記錄有多條的情況下,這些多條的記錄再按照第二個字段進行排序,ORDER BY后面跟多個字段時,字段之間使用英文逗號隔開,優(yōu)先級是按先后順序來定,但是order by之后的第一個參數(shù)只有再出現(xiàn)相同值時,第二個字段才有意義。
select name,power,phone from name order by phone,power desc;

1.2、and/or判斷
在大型數(shù)據(jù)庫中,有時查詢數(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查詢不重復記錄
select distinct 字段 from 表名﹔ distinct 必須放在最開頭 distinct 只能使用需要去重的字段進行操作 distinct 去重多個字段時,含義是:幾個字段同時重復時才能被過濾,會默認按左邊第一個字段為依據(jù)。

1.4、GROUP BY對結果進行分組
通過SQL查詢出來的結果,還可以對其進行分組,使用GROUP BY語句來實現(xiàn),GROUP BY通常都是結合聚合函數(shù)一起使用的,常用的聚合函數(shù)包括:計數(shù)(COUNT)、求和(SUM)、求平均數(shù)(AVG)、最大值(MAX)、最小值(MIN),GROUP BY分組的時候可以按一個或多個字段對結果進行分組處理
1、對group by后面的字段的查詢結果進行匯總分組,通常是結合聚合函數(shù)一起使用的
2、group by有一個原則,就是select后面的所有列中,沒有使用聚合函數(shù)的列必須出現(xiàn)在group by的后面
select 字段,聚合函數(shù) from 表名 (where 字段名(匹配) 數(shù)值) group by 字段名;


1.5、limit限制結果條目
limit限制輸出的結果記錄
在使用MySQL select語句進行查詢時,結果集返回的是所有匹配的記錄(行)。有時候僅需要返回第一行或者前幾行,這時候就需要limit子句
語法格式: select 字段 from 表名 limit [offset,] number limit 的第一個參數(shù)是位置偏移量(可選參數(shù)),是設置 mysql 從哪一行開始 如果不設定第一個參數(shù),將會從表中的第一條記錄開始顯示。 第一條偏移量是0,第二條為1 offset 為索引下標 number 為索引下標后的幾位


1.6、設置別名(alias-as)
在mysql查詢時,當表的名字比較長或者表內某些字段比較長時,為了方便書寫或者多次使用相同的表,可以給字段列或表設置別名,方便操作,增強可讀性
列的別名 select 字段 as 字段別名 表名
表的別名 select 別名.字段 from 表名 as 別名
as 可以省略
使用場景:
對復雜的表進行查詢時,別名可以縮短查詢語句的長度
奪標相連查詢的時候(通俗易懂,減短sql語句)
在為表設置別名時,要保證別名不能與數(shù)據(jù)庫中的其他表的名稱沖突
列的別名在結果中有顯示的,而表的別名在結果中沒有顯示,只在執(zhí)行查詢時使用

查詢表的記錄數(shù)量,以別名顯示

利用as,將查詢的數(shù)據(jù)導入另一個表內
create table test2 as select * from name; select * from test2; select * from name;
這里as起到的作用
1、創(chuàng)建了一個新表,并定義表結構,插入表數(shù)據(jù)(與school表相同)
2、但是約束沒有被完全復制過來,但是如果原表設置了主鍵,那么附表的:default字段會默認設置一個0

1.7、通配符
1、通配符主要用于替換字符串中的部分字符,通過部分字符的匹配將相關結果查詢出來
2、通常通配符都是跟LIKE一起使用的,并協(xié)同WHERE
3、子句共同來完成查詢任務,常用的通配符有兩個,分別為
%:百分號表示零個、一個或多個字符
_:下劃線表示單個字符



二、子查詢
1、自查詢也被稱作內查詢或者嵌套查詢,是指在一個查詢語句里面還嵌套著另一個查詢語句
2、子查詢語句是先于主查詢進行下一步的查詢過濾
3、在自查詢中可以與主語句查詢相同的表,也可以是不同的表‘
2.1、select查詢
子語句可以與主語句所查詢的表相同,也可以是不同表
語法格式
select 字段1,字段2 from 表名1 where 字段 in (select 字段 from 表名 where 條件);
主語句:select 字段1,字段2 from 表名1 where 字段
in:將主表和子表關聯(lián)/連接的語法
子語句(集合):select 字段 from 表名 where 條件
相同表查詢
select name,address from test2 where id in (select id from test2 where power>0);

多表查詢
select name,power from test2 where id in (select id from test1 where power<100);

NOT取反,將子查詢的結果,進行取反操作
select name,power from test2 where id not in (select id from test1 where power<100);

2.2、insert插入
子查詢還可以用在insert語句中,子查詢的結果集可以通過insert語句插入到其它表中
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語句也可以使用子查詢,update內的子查詢,在set更新內容時,可以是單獨的一列,也可以是多列
update test2 set power=555 where id in (select id from test3 where power<0);

2.4、delete刪除
selete也使用與子查詢
delete from test2 where id in (select id from test3 where power<50);

2.5、exists
exists這個關鍵字在子查詢時,主要用于判斷子查詢的結果集是否為空,如果不為空,則返回ture,反之則返回false
注:在使用exists時,當子查詢有結果時,不關心子查詢的內容,執(zhí)行主查詢操作,當子查詢沒有結果時,則不執(zhí)行主查詢操作

三、MySQL視圖
視圖是一張?zhí)摂M表,這張?zhí)摂M表中不包含真實數(shù)據(jù),只是做了真實數(shù)據(jù)的映射
功能:
1、簡化查詢結果集、靈活查詢,可以針對不同用戶呈現(xiàn)不同結果集,相對有更高的安全性
2、本質而言,視圖是一種select(結果集的呈現(xiàn))
注意:視圖適合于多表瀏覽時使用,不適合增,刪,改
3.1、視圖與表的區(qū)別
- 視圖是語句編譯好的sql語句,而表不是
- 視圖沒有實際的物理記錄,而表有
- 表占用物理空間而視圖不占用物理空間
- 視圖只是邏輯概念的存在,表可以及時對它進行修改,但視圖只能有創(chuàng)建的語句來修改
- 視圖是查看數(shù)據(jù)表的一種方法,可以查詢數(shù)據(jù)表中某些字段構成的數(shù)據(jù),只是一些sql語句的集合
- 從安全的角度說,視圖可以不給用戶接觸數(shù)據(jù)表,從而不知道表結構
- 表屬于全局模式中的表,是實表;視圖屬于局部模式的表,是虛表
- 視圖的建立和刪除只影響視圖本身,不影響對應的基本表。(但是更新視圖數(shù)據(jù),是會影響到基本表的)
3.2、視圖與表的聯(lián)系
- 視圖(view)是在基本表之上建立的表,它的結構(即定義的列)和內容(即所有數(shù)據(jù)行)都來自基本表
- 一個視圖可以對應一個基本表,也可以對應多個基本表
- 視圖是基本表的抽象和在邏輯意義上建立的新關系。
#創(chuàng)建視圖 create view 視圖表名 sa select * from 表名 where 條件; #查看視圖 select * from 視圖表名 #查看表狀態(tài) show table status\G #查看視圖結構 desc 視圖表名



修改視圖表數(shù)據(jù)
當數(shù)據(jù)發(fā)送變化時,若數(shù)據(jù)與之前創(chuàng)建視圖表時的關聯(lián)條件不一致時,視圖表的數(shù)據(jù)將會發(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語句使用過程中,接觸會碰到NULL這幾個字符。通常使用NULL來表示缺失的值,也就是在表中該字段是沒有值的。如果在創(chuàng)建表時,限制某些字段不為空,則可以使用NOT NULL關鍵字,不使用則默認可以為空。在向表內插入記錄或者更新記錄或者更新記錄時,如果該字段沒有NOT NULL并且沒有值,這時候新記錄的該字段將被保存為NULL。需要注意的是,NULL值與數(shù)字0或者空白(spaces)的字段是不同的,值為NULL的字段是沒有值的。在SQL語句中,使用IS NULL可以判斷表內的某個字段是不是NULL值,相反的用IS NOT NULL可以判斷不是NULL值。
4.1、NULL值與空值區(qū)別
- 空值長度為0,不占空間,NULL值得長度為null,占用空間
- is null無法判斷空值
- 空值使用"=“或者”<>"來處理(!=)
- count()計算時,NULL會忽略,空值會加入計算
注:NULL是占用內存空間的,而空值則不占用內存空間
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、查詢空值與非空值
select * from name where card is null; select * from name where card is not null;

五、連接查詢
MySQL 的連接查詢,通常都是將來自兩個或多個表的記錄行結合起來,基于這些表之間的 共同字段,進行數(shù)據(jù)的拼接。首先,要確定一個主表作為結果集,然后將其他表的行有選擇 性的連接到選定的主表結果集上。
使用較多的連接查詢包括:內連接、左連接和右連接
5.1、內連接
- MySQL中的內連接就是兩種或多張表中同時符合某種條件的數(shù)據(jù)記錄的組合
- 通常在FROM子句中使用關鍵子INNER JOIN來連接多張表,并使用ON子句設置連接條件,
- 內連接是系統(tǒng)默認的表連接,所以在 FROM 子句后可以省略 INNER 關鍵字,只使用 關鍵字 JOIN。
- 同時有多個表時,也可以連續(xù)使用 INNER JOIN 來實現(xiàn)多表的內連接。
- 不過為了更好的性能,建議最好不要超過三個表。
內連查詢:通過inner join的方式將兩張表指定的相同字段的記錄行輸出出來
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、左連接
- 左連接也可以被稱為左外連接,在FROM 子句中使用 LEFT JOIN 或者 LEFT OUTER JOIN 關鍵字來表示。
- 左連接以左側表為基礎表,接收左表的所有行,并用這些行與右側參考表中的記錄進行匹配,也就是說匹配左表中的所有行以及右表中符合條件的行。
select * from name left join test2 on name.id=test2.id;

5.3、右連接
- 右連接也被稱為右外連接,在FROM 子句中使用 RIGHT JOIN 或者 RIGHT OUTER JOIN 關鍵字來表示。
- 右連接跟左連接正好相反,它是以右表為基礎表,用于接收右表中的所有行,并用這些記錄與左表中的行進行匹配。

總結
在MySQL中,視圖表與索引一樣,都是MySQL數(shù)據(jù)庫的一種優(yōu)化,其可以加快查詢速度,但需要注意的時,視圖表一般只作查詢使用,不對其進行增、刪、改;視圖表并不占用實際內存
在表中的NULL值與空值,NULL值是占用內存空間,但是不計入數(shù)據(jù)統(tǒng)計,而空值是不占內存空間,但是算數(shù)據(jù),計入數(shù)據(jù)統(tǒng)計的。
內連接inner join,顯示的數(shù)據(jù)為左右表都同時滿足條件。
左連接 left join ,是以左表為基礎顯示,右表需滿足條件。
右連接right join ,是以右表為基礎顯示,左表需滿足條件。
到此這篇關于MySQL進階語句的文章就介紹到這了,更多相關MySQL進階語句內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

