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