?作者簡介:大家好我是@每天都要敲代碼,希望一起努力,一起進(jìn)步!
??個人主頁:@每天都要敲代碼的個人主頁??系列專欄:MySQL專欄
目錄
一:簡單的查詢
1. 查詢一個字段
2. 查詢多個字段?
3. 查詢?nèi)孔侄?/p>
4. 計算員工的年薪
5.?將查詢出來的字段顯示為中文
二:條件查詢
1. = 操作符?
2. <> != 操作符
3.?between … and …操作符
4. is null
5. and
6. or
7.?and 和 or 聯(lián)合使用
8. in
9. not
10. like
11.? 算術(shù)運(yùn)算符
12. 安全等于<=>?
?13. least & greatest
14. 邏輯運(yùn)算符
15. 位運(yùn)算符(了解)
三:排序查詢
1. 單一字段排序
2.?手動指定排序順序
3.?多個字段排序
4.??使用字段的位置(下標(biāo))來排序
5. 使用別名進(jìn)行排序?
一:簡單的查詢
語法格式:??
select 字段名1,字段名2,字段名3,.... from 表名;
注意:
(1)任何一條sql語句以 “;” 結(jié)尾
(2)sql語句不區(qū)分大小寫
1. 查詢一個字段
例如:查詢員工的姓名
select ename from emp;
Select語句后面跟的是字段名稱,select是關(guān)鍵字,select和字段名稱之間采用空格隔開,from表示將要查詢的表,它和字段之間采用空格隔開。
2. 查詢多個字段?
例如:查詢員工的編號和姓名
select empno, ename from emp;
查詢多個字段,select中的字段采用逗號間隔即可,最后一個字段,也就是在from前面的字段不能使用逗號了。
3. 查詢?nèi)孔侄?/h4>
例如:查詢當(dāng)前數(shù)據(jù)庫中,emp表中的所有字段
select * from emp;
例如:查詢當(dāng)前數(shù)據(jù)庫中,emp表中的所有字段
select * from emp;
采用select * from emp,雖然簡單,但是*號不是很明確,建議查詢?nèi)孔侄螌⑾嚓P(guān)字段寫到select語句的后面;在以后java連接數(shù)據(jù)庫的時候,是需要在java程序中編寫SQL語句的,這個時候編寫的SQL語句不建議使用select *? 這種形式,建議寫明字段,增強(qiáng)可讀性!
4. 計算員工的年薪
例如:列出員工的編號,姓名和年薪
在select語句中可以使用運(yùn)算符!但不會更改數(shù)據(jù)庫中原始的數(shù)據(jù)!
select empno,ename,sal*12 from emp;
sal*12看著很不舒服,我們可以用as給查詢結(jié)果的列重命名,as可省略
5.?將查詢出來的字段顯示為中文
采用as關(guān)鍵字重命名表字段,并且這里的as 是可以省略的!
注意:字符串必須添加單引號?或者?雙引號;標(biāo)準(zhǔn)sql語句中要求字符串使用單引號括起來;雖然mysql支持雙引號,盡量別用!
select empno as '員工編號',ename as '員工姓名',sal*12 as '年薪'from emp;
# 寫成雙引號的方式,只能在MySQL中運(yùn)行,不通用;建議寫成單引號的方式
select empno "員工編號", ename "員工姓名", sal*12 "年薪" from emp;
二:條件查詢
條件查詢需要用到where語句,where必須放到from語句表的后面!
語法格式:? ? ?
? ? select?
?? ??? ??? ?字段,字段...
?? ??? ?from
?? ??? ??? ?表名
?? ??? ?where
?? ??? ??? ?條件;
執(zhí)行順序:先from,然后where,最后select
支持如下運(yùn)算符:
1. = 操作符?
(1)查詢薪水為5000的員工
select empno, ename, sal from emp where sal=5000;
?(2)查詢job為MANAGER的員工
注意:manager字符串,要用單引號或者雙引號括起來!
select empno, ename from emp where job='manager';
(3)“=”只能看作是比較大小,不能字符串拼接!
如果是數(shù)字與字符串進(jìn)行比較,會存在隱式轉(zhuǎn)換(把字符串轉(zhuǎn)換為數(shù)字)。若此字符串是數(shù)字型的字符串,例如:’1‘,那么會把它轉(zhuǎn)換為整數(shù)1;若此字符串不是數(shù)字型的字符串,例如:’a‘,并不會轉(zhuǎn)換成ASCII碼值來進(jìn)行比較,會把它轉(zhuǎn)換為整數(shù)0來看待!
select 1 = '1'; -- 1
select 1 = 'a'; -- 0
select 0 = 'a'; -- 1
?
如果比較的兩側(cè)都不是數(shù)字型的字符串,例如:’a‘,'b'等,此時會轉(zhuǎn)換成ASCII值后在進(jìn)行比較
select 'a' = 'b';
select 'a' < 'b';
只要有NULL參與判斷結(jié)果就為NULL
1 = NULL; -- NULL
NULL = NULL; -- NULL
?
2. <> != 操作符
(1)查詢薪水不等于5000的員工
注意:對于數(shù)值也可以采用單引號或者雙引號引起來的,例如5000寫成'5000'或者“5000”都是可以的,但是不建議這樣寫!
select empno, ename, sal from emp where sal <> 5000;
select empno, ename, sal from emp where sal != 5000;
?(2)查詢工作崗位不等于MANAGER的員工
select empno, ename, sal from emp where job<>'manager';
3.?between … and …操作符
①between and在使用的時候必須左小右大。
②between and除了可以使用在數(shù)字方面(左閉右閉)之外,還可以使用在字符串方面(左閉右開)!
(1)查詢薪水為1600到3000的員工(左閉右閉)
第一種方法:使用between...and...
select empno, ename, sal from emp where sal between 1600 and 3000;
between … and …,它是包含最大值和最小值的;就等價于>= and <=
第二種方式:使用>= and <=
select empno, ename, sal from emp where sal >=1600 and sal<=3000;
(2)查看員工首字母是A到C開頭的名字(左閉右開)
select ename from emp where ename between 'A' and 'C'; --包括A,不包括C
4. is null
①null為空,但不是空串,為null可以設(shè)置這個字段不填值,空不是一個值,不能用等號衡量。
②如果查詢?yōu)閚ull的字段,采用is null;不能采用 =null !
(1)查詢津貼為空null的員工
(1)首先先使用select * from emp; 查詢到所有的comm信息,發(fā)現(xiàn)有很多是NULL?
(2)如果直接只用 =null 是無法查詢出符合條件的數(shù)據(jù)
?(3)應(yīng)該采用 is null 作為查詢條件
select * from emp where comm is null;
select * from emp where comm is not null;
(2)找出那些員工沒有津貼:這就包括為null的和0的
select * from emp where comm is null or comm=0;
5. and
and表示并且的含義,表示所有的條件必須滿足。
例如:查詢工作崗位為MANAGER,薪水大于2500的員工
select * from emp where job='manager' and sal >= 2500;
6. or
or,只要滿足條件即可,相當(dāng)于包含;滿足條件之一即可!
例如:查詢出job為manager或者job為salesman的員工
select * from emp where job='manager' or job = 'salesman';
7.?and 和 or 聯(lián)合使用
找出薪資大于1000的并且部門編號是20或30部門的員工。
select ename,sal,deptno from emp where sal > 1000 and (deptno = 20 or deptno = 30);
-- and優(yōu)先級比or高,要想讓or先執(zhí)行,必須加小括號
8. in
in表示包含的意思,完全可以采用or來表示,采用in會更簡潔一些
(1)查詢出job為manager或者job為salesman的員工
使用or:select * from emp where job='manager' or job = 'salesman';
使用in:select * from emp where job in ('manager','salesman');
(2)查詢出薪水包含1600和薪水包含3000的員工
select * from emp where sal in(1600,3000);
9. not
(1)查詢出薪水不包含1600和薪水不包含3000的員工
第一種寫法:使用不等<>
select * from emp where sal<>1600 and sal <>3000;
第二種寫法: 使用等于= 和 not 聯(lián)合使用
select * from emp where not(sal=1600 or sal=3000);
第三種寫法:使用not in
select * from emp where sal not in(1600,3000);
(2)查詢出津貼不為null的所有員工
select * from emp where comm is not null;
10. like
①Like可以實現(xiàn)模糊查詢,like支持 % 和 下劃線_ 匹配。
②Like中%和下劃線的差別?
%匹配任意字符出現(xiàn)的個數(shù);
_下劃線只匹配一個字符;
③Like 中的表達(dá)式必須放到單引號中或者雙引號中。
?(1)查詢姓名以M開頭所有的員工
select * from emp where ename like 'M%';
?(2)查詢姓名以N結(jié)尾的所有的員工
select * from emp where ename like '%N';
?(3)查詢姓名中包含O的所有的員工
select * from emp where ename like '%O%';
?(4)查詢姓名中第二個字符為A的所有員工
select * from emp where ename like '_A%';
(5) 查詢既含有a的又含有e的last_name
方法一:寫兩個模糊查詢,然后使用and進(jìn)行連接
select last_name from employees where last_name like '%a%' and last_name like'%e%';
方法二:放在一起寫
select last_name from employees where last_name like '%a%e%';
?此時發(fā)現(xiàn)只有16條記錄,與前面的方法相比少了4條,這是因為順序的問題;還有可能是e在前面a在后面:“%e%a%”
最終寫法
select last_name from employees where last_name like '%a%e%' or last_name like '%e%a%';
?
(6)補(bǔ)充:找出名字中有下劃線_的;利用轉(zhuǎn)義字符\ !
select * from emp where ename like '%\_%';
常用函數(shù)補(bǔ)充:
①distinct:去重,去除重復(fù)的字段,只保留一個!
②ifnull(字段,0):如果當(dāng)前字段是null當(dāng)做0處理,因為null與其它數(shù)進(jìn)行運(yùn)算,最終的結(jié)果還是null!
③著重號``:如果當(dāng)前字段或者表名是一個MySQL的關(guān)鍵字,那么就是用``來進(jìn)行區(qū)分!
11.? 算術(shù)運(yùn)算符
算術(shù)運(yùn)算符主要用于數(shù)學(xué)運(yùn)算,其可以連接運(yùn)算符前后的兩個數(shù)值或表達(dá)式,對數(shù)值或表達(dá)式進(jìn)行加 (+)、減(-)、乘(*)、除(/)和取模(%)運(yùn)算。
?加法與減法:
①一個整數(shù)類型的值對整數(shù)進(jìn)行加法和減法操作,結(jié)果還是一個整數(shù);
②一個整數(shù)類型的值對浮點數(shù)進(jìn)行加法和減法操作,結(jié)果是一個浮點數(shù);
③加法和減法的優(yōu)先級相同,進(jìn)行先加后減操作與進(jìn)行先減后加操作的結(jié)果是一樣的;
④在Java中,+的左右兩邊如果有字符串,那么表示字符串的拼接。但是在MySQL中+只表示數(shù) 值相加。如果遇到非數(shù)值類型,先嘗試轉(zhuǎn)成數(shù)值,如果轉(zhuǎn)失敗,就按0計算。
補(bǔ)充:①MySQL中字符串拼接要使用字符串函數(shù)CONCAT()實現(xiàn)?
②字符串存在隱式轉(zhuǎn)換,如果轉(zhuǎn)換不成功,就當(dāng)做0來處理!
select 1+'1'; -- 整數(shù)+整數(shù)型的字符串結(jié)果還是一個整數(shù),會把整數(shù)型的字符串轉(zhuǎn)換成數(shù)字(隱式轉(zhuǎn)型)
select 1+'a'; -- 無法識別,會把字符串當(dāng)成0進(jìn)行處理
select 1+null -- 和null進(jìn)行運(yùn)算,最終結(jié)果也還是null;可以使用ifnull函數(shù)進(jìn)行處理
?
?
乘法與除法:
①一個數(shù)乘以整數(shù)1和除以整數(shù)1后仍得原數(shù);
②一個數(shù)乘以浮點數(shù)1和除以浮點數(shù)1后變成浮點數(shù),數(shù)值與原數(shù)相等;
③一個數(shù)除以整數(shù)后,不管是否能除盡,結(jié)果都為一個浮點數(shù); 一個數(shù)除以另一個數(shù),除不盡時,結(jié)果為一個浮點數(shù),并保留到小數(shù)點后4位;
④乘法和除法的優(yōu)先級相同,進(jìn)行先乘后除操作與先除后乘操作,得出的結(jié)果相同。 在數(shù)學(xué)運(yùn)算中,0不能用作除數(shù),在MySQL中,一個數(shù)除以0為NULL。
select 10 / 2;
select 10 / 3; -- 無論是否除盡,最終都是一個浮點型數(shù)據(jù),保留小數(shù)點后四位
select 10 / 0; -- 除以0不會報錯,最終結(jié)果是一個null
求模(求余)運(yùn)算符:
結(jié)果的符號與被模數(shù)的符號保持一致,與模數(shù)的符號無關(guān)!
select 12 % -5; -- 2
select -12 % 5; -- -2
select -12 % -5; -- -2
12. 安全等于<=>?
安全等于運(yùn)算符(<=>)與等于運(yùn)算符(=)的作用是相似的, 唯一的區(qū)別 是‘’可 以用來對NULL進(jìn)行判斷。在兩個操作數(shù)均為NULL時,其返回值為1,而不為NULL;當(dāng)一個操作數(shù)為NULL時,其返回值為0,而不為NULL。
-- 使用=,只要有NULL參與運(yùn)算,結(jié)果就是NULL
select 1 = NULL; #NULL
select NULL = NULL; #NULL
-- 使用安全等于<=>,專門用來比較有NULL參與的運(yùn)算,結(jié)果是0或者1,而不是NULL
select 1 <=> NULL; #0
select NULL <=> NULL; #1
例:獲取emp表中津貼comm為null的數(shù)據(jù)
首先我們知道不能使用 “等于=” ,只要有NULL參與,使用“等于=”結(jié)果就是NULL,沒有任何數(shù)據(jù)
第一種方式:使用is null 前面已經(jīng)講過
select * from emp where comm is null;
第二種:使用isnull(),連在一起寫,相當(dāng)于一個函數(shù)
select * from emp where isnull(comm);
?
?
第三種:不能使用“等于=”,但可以使用 “安全等于<=>” 參與NULL的運(yùn)算
select * from emp where comm <=> null;
?
?13. least & greatest
①least:最小值運(yùn)算符,在多個值中返回最小值!
②greatest:最大值運(yùn)算符,在多個值中返回最大值!
select lest('e','c','a','f','b');
select greatest('e','c','a','f','b');
?
14. 邏輯運(yùn)算符
邏輯運(yùn)算符主要用來判斷表達(dá)式的真假,在MySQL中,邏輯運(yùn)算符的返回結(jié)果為1、0或者NULL。 MySQL中支持4種邏輯運(yùn)算符如下:
not、and、or前面已經(jīng)講過了,這里重點講解XOR(邏輯異或)---》相同為0相異為1!
邏輯異或(XOR)運(yùn)算符是當(dāng)給定的值中任意一個值為NULL時,則返回NULL;如果兩個非NULL的值都是0或者都不等于0時,則返回0;如果一個值為0,另一個值不為0時,則返回1
-- 相異為1,相同為0
select 1 XOR 0; -- 1
select 1 XOR 1; -- 0
select 0 XOR 0; -- 0
?
15. 位運(yùn)算符(了解)
位運(yùn)算符是在二進(jìn)制數(shù)上進(jìn)行計算的運(yùn)算符。位運(yùn)算符會先將操作數(shù)變成二進(jìn)制數(shù),然后進(jìn)行位運(yùn)算, 最后將計算結(jié)果從二進(jìn)制變回十進(jìn)制數(shù)。 MySQL支持的位運(yùn)算符如下:
?
三:排序查詢
1. 單一字段排序
排序采用order by子句,order by后面跟上排序字段,排序字段可以放多個,多個采用逗號間隔,order by默認(rèn)采用升序,如果存在where子句那么order by必須放到where語句的后面!
(1)按照薪水由小到大排序
select * from emp order by sal;
(2)先取得job為MANAGER的員工,再按照薪水由小到大排序
select * from emp where job='manager' order by sal;
-- 先執(zhí)行from,然后執(zhí)行where,再執(zhí)行selelct,最后才執(zhí)行order by按照sal進(jìn)行排序輸出
(3)按照多個字段排序,如:首先按照job排序,再按照sal排序;多個字段排序只有前面?zhèn)€字段相等時才會按照后面一個字段進(jìn)行排序。
select * from emp order by job,sal;
-- 先按照job字段排序,當(dāng)job相等才會按照sal排序
2.?手動指定排序順序
(1)手動指定按照薪水由小到大排序:asc;默認(rèn)也是asc從小到大排序的!
select * from emp order by sal asc;
?(2)手動指定按照薪水由大到小排序:desc
select * from emp order by sal desc;
3.?多個字段排序
(1)按照job和薪水倒序
select * from emp order by job desc,sal desc;
(2)按照工資的降序排列,當(dāng)工資相同的時候再按照名字的升序排列
注意:越靠前的字段越能起到主導(dǎo)作用,只有當(dāng)前面的字段無法完成排序的時候,才會啟用后面的字段
select ename,sal from emp order by sal desc, ename asc;
4.??使用字段的位置(下標(biāo))來排序
也就是通過下標(biāo)進(jìn)行排序,默認(rèn)是從1開始,例如:sal下標(biāo)是6,那么按照薪水升序;不健壯,不建議使用
select * from emp order by 6; --下標(biāo)從1開始
5. 使用別名進(jìn)行排序?
例:先獲取年薪,然后起別名進(jìn)行排序
select empno,ename,(sal+ifnull(comm,0))*12 as year_sal from emp order by year_sal;
例:獲取年薪大于30000的
select empno,ename,(sal+ifnull(comm,0))*12 as year_sal from emp where year_sal > 30000;
無法查詢?
總結(jié):列的別名只能在order by中使用,不能在where中使用!為什么會這樣?這與執(zhí)行順序有關(guān)!首先先執(zhí)行from根據(jù)表名進(jìn)行查找,然后執(zhí)行where執(zhí)行過濾條件,再執(zhí)行select語句輸出要確定的內(nèi)容,最后才會執(zhí)行order by進(jìn)行排序!而重命名是在select中,select是在where之后,order by之前!所以where中不能使用重命名進(jìn)行操作,order by中可以使用重命名進(jìn)行操作!
總結(jié):一定要注意執(zhí)行的順序文章來源:http://www.zghlxwxcb.cn/news/detail-404275.html
select?
?? ??? ?字段? ? ? ? ? ? ? ? ? ? ?3
from
?? ??? ?表名? ? ? ? ? ? ? ? ? ? ?1
where
?? ??? ?條件? ? ? ? ? ? ? ? ? ? ?2
order by
?? ??? ?....?? ??? ??? ??? ??? ??? ?4
?? ?
order by是最后執(zhí)行的!文章來源地址http://www.zghlxwxcb.cn/news/detail-404275.html
到了這里,關(guān)于MySQL基礎(chǔ)篇 | 簡單的查詢、條件查詢、排序查詢的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!