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