SQL基础查询笔记【动力节点的视频】
查詢
這篇文章是來(lái)自于B站動(dòng)力節(jié)點(diǎn)的MySQL視頻 鏈接動(dòng)力節(jié)點(diǎn)-MySQL_MySQL教程
不過(guò)這個(gè)視頻可能不是很新了(因?yàn)橛玫氖莟xt排版…)
下面是相關(guān)的表數(shù)據(jù)
mysql> desc dept; (部門(mén)表) +--------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +--------+-------------+------+-----+---------+-------+ | DEPTNO | int(2) | NO | PRI | NULL | | 部門(mén)編號(hào) | DNAME | varchar(14) | YES | | NULL | | 部門(mén)名稱 | LOC | varchar(13) | YES | | NULL | | 部門(mén)位置 +--------+-------------+------+-----+---------+-------+mysql> desc emp;(員工表) +----------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +----------+-------------+------+-----+---------+-------+ | EMPNO | int(4) | NO | PRI | NULL | | 員工編號(hào) | ENAME | varchar(10) | YES | | NULL | | 員工姓名 | JOB | varchar(9) | YES | | NULL | | 工作崗位 | MGR | int(4) | YES | | NULL | | 上級(jí)領(lǐng)導(dǎo)編號(hào) | HIREDATE | date | YES | | NULL | | 入職日期 | SAL | double(7,2) | YES | | NULL | | 月薪 | COMM | double(7,2) | YES | | NULL | | 補(bǔ)助/津貼 | DEPTNO | int(2) | YES | | NULL | | 部門(mén)編號(hào) +----------+-------------+------+-----+---------+-------+mysql> desc salgrade; (工資等級(jí)表) +-------+---------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+---------+------+-----+---------+-------+ | GRADE | int(11) | YES | | NULL | | 等級(jí) | LOSAL | int(11) | YES | | NULL | | 最低薪資 | HISAL | int(11) | YES | | NULL | | 最高薪資 +-------+---------+------+-----+---------+-------+條件查詢
找出工資在1100-3000的員工,包括1100,3000
select ename,sal from where sal >= 1100 and sal <= 3000; select ename,sal from emp where sal between 1100 and 300;//閉區(qū)間可以用于字符串:
select ename from emp where ename between 'A' and 'C';//左閉右開(kāi)找出哪些人津貼為NULL或0:
select ename,sal,comn from emp where comn is null or comn = 0;//is not null;注意:運(yùn)算符的優(yōu)先級(jí)不確定的時(shí)候加小括號(hào):
找出薪資大于1000的并且部門(mén)編號(hào)是20或30部門(mén)的員工。
select ename,sal,deptno from emp where sal > 1000 and (deptno = 20 or deptno = 30);in等同于or:表示集合
找出工作崗位是MANAGER和SALESMAN的員工?
select ename,job from emp where job = 'SALEMAM' or job = 'MANAGER'; select ename,job from emp where job in ('SALEMAM','MANAGER');//in后面的值不是區(qū)間,是具體的值not in :不在這幾個(gè)值當(dāng)中。
模糊查詢like
- %代表任意多個(gè)字符,_代表任意一個(gè)字符
排序order by
默認(rèn)是升序asc,desc表示降序
select ename , sal from emp order by sal; select ename , sal from emp order by 2;//按第二列排 select ename , sal from emp order by sal desc;按照工資的降序排列,當(dāng)工資相同的時(shí)候再按照名字的升序排列:
select ename,sal from emp order by sal desc , ename asc;//前面的占主導(dǎo)地位,前面相等再調(diào)用后面的。例如:找出工作崗位是SALESMAN的員工,并要求按照薪資的降序排列。
select ename,job,sal fromemp wherejob = 'SALEMAN' order by sal desc;分組函數(shù)
多行處理函數(shù);都是對(duì)“某一組”數(shù)據(jù)進(jìn)行操作的。
- count 計(jì)數(shù)
- count(distinct job)–distinct(去重)
- sum 求和
- avg 平均
- max
- min
記住:所有的分組函數(shù)都是對(duì)“某一組”數(shù)據(jù)進(jìn)行操作的。
select sum(sal) from emp;==>忽略NULL select count(*) from emp;//總?cè)藬?shù)ename select sum(comm) from emp; select sum(comm) from emp where comm is not null; // 不需要額外添加這個(gè)過(guò)濾條件。sum函數(shù)自動(dòng)忽略NULL。- 分組函數(shù)自動(dòng)忽略NULL
- 數(shù)學(xué)計(jì)算含NULL,則結(jié)果為NULL
- ifnull(可能為NULL 的數(shù)據(jù),被當(dāng)作什么處理) ,單行處理函數(shù)。
- 分組函數(shù)還有另一個(gè)名字:多行處理函數(shù)。
多行處理函數(shù)的特點(diǎn):輸入多行,最終輸出的結(jié)果是1行。
找出工資大于平均工資的員工:
select ename,sal from emp where sal > avg(sal);//ERROR
//1.找出平均工資 2.找出高于平均工資的員工 select ename ,sal from emp where sal > (select avg(sal) from emp);//子查詢注意:SQL語(yǔ)句中的分組函數(shù)不可以直接使用在where子句當(dāng)中
==>因?yàn)間roup by 是在where后面執(zhí)行
//一個(gè)完整的SQL語(yǔ)句: select 5.. from 1.. where 2..//無(wú)法用分組函數(shù) group by 3 之后才能用分組函數(shù).. having 4.. order by 6..count(*)與count(某個(gè)字段)
-
count(*) :不是統(tǒng)計(jì)某個(gè)字段中數(shù)據(jù)的個(gè)數(shù),而是統(tǒng)計(jì)總記錄條數(shù)。(和某個(gè)字段無(wú)關(guān))
-
count(comn):表示統(tǒng)計(jì)comn字段中不為NULL的數(shù)據(jù)總數(shù)量。
group by 和 having
group by :按照某個(gè)字段或者某些字段進(jìn)行分組。
having:對(duì)分組后的數(shù)據(jù)進(jìn)行再次過(guò)濾。
案例: 找出每個(gè)工作崗位的最高薪資 select max(sal),job from emp group by job;注意:
當(dāng)一條語(yǔ)句中有g(shù)roup by 的話,select后面只能跟分組函數(shù)和參與分組的字段
分組函數(shù)一般都會(huì)和group by聯(lián)合使用,這也是為什么它被稱為分組函數(shù)的原因。
并且任何一個(gè)分組函數(shù)(count sum avg max min)都是在group by語(yǔ)句執(zhí)行結(jié)束之后才會(huì)執(zhí)行的。
當(dāng)一條sql語(yǔ)句沒(méi)有g(shù)roup by的話,整張表的數(shù)據(jù)會(huì)自成一組。
select ename ,max(sal),job from group by job;//ERROR
求每個(gè)工作崗位的平均薪資:
select job,avg(sal) from emp group by job;找出每個(gè)部門(mén)不同工作崗位的最高薪資:(聯(lián)合分組)
select deptno,job,max(sal) from emp group by deptno,job;找出每個(gè)部門(mén)的最高的薪資,要求顯示薪資大于2500的數(shù)據(jù):分步寫(xiě)
select max(sal),depton from emp group by deptno having max(sal) > 2900;//效率低 select max(sal),depton from emp where sal > 2900 group by deptno;建議能夠使用where過(guò)濾的盡量用where
找出每個(gè)部門(mén)的平均薪資,要求顯示薪資大于2500的數(shù)據(jù)(having對(duì)分組數(shù)據(jù)過(guò)濾)
select deptno,avg(sal) from emp group by deptno having avg(sal) > 2500;總結(jié)一個(gè)完整的DQL語(yǔ)句怎么寫(xiě)?
select 5.. from 1 .. where 2.. group by 3.. having 4.. order by 6.. // limit 7關(guān)于查詢結(jié)果集的去重?
select distinct job from emp; // distinct關(guān)鍵字去除重復(fù)job記錄。記住:distinct只能出現(xiàn)在所有字段的最前面。
統(tǒng)計(jì)崗位的數(shù)量?
select count(distinct job) from emp;連接查詢
笛卡爾積現(xiàn)象:當(dāng)兩張表進(jìn)行連接查詢的時(shí)候,沒(méi)有任何條件進(jìn)行限制,最終的查詢結(jié)果條數(shù)是兩張表記錄條數(shù)的乘積。
select e.ename,d.dname fromemp e join //inner joindept d one.deptno = d.deptno;內(nèi)連接之非等值連接
INNER JOIN 只會(huì)保留兩個(gè)表都存在的數(shù)據(jù)(還記得之前的交集嗎),這看起來(lái)意味著一些數(shù)據(jù)的丟失,在某些場(chǎng)景下會(huì)有問(wèn)題.
最大的特點(diǎn)是:連接條件中的關(guān)系是非等量關(guān)系。
找出每個(gè)員工的工資等級(jí),要求顯示員工名、工資、工資等級(jí)。
select e.ename,e.sal,s.grade fromemp e join // inner可以省略salgrade s one.sal between s.losal and s.hisal;自連接
最大的特點(diǎn)是:一張表看做兩張表。自己連接自己。
案例:找出每個(gè)員工的上級(jí)領(lǐng)導(dǎo),要求顯示員工名和對(duì)應(yīng)的領(lǐng)導(dǎo)名。
員工的領(lǐng)導(dǎo)編號(hào) = 領(lǐng)導(dǎo)的員工編號(hào)
select a.ename as '員工名',b.ename as '領(lǐng)導(dǎo)名' fromemp a inner joinemp b ona.mgr = b.empno;外連接
內(nèi)連接:
假設(shè)A和B表進(jìn)行連接,使用內(nèi)連接的話,凡是A表和B表能夠匹配上的記錄查詢出來(lái),這就是內(nèi)連接。
AB兩張表沒(méi)有主副之分,兩張表是平等的。
外連接:
假設(shè)A和B表進(jìn)行連接,使用外連接的話,AB兩張表中有一張表是主表,一張表是副表,主要查詢主表中的數(shù)據(jù),捎帶著查詢副表,當(dāng)副表中的數(shù)據(jù)沒(méi)有和主表中的數(shù)據(jù)匹配上,副表自動(dòng)模擬出NULL與之匹配。
外連接的分類?
左外連接(左連接):表示左邊的這張表是主表。
右外連接(右連接):表示右邊的這張表是主表。
外連接最重要的特點(diǎn)是:主表的數(shù)據(jù)無(wú)條件的全部查詢出來(lái)。
找出哪個(gè)部門(mén)沒(méi)有員工?
select d.* fromemp e right joindept d one.deptno = d.deptno wheree.empno is null;三張表的連接查詢
…
A
join
B
join
C
on
…
表示:A表和B表先進(jìn)行表連接,連接之后A表繼續(xù)和C表進(jìn)行連接。
案例:找出每一個(gè)員工的部門(mén)名稱以及工資等級(jí):
select e.ename,d.dname,s.grade fromemp e joindept d one.deptno = d.deptno joinsalgrade s one.sal between s.losal and s.hisal; 查詢結(jié)果: +--------+------------+-------+ | ename | dname | grade | +--------+------------+-------+ | SMITH | RESEARCH | 1 | | ALLEN | SALES | 3 | | WARD | SALES | 2 | | JONES | RESEARCH | 4 | | MARTIN | SALES | 2 | | BLAKE | SALES | 4 | | CLARK | ACCOUNTING | 4 | | SCOTT | RESEARCH | 4 | | KING | ACCOUNTING | 5 | | TURNER | SALES | 3 | | ADAMS | RESEARCH | 1 | | JAMES | SALES | 1 | | FORD | RESEARCH | 4 | | MILLER | ACCOUNTING | 2 | +--------+------------+-------+找出每一個(gè)員工的部門(mén)名稱、工資等級(jí)、以及上級(jí)領(lǐng)導(dǎo)。<把上面的合起來(lái)>
select e.ename '員工',d.dname,s.grade,e1.ename '領(lǐng)導(dǎo)' fromemp e joindept d one.deptno = d.deptno joinsalgrade s one.sal between s.losal and s.hisal left joinemp e1 one.mgr = e1.empno;子查詢
1. where子句中使用子查詢
案例:找出高于平均薪資的員工信息。
select * from emp where sal > (select avg(sal) from emp);2. from后面嵌套子查詢
找出每個(gè)部門(mén)平均薪水的等級(jí)。
第一步:找出每個(gè)部門(mén)平均薪水(按照部門(mén)編號(hào)分組,求sal的平均值)
select deptno,avg(sal) as avgsal from emp group by deptno;
第二步:將以上的查詢結(jié)果當(dāng)做臨時(shí)表t,讓t表和salgrade s表連接,條件是:t.avgsal between s.losal and s.hisal
select t.*,s.grade from(select deptno,avg(sal) as avgsal from emp group by deptno) t joinsalgrade s ont.avgsal between s.losal and s.hisal;找出每個(gè)部門(mén)平均的薪水等級(jí)。
第一步:找出每個(gè)員工的薪水等級(jí)。
select e.ename,e.sal,e.deptno,s.grade from emp e join salgrade s on e.sal between s.losal and s.hisal;
第二步:基于以上結(jié)果,繼續(xù)按照deptno分組,求grade平均值。
3. 在select后面嵌套子查詢
案例:找出每個(gè)員工所在的部門(mén)名稱,要求顯示員工名和部門(mén)名。
select e.ename,d.dname fromemp e joindept d one.deptno = d.deptno; //總和 select e.ename,(select d.dname from dept d where e.deptno = d.deptno) as dname from emp e;union
(可以將查詢結(jié)果集相加)
案例:找出工作崗位是SALESMAN和MANAGER的員工
select ename,job from emp where job = 'MANAGER' union select ename,job from emp where job = 'SALESMAN';limit
limit是mysql特有的,其他數(shù)據(jù)庫(kù)中沒(méi)有,不通用。(Oracle中有一個(gè)相同的機(jī)制,叫做rownum)
limit取結(jié)果集中的部分?jǐn)?shù)據(jù),這時(shí)它的作用。
語(yǔ)法機(jī)制:
limit startIndex, length
startIndex表示起始位置,從0開(kāi)始,0表示第一條數(shù)據(jù)。
length表示取幾個(gè)
通用的標(biāo)準(zhǔn)分頁(yè)sql
每頁(yè)顯示3條記錄:
第1頁(yè):0, 3
第2頁(yè):3, 3
第3頁(yè):6, 3
第4頁(yè):9, 3
第5頁(yè):12, 3
每頁(yè)顯示pageSize條記錄:
第pageNo頁(yè):(pageNo - 1) * pageSize, pageSize
pageSize是:是每頁(yè)顯示多少條記錄
pageNo是:顯示第幾頁(yè)
java代碼{
int pageNo = 2; // 頁(yè)碼是2
int pageSize = 10; // 每頁(yè)顯示10條
limit (pageNo - 1) * pageSize, pageSize
}
總結(jié)
以上是生活随笔為你收集整理的SQL基础查询笔记【动力节点的视频】的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 一文了解常用的微波传输线(一)
- 下一篇: 计算机等级考试四级数据库真题,计算机等级