日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

SQL基础查询笔记【动力节点的视频】

發布時間:2023/12/31 数据库 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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

  • %代表任意多個字符,_代表任意一個字符
select ename from emp where ename like '%O%'; select ename from emp where ename like '%\_%';//轉義字符(含_的) select ename from emp where ename like '%T';//名字中最后一個為T

排序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行
//ifnull() 空處理函數ifnull(可能為NULL的數據,被當做什么處理) : 屬于單行處理函數。 select ename ,ifnull(comn,0) as comn from emp; //計算每個員工的年薪 select ename ,(sal+ifnull(comn,0))*12 as yearsal from emp;

找出工資大于平均工資的員工:

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平均值。

    select e.deptno,avg(s.grade) from emp e join salgrade s on e.sal between s.losal and s.hisal group bye.deptno;

    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基础查询笔记【动力节点的视频】的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。