你所需要的MySQL检索语句(DQL)都在这儿(小白都能懂的哦)
1.簡單檢索數據
2.檢索排序數據
3.檢索過濾數據
4.使用正則表達式檢索數據
5.檢索計算的字段
6.使用函數檢索數據
7.分組檢索數據
8.使用子查詢檢索數據
9.聯結表查詢
10.聯合查詢
11.子查詢
12.補充
1.簡單檢索數據
博客內容中student表為:
1.1.檢索單個列
select + 列名 + from + 表名
1.2.檢索多個列
select + 列名1,列名2,列名3......列n + from + 表名
1.3.檢索所有列
select + *(表示通配符) +from + 表名
1.4.檢索不同的行
使用distinct關鍵字
select + distinct + 列名 + from + 表名
舉個例子:我們想要查詢一個班級學生的性別有多少種,那么就不需要把每一個同學的性別都顯示出來,只需要把不同性別顯示出來就行即distinct返回唯一值
這里有一個注意點,distinct關鍵字應用于所有列前,不僅僅是前置它的列,如果給出兩個列,那么除非指定的兩個列都不同,否則所有的行都會被檢測出來
1.5.限制檢索結果
使用limit關鍵字
selet + 列名 + from + 表名 + limit + 數字
我們平時select語句返回匹配的行數,我們可以使用limit來限定返回的行數,比如select結果可以返回10行,我們只要前5行,那么就可以使用limit后邊參數為5,如果select返回4行,而limit限制的是5行,那么會返回4行。當然limit后邊的參數可以有兩個,有兩種寫法
即:
1.selet + 列名 + from + 表名 + limit + 數字1,數字2
2.selet + 列名 + from + 表名 + limit + 數字2 + offset + 數字1
意思是從數字1所代表的行數開始,檢索數字2行,第二種寫法是在MySQL5之后才支持的
注意檢索的第一行為行0,而不是1
1.6.使用完全限制的表名檢索
select + 表名.列名 + from + 數據庫名.表名
2.排序檢索數據
2.1.基本語法
使用order by關鍵字
select + 列名(可以多個列) + from + 表名 + order by + 列名
兩個列名可以不一樣
我們日常都可以對員工的工資進行排序,但是有的員工工資一樣,這樣我們可以在員工工資一樣的基礎上對年齡等進行排序,這就是按照多個列進行排序
即:
select + 列名(可以多個列) + from + 表名 + order by + 列1,列2
意思是在列1一致的情況下按照列2進行排序,如果列1不一致那么就不會按照列2排序
2.2.指定排序方向
上面我們講到的排序其實都是默認排序,默認是按照升序(字母按’A’到‘Z‘,數字從小到大)
我們一樣可以降序排列
使用desc關鍵字
select + 列名(可以多個列) + from + 表名 + order by + 列名 desc
那么多個排序規則咋辦呢,即我們把一個班的同學按照總分進行降序排序,那么總分一樣的按照語文成績也降序排列,這里我們注意
desc關鍵字只應用到直接位于其前面的列
所有當我們需要按照多個字段排序只需要在對應字段后邊寫上對應的排序規則,那么比如我們需要兩個字段都降序:
select + 列名(可以多個列) + from + 表名 + order by + 列名1 desc,列名2 desc
其實升序的話我們不用寫,因為默認是升序,關鍵字是asc
按照上邊學的,我們做一個例子:
列出年齡最大的學生的姓名性別和數學成績:
select sname,ssex,smath from student ORDER BY sage desc LIMIT 1
注意order by和limit的位置順序
3.檢索過濾數據
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 | 用來否定條件里邊的內容 |
拿student表來舉例子:
1.and:我們查找女生中數學超過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歲的學生的所有信息并且把他們按照數學成績降序排列,只要第二行的內容:
select * from student where sage not in(20) GROUP BY smath desc LIMIT 1,1
我們注意他們各個關鍵字的順序和limit后邊參數代表的含義
3.3使用通配符
通配符:用來匹配值的一部分的特殊符號
like: 根據通配符匹配而不是直接相等匹配進行比較
| % | 表示任何字符出現的任意的次數 |
| _ | 匹配單個字符串長度 |
拿student表來舉例子:
1.%:我們查找姓名里邊帶花的同學的所有信息
select * from student where sname like “%花%”
會有兩條結果翠花和如花似玉,%只會匹配一側(不限字符串長度),如果只是“%花”,那么如花似玉就不會被查找出來。當然,我們想要查找如花似玉也可以這么來查:
select * from student where sname like “%花%玉”
2._:我們查找如花似玉這名優秀的同學:
select * from student where sname like “_花_玉”
%能匹配0個字符和不限長度的字符串,而_只能而且必須匹配1個字符
4.使用正則表達式檢索數據
正則表達式是用來匹配文本的特殊串,將一個模式(正則表達式)與一個文本串進行比較
正則表達式常用符號:
| . | 匹配單個字符 |
| | | 相當于或的意思 |
| […] | 或的另一種表現形式 |
| - | 表示匹配范圍 |
| \\ | 匹配特殊字符 |
| * | 0個或者多個匹配 |
| + | 1個或多個匹配等于{1,} |
| ? | 0個或者一個匹配等于{0,1} |
| {n} | 指定數目的匹配 |
| {n,} | 不少于指定數目的匹配 |
| {n,m} | 匹配數目的范圍m不超過255 |
| ^ | 文本的開始 |
| $ | 文本的結尾 |
| [[ :<:]] | 詞的開始 |
| [[:>:]] | 詞的結尾 |
關鍵字:regexp
select + 列名(可以多個列) + from + 表名 + where + 列名 + regexp + 正則表達式
拿student表來說:
1 . 先說日regexp和like的區別
like匹配整個串然而regexp則是匹配子串
舉個例子:
我們用like匹配別為1的學生的姓名
select sname from student where othername like “1”
結果:
風姐
我們把like換成regexp:
select sname from student where othername regexp “1”
結果:
翠花
鳳姐
秋香
現在是不是對區別有了很明顯的認識
2 ..就是匹配任意一個字符
舉個例子,我們查找語文成績個位數為8的同學的名字:
select sname from student where schinese regexp “.8”
結果:
鳳姐
秋香
3.|
舉個例子我們查找別名中含1 ton或2的同學的姓名
select sname from student where othername regexp “1 ton|2”
查找結果:
翠花
旺財
如花似玉
4.[....]
舉個例子,我們查找別名為1 ton或者2 ton的學生的姓名
select sname from student where othername regexp “[1|2] ton”
運行結果:
翠花
旺財
其實上邊就等同于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]”
運行結果:
翠花
旺財
秋香
如花似玉
6.\\
舉個例子我們查找別名中含有.這個字符的同學的姓名
select sname from student where othername regexp “\\.”
查找結果;
無
我們所接觸的特殊符號\,[,],等等都可以用\\來轉義
7.?我們不拿student表舉例子,把書上的例子拿過來:
注意這一句話:?匹配它前面的任何字符的0次和1次
8 .{n}再拿書上的一個例子(其他的幾個大括號同理):
這里有一個匹配字符類:
9.^還是書上的例子:
當然^不止可以指串的開始,還可以在集合中(就是[]中)表示否定含義
為表示否定含義舉個例子:
[^a-z]:意思是匹配不是a-z的字符
我們拿student表舉例子:查找別名不是以a和1開頭的同學的名字
select sname from student where othername regexp “^[^a1]”
第一個^限制開頭,第二個^表示否定
10.補充一點,不大小寫查詢
關鍵字:binary
我們平時查詢的字符串都會忽略大小寫,所以,可以使用binary不忽略大小寫
select + 列名(可以多個列) + from + 表名 + where + 列名 + regexp + binary + 正則表達式
其余的重要程度沒那么高,自己試吧
5.檢索計算字段
5.1使用拼接字段
使用concat(str1,str2,....)函數
舉個例子如果數學老師有這種請求,就是把所有學生的數學成績打印出來并且打印格式為數學成(姓名) 這種格式那么可以
select concat(smath,"(",sname,")") from student
運行結果:
5.2使用別名
關鍵字:AS
用5.1的例子
SELECT CONCAT(LTRIM(smath),"(",sname,")") AS “數學成績” from student
結果:
AS可以不加,以上例子也可以寫成SELECT CONCAT(LTRIM(smath),"(",sname,")") “數學成績” from student。group by,having,order by后都支持別名
5.3執行算數計算
比如我們可以查找每一個同學的總分和該同學的名字:
SELECT sname as “姓名”,smath+schinese+senglish as “總成績” from student
運行結果:
6.使用函數檢索數據
6.1常用文本處理函數:
拿upper來舉例子,我們把同學的別名使用upper函數查詢出來:
SELECT UPPER(othername) as “別名” from student
運行結果:
6.2日期和時間處理函數:
日期的格式:
我們拿幾個重要的函數舉例子:
1.now():返回當前系統日期,時間
select now()
運行結果:
2.curdate():返回當前系統日期,不包含時間
select curdate()
運行結果:
3.curtime():返回當前時間,不包含日期
select curtime()
運行結果:
4.YEAR(),Hour()等:獲取指定的部分
select year(now())
運行結果:
5.對于date_format()函數
把當前時間轉換成字符串:
select DATE_FORMAT(now(),"%Y-%c-%d")
運行結果:
對應的有一個字符串轉日期的函數:
例子:
select STR_TO_DATE(“2001-09-10”,"%Y-%c-%d")
運行結果:
6.3數值處理函數:
6.4聚集函數:
1.AVG()函數
例子:我們拿student表來說,我們查找學生的數學平均分
select avg(smath) as “數學平均分” from student
運行結果:
2.COUNT函數
一般的COUNT()函數有兩種用法
1使用count(*)進行計數,不管列是不是null值
2.使用count(column)對特定列中具有的值進行計數,忽略null值
用法的例子:
select count(*) from student
運行結果:
3.指定不同值
關鍵字distinct
如果我們查找student表中不同的年齡有多少種;
select DISTINCT sage as “年齡種類” from student
運行結果:
4.注意點
avg(),min(),max(),sum()函數都會忽略空值
7.分組檢索數據
7.1.簡單分組
關鍵字group by
我們舉個例子:
統計student表里邊男生和女生的人數
select ssex,COUNT(*) from student GROUP BY ssex
運行結果:
注意點:
1.如果分組里邊有null值,那么null做為一個分組返回,如果有多個null值,那么把他們分為一組
2.group by必須用到where子句之后
7.2過濾分組:
就是對簡單分組之后的數據再進行過濾
關鍵字having
舉個例子,我們統計student表中數學成績80分以上的男生人數
select ssex,COUNT(*) from student where smath>80 GROUP BY ssex HAVING ssex=“男”
運行結果:
where和having的區別:
where在分組前過濾,having在分組后過濾
8.使用子查詢檢索數據
8.1子查詢簡介
1.子查詢:出現在其他語句中的語句稱為子查詢或者內查詢
內部鑲嵌其他select語句的查詢稱為外查詢或主查詢
2.(1)子查詢分類:
按子查詢出現的位置
select后邊+(僅支持標量子查詢)
from后面+(支持表子查詢)
where或者having后邊+(支持標量子查詢列子查詢行子查詢)
exists后邊+(表子查詢)
(2)按結果集的行列數不同:
標量子查詢:(結果集只有一行一列)
列子查詢:(結果集一列多行)
行子查詢:(結果集一般一行多列)
表子查詢:(結果集一般為多行多列)
8.2各種子查詢舉例:
1.where和having后邊的子查詢:
例子1:我們查詢student表中數學分比翠花高的學生的所有信息(標量子查詢):
select * from student where smath>(select smath from student where sname=“翠花”)
運行結果:
例子2:如果如花似玉這名男生的語數外三科成績都大于80那么顯示所有同學的信息(行子查詢):
select * from student where (80,80,80)<(select schinese,smath,senglish from student where sname=“如花似玉”)
運行結果:
例子3:用where查詢女同學的名字(列子查詢)(例子比較菜)
SELECT a.sname FROM student a where a.smath in (select smath from student where ssex=“女”)
運行結果:
2.select后邊的子查詢(標量子查詢)
我們分別查找同學們的獲獎次數:
這里引進一個prize表:
select sname,(select count(*) from prize where student.sname=prize.sname ) as “獲獎次數” from student
運行結果:
3.from后邊的表子查詢:
例子:我們查找女生里邊數學高于八十分的同學的姓名:
select s.sname from (select * from student where ssex=“女”) as s
運行結果:
4.exists后邊的表子查詢
exists的作用是判空
例子:我們查詢數學成績為100的學生的姓名
SELECT a.sname FROM student a where EXISTS(select a.smath from student where a.smath=100 )
運行結果:
這里注意不能這么寫:SELECT a.sname FROM student a where EXISTS(select smath from student where smath=100 ),就是沒有取別名,這么寫是先運行exists里邊的select,只要exists里邊有一個為真,那么就會查詢所有的同學的名字,否則所有的同學的名字都不會查出來,所以如果向上邊那么寫的話由于數學等于100的有一個同學,其他的都不是100,那么有一個為真就會把同學姓名都查出來,但是用了別名之后就是每一個同學判斷一次,判斷成功一個輸出一個名字
8.3相關子查詢
相關子查詢:涉及外部查詢的子查詢
我們查詢student表中男生和女生的數學平均分:
select ssex as sssex ,(select avg(smath) FROM student where sssex=student.ssex) as “平均分” from student GROUP BY ssex
運行結果:
我們可以看到我把第一個ssex起一個別名,第二個用了引用,那么如果我們直接使用ssex=ssex,那么就會出錯,相關子查詢避免了歧義性
9.連接查詢
我們在student表基礎上添加一個information表代表學生信息(里邊有身高體重學號)
9.1連接查詢
分類;
連接查詢分為內連接和外連接交叉連接
1.內連接:等值連接,非等值連接,自連接
2.外連接:左外連接,右外連接,全外連接
3.交叉連接
1.內連接之等值,非等值連接(sql92版本)
舉一個等值連接的例子:結合student表和information表來查詢學生的姓名,性別,年齡,身高,體重
select student.sname,ssex,sage,slength,sweigth from student,information where student.sname=information.sname
運行結果:
內連接之等值,非等值連接(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.內連接之自連接(sql92版本):
舉一個口頭例子:
例子:一張員工表里邊有員工編號和領導所對應編號,那么如果要查找員工的名字和它領導的名字就會有
select a.name,b.name from 員工表 a,員工表 b where a.編號=b.領導編號
這里一張表看成了兩張表,但是必須給這兩張表起別名,不然就會產生歧義必須以這種格式來寫`
3.內連接之多表等值連接:
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
總的來說外連接=內連接+主表中有從表中沒有的數據
我們引進一個新的表abord(student表中學生出國留學次數)
例子:
我們把每一個同學出國留學次數查詢出來(我們使用左外連接):
select a.sname,b.scount from student a left JOIN abord b on a.sname=b.sname
運行結果:
5.全外連接特點
外連接會查詢主表與從表里邊的所有記錄
10.聯合查詢查詢
關鍵字union
應用場景:當我們查詢的信息來自多個表而且多個表之間沒有直接連接關系,但查詢的字段信息一致(比如兩個表都查姓名性別,這樣才能合成一張表,而且查詢字段要對齊比如兩表都查姓名性別,那么第一個select字段的順序要和第二個select一致都是先姓名后性別或者先性別后姓名)
舉個例子:
查找student表中年齡為18和19歲的學生的姓名和性別:
SELECT sname,ssex from student where sage=18 UNION SELECT sname,ssex from student where sage=19
運行結果:
查詢的字段的列數要一致,字段要對齊,在聯合查詢時會進行去重不想去重時在union后邊加all關鍵字
看看去重的效果:我們查詢兩次年齡為18歲的同學的姓名和性別
SELECT sname,ssex from student where sage=18 UNION SELECT sname,ssex from student where sage=18
運行結果:
但是如果我們用union all的話
SELECT sname,ssex from student where sage=18 UNION all SELECT sname,ssex from student where sage=18
運行結果:
11.子查詢
11.1單行子查詢
單行子查詢,查詢結果只能是一行數據,子查詢里不能包含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多行子查詢
子查詢返回多行數據的子查詢語句,使用IN或者ANY或者ALL
例子:在emp表中查詢工資大于部門編號為10的任意一個員工工資即可的其他部門的員工工資即可的其他部門的員工信息
select * from emp where sal > any(select sal from emp where deptno=10 ) and deptno<>10
11.3關聯子查詢
在單行子查詢和多行子查詢里,內外查詢是分開執行的,有些內查詢的執行是要借助于外查詢,而外查詢的執行又離不開內查詢,也就是說內外查詢是相關聯的,這樣的子查詢稱為關聯子查詢
例子:
使用關聯子查詢檢索工資大于同職位的平均工資員信息
select empno,ename,sal from emp f where sal>(select avg(sal) from emp where job=f.job) order by job
上述例子子查詢里需要用到外查詢表中的職位名稱,外查詢又要用到子查詢出來的職位信息
12.補充
12.1自然查詢
自然查詢是檢索多個表的時候,會把兩個表中具有相同的列的表進行自動連接(自然連接強制要求有相同的列名稱)
關鍵字:natural join
比如:
select empno,ename,job,dname from emp natural join dept where sal>2000
我們的employee表里和dept都有列empno,那么這個時候,自然查詢的時候系統就會自動連接
12.2交叉連接
交叉連接是不需要任何連接條件的連接(兩個表不需要有任何的關系),執行結果是笛卡爾乘積
關鍵字:cross join
select 列1,列2 from 表1 cross join 表2
總結
以上是生活随笔為你收集整理的你所需要的MySQL检索语句(DQL)都在这儿(小白都能懂的哦)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 34篇Java基础总结博客陪博主入门Ja
- 下一篇: MySQL入门篇(含数据库的备份)