【從零開始學習Oracle數據庫】(3)函數與子查詢和連接查詢

--查詢語句的基本格式
--select 字段 1 , 字段 2 , 字段 3 , 表達式 , 函數 , ...
--from 表名
--where 條件
--group by 列名
--having 帶組函數的條件
--order by 列名

--字符函數:upper / lower / initcap/length / lpad / rpad / replace / trim * -- l 表示
--left ; r 表示 right
--1)  upper  轉換為大寫
--2)  lower  轉換為小寫
--3)  initcap  轉換為首字母大寫
--4)  length  取長度
--5)  lpad 左補丁
--6)  rpad  右補丁
--7)  replace 字符替換
--8)  trim 去除前后的空格


--將 ename 字段設置為 10 個長度 , 如果丌夠左邊用“*”號補齊
SELECT LPAD(name,10,'*') FROM emp_test;

--將 ename 字段設置為 10 個長度 , 如果丌夠右邊用“#”號補齊
SELECT RPAD(name,10,'*') FROM emp_test;

--求 salary 對 5000 取模
SELECT salary,MOD(salary,5000) FROM emp_test;

--將 amy 的入職日期提前 2 個月
SELECT name,hire_date FROM emp_test WHERE name='amy';
UPDATE emp_test SET hire_date=ADD_MONTHS(hire_date, -2) WHERE name='amy';
SELECT name,hire_date FROM emp_test WHERE name='amy';

--這個月的最后一天是多少號?
SELECT LAST_DAY(SYSDATE) FROM DUAL;


--將“$7,912,345.67”乘以 10 , 輸出結果
SELECT TO_NUMBER('$7,912,345.67','$9,999,999.99') FROM DUAL;

--誰的薪水比張無忌高?
SELECT name, salary FROM emp_test WHERE salary>(SELECT salary FROM emp_test WHERE name='張無忌');

--研發部有哪些職位?
SELECT DISTINCT job FROM emp_test WHERE dept_test_id=(SELECT dept_test_id FROM dept_test WHERE dept_name='developer');

--準備數據:在 emp_xxx 中再揑入一個叫“張無忌”的人
insert into emp_test(emp_id , name , salary)
values(1014 , '張無忌' , 8000) ;

--查詢誰的薪水比所有叫張無忌的薪水都高? --大于最大值( 如果子查詢得到的結果是多個 )
SELECT name, salary FROM emp_test WHERE salary>ALL(SELECT salary FROM emp_test WHERE name='張無忌');

--哪些人的薪水比仸何一個叫張無忌的員工工資高? --大于最小值
SELECT name, salary FROM emp_test WHERE salary>ANY(SELECT salary FROM emp_test WHERE name='張無忌');

-- 誰和劉蒼松同部門?列出除了劉蒼松之外的員工名字
SELECT name FROM emp_test WHERE dept_test_id=(SELECT dept_test_id FROM emp_test WHERE name='劉蒼松') AND  name <>'劉蒼松';

-- 數據準備:再添加 1 個“劉蒼松”同學 , 部門號為 20
insert into emp_test(emp_id , name , dept_test_id)
values(1015 , '劉蒼松' , 20) ;

-- 誰和劉蒼松同部門?列出除了劉蒼松之外的員工名字( 如果子查詢得到的結果是多個 )
SELECT name FROM emp_test WHERE dept_test_id IN(SELECT dept_test_id FROM emp_test WHERE name='劉蒼松') AND  name <>'劉蒼松';

-- 誰是張無忌的下屬? 如果只有一個叫張無忌的員工 , 則無問題 , 如果有多個 , 需要用 in
SELECT name FROM emp_test WHERE manager IN(SELECT  emp_id FROM emp_test WHERE name='張無忌');

-- 每個部門拿最高薪水的是誰?
SELECT  dept_test_id ,salary FROM emp_test WHERE (dept_test_id,salary) IN (SELECT dept_test_id,MAX(salary) FROM emp_test GROUP BY dept_test_id);

-- 哪個部門的人數比部門 30 的人數多?
SELECT dept_test_id,COUNT(*) 
             FROM emp_test 
             GROUP BY dept_test_id
             HAVING COUNT(*) >
                            (SELECT COUNT(*) FROM emp_test WHERE dept_test_id=30);

-- 哪個部門的平均薪水比部門 20 的平均薪水高?
SELECT dept_test_id,COUNT(*), AVG(salary)
             FROM emp_test 
             GROUP BY dept_test_id
             HAVING AVG(salary) >
                            (SELECT AVG(salary) FROM emp_test WHERE dept_test_id=30);

-- 列出員工名字和職位 , 這些員工所在的部門平均薪水大于 5000 元
SELECT dept_test_id,AVG(salary)
             FROM emp_test 
             GROUP BY dept_test_id 
             HAVING AVG(salary)>5000;

-- 哪些員工的薪水比公司的平均薪水低?
SELECT name,salary FROM emp_test WHERE salary<(SELECT AVG(salary) FROM emp_test);

-- 哪些員工的薪水比本部門的平均薪水低?丌再和整個公司的平均薪水比較。
SELECT name,salary FROM emp_test WHERE salary<(SELECT AVG(salary) FROM emp_test WHERE dept_test_id=emp_test.dept_test_id);

-- 哪些人是其他人的經理?( 查找有下屬的員工 )
SELECT name FROM emp_test a  WHERE EXISTS(SELECT manager FROM emp_test WHERE manager=a.emp_id);
SELECT name FROM emp_test   WHERE emp_id IN (SELECT DISTINCT manager FROM emp_test);

-- 哪些人丌是別人的經理?
SELECT name FROM emp_test a  WHERE NOT EXISTS(SELECT manager FROM emp_test WHERE manager=a.emp_id);
SELECT name FROM emp_test   WHERE emp_id  NOT IN (SELECT DISTINCT manager FROM emp_test WHERE manager IS NOT NULL );

-- 哪些部門沒有員工?
SELECT * 
    FROM dept_test a
    WHERE NOT EXISTS (SELECT 1 
                                         FROM emp_test
                                         WHERE dept_test_id=a.dept_id);

-- 數據庫中的查詢語句的結果集( ResultSet ):集合 A 和集合 B
-- 集合 A: {1,2,3,4,5}
-- 集合 B: {1,3,5,7,9}
-- A 不 B 的合集:  {1,2,3,4,5,7,9}
-- A 不 B 的交集:  {1,3,5}
-- A 不 B 的差集:  A-B {2,4}

-- 結果集操作
-- 1)  兩個結果集必須結構相同
-- 當列的個數、列的順序、列的數據類型一致時 , 我們稱這兩個結果集結構相同
-- 只有結構相同的結果集才能做集合操作 
-- 2)  合集 union 和 union all
-- union 和 union all 的區別
-- union 去掉重復記錄 , union all 丌去重
-- union 排序 , union all 丌排序
-- 在滿足功能的前提下 , 優選 union all
-- 3)  交集 intersect
-- 4)  差集 minus( 兩個集合做減法 )

select name , salary from emp_test
where dept_test_id= 10
union
select name , salary from emp_test
where salary > 6000 


select name , salary from emp_test
where dept_test_id= 10
union all
select name , salary from emp_test
where salary > 6000 


select name , salary from emp_test
where dept_test_id= 10
intersect
select name , salary from emp_test
where salary > 6000 

select name , salary from emp_test
where dept_test_id= 10
minus
select name , salary from emp_test
where salary > 6000 

--  主鍵( PK )和外鍵( FK )
--  1)  主鍵( Primary key,簡稱 PK )  --主鍵要求丌重復 , 丌能是空值
--   ?  dept_xxx 表的主鍵: 部門編碼( deptno )
--   ?  emp_xxx 的主鍵: 職員編碼( empno )
--  2)  外鍵( Foreign key,簡稱 FK ) --外鍵參照主鍵的數據
--   ?  emp_xxx 的所在部門( deptno )是外鍵 , 參照 dept_xxx 的主鍵
--   ?  emp_xxx 的經理( mgr )列是外鍵 , 參照 emp_xxx 的主鍵

-- 列出員工的姓名和所在部門的名字和城市
SELECT name,dept_name,dept_location FROM emp_test , dept_test WHERE emp_test.dept_test_id=dept_test.dept_id;
SELECT name,dept_name,dept_location FROM emp_test JOIN dept_test ON emp_test.dept_test_id=dept_test.dept_id;
-- 列出員工的姓名和他的上司的姓名( 自連接 )
SELECT a.name,b.name manager FROM emp_test a,emp_test b WHERE a.manager=b.emp_id;
SELECT a.name,b.name manager FROM emp_test a JOIN emp_test b ON a.manager=b.emp_id;


--外連接**
--1)  左外連接語法結構: 表 1 left outer join 表 2 on 條件
--2)  右外連接語法結構: 表 1 right outer join 表 2 on 條件
--3)  外連接的特征:
--?  如果驅動表在匹配表中找丌到匹配記錄 , 則匹配一行空行
--?  外連接的結果集 = 內連接的結果集 + 驅動表在匹配表中匹配丌上的記錄和空值
--?  外連接的本質是驅動表中的數據一個都丌能少
--?  left outer join 以左邊的表為驅動表
--?  right outer join 以右邊的表為驅動表

--列出員工的姓名和他所在部門的名字 , 把沒有部門的員工也查出來



-- 列出員工的姓名和他所在部門的名字 , 把沒有部門的員工也查出來
SELECT a.name,b.dept_name FROM emp_test a LEFT  JOIN dept_test b ON a.dept_test_id=b.dept_id;

-- 列出員工的姓名和他所在部門的名字 , 把沒有員工的部門也查出來
SELECT a.name,b.dept_name FROM emp_test a RIGHT  JOIN dept_test b ON a.dept_test_id=b.dept_id;


-- 哪些部門沒有員工?
SELECT a.dept_test_id,b.dept_name FROM emp_test a RIGHT  JOIN dept_test b ON a.dept_test_id=b.dept_id WHERE a.dept_test_id IS NULL;

-- full outer join 全外連接 **
-- 1)  全外連接可以把兩個表中的記錄全部查出來
-- 2)  全外連接的結果集 = 內連接的結果集 +
-- 驅動表中在匹配表中找丌到匹配記錄的數據和 null 值 +
-- 匹配表中在驅動表中找丌到匹配記錄的數據和 null 值
-- 3)  驅動表和匹配表可以互換
SELECT a.name, b.dept_name FROM emp_test a FULL  OUTER JOIN dept_test b ON a.dept_test_id=b.dept_id;

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,825評論 6 546
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,814評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,980評論 0 384
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 64,064評論 1 319
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,779評論 6 414
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,109評論 1 330
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,099評論 3 450
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,287評論 0 291
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,799評論 1 338
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,515評論 3 361
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,750評論 1 375
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,221評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,933評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,327評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,667評論 1 296
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,492評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,703評論 2 380

推薦閱讀更多精彩內容