Mysql學習之數(shù)據(jù)庫檢索語句DQL大全小白篇
1.簡單檢索數(shù)據(jù)
博客內(nèi)容中student表為:
1.1.檢索單個列
select + 列名 + from + 表名
1.2.檢索多個列
select + 列名1,列名2,列名3......列n + from + 表名
1.3.檢索所有列
select + *(表示通配符) +from + 表名
1.4.檢索不同的行
使用distinct關(guān)鍵字
select + distinct + 列名 + from + 表名
舉個例子:我們想要查詢一個班級學生的性別有多少種,那么就不需要把每一個同學的性別都顯示出來,只需要把不同性別顯示出來就行即distinct返回唯一值
這里有一個注意點,distinct關(guān)鍵字應用于所有列前,不僅僅是前置它的列,如果給出兩個列,那么除非指定的兩個列都不同,否則所有的行都會被檢測出來
1.5.限制檢索結(jié)果
使用limit關(guān)鍵字
selet + 列名 + from + 表名 + limit + 數(shù)字
我們平時select語句返回匹配的行數(shù),我們可以使用limit來限定返回的行數(shù),比如select結(jié)果可以返回10行,我們只要前5行,那么就可以使用limit后邊參數(shù)為5,如果select返回4行,而limit限制的是5行,那么會返回4行。當然limit后邊的參數(shù)可以有兩個,有兩種寫法
即:
1.selet + 列名 + from + 表名 + limit + 數(shù)字1,數(shù)字2
2.selet + 列名 + from + 表名 + limit + 數(shù)字2 + offset + 數(shù)字1
意思是從數(shù)字1所代表的行數(shù)開始,檢索數(shù)字2行,第二種寫法是在MySQL5之后才支持的
注意檢索的第一行為行0,而不是1
1.6.使用完全限制的表名檢索
select + 表名.列名 + from + 數(shù)據(jù)庫名.表名
2.排序檢索數(shù)據(jù)
2.1.基本語法
使用order by關(guān)鍵字
select + 列名(可以多個列) + from + 表名 + order by + 列名
兩個列名可以不一樣
我們?nèi)粘6伎梢詫T工的工資進行排序,但是有的員工工資一樣,這樣我們可以在員工工資一樣的基礎(chǔ)上對年齡等進行排序,這就是按照多個列進行排序
即:
select + 列名(可以多個列) + from + 表名 + order by + 列1,列2
意思是在列1一致的情況下按照列2進行排序,如果列1不一致那么就不會按照列2排序
2.2.指定排序方向
上面我們講到的排序其實都是默認排序,默認是按照升序(字母按'A'到‘Z‘,數(shù)字從小到大)
我們一樣可以降序排列
使用desc關(guān)鍵字
select + 列名(可以多個列) + from + 表名 + order by + 列名 desc
那么多個排序規(guī)則咋辦呢,即我們把一個班的同學按照總分進行降序排序,那么總分一樣的按照語文成績也降序排列,這里我們注意
desc關(guān)鍵字只應用到直接位于其前面的列
所有當我們需要按照多個字段排序只需要在對應字段后邊寫上對應的排序規(guī)則,那么比如我們需要兩個字段都降序:
select + 列名(可以多個列) + from + 表名 + order by + 列名1 desc,列名2 desc
其實升序的話我們不用寫,因為默認是升序,關(guān)鍵字是asc
按照上邊學的,我們做一個例子:
列出年齡最大的學生的姓名性別和數(shù)學成績:
select sname,ssex,smath from student ORDER BY sage desc LIMIT 1
注意order by和limit的位置順序
3.檢索過濾數(shù)據(jù)
3.1使用簡單where子句
select + 列名 + from + 表名 where + 判斷條件
where一個特殊操作符:
1.
<>
:不等于,其實和!=
是一樣的
2.between
:和and
連用表示在指定的兩個值之間例如:select age from student where age between 18 and 20
where進行空值檢查:
select + 列名 + from + 表名 + where + 列名 + is null
注意這里用到的是is不是=
3.2組合where子句
操作符 | 作用 |
---|---|
and | 要同時滿足and左右兩邊的條件 |
or | 滿足or一邊的條件就行 |
in | 用來指定條件范圍 |
not | 用來否定條件里邊的內(nèi)容 |
作用and要同時滿足and左右兩邊的條件or滿足or一邊的條件就行in用來指定條件范圍not用來否定條件里邊的內(nèi)容
拿student表來舉例子:
1.and:我們查找女生中數(shù)學超過90分的學生的所有信息
SELECT * FROM student where ssex=“女” and smath>90
2.or:我們查找年齡大于19歲學生的姓名,或者英語成績大于90的學生姓名
SELECT sname FROM student where sage>19 or senglish>90
3.in:我們查找年齡為18和19歲學生的姓名
select sname from student where sage in(18,19)
4.not:我們查找除了年齡為18和19歲學生的姓名
select sname from student where sage not in(18,19)
5.我們查找年齡不是20歲的學生的所有信息并且把他們按照數(shù)學成績降序排列,只要第二行的內(nèi)容:
select * from student where sage not in(20) GROUP BY smath desc LIMIT 1,1
我們注意他們各個關(guān)鍵字的順序和limit后邊參數(shù)代表的含義
3.3使用通配符
通配符:用來匹配值的一部分的特殊符號
like: 根據(jù)通配符匹配而不是直接相等匹配進行比較
通配符 | 作用 |
---|---|
% | 表示任何字符出現(xiàn)的任意的次數(shù) |
_ | 匹配單個字符串長度 |
拿student表來舉例子:
1.%:我們查找姓名里邊帶花的同學的所有信息
select * from student where sname like “%花%”
會有兩條結(jié)果翠花和如花似玉,%只會匹配一側(cè)(不限字符串長度),如果只是“%花”,那么如花似玉就不會被查找出來。當然,我們想要查找如花似玉也可以這么來查:
select * from student where sname like “%花%玉”
2._:我們查找如花似玉這名優(yōu)秀的同學:
select * from student where sname like “_花_玉”
%能匹配0個字符和不限長度的字符串,而_只能而且必須匹配1個字符
4.使用正則表達式檢索數(shù)據(jù)
正則表達式是用來匹配文本的特殊串,將一個模式(正則表達式)與一個文本串進行比較
正則表達式常用符號:
符號 | 符號作用 |
---|---|
. | 匹配單個字符 |
| | 相當于或的意思 |
[…] | 或的另一種表現(xiàn)形式 |
- | 表示匹配范圍 |
\\ | 匹配特殊字符 |
* | 0個或者多個匹配 |
+ | 1個或多個匹配等于{1,} |
? | 0個或者一個匹配等于{0,1} |
{n} | 指定數(shù)目的匹配 |
{n,} | 不少于指定數(shù)目的匹配 |
{n,m} | 匹配數(shù)目的范圍m不超過255 |
^ | 文本的開始 |
$ | 文本的結(jié)尾 |
[[ :<:]] | 詞的開始 |
[[:>:]] | 詞的結(jié)尾 |
關(guān)鍵字:regexp
select + 列名(可以多個列) + from + 表名 + where + 列名 + regexp + 正則表達式
拿student表來說:
1 . 先說日regexp和like的區(qū)別
like匹配整個串然而regexp則是匹配子串
舉個例子:
我們用like匹配別為1的學生的姓名
select sname from student where othername like “1”
結(jié)果:
風姐
我們把like換成regexp:
select sname from student where othername regexp “1”
結(jié)果:
翠花
鳳姐
秋香
現(xiàn)在是不是對區(qū)別有了很明顯的認識 2 ..
就是匹配任意一個字符
舉個例子,我們查找語文成績個位數(shù)為8的同學的名字:
select sname from student where schinese regexp “.8”
結(jié)果:
鳳姐
秋香
3.|
舉個例子我們查找別名中含1 ton或2的同學的姓名
select sname from student where othername regexp “1 ton|2”
查找結(jié)果:
翠花
旺財
如花似玉
4.[....]
舉個例子,我們查找別名為1 ton或者2 ton的學生的姓名
select sname from student where othername regexp “[1|2] ton”
運行結(jié)果:
翠花
旺財
其實上邊就等同于select sname from student where othername regexp “1 ton|2 ton”
也等同于select sname from student where othername regexp “[12] ton” 5.-
舉個例子,查找別名中含有小寫英文字母的同學的姓名
select sname from student where othername regexp “[a-z]”
運行結(jié)果:
翠花
旺財
秋香
如花似玉
6.\\
舉個例子我們查找別名中含有.
這個字符的同學的姓名
select sname from student where othername regexp “\\.”
查找結(jié)果;
無
我們所接觸的特殊符號\,[,],等等都可以用\\來轉(zhuǎn)義
7.?
我們不拿student表舉例子,把書上的例子拿過來:
注意這一句話:?匹配它前面的任何字符的0次和1次
8 .{n}再拿書上的一個例子(其他的幾個大括號同理):
這里有一個匹配字符類:
9.^
還是書上的例子:
當然^
不止可以指串的開始,還可以在集合中(就是[]中)表示否定含義
為表示否定含義舉個例子:
[^a-z]:意思是匹配不是a-z的字符
我們拿student表舉例子:查找別名不是以a和1開頭的同學的名字
select sname from student where othername regexp “^[^a1]”
第一個^限制開頭,第二個^表示否定
10.補充一點,不大小寫查詢
關(guān)鍵字:binary
我們平時查詢的字符串都會忽略大小寫,所以,可以使用binary不忽略大小寫
select + 列名(可以多個列) + from + 表名 + where + 列名 + regexp + binary + 正則表達式
其余的重要程度沒那么高,自己試吧
5.檢索計算字段
5.1使用拼接字段
使用concat(str1,str2,....)函數(shù)
舉個例子如果數(shù)學老師有這種請求,就是把所有學生的數(shù)學成績打印出來并且打印格式為數(shù)學成(姓名) 這種格式那么可以
select concat(smath,"(",sname,")") from student
運行結(jié)果:
5.2使用別名
關(guān)鍵字:AS
用5.1的例子
SELECT CONCAT(LTRIM(smath),"(",sname,")") AS “數(shù)學成績” from student
結(jié)果:
AS可以不加,以上例子也可以寫成
SELECT CONCAT(LTRIM(smath),"(",sname,")") “數(shù)學成績” from student。group by,having,order by后都支持別名
5.3執(zhí)行算數(shù)計算
比如我們可以查找每一個同學的總分和該同學的名字:
SELECT sname as “姓名”,smath+schinese+senglish as “總成績” from student
運行結(jié)果:
6.使用函數(shù)檢索數(shù)據(jù)
6.1常用文本處理函數(shù):
拿upper來舉例子,我們把同學的別名使用upper函數(shù)查詢出來:
SELECT UPPER(othername) as “別名” from student
運行結(jié)果:
6.2日期和時間處理函數(shù):
日期的格式:
我們拿幾個重要的函數(shù)舉例子:
1.now():返回當前系統(tǒng)日期,時間
select now()
運行結(jié)果:
2.curdate():返回當前系統(tǒng)日期,不包含時間
select curdate()
運行結(jié)果:
3.curtime():返回當前時間,不包含日期
select curtime()
運行結(jié)果:
4.YEAR(),Hour()等:獲取指定的部分
select year(now())
運行結(jié)果:
5.對于date_format()函數(shù)
把當前時間轉(zhuǎn)換成字符串:
select DATE_FORMAT(now(),"%Y-%c-%d")
運行結(jié)果:
對應的有一個字符串轉(zhuǎn)日期的函數(shù):
例子:
select STR_TO_DATE(“2001-09-10”,"%Y-%c-%d")
運行結(jié)果:
6.3數(shù)值處理函數(shù):
6.4聚集函數(shù):
1.AVG()函數(shù)
例子:我們拿student表來說,我們查找學生的數(shù)學平均分
select avg(smath) as “數(shù)學平均分” from student
運行結(jié)果:
2.COUNT函數(shù)
一般的COUNT()函數(shù)有兩種用法
- 1使用count(*)進行計數(shù),不管列是不是null值
- 2.使用count(column)對特定列中具有的值進行計數(shù),忽略null值
用法的例子:
select count(*) from student
運行結(jié)果:
3.指定不同值
關(guān)鍵字distinct
如果我們查找student表中不同的年齡有多少種;
select DISTINCT sage as “年齡種類” from student
運行結(jié)果:
4.注意點
avg(),min(),max(),sum()函數(shù)都會忽略空值
7.分組檢索數(shù)據(jù)
7.1.簡單分組
關(guān)鍵字group by
我們舉個例子:
統(tǒng)計student表里邊男生和女生的人數(shù)
select ssex,COUNT(*) from student GROUP BY ssex
運行結(jié)果:
注意點:
1.如果分組里邊有null值,那么null做為一個分組返回,如果有多個null值,那么把他們分為一組
2.group by必須用到where子句之后
7.2過濾分組:
就是對簡單分組之后的數(shù)據(jù)再進行過濾
關(guān)鍵字having
舉個例子,我們統(tǒng)計student表中數(shù)學成績80分以上的男生人數(shù)
select ssex,COUNT(*) from student where smath>80 GROUP BY ssex HAVING ssex=“男”
運行結(jié)果:
where和having的區(qū)別:
where在分組前過濾,having在分組后過濾
8.使用子查詢檢索數(shù)據(jù)
8.1子查詢簡介
1.子查詢:出現(xiàn)在其他語句中的語句稱為子查詢或者內(nèi)查詢
內(nèi)部鑲嵌其他select語句的查詢稱為外查詢或主查詢
2.(1)子查詢分類:
按子查詢出現(xiàn)的位置
select后邊+(僅支持標量子查詢)
from后面+(支持表子查詢)
where或者having后邊+(支持標量子查詢列子查詢行子查詢)
exists后邊+(表子查詢)
2.(2)按結(jié)果集的行列數(shù)不同:
標量子查詢:(結(jié)果集只有一行一列)
列子查詢:(結(jié)果集一列多行)
行子查詢:(結(jié)果集一般一行多列)
表子查詢:(結(jié)果集一般為多行多列)
8.2各種子查詢舉例:
1.where和having后邊的子查詢:
例子1:我們查詢student表中數(shù)學分比翠花高的學生的所有信息(標量子查詢):
select * from student where smath>(select smath from student where sname=“翠花”)
運行結(jié)果:
例子2:如果如花似玉這名男生的語數(shù)外三科成績都大于80那么顯示所有同學的信息(行子查詢):
select * from student where (80,80,80)<(select schinese,smath,senglish from student where sname=“如花似玉”)
運行結(jié)果:
例子3:用where查詢女同學的名字(列子查詢)(例子比較菜)
SELECT a.sname FROM student a where a.smath in (select smath from student where ssex=“女”)
運行結(jié)果:
2.select后邊的子查詢(標量子查詢)
我們分別查找同學們的獲獎次數(shù):
這里引進一個prize表:
select sname,(select count(*) from prize where student.sname=prize.sname ) as “獲獎次數(shù)” from student
運行結(jié)果:
3.from后邊的表子查詢:
例子:我們查找女生里邊數(shù)學高于八十分的同學的姓名:
select s.sname from (select * from student where ssex=“女”) as s
運行結(jié)果:
4.exists后邊的表子查詢
exists的作用是判空
例子:我們查詢數(shù)學成績?yōu)?00的學生的姓名
SELECT a.sname FROM student a where EXISTS(select a.smath from student where a.smath=100 )
運行結(jié)果:
這里注意不能這么寫:
SELECT a.sname FROM student a where EXISTS(select smath from student where smath=100 )
就是沒有取別名,這么寫是先運行exists里邊的select,只要exists里邊有一個為真,那么就會查詢所有的同學的名字,否則所有的同學的名字都不會查出來,所以如果向上邊那么寫的話由于數(shù)學等于100的有一個同學,其他的都不是100,那么有一個為真就會把同學姓名都查出來,但是用了別名之后就是每一個同學判斷一次,判斷成功一個輸出一個名字
8.3相關(guān)子查詢
相關(guān)子查詢:涉及外部查詢的子查詢
我們查詢student表中男生和女生的數(shù)學平均分:
select ssex as sssex ,(select avg(smath) FROM student where sssex=student.ssex) as “平均分” from student GROUP BY ssex
運行結(jié)果:
我們可以看到我把第一個ssex起一個別名,第二個用了引用,那么如果我們直接使用ssex=ssex,那么就會出錯,相關(guān)子查詢避免了歧義性
9.連接查詢
我們在student表基礎(chǔ)上添加一個information表代表學生信息(里邊有身高體重學號)
9.1連接查詢
分類;
連接查詢分為內(nèi)連接和外連接交叉連接
1.內(nèi)連接:等值連接,非等值連接,自連接
2.外連接:左外連接,右外連接,全外連接
3.交叉連接
1.內(nèi)連接之等值,非等值連接(sql92版本)
舉一個等值連接的例子:結(jié)合student表和information表來查詢學生的姓名,性別,年齡,身高,體重
select student.sname,ssex,sage,slength,sweigth from student,information where student.sname=information.sname
運行結(jié)果:
內(nèi)連接之等值,非等值連接(sql99版本)
語法:
select + 查詢列表 + from 表1 (別名) + (inner)join 表2 (別名) + on 連接條件 + (where)+ (group by) + (having) + (order by)
用sql99語句寫出上述sql92版本的例子
select student.sname,ssex,sage,slength,sweigth from student join information on student.sname=information.sname
與sql2語法不同的是兩個表之間用join隔開,而且和sql92不同的還有sql92語法是把連接條件和其他篩選條件都放在where中,而sql99這是把連接條件放在on后,其他篩選條件放在where后
2.內(nèi)連接之自連接(sql92版本):
舉一個口頭例子:
例子:一張員工表里邊有員工編號和領(lǐng)導所對應編號,那么如果要查找員工的名字和它領(lǐng)導的名字就會有
select a.name,b.name from 員工表 a,員工表 b where a.編號=b.領(lǐng)導編號
這里一張表看成了兩張表,但是必須給這兩張表起別名,不然就會產(chǎn)生歧義必須以這種格式來寫
3.內(nèi)連接之多表等值連接:
select + 查詢列表 + from 表1 (別名) + (inner) join 表2 (別名) + on 連接條件 + (inner) join 表3 (別名) + on+連接條件 + (inner) join 表4 (別名) + on 連接條件 + ..... + (where) +(group by) + (having) + (order by)
4.外連接之左外連接:
外連接適用于一個表有另一個表沒有的記錄
左外連接基本語法:
SELECT + 查詢鏈表 + FROM + 主表 (別名) + LEFT (OUTER) JOIN +從表 (別名) +ON 連接條件右外連接基本語法:
SELECT + 查詢鏈表 + FROM + 從表 (別名) + right (OUTER) JOIN +主表 (別名) +ON 連接條件
外連接特點(左外右外):
1.外連接會查詢主表里邊的所有記錄
2.如果主表有但從表里沒有那么就會顯示nuil
總的來說外連接=內(nèi)連接+主表中有從表中沒有的數(shù)據(jù)
我們引進一個新的表abord(student表中學生出國留學次數(shù))
例子:
我們把每一個同學出國留學次數(shù)查詢出來(我們使用左外連接):
select a.sname,b.scount from student a left JOIN abord b on a.sname=b.sname
運行結(jié)果:
5.全外連接特點
外連接會查詢主表與從表里邊的所有記錄
10.聯(lián)合查詢查詢
關(guān)鍵字union
應用場景:當我們查詢的信息來自多個表而且多個表之間沒有直接連接關(guān)系,但查詢的字段信息一致(比如兩個表都查姓名性別,這樣才能合成一張表,而且查詢字段要對齊比如兩表都查姓名性別,那么第一個select字段的順序要和第二個select一致都是先姓名后性別或者先性別后姓名)
舉個例子:
查找student表中年齡為18和19歲的學生的姓名和性別:
SELECT sname,ssex from student where sage=18 UNION SELECT sname,ssex from student where sage=19
運行結(jié)果:
看看去重的效果:我們查詢兩次年齡為18歲的同學的姓名和性別
SELECT sname,ssex from student where sage=18 UNION SELECT sname,ssex from student where sage=18
運行結(jié)果:
但是如果我們用union all的話
SELECT sname,ssex from student where sage=18 UNION all SELECT sname,ssex from student where sage=18
運行結(jié)果:
11.子查詢
11.1單行子查詢
單行子查詢,查詢結(jié)果只能是一行數(shù)據(jù),子查詢里不能包含order by
子句
例子(在emp中查詢既不是最高工資也不是最低工資的員工信息):
select empno,ename,sal,from emp where sal>(select min(sal) from emp) and sal<(select max(sal) from emp);
11.2多行子查詢
子查詢返回多行數(shù)據(jù)的子查詢語句,使用IN
或者ANY
或者ALL
例子:在emp表中查詢工資大于部門編號為10的任意一個員工工資即可的其他部門的員工工資即可的其他部門的員工信息
select * from emp where sal > any(select sal from emp where deptno=10 ) and deptno<>10
11.3關(guān)聯(lián)子查詢
在單行子查詢和多行子查詢里,內(nèi)外查詢是分開執(zhí)行的,有些內(nèi)查詢的執(zhí)行是要借助于外查詢,而外查詢的執(zhí)行又離不開內(nèi)查詢,也就是說內(nèi)外查詢是相關(guān)聯(lián)的,這樣的子查詢稱為關(guān)聯(lián)子查詢
例子:
使用關(guān)聯(lián)子查詢檢索工資大于同職位的平均工資員信息
select empno,ename,sal from emp f where sal>(select avg(sal) from emp where job=f.job) order by job
上述例子子查詢里需要用到外查詢表中的職位名稱,外查詢又要用到子查詢出來的職位信息
12.補充
12.1自然查詢
自然查詢是檢索多個表的時候,會把兩個表中具有相同的列的表進行自動連接(自然連接強制要求有相同的列名稱)
關(guān)鍵字:natural join
比如:
select empno,ename,job,dname from emp natural join dept where sal>2000
我們的employee表里和dept都有列empno,那么這個時候,自然查詢的時候系統(tǒng)就會自動連接
12.2交叉連接
交叉連接是不需要任何連接條件的連接(兩個表不需要有任何的關(guān)系),執(zhí)行結(jié)果是笛卡爾乘積
關(guān)鍵字:cross join
select 列1,列2 from 表1 cross join 表2
以上就是Mysql數(shù)據(jù)庫檢索語句DQL大全小白篇的詳細內(nèi)容,更多關(guān)于Mysql檢索語句DQL的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
MySQL高級特性——數(shù)據(jù)表分區(qū)的概念及機制詳解
當數(shù)據(jù)表過大時,通過普通的查詢優(yōu)化技巧已經(jīng)無法大幅度提升性能,此時往往需要進行分區(qū)分表優(yōu)化。分區(qū)其實是將一張邏輯上統(tǒng)一的表在物理上劃分成了多張表。分區(qū)操作對使用者而言是一個黑盒操作,但是如果你從文件系統(tǒng)上看,就會看到分區(qū)數(shù)據(jù)表的實際存儲方式是分開的。2021-05-05mysql中使用shell語句實現(xiàn)xtrabackup自動物理備份增量備份
這篇文章主要為大家介紹了mysql數(shù)據(jù)庫使用shell實現(xiàn)xtrabackup自動物理備份增量備份腳本,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-07-07MySQL如何利用存儲過程快速生成100萬條數(shù)據(jù)詳解
在MySQL數(shù)據(jù)庫中,如果要插入上百萬級的記錄,用普通的insertinto來操作非常不現(xiàn)實,速度慢人力成本高,這篇文章主要給大家介紹了關(guān)于MySQL如何利用存儲過程快速生成100萬條數(shù)據(jù)的相關(guān)資料,需要的朋友可以參考下2021-08-08