1. 程式人生 > >SQL之高階查詢

SQL之高階查詢

如果遇到沒有建立的表影響執行使用

子查詢

子查詢是一條SELECT語句,但它是巢狀其他SQL語句中的
為的是給該SQL提供資料以支援其執行操作

檢視誰的工資高於CLARK?
SELECT ename,sal
FROM emp_swm
WHERE sal>(
    SELECT sal
    FROM emp_swm
    WHERE ename='CLARK')

檢視與CLARK同職位的員工?
  SELECT ename,job
  FROM emp_swm
  WHERE job=(SELECT job FROM emp_swm
            WHERE
ename='CLARK') 檢視與CLARK同部門的員工? SELECT ename,deptno FROM emp_swm WHERE deptno=(SELECT deptno FROM emp_swm WHERE ename='CLARK')

在DDL中使用子查詢

可以根據子查詢的結果集快速建立一張表
建立表employee,表中欄位為:
empno,ename,job,sal,deptno,dname,loc
資料為現有表中emp與dept對應的資料

CREATE TABLE employee_swm
  AS
SELECT e.empno id,e.ename name,e.job,e.sal salary, e.deptno,d.dname,d.loc FROM emp_swm e,dept_swm d WHERE e.deptno=d.deptno DESC employee_swm SELECT * FROM employee_swm

建立表時若子查詢中的欄位有別名,則該表
對應得欄位就使用該別名作為其欄位名。
當子查詢中一個欄位含有函式或表示式
那麼該欄位必須給別名。

刪除表
DROP TABLE employee_swm

DML 中使用子查詢

將CLARK所在部門的所有員工刪除
  DELETE FROM employee_swm
  WHERE deptno=(SELECT deptno FROM employee_swm 
                WHERE name='CLARK')


查詢薪水比整個機構平均薪水高的員工?
  SELECT name,salary
  FROM employee_swm
  WHERE (SELECT AVG(salary) FROM employee_swm)<salary 

子查詢常用於SELECT語句中,子查詢根據查詢結果集的不同分為:

單行單列子查詢:

常用於過濾條件,
可以配合=,>,>=,<,<=使用

多行單列子查詢:

常用於過濾條件,由於查詢出多個值
在判斷=時要用IN,判斷>,>=等操作配合ANY,ALL

多行多列子查詢:

常當做一張表來看待

查詢與SALESMAN同部門的其他職位員工:
  SELECT ename,job,deptno
  FROM emp_swm
  WHERE deptno IN(SELECT deptno 
                    FROM emp_swm WHERE job='SALESMAN')
        AND job<>'SALESMAN'

檢視比職位是CLARK和SALESMAN工資都高的員工?
  SELECT ename,sal
  FROM emp_swm
  WHERE sal>ALL(SELECT sal FROM emp_swm 
          WHERE job IN('CLARK','SALESMAN'))

EXISTS 關鍵字

EXISTS後面跟一個子查詢,當該子查詢可以查詢出
至少一條記錄時,則EXISTS表示式成立並返回true

SELECT deptno,dname FROM dept_swm d
WHERE NOT EXISTS(SELECT * FROM emp_swm e 
  WHERE d.deptno=e.deptno)

檢視每個部門的最低薪水是多少?前提是該部門的最低薪水都要高於30號部門的最低薪水

SELECT deptno,MIN(sal)
FROM emp_swm
GROUP BY deptno
HAVING MIN(sal)>(SELECT MIN(sal) FROM emp_swm 
  WHERE deptno=30)

子查詢在 FROM 子句中使用

當一個子查詢是多列子查詢,通常將該子查詢
的結果集當做一張表看待並基於它進行二次查詢。

檢視比自己所在部門平均工資高的員工?
  1:檢視每個部門的平均工資
  SELECT AVG(sal),deptno FROM emp_swm
  GROUP BY deptno

  SELECT e.ename,e.sal,e.deptno
  FROM emp_swm e,(SELECT AVG(sal) avg_sal,deptno 
      FROM emp_swm GROUP BY deptno) t
  WHERE e.deptno=t.deptno
  AND e.sal>t.avg_sal

子查詢在SELECT子句中使用

可以將查詢的結果當做外層查詢記錄
中的一個欄位值顯示

SELECT e.ename,e.sal,(SELECT d.dname 
      FROM dept_swm d 
      WHERE d.deptno=e.deptno) deptno
  FROM emp_swm e

分頁查詢

分頁查詢時將查詢表中資料時,分段查詢
而不是一次性將所有資料查詢出來。
有時查詢資料量非常龐大,這會導致系統資源
消耗大,相應速度長,資料冗餘嚴重。
為此當遇到這種情況時一般使用分頁查詢解決。
資料庫基本都支援分頁,但是不同資料庫
語法不同。

Oracle中的分頁是基於偽列ROWNUM實現的。
ROWNUM 不存在於任何一張表中,但是所有的表
都可以查詢該欄位,該欄位的值是隨著查詢自動
生成的,方法是:每當可以從表中查詢一條記錄時,
該欄位的值即為該條記錄的行號,從1開始,逐次遞增

SELECT ROWNUM,empno,ename,sal,job
  FROM emp_swm WHERE ROWNUM>5

在使用ROWNUM對結果集進行編號的查詢過程中,不能使用ROWNUM做>1以上的數字判斷,
否則查詢不出任何資料。

SELECT * FROM(SELECT ROWNUM rn,empno,
  ename,sal,job
  FROM emp_swm)
WHERE rn BETWEEN 6 AND 10

檢視公司工資排名的6-10

  SELECT * FROM
    (SELECT ROWNUM rn,t.* FROM
      (SELECT empno,ename,sal FROM emp_swm
       ORDER BY sal DESC) t
    )
  WHERE rn BETWEEN 6 AND 10

  SELECT * FROM 
    (SELECT ROWNUM rn,t.* FROM
      (SELECT empno,ename,sal FROM emp_swm
       ORDER BY sal DESC
      ) t 
     WHERE ROWNUM<=10  
    )
  WHERE rn>=6

計算區間公式
  pageSize:每頁顯示的條目數
  page:頁數

  star:(page-1)*pageSize+1
  end:pageSize*page

  int start = (page-1)*pageSize+1;
  int end = pageSize*page;

  String sql= "SELECT * FROM "+
    "(SELECT ROWNUM rn,t.* FROM"+
      "(SELECT empno,ename,sal FROM emp_swm"+
      " ORDER BY sal DESC"+
     " ) t "+
    " WHERE ROWNUM<="+end+
   " )"+
  "WHERE rn>="+start;

DECODE函式,可以實現分支效果的函式

SELECT ename,job,sal,
    DECODE(job, 
          'MANAGER',sal*1.2,
          'ANALYST',sal*1.1,
          'SALESMAN',sal*1.05,
          sal
    ) bonus
    FROM emp_swm

DECODE 在GROUP BY 分組中的應用可以將欄位不同的記錄看做一組

統計人數,將職位是'MANAGER','ANALYST'
  看作一組,其餘職業看做另外一組分別統計人數
  SELECT COUNT(*),
    DECODE(
      job
      ,'MANAGER','VIP'
      ,'ANALYST','VIP'
      ,'OTHER')
  FROM emp_swm 
  GROUP BY 
    DECODE(
      job
      ,'MANAGER','VIP'
      ,'ANALYST','VIP'
      ,'OTHER'
    )

  SELECT deptno,dname,loc
  FROM dept_swm
  ORDER BY
    DECODE(
      dname
      ,'OPERATIONS',1
      ,'ACCOUNTING',2
      ,'SALES',3
    )

排序函式

排序函式允許對結果集按照指定的欄位分組
在組內再按照指定的欄位排序,最終生成組內編號。

ROW_NUMBER()函式

生成組內連續且唯一的數字:

PARTITION BY 根據什麼分組

ORDER BY 根據什麼排序

檢視每個部門的工資排名?
  SELECT ename,sal,deptno,
    ROW_NUMBER() 
    OVER(
      PARTITION BY deptno
      ORDER BY sal DESC
    ) rank
    FROM emp_swm

RANK函式

生成組內不連續也不唯一的數字,同組內排序欄位值一樣的記錄
生成的數字也一樣。

SELECT ename,sal,deptno,
    RANK() 
    OVER(
      PARTITION BY deptno
      ORDER BY sal DESC
    )
FROM emp_swm

DENSE_RANK函式

生成組內連續但不唯一的數字。

SELECT ename,sal,deptno
    ,DENSE_RANK()
    OVER(
        PARTITION BY deptno
        ORDER BY sal DESC
    ) rank
FROM emp_swm

集合操作

為了合併多個SELECT語句的結果,可以使用集合操作符,實現集合的並、交、差。
集合操作符包括UNION、UNION ALL、INTERSECT和MINUS。多條作集合操作的SELECT語句的列的個數和資料型別必須匹配。
ORDER BY子句只能放在最後的一個查詢語句中。

UNION、UNION ALL

**UNION和UNION ALL用來獲取兩個或兩個以上結果集的並集:
UNION操作符會自動去掉合併後的重複記錄。
UNION ALL返回兩個結果集中的所有行,包括重複的行。
UNION操作符對查詢結果排序,UNION ALL不排序。**

合併職位是’MANAGER’的員工和薪水大於2500的員工集合,檢視兩種方法的結果差別

SELECT ename,job,sal
FROM emp_swm
WHERE job='MANAGER'
    UNION
SELECT ename,job,sal
FROM emp_swm
WHERE sal>2500

SELECT ename,job,sal
FROM emp_swm
WHERE job='MANAGER'
    UNION ALL
SELECT ename,job,sal
FROM emp_swm
WHERE sal>2500

INTERSECT

INTERSECT函式獲得兩個結果集的交集,只有同時存在於兩個結果集中的資料,才被顯示輸出。使用INTERSECT操作符後的結果集會以第一列的資料作升序排列。

SELECT ename,job,sal FROM emp_swm
WHERE job='MANAGER'
    INTERSECT
SELECT ename,job,sal FROM emp_swm
WHERE sal>2500;

MINUS

MINUS函式獲取兩個結果集的差集。只有在第一個結果集中存在,在第二個結果集中不存在的資料,才能夠被顯示出來。也就是結果集一減去結果集二的結果。

列出職位是MANAGER但薪水低於2500的員工記錄:

SELECT ename, job, sal FROM emp
WHERE job = 'MANAGER'
MINUS
SELECT ename, job, sal FROM emp
WHERE sal> 2500;

建立練習表 sales_tab_swm

CREATE TABLE sales_tab_swm(
    year_id NUMBER NOT NULL,
    month_id NUMBER NOT NULL,
    day_id NUMBER NOT NULL,
    sales_value NUMBER(10,2) NOT NULL
);

隨機插入1000條資料

INSERT INTO sales_tab
SELECT TRUNC(DBMS_RANDOM.value(2010,2012)) AS year_id,
    TRUNC(DBMS_RANDOM.value(1,13)) AS month_id,
    TRUNC(DBMS_RANDOM.value(1,32)) AS day_id,
    TRUNC(DBMS_RANDOM.value(1,100)) AS sales_value
FROM dual
CONNECT BY level<=1000;
COMMIT

檢視每天的營業額?

SELECT year_id,month_id,day_id,SUM(sales_value)
FROM sales_tab_swm
GROUP BY year_id,month_id,day_id
ORDER BY year_id,month_id,day_id

每月的營業額?

SELECT year_id,month_id,SUM(sales_value)
FROM sales_tab_swm
GROUP BY year_id,month_id
ORDER BY year_id,month_id

每年的營業額?

SELECT year_id,SUM(sales_value)
FROM sales_tab_swm
GROUP BY year_id
ORDER BY year_id

總共的營業額?

SELECT SUM(sales_value)
FROM sales_tab_swm

高階分組函式

高階分組函式用在GROUP BY 子句中,每個高階分組函式都有一套分組策略。

ROLLUP():

分組原則,引數逐次遞減,一直到所有引數都不要,每一種分組都統計一次結果並且在一個結果集顯示。

GROUP BY ROLLUP(a,b,c)
等價於:
GROUP BY a,b,c
UNION ALL
GROUP BY a,b
UNION ALL
GROUP BY a
UNION ALL
全表

檢視每天,每月,每年以及總共的營業額?

SELECT year_id,month_id,day_id,SUM(sales_value)
FROM sales_tab_swm
GROUP BY
ROLLUP(year_id,month_id,day_id)

CUBE()

每種組合分一組。分組次數:2的引數個數次方

SELECT year_id,month_id,day_id,SUM(sales_value)
FROM sales_tab_swm
GROUP BY
CUBE(year_id,month_id,day_id)
ORDR BY year_id,month_id,day_id

GOUPING SETS

每個引數是一種分組方式,然後將這些分組統計後,並在一個結果集顯示。

僅檢視每天和每月營業額?

SELECT year_id,month_id,day_id,SUM(sales_value)
FROM sales_tab_swm
GROUP BY
GROUPING SETS((year_id,month_id,day_id),
    (year_id,month_id)
)

相關推薦

SQL高階查詢

如果遇到沒有建立的表影響執行使用 子查詢 子查詢是一條SELECT語句,但它是巢狀其他SQL語句中的 為的是給該SQL提供資料以支援其執行操作 檢視誰的工資高於CLARK? SELECT ename,sal FROM emp_

66 Oracle資料庫SQL開發 高階查詢——使用線性迴歸函式

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

SQL程式設計高階查詢及注意事項

1.什麼是子查詢? 當一個查詢是另一個查詢的條件時,稱之為子查詢。子查 詢可以使用幾個簡單命令構造功能強大的複合命令。子查詢最常用於SELECT-SQL命令的 WHERE子句中。子查詢是一個 SELECT 語句,它巢狀在一個 SELECT、SELECT...INTO 語句、INSERT...INTO 語句、

MySQL進階高階查詢,真的高階啊!

高階查詢 1.多表查詢(關聯查詢,連線查詢) 內連線 沒有主從表之分。 與連線順序無關 內連接出現在結果集中的資料必須出現在每一個關聯表中。 select * from em

初級SQL第三章 (sql高階查詢

        ——排序函式 over([分組子句] 排序語句[排序方式])             ——row_number()    行號         select row_number() over(order by score desc) as '排名',         StuInfo.s

MySQL 單表查詢高階查詢

一、聚合函式 聚合函式 函式名稱 作用 count() 返回某列的行數 sum() 返回某列值的和 avg() 返回某列的平均值 max() 返回某列的最大值 min() 返回某列的最小值 上面聚合函式的使用語法

mongodb進階一高階查詢

這篇我們來說說mongodb的進階--------------高階查詢 一:各種查詢 1:條件操作符 <, <=, >, >= 這個操作符就不用多解釋了,最常用也是最簡單的。 db.collection.find({ "field" : { $gt

PHP操作Mongodb高階查詢

在PHP操作Mongodb之增刪改查篇中我們介紹了PHP中Mongodb的增加、刪除、修改及查詢資料的操作。本文主要是將查詢時用到的高階知識跟大家分享下。 1、查詢時的排序 在關係型資料庫的查詢中,往往會用到排序。例如時間倒序,點選率升序啦等等。在Mongodb的查詢中,

es學習高階查詢

mapping:es中會給每個文件的每個欄位一個數據型別,es會預設的幫我們完成這一步 但是若我們需要自己定義一個mapping,也就是一個對映關係,我們需要自己定義: settings表示對該index的設定:該index有三個shard,每個shard有一個副本作

2017-3-10 SQL server T-sql語句 高階查詢

條件修改: update 表名 set 列名 = 值 where 列名 = 值條件刪除: delete from 表名 where 列名 = 值高階查詢條件查詢  查列 *改為要檢視的列,多列逗號隔開  篩選條件 where 列名 = >= <= > &l

MongoDB——高階查詢

1、 條件操作符<, <=, >, >= 這個操作符就不用多解釋了,最常用也是最簡單的db.collection.find({ "field" : { $gt: value } } ); // 大於: field > value db.colle

神奇的 SQL 查詢,細節滿滿 !

前言   開心一刻     有一天,麻雀遇見一隻烏鴉。     麻雀問:你是啥子鳥喲 ?     烏鴉說:我是鳳凰。     麻雀說:哪有你龜兒子這麼黢黑的鳳凰 ?     烏鴉說:你懂個剷剷,老子是燒鍋爐的鳳凰。 子查詢   講子查詢之前,我們先來看看檢視,何謂檢視 ? 檢視是

關系數據標準語言SQL數據查詢

esc 行數據 函數 having 視圖 條件表達式 color bsp 靈活 數據查詢是數據庫的核心操作。SQL提供了SELECT語句進行數據查詢,該語句具有靈活的使用方式和豐富的功能。 其一般格式為 select [all | distinct]<目標表達

SQL查詢函數LOCATE、POSITION、INSTR、FIND_IN_SET、IN、LIKE

set 查詢函數 log oca pos str locate ins images SQL之查詢函數LOCATE、POSITION、INSTR、FIND_IN_SET、IN、LIKE

【原創】Redis高階功能查詢

一、何為慢查詢? 慢查詢功能可以有效地幫助我們找到 Redis 可能存在的瓶頸 要想理解慢查詢的定義是什麼,我們可以參見下圖。當我們在客戶端傳送命令給 Redis之後,Redis 需要對這些查詢進行排隊處理。如果這條查詢命令在內部執行的時間超過了已經配置好的時限,那麼這條命令(查詢)

T-SQL基礎(一)簡單查詢

名詞解釋 SQL: Structured Query Language,結構化查詢語言,是一種在關係型資料庫中用於管理資料的標準語言。SQL是一種宣告式程式語言,即只需表明需要什麼而無需關注實現細節(C#中的LINQ也是如此)。 SQL方言:在SQL基礎上延伸的其它語言,如SQL Server中

T-SQL基礎(二)關聯查詢

在上篇博文中介紹了T-SQL查詢的基礎知識,本篇主要介紹稍微複雜的查詢形式。 表運算子 表運算子的作用是把為其提供的表作為輸入,經過邏輯查詢處理,返回一個表結果。SQL Server支援四個表運算子:JOIN、APPLY、PIVOT、UNPIVOT,其中JOIN是標準SQL中的運算子,APPLY、PIVO

SQL語句增刪改查/高階查詢

有道筆記檢視常用sql語句 sql高階查詢語句 SQL語句規範 分號結尾 關鍵詞大小寫不區分 建立/刪除資料庫 建立:CREATE DATABASE 資料庫名 ysj_example; 刪除:DROP DATABASE 資料庫名 ysj_example; 建立/刪

53 Oracle資料庫SQL開發查詢——編寫包含子查詢的UPDATE和DELETE

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

SQL Server資料庫開發(3.SQL高階查詢

一,巢狀子查詢         降低SQL語句的複雜度,提高SQL語句的可讀性 --子查詢作為條件  (where) --查詢王五前面的同學 select * from StuInfo where stuid < (select stu