1 - 簡(jiǎn)單查詢
select 字段1(列名)矩乐,字段2狸驳,字段3宋下,...from表名
mysql> select job,SAL from emp;
//字段可以直接進(jìn)行數(shù)學(xué)運(yùn)算
select sal*12 from emp;
//使用as可以給字段重命名
//注意,新的字段名如果是中文最好用單引號(hào),雙引號(hào)不通用
select ename,sal*12 as ‘年薪’ from emp;
//查詢所有字段
//實(shí)際開發(fā)中不建議使用* 效率較低 不能寫在java程序中
select * from 表名
2 - where條件查詢
執(zhí)行順序:先f(wàn)rom 再where 再select
select sal from emp where ename ='SMITH';
判斷是否在某一區(qū)間
- <> != 表示不等于
- between and
-- 找出工資不等于3000的
select ename,sal from emp where sal <> 3000/ sal != 3000
-- 找出工資在1100 和 3000 之間的
select ename,sal from emp where sal between 1100 and 3000//閉區(qū)間【1100-3000】
-- between and除了可以使用在數(shù)字方面之外,還可以使用在字符串方面。
select ename from emp where ename between 'A' and 'C';
is null 和 is not null
在數(shù)據(jù)庫(kù)當(dāng)中NULL不是一個(gè)值,代表什么也沒有祟昭,為空〔勒欤空不是一個(gè)值篡悟,不能用等號(hào)衡量。必須使用 is null或者is not null
//找出津貼不為null的人
select ename,sal,comm from emp where comm is not null;
//找出沒有津貼的人
select ename,sal,comm from emp where comm is null or comm = 0;
or 和 and的使用
and 的優(yōu)先級(jí)大于or
select ename,sal,deptno from emp where sal > 1000 and (deptno = 20 or deptno = 30);
in 和 not in 的使用
注意這是兩個(gè)數(shù)選一個(gè) 而不是一個(gè)區(qū)間范圍匾寝!
select ename,job from emp where sal not in(800, 5000);
3 - 模糊查詢
%:多個(gè)字符 _:一個(gè)字符
//找出名字中第二個(gè)字母是A的搬葬?
select ename from emp where ename like '_A%';
//找出名字有下劃線的
//此處下劃線代表任意一個(gè)字符,所以需要轉(zhuǎn)義
select name from t_user where name like '%\_%';
4 - 排序
order by asc表示升序,desc表示降序
默認(rèn)升序
select ename , sal from emp order by sal; // 升序
select ename , sal from emp order by sal asc; // 升序
select ename , sal from emp order by sal desc; // 降序艳悔。
越靠前的字段越能起到主導(dǎo)作用急凰。只有當(dāng)前面的字段無(wú)法完成排序的時(shí)候,才會(huì)啟用后面的字段猜年。
select ename,sal from emp order by sal desc , ename asc;
5 - 分組函數(shù)
又叫多行處理函數(shù):輸入多行抡锈,最終輸出的結(jié)果是1行。
count 計(jì)數(shù)
sum 求和
avg 平均值
max 最大值
min 最小值
找出工資總和乔外?
select sum(sal) from emp;
找出最高工資床三?
select max(sal) from emp;
找出平均工資?
select avg(sal) from emp;
找出總?cè)藬?shù)袁稽?
select count(*) from emp;
select count(ename) from emp;
count()和count(具體的某個(gè)字段)勿璃,他們有什么區(qū)別擒抛?
count():不是統(tǒng)計(jì)某個(gè)字段中數(shù)據(jù)的個(gè)數(shù)推汽,而是統(tǒng)計(jì)總記錄條數(shù)。(和某個(gè)字段無(wú)關(guān))
count(comm): 表示統(tǒng)計(jì)comm字段中不為NULL的數(shù)據(jù)總數(shù)量歧沪。
注意:
1.分組函數(shù)自動(dòng)忽略null
select sum(comm) from emp;
select sum(comm) from emp where comm is not null; // 不需要額外添加這個(gè)過(guò)濾條件歹撒。sum函數(shù)自動(dòng)忽略NULL。
2.分組函數(shù)不能直接用在where里
//ERROR 1111 (HY000): Invalid use of group function
select ename,sal from emp where sal > avg(sal);
ifnull 空處理函數(shù)
所有數(shù)據(jù)庫(kù)都是這樣規(guī)定的诊胞,只要有NULL參與的運(yùn)算結(jié)果一定是NULL暖夭。
ifnull(可能為NULL的數(shù)據(jù),被當(dāng)做什么處理) : 把所有是null的數(shù)據(jù)都賦值為0就可以進(jìn)行運(yùn)算了
select ename,ifnull(comm,0) as comm from emp;
group by 和 having
group by : 按照某個(gè)字段或者某些字段進(jìn)行分組锹杈。
having : having是對(duì)分組之后的數(shù)據(jù)進(jìn)行再次過(guò)濾。
記住一個(gè)規(guī)則:當(dāng)一條語(yǔ)句中有g(shù)roup by的話迈着,select后面只能跟分組函數(shù)和參與分組的字段竭望。
//每個(gè)工作崗位的平均薪資?
select job,avg(sal) from emp group by job;
多字段聯(lián)合分組裕菠,相當(dāng)于把兩個(gè)字段拼接成一個(gè)字段
deptno+job
10 | CLERK == 10CLERK
//找出每個(gè)部門不同工作崗位的最高薪資咬清。
select
deptno,job,max(sal)
from
emp
group by
deptno,job;
having的使用
必須先分組再過(guò)濾的用having 不用where,因?yàn)閣here后面不能寫分組函數(shù)
找出每個(gè)部門的平均薪資,要求顯示薪資大于2000的數(shù)據(jù)奴潘。
第一步:找出每個(gè)部門的平均薪資
select deptno,avg(sal) from emp group by deptno;
第二步:要求顯示薪資大于2000的數(shù)據(jù)
select deptno,avg(sal) from emp group by deptno having avg(sal) > 2000;
6 - DQL執(zhí)行順序
select 5
..
from 1
..
where 2
..
group by 3
..
having 4
..
order by 6
..
可以缺省旧烧,但是順序不能換!;琛>蚣簟!D蜗骸6崴!S弈埂S枞ā!@瞬帷Iㄏ佟!
7 - 查詢結(jié)果去重
-- distinct關(guān)鍵字去除重復(fù)記錄村象。
select distinct job from emp;
select distinct deptno,job from emp;
-- 統(tǒng)計(jì)崗位的數(shù)量笆环?
select count(distinct job) from emp;